bio3d/0000755000176200001440000000000014046425767011271 5ustar liggesusersbio3d/NAMESPACE0000644000176200001440000000567514046015221012501 0ustar liggesusers#exportPattern("^[[:alpha:]]+") exportPattern("^[^\\.]") useDynLib(bio3d) import("graphics") import("grDevices") import("stats") import("utils") import(parallel, grid, Rcpp) S3method(as.pdb, default) S3method(as.pdb, mol2) S3method(as.pdb, prmtop) S3method(atom2ele, default) S3method(atom2ele, pdb) S3method(atom2mass, default) S3method(atom2mass, pdb) S3method(atom.select, pdb) S3method(atom.select, mol2) S3method(atom.select, prmtop) S3method(atom.select, pdbs) S3method(bhattacharyya, array) S3method(bhattacharyya, enma) S3method(bhattacharyya, matrix) S3method(bhattacharyya, nma) S3method(bhattacharyya, pca) S3method(cmap, default) S3method(cmap, pdb) S3method(cmap, pdbs) S3method(cmap, xyz) S3method(cna, dccm) S3method(cna, ensmb) S3method(com, pdb) S3method(com, xyz) S3method(core.find, default) S3method(core.find, pdb) S3method(core.find, pdbs) S3method(covsoverlap, enma) S3method(covsoverlap, nma) S3method(dccm, enma) S3method(dccm, nma) S3method(dccm, pca) S3method(dccm, xyz) S3method(dccm, gnm) S3method(dccm, egnm) S3method(dm, pdb) S3method(dm, xyz) S3method(dm, pdbs) S3method(dssp, pdb) S3method(dssp, pdbs) S3method(dssp, xyz) S3method(geostas, default) S3method(geostas, enma) S3method(geostas, nma) S3method(geostas, pdb) S3method(geostas, pdbs) S3method(geostas, xyz) S3method(pdbfit, pdb) S3method(pdbfit, pdbs) S3method(identify, cna) S3method(mktrj, enma) S3method(mktrj, nma) S3method(mktrj, pca) S3method(nma, pdb) S3method(nma, pdbs) S3method(aanma, pdb) S3method(aanma, pdbs) S3method(gnm, pdb) S3method(gnm, pdbs) S3method(pca, array) S3method(pca, pdbs) S3method(pca, tor) S3method(pca, xyz) S3method(plot, bio3d) S3method(plot, blast) S3method(plot, cmap) S3method(plot, cna) S3method(plot, ecna) S3method(plot, cnapath) S3method(plot, ecnapath) S3method(plot, core) S3method(plot, dccm) S3method(plot, dmat) S3method(plot, enma) S3method(plot, fasta) S3method(plot, fluct) S3method(plot, geostas) S3method(plot, hmmer) S3method(plot, nma) S3method(plot, pca) S3method(plot, pca.loadings) S3method(plot, pca.score) S3method(plot, pca.scree) S3method(plot, rmsip) S3method(plot, matrix.loadings) S3method(print, core) S3method(print, enma) S3method(print, fasta) S3method(print, nma) S3method(print, pca) S3method(print, pdb) S3method(print, rle2) S3method(print, select) S3method(print, sse) S3method(print, xyz) S3method(print, cna) S3method(print, cnapath) S3method(print, geostas) S3method(print, mol2) S3method(print, prmtop) S3method(read.crd, amber) S3method(read.crd, charmm) S3method(rmsip, default) S3method(rmsip, enma) S3method(sip, default) S3method(sip, enma) S3method(sip, nma) S3method(summary, pdb) S3method(summary, cna) S3method(summary, cnapath) S3method(trim, pdb) S3method(trim, mol2) S3method(trim, pdbs) S3method(trim, xyz) S3method(pymol, dccm) S3method(pymol, modes) S3method(pymol, nma) S3method(pymol, pca) S3method(pymol, pdbs) S3method(mask, dccm) S3method(vmd, cna) S3method(vmd, ecna) S3method(vmd, cnapath) S3method(vmd, ecnapath) bio3d/demo/0000755000176200001440000000000014046015221012171 5ustar liggesusersbio3d/demo/nma.R0000644000176200001440000000401314046015221013065 0ustar liggesusers### ### Examples from NMA Vignette ### ### Authors Lars Skjaerven ### Xin-Qiu Yao ### Barry J Grant ### require(bio3d); require(graphics); pause <- function() { cat("Press ENTER/RETURN/NEWLINE to continue.") readLines(n=1) invisible() } ############################################# ## # ## Basic usage # ## # ############################################# ### Read PDB and Calculate Normal Modes pdb <- read.pdb("1hel") modes <- nma(pdb) pause() ### Print a summary print(modes) pause() ### Plot the nma object for a quick overview plot(modes) pause() ### Calculate cross-correlations cm <- dccm(modes) pause() ### Plot correlation map plot(cm, sse=pdb) pause() ### Calculate modes with force field ANM modes.anm <- nma(pdb, ff="anm") pause() ### Investigate modes similarity with RMSIP r <- rmsip(modes, modes.anm) pause() ### Plot RMSIP results plot(r, xlab="ANM", ylab="C-alpha FF") pause() ################################################ ## # ## Ensemble NMA # ## (requires the 'muscle' program installed) # ## # ################################################ pause() ### Set temp dir to store PDB files tmp.dir <- tempdir() ### Download a set of DHFR structures ids <- c("1rx2_A", "1rx4_A", "1rg7_A", "3fyv_X", "3sgy_B") ### Download and split by chain ID raw.files <- get.pdb(ids, path=tmp.dir) pause() ### Split PDB files by chain ID files <- pdbsplit( raw.files, ids, path=tmp.dir) pause() ### Align structures pdbs <- pdbaln(files) pause() ### View sequence identity summary( c(seqidentity(pdbs)) ) pause() ### Calculate modes of aligned proteins modes <- nma(pdbs) pause() ## Print a summary print(modes) pause() ### Plot fluctuations plot(modes, pdbs) pause() ### Cluster Modes simiarlity heatmap(1-modes$rmsip, labCol=ids) unlink(tmp.dir) bio3d/demo/pdb.R0000644000176200001440000000324414046015221013064 0ustar liggesusers### ### Example of PDB file manipulation, searching, alignment etc. ### ### Authors Xin-Qiu Yao ### Lars Skjaerven ### Barry J Grant ### require(bio3d); require(graphics); pause <- function() { cat("Press ENTER/RETURN/NEWLINE to continue.") readLines(n=1) invisible() } ############################################# ## # ## Basic PDB file reading and manipulation # ## # ############################################# pause() # Read an online RCSB Protein Data Bank structure pdb <- read.pdb("4q21") # Whats in the new pdb object print(pdb) pause() # Most bio3d functions, including read.pdb(), return list objects attributes(pdb) pdb$atom[1:3, c("resno", "resid", "elety", "x", "y", "z")] pause() # Selection of substructure regions with 'atom.select()'' function inds <- atom.select(pdb, elety = c("N","CA","C"), resno=4:6) pdb$atom[inds$atom,] pause() # Simple B-factor plot ca.inds <- atom.select(pdb, "calpha") plot.bio3d( pdb$atom[ca.inds$atom,"b"], sse=pdb, ylab="B-factor") ################################### ## # ## Search for similar structures # ## # ################################### # Use sequence aa <- pdbseq(pdb) aa pause() # Blast the RCSB PDB to find similar sequences blast <- blast.pdb(aa) head(blast$hit.tbl) pause() # Plot results top.hits <- plot(blast) head(top.hits$hits) pause() ## Download and and analyze further .... ## raw.files <- get.pdb(top.hits$pdb.id, path="raw_hits") ## files <- pdbsplit(raw.files, top.hits$hits, path="top_hits") ## pdbs <- pdbaln(files) ## ...... bio3d/demo/md.R0000644000176200001440000000352014046015221012714 0ustar liggesusers### ### Example of basic molecular dynamics trajectory analysis ### ### Authors Xin-Qiu Yao ### Lars Skjaerven ### Barry J Grant ### require(bio3d); require(graphics); pause <- function() { cat("Press ENTER/RETURN/NEWLINE to continue.") readLines(n=1) invisible() } ############################################# ## # ## Basic analysis of HIVpr trajectory data # ## # ############################################# pause() # Read example trajectory file trtfile <- system.file("examples/hivp.dcd", package="bio3d") trj <- read.dcd(trtfile) # Read the starting PDB file to determine atom correspondence pdbfile <- system.file("examples/hivp.pdb", package="bio3d") pdb <- read.pdb(pdbfile) # Whats in the new pdb object print(pdb) pause() # How many rows (frames) and columns (coords) present in trj dim(trj) ncol(trj) == length(pdb$xyz) pause() # Trajectory Frame Superposition on Calpha atoms ca.inds <- atom.select(pdb, elety = "CA") xyz <- fit.xyz(fixed = pdb$xyz, mobile = trj, fixed.inds = ca.inds$xyz, mobile.inds = ca.inds$xyz) # Root Mean Square Deviation (RMSD) rd <- rmsd(xyz[1, ca.inds$xyz], xyz[, ca.inds$xyz]) plot(rd, typ = "l", ylab = "RMSD", xlab = "Frame No.") points(lowess(rd), typ = "l", col = "red", lty = 2, lwd = 2) summary(rd) pause() # Root Mean Squared Fluctuations (RMSF) rf <- rmsf(xyz[, ca.inds$xyz]) plot(rf, ylab = "RMSF", xlab = "Residue Position", typ="l") pause() # Principal Component Analysis pc <- pca.xyz(xyz[, ca.inds$xyz]) plot(pc, col = bwr.colors(nrow(xyz))) pause() # Cluster in PC space hc <- hclust(dist(pc$z[, 1:2])) grps <- cutree(hc, k = 2) plot(pc, col = grps) pause() # Cross-Correlation Analysis cij <- dccm(xyz[, ca.inds$xyz]) plot(cij) ## view.dccm(cij, pdb, launch = TRUE) bio3d/demo/pca.R0000644000176200001440000000470314046015221013063 0ustar liggesusers### ### Example of PCA on a collection of PKA structures ### and a large collection of transducin structure ### ### Authors Xin-Qiu Yao ### Lars Skjaerven ### Barry J Grant ### require(bio3d); require(graphics); pause <- function() { cat("Press ENTER/RETURN/NEWLINE to continue.") readLines(n=1) invisible() } ################################################ ## # ## Basic PCA of related X-ray structures # ## (requires the 'muscle' program installed) # ## # ################################################ pause() ### Set temp dir to store PDB files tmp.dir <- tempdir() ## Specify PDB identifiers ids <- c("1cdk_A", "3agm_A", "1cmk_E", "3dnd_A", "1q8w_A") ## Download PDBs raw.files <- get.pdb(ids, path=tmp.dir) pause() ## Split PDBs by chain ID files <- pdbsplit(raw.files, ids, path=tmp.dir) pause() ## Sequence/structure alignment pdbs <- pdbaln(files) pause() ## Find invariant core core <- core.find(pdbs) pause() ## Fit structures to core region xyz <- pdbfit(pdbs, inds=core$c1A.xyz) ## outpath="core_fit/", full.pdbs=T, het2atom=T) pause() ## Locate gap containing positions gaps.pos <- gap.inspect(pdbs$xyz) ## Perform PCA on non-gap containing positions pc.xray <- pca.xyz(xyz[,gaps.pos$f.inds]) pause() ## Plot x-ray results plot(pc.xray) pause() ############################################# ## # ## Larger transducin example # ## # ############################################# data(transducin) attach(transducin, warn.conflicts=FALSE) ## data 'transducin' contains objects ## - pdbs: aligned C-alpha coordinates for 53 transducin ## structures from the PDB ## - annotation: annotation of the 53 PDBs ## Note that this data can be generated from scratch by following the ## Comparative Structure Analysis with Bio3D Vignette available both ## on-line and from within the Bio3D package. pdbs <- transducin$pdbs annotation <- transducin$annotation pause() ## Inspect gaps gaps.pos <- gap.inspect(pdbs$xyz) ## Previously fitted coordinates invariance core xyz <- pdbs$xyz ## Do PCA pc.xray <- pca.xyz(xyz[, gaps.pos$f.inds]) pause() ## Plot overview plot(pc.xray, col=annotation[, "color"]) ## Plot atom wise loadings plot.bio3d(pc.xray$au[,1], ylab="PC1 (A)") pause() unlink(tmp.dir) bio3d/demo/00Index0000644000176200001440000000026714046015221013330 0ustar liggesuserspdb PDB File Manipulation, Searching and Alignment pca Principal Component Analysis nma Normal Mode Analysis md Molecular Dynamics Trajectory Analysis bio3d/README.md0000644000176200001440000000604514046077017012544 0ustar liggesusers# Documentation The Bio3D package for structural bioinformatics consists of sets of functions for: - input/output, - sequence analysis, - structure analysis, - simulation analysis, - normal mode analysis, - correlation network analysis, - format conversion and data manipulation, and - graphics and visualization.. Major functions are listed below with links to further documentation that includes example code and results. Note that you can also get help on any particular function by using the command `?function` or `help(function)` (e.g. `help(read.pdb)`) and directly execute the example code for a given function with the command `example(function)` from within R itself. We also distribute a number of extended **Bio3D vignettes** that provide worked examples of using Bio3D to perform a particular type of analysis. Currently available vignettes include: - [Installing Bio3D](http://thegrantlab.org/bio3d/articles/online/install_vignette/Bio3D_install.html) - [Getting started with Bio3D](http://thegrantlab.org/bio3d/articles/online/intro_vignette/Bio3D_introduction.html) - [PDB structure manipulation and analysis with Bio3D](http://thegrantlab.org/bio3d/articles/online/pdb_vignette/Bio3D_pdb.html) - [Beginning trajectory analysis with Bio3D](http://thegrantlab.org/bio3d/articles/online/traj_vignette/Bio3D_md.html) - [Enhanced methods for Normal Mode Analysis with Bio3D](http://thegrantlab.org/bio3d/articles/online/nma_vignette/Bio3D_nma.html) - [Comparative sequence and structure analysis with Bio3D](http://thegrantlab.org/bio3d/articles/online/pca_vignette/Bio3D_pca.html) - [Ensemble NMA of E.coli DHFR structures](http://thegrantlab.org/bio3d/articles/online/enma_vignettes/Bio3D_nma-dhfr-partI.html) - [Ensemble NMA across multiple species of DHFR](http://thegrantlab.org/bio3d/articles/online/enma_vignettes/Bio3D_nma-dhfr-partII.html) - [Protein structure network analysis with Bio3D](http://thegrantlab.org/bio3d/articles/online/cna_vignette/cna_vignette.spin.html) - [Introduction to Ensemble Difference Distance Matrix (eDDM) Analysis](http://thegrantlab.org/bio3d/articles/online/eddm_vignette/Bio3D_eddm.spin.html) - Online protein structure analysis with the Bio3D WebApp ( [PDF](http://thegrantlab.org/bio3d_v2/download/webapp-tutorials?download=22:bio3d-webapp-pca)) - Online Normal Mode Analysis with Bio3D WebApps ( PDF | HTML ) There is also extensive [on-line documentation](http://thegrantlab.org/bio3d/reference/) with worked examples (and their output) for all functions and a package manual (in [PDF](https://CRAN.R-project.org/package=bio3d/bio3d.pdf) format) that is a concatenation of each functions documentation (without example output). Note that for information on Bio3D development status or to report a bug, please refer to: https://bitbucket.org/Grantlab/bio3d bio3d/data/0000755000176200001440000000000014046015221012156 5ustar liggesusersbio3d/data/elements.rda0000644000176200001440000001266614046015221014475 0ustar liggesusers; tUt4A Y;(HJtT^Bà ._FYd@AD BY^{_Wr?}ͫ}w*uJGFJ,GS`'H2H5vա:=uҍ)\C+_^:nJ!B8GQ^ xb(tp;b)Q@!B)$SHJ!BO zQMQOaQSBa(aSFP­FREa4(p;d BL & Y)PȥG!Q(PHx f wR(``PBaJ)L0]PJa(()TPRPM 3))8(8)(REMWP5ngid7:LǂB\2@Loq $NOLwaw4N 4ʠ W Țu C&!3'fL@'tdlȕT'A {| &Sp-Q}+#OOIܶ=2;c W̦}2`v|~ίl^hpFWvqWnqU'< eP"TqU#lj-L8dHLJ3U+AIPlrZq%0 .LBYJfūlqo|P /G#n r<HyB?y<$(JsB * B&BآPPRTCEb"!"HX$(PeAqhՌCfY`;Yhk |_XXXXtJ0 Y:7@l,BAE ⭂PlUgWGP \xkYK x1KqrMNMvTh] %BWRqCCA-b//" R޻D>`덏On c|?q2@nYm_ɇn^fOS&>.`/m[9%ٷm0/s{/֡sق< _}lA.^?̷u׿/_`/g>O܎)D> ??<-?fGOmG$BCuآ?x|/lo ؋C{ `?8_ Dۯ_}sAN.w:D u@ha_2ȿ_ 0VE/>c~99vokЮ k3̣|!D@^0o|/>Hp_:: N^@oD8tzȗ`!p_q]`GWho|_:8=$ @s !Hu!J!N]Gg0Ka_ }+!o?r'>[Ox/_Ve:L |~j#c }sO?s? cqSڂU V %I I^MϋUNM?t^=꣛ȐUwM#?"7v7rYy_E$kR-OogIyǗ &,._z4~-_]G*毝6B&j.N{/Q4=j<_dr:2R>J.R%STb=j.b~gNw}Bf3ognv42`;dž{V42>8a!u @ tվ-UYg=-Zw~n!D[8Џ-e˞w}\3.L>9v17gK3r`&w3}ߟxx2aGZ7]NҞ[Y7~wAN z 4f3ͫ0'>\EF<Ͻvߓ$u߮!q|}Z/p;:t5'~ȀL($]4x_N'e$q,??s%R$fI^7^$u}ԇzӃjIyCNL$)W}q$3O&S8ZYFƓ^~P lE妋#ɠNjVz;Y@b.HYy$>к$)O[d|>$CKXo=y_Q$( ig ׇ5_ly+ \c$~~-lGHle3ג:6I,.b& mU $~:hfyn_e%Ҵ;󎾖H׭z`( "=Iy$1?=FR26TO$gCHZ]o9DzYIL$-Dz7pwnoCW0uGޜ>y1w:`.khP3Z6}`I>I%$>qH܅ao1grhP>x`x^>x oN:Qҗ~gCCrӦ~uyQMv=@Ǽ|} O(B|} |4Bפ_s(y E= s"'>_\[ |=-ѤkGt[|B;q!GGw慿].-c㨯FcA csC="7/?>Ǣ_߶(wďH+/`gю}F '0:{~WMqT`/1>:`^@ G0Cv/8~{D:G/bqd/ zo0P?A {?ߗWy?z;s Mgw>0 ҉r8y :Xb<~RGYQ+`b6NJ 6VP}n/`8)"Z?J8Y$HV, VFVPq"Vt Xa{>f`= VިH,>0_c6V XA{6di/v`oYq˱Xq+RǗgŷvƁ,yOfo~v7xy{znݷ+m6_y7milN3mGϷ99hM׿ϧ^U@ns+k{m{;s+n;Ε{=ⴍ k;ʴ+Ӌ9[Oux] lϬk]ߜ6{f-?W2ezYgeX֜>}큝7.|3Bۃ*EyEe9mf23m'֭wN~@! >ȕ낟oέyَiVk N%wsl3m˅OmkN̾go!l`oa۸Q}GW4o|{Sۑǿm lܟs |\Wu~9g!L`NQAXh炧϶Ո'K#xۋA@mם ry;s/>׶we ?gf~.gizn7}foy{>tz;s^ *{=xӅN8=ʮy{ߴ@ErݶF@1,wݩna}.~ w0n ͩ.3+h&xM9Czz:m}-!΋zw@99\pxB:-Y״q9|MMb$N_#{Ul~y@mӴ1fXоL}w։5DŽ]~m_xa7r%L?Loj#fꡇo4'~ ~#1S߿8.yمnaĻlB]"~6B'i냯rNX^&u6)gN=qaYȯ~yTs>^`;|uY%/k ~ȋ|L!~wNkIg|]֭5?~\#|yb5+9]ٻ,(7m7' C^;(ymB?ܖKٍԂnC^ވ(ق8 yׇ Їo,O~!?{Dop8O3c\N.f:wQ'o3ri kxjFTF_"1ͨu(ֻv_:g>qcdP8ی!D}fˏu.; ,L~VLu.ow 1G_kaGQ'oiNJ=A u^d,M_18g !uNOk?jjo7[.aˇ%_9Z_C=ucÎ u9j~]٫/*/F9$<Ɍo?zPjB P뫖+_JxS/Yk>3}#K?ԩ됿{G^Q#Ĝn_@mA m#2b7uo_ƇGCRO R5aa5gFoe(K^do qa0c: xspVus}jCf zxRfAP="~fx:W ::A>~و7ԡ܈g/S#գҍЌx1(3 _}5O a~?VB]E=@?G9ہ|<ryoN OOwMowwѝ lF6A_W߳lAG恏"N;\٘O] .5|5$| x݌nc^ۅnoKNfR퐺}-?<}e¶o0X8gLd}7 j@\jA|@}58_4!֛3w | rF82 ;Y%Ոgnz8z P} Eqy]\x|!ڂig 5Z?qȑk@Z/H>ЀLgJ[w;cbJ,o 9Eͅց>U?IZԿB 02A>'V7G8{捯Udu݃J'1_zp=;ѷߑ¼,hnԣpH|i<_Fs}WbmpvzЇ z.2r\YNOA=d`wah10`cǥw拒|X6^ rN zAՍ-owQb 0..M85볨Þp]Kuo5@J׌ɺG?1mGOcwPDZ&WI|L!f`t'2wkvceW;6[z}!Gyy[&Wm}ka㶠^ ך l-a=1ح9M~u<5'dN&ۗըV~Zjɋn2+7)_LÜDǜN`GPij0OϜ~R6|G9;>4Pz~||Z7ǷS7a]BW[ o؃cHC7sqA2f#7 `1ǎoO Ͱ{^9&3*s"fsD;zSlޔ9 9n¼8V[30 _gفDN8V-CܷrA c7a.i3s{<7u`$*f;.oeFg[Py l]^z~c/!?}:ؗyqyI)C ~rDL"/zu'o3ě_>݇8~UA6@Ƿ!~3܎ң _`?|1v|ocv"|~@K{8u'߀X7\O"2;`#d|s0m ތ8~un]Fއ@ꏴ|y4CfˈaMq+$;;e>[XuuoK;ف<|+/ eֱ^A~,J~Rn4܉6񷐇=J>tJ~'f'q}_/D=(vW~oF~= q0򎣘?XY}_~~w!·~ MVUF_ߛǷOHD; Dy/+ x}a:sb/ 9ކ&ε#Kw\z;A> s#7"/y!|7A~k0_ x*e.3?C<p<~DA ~iwr^OR19Nl?r'/a_27)7}So'n:9ݎFo5uC|֢/rkJ?Y+aξoPXgG1czC pMaɉv_s=>`>w=6%G}zĸ<_P|xk#  c|z<^qe3=y=d/ήN/~?''gb3E 3Ya+?(ϧ GP| IS<Ɂ}wxyȣ@ |a駞^,ޔX|'ׯ*wU6|s{ʑ~)5|yj;|Νj姉rs5h+.-Lzy|Oh<{=ׁz@3N4y>߽ʮgпxzr;Sq8C,xΏ臮Rz<ݥ1T'IϡCz oy>ħQNcud\̃'ދ8z^wKaȟv@e#]6|cWi ?7Bqݤ?kjh\o wQJOXߋUBk3%O:_=z9ߧN.ϯSz@ހH W]Q߉q1ƝǓO_)7fI{3zB+F/yrK.Vu;2몙|(/BK`='o?u߫ yR=Nsq8q_<Ρ}7{:1_93쟗\GhNjUu_%*uT;~QNӗ*~K7#NuTAyժ-Qs y֨緸nxhOeW ir.Uzs}etM֣X?=>rG7U<);>=AuNHXoz@/goI|+u's/-?[a/+ƽg0ﭝy_3/Y\ykx'8A1.!n:=)]ꇜ^=ʓU༐w}ǧ2e=2+y<ڿ߸Δ:*Ў(W7%חjWԇjU1(ʓnU}ΧN\]!n>F̫;I?}=8KCs oBsK?x@OIOx'?|}17o]A]#ە=>wΌqtW(n5sԋ[ +Prdn7G*"ʳQ vK\C'Y٧\ձO_"RuE7T~ڙƽO^:=S+icwC3/Su {t19n}%~Q.+s=hR}ycU^z'<3LjSv=<.Ah8O!/&Ѻ?x< {gz?cU#~$v<)E}~r?~/07sL{LEHV(\aտ+ \=:/tTuʎ)e3U1o3^1Ζp.9]fwޯK֎\|wGb>8՛8}Ɨ*)W[g-WWm N\/ctSg(5?ɹ[Pv~ELnjN'm\ U|Jtg*>f{_W%GE&rU})'Ulׯ\3x u{(},o{~|ǥ3,~5nt>%my-T^ z qv~ :82Wed~UK te꾎^=R9foZ.oW gnVa8~[kRçy~)[ϫU">+ˆO ݯ~U=q|zZi8|N꾒s\gZ~zC7'v~Pףؒ"x7+x|(PV]U}~|]^%zNI.:u˕ \w}ސO.RXYC!yE?tJuNY'f^ALĥ?P^ 9KUd]t_CW }*Su oTn'?oʯ+?4)~O m)iBqz$S,n}*^GO\sbU굎s ;CX7u|\U^}?P_Sׅc__pkԼ5:^538|+Ӽ{q<ˇ}~ѷ:]dt[kBEs!hm7ڟ|>ѼA_CG/ߺr(Ⱦ"^wG<޸Wz}}ujC~֗_Dw34^^oz:ŧ*dݝ]i;Vu鸠I>v|QyeO W)ByۯC>2?rU<1|!PוP)Zg={(L~QhZ -}mM<:y(\_~NN]?|Lۏgi}q_߇Bxh}n7>*-vYayR>x"}XqSWI}]Ot}z^(!yz㾼WUrMi9|sB]ww<=ju{/UFGQW^=ɗuU P^/>_^;Ů{8>OFP~OD핟o]P\u} >կ _^W|sy:,O:J7mi|.nPմ?e__u,W uH|:<(g?#r}u]Гo|ӯSMoxiKF?_1I޸Vb\J>K?i^)Ӽed?ék:q|P.f,.ByDeO=;6ϧq{=E{_Qߋ?|8[ /y"DG=Ǐ_F!/+"2\:zcIߴ+g~R6|ejWψ88>ߜDT}7aWӼ!!;|= _v͇"\/dQ//EׇgO1B?ǒO~1OzE]iZN|$峏 #rn4f4JO%m\ç*LIť<򋙏f5!yF⊊P6Ky+%RqK~LJNl:<ߋ]~`|Q}(?Y,Z~1痡 ƕU ?:gKgLGʵE󑈸Wn[uMJiGR\lgZř6(%LJ}OD|_~\6KO6|KKgQ{$u|)˳|l !iJW*r+g3-|L_δqELOδq$Ɠ+_t|it;t{tT|ɸ%fxֻXΗ—/δELWΤ .3/m9O>' |E>|O~O!q,ɇ|>9O>'Ó>-t>}={l;Bw 9s,tXαНc= Tbio3d/data/aa.table.rda0000644000176200001440000000256114046015221014321 0ustar liggesusersW[TNv{vmA4+Źt3n[7uV2N 3&/RH)E+|("R|E)>""EAZ<̹$b_w3d)(`A `XfQY䪦0^ &2 f1r$g39ƶL L fHl`AĶ Z"uْ'uMzbio3d/data/kinesin.RData0000644000176200001440000045460414046015221014550 0ustar liggesusers Ǟ[qS y~-cܟgT?ϻvz7.*% 8g,zސtM m8wjr6*8߷rne=˟Ǚ(࿐C8ξCs=\Q3?N'* Nq^Ád?s]B`é?N8*7mK*RWӵ{k2O[t^N{<8ԣlUJ&H|\o7=Vߥ6ݰ7W/U= +rR}6o~SBsY7"\2k݆8 / RDL Ɇ ߴjV~Aa;lxZ_xi8k oyq~fkV؜yu[84ܒ-w$74?Fouz0]'ioz,߆Y|>[klywÍ,[cBJ=8[16LW{Dyo/! +@"!>~̿Mwus9[y)}D=%&P`tuvNm;ֈBGdeڼaz?^Q+ua}mmy fo/6<yw0ߐ7emԎؚq~>]uqŷgt5|uc~{+mJguOxr#P}\4~oo㬼'~Ɇ#Np&<8k ӷ >:6< _Ͷ]a= 6Ep~_IkWOGy*ng3۽5~gS#1np4fyrVv;M(΂OKj,6pYyL U:p:oiƖoxY l>J4l8_:0qp2}qko>%vy۵} U:`|bDr|o,`PfۺrceI9~To[V& jѹgAJ*_ߐO-3/7Rߍ[<0^`eF*E=ް> ~ۏM>]et%svܱyٲq~~,_toӅGk6޿M~gƷS7>;j|1_k|%A>tM(~8E!W$.]+gϕ}+mU@.4}=7 a~.εazNC~.W'W~r~9MxRӴ6NW둩ߦ˚#OŽ+o! o|z=}V~8u+K?m  kp=gL6]uO9Q[\}p/Y#۬ՉnYu⿏sObcpbBbP?J}M6h,^b}B6 EOOzͻdZ}ml!Bv/d0]ߗmDB_˛aV*봞('o;l8?3 #rCy'6v4vU[KW(K2|n?}?#[y:i-,Oj`o|iraxx~~S?.]a] 0sV!?x^f/+c֌ Kj0lpw| R+crUL [[Xs/2u9OvQE*0B=|y;&wt_:n%O*<⧼B(<+jI#2dW8D%ԱS$f@`zY1OUVf;> H"gyp s `n`[5tz*5egοFNyVaz2@<(7Q|dV1;o[Mޞm4gΙ@)X/+վk|MbSFm^,0lu;>3jqv/z(<֎J{w':֦5\ؿbrL؄P;ܰ"(=4:NiZ9;Gc}yn+?X6TѿY`ǫvhڙ+Al΍|eȦSVRzk&XſkM1|+pq~D|'eY@%0e|b~0l<2&# b߁Ig:iLP~X,qՀ0yK~|J1$ 3"|L؎5^C4K/|./s(~%()a$Qx 9- ÐھuaP aE@Xؗ 8[wS[aW8):2Ǡ_M_p/o. \c}kyVb8sg7&&{$F)BgJz/~~.zK*#h(Lih˜TWㅜLA!+'DYB䇶s>ŦZ7 /cɥH>ݰ{%͆i^p[+2TCl.TK4 mŅ>0rq 9;S%/1ǀ<]􎋥yj/+U5yRU+O̞p68SKD#$Q9wmSΖsVg~~-/e'g5pޱd4q M{3b 8ìͯkο4`mA*8y3i8\^n6м ؄ m즎%_H89vٽPK~þ?42\3[im"^][`:a[9#NM`L -,[>ȤayG\b웳}$/l̫녲cݛz۪fQ܂mh_RR] 2_u@`W7XNn 33`z-3`%2k>E T8 | Y&a%|}%lvV"l~LE- y[/ܞGo1{'^*vgOWk>䚿p1طlh&-|ZA (uӈ'ۺ8\YTb c/j"p<\Ţ;X &;A]^'E;*[fǍuy% VTw$6{x 2X>4J+kǾ専O}ݲ,bgMM,\g+<Ge;GAS<420_=s:-Si&v)3F\߃]îaL.-Q@I:hjY1yC:GzxK|ݣjmuqU 'FAkSy톟hk0:ezgqt9hI)E>~Mn:[u҄oM3VЮ)+mowjf0O*}!΢@Qrݟz 5K ]9q؀y[ ݝ&vU(#@q;95mdrύ^]~]uܑa3K@qDC-h}-c uC63ǯKi"bx,XR>>nRak~}\wm{Q}m3B'J)hao}~Or/h^B͠6Y Oͫ{Axs=hVUBen{dĩdY9'$澂r+.,*u2|UG'_rK-?EOLAuq'V0Fno>q/ j)@MӷA]n cյ+1ZHv)Y=ϔ 謍?ubTmŲ{plJ).vMQEmK%Cn%X,Rb ZF@a EDDh(bhP.cT(ٿF'1A1% VЭ*xU8Aa9V9ʶDZ]KCz2 RYD[ ^Uv|H@#d}jm vC xR ^01ɳ(=@/Y=q@L=W)O l-|Cb\K-Z>:[S~  ƣ@`ѢqI~_!be㽠82+Aٺ2r6b R~= (,F@6hqFifbɽ(vʀIƵ!u N$3{nIW |߷>Dq D̯?3Uv da! L(' 48+;N]B'bhj7DB.*;vF>Dnm1qypwg *3~2LCƙ zHǙ@dUI[8E=q_[ی^0g`3ɨmQ6|) Q&{4 09OŢ[*=QU\g=!̛$Z@3| vX3k \37QX ?}TzMRgEXPuKH}g۽Ta>s Wݳᶔ[ AJr{:K+ \9 IVTNbGK((@gʉTR@L;rDU 2E ]nf: <@Z;~L@X"av0G%_KQ{/d;r_ .!oHApҹ2CH{s+4G'䓰/c lxV~x/ST.;m3G~ N}=R $ @:LϢ$%úm@f lr8H~92~hqJdWUN3 = hEu^oln1IO&:nL@ߝ-wm")H, _n<DhߕDž`uQC\k;Uos+hϫM@ld^Wk7PT/!@`SޘӡjFYD M”frn /`ᒼ6P^z6((}2B? L>P6܊i 0e*.JC Cv@'O$:;{vGۃ*=T>I쫌E e A)udvf\)߿,(x ;^]:HwNJ:`@Hbh)ݵ$:)5 wg`R CҚh >!\8 3fb)li=H8:6*er5k`.\c;v~U9A\ޥkEiIiuj"sf(Ę;[8óru`I;ݕW l7TSVF# {_$ϭ u9gj/lӅGANU H_6hX|g[" Z)\^ze-rh@w59a5dwD@'uz\gC;~ķ'U-˩7#`yE##cԖJ=>>Bh7BP}yzGt\YO}$G] ʡ=۾4J0պxP Atx@IlbrZQ#PIN(*~<ՠ9'/ v*(ƯuX>fG^{BRk̅WϜ  j}^'[BD$/o;bo>CDuga"IoX@0\j+#;ޫqqvF@:ϴT?A([;F<8~b `HHB!_WbϤlx+OSgy >`GDz܇]ZQ];Gzae峅DLOͶn.%_3Pwd~Ԯ {e *N e,|tbxд] @h˲y'Wλ؄݈'/O?l Ãz N{9(O-s- -!cojgAc?@PИ13./)I2ѝckޞGDs5k }WE7hs ɋv?>pQTVozzg!*yA^QDj D{SQLz xfr]MD.A-ALjfDRBgQ.ꐋP|պБ?KG 4M~\C$p 9)=v̏Dql84#t mW^!!O!4 ؙ10axm\kO5^Nv;u W;mr>/t޷63~g,N?k[eGOb&& HRa|2(>X-e~ {( !`~R5~/񻶢v̀gf8C ;4ȩhsq=b>O:i=wZ^brw>CݤɷKng]|3gkvkY>CmK݁YNa-?%P|[rYF^򐶔cQ35L  w"{v)fmd*\ug+/^1f^aS6 jȴN78h23 "<"l&ʂA]~@]0kbq@^JqM>@-+ߝp=#yAc4`}'Ws?H[櫳YȞ/X.k;/Q!Zk܆,>sii6ZC'?>tIq6|"4FԹ{MOX8*Mx8&NjoՉ ?uSpߦ Ku럏2 禫G9s<λ}YxؙFZ ns!bvة0{GX ;zvb[C3+vA-5BwI*=kkB$(1x줶.yv5rݯOh>n5ǔx+,Q=m}`92r` \6Tة5z)z`M_zOmݵ( b{*v?GIYO,2gP=kT r ; /@pxLi z?Ifm/Rk1[灐q4T83F9g S)E* 5$)V& Td] L^o 4?{ΚK|0Z~U:[Q@n5k0?kٖ֔݁j.]қyy` _Vy,;0sKMOmYa>`v`zZbNip(l.6x<<~ɸn慝f]Ȏ_vB~`GJ촧yع)Z5Ǧ 6uZ0;_"0H Var@9~yDv㛖AD݄z|xa8R 4^ivTJ-HEzF{_Il~]wl~ >JY.yo`vЙ`|nee9v] clrazmvÏO.׺h~s?]=&ނg kp/vo\62-O/x- >}϶y۷;@b22-@%5N>tiD@]x!t: 2[_}rE*@Q=m3͢r,2@~mX =Z ANTM^[ߦS"Լz>>^Hj1uNJC(?hWt̓g~DVL=me乯pܝt&Zgj͉ k$k%)LVxJ.y͏3i* i_̀bYbdźTA'qqV7 FPPC զQ2V6}b㫷`ޠS$[j]C@㺰FuF3*WL8ؾt8 /RV( (gN {>CzXXA{}`#K9|1b`]b}I^k#7-i`}U=g/X;o3`]vS`cA-M~]`d$X5 yJtD\ШfIs-Cxr/hpڑ',c:WNVbѾu*hmsh5D5R9^j(g@|3,GB`xyW/_5rIITaJmev ŬQy[js9޺s@Cc'tl7Nt'Wx@'M;A{Byt)|Ff@O/&Ũt/-9g{OO8@w'Ud-9='j @7#.kU}nVIq"]c9#݇PIIr~km#/?+xBў#/o+ QKv^|UB/0ew<&cF5}Y+fb+8bWo'20[uS`{~aV]F liT$-]̳`˵b st w۪f /BV8 ;:yJbAw49'(FA\uig^zgCsA_JRn7P< zҟ_3cڮci_Rٛ*86;_%~Aػ&pr_Ұ#RچϪ\-b_~_4>UAAPe;7vSTW{7)qát_ϱ~́p?h姜֏42˧WQ)Q;p|eȣax\rq~{:ro<l>zZlook~A߼kՠtaY^oǽma2W?s6.B{^6C?cq>.]hr5:=ęcǿBϵnp"UݱCj |榈3_`}ܪn4^z.;&y AA57tL=nw\6֣zyźd/ya4) yH`ty6vEn5y<Ɨ@PhZt"y%x=p)Bh:оP yW'Ό#WGrRIB?~Jo,'9 Ϻk~@ ׿3~ ĥm{@2}֮5wPgkϨދ̊MKgiL]% uIҚv~ MpJ26yU.YGОgGx tHiƥ47|ha1}62f9::Բgr>Ɉ .GEСsKN+{tԟͰ::,pAGBgmy^ajnBXlSmHSOy,? K˷v5radg+LnZ7\֯tB6!lwtq|%X"Ա+ ;4l{[X3Nɦ,Roj4 v@'wo ꯣqM:ǠRcd| 42bMyG. }#+5Y^dSA2d^hXi4[!akuaRbg @8':!Ww' L3IekG \7%Nt L2] \٪5~>tHtV3@"aWô,@:A @ ΘUFBde73(}|[D;uATqhb&ɲ _yſT)PkԸ>B_/Мf;Û@Uۿ"*.N#͓&P[cTԙ;΂5P6. /oe(dՒ_g*A:M̧fD=`^lkQ)o6Ԉy¨&a er\}`*Dh"Qq(—M]/h 1~ %z|W%9oEg!u JѮB@Rŗ$"͋bC 2 +d nJZbϩ1^ ҹ@\s֕ Y]nQo;uhf?ϴa`"f^3/)SWnx m:+ ɺ9ʇAێw>[A#g@ 4s9HOҌMoRy@JIKTƽM]AiQ'HjH_\ m DbN|_R{OfBYs88 Rz_A܆;S Q/$3tev7މ|P" hD2n|bĵ #iz"R_|ng2B.C ܛ|X@ePMDb/Sp6͆rpDVObʕX^q1|)ɺ [v;4[*6~ro|~u[G/KA“ N~bp RKqS}QTOd{ve!j~b~}'4Z)񂁖xg#Ku`mq&ޓYj Iy5;Em?å ώHfgK<4Dk=GMg_qp 6(kQT|-_OW)5o">]q YvtKp> м8}#Vh;nBd 0(4n[]P.X5soʫ_Dj >DTұn:?>H8H9\@0^? ݇TgoAS ɇvݜC'%5&=_?=Oug f~/a-/w3&0 8IZEG@%vM5?8sfgL qU@!*OvUWQzh@Ԥ9w r~T9iϾ9 p iV=U@?V$  VZ} ڕ}K=~ &GaK*RO8`زmđ\+ ]}zs~r[*ܪ}.`Lu|)5bJ 䱊 D~/7hxH~iԹM# JSs~׈HU@;8uHNJ{3HO?]^tFN+[y~yv!F[\Wi KL=eԿĿzLJ3֓dB_I]Nԅ#R#j0KX o/唟'/56KQyT) pؾb;16ly(Wğ/v 3~{]L#*[\zx'[f^D3Ρ} Z8jMht*Ǫϰ/)WW6W>-z[ҭ6 ʶ7^ǯtb4,t ϥA8Ⱦ>\xI';pΞR ۍ- {fˑ5=^|d?Bd597~D`ie;͈,MtR-G>ϑS=';"1NFnuNfHǒvn&e 9j<9_scHGq .LPkȒ* =$1%2+[iqO=1ͲLJ$M.U8ڏ^j_W==iTۚɠPQ*Z'oWꪕ5PooF^S*Pj;7~T=yTi/_-{ ʉ<ӹR3/#?m*2,o뎌O#R[2r7iyս 5}8mcD "ZuXfͺHmIs 2g߬I"Mh;G^ V; Ru?QgbrF| 6[B!(Qc>GJ=؃3@T6߶. K^jbi/R] t"SuתM- ǫɠy[y]~аl~{x<< AUPO?R5 /9l gz>Ǫ$ИrAC\uV hЯ %b_כ6` "&^r1(f!"~V i+"bX?3#'y  ^Dǐ0"a`?"]#X}lB˕xBoYMU |"y-C*$?#4S 2ǓC. Z;i9j ̾غQ(;_³+3@hP >lQfo ʄmļnL Di5OӴl30CgF@~͸`toJn~Ñ``^ɠ d׋ҀZa y Wߟҋ(v^ \C _XӞ 6D҃o`FQdXq#/ ёvn0|HEW o rNMEC0TJ#齺\v`86a F7Hy0Y2T'5|}/2iEC C-17d>qis r}ȫc ;x(Y5a?;y*9+C"S0WH4dZe3yW%3H,Nǃz K#KPtlT+vavB_ȦeĞm(YW.!!_+U@8=Ϋ ;C%B T{7N!0xf9a ^Fk`q4{/a࡞5 T{cf~a0hR꟧_f{ `D!(Jg`\{Kz%4bלSk*۰giZapog^zx.;6P ڮ/]8҇zByJ|M>;Wڐ]l[]:ʁg7Sx.>mQhꦄ Za4 AhZ_5f D>2c-ToDaO@~ է '!2Dcsf0~[,tF+tʃN$t/|se5^]&5 P07$Ym|Ac@NUo)t|,Xn@4pS#&Jk]]lnƮ9'];R4r (&c.bџBYͫDgq*t @L5kSb[| D +JC vB ^g t,& Go|s< 'O zg3ҍ׀6筴'&mbLVhn{Ж")h74iNeԠQE h'5m?{ &6wg_'mlLvZ# oTuq(<BoJ}`6x#0^ ,}ě]=(7 ܀%κxߵ_= 3)]}Nm,]P|h$<ݔ_܂ٳ 9OFM@Y鑢lI Ծؕ!sF ^ }QbAqj;ZC{c 6TKC. J]wuThǢ,hEPwMur}M?Zu+j/Ac*{7>_<ՋviotP*/6_C߱OeZfK]8PNk1PO;OoUev JG:kVRx=d+B+vM=1EWhp>]3#kL87^뗥܆]L.3O@[r@P>zu1~3қՋ߀tS+gZŇXea f@륒Rn+ր! 茛ۛ93W`)GO6k,zFWu垣P b&>Ba`^wT3zt@w(2(ocTfnȻF>KzG AyM_pN-/F巁 VQ-K5K+}€n~ "!I>AT.UDP}Qܚ >}B1o)/Gk@,g<~ 0 QNX{AdzG 'u,ځd=EWHnO[ϊ Ŕ9 )y ɣsT{dΝIؓ#(%ɤ1· D;s1q!Z6Pڛ׀=+c@ۓCYfGj_~<Ղ@PoXڼ/<Ȟ;H&Ps2- jsHSP3,M?vRς9@SbHms1)Nfx5R/rh1 ^ C-0H2os<R֟^hR-?ﶾSϯ\$%uԻbUzn9WdGW@Rch1irU*`}`,tXRq4+`}eQ4EtSkHM'>_@jwn/mZ_Ī8_{BeB?NW1F~tds_fA=1jv Mȏ? mf9fq/_F׎S C?+Οg N<ҁyCz/3$MW#K qN}|jڏ2ĹZ}v;~8xӕz?{*ӵ!aAjTsbJ X +Ra\ ][!hviѴ4$H2wI)D. %!w\cj9]f"VsNA^EւV8 l9tވLVVOO`:{y^ɶB\ VnK@KHSD>؎;?-Qs ]Mvey9&Pr}P;߳q4⣖v (ޕΈS% ¦}9HPE텲O1X"~82򪟃 @{@2;3G, {ݎѩ']<[UI뺡~q"Z췽X\E`;HgYXhdg~+FvxI9$%yh:mN I7t':Z] @ǖ:et8~]2.qtl4AgK ##|G"tNgݧAG҆y7}5f::'?kP].u!]e%}Rb'J3 ʹw A)T ^tf&*a);P2Y\ Oh6s:(e> @H꫉%A0Cam|'嬊DoA_5W=_f{ k33@y䚟1~~mv;ME}ߺ펠75sJpՠOoЗP.G@:s TP;ʯj ԶT}@Bu+r1g @IKWvPoJ4 @-(,_SUjGˠQЁ>w\3(/7>.{:i\2M(A3 #cE|AwJmoq#'~b?xGaQkq9d%i =uΧd0QV ] 'wrd;Eisj7H75A_2qO_>b )Yi=%'CCh[,B ҙ.J<Bmt.n—{@|4qh5g=^Y <{ -hu0 |=f k.'puhz1޻rgǀis`4 m?ͯ_^k͔`(S7C 70|e R|*Ш]Ś /ދFǭ!/|k=+`L*|{< ͆ lA~q\y({t(Sx( A 5OWA1 #T? vO)wE J._W6"{CN(E<6%R_@(3ZB%gS/|}{-6$v~CE% &]p|g5RzOo|EdLox%&l/|N?jEߟٛ} J[ _ uXպrt#XsN]:m0/ɯƷ$][?nFVEE06Pڶya0}>yݖ*[De6Of4OA%c[@7Px2=id  ޱ= Ŋ={"7Ȯ9 _*{LSY{@Uڇ@1/N.7P,mDǁh<:6. 6 2׷w*WD5qkzw -n: DQ;]I'ffx۴oLryxx5Zm06^1`J ?:D;0g؁\0>y!K_E>Y*riLv`߬ Xd羃qӫ05=0Z}y5-.cC \sv0u N1P2fZH$_e 12yq$)3tY =Hv_Čoy )g7j ;HN>Fj+M %L Dxǁ)JAӃ: b_ӣյo@;]@BYG|<`BsTY*:ea' :Ձx7Ga?:_2^bbU!0zߘ`$h:F_ԍlg8Wt.WKOh 8FuBeH`|Z3gf`r_dH{!`gL[xK3Wlt[5n w\;+@]AV,+I ZUjQ x̺FxJ,u8ƈ?s]C]),tp=5~)fzJ;(~+kd* 3ށRo^`{Ǔ+7`u1< X$N=C[?Glm&ը:~{BsFrZI b12]L5Nu$ ^y&VRc@Xr(g% dyBX9"\:/2A\aX)]e= ddg9t㋗@hK_)>zπr2\7|3ljNiTt@rUml8QVmWknEurX ұ}#JMx,xMLT$j~z&`=`esG X]zwTV*XQxtS4Մfx }fN`9¡$R ,HK=G-]kje:p+[u#?˃b0?7N>O5?Ǻ w?9)7}\Vb CU谑`^y4PR[ھW0Of`q~?IO\ K'B'-וXJvBy7,Kn++`<ӻp)_r4dsT4DE}+;CnId=suy0;ɏ,)wss_9ޓ?9i00;9*18 d\&00=`CHv1㬹(0jq.? j# @mePF[6Jc tv#Yop:>_BL v\.>ɦ6ˀїށ:7cšDr0GX8"uyhM@x"䥆8\6z,EN4oP,N9ݐG>پ ,\|),RT=&J:{`žoŅo{wE`H'峢 ڮe< 6pDe0;N'pn)jB8/tq`XVGo5 ,'y\A5{/veOv+;2T?}['&T.`@I~~r ŁS`&Lo[5z5PhՆFf1tp:4`;!p; );nWkT,rD'YI pҙuS߫,X= 8E=aTjpA/6|\$p1[^.Jnܸ;ѹs)X2\?=cH6dcsJ3E!M٘G苶n*iHzY3pѣWt+%[2(_0/L+TLc־Ơnh:_S끼%鑦|(p,v{jWپ ޶T)*<:.6\nb̻J> PC-B۽RE5di4ߋMKNvu/n=\N JbDcp&^ppϞs'޾pǞly?Z*Phv7[gA9]6uzp%D烰d;=irv_.iu=lS[|r;߇伶ȍ򷝵&:6s@Ǎ7H (SmC)=/I;fs  L}\ Ȫ<˩ZǞl*.\oI>-غn/UodOz*콤>P5-=ԇqȭoh2ǔ=ѫ: ӷR9ehӾ\1`]Z/kG;̫G ي`^RKܧ rC ,tntŁI;/n6Q} MkFF`A)i]E`i&B ,x5@K.`&X^ v$:Oнj-0u}@\v~OH$P/$8v9O NMvӂgc,4s[耄ͳ Qߺ}VAJH8$L_AǮD fw}KXb0o=_t^aw_3>Bb1};0p?q/Kc̎5:y`S1NsY׳粅?n,SL2 -"wc?UWxZ٥0%S@o}`6Eٲju?Lo1`|g7_{ ⢡STK L ~J.s$L4P*89$Mo-{]!`~ ^3 9%d3GP}vV.T?:V "b*0c`v.C-;Z 1T:Iw f%<](~SnYR:TRmmv9. Sg+珆)44-2 ˉӡ`*%ɤK-ɚD=jw3oc TS>In۞?U)-/쉷8bS"`]lF!o5ubq5 >]Pk&v_LJ87@fj&_fӐ;~ lYј 6hBs&p&ԁ=5(Ez`dw[)[Nj*`CEH^/)8I%Yx7>ZI[<lhDODV(~z~0"/@= ޛ=[*ShAVH7fD|"+GA| 6i[~dsЁXVfw|`6>PE@zbH|5[+` scR'P{aTT2p^GpgT0g5w\f`S'Nf0g~3Ӯhh_n0 `5_I3#Ghˀ` 4 N^QS`yFe{k|g70R~A')4h{qŽ`x~ |Eݑ@,z r{4S1-fo^{tv}NxEe蜤SJ|q2 `6b ч?+X/mT b^7w<1/ӞB`;l8X-;ŬK3`κ tzfgi{aQ0й@ ) m9`@9 2_G_2`@ !e}A@,[E@vF$ʁH@ 3+`\}i`2\g=N= %) .XU$[@.["_҂yzjװFGTx:F2PyRd̃F S ŷ`rr+VOr60wnRaTsOz`-J˧#W Iɿ1,|t+A@BY}z=t=ryF :٢τNˍS6V8>7=uQ4st+E)::?8DJ}Qc [^e?~BkA~r* ¼UjAsAxk{@xaW:<'Ə`ыVi_|r YSeQ=iݟ焎=r}OB~I/5DE;k,jg O+(R^ߞiWQ~-}E2 {SU zR(X bwj֞}ZwGYA+m_<73Њf*d.D&S+ $}!Fr& zQh7VdY3w*hO:Va} h<}wtbs`1>:i`s;<6ꉐn%ͺcstSpE` 1;v u?>bT~A`1&G[̳m2E=%XJI+m}.-`r5(G̼0D7wIy}F&`~Ϩ 08̔w-^f7TQ/ `歚ӎe`~ @xy)ͫNT.KGN%_ ]?nMYdjwݑ|j $VdRjsqP[9|$ %YֿpC ^o j/+*KA]ިpPڞ'~zw"Sq:7=y)dJ]Stw0@othjΡ\`+ǽ.L#2>`( 2 ҿ=BA#4Uv]C <`Rg{ &&e|&r\[_~u>hi *VWK JQeؚ/.Hq}PbXe +t$d&A!8jR?( sEsU>J;{GBN0"A!M0[/(|0PȪy GXviuP\]oXX}e*\`l;ki1{蛿? Leew`f}W'2.K]4wTmnF~2oP}jej.5aP{0Aw[jgkӦkob)?C,wQ-81yrzohT mruDM3K}֒݀w^jAV9 \dX_򧂬ˇߧEң-gAŭDչw I* 47avolҳ^g@6I7V g^}aumn^ |]/oV\}W.'4F P;Wxu" f@PX!{5orP9n5ccXȀwƖkM=fK6iKO0iOb%PZY;>imFH056P4+m|.{N'm*WlA9>~3HK_'1`L蛘6 Nz0F]h+yf ĉU]orˋhd1z}q S{Ĺ2]H#KQ̀9Wztŕ`Xuc>X(N!-uX<9:妬VWm{4Xl>R1?.Kـ,*: os-&'ky(ퟣ`UD+1 BI($XDB9wk/Ճ^ p_A!RǔOF-d®CE/}~dP 4ypa{\ y%?ep.,cz {/ٍ0!0%0QZ1?iS<&(BS2ugkA+h*wɥtZ( PxpH .FU)N֡f(%%-짿pFf߸)=f!3/~A*=*77FAfVf22RFJM6VPU>;TZ2wz_GZ@UzUd(]//|#ԹPeDŽ\w~T5]; T'Է_I") y-ooU I2O<H%EBDT@B$&H%MAJE%9}ގ=O?{}_k:Ͻ׺.-~}pNMP~P=Ae .aEWӠWT)5/G9'u .afdV[Bu kX3)U&?а-V6mx*0W2Qװ|EBo'UUsۢd \gD;S&F~#b2j^ءE)DzΙ[dǟyɚNTlhoZ]$J'[ks8 u`i򸲱ls;ohj}yA6u*cu$¨ꮙf _>jV+fAoHܞ ڶ8z~ás_UASvw#tSe S0No tnȷ=eSZ =F6iZu:t_=RBzJyb*g;`[utkf:x73;vC"Δhx\ީq)qWl.;hXxyx=S;.ѾAO>kҧ% 0o;Ɂ ;neDwup !^wJO'5mC3HCӥni9-Y h WFEB L{ _"LܫCT~L[sSW{ay] S&0~>WY=%&1Okx%F=Z-k9x*_b7^$_k!b 4 RHb\'HbNګT n {(?aH䕗G7 *mZq4H9J2A>#ƫҴAZi EwOB K?',*b{P̧]Kf*0K`>{rc\fꡛZ~0++s ^t&&WރYtS`v EGa~YY11 =#'E{0lAG"A9qn72&?V}eSHxay]b0W-:ut<ޜ7ejz^M;GZ楠]6~!n{HRS?}ՖuLT.H6P6ILC\z1ՠ.ڌ6+A}zy&PO)'N ji8*S:~u1)&^{W1նCDo)[DהgQ$?oStfxJhaF''(?8c]J'5[+'-%ttM9mn`BI!n6Lc  6 ] ,Uk6+%?A{ԝҊh7(>v2o|K!u0k3@IYrP+ؓZ˧JA'+QV8<cCtG{^zD~ҫmnKj0}{m~~a_oZ\dBOzyaJLUbSRςU0ͿZ[&0qSkc~s=tds/FPz=جV30}SsLsajtCzLM?ʭ SfcQeFpz$ͫ6yѓsolރ?[7>o(1:uu .ڿ:^m h5x{t/[ &[qzoL hN{Ҡh+W9+YHzD+hS A=bq9h4͡i{dж^:sl'?U EF_ ~EP? {a EѼ,͐0竷cAqt@??dA٣?%jA޼$wɚ ZN;ب9@:̝8n/)4Ƨfg%ĶcC<| 0}PjF{/#[@}O{8,~:'mS~:` D-ux dڜm?f@6_Nxȇ?j!HS$.Nr}u&.~į8D_#@XݼVcAz[QY c]A*xzXTRshl} كFng6/۞-ᗾ 4ũٲc]w5Q*H²L- C+ 8{`r5,Xj|sV^ a{뫯_TΧ?a`RBn_i=dXWz7gd=`uLGoS~q!)> ?x$ʗ}諭g I~7 @P6k|)B̈6_{\tCؑFw U4A&y"uA ?S 势\WF>9ɸ/G,A>ziSlY]0$X_s3`Ia=&䗾͚{zkhM6` [mV՘eU"`Lq`+r{eA`6h4'P@K\ry !H#o_磜 ^PjNÿ,m:+5MgG@ _)Ln_i;3>1EQy#ucdy)Ч%w\;S-?̋+}{ 5#ONQW'}嚴n[  -٣.#].Ise41 /ry2wIr)+&q줗oc<(HN5bՍ|\*1{K`umG zLÐO-gAՖJkD1è7eL>QpDmaXSGeljh!" gr_";76ZX]vYOv| ,+Q.jWcg,K(.rɷpagJM'ҥ?Ѯ>x?X oGpM c/9MpRd 8>=,Vl. o@[нo`%)sҕ2<+:æqZ&+L/F yb^`$L008p{=joo5Z,g=^W\`Yvcߗo/<.&u/Ac|xĄ./ "4`WI;yӫߗk7]x?N/'CܕOujL4vs?.Y S]C/׺~{-[% ?&EF-W(:&ԝQ' xZ.kۑ3R/?la=#\GnfFqvaf#r&?ֳo;G5ZVh翖$#}v]ڰ_o,Q}gK寥mw#aHj50?{F`:uZF9MA0 *oksmst}Tf8>F 9;Z.56Zg旙 s@-zsT&E74XO:{|2JvXպ5``b{=kTxN: ʖ*TϘ wV+zvޢ{{E]SUP}Un%u6n{-bεĉJ/,Q~sMޙ=ːjrGs=2zLީٍy'WƂ=/"(zQ{dVZx7ϱ+szNʲr]~jQrʤݯj(<b@^;NDm HygA:RU.ey2++)e3hTv8yrP5]4'TΓ)u ɿxс:d/O>)XqQP cvHpc j/R٢+pYqݍJ8O(K<Nމ/){GW3xkl118\!+ β{^3_Ďt8'l!xӚUY+AgKLY""}߽&R_0 hS6ֱzr~1Nsܽ@jsJr ;@]^K1\,F]Ƹ$\5 P5 Mi^ꢟLMVVU 5J`hs}(ssL$]nՔn^ A9~| ,5{+Pv|bG.G0pƝ "Cf52x©[RЍkggJ0KB/P3Ao)EB\ᦙOwBCa39m]`NMˢ@_6#/Ԁ+fM<;V8x?/bq?ƴm} ڗ L YGAxO,-_߬D<^{_X#{vܛO; ncX+),s{#X%J8F}P]XK<#؃ݫR,$u0W`r4}#ˀ߶ֺ%,&KY=olټ`,7<[Tw?QK\7X7z:7T^{<<-t3 ԳnYq5㾠F: Z_q_}bXEf =YqcLPA[g"~˾CdHֽ._: f~ܝ:TeiƭiைxEgWPwqU=<}9Q'|؎ن; 6qbHpT' fd*]p>6i_?l̛U,w쫅ήasgx&^M΁z$`c(؈V5kÆѿ x@I>FD#P}v(?@~)aPߘ / ʞy"JK6(ŏY ?uv5 7ss @-ۨ$:)@>e%GiA8.Ƥ155" dy73!YZﳂ7A*CN0 !I|M]O1!T{9(5~Xe'.Ѕ` ;>5TUK)~^Dn:'.( ({Ga0x4''+{dDpI5gvrW^T8T~(9MovNyH$%9JsAr6>tHa3WwUX-/sL&JeO AzcËZvp䅶7onJB~S5D?qHSҴ@1 腅A3n@̆  -!&W& `9sECq^8W 75fꕫ]C!nw^MV6cg4?E'sD&)ϐKZߙ%ydo[NܷÉ*XT@ 'Wۯw_þtWW߷(|F6>ǯQuH 4J9O R@ݾ>ރpڣ݁>kx8bhc\^_Mhr)й+<ڭ@=y t}IqO+`.rgԆm_uKԔQӆOr79aiY6=S c9ă?Qg-o>͠VE4O<0i'a=t^,mg8`Իwg_( /S@rfb<@ϐT8Eq⒦cN'U ƒgz~ϵlv$O4:yi7 |?G%IuL@ "-FG.5s壎ݒ`lOn{W T0,NֿZfa`⺤_3M-+.8m8/*UwA(c6QdγA97U}:D+v^4 8 !8muXi2ҚCy\Sb<ϵ{Y Ζt֫ ^No3q}M*ٕ?gũZyh3C-A,c%3Gè&MMWs߹R[ڒg.p+P{*"KSeGȁZeZ|jҖJ3#xɛ+&m'5}ξ۫mμɵ ڢg,1 Y5悞pj=^VYS ;|kl%c_K0:cH1BsR=!ܚ3aΐ8u8;n@xDyCL}|G ?~5|?׹q־)QQTzƦ p 7p \r\pc6>|p=ǜ٣4yҗ2I׾ԅ;j۹kpg8EapnP bkvAۣ &Gނf >j ˄ ޼ :@}[-zIin{ 6?};}0 ߮T*6,,<ݝ%oْc=v!ٷ?8 u>߾0d+wĮ/{0'jO݅@{ {n`I"Ť60YgjxI ]LݕHf47`S·efZ@Öύm ~&r no nkwO=s>ΩkeH94گ9 DB!Pw/vWl?KF,c^|̑`_ڢꃪ:`چN$֣s %(ey G|c"m h8$t'NXjoRVN<3CY~񒉇S HGA`[S ^=}mGawmmM^z3oi|~p:z8.xz y* !aT3 }߉ZNݼU(1%KoK<894{++`~ k }\zwZ ևyPyXb[nHA*,D$ܝ)I`JTӧuA66'!xyIb`* ,G 'Ef<>rLpRmzUa1'謃⏼ 7hՇ4Rw#x =Yp%8S!l8AɊ'ٺ+ <$&ةbN!e+_1hd1t*OX#qb ᘪe*_ƜvgeCpRu|1!{Fp0΍wcʂcdPw8Z" 5lPs|Gj IkFq2\43MA3+^U0fl~ -w%BYv1}_ä%Z-~hRg|nv;'H}+G@5*KQ/FK* ,O 'YZ2a7 BFAؓg*pHkpRfv|tϖRƛ)E]\ulxK燜Jt\XoxtߤŽnOT3_`< xq_=N\5*Tni&GzS~nSX=) 8OƍٞFkk ^D)>c東ݙ;NmL2ְ:4طg+mNj9YmE7+4GAW&|B/;h@=Jl c֍La}voොvZ۳ C`9~g: 8{{1R c# ǞRvQWX|ԅC(7 ?e5$Apذ ;Kuh~waLCR4{-MZ 8c_Rt~~Lzmf;pb*#/6oX/WuWOM~ފpv-GlqkAj ]Z;04(`64X89}7gM )ۣ`Vͺ=YCCֱ`|H;s9QEF{PRXl?Tiv#8&?S}R"sFkK+~!πӁ/>wKxC/Nѧ$ /ڕp. ۓ {7ֻ}yǞ#p!|=.7:!X"le>1] z-W; `R~b99EE6h92'2ɢfdGs/Y~+h{J?|eNLA8W@ [wﯮsfCw3&5Lk.W9NFZ|' 6ܘV`jE74>~&/vZl'?N9Bx |"fs™wܸBƒ~-`$K&]㮌f{9kT0Nq$/sqpZeQ s?SjmޅXxxqcr- ziE Le3'  /!p9!w$xZgٱBcN\1>D[==qn{ɂuwUn`y07BW"Ow-XK^j==K帨aM^>]wЃ%A-5ɒannHG,lz/aQ֪{es>7F&FQlycy# I-9 cf+MW2b8̏4I^]^ftM9>9ZW;#+졂ES[ 7ue~io/jU,us_(3ϲ0U5Ly;$;p*D* ta!g$vz4uj !WB/oGޛ fGmZbAgc`YG7ȱ`t? f@P66=5`)5`KdsjEʕ|6RʉG[B4ow&DYj"qS$e s8web\8x0 n[NL8r?*g큣QA wPOzƆSpN0 }e^¡o펃ppx͢;Mpl5%ڽ39.}@\Ol')f^QnJϺƒUU5u,OeSNl3ūvn1ii 9Bp V%z-|܆'7LtO):%nqhjBo=^i_=gj"ܷNkZ*w|Vp37'bru-Z38srJQ6BJ9WDw< tK7ba43ػExoWaR;<:vB׸>pYƴ`ꊯcAY^Y݂T ڐMKƇ )\ ھA3&1LjxĻ z(OP3vҙߪa#?6낾RrU@|ɂ;g09^q'7/c+mE%a}+XVYZ8Y|+EQ(Kݑ_z '7%czaק}F`?ݳ@ja?|}|w>[{۽2.71TRHTSN WWR 4՛2Jfk=z yQuXOT[.ؚ:k+Oo&Š~Z'OY>쳋t8"؟sfs 5 Y$\'{ Ŭj 1m;nܔ UUS*C@*; `d kܬ u@Uo+Ho'MhT$ GuB݁-*O G9;T^>Al&+D.N9Zy,/kOzΫRz) g|eצhm'Ů6psV:3k$Sw*`qv.(kyTbQ};XOvRgZKjXQf_-}}~Z(fcFW+a%5`:Ÿgf/ΒEHvXzzz2X+zjl0O1uJe,v~]N㙆Xq,#v(?Y  >uXTi.ۿN/m ~5'l_D޸[|u>KlZȱOm(%`xN&vYeD~[lwnw}ϼ-=Nt@817_]\V t7>+C>!!98tŧځ^`0I5N~v}5U)>t&MznMv|U0;"&{;6dQVcNʍhc0YY{#YgLj'M*./6nZ,ns&vOtkF2L4uzpz"LF4aҰ{[uG"v뭵Ƽm4WR;<9[)O2u2ʖDDm`;Of~ DŽ厛\;Fϻ5vBaD..;sm;'fn v`/nf% Tw=辙ԙ ;wmm[NŞ`탸4v,M -=bqm?pZӎ`ojA߷!pÖwGCH*k[|^wRNRnguy][ya,]*(lO~6Uo?*EҠ{n\ғ{Ql|5/ +S:{}֏G?º9,B=&Vݩ8kWoϖI{`e1;.gYXxև];=Wqk['1A k yS\ ȇ2ͬ9钌ɭA:>*};F en }Z#5z2҉d4AT۞WE7A^Y僞 ?dݟcH~Hv+P^޼b9BO5>}ڜs[.зo']?ob|&}ZvII7\)?<辛=|vfzhCR~=g~c/o !ؤIڷr>x!Ѣ`a3;0f}):lƬ#.gX/|;dw`G;^z>@:3?eHWwO%J ;`'Ⱦ@{㵻VOs= ȭGւ$\0H]+NWdd>?$]`5#V}nCe:hpwτTW B!TŖ&Cypv.CPYhЁzqG̊P 4{vկF|?c+t0,7kaKg4=_iU4Ox*LIGL0Z˿E#px ,k0CS F]OVus.!hVsVۮY=2ή`jST4|mJV}%gQ.0LqsێXc$ ֓)ٌ :D@KZUjnvr1ah>u%^hFd%}wd]t}{c-LK$>s>k szW8'C/s)嶼 [I_zwχ.kzg_SnPq[ןsu{u^q.ނnٱ)j/̴'yQ$A/"߰t.}y =~Gv:/@?I OZA7味!`}},00Ʒ-b>`Jj\3˹ EQ %}F춬| xM0v{3健kwuk$k&*8ײ`.>w03i5Hm`{)d.4Qwap1L6[`47oߏ0͏bOQ[a7iPFA0]!TrRF!qs5s8[`z'[`$0~yǏ#-=*7KKւ9o{c(gv4ar &e~h0^k/X! Yn8Y-n/@̝dX5;%5fD{f, }nsIZup-e1T1,ZCy.ˀ$o?Ձs# `wk=9G2cf4Kު)O^^:F}fy1Tm|I4vBb7aĀgG{+̪^GwS_Xt1nPy ʮ'>rlIP=3Α`);}y f?vV҆o \^L[y7nC}kg~lP"`i \Qw ?mM0d4~ߨb7|J5D虏V"Ì{6CJ;U'gƃR~>Dm#5/5=v9nc$~~Se cG0OUNy=0,v7f*vojv.1> Ł!a cTӑ>: oosyź:"c 8B#$&ޤ3c3) H 3tOq?T}4&XvsSBt ~]ifŸ/5>A؉is_m@/=F-lL<NI]z,MӚwRq#as6ײ-gfϸBK̗?'|&uL/K};kbׅ?.7˵q='&zKzHWZ+Hm-rY~{\}[ɾ'E X{ۋ5|k*\B$x VL^uiorqe\ٽ_o6k=2hG] sun%]ayK5-1.ޯ/2A>WWenKMjq`Z7m^Ц;q&փrD+m`Qnſ; Q&Xr{cjC~uiX `갴Z[_\{ALaGy)-W5%{7# pa(X.M` FQ(g=K/M` | lҩ5fί>yiz4AM~_C$l Ѝ.J6d#GO@{a_yvTg 9x\,뾋7ftd]nhwgdrru4j'fVAܑ)10l*Zu $c6i%PI҉o`8(R#ٻASщH0ߜXj۱ؒw8Z䫯]A`o6g_Xd׭u}>~/辇:wW`.?Of_ sOտSFJz~[@ߖj^j+Y\<#䱯oYv!G0χ,y>9 o  ʽoWOM%_ˢ~=64b9Sw)ȃnQ %P.2>b/SwY0=|("+J*s5Uٶ3S#fjtj!)W瀴HkN˽x4PD_msI_Cާ,|mmi48ֶ¡ߗGCl*Ƚ,] ꓖk^7G@ea&cd.*m9iX_]оYvA_dv  WȽ+L\_˥tEjzL(?HZY-y˰KLrێ_\ þ美nÁ-DoHkV|y DyKt}濏Nnztsie?75@m,odQp6& Kb&-a1k7#E.sa ؒBQb'\[wah;)tPo@}i1~2U/^}.]AZj7Pʵ^Q`?sabj+;PrX]w|eXjT8GU^D׉f|Q(F Hm\H ]SDw0HGI |! P6~>jֆюn4kGvk>(-H%&* ȕU*6% M6|_'0 b(-\;>ϟW }ofi}D_}r-r?%qVc\OR\4n_KӰ'{E,I^zHE#'ο;ՕX445u!_zKLr>+8nţlGWMO^H=Rb cָ`ErbdC 0 0nz{U7]H{yWlNo-a' #oU\fy~,\Y4e,idH5mߵ ~'2ktv񠘷yvs!{]PW 3UI祿S|/팍zƳh5~ˏGīuҋw<`oNX3Z⳶S| kѯ'^?~{M(֛bY/ONn أˣ :C0>[>8&Ŀ0~9cYw\Vya1>?u=I#; +ynA.ؘoG_8%I`oeWUŋjeP:@5o/u_$_szrA]hӰ߾W_ym+ŏ9+g49|,W% ޵¾dg35-Nv529!y.. _?B/kk`Cʿ6iXFk<ƝeYqޒM=7'`O@biPNZNEՉ VІsS6؊ȺD 'wEW3+(Muk^_ N>mErmgإnv o=1Q}iͤ E6]0.tU@]m=нܟ,OƤoϪ];GB}#0: zNM[23ھI"9 o `ކ9_{:u余"ۻgxϩUͺXh*nr 4;c/:q< ]m]з=6cQ *@5|rP"BRtEghM`ߞJmLy8OV=8U{^0/惓=r1/ 87W ܻԿqpS[I6 Xv U款FڒΒ[c~nId6&GوCY@SdkeCeXWXXiBe Ԇ܉z4}em誱,#VׂzwS>JH!@eonZ^2PiAw;o4#'* ?6|]Udρ"=2=8 M5 [ww._{w8Lni}SW/(:.wx8`Q9^p(xB+A6˞u\ff}] s ޚrP{ź县T? SQpr,*YyyR UQ]9%*[5 @UR-T'VMeC.DFQ5l *S8'-(T 7J4NMs@Sm~Av=ZG/ CK{ q~61]: _y-s4iQ  nポzi,p8|TY2We0g#C$[#i! W8Z2.w@wa1iAeB?(V0SYcܠtQÿj(#bu\\( b鳶C&#L%;ZaRˉ3&=17ru)uqE;6%t{`,OI 9 orӞzC՘}TAuC|畖% x" Y`6Ũ{YfN}-|;?ih43Fwn8Ҝ.ckSup8S\*xꄭn:1dt,e6VyySxf-9b@go!Rm)H`Q0[oTCiV-9󏈛k@3p>-ursŢ 31qݗwfx `qMs2@Z&{]a7nWk/up (t%)gU#(;uGJ1{D}0+=H8^B^HP\|x?^i?R%ڽQoch6.Mt{?.WM¸?ϛ6!78q=xBԐ3u)Kdz ߪ ~.CLoyCTa%ܷ|\/yU>+\' Iou èGWxuNl=_;8=Icĸg\BfobAP:~DYʁKx۠wO~*PkR)3[5ap98qFtZV_&1a3FLAP#=I 1*Yc3X[t,gfsjkQ'J<mK{Ρqֹ'к{ ߽m= jJ18$}'xW ygֆ4Yyx:ԛ'ǁWܼ훰OA0DcB=M%}~o*zZF#(<s.Ue?hq&qڗʊ;Bm̻+_?#Tf"@szK;xx(zT [ 6#VR YVK@kYJFl%^۶[ݏ޴W`mYA@s|"}~KlgO '0ӫ@}?F 0OnIJ㾟L8l=*jt5ugT9ѪD6~ ,>(G3 n\@XTJz^ñsҫj_xυQQէ_\{IqCP:wJ,aTF+~kםeGzmHY?^ 1_֩au7rѝV TnmQ&k3{ٶ}浈z5&Ҭ lW" {Qp:u'/~ĝ\A?YmNDZy~.rwvVps\kN熙e2*Gժ1W1:n)hil[|ωm߅aϋ@[;Z,hvCu (9Zu {r.: f_6{C6䪽`d'^lӗkz̪`ԴL Xҥ4,3-G<@0Ktu9S2^`}-h0;3\;7}?<gNā#',pS<֧_^ݒ'u=))\:\[Nw[Q&:<\p$U9&a򝑀2oA5{Kex@yRE-zǥlj^RG =$gxIZ]0TO:|_r[nsHo K׳jR*KKfy VMSo}ⅅq9x{ ؖ۷{<;tYF=3y-;s "X3u`|4GpiID9kvnQ=| <x_n9 ؛$v%Y㲝ؑ@)EE5>) xkY#zi A{ϖap}YQ``[_`8Zzlks`ozQ%@/.|B@RIVTs@;dďGa8sp$Uϳ=)8?L}/釙Ta*,Ppv | FlRO:fg,0@%Np:LtlP\W@ӋuEf~jk@ /) 0ow3JՓ4$lƄNPKuOz@un.he֖ k>P* sGAR(0%H^fWB͟ 3ً^9Sn`o l)gxZd.BV{H'% )`60?vݔi1sz/X{Wt(7+w m"]ݜ jgԗ"5a%.,F[>h?g^~'T|؅e;@91cBu 䝆]`zlf,̄ɹ~{hLcrv]|¶EKA  zm @itYqU \ӳ :`uWeh8HtIVn9q 1"Nw =7U^CK\Iy>V kzQfY[&X2Fwp XLMڞ߭HvO>S"k}0c<+n fr׫W` WV\%ic%/`nvh́Ϸ,1 {Hzi}tT燝Tϯ>a-T?~7Fk?Cce>} s{tvQ&ߕ`3Q׿?o{dQ(?z)V?yJ@Ӡ3&wV7.>o WI]Q*ry]'A+mtV1 ރ๬ Q]1e,"cthJWe`P|u`FyYH+9of]5W'J~ϣ.*K?{&/+gNd<×̈́u3 vWm.L膞2Q`p$>8* + 7$kgsQ7>L3e!{K+۱ !cU#dw͏^'y*~|sFЬFQ,-Xnh^Ԇמqh g1 ԭ~RDL 4M.gq/Lgs#I_)6>EV $zSkϠ|缁MOHklWQ>vjqńsT>u~3LB6Xu)n"9~rZ1xn.l6O0lm{6`l}_ r4b6wFyقciӉII'&^`dT/igXh[nyd9Dp2Yߒʟ2SxX~ibm0g|_3qJļ=~{/*30ߔHf+&# Y;1i!X:)wg=8h%L{vJt*nIKv,7XeM]:DZGy·g6mI3`Z*>v| e;)%)nYYsbY;}6~@؅H.+|j3&#,ɻ.+٘9lnԉJ\r + !}װ=|;>8"nN7`>;sG7G/5:іk?/9oߠÑ86A`M9drn +ddJX;ƛ[VYF`x7yŽ"RwE'|:w"p z; .?u^bt"776!"pE:c}D-6Wh)y88Y}!`'&kw'1ms צl}Mo{Qh5𸉥O#k>tf38g8 NK'Ü}h.SbK?J^\\l&#@?G﫞|58\ы/2 hNEc2b캑Q 8.NGdT~; >`ͽ(kqw'[ `cTJcL}}r`<ݩl)-U .MRy q[ZK;iSMI  Sfxs5 ۉvqY"Jĸ:zO֬xuW- GbCؙtnλNܡX0 c?zn*=i5.aܓFf:1F;\vڛD`s'2$_sr a7xڧz ^LJWKB jHY;RwñIiWb.x.^jp,7Fz[-aTQ Ѫ\~>8$k*=O} {~FaUpߦn^?? ]>ʢph7R~L#ZN9|/#+bQMut*|OX 7Mؾð[^7.NQq6齍}? 3[s?&.b۬` iy{h(>tsUӞ$ڜiS.?1*wr>ˀup^KUbE3غ6g#kV"pR?ӑ8?fnP i5w 8# $E~CWܣ (p8(xf.OU"ϕ%.e.'gXsޟܝS@i O;MGGN׷i\~'Iߝ\G0oq`7(:lLs]c)K5W+a-gaEX\/: L yCAtGnwam-Zw̳.ߙ{F C޴/:\=~ >*sKׁY곺zۺ(C7 z}8*fќq{oꂭWu^A;>o&d{|~ G23鬡/7W;C#&̰#ɯ5a.ʶeӅTw\8;`kL8R|g> MTD]_zu4hwpL,ぶ|ߊHk5`ŭ4ʖSG_u*/"F>DyIڛ`#}]1kE%o:cܠ,r 6mȏYWOs ?$`eq> )ĸ?>ʸ6aO$`h3N>M¢asO3u> a'Yjlz5o#|WepE7:v{b~g] ϯj KS,ͅVv6@%M3i\pjKv!ב3ڟ'/so_$|w*Nz9XK;ra }6Qe/q)ALln&kٵ{qd1W#G5xDz^kjoZ oۜ] e[KFB,?:;DEelpPДb>rG-D{Sɢ+=w5kfS㭆`n"{;Dz!2ޗ5q"_,#g@?qI2X#t3/>}k2+A/3kJ}&'>-Rm߂63?;`lt3^VE?P? R08i?|ù+0Svt$ۉLY\ACe^nE6/x]J~gc΍UŢļp&9wk빠.sq jH񵠚_ 5͍V`XM2&l)7{Dǃ:0A{ $$Wލ`\,|vםD{WE 7j'={ovʑar5p~zH$ɋޜqXYu of~ Cل^2{@KϳRwEpɺu+ߵ(qYCί!%Pԕ:Eզg5^ tysց5{oSh  jG6X&! Zк.Х.F<ZԚɠMJGP\ja/ _љ& ʑx7h=o ;ΟL[`lQ?aeX/` XEjoj7g+=)Ev.EU'rZXSˮt}r%1%(΢s w>^"v&\HUTiEਤmvx(.Ll p|~}q]k׹ukgƻ2ntoLΓOAs3ݱ[GHX/^դ,\_Y. mO[=a _#/:ea4-Y6 0WhxSC0rL>*YKG\^gY<"גa(@]] =w+P._[&3qMu237!MrD@iU "ᾠeEIЌC`i[;L..fL_]]l0=y5 &`fD@¥/#]kh͛o4qhe|W| ΍I~'o4bJrɆˠXm{|nz+oݚGAXYکºXVz #0sapIoM>gYJQR\}c da`8\?ƠX͢N0h' m8+^DuC_Z:$-gҦit:{P-ݛ<uG{&[*zZ$|>/]zZ%e/YKCX(/IS I} yMl?vW~.tδ|MjY"ڪp&x=DS#e51Kٕ9!kۣpw2ȔdA&eWaؓ~<a7/^Џahm; OA[֝V`({ D°I9yix q<aP᫊u0OӬ͵'`rc.IL#͟+ R1*?7U3Wg`箹&fu~^{?=Xg! f.WZ"˥^%釻D;Xǐ˫_m̭ ڶ"lt~<|'47M֣Sl9?U\ K^ ”r*y荱 :ۿk:IO;NJcMǽajrd3鏚` 8a>M[}N0t: _+a]kMXŋEex\O;]?Ff[ﰺ1\V]Z1#>FԚ{ p &~{{7AǼ4vů/DAI֫Nbٟܼ=>VUvEØM,]?y,N9$xC&V|=#O8u;ζ~U',}˿ s<Ѱnr,IaXINCf^(wl:7f 땺Q~;8O~M]m/)5 m+ɏW0#+O J 5ASe,S>n}=:YZB-%}P~gu묟jKڋPȧ I̾/_UՁOWhC5 *gv.jwL`FM{-w?YUbЊQdSKw?30Y'Y $x8: Q3H}hF_>z^$_L CWXtp&4/Ck3 fe\(C,u-Ͷ՚YW~ O#R?~P~xJœn󟖷AvǕLUθ|Ɓr=?!#l }-²}n9Y?hg_y?%+lՂ}OS`li&MذON2(M!W@ڭ~lzN@1³U$[߄qWT>+Vq]_ALr;~}87aT4澵>c& ;ވcf4D s;4h'-»kA}}vwl4ãКJDAP\h:djԸ]3߀u h>^gô,9q c#R.Ny3}ESN%l&Lچ.xy~Pɳ| ~R~! Q)Qm62,S `@l;]uBf"Y|SqtXsC| [-Zj IǗMЇfОJNuz>W HAMG_ulHAMqL|\na6ΏTV]C#MbKR]91P{gޙuVz3mu3QXlV˟bJ7R})mg`9 3yw ޚ8Bw(h 5> :5Pp)T) gN b/"g(<9= q˝杇sV몾BqfU(܍Hg@elNu l5K䱀j`geT_BuP{03b^u4zM[8K:Ԗ ;^UK5KdTk$ńy|r=dV{ > ݧ6D2 Ri wY/dSo}˻nGQѝoP瞑w@mxa^|ZlK iCۂr *B,`=Hn%U#oBABd!՚ fCZa jw16B#ȧ'=ԩGn0cvy6^7[cQ2y [mO=+c3Z` 4פ\ v~s%PQ+g=} OE1R^u=Vͼ*֜A(ظv[猃|bZ(s"{`+~'eQ>gfGl;^E鍄$>B l*Z’z%qoL׻ݟ́u/gmy,P JTrfT߇V{q@K`aPxVb-˶4k'Ě2 Yg7gfed`[h-,!8F "{⡞GMsz×5L Ycpiy:@X 3(nv ƥo9UB]&_NBc{ּMi|֫o M &-Zs;X' ځ3zva.edTZL>R.lGKaYս٠=<sF]$}?c ̅s 􏠱 GgI(Ƶ%HPN3G ُy)hJoqdfU6Bn۩$?f.g7CIS~>;r{_W 1l/L rj_n-3܎O, [̢ټIXd58%if[ 럃:P%&Ųi⻿ZQD-F@=SCP9[/D߀&LX /w;.ԫZFؓ[)ϐig0[q 4 B/@tJn0T%.rl2uQEG`Иpq# 5I&ãB0LPˤ oG:h?h%U,PZW2/_:.] ׋ uBI<^y(XOTw=Ip~%MPuZJr7O얅UŃߡz/{(խ%:}TGa[Y%\ r:O4be.逪n] msrcj|Teoak@U۬\'ݣb,HyK/Ώbua|~ưoy}ۣ22n0nFR$Glqq_CaYgJ?7ik~Y|-c0.Sx3E}/w8=bO¸51Y̅=%o,hӳwJA!}i(Ekidn(-(z{3,*FgbPtցgHbPT|8&H[[V$p{:)O̿eg D"zW>+՜$,W$aVb_ӏv6HL];sJa|} L^ bV8`z#kgG4c7'L+ ױiPbmԴczPZrp3,̜4SI}ejI}`ꝝSu~@uz@I@ `03čGVC!I>fD Z 4Yah ܴ~ XJR`YS2u<֓I㍰o^;K ۂa9B;2am\(,)Sᰜ¹66[CV2N(,?ҁ3RR>zO}[lg6uO@=pJ' M?C}Мrh in ^<La&`@'NiBc9 P ۘ@@Te|}r;Ġjͺdnh_^I&T+F?R!Δ.C?r`<{!1 |qzrn =w0hzFxp] h&c\)_tFCKl`ukZ9zR!iw`m9,9¶w^k799zxjc3K^\Vwϭ"5:npQ6t?wC{ρA[ݾz49ks`0tr ݞ2uC\t?熭 ':|>3eLZD\grܨ}SFϠqXwk=Nr:$K}z1e8hGc@\x*\Cl5;Ak}9? ?G:A+4ekf {@#m ӿ$|~t^D;*+~h\Z jJ_V=/:zQxK>7,opg5 o]I#O@}.|78n{HqN{i].-\x S5N-3/BOyul?0]#{ԂfT':-nK8^R~fM$i[Hik/b=3K.-|ƾn/hۊ% ēp l-M1VoZEiif(5\5Zb>XОi0Ɂ~ _ ox{h5|P,ZNHZ h\lIO hN{%SM$,a'{#hE/Ϝ W6p1_{[I}чg`9 +AJyd; >Ҭ< 8{9A9>dJf'70ސ ^q/=mg5~[yA?ov~GUŗ]#ץn<8:7>^|%6F-}t]Ʈ97p X^ 9%Ounj FF[`jdx ;wxBƑju:?}W7>DZ toΌ%ƺ($?C0k_HCeuЯ|0 n #~ 0dN V!SoW^+HFkuwz7)t=Q Ov!l5B I۹Ϡ g9;wWJ ܽzV3|ދa{h#خe34봆mнM6z-P.8-_ƛv~:ZX߸v^dET`+2kKزGV(+ 3~0p|z) ?%dhp ۯ0,K٣2 Tց 0xiP#olQrq^na$~3[u0\0{-loC 1O$lmIe^m kY.%嬨>r2s0,RcygP=%V`[-JۺRs`u檮wcj-p7b l 4!*k缵]mn)_΀E/ aiz<2c{7ܛ?.]EHF0r9o"9[HR 1"/#Sץ e"`x ͱKj`|\A1 oW*qn% ,s`\ҹi!c I/w WGuywSGvws6EMN[6ʇk}N#= &9y\8Z&y xy8~3W[f~svߘw&~8:lchp.=zPp^G6M!8^m,tJZP,]N]W.U G_ik_ۖYOb\HE-fde뻇N\N{dd^ 5;C&͎;wKC \bw#qYxxͨ4w=~1>l_{qiG$Y]w4-E)m]::=uh ?3>i7N;@s\ 3cMbai}kV&}诲͎~JSF 'OHY@Z0;h=)1 ϟ=T#lF>cիvŷA߽p5 /؝K.%LA Y~TXuž<;.0Pm Ft8y8QMl~fGӪM~;} sHN8Li9@X{'|G))Gs}pjR[l_;|-hh6y4|}6֎$wБX_p~QSͼZ*EQVj3r-[~|z6BM +ހ!=C3fzvF,_dP_{W׊`(׹/*Lk"?0<& ZI0\2cu8{J3ޫU#YUoax-P+*9͛Sa*u5r`bg `oW}Kv)V߃ˍk~ؤ^ *#`o({S9k2raϢtssTex :$/O^B]d_re[q h$-f\םv)GaGVAoB%ln{mdj{76mdgۦo~Lq:EY-NgAh#|ovj__dZBw:1zӇdׁ>W, |?R 2a{/{`rG4|~m櫂mlm3_ c?c`S0l44 akclI. _+ų`{s ֜t؞g&k8g8VTOhK|jW|'nC˕Jy]gk64OJ@cPӈ7XI RM9|ep2\M"&#ZO<:{Ji@rgk$s% ͦICFUaN"nC W\60 sH3: v`4ݖ6F{XxTZ{ Ԇk(P^ԻO$%zUAǡAk#f_14=UChoPl9ްԏ-՝@=pvQw:*P^Ӯ6$KSLwo P-+~J͞/ڏZم˚jW j(S*LT UJ S)GE}n 5`Pm6d|-T<+Cmg𠳃L,iGs* `u<|Lw%@iI RY=G6eec ||kԽ:y=1:-GY髼V+ɚAPNn ::6Em31ZJkP븢&7։}w8 B o>QF"Ծ ZsNeC^ZRc4;$LN<:tYs-Ie t&i0ŒqQTnrwGH#_g{?s9(`dqo[V FSWZE2+ަEYՂ}1X\X~oť+eR<շ]" X[+3`Q3l,RSaQoZvT,K){*I'J=3nOP{yY2~I.Rc"o(ٸw)Ac}K([֞PM|(ߧt$W.eBPSPJs9Mi˥7} zoh}vt<δ IoȅLw)ŵ[$=z1Gn1)}||\^!]v]㠷.0T$I_:)&\Oc*<Cd-0A\QU@LqoH9As `$?9l=Zp@jʧ:[HEP؍09&dq if\ƙ Uw`lW^v)m6XWS `\]8>k&\m9r#!p&HwxԕCA;gH/YE:{ۖR"B:!䩀9^l_&%Uy\w. CE%Ƥ:)HngW[+a <vaךBUЍL2?nn=?RX', :5k3>:7@ݓ :M쳋:Y_P3Dhw#]ʕw ?œ0Ъ"Ka1 =yI=w2Hű0ؐ,<яƺ`mI0VJ!J*0y 6 <΃LxѺ#pP$7ӶFe:[9 wK䈚5 !~V0h6Yv.g6f֜-{;%PFY5KAQ/BPku͙5GLvdTxInGb!ތu[ao_|}(ٵyr.U&vo􋫽*^T[_kX_2wZ"d'Q3vzGMɎ?z{DB?jY87{y{?+!u =puOH;bH=S=~v &3.ʸYUCAIgfh^mS~Ȱ,o&JL2A%FrԱ5G9R\G/Sݞ7~^_i?*VjCyK\TRS}CP;JndMO 8>U=c!8U[bnjv"yB Q.j?낂ByИfVsje?A}Cηҟy#h{RUgezge={c hov Z-uX B@sC;ct gOɴ@4Z!an\2L%o3|[b \~ͯ#C&{:YkC [7D>'D^ Ŏ__J ߴ8AcViCxVCi!XrlI\8H~#س*-64w;iij_m=>RoecNi @%G@`Ck6"B`Ap_oJm]=u_!@rsshSN6 d>$vOD׾ o^^I!dt$=:q\Bᯇչqlbճw<]u) wAIǨψ^zZw6!k w>z2_ sܻOaarUԲC W/^_s6:̽䷿Q'/Ta}x{rXվ7}8|kD9sjϝڎ}Vwj9k>1~ )y*gΜ{#WﵘZ6uZ?mp ?]R;e]stC[wXӿӍq|HUojm[#mVog&1=e0eգˆ'Ϊǵ;_}֋␥< +#G[s_ypר؃Ү. \p~5C~ &F#̥h~+{/G?+;s78bJEs(_~ ~`1G9ϼ3dV۶lp`_~mg9Rwm#W#ڧN<"^G/F~ kN~4+hv?~?ņ8b'fC[όu-^l|O{ .q9.ҶJWX7: #BͱCtFՠ!?g=ؚ,3*ҳ=r;.CZ\>(}y62 \8bϛWN!KO?i'k߽Y|WhվP(ܦOQk:˜ow~g?M[%<0n_mU;|Z1͘QSֻ5Ak=ʡE|O RAuJyo3?ۮv~;d\ׂ,rګ~kϽ1?5V3ǔ\ C#90m+tl<[cF!,/VO paMYd.y*_( eÊ,]6g/VGKh&|:_ #?XNxTV~4^K#D[r<|_P^Xxɓ;.R!ܰksP厎l">wk;7 b'.Lm{~j- D)0W5V'^<_ }\喂ݹ[X=yxսfaӠ1:t2w1| S0ZAI^ӏ!u)`>u6?ov  \qxj)/G{h߹QUpU`r>&qseFIwWmkDT)Ծ^xozO>.kNAf![g/L߆ŧ3TXʚ+Z/,-foSy/mA=]<%& uMmߔy75uR?6Ot;HvQi1D (i]ЈpX.kU'_.P"8F!=w`RoN6,~!0X0s ]!o0hN veK|mt2;+)= Z;+N7 5"kCN)FYLlR"j.< >Q{N@CuL}ôh]q%OJV [DZs8a`lN6pƠp߬哘ћ<+V-Waݤ/ϵr2}X uk&{tJX>7wXF,#uC0M^QӇGܟ_%m)Pl uLmfHrʉt0h,ՙ|aYr~Ohk#nR'uP-NsIH`H6l"yŤ;˰T6LwRA\ (#>O x\^P:7RoHD1ڰ^\=10GeީfQ#=LQ9*XSxa.5va=Zc2}arFTu#L^x#0jV m0tm9 jg_(8HGP^YWTڞstV0>{*360|L(j]Q{3>Vڹ{~Ԟ:ŰW~;y`{z˃(g\'W{Kz 暓Zo6U@X%%7'hnK))*`{נ^t]}2,Ơ}p<&3f}l0<}Z0ww:0|7, 8A_0bjV| 0Ժ&cY a\k :~ YhǓcۦMUt*&#jie!|egKOB`u ~ǔ .*qޣ*;!rUy!bn_֮IȢ)vݞvDZkEXәk@_塛t"T.w W/A.j>yePGﬔ54zǰKܺ6;s1WDc~|6AE`I^_,6 xYfYOMZЮwym'Վ;+gzMC*3Ѷ?=NZkD~slYq4{J>V]rkvqg~G*;M5|NFtvYz94_UOkF+~|xcWrH_qLnOTseR6^xtm)'! Lw.+`̔,W-]n*XdqfNAU0c\s!f;_Gn즜XBwxTbMF6plt}BX@BB³ zļCK!۰|0!=}FHMF㇏Ϳ8hǖ9VcIJ:hRNp1Yh,}[Aa<+iO(}=)S+}ac}5Os@%I5 Փ;x:i,lw~}WolSjjnEfk$ +ZGaUbX^{lC퇵0;yX 'vt>JNSJb5u`YVY\ a٧a~?V=g婽vXC5lFiszaZԶVŜW9(j-37 '3P`N`!-({⢗<ߑ|ݽطK K<ļUtHBNV ʹSHZ#:dTFخШIE>ED-!Dg{!;5'Lw}Z M;=YAoul1mEvYocz::E9.] =G~CqÝgAPW]epŃ3/l>]1R\?/pb7|?EF;V|v;r3Ը!QxfaЊbX}#,_/(ESsbeҫ|m,[qk ԱQ3 7/b"%ԽU cY5RBsYM]" % I)i˄ -ӄԪ>8EBIt*YGPwG BCb&J0f G8A?IoHHh+z!.iuIP渀~5{;P#ڀCU0ͳ>{q]v /V^J> !Bg!7j@jYl׷$ zPש g^. 9*sB'NNLj4(Ns̾P uol+!f t\Ue5uq 5JWpʗZHTM T&TJNv_+A(M$Q ۶:r!RބD6B&bWB FSK+W.d(y;/\L Z+-}ɨhkjO<Bge(~4'_]լ$h}ub@Мsl͡I:J_nI,9_RNP-OxɌyz=xMgTEz% P{j{E;、^ţ!18sL(&>r@0P3*?WM({2&/Ps)_{۶TP0z@̻nO( D(? |E(0 nVb&o= ~b@8«T+&?fR.YƈzDcGBH:y=OWq>j%"u {1$>[~֞_txHY_=dŸl}Mk-ۿ69džA0b2(g7{{2 l\~w >^2"hK> ͵E懇DBIPU6N]-'* WtyrǩJQg*Br6:ZeT,%r{66QPJHEj%$45(:qPm!G`τrՎ%r(M_U0M|UaդA0ofM5ޅI1!/m~J'xf_sH7f8$FFmWs06X|+4Rn;#FZ2 ۿ|0@ePYm au$lIgS^~4_x46~e^ϏMǥW BueKH,lN\ ~' z~q#vV8t$)~UW -_-]@/; 3j?/V!X>Dc8Bh-ڕTO>_ g:_Nh-nVf,g*FZ$Szr O5=\ƺ=!` ]JJ5^Ћz>–+Aئ][s=l0z I.T[?㝢m(.4?,$˕,z$]볫4 yn 頩_y=e :q#J*1R~A;4 LS45|n~~\{e@1~cʴx_nSj۳ q;bk~#Bi`w. YdDh~|K(fUӯ%T&=CrM{BOM 4++;OhzEMOW{inh> 7Eo{@vvZ:@gi?aI~gfBZ?2\)$ ,H ژz\~{&I?Tҝ>>vW@(:[Dx}>fƣj;bE}{7 C|BA`HX(L騶!Tfv9"OY/U9 Gh9i*"h'e:κP~b/Z`(aGh寚bA'-Ӛ.]-$+=CSA;v,=[/43XvFk~p‚?06qlrqtv`QFzj=.lEqiOԜ𲣠P D^fNl\?tM`\ԗ25כ֑_6,w!iwK'뗽J3K|9޽ { V0E?#ytَ?4^a=P~PiW 'G p#'. ge!8[ٳql2jΚ|7Ӗ5y-}H@?1vd/.KP2OkDŽ9q|+( EƘHil\azKf_OZτ`Pخo5֝ fdy2,5 tIn. ԎBZjvUPnYAފ^6-g@մ:Ysqo!I:r(6|.N?Y+>xSPgNoLJI=.wM?/vڮ,UZE[ݻ~N켯Vm3VӄBAP8U/.Kw~"l1ᄼ՘~:!_-<Ӽ"uB6o߷=Ю9CH^xʧ >#d,7!d#y[L|xuM3s@)ZO,=>Xq#Gõ%u.4;%[Į Wc7w@=Ķl@ٚXs;\m1Š\y0M.&$[R7;Ͷz^/p'$!}H>X|{R~ƕ]!BTD$-*(9x2_{jlXHz!Z),'\]sfg%G`x[yg\5 ˩il| +xl>Eu"k 9L2ӧ}[5 AwBzX1~iCwfa3g7꩞Ս@yQi8'mTټ1oy:MʉJ?6 l&5Ơ<lN ]T͋q?r%v[j-X !ҕ"9`v5h-0iL'5 3iݩ] Rx 'E~-LUv2mOc^' { 򣊠ܧZXJ쭳5j rBtw[`UeC4 Wp,0ޟbWWZ2B^kxٷp~{S ;ɳ Vgp'*go2]X8p&XEAvpx ?udߙ^PүMޠΙ¢KGzersب̡q3Wƴc2mm\?9vZVB1Kϩdf.?~@`eE0U .fVx#G;I7Oo;v⃑5:\;~ecܣƵ"_O sՎ EL|TGeť:#`̋׫nʦ80Y@>Įܘ Y~ʬk`kϕ[T)v.͕+Ykak0N`!Gy{#}?9@`8Fzz§m+Za7,|wetrp4IGޥ05saaK|0vD&%a'[F;ۍvw]LN;lK[{CbNEĜ'7\u5K ('.p*`:%sIݑ za:ڰca}5۩k2U0,o`q< r*`SY^s]7̵/swW ]0{W4X"&L©382YcE%zVDZX(=x*V}3]ѽ|^9s3,MT u!6;3XJx/p%JK'2swJ%)7uM қ9CbG ,τ7  MOuRpP _e$0 A<5PmmeZ[y0)y^7j:B(gb+MY h1խW#7z%gnRFz>OoNU cYu=x .״`qQ0?p,27z"L +: ҂v=",l_Ke/-$^4 7*|wź-a`T-BV3ae }v,SeXpoSSOu^{,cvSXmrIŤQ[3J 32ms*X|aǴ`$gd8_TW:EAi4VLEn&{OX,v 0VCilOK$ ?nQM`uhpq1H7i>/ބdݎ#Dw9r9=ֳDEIb+'\E|9P^_gONmP$k}k0P:8TeNb1E{ _я6Pt$- b͍aCC|Lnʃ|t(?LJn ]`d32am%nuV?[= -wYj2lņ$IC&f5Rs¼Ű~_0w/(e؇Ӄ:幊=)ugQ;U u`N1چmTʨ`>ǚtN yԟ[7֝N⻺l6؍$P/ۅFFۆP]Hx~+&yߟ~rZRi =Tl̢d͹o]a Jûz (~G*(ƦsUSZ3C[@UT<T6h]X?W!&NG_%.tSqP-#znL5j^PI]+ ,Y-tՅ`| AlC=89)'kQ?op{B_r Es&y"#O[M/'}s}"8[39 .JC^"ll'^5~vn;LÍM `esm xsŠh~=kRavFG%VVun ڲB{RlxMrLrO9`9^`R@/3<-IzJ( ڒz V/pt-Rv _lHǎǙAee&N-Y9-OY`k&TZp:F.LtY $Dž0'!-}b.E]|ŐL;ˬOtFM4M {c6ȚCt!jz7ӞB$zo_6$ܦV>RNENƚ>\q2Ikou,_V)O#b6Io:b (pbV!R▮ Hz2[cG> Z 2=!Km},;[,aFRN_eYA]\v`g נ7$vNq&/PN]Qr I}XV]hk52\g hg=vµ "PI7k"?.?) {s8ƾ`CWߧvsg>MDP0YZI>Ž4|r`f5L/^yQ;Cu<˻QefZG9>ELԑ$)rz؝Rp3?Dy,k:)'= ^+ڿRot\F1{\A_ ^ ̰.{P9\e:xOD5,VJڛlKQ73@u=5!y_Z4c_yi[9oq.)w2UL @{t+)@t3"t)Ǡ B]N|t>CН<ꜷuA]^ ə86Iޑ+} ٽcLu@UK/{DUx:8?+;+oGy!24xxow ^KwB]xZ"]dA58rRK9uU:a${Wʟ~&W& ]x >߀/@7KOK$p8vBeþujG(#&{R$A_tiBsA/tS 9zN$hʟZh⠩8~J4_={U]Г~1q'oMb+K=tZnKfs<]*"4$o-y"EY_8-kQXF!ߞN;/&e˾^g{W@-mpJqgN~ppd2@_y|Gs~I\`Ϋ~NZ~z*(խA?j "fN_@WK;YRZ͏A:8$i^Uޑx̯t#-zYU,to~{ES (`~ѽ{ZcP,I3ϩ\mtXՠMRFHO0e HK= qNԎ'ʥ~ςӽO{KI2>%4݅<4,kyϯ;VNuG+a})[*h;mDQd轹]->:/#u_#7 F}\+hUlvfM4E-$}2,S|nk]1N>ڭ(t}İz5ňv.eEp*k!ؙ0RΕ// +y̯ %8ǯ|!8>O  㧌 =Y{t{VKZ=lUt=J݀hdm.ޏ'?ѵ%9Q mOVQxsg vO@Nn7PNp=IQavVzxaQLl7[x[<OĮU} ڻs.ǴaamwY~SCƾ~0ec<7 G۵E ~m `yM64X31v|Zן\V}ݱwUschj}g8Akif'è_6ex~t~A-{'_yḽ}La;GZ2Ѡm]z]\?Ds4/WTpL,]IWk Na^}~7 D[E$) H~ܲݱR6 dCی*il7to vbj{NvD)JکKQ\MsY;ɑK&6:}IiU+ I87<g6uR&nw~_FYnL  2_i5?S=ge}v/Cː˃KaP<LZ L5bkcuVDX.N1|o&%yJ$0YÖwF~ZJ<4o'}}ZA?gҴo*; :c[2tzwM렗 le6tˇbAOb~9K朶1__sڥſ][JiD ʁ#+iLˏCaj0'èt" çbj#`\wz$OdT'm|s"b#bN~(s)C`i&Q3MgԔPň2NU]!U֊C!̡z~k>=1ThCU"gEl] 0-%9OalE[#~A΅> FIA|7JfZnVbw@:oߵrJ}SoA0VW?x1|Gq; We6juX3.^wדo 'oum'/շf\0G>8{.w^OF&Gƞt}G֝_ $C=<ٯ=lh@'4Z估>Zgw{YzqU^=Ik?}#Y5O~Z>_LarƝus;yvG޼m8VЁmǞ1↳(ir+Ηg%ņ×IIm}*JE>RҦ3cԐ %qh6%w]P}}ya_ף%mJ|m(ڷ_ JVf'CMo+#ma ~OG綜vţlCk)tWM]aj]} 5%7p?5)؟sk{-\Iϟ~4r]xetkZ|Nm}0r]WN7,Jn>R)?mUw5cSkim{+3;4\}黝([.~3ŷUtşٻQzY}v庎ΥZ/~V7oє>yܿۯSܱ'{O*8aI޼hߋ)ā˾>UƐ{(mlLg_CGjx<-θ=^FN8jxhvQNSz?ķE Gtݶ{а^K ⭮ԠK<>P]=wI Zrw?[]COw6\l^r \;q$rQS~FC3WO?uZu7Z-I:ӓ&?q=O˖HlC1})Ɩ4죳VQwrSLNuGb6J>7NgfqJ:sߢ[];5Q9絧> [b|.<$bz u^wOK>濕o =sV{r_zC-F?g|ŋO[C-|?njѶF^E~Ƽg+m}yvk 5_v|N;~J65rFR_~aPg⯆IIk3P DnO=_?)#OZy۵Q驿5et뢕 }K8{Sx2Ltٞq] O6\Ё"(qH?~\?3YouҢKVSdI'qhzSdEȐ~Z|2E䖼o:"9!M(mxS5 _|KԯӚ\QFhĉG;g:#rc'z<{=zQQ"~Q3\Enч}Wchc[(IKvA?vRw]8 :iqs?M&lJwi(3"z5].z۰l_k߶u{ouSR+s55{bP/?ye)cEEv][eny#1=~2=vuԟp_t?_@/=x޹r|sעG}@os0h@߯>qOCOЋNm.={g=7P_1ǨW0eSfCFĺ ^ ;1imŔjϗe)۰O(}ܲ!e['(㯩uRf1PfN_P?٫iݔy-7=2 ^W>@=uc[; lL#SK_^)W?^M)+ǖ6ߝAYyI7o:)XُGN=s&'nƯnmAT5\|sZ&ctfWKo=XsѴg;ԸCq=n9Б-v*87yB=?֏#?^W9yuy_)e.2/uf>'Ί9O؄1y~گNHOyև 1^ˏ!I=d[%-Kہ~[uuᯢ.o lsvt$[~MµSHOtu+fgıۓOuͼ;궡:W6sktcWmTnx˙6aVO5>Iij_yMu+);EQv۞ce᎑ʞ7Pf K_7[m?jLnkZL᷎ly=陧?ze7_vuɔ=7uePvⲭwSĴw7?Dٓ*j eOY۩I#j:Q/ a،jsBm7ׯHl ᩵Q Qۉo>Զz&SRھpޭ~sֶGm>|j|lGGƵK8એoOgtF8FR|ORN.h_)G_G4)xOӾ'em)wQk9e7щ֤z妔紷[]MY \ʚZ)kcQ֭}l;ZYZ*eP'~l?Au[ͤ.xiBzPM4S{Bj٬tvz۳\muǥwS,*Ro,9RfS1Z<]Cߴy'>Բ=H"vPӾOeR9)7mϾtS;Z_~9?tz9?1kw]->>vn/a .Lq]'2[?fk@8tʺ~=]iś)ʽW>g\̜FYq;M>f'KY7w߈(+3Oߛܓ^#GYcl_JYwyie>xnκqGbѾ/QFw*c5ZڍO9B~nw$qBFm].yJg.LnԿI&5g\JC:R7S>s=v>KgڶP~!!ae!JZz?cc6=?d=8)to}iTHf՚ѻn}xG>']s[Κ;gtmey)̹?^q2.OFZ?e;7#VmeYnhGvؠw"/ߌ=αi͗u_s;5{Yww۱nVwo}wu\ř[ܭYugÛ<+?'}ݏ,l 9 ܭ>`!uZ{mWJ'^1r'"%~*r*t/\i߆-9>tkd\GEo; [|r{r_+wK綑ryKĥ ˯G->B\rxޛM f;J9WG));sYczd9w.CxΈ{?#l)wo:;C>'zOuKuzqﴖSF<[m3:1\}y>I_[Pi>(S؟ԧQci?So{:]>z&Rkz];gs^Opa]s]8]kz-oosS_-s7ܵ_{ݵgK(#aMpN+,e zWNV3RFϏ~?_8{&(c[2\j?Gv~=ʵ>ke͊}ݞx Qlޞ~ǔ}=>cSEQ/w}s:}Cak[FQ߅ÿ=zYaWQ{/K~hO+;z.]!#FۜbwO^|~67Dڹ[_zkܭ?O6ۮfBw?I6=woPtff^s^07tcU;۴mc/0ݦ&7o?ˏ(#|3j22/s&ʘT@x^Y2pr]3ݭ7sU=ݗ vuL+֙Ur`sһoM(9.4M似VmS"%Wy[ /"z](uS=I|\B&.8]YB]-]Emz#.QXFJ)/m[>|"u '~2}mK}߈<&q?zsئev׿~Iw{fy]7-w_s1}^M]ַ]?wF$ᛇ{NyoM _7×zq oMwx 9w93'BQ% _NmL};94pe9OI9<2zn > /{d= w߿|mxh=d9rʃd{Hkٖd5C 5("ֹۣ{ٶy;srt7O)cz]:ʸoz}G^FQƘl?ڎ2&\2`A799EW+?~Oߝ|u|:2MڔqѶg̥ ۃoeF}L7 E+SwE{CPdؾ> W?"ht哋)rˎDۦNqNS䅍^q×{7v7)%!˞yY"96hŝ?- |hFwCoAo p:cV?}rV3p'z~W]*sw!Se[>#}#ݭ=3ݭ _UCm9k[|Q-79+t2ǎu)}wO19츴l{A~}wu$9s|oM"g.l# +x˦խYVHo$oE*}qWSPtL;^uKߑOQtͣgQt䔩AѭY, EgN~+)Nڜkץ%ʞa=™[?K!E76NQ/k(e2glw^w?v.uvt^[0wer6d(`F -v{úƋ Js%j|ѬCO̯L7\jI&}4ݾ]$ךnc"_G'Cjsr-|~:F8wM )@-k *|ukɕr읨!אW^~/ѳi{( %,fª'N1ޟT$twIS'S|?;O1;)})t~}ISԏ{?f"iXuy-Xm)_zW;&O1m;;Onc4 `/9smOxhy{_XIE;GA3b{=}d'<|Yʰ S S(]΢- |%޸} )W&3͇a&Ia?I{w؂5k皻#}'_N+nz;zWRaW$yX 9ӕ{tLrn}g#yՃxg~EJ:Jr2^É#Z)=Q[;s59G ]۽ģMKr/WcEW\Gc3)~Cȶ?AWp}t1S)5=4q|#(CN|_7X!_wyW_]Ao9UKP )mjNZ8uń{z|eY)%.wK;e[i\HnH*p7;\rF[FҶ;\~ח^"sovw/ߵx\m?6u[X㑗o0[r'#^Lmy;{wu8ǣO/hⱞqzicvr]8!7|kpS}SX9fse%S~(1(1v:H ^}0ņ?uEӣ_}ރW?r(q™~>=n-)S(Iߴ^3w6:|NJܶBJQ]s];t+ݢVH; nu: }vi~q},vx펎t\0M-[g{ъua_~mU+7n{ϞH흯>;1ew~VǕ;D=ߚ>N$_k=j͟RFDC_E>h]\_{PfdC''G[?Ioz?fZJr}٧+ɝ'';(+"~ۇƝH(Ց2gQ=cB(w7^rk'ܞi0s~a%|p;)yegO[=xmJ2ANu5tY&w?:n|civѤ~Ǻm>g셣וƹRMru"Nk=ͦ#mм%xf2=]~CwޱΔC't=>{rt{Q|Р?OY_^ݎ\^Z5zKk"WMon㑧/gGnggZw$׶}%r6#WII[} .fM] u!qɿܱrD08cѰG86-}۹=(a\R{O`yc|^DgucYѥhr9wۿwu3==u8w(lP_m'/zVwGImW\<`|c3pwm{u {1w}%76YwsZ]"e+wlxֳ}7C2E&{K>7oi>rh^I>hvzJ=y-NǛ$ѯ^-EWRMGx䊐)z6ԭ\+nHCOZgY,!!tEx\0~(zƤ SmƩ/.9^ˍ:{뼥Qޯ'~]9qx/PSy j`$)BY3Kl2s:k5$`ԛx1y,g_0of&!!\|L篲7UjKՄ7U9ՄTj» j[V!,>?R1.7.ތ`VA7bx3/Uoͫެ`[TAwNfګ %;(VoQ19]Awo߲ G*wp]\= o]Z1CoX TAէy[$ޢQC4$9B=|(q/81<[$%"ޖxB;[*mcqs|0to aim]&s.v b"I#K z/;o#K bP[&G2#'‹ҥCuyt%E"(i]:zt[t}xÁD# ץvR=Fb=b{2-#"d +<*R<0X/Oh*|}#uy\)pޥa" '<=?xExO|dxXqH=?UIUyb)RӀU4~T5^v-ͫXZ^iVR ^rL_JL|}'Ft4{EGD |}'F9b94q7QOĈb>Kr<H*9bt~J|';x2ebSǣt`~~ŴxDxO(X;,o)8_!b=y;w~?Mb={(uS~ WpK"]!r2>yO,lh`8x(T;Gix?D,l5e8ܿqO,'l%q@R+".'Fx8 r>UKo Eb9_")>aXǁ`gp9_-Wa>8 2xy *+W[SQ2_`o?]Tr|}p?)P# p#"ܡd e->RqѾ rr<op 8Uo!vCX"e2bTO/# wx?x,S~2n!u<в"0xƇ| r9~Z6G;G-?G>Vux_[ѧxgݠ+7 -#U'UCpHoU97:xohYwT[B!v~C )2C`2wTOԛPw3n8 uYW;G-?!(7:x,+2ep\,=L׾>Ru<"LCr9ރ7CD#SK t[r:0}Lxs 2G[wWۍb9^g-v*o_Lۈxs <\;Gp03stTP~b)ޑtX?ǙND|~Md|/r?;;-/MD}W1b9^~MBr?;;-#U-w3l:d8ٗpGHUy 휄wWyb9^g;Rh*o_L?GxwpGHD&;+"C}[;G[7g8M,lg_W;G[$BqX!㪝}ywTo2l\"ujg_~D;G'5)+bCU;*o_|x?WpHUy 흌wW%b9^vn]>U-kr"g6CU;pX:d|yeX*ujg_SUA L?:\#Uk2~!ݸC,qNH{T{|>΍quqӭ#=8OF@:%xUixT 0=|\Pګ=Gy$kF]y;vqaNRJ]o z 8vi^>18b '>10ޢsקf7 Ĵx/Vo"ӥL;˩7URC,s *>T>5 xF~eJDTo*ʳXrr0/B)qZw]60/bT_`\xRkq,+p9_?MEDx[Q&O)qzLOܯM ~~jϭ8"|}7 LOܯMb?xg?5.fx!b>UO ^]68?wq4gz~m 8?w1+)qVw]68?wq4_yg?5.&޴RkS؏"G7OToR'&]?xg?5..r>e|<צLdr>Uaw'צ<O;..r>UOG}'צb?xf?5..r>ULOܯMEb?xf?5.|}tJOܯM~~j]CTæ~?)M/FJ:TIq=~y ^1_zZ1*} "c+=~§2 >L=xŧ,'UTUhR,wn?E3,F>|}fb#|G>??Jxx*g Y*|}gw<<~,'q#ۈp9_z)g2&S⚜,r>UR@3xߴ変7#{p9_z)g Uo?E3,r>UR@:y<7q"E>??8FTGD v~U@>??DOyLi/;9ř"\ק<}&gx*g Y'|}x\gwMe$`dH.SU/L ?8 Hק^HU}\,&|}xTg r>URD3x/A%"\ק<|LO<%uQ}^V\,|}# %WKEOy㽤1.Su~>gx/ 2|G>?x|^CR.R忒64C5 &ݪ/*'Kj[TMxO ^͞U#>$SY)%OU{G}H[GT9~b*\ק= #>rE ;- Ӕ0S8O+Lp>8" EK}6DIg!(£p/VR m~|]t?'U~󃕡Z\+Ôt҉8RrQ"%$SJS՞Erz"%4ab>UYEzn-^~~L)3NU{V1e:ܾ%e=owjqڳJo4(7Z.f,7v UD7Z#J)cޱhxsPxrVN-2NH7/s8F+y\|]0_Э*GݕW߅).($==O2C|}xTw3`J.&S~W+c=oH;0E>UJzNJr){}4.WxT2Ig~1\ק xWkx/<9΄F+u|}Iˀ} %X8T>~.Ӓ9"<9΄F+KDOU;)we-Y cLor:L?%KDx,q Vp9_XL?%Dx,q V-|}c1;2X>8!|}IK爵5"<Vr>UnŻ'RgPF+"\ק xx/Y/c=oU.SuC駤Dr{h^.SuÔt.Oɕ"UxL?%"<[8F+p9_Ex,pVr>Up72-co*DTˀQ7l7Z@TGs3~7Z*|}c+O#"<8󰪍:%x\]"<8x201_XS(FVr>UxnW(Fp.SUG?p?E PCp9_z) |SN8xoOU x Kd|}c;2r?T0+O{b;Yn!b>UtdN?G=ק<a<~J>کTb]=OIN /ԍ|}ꇥb=U@~B;5/q>UC/ƃN / *\ק~XË`N / *\קlg_u:rf];Yn`J~OU\;7%|}7w/."<vUn.SU?,^^͍Ex,7Ϋ^r>U1xp~6Xn` ۝Wr>U1LI;2ln)c/l]_TG^gs 쏀Vr>UxGv.Su7 `;#"\ק~X Mr7gs/ l'g;.SU?,^G+vu.Suys9\r:TT0&gsBA CtxtxPNga<.Svin.|~g)f녀-nH;ga".S΂xc?3VT?CE|'o>_A؟R.S<~ɛY^c?3Vp9_q~ ,p9_q>xۼDA؟Z~o^&~ ߯[T?o.~~US$S<Ο#c>ys>znGя͗ P˱dUEOu>Û U7VjC|^c>DhOb^/1|)< ~r47 p|>ae|p4*kTӗ o94R_K_~|SOYSؚx>o *^5QӚP; ~)Ӛ6 )+sMi~5EB?U=jӆ/)Vs~zfae(Wd^NR-zu¥51B?|>%b?YoO~x\d=jwc d|}#zw~5y"\קo['Q)|}pn֣6)r>U ~\l4.SuO֣62dk^OyGmZ>'[DTG/ z c?noOy0Gm>,~pdk.r>U ~-~5%"\ק<}!d=j1;[dkp9_yb?n>.~x ﱟl.SuH'3dkr>U d~%D'[vTG/,pK]w]e..SuD'- tTT\ƺ(=aLק|)[2wNP(kGp9_rRYoܒ#3},@=-r>U'xwYoܒ'wi"\ק*[zBce.S~w-#w? ]"|}o^1ߙ>؎ ? -r>U'xYoR$tzKEOU!"|LU:A=Qh-#1_3xCE7n&tzm"\ק*o-*[$RI[nNnK_9J? fO[*}(vJn#g9y2]OԃֺEOU "|*}(U.S~ʀDr5J'? |}-᳜R]c?"\קO;D,'oY/3}(k?eb>U'x"|Lle?"\ק*^>[ߙ>~~܏1_e"|lߙ>~~EOU!>[4?"ʱ(BDOUA{p=c9yKWc?ʺ"\ק*ޒP[nۣ e'1_3xD|,'o[lJ'~umDOUA?滁wNP(Eb>UXB">p;tzGYKTcI-Q؏.\TcI-tzGY#|}d-OQ؏DOUA?XNNP(2EO܏%%">(Gc?ʺ<.S~Џ%">*Gc?ʺ"\ק^~,!cyu=LP(DOUA?E|,n+GY7MTc >W'GY7GTcI-0}](떈p9_~,9"cyu'b{>خ~u"\ק*KCD|,nq@{T:A5_wJ?P˫[ۣ ꭁ<둘OUA? Tb=*ޚ#M4$n퐐z{CzV^{ |=W7ayC&ELj7N}͜~-wQZn3_-~?iȉ{;wnW'yN Ϛ)]:od۔KYǕ ?&!!T?r-/"\#vZ{NӮUw=7/O)zٝ &z^W /zjڛCW_E-snwfbsC˫ ^g|$< ƛ~$Y}Ro j<3O9=MsCnJP!~EBia_@JϮ]j(Ϲ=z)ě58ɅD?぀%̯,}Py[Gi/߱׋sVHޠ 9~ oAFP~ .C j?>Xx[PtI]Ul~ j`p`+/ #B/ >\W[G}c :oPsG3qVg*t]N6躓aNgoкb)s)(!h9@tBFq _+O>P-'SzEGR?X=W)qI9 Z+ͺӐ' 989 4@)\J/EO?{r|(!4}SRIJ_Q?e=QqΓt@N\տBCQ<Ae__vƃ"z (%VOPqh_hW]uRBO X="+tMʾBO**i5ʼLU3Z>|8=lMO;dGzz=y ?VҎH 2]# c/)zPzNߓzSJoERJz(e\/2X/6)>DI0_>l6 jü*Vv0 ?xU@^ |;b0Ng_s+z 8GPi?;o';3(թ͘we o/ ~v/s t24 &NQaB(WR&c]w}#/#,WP?k=) s) ~(%CR? >)DyOD{Ÿu1<0rC2v23 _%b}: '|uN[:G@ne폃}/s<Ƃ~vK3gYh'%@>K@Y.TŎD _*|9?>+ؗz@by:@دⱿP=QړN쓮v;Gf ľ $/HcbawAt6tzb iSJ =3ӾQ;t\ jmhoXA.s `\S ʏ`lWVb6'|IWOtoؠ"{Uo7죪 ,#tOzvTHHK]OAN:Ǿa^;Ar,_B$pX/)))"v< cnF72 o۠ t8@^J}"@,3WqϥN:Omxly} /%>x}# H}+V rql'eTq . VƁlO)l`{ fN ;3AKjf^;PTc \|@*̅}6:!bDO]rAey8QCӭ7C+3OCeeJ9_'*Qmy|E/ 4??-^ԟD.ϴ43(k@iݔP /4zU߆79mCu=xd/~ ;=S觧m n?K[ wI?s  qT`7+ʆ =&_!M Sv 8n3/'Cn)$xb݇)q^q7 qc䂾 ;VVq<\пTi_&A`L8ۖҰ_;/|tba`l. (u \)S?)+W:awN-Rc rFGPțXi3%AMb-;kЯhC (#fò ;G 7} rX 7t X_ѐ ?y/ ] z! YtJxŲ\y;r bq#}wu_Ă^ G8{ =IWE!O9 Kiw8ơ ۣ~Kxg3 oǃ.lX,`]IJ>4t|%~\ևp!7F?ڰN0?vzuO t=Aoo{$>/96btov$X^eG>>@{cq}Ĭu8FH蕱( }ov`7brx+/4ޘЩ(Uj%<_=~;T.G o1Lc?:赔~,j< 7q|@;uYۃS/:8>!*Kwba Qoc"!r\T4 ~oҞؿzbr<x$p؋/r?GïB,7|b|\c>n8F1N(D=yF?X.( %@lg4ڑr{?O]E` qL$@ψ83_ t֧ 2dַ@OvX}7 ?BǾ 󼞸>v {}|,Cc 5ƟY'(HvWb J]x F;>r8%An:V OX/>JFaHEb?I_(x߶O+uO=p_ΕSf}%z9cZq$dzb&b}%'Sab~:qJ>MXW"0nKw lPODn$B3ݭ;Xqdɼ!>Sb+@oz&q{D^g ~z3ޗ l:q^P9tzc+Og#!P[8+~HQԣX_Y^X_rơ'Ɲ.4^'փQ;Ƶ=xg[ȇ3?QI<G xzH1_6S?a]t±zg'!7t@я~WH^wدz`3Y~Ł~rX<_uE;x쏈87{lhoN<;Oaz3r?7a @طYX3ҘǾX_'`|?&bF{ͱ>`:q9[o3yhchG|. SpC?uJz17 iי?`~Ͼh 1bٱ;A3sK16>:e=6̆|'Éw{b`{ޱ>b;88 S9beO/1N7UXo o.O~>x&D@+'n1.o+؃cN$(> x\X_y6_^1օGjW Cf;J``qy*GVv*Ǜ\1O |__{'}Qg;"a( 5)7bW\ )ؿ Ź P2د쇽 rI ,'tc~JJ} b_?|NO0΄}0m؏F](rIA߯0^y<,%A#]qΗjLbgk,< +>v81^.h 9<hc|> ~lȉ)s(@ Y|Ͽgoo?9,Z;A. 1'E" G`T!bU}Ƚ zRڀon}'x8Ro~ |itaxWghO# E`?3OgOcr`{܎+`y? <O5gFc9>p7E3ݰ}ma<~#د c^4/ ԝy+#1*. jl 0^luO^4)Yc}ޘ7^SCNǾ=+O7n,=.q1ЯWd=x!c|bl7qqvDd >'HVƷg1 d?.: e{X8ƃϓE"@/O$3ĺ|_%|*ǭp\ f;ǫģ^*;qVV,ؑh唅q_g3f^"v)%~TsY_lI}dBL$؝߱Cgz+/|WeqHϕ=M6 1 `^z?yfQWYaos;*;eR>1ރbyˆ] t zFq0`_S{rǺt৐h\$廳bb8NvJ~Q _qˉAqb?'] h/R DIw]?1?N~TW7*-v.]q1OW%`R1|n(ww\à_ر9tW/Yȹ渊DO)!:c9nHX7ou6s|_W<}W`]ĸ8PrlG!G{8ZnxFSU9Uh_gqO4eA~rA*y,ׁN" ׳ݍϙ)GN#urv$qOe -oK_=Yx0A.c}W:៶a9'ta+80.lGsYg#{8 pz^t?3rS?7 y6?[a{g?f:8H['w ۽c@yhrǗ;Ƿ3ߋ|tGXcmݳ:~2̧8~jJRNG(G.??f&^WؗXOt u nHc>7RK$}c=gC5N>|p,++?sI>יv'b+ gc _Db_d=?`}:{MbPsNLw̗aȂ$/Ac.g Aa@ R;'XCaIoG Mwcӡǧþ?>ԏp:VH^^N_Y%uMy0tUug*ŏ0^WYCs_*h\6( 4 0W.I؎_d oNNW];嵃Cg}=zj_Y4Rȝ^i|r..FR!dc}%'yl0[6g#x齁~AɺNWƛЙl9Y1O|>" r|.з6_obI)U`R˧(vHʄܐDĻQV߯~ @JݔXȹj=j[K>X/|51?ޜqd Lpyg' zP<4sGm A8'c;šKfCLS8\gþ:H3R)S0ߝ^_}2?~p.9O'lRCiz•qJ*t@?#Efo.(FE{2~4^C{t'I=;Be?4!')rFޣJ9'/%]#/ic1 !wq|qχuQ_){h>4|e}D{#ÎhS{c91/a~ Ruy&3*P?Iĩ񬕶X=xSʅ'R_ع2{݉-A?|yL8~Mro*O?)#Oo1. w|L 4ȓЗ.!E?rBJ8w<0ǔ{y~'q5C2Y}0"C h^G!J;9^H^a3xq/K`?{/ҎAN89% G>ҟXgѰ&QFb|`{Nw`wgf]6sߊXܿ7Va~cb 867_눞;ժ2Ay# !>?-ߏ | i4C`ϿG 8U?~=&Lǩ؏~gF\೟*ohOCIUǀp!z=o`ñ^دba?cƿגqyoF}sC>H'X'b?$`^8z쇃@/|%WIc9`+7'q 㓉a;c>Ł#/W|Qa9;)1O>WޯB X׼.SC~AQ#yd~"m_GA߯* TO-M>>ߗ:O߯dⱯyb'}z #yK@oDb<DAbw >8~ﭵ^pr<9Kb]_TqNÖ! !ѿES d49އ7Y0^C?yO |ow"?xPcoQXo93%9ϟ Q+Fx]Yj=w&>{.9a#/O,,;`##~pbP$C@=q 쾸Wg#1#oo{(6@];r!~ψV(+*K8kԓa\vLj!"/AvɰEqQ,BMx:Dnjnܻ0w8.:2btvԳ_qn8,ei*gt?qB/1G_9~NB_x5yA^}o?G^/wP8x|0 `/~TU \>Q |&>~VgЎa N3ϹrO~P!}APC{AhG*LެA9 O=H|~Ά|s;ߑJ{V4s{q-pKԆ}?dw8o,kPSqV)gK/C;a^B^CJ9@'%v=Ǐe=q/{\;u] ]?^L?,(~xPDqqw:>+[#Ŀ/5۰NA|oW'(sav>. ٝ㐡?no#A|/~AXdd:s /Al>y|9ou0)X7/t Ƽr\l2l'F=;iyla^} 뗠3a~9n8 *ˆ+ YCq6|ŀ-7-SaL =U\=9:b:C;*U=sy9tϼsVLoѮ,#lpݹu \QF̂}~zB'cWӠ(r^pE:QFp^S*Ur`Mkz4::FK?V^CO`݇|WxBNpa; 9=JiЗ(Lw'kF ݟ^i"2^yW z[f>jʅQ_L}w跦4S9CzYt/)l'B6YlGP255N;=0q2u!||vT|K=2r_"QOK>=_*}e r;%2!wر,?П`sx媟 ν;St ^~Bw <r֯9r*c|Ҡw+G[`ެ{ ׃gø:t~b`p$!9?z@۰<*e|3# |}!s|@#{R eO@y`y(73 4Shh3^qR)?J)pw[B|e } x o^~^syQSI*M5稅_}=z,k}-<=kXcjEJ Q?B+ 5GZq@G2ޡnϺ,m$x?oe|ǔX~[}ͅ}l2 !4uy l, χS$ǰخB!od`J\iob=go4U;5 8Ÿ ~>+ \zW[xqh>~߶X?}nb^ñr[@_f?1R@g|ۭ:vs!8!Џ8! w8^95LǿgĿSȿi9ppϿ˿g;|΄ўsp;ٞv.ؙؾ"NЏރuqkmrYm'WcJ}+qo8 _c{ nF?e¾vToCg/9Nc{&ߧ;?>0f{o|u#?ο~ "Coz4 |}]&_5N iyE 3_8?zq^r_F_P,Ζ=<z.8)D泟Z594/Ygb=AN`quu1DSjt̷/΄3grD?~Jޮ>wJ el?E`˚|r3c@.I^E@c?Iʻ+g؟Ӱr<~C|RlqC{q!;Kφɿ0VǞݢdK|o|" Ўܽz_c=p\,87a=4|"bJd쿜a}b_b<j_Wx|'k8}/,%x>o˿wQ{5U*c?V9]\~ 9#| Iy{8n ǣ}꽦Cj<J`y! {b'>ȿ:ՈǺ 3G^9.4z} Q׉qca8_,8p1ղ_4VeXX_|?evعT}GR.s]wA XȥG% :Lx^=>җb /_8h*]786trr!~,Pen!s0ȹ|Ny1]/7sTE)h?~絺`|oGF;ɬg x4Гz&'@_!OWDs 7}r- `q}|PquahN> Я|# >8K'~*^8'Iط"?sɠ7>_t7WȅlHM  ĿQ 7O;Q ! AO0ѠG_ b~\1{(]s> O>̷9˅}=Ea"XcKP?63yQop<>)sOA t7 Q?/ 2 9;v]G#^*}/9Ͻ~g>*=OC8{b}Ls\O~>G98'^W###x@=;zn}8wa|~1T{O<=m2I$->'! +;Ɵy8>^ >=,c/5_ Db8.؞=i]lGJ=bxc| "\ ƃA8=3yu>¿_q$%]=C&34땠CcxT|~?lx|o{;hy8ݘ)I~>_ za|`/#0~lWR,qsQp >>=֣{@??zyLSw߫Ͽ:|ſC"1}{ Ks\Ұ^w.}qce sXb>P_5.~yy} 9S/`e8%A󭬏q¼s@|*1}GaŲt7}uƸdz9Iq< I8D逸bou^g~/Y.by: `"쓨q|~i~[] tu GqI,?q{q/@c7ǿOA/ļ`>v\缾d?{Gk#>N)tgmh~ر/:|)>]C~W}ƣ0[iWU4D?}"$n퐐z<4 Nz2nHL06nj9Z܈gx[:,Ǎ5ew ^ &NΝ+5St|/ȶ)3 &{^CBQk{:ܮ῞ Z)q 5k ~A\s 5k0`\uC7$wA^%RMմ5-iAM jZPӂ7:&ܴ8`ĕM73|5-Reħ=Ӷ!5O_5-r*A?3QWtNOXڱ[jS ~!V[ӂԴ5-8ZPa5k[jZPӂԴ `ufPӂԴG M״5-iAM jZPӂԴy .PZYZ clT{H*ml a *\Pni" я^5iK5k @% kZPӂԴ5-iAM | SU݀~97h?A J!WviAM jZPӂԴ5-ij L$A|!ħ'W auO[C66ҧ]F\S})kPӀi7uG4udWC_մ5-iAM jZPӂԴ5-/lAzKMN.ZOkZPӂԴ5-iAM jZGS!$V&@S)ClMU*o@ħ/U1-5-iAM jZ?҂@r*W)4wТ] ꠚPQ@}A]E+!>uRO@pJW Y IiAM jZPӂԴ5-[S 82u%XRު4$T?iAM jZPӂԴ5-8mZ|[IiAM jZPӂԴ5-iAM jZPӂԴ H*uk.?yi)Nz2OxƤ SmƩ/.9^ˍ:{뼥Qޯ'~]9qx/PSy j`$)BY3Kl2s:k5$忶쇂S9ӣhp4!JI;=1hiRNf~4#T*#N ⢮c4*8%oTpS,f[*YmT;E7lWJI^C+?%}UoTzeƕ T*RA6XY\ 6QAUY|QYWzu fPTr$vdb͐#;}?)&= deHM$e(YCLJTf&سz.=G}$=*FCʗ.#?\!wQRK*G327 < ȫ{|NAPN~TGa&r4? M*[l^3aU s.T^z8MIRi2I3N LU5D3aVR9rFFak5ԡLY R/ك o%&?uwIĂ?dlJWV3ހ'O)Z;u,U.+rs2)0 0Qd#L&Q:r-Z]SO]81ө0ɕznJ,eȒFC|Pv6RCI?r3,jIɃ̖e@L.n8uz[ &Z,9۱|v@f2ЙD,24 |1FyCPBK@&%N&- ,oIC ٬abǟXJ?93|Ӛ,}@3PARvț3HqKq-xmGT(&oJ!ʅZ ? !Pe~ht$k&e˽W],6he9txd0s 'K~0]:);MIFf;@ M *marRvˆDedBـ,sh"mm)>MFDٯa&7h4d#wV@F hek? lrJBDY&@V'eB@b!k&-M,j|qΒ)* GmXe Yab7zdaǟ32MћxadKLX2H_d˛<&%=&[d/]l"LV~!ғ봲|Iu@SP-ʚe,reL<2d*Ox:ܰSϒӶ` "jIБl01˲lȁ%Pnɖ-IXI-|7_l40sȍ?uW,E3L7#xy0푙H(OSQ9+Pa=\ɱ\ Up\iR ,ˆ)}$EvOV=21eט,b?QaV.#G>OlY2Q MdXL 贻,V+kRN]*]͑ h#s)&!Lj7t& ֟5$<i ]DhC-R n ,I`%QD2Yh̠]WLt4]Y5=RE0TIi<4 \:K2o1&bb3b y0V+{+%lrFD 59cNfn%*Fgy't<VSn +g3ɞYf3!Q0H&ҩ{ct2a|{T؟@-@eşbM2vY˓- y41:SCk~{iL´dG?? mR&  > ac AvC@N]du@$r9HL.l]Z?:E !WztzUAЩY#/2gMj0yYAMfG! l`emŸPK:?A5.zDVj"8CG>Yd۩}f4dWVZiRy]+K7ywpRB+AJy0"1 /Y4 t]?Ia\KV肳:ʆqj$Z2v74aV!wa܌,_L&ANp?Ce|&ɔ`r_7d*AKbr),4)@Βk %%˙&249ϑ4_iRe%O?m"_P]6yt9!8ğʤwEdk317&P&qYG~ A]9d2?f^L &[mMʘ^rf 3%kmbHWn@W4a2E^s"&9&|UpTf_&?2,k(&*CH!!<4|V^{ |=T׎Ovɡ>EOQS>-\}PT6MaSqT6MaSqUv]aWqUv]aWqUvCPq8TCPq8TCPqD8"U*HG#RTqD8"UQ*(G#JRqD8TQ*(G#ZVqD8U*hG#ZQqĨ8bT1*G#FQqĪ8bU*XG#VBU!2:chc=Fk1ڣ"BCP׷QaаEh"4l6 ]j` 8686868686868684l Ca԰Ej"5lH [-Ra԰Eiآ4lQ( [-JaҰEiآ4lh [-ZaְEkآ5lh [-FaѰhb4l1 [-Faհjb5lX [-VaӖM[z6mmڣC{h1F{PhKϦ-=lҳiKϦ-=lҳEh"4l6 MfӰ4l6 MfӰ4l6 mv ]fװ5lv ]fװi Ħ1@li Ħ1@li Ħ1@li Ħ1@li Ħ1@li Ħ1@li Ħ1@li Ħ1@li Ħ1@li Ħ1@li Ħ1@li Ħ1@li Ħ1@li Ħ1@li Ħ1@li Ħ1@k Į15^bx]%v5^bx]%v5^bx]%v5^bx]%v5^bx]%v5^bx]%v5^bx]%v5^bx]%v5^bx]%v5^bx]%v5^bx]%v5^bx]%v5^bx]%v5^bx]%v5^bx]%v5^bx]%v5^bx]%v5^bx]%v5^bx]%v5^bx]%v5^bx]%v5^bx]%v5^bx]%v5^bx]%v84^xC%84^xC%84^xC%84^xC%84^xC%84^xC%84^xC%84VXCcU84VXLk*ph¡ *ph¡ *ph¡ *ph¡ *ph¡ *ph¡ *ph¡ *ph¡ *ph¡ *ph¡ *pxXEH?;4$]s=N> @:#gpu^fT߀:u5RxڨRuqUcTT‚ yj{0W wXs%Vu=ǞSL*`VWO Pg{0,䙊`VWz]V\ҩUy+.3#_nS } fh^U 6zuhX^Xo7Z?gc 2OUymc:7Yt*Q㙣)/`Ϗe5!^3&u5[EA>bp?pn x lTV{4.kh<c9FҸZ^U\wyal*`ز(`L0٣\x=zQWrW\ˡ>z$m}7G/veY֘vyTjڣ_;ofܡ@K0{qY{= sa yK޲і rY ƈ-E*x4_Gc 0 VgI%m(n<ƍA@d.C9bC^bL:ټeM&hz/z1 Y qKDjfNl:ڔ5r^׀,[oP%֡M ?zi!hL3V-{Eˣe</let|flײlo۴qcјkPU3,% cXMj cU݋Zj^ƫk x -'Ydx4Ah wAYc`v-5/K}A&qܔH)݂1-'lqMLHsP{ݫ?Ȕ<ƶc=I`{FRA3^ޛyfAg6 oۿX,4Wc$G(bt*.v׶Eg,'ږn d`4xu[34)X lO+K>}rTJ9,ȫ|2!Ӊ_P3^Z[JcR boc@FqpMݛ` Ztx/(5-̀YvI2W1Ky1{Q2Aזo0ܺ:~y0[!u[nBO}xcYӀ,KeG !={d,YV|Y ^rm ,HƦ_k<'^sn2|<2z { qK`ƈ-H۳gc?HZ 1Qx 1Ռ-^Ռ#,U@ ƼR wP1A. —۳T`d6M KY`6[Í]8>tV?Kqטب*+C"b5R$P0*jsidAOޢq'`cȘ}yXk׊@ai,chU0[C)c a*RNi7} 7c_@*f)(!X=8҇ ۂ~ |ąEr|mJf!(:eP,tJֵAr ,MXƶcĕc=f u!_A7KƏ>ΘmMBī839lV3!7Qx5y9[p4/n$KAKc#bqty *h<ƒe1\K10 1<{S >#]txZ^x Tpj{ |<i ˲>bCAԲ8XZ#., -/c 16Z(-Z!2br}連 묖pua-S*_,Jm5&J #}טTSw5Ga3`6:C)| |`c&nxy||8$(vr[ի1 "A`;Eqй4yilW4 +-g8 `Jc4BT(qG^i_eq5Gˋ+k oX22 Awm-f1> G#{qtYӕ E-Wռďc.FA6mUjiLPd˻p1>j( hv x壌a OeYG@}{2P&Ftf<Ԗ{h:GcWg0j͜b(1c'CAcצcV .Ɵѭc)9 Û- נW|00=ׅWy2G@G͗' :t*~׋b6-o!,gRwF㟯P ˜Dn<| Ld< ߌK Tp>7en DV7%W!q3'QW2JKR 0CkgcǏJor4l, /GWsZ偄q |]b;Z?. h3[h[ehyNi8^$VP,㻌GXf_j¶ bxCxC1V%gA^ dH}]j!ZA3|C|'Zfl`u'yT芇g! OV[Cu_Җs6; *W S v.kmϠu2=" FkQ,{lp GV% !Ϸ͔~1{*|h|!ÅF!80qYC;uxطn}̑fʘgQ oLY0>.a\MhZǷ㴼U|ʲtԘAc1&0:ズbu L1V }\l:'Xϩqpkt" K|ځ#Qc =nցы}ӵ?nZ-_WQXjF"1VZI _5fU$\N|4>J6-9*oI7j&6rIxWX^~d|CqpZ,?[Nw kl.169ݖqv룉.*7 W-]w ~4c6cJ䓖vFc9kKX6࿱Ø,Rx謥;؞mZ}]`贶]X:4 TFcK趁btorj]:W/GUm* :V̝_ ?4X>OFͯWE63[WOTɳg\gfWB2R&`{۫-PA}rKǁ=Uu^0@B}PBoŝ}D˪ 2ҏdiyO @@-ƿiHOb7@0cUt``7~2Pt7zo+S+ߞpX Qc&W|JFL 2^F#gV?.>6MR8Nk`,Wjmk5쨄8ݩD՘YD48,dirvӏ"&V Agb`0&fVBKƲ__-V5Vq_V+Wg|0ҍo5/~GrU} Ƈpk8$ex:9e>MjHH|Doi[iihi#jˡO5ƒC3VRZ/ZZîghj8-A@>| 0!z#@NG"N`Uk t[ԍB±>nyX Ĝi`P-~0sF7MYx+ iS z1еɋ^tuwLo}9q0Vy-DԴZSgc,sb1_AeNֿluG= &HU|'GD/`ln sAXmkׂ| *1l%n:1>$[ d<d ٓSOQax1 -gq5ف<rO%_7.k ê $jc|ƆیKU.x>Zq2%/SKkE-W=7y=za>:䇮{ D"bi 9Ud`_/``-I26cɖ_-/ DVKdQq'kr1}h }O ϴAޗ`,N_ p+.L|r#5yQLnwAA: U82r2+˽RzK+-[ZL,IC ]nvI޹Sb³f xΛ6eRudkH? M5`Τ Q3*`_0iPYL!U?Μ[v3?F+ܾ5/5WZ'?24؄Cbnx*\W>CC_=Ol?BwջTW?_2?6"jKNYM7CICfKJ;vZJg{n~/EK~|-?6g*ŝ.y녵#Pӯ<@aS6AѓomDzi+PT]?~;xfl"C־IgO ٟɑ䥾3 u:-Iu7hl;#ͬ_)..A޸=i㏲|oopƐPxc[bn/M0~i|B}߰'Sfe?ȥlQcoy/^}wwp[,Sϯת?bqd3Gi)Oyp6ujuzᮨ~n|sOP1+N]nרy91Snx#Ӑ#ԥ3r&R>_buΏվK)}sƞoW̢ky KΓ9mn#4͑ÚPǏ>r ul+7R!N~8jrR맾{IGl\?ʥ;ߝC]~滨ڄ|5Z]E)?Gn}];՛ZB- ݘ7xk9Kp%[BYɝ'ٞYoCQ+7Sh[W i:.oTtcޭdޫZEgw-ͧZe>wҙ3.DjxEz P;q :lJ];+lz ӰP?f_:=]R-W<⛨΀Jלŗjm֘-TO} &͗[ob<ϋgכv_0s׆}6דK>Mˏ #Oo?f@fOxޜvok_c;;XÁn^J '}-wI>~OlJig>JG?>".lɇ 뿝d߾vO>~w|]rF,{8m O{vhW? yr_~9Ɔ'%/C\\cC/f% hzϞk߶M7_|$|g&4YT!f! Qː"-FZGQ&D?gLԟ3Q@?g ԟ3P:OG?tԟQOCi? 4ԟP*OE?TԟSQ OA)?ԟSP2OFɨ?'dԟQOBI? '$ԟP"OD?'DԟQO@ ?'ԟP󑟇zHO!E}ޟ*\/@;_sQo'q{+G9;y1StRv2n/R ,Ge8hsw?8}qޗdžiKGE 8_o3aIE iҹ(NT̗X`&'xw>/E|cixmxa|z>3fOyU+̷Ye~/ﳼGxsK"*)O~x}{QR/xa9h~,\u_AFUByX?`ynޗy_c9KPO>|?#,wY7GIY>߷*4)B2A0TUfd``Ik;~u Oz!B 2000O_P~׎c&NAO߼{9s=ܓܖ{}H {t(s| Pq[q\_W~|?+?Rd'_)߲;t}8 l&ZkїQ|LΓΉΩIu~įcG ~O;j|2!Ȯߝ0^qFo<+݁C{ b 4~Ǡ.`N}&uG'&|PU~%xcy1_::_<:c:ߊC#u}9~}ĠοΣG~-a/.(PhETvӶ>Uzm1|+){SWs<@usTQH[qW} d!lހ 1?c~O򣟃_Tu=OyhPyʧz{'cO9=Uq%=.v+/PCxJ71֣gUȫw!oarī%7s̓ |o C>|72&Nڷ>lA݊#o^[/ES?}i  s^y?(4A = 鏿2>`rAJ &my$# k KL`[~ ~2~ 27  2 2. + Ls 뚲)뗲~_%p  ,kʺkY״ #Nzgy~` SqA%9[ zO/3=qAO4.?5 ¿[-1b`}1~/Θr833$ b*?)?ٟ?-~]GzR7Zu2܉uqǛ z\'G^?׃O %¹ӿg{|H*GRYFQsTU7ƽ˚kMUv\o.~?^Y/,{Dbδ d^6 F[/nCLltᶣ/O?O6j>cƩS,}⭵|\>+O?W,sG<:>;҇+fz:++ƫ ۋWTg|k0U33O_VҖGި5 oTs#HÏ6͡WR7ߨgxo5=bio3d/data/atom.index.rda0000644000176200001440000000047414046015221014721 0ustar liggesusers͔J0'I=lA| ֶPznvA>5 t/{㟙?]Za%H0n=CtKnO&[g>C,.RO*Icg$fb JI95Ԃ]kkh%4jܔ47)]ʇj{^{ֳ>+VRTj%K),]R%JU0otsLX{7se(/`L`Sݷz 5TʍTPC`Kl lo. 3yN@MV\g}ߨwΏ0>{B0gc̈=Ur/WV*=EO _ܢU<n㨠 7Z l! H~(Gy#Fy0CPH=8JE1/E?塬_hv2]>o?P@EsΏ8?y|'P [վ﮿_Q2oe;QϷ®:ފjߵk(U=>vf7U=~U}jWaד~/x>zwgvE߶;뾁V{[o˾ocи)|Wg)gݲoG/D/}7}yzo.]}Eգ}+gBL[=s wQy]_o@=~O5r OE]Ǿbv(@t ;bW+(??˙z<:XdَB,La E_0;M/mZD; 㷮wUT{ C\_i{ C\/p^T+]@x1Y}< rf~_{ljeWQW޿[ߪzK~B.Q}d=o*;-{o_\rU&\6yEmW jYe煮]_=w^7+|AUˌ{. sQ.E=QCU0rh|TM1/[X|QT[oEEU_A~p/f1V1wBbB" 2 [W*?8O%.T/C?KPcbo%?& ݏ|%](xy-(@P߅A+n;(uōA+n(xuōPR(xtŅA^(h7Ѹ()G sи04."JNU 8Un_ A_7;1QTѸ`PcƯpߊń, P`Ϣ7(0 @ ǿS_?E2 cwFُ~0A %?_GE%4QRLZxP 5!4.f4PRLZQV(xt53'4()"QTQ4.M @IZoC+*j APnsa\șz_eBo WS >p\d^* !Uހ1c 'qίy-kr }={獌0y ߥ7_yݚw4~ϝ|yœ'~'8x_2~^^8T}O𠁜f1;2?} .C9~e|׏E8o2|\y=߇Lnhy!g_>~-3A}_!G [eΣ -vh->+u9ˁ+PvXB*5g-ba%+Mְy `"*豂vڠ~x\\ ~=P ~-Z_ ;A|3@~y?֠Z> ¾w .*ԫ܍з. P}8n7!o]8껠^Iԇvo1uh?l-h|صXkZ:A!:䡞˰gq>Rrkg$z!@.a ;Kg)]:h)m!מ2cq -}`rԷ]VvYG^_ $ ۢ-x8r8u8to\;jns {W@\P WC5ꯁkaD{la-C3~w=;pmV*հz@Zȕ%(-ac:`:`9#ƹ#1. &W@pG=+v٨~KNBYK%Ԅ8n%g; -`}#ʎ 9#XBJc臟V=6o Z ㎈ƣƧ3p^"LK_ ;W>+ػlo ڭ/"Ps=Xoy'Xg\θ`zzc^8NW oWs؍ \,[)=va:h 'we?hT;+`١!9`\8@uPG z'>jc(KR2ƇO(K-/ _?ϗt4}+a//~cqm=~7ƻ1ᗟoވ7ƽvOx~G@C;|q8?PC?cC_lQ`=;`\:n?Uvhg'<1c {0P7y }S: /O C| =%#.+P?AcG{b<b = ;y }9n@qq̓@u:vʠƺ|/'~z @~ q^@;q F?xcO? ?s  D?b ?7A@/5  }.?u~Ǹ/qW s/2oA?|? o @\7?`a}A|1^|1n0___'3~ _A}eУ]~h?c^ Al Rba<?Ư?ƹ? :;1.^C:qg`_/~/`~v`<`>A~O~ ʃ@_0c~u o·@^>8uz|_v01~:~ 1a>qQ/ 1B'Oz}>2bbO?@~~B;y01߁A+N9zXg;;}4|~ ~/<  :r`\Ao)~ B`^C/}0}Ǘ]/@~ AX_x݆!<^ޅ}PW(>X@K | !1.|P'zϥX11aw_x|a_'oc)_Aƫ/!_@@@A|{C>o⼷:o^oB—yj@̯ | 9/_)Ȁ \?6`ܠļڀ}&t78uuCC;oП/~p~w 01/6`sCKc}@?q. U^]/U_~ʪ٫>FYuk}~(󫺟 _W_;_##q}^q^u8_ྪ8?7([]jUq}Dq?q=q};q^u8~8}8u8?ڇ ܏Nz_ v|j&j WOQоwWG" U,\:1YKyB|kO|]KΧ|7Oc1|_2oyOd~ C?˜gy+w9_99?967_ ͼou~]3dߘ<0]1y$`8_™_|q[A?H7ϼ_3O˼T2?cbd/¼ o ~3O^ա_ac]̷|%O|} x_w}|z3?yOf/l?"0D+b/9b/_?3;6K}x_oM}x3y<#/%_ȳ" syb?0~v̋g~90/{wys/_}g </8ON71χy2?,x_ ρI}o </x%_C޿B~_+y$d^|"Ӂ_o}cG/xf_/3yc>|# 7 7  +(} N_:?nϼe23o/b/_W˅b?/x_?^O`?oϼxG ~>}>_ =g 9goq ~3U^gV/x_A3g)x_?!/ g'X?/wA/n|[wF+X/O_🿣wO5 "=2Q??3OQ)Ow_ :/jygd <:湉W/DE y_38EG8OyǪ D"C!x4̼b%2/yxoc8Ϟ9o9?Y9O19ߑ Eh_&CE8I#"Vo4" ~5IS4"|vFEyȻFМ?DE'D|oa2c>Ęٜyn_t_Ձ)" ϼ,A3/^M#/ > /r ׀3^@_I{D8ğy<̏a*?|~3f~.[/N(}/ @O# 4 "%)<_Ӏ}/x#̓b>ewy}x7/}/xj@_sAy? _$ /? O0#B_#}OC? |_F?/=@Áy!#bdN~O1LԀ b__ /xZ!̣}ľ |P_C >K"g ^&} "ϊ >#/l?x?ޗ`^?|Y2_y/D#W ~*/?o @? ^//x?W 0"' 5/ˆ"//@ DO|j_rYb?_?GO|_ğ̯g><י_I gSTyyW3NLԮ|z@1ykWc~.h@1όyed Xq<4e1o>P|T2?#| Y0oyKPb||fGvw"9SS,Q8UqɈ|o`_}/UzNy&cވ 3]n D{wkߩΉ2 Y;pD>'BK2>a>X.k% %O~/޻W!k$ vQK(>s ~-!O<,~gC\U_0cAcq1!|]`|c3+|yg+L#(ayd<1yn1?j]VGQ0oyw'.?O"6"E)|N߻ ~5uyv5^yL-^y&~^1IA%'T~~N~.~&~,K*EY<})KUT,h:.!a?Jji_/KO/2mC[:mC[:mC[:tCG:tCG:t]CW:t]CW:t]CW:=CO:=CO:}C_:}C_:}C_0: @0: @0: CP0: CP0: CP0:#H0:#H0:XG)-MMZ?(US_OCJmZJmZJmZJmZJmZJmZJmZJmZJmZJmZJmJmJmJmJmJmJmJmJmJmJm:Jm:Jm:Jm:Jm:Jm:Jm:Jm:Jm:Jm:JmJmJmJmJmJmJmJmJmJmJmzJmzJmzJmzJmzJmzJmzJmzJmzJmzJmJmJmJmJmJmJmJmJmJmJmJmJmJmJmJmJmJmJmJmJmJmJmJmJmJmJmJmJmJmJmFJmFJmFJmFJmFJmFJmFJmFJmFc)ʵT_+o*[ 5 5ŢϊA--n_M?u*?Yr̢f~S_S~gf_}}VK79cqZECM>*7E(jjSWx2_T_^?'@TZRC.3s%ߣ?P.&?%n-czmXmO[)`iM)* QkbGq9GrdK'>\;y*7աC-)mCKR9GS.O7nΤ+s[@Y3]yo>eneN9Lww{O-࿕Rfnk8T>ɏGqԾ?Wo]RɛtU$nUO=1tn/[>0=)WmР]}(^u^+x܈0ܥټ s(mSLUkjy=(gynRNW# f))Z7ItdmTimJurBFeUC5pO9{yu D5)7-9fUmzQ4M)ӀH٫f'NiCv/6`=Z}faށ$m3=,}:acJX3ʩ=¯%J1H;;|0]um e]ʴ8FwܸgLIv~-~ԡTĭ)yOFEZ?7Id_]FOcnl@i 'YN97$VL#{ٵJFLI 5ߌROd2e|*ω_>K_ooߢ;=xaBѥ?6<$E^y"bKG~WοAfEQfͼ!#N'3/χnk)Y`SJ|Uw6{(>|~C9i{)zx,&e%T<9ۂr*n ]56JmxmJr?nTJv_$t-rrzF',9GmK,S|^gnBPƏ]}쐺.(ZNCU?KIYVuH>͆Һh5Vtx"~dt1yqtצޮs)ҤS)4بpy66Nތ# Gz|mFS =)*]KQfiK^49H9&GWlےzUSzFv)ebI rS({ԑOst;%p-=[r)CRd$4녔c7Z5ƅ%)Ǻ͙k^SS۸L ʮwy*+UYdI5H;^EYF]w6v>qT#O,"lj~b<;A)b.Gu7*ơhj2ʚ~kto-:^gNO#ٕgc֙rLSnR]JByv| uSŖ2 ֊;$\ZnLc9rTAϫ75vMyE1WqE |)źe ՠDsӕRC9-mX7 {: |G_$iOok~[uK"8>}%ߦ7C[9+Anѝî.P3[UIy̥; Zmߪ o̎"NЅh$'4齗I*ۊRgk5A}vwz:S~eueF;(I}汱(_gomo.7uvQo-]ԧAwʶܮ;?nJg>+s*E}skՋ$rSf<=nQ] ,C֝DyWn[D/i1u{\q߳M}:96jǃ3Y5ߍG=uVTrG T̆t4Pn-~)uKxdvG2~%)X3(>d{־)=z7g}J*HR\+!t_cYMJ)Pz֓+s")ͺy{WPDr4EGZlB+$[?.D>L߁vkLzDV\Gpz֡r)mZF)YNQg-(ّU|{֍Q܏]q/QƤtTBt^s}gզ{kVyѝnX ]1ߧd8VOu_@K>$HJϢ.ӡ>c|GQl㾕oR<7?ey sety7uyڹ5(nVh9ƻ8} JK^Zk F:Eg/k:w}x8уRKWڑtR:PMoOM(W_΢K<;Q 7(~+QJ̛?QzD(}e.)wv GUm=.t9<ݯ㦹"{EW6L7ީi:㥹خYn`{eHQ}xzۤ}ɔxVIK7u}?g?z;%{s 0bk-ΣΥgŞ0_d_n_n>4g ]k?ܭGtUt7s CRG:=ܘyf Eꚸ9d:X2?6jv;N<7/XVs" 1:2ی?Է*8o3:dFe7qa1epk@WV7""N!0zҭ\WRn=4ΦYqFP!ژ_ܣUɚc~nKѣghAq/<\ʲ3vB1(^ʶC)PfQʜvKM(aRneKޥUyVU<ߺ0;Ya߃~.(=9:lʹ0nۿ<&[]69ć]v=iH'^f8Oƺ;)Y⠸~fі0 K[vdפS\7o uy8QJ}iXtb$<ث-CfG:6g7nϵaǺK[a ֛qGp9kQxkU&QJf&-)y$3:Gj;4'y:QmSČWmRFsnRmw{.Pn>JwEYF ;nR5|݌JcUԒRniE[冟P)ICps~#ñVkIsw.ZiSkY8FJc-V_yϸʗ̻n"vSZR)メ (cF )u -AjUߴvS֞P3ŵѼp t?.pz6X9n:2⍤/l>h}JhRhzJwxN{|ÒD{O}fJm3ǽLDmh"+܉"FiTq_1gIֶFG~UDžxym)_^K?R6F5/%Ei+J4ED7*Z[H\2qNt۳GS;gwI. hݽFYcR.VvN(F.H2B}~cyKF$oӑNޥ'UjUE3e'?Tїn:jb~>۳>E>:.}1|l]htN~ٽ ȍ.h+@q}|/C/E^7rZslP %է4EmkuP>5eUo(.nwK^lڑM3$m7]޿ߌ)"zz:oS|\ϙcHR)VcgRr'j-Q:uveAS:wViCY6j7]_ikQjeG'RF]*PʵK3lW/W?ċk⺛[zKmj_s:[dQSj [j5Ѻtzt%ΣQN_ 2$T'9Iw\(ű(YO,n,e%_0Dmp/=="HZ=Un9,o8%UVx%:xᅫItF}ѥ-7F|~M9NJ7ya=kפ 73e|mJzo)k,Et2vcl-ˤHޣA֍SVu(V`ԝ#)q>P欑QIiOI^ܻ^UHUa0S־:ۜ@ :}C5EУ~M}sӣ}Ǎ\]t<w oD);{Ox}p+KE)#MPC1~]6L}OYg9eONйk,ejuSNNs('y~םUTAY2+LX,@-?E)YS|iKw!)l/Δ;bt?gsה|Yi0}̍'H)*Sv{?Zs.QAf[f:JQ0A7J9& uЛ2vqs|17y :FpzR3)gՈlu7uNoUgnvKY_Ï\ոr!eUN|? 99rtJ{b5$YJwȩنHvGn_CՐGQzz ,!_&ס ++U攺?SN 5ϣZv] jtD9V-kga%xkR-9~|r5J=_bRT؟JlyNp }g=bVxC:Rwꇬ2$ݾ͔_KųHvB}yJ8.3H]6ٷӣ;g/[v=^T+JeSbKqS(y粈W^SBJ><}J*|̥uq?aRfޟ8`=JzOz o)s'3]ϵsb!yxCQnϞoڧo>yOq^.eXS쑒Ս MϬݒjU#ŚLk߉q"e uwV6pNJg(1'Ün7+35yx^Ox e>t]JYO4y?uk~I1O X9lJ4Ĩ=)9#9RUXUug_z-13eLab\ML>i)eMmpyyQqo&;Sݔ wsFVT??se/_(]eiM)K5\(ICvb'RܼWFڮץ*/~?r{%^K c9S~k|ΤT?˩M HZ)%r<Pocr735=_&X̠9~gr/E)Qu%RwPW@S\\nxϹ2pgȦN'p]^军t~O֦{Gwm6+8hŵx܏r-ElF%g2h^6rj^22=}9S{XFxҫw$wQx»w(ųV;oi(Y?#jT֊zv<?ϙbLb;e:cR?w)M#rNt32e#wQFj!]P 9q?)Sor&KtUzAf.<ށe]v T\/ Uj OOQI}{yRN?#߀ùR_. wWG|+O; [.iʽ|f-}miftitޣyxUckOzvR u[Sy}/eQսgKc(wV1JK{dmp8D ʭ$~ x3EiL_x~O u^J<֠\Q,5]Kv܃U"\{՜8#%MoeKC.uiJ9N:+ֵTsrתGwB?󲢴ϦUEz޻ŗJܺ[SQ{Ek6eE^9x⹹۳ (ea?Wۭ$w[ +{XiIױߛ#u(­ VFyǫե(~bk^H~i۰%%)LsDҽ[ƕcA;,y͊M:SLI,+J=Xo>JzݻE㬖))x-v7E&S$&ܦ;'qF[d?Tڱ߿OԼGOmnXΌzT1nm>Z~Rq{Pglu|<_W.1js5S4RyŅF/M)z?(/-tD53=,>*EGon=Ňtzl25jo)w .PƑk7QZ>ۺoPܯەwn6t6}`sTu-!\81)}g&R. ?S?K.έ(GW0/ni.f4ܰ4˗Xpsy@t}v(vBIM)mI8 ߽߰Ro7ED_vy|gJ_f (O"Yo^Ow*W?\n􊋟fՙD\3vۨ_yM4ĈUA @Xm(cNz}O*c6(Nլ72t.>k25/?^5[ 8b#))m_^mź:s3^)#vP8R͇?_{Cg(0!E 226Eϋk§ TKqÍ2O,xlM59/%w}&N%>b]aWJ`trf:uၓv쾕x0#¶h4Ÿ2wԤZZTC K?N[*hN D4rhKJiKwZRt==)jecj&vlCb=п=|УqJ:G`d)JY9ۇZn6?²/ԁD 8EǝdTJ]ր2͕nBKνC ]o}Q]9]IDTݟxк,{o—̚1$4DJ>8e:}u,_W}ʬj":J\W Z5*6ZBPSR uhq"~zbׄ.V;5czy:rRc:|AOzN7[tqiz0d#)iik)nCKf$Q#péo("{yn}J(YbV J_{մUc)-Q0ܽ+P%=KC/θ83߳ݘts`+~U6vV%fV;OSowv Ydy6<5 d'L;(ۢjNլ_M11SbWtiZƳmOפ{U9ߧ']X10~:{k+-2=~Ov2]/5:SnLQX>}}R4nQuފFcj5W<.[/jKڟ:u'.zt=֤|3t!rS _7?b]x% k~Dh-eԨoycJ2\~Vy٣(4?uǑ7Nmց&%_9RޝL M)\dL(nە/ܼṼCZRǞ) Na5M/X&[h N5>D)oR=FO wӑ&y >azf/=:P<1~dꣃ('iXslZqeܯ`?h=yeu7rW)GO̓jTF7X-aҕOj<>cߡy.nkS瑔"0ЯJXQKĊ5QIwH~wg/:hᢗ.W#wYdwqo?uDX:%4Wz=xY8|G({59vQzԵ]JГZL*\ko}νB^BH4-DYOҏI>-be{Z$S̚KuVa_jl~ f]AU=Zs tvg=4~[q[)\ftPJa[VGr/Z՘no\tYtO9'R©_&م6Qg)?ѱ.G\I[۶5nh)Mqf`@J~ooO u%&'S|%gѭ ߏjs9 kutVWJ/ة[uK*ݼg{J6ޱEez56m={$RR9*CG22XnM\l8ŕxsߨWA{eؒꆣf%n*%znںRbk5Eɭ|󳦌Fof{&˖FI ǟ\+\}vӨ2j/RmQ2 JPkeNڮJЯHljtiVSZ-)mt>b#FPjG&5d݁B)wF|~"V9=")7ݧG)_2Մ^X]ۏb|™?u=bD=[g4E|ж|o3IG+b6J\XS׷LO(#i('хӃG}rA=re@nZ׊uOg~nO߂bƂR-n(c&S4Y Dq4^RמTc{dG?Lۖ<>969y9ѽ>PjoL\S?vm_LCh)LGoHfWnz ?'?w8I/v>إZ{j43 r_8n8?~@?gΙ?v̆<ϬC3bȝsT+t^bWP3~́܂SQױo-*}w; ?]C.U}o k7r뢎g.o@ը/ʟR 3Yp~b/?λ:ΏМߟ&gדwqc/~/y]z {hu߭;+G9'pwRc%Eu{9_Mukoy#ў#sߧ: +ΣuFJP>)]2W|_>s^9w>~O,aQΛ2;\|X(/}(?_8nrVn32|`y8z+`y>Z<@z,aJ[v+p,aJR,`%RC;|\ "YB*D;i ;.+Y a 7<EՐo mZ3b5cG=3_ k:)zc گEy@-[ ך쒬Bzݨ}Pe[gvQօ D}aZ_ۢ{(χ]e~E?qIC٫ {p -.a{JJBrl!q/r\>: z吿za&쁝-Am!r,=&@;̀KRط .G} e9auEG~-;7{c{.gNSCGțf%s&6ݰwYΕj ~5YػKԁ^;=c|9s>H1k%گy+Y ;w \ Y-ۢ=#;b;3Pmq|[Wj~Գa_k$lʎh88a^,%ZJM؁VR}6 G 9?SX>r>%4~i c+ݎ8x9a<:a|:C%r~ ϴs쳂֠:sxqB=/D9X{(_ ~Z5٠Ʃƅ3r8uGcÏ&h='yBhu ?w=zS3<#g 9y{\B8g=7aJર|hNhtF8C3_qqY?VJaG88ouO;0 ~85 @z_;ï8?B_,MڭՐk ?P \$+A:#9_' u.#z.c.} (/eyVB*jg ?ln a^ 9" v8 '#G-Ѐ߰J7pZ>Z-!%䮂=!v٠~vB-]h>C=;u G's~'uƼt.?\1~@BcKQ^\@KI>G+ؽZ3M@:|N b>Aƅ=;^s?01>: yΰ~?W 9 /kir,RkKVC=v9ƕ v:NP Θ]яWm!v!o`?ƃ#=w+v5(/hNc?!;@; n@q|WFhvKeAaƅ9_GsWqCcn;`pc<W˕a?Qc\;W@v)#s[@W͕~An xp_n787 wra;#n(nwu"n#22pG?a{^>z~=<Я@1{o=Я z< ;<@~2 qv{P^)_a8vNvOB +]=Dz>/p^ DJ @x Py)Ryl7ƕ' ?Pyi7x7#s {A)Aw# owD{o^+5:_i.k/}3@n 4M [_)I hq9'E?I/~`|A^i ~HR?!¸x |=KG>߷2"__8o(~?zGoq~{c:~I{c0O~Qh?oWqyo d}a<Y@G|m;C; >ߗfļ '<8 Xag Ook>~|B\?X4'/e z o7/󍀝~M08@C ֫@qzQ|?/~X'7K@:1./~F`]q/?~X??@ %zo#0AO  ~y?G?L|0~}pW=@v~??]`] j(.ƻƣa^cc SA#"?@~~@<7J<À# F?}5ߏBZy$y~'x#~޼N"~XezP~yo/%~Oy^!8x+8}!!/u  :]g'K b\y=q0 %XA&u#q W0~9888aWb _ A`k0kp(0u+=7vu K<ĸxxz? @p2J;?1OaO0y9B 8A_E?^?ƽ?GawcSa跠<DCo0G0_|q>X| `؟C;?@)[0`OC[8y}0`\C.zB07g >#C?@//ƙ/~O?'+1(qЏAu6O38 !!G>X}!ϗ0} ?@sO uoA ?B>||1|1~|O@L5m]O}0/}5`zu-hD BoO!|}`o\u,)-va}5g8q6`bżĸĸ )_!706~){1No&?|1}1|1.|yǸ}!yЯڀqkߐB ـ~lc @̫ 07hOws`_7_7;丣ػ ׸wwbcyk ม0a;^w{:n@<ȃз0~jAN6u E}ـZA<74W8p>aʟ+1 ~_BY'PjoUVz_w>隠~վ8>8?UacpybU/hկYq8?G ڷU_퇈_߇__Sq}p4~_@n'ǯaBB{dw =ݯhwyh/xh/kо@^5Cx@ўpoc~|g󆘇ΣS|C.@{ 2{c~?|%=Pp9ǜyǼV2t3wd"Gȼ@1o13t̃cĘ<'1f s޲9s+wr>#qq~oqv2W_.Y1ωyE~{oK^{e6Oh;3yzwcw<'1oy;yf^*g5ȼA1yhcG<A0O9/g3cd> Ǽ41ߊy-+a^8ԙm#d0y̻g>=vs3kSe'-ȼC1'`3ϟg=μϼk33Ke^(3<&1O"̋`/g^:g=_v/a2yyw7R%ؗ}9Ϗx .g~|'{< ςxg@OÁWE>$+ľ_go <ywQ>O;A1P'<E7 >&wg_ "g<>>1yQ7b~b/x_- ?a3?yjx?̧g~2'˼Q~_=g _[f~/]?y?yCgi e$C / ~5\/w3Ox_3̋|t7@ ?g> >#K/x3R+ !>/y<@/xy_|/<=A%gd;B/x_|'D/_ ;*d^/n߃{.o3Q?? "nD/xg_|F 2Ϗyỵc"O ^$G/x_  E+:烣_D~4t*x@'=w CŋtS i9y~S A?WD|P i#N/Du"J*W$x|s"2oy[e(?|KT""ՁG ^g^(9y"_׍ |wWy^W 9·<^ğ2|0 /a?/y֜yʼa2?yd&*Ǽ4S"|oΓFE*% ~1/?ToʼQ2Gd!׆ <".r~ /^@οDEa(C3+f^"619?9Os9D99PFo;_s4/i5Fc /xوW#̟:/"/ ~ /x ?^ DG_C0g>Oa2d>$/(zj@_Xc@<}_[E/7"ׄ > /O<__F|Q_)_B} ~a@ģ̆g;Йj'3ߗyge~)=Wż#0y b_SG|__B_) b_C >/x鈿I# ,[A> W Ǐ 9<)1_y'}!xǁa}x7y׮D<ğEhO/}! Q$)<"_^@>G4_AoC b?0 <"0Oy))g^J /e@! ^<A움E|0_ޏAs  !/xfE!oط|0 /3"φ3C} x3ߞ̗e)%(rj@_ >=/xň"ob_󍁈"׉~bS /x∿]#/ (@_F/g%; @?s_Ez3f^ G_,;D_|Hğyc+/ :?U*O'xu?)M횚?w+dט|5fd̘W !@]1OJ𛀅ǣ*yLQf#~ e G/?|}`&.Ggyh'~(Jq1E>%"<E^s^q\w&@wP]g</b=ձ@߯^|.-bߙ5/G }bQ/$#]zKӉuP|º&_a]ߙ^|_bK=`.;}&O¸`x~C=J~s>K~z?u\zU3t=._Oq3:)72yboGFcƼ.üe|dyy"y(i#QB\΃y'POXWD1' 4υq*=b=i!p yKhURA+򙌁G ;E~y6'h﫼y2gky(|y8/ `uD|.h]}w\c};5΋X/=x!Wޑ =O|s MK)\ϱ^X9`x^u$@~o~n!~u@<\|Ax^~>~zR}J 0@gp>E1lyWEޘi$K~>R.:6.xeZwkun\3$;?IPDLJῼ "ÛzQ/U #'۱76ۓ,+uԑ=EI%#&Z줄~͚voF'f}2F>xD/jߥ/oѝwN0\{"/<F%fыS?SN+SJ}(fސ Г? ݙKCܵR_?)%K=>@ELczck!RJvyqot=E|FY{*mA97 ]W6 [{6%^Uk*%TzSR^yүm e:ؖ@9w\=#ғm6]%S)O>Sv3~!ys}GH^J_.>evH]-!N:|OFvfCiݍvr+:r?vh2JG|w8kSoɹ_piҩlnlT8<h'oFّU#Ho6#J\nxp(ߴ%/֣+mIYwV^=w#2IJ9کV^=H'tu9k:ӝ}{w-9p˂Δ!qBʱPy-Vq蒔c̵z){dz $j1)n\F>qهn&_AũR{ƨ>k?R_6sHnlBG(ل} /OQQ f,JlӲظ>iI0uۭn<pͶ3rP{CZͺAOZ5sYrǯ\kEOi~k$JmI}J_[{c}PLJ++ziSAtHܵp\Iu2ur[{amNa$_Y%]oN\z.ӭ ݯ,粛njէM Xr[=֜MgoO ed}=>Ū?eϽj߿qǛt)~J[QZɛO:Gq~i`qn)jn}I^7hWϓݶKL/zttMzoֆ!g)ŇQn:S+6G)y\utիQfBԐč=za(+p<)̸6r{7T1.SZٞm JGQط;)mv YerI<qvPnZ/Ӣi.M|D;keJ_nj;O}8Xe*'}_m{5?Z1睿pӏlvT#YPz^b5eM5}tvw/3 ʳL9Qi&[)LWU.}mv|iڔb]2jjPJɜ6Nu^F=fͣ/s4V ק5?ҭAKCk־IoS[֡-lꕠ 7xNaW{Qn匙-*Q़wRڝoU\׆~ffGYz^BYwGi4wwKG^mEͳ5 >;=)jqW2zXs> GׯַTwǛ:(SW;e[Sn7^L9ƾعEuVr) 3pi7e:߬b4eر]54s^|!W[j t3̱E5 ګh[+mbѣ=F-D_vОd#̛ZNW̟OGNH7^%=1>5ǷOi^R^SKe(gx/NS% Qj"eePU)VОsPƋvI(wq*Ell֙_k7>=4L);R<؝J5 _hHiO,E"t;uIeD K;Nt?bksea{U4IndŻ(l׎-oEYϱ?Q~a])cܭLumm6t/jőt-!qVE3zy])amIv6"}^G=f]zjݝ>R/-O#APO#n̊{y)-R\ ̖tT\_{ڴڏt̪e&uWZB7*:"͖NC>l߱%Q[ *!'P޼(EGcQ(Y?鯔@R#J=ɋ(ٜ~ZЩZ4~BOUW\)aQ{E9G]輄d5Ǜ/G׽Fף:m@W*Y9]L~qfCP}zu7?QR%R%mZx$)J\avy_Q}z/rp1׬&xuPd_(=ɕ9fd㼽+(Z"bf9#Z- 6-Ii@wMN5&=rK" Jv8Pq=I}p}6-r`Jhj|]⨳Ȫ@uJֽO(ͮ^N't2wwwEWo+TOqY<2b<-۪3k_} gM[h6nBy~stR*taL22lm_נWvYF}:VJ#OAic*Ҍ6kv]ss|9~~6GO釟{U 9H,\{Y"zߓ"XcR|*ʊRUjӽ5+N7VYS2S:W/%] gQunPjfe1(qJ7)ӲO@3?bf{{:TQ ms鐳" ; ҇nhZI > EɎ[|%Q);ςI+r;u.Σo^VOP6n} {no3 ׯ[ϞpQE[OD:{<yMB+=TeZђeiU!۩lm@PS=(~nta4?[8Sl._#U~8'Jmܽd +ك.`1A2#*(:5m/$n^4: ["\TOv@˥2jq&Óٍ{jY-=_i_ !VNi>d{;LC)j+YAC'O׷QӁPr;{76k+B_" cRC5+!K}ۭ6;=;!Zwln~ Vg qۖNѦ]_甓WeAfIu!cDžA⍹}99݋Cք Axx24v"d8f)| \uK|j=7w+T]k%u t,ӇLcZ S=sq}+›=ڇ =JGϡ/෉7]7JZu:&=B~ȟIU )Yos?p'\g؞9̈́d9NOANQZbM+uP!g5(29==dnv DZ6NlV 13SRHjbP]<H_O *h;%yBNK%: E ,1E?a47?rH-Zu~G43d(,S| ~ Y;um ߗL7G|}*J _WvPr5[9Pl^!P}z(khEcVBv$_^i [^|:1tgD.t: Go`!ܒ߆F“ZWoieiNFPbk6\tyl\Cf?RC-rh}Q2[Y4k/ވlEfP2@1l$Xd in-;'NNKԄtGe)w} fa!n;(]25g%.gµG k37'If7>b"5}=$zhµhJMu+Ca[>Piӧ@ 9ryW0(bvt0dXem %|pr,[lZ ΄A<ź~.;L5$#T(w-}T(,c=b*M$zx|F1ϴZ^(3q NVqmd5: X2zH="No2lt=Ϸ5sϮ2w鳼I. 8wr /N8$wdi9W d߫4g6?h?*[ikkHsq 5"Wj2E?xhܺ4 $ go<]s/N}[}0/Wnlpi~nh;=_#x >"ifYvZo= ORy@a";*zj[EWn}tp yx_ o@SmsBICTi쮮\#;&BQztEc>J~[`痽89x˞ zQn%kCoJ&^w A:|~*G^ѹ˔x?/N-. i /O yV-CYPfjpNN٬fp|D=l5-oe@aV/ۅO@ΐdMy[x29y_x OIc&OCٟޅB6 Cḉ̢CIw@Y&H"?g}adadbcaɥ@8C@2`( `]ZxoZl\A;@SB&S44j~gVr1{]* <{{0zpiz 4i ¦bXhDab -"U{A򬀫տW%ۍiQ)?3ܹ9Tēd 8Ӌ%cH|[7d|뇭n½"?3Fc#3AnQA{ޤWBeMxJfl /a‡]e>JWh_\\H|F;<Tona(&/ۣ` \L =My럯`=W{jSQ<z,$8G}`ؼMd)v)QI/z ikQ^&=O(AH77@o>oޠ +I'K5IC^b+'v7 *_x|#l϶ b'v :ht+s~wVjCo :hR |Fzf(j)"KkU @:% ]z ٝ4a~$YzcҘ)$OoޣDNpHjt+6tݱ ZߡSs\) Q忲{𕞾Xۜ$p[/[M }>;z]]~IO=& 2g|o h8} -zu Γ=n~;ׅCwC-wW 2$Lszԉ ǞdƯ@j]TAc.J_^MM։<7TTuA ֜'uNn&y3'>MBu#e7_ru:Dzt^i܅}xd;7?)׾$6^R>PF6ML)KϨ̚?u bwn5nr5\b κ3D?3Ӿ?0  @)*k#/]i5{(Kru<>J\p$383d$'o9a㚛 ꇜ 4y12QfGm3y"dm0s 2Ux rF>5 ߱{oeP>E\7\KdאE'F- ;yZPd6(ȇ2wi>AyȬ$UUQҡ|]쫥}[PsX5UW[={pY.[X烍 72)w<9&׍Nq3b''$whWNhk+ٻ--c4dH[pƶ@fcƛX8%=Dvlz2X?#xc: &Z }/ٸ<?]!dG`[U@z5E3C.O@Rc>Pe+ (8ο k6c'jt$HR~cW/iB[#u8uЉi,G;89Hy2\qSKHL~Z9=dΨqmyp{@ٓe)w>uz3!Gl7͒"{ޚ}M}?)+V z/g|b82“GxxgM5<Bzm|HG?ګ_&ϙX痍dUOiPjھ#>CY1fyE {YĝƒiPX𨈯n̙3yY7՘C쀤&MOՆG#rr Aog eZS?*yo~5d߱1 /AQ[%em>{xtxr{, + =eg iIo~0yLYdA@5;px?]oܷzT;=ӛ09R2mr: k չVE﯃~UӥyP2;A+ _rm7x& wõ4[AűsO$dv̅~ wWVu W<5R2R͛N~~ w9'w}u^۾+f CiygH B!kquy'UwaKyQ61Gm(:_7ѡ]u$ABqf}w^-8ޙNZO yzVBHZ{$&PlѳTlV/]&c -F5|]*"V2Dx5Z(v¡%P:UP@W^N'QpACx0uvGV'nqO{ |v O^342[:`#7 S 5U]h5.nḨt61fn4If?^ מ$b'~۠*}cf'%BRYء9owm7{ò- 3oBIm|}X{ xx>"ffB;o4VqIT/dߙZoe7N쀇gT.5•|x`,o6 r >+lQс6}^=˾;XT*_6]>7n$:;M荦 h:Ct7^Gcv(d{hB(drL,H2Nr]fw6H _k 3, 2݃O {f H\Wg  :~k Rt lzj (lb >Κe]ݐ}Gd,nLXw(ӊ*+I+':^e#vq71<,#g$5(o!\Y߮{~ݥ 76^+ V (j_S3.]ƃ̜qi' s1'͝$OSp2Z>gkAguonuy7,gSXgʤfl6 ]Fe(8@4!_LaPޱECSLAAά:p/a2ԟYWiy>HO]Y\ _qW 'v 0S):>yG@buCQkAٍfJ1Pw4ÇavG-=Zu >xp6Mύ]%cvUž/o{b G'('#ٛsvQÒz;X}{`ױdrPM|/gC8{1(h|(Sg rZ?DTv7d 8o)m nT;ćb)Ũ2[|R?&v G1ݘX:XC1סk*^#lON(6,gQumzP & ACȇ9X:(ň[bcR &VŰC{aX? ^+WЍ(zX. absb;=c>~s>=,+(C!@NtA=X^UB(vbmQE*b#'XP +L?[\0",ߒrsK 9rgc1l,bXxާ(' r`>' J>=98NQ>g̷ nW;dzYXv'.X/uOJr\/棘$s^z<;p؁t۱?{>G>jvَvzNS>'~y䃚|b@/pL-O(c|jS $,?O(+CbQzL1b8Sl_eE(1bps_l/G(YG}dT/be/rmE179UL,,(*YbpQl[?||G=]5G~Lly(k|3IQlxkrX.@~P,x&<#%gbSw!xbn(KƇ?G|SL+N1a|Q?PL,&foɠTb#i-RW,b`>9>ڂbqz7F,blR,F%L1 )+`db|b:&&V~HQ>Ĭ܌xVP ,g!Lzz#UCb8`d;O=)ŚSw1ؽ[bx!m.-bM bX-)l[Px/bRـrl~x_) JabҘ"E~ی(7ciXoX8^1XD9ňPP `k)L\X^ X?ɴǨRlJ?SL5Ŷ!M<PzUM16)f3swI1L0W(&y + zyW7O =0=I+;b;R3G ,?+i0p7Ӈ`!*W)cbaXɾNwNB;brcGϑ q||=ŨPA`:Gփb:㵣_uݨ84c;c#?7,gY9m; _s5\y`91u75y֓.,b'2)Nb0ԣXt>c6\^nb'k{N݊5#ʿ㵋:R^<[Vl/#Gb>{^~rWS: ,rsj]׶+O`:GzS,m($y~)R oy򡘦^ϑ{J)n5#`Xe([u+g+ߣ-H=ڂ1ܱne(fOaC>('t݂_ +أ1db90]Oz-߆儠~ a8E{' AG=PO9k1zu5T(RQ.Xf֨Rvˡ>z*%^ BR!AM~'`=`;C _gxLR)64 ~D1W)&+^ x~`Q=tσ݂o #-p=6_|7U֡ۍ"Q|<wFy*6/n8nCPe;Ll;_A׫ay$o(ۆچza=+1-^;0RwS(ʹ CX's=#w)^#?7lX#I1c+P>[K1ʵyXW>X/שHq7 s?xc;x|ؿQNo4,gQ]ȩXi('߁c,>߁Fҵ2rGxmףz^{b?&| RnPLug g[Joxz#E`q1|H2or.lx߄ϝIN*ݤ\AR(r#X=ww݆]cj݅څ|va?څwa;?>8}D}7n~CPOhE~8^؍~h54/ C~C1_WAX=x͓c~(̓c}KjuUks,Ӳ:WPCﵓ:R9ڎ'u5;!'k#wCPc}}0?soGv2G>ylϐ Z|k=Ch=ﷇ(ʵ!|P0°yc;PsMg`FHi)gt3z:=wܜsSy;>-13̉bzO<*Ag`zk9s*: !zk|nFH߳jH>wwuGx ݊o>{y#?_3hAy}\?z`?:D>Ts1z}BA];__En*|^RS?8|nFSTL7O~1Y&bEx|"O`.1dK);, N ,TPkc|6wF]Ց"tXsnܐN̿D}ӯzs睊x~}0qG?QVs0X~_?F;3}O(WAX r0]hOEjr C@ )]c=z.'vkvGz37v8VS8~k_Aj0*JQUH CT=oRhS+Z?n-B #eb:L뽁SAw`mn[0f7#-X;~Ol|[_8u; ('XNۉۉrq{]w.#[f/~\K;)W )|{ho°0|_P._z}ZF>aRlX߽46DiOݑETH"Dԭz3*,s1\L?/@bbn[˳T%Hm >w||݀|6`1l-VV|=?{ߎ=z8NzG ۉrzD~;绰zt. B9vq>ޘ)o>X__h})O<5Qb=} D9 ;S|h}DvM&gC% %)@HEL|ð(={b!g/k:R{/8nٽ8QHN8wq=)QGQXcFx]]NW!v<ޏjD__ dt#*>8ctÀ9?tۇzӾ ڏNt I _1 kgG{"_7+Ǭ<Ӻ>kNݏ-[ =h~z~';R1dt˥j ʬ)TPKօh^h=44JQ[d0y Wɥc !sE['}C0!}F?ȾHT40G.K 3?o"'Jr"sST?:oDi~X~c߇K(՟ϑ7S>̓< ٽ ('ٹTogQ>4M~Dgc9 9ٟGAne.RN4C ;jg'JΩ<4ON-Di]泗"_A{Cⴾّ̼OktʡO^tʧstހŌWȏNu4BChߎu5<&Ҽ/к59_Z}t浨| }gSo$J.*w>E3G_t-Ϗ| |[Q>P94ĤG:_r$t4P4?Ftrhܥ4LϩGh\)3?O +}齓of>|#Oiܢqsfi\v3*9wA}h|-i:L3Zf~~.*>oDGx`)wˣѾeOyt:HǬ1Hi}Vzyh\;ցG`:Z%ri}֛˥ucA(GcY!/Rg.ާy4B# 4O&rWA (՛i,O$sJO:rT_`k=tˑoUTUSU}ڠtjWAyUԟQ,wϣߗTݗ?BZCkr4>ɗK#/{!߫z(C?ݧ&sqE&]RUԒh<͌r|Oȥ\}ytϩrS;[U&N^y~ߓ[ՔKGWU^U[Ur(ߪ(Cȿ?ը"}/{W)O)辺ܵSUO=*/]$/_}/~OU?*Wԑ'Uת)v2B:Ls#*5+ٍO~o"Gw}U}Տ'׳Cr生OHr5Q7Q)Gϗc Mi3O%{uW&p~ D*:!%?T䗍@9*}%?VOS/ㇼE~gO'!_WK>GS!}KɞqK>~?:W.>~ 7W{.Hy#>|~q*{D~ܮ'o{0iO͟ ̾zf/?Lu_YF([aI'ooΎt4n23H= w0QLGb4_7c50r1 !?:hU=ukyJQG+w{-o~WC]娼Dr˧SEzo(w-_]Nz.?Ve3ozi}v>(]T\>sMkh^}{%u9!N;X~IQ9TN߫Z^9UzR{W[rcy~rS;)(rO|?ӻ|㥼*{"sKUWC{+TU@V_Hd}CvKrK^WEԿՑJ^/SxV"?NWߣrU/*/?^W%GOkO~\ޤ,G?_>]WU/s<{=*SUה*>$oW^M~*j*{v|GV{T]QjO*ߗ}:|'|*\>sy9קWlyr{m9ݹKU=/{DT޿{߻g\,OM>UW?Z~A )(r'~Bɏ WѺ9;_ǗGJ~&#$?O[ OsxM(.BJ~2i8C}oL{ѾzcI)i*g>GJ~H퉞Q:iR< O~.r,+("L |N~iOxii_T_1JWG)nsLE>tRILo#GS7g"Oqȿ/ |K~h];:E~ȯ0 >7E~\JEq>ȿ󼂒5SL䏍?o4)4#,s`9`:g,Q:AoǯsL;OB(c߆9`9 |y'v.έR7ZoWU|*ާx0Z?0kSX~?)'ڧBZ;8y]/75mL~!\?@LG~f5ӡitq WAik8 4J~3xKkWKȏ' &tO~2io\_Q%S}'IZ/}14E~-Ѣx_9c~05äsw?T֋ђu/4]c 0]g^লݾ`ѿg0:"{ƽ HQH #FiwX rGD(.&F FaG(l ۑH =.H"uCRl /[#l' c܇a;Q߹QaRF*E*DZۍܕR. ɸs`ˆ!\ iK)<6BT3A('^/ 3D(+PrMa9(6$3nıތuGa{(YRu;2nwpˆ1Ű?S8?&>DRx ĄSIa9H!ve!?& 'g֡, )01Lqr?I[Q^& %RfbGR J3}%a%7VSSG Ia WX.pJ^Rx F3-?y!k^HMOtt<>OܛPﺞ9:c]]sOuʝ3v iߵ}>1s槓w_;g8_׻ ۘ,rc./UoFM]8zNS)x2:LIVq4 )~y>,xe|uI 6:oIg]fJ5H/vXՅMK9'-[ n}%Xm^vx9vR&/w{ sU; Ɵ !Рik!pt^J!IoЮ4f}|a jj‚[(ׄRVzp3\[¡E׉}=xs7xwB^vp8pŇOb5vknÑ}{l#A/k G"}^=ptD\Վg=4U 4q~Qop<@o5&Zw4F~ki1D\긣g'v׊p"7~p28WN R.;a8rihcpF8ke}1WG}S?KA}:@ګ=\Xgڨ)\l$=gb5e-Tծ^eg3; 5<WJo~ľ4ߠžOًgN-WZqZ]0 Ɔ aNPzKEA &cCO 5Gu \kz};y-$?W|Ln|d-ZG_ I:?;R] R2Tnwg}—TifCb !u}6CjlxǧVoԲI>+F/iDӬAZ:<堽S }eϷMauvQ4'̮!D[xu٭];uŚg h fAQsϻAFa& ֽ@.L7@@VRSu {\:C17ﴌǀ/S|V=4r67[ܯy|rm^Z.z;9A^UMP`RIePp1V Y?N5q3лqaHiy.}5ml΂M>Cګ"@IdA"(If|<JJ޻Q %ώ$J˲6t];@ V=QJGkF<Jg9:JY POq((+U2ՅeZKBIHz`PrCgx3<  Àa0`x0< ģzjVUv:VW~埕4*iTrӨQMF%7Jn4*iTrӬYMf%7Jn4+iVrӬYMV%7JnZܴ*iUrӪUMV%7Jnڕܴ+iWrӮ]Mv%7Jnڕt*TrөSMN%7Jn:t*Trӭ[Mn%7Jnt+Vrӭ[M^%7Jnz*UrӫWM^%7Jn+Wrӯ_M~%7Jn *Tr3fP͠A%7JndCIʓ~!T~!__ /BmJ-߾*h+EK-\y+^-75uX|EK?3/_PBIqEv qa,^pjxފ˙ V:XW-Y)lBjj+Y]ƲO:*1QXE1x۳̄D'M`*U5A%7!H?z{Uy.C|ՐVu&U|[s߫< |U~!luQ:0X$~W|VotSؘ46scۿxOK\3 ?JlX[}ʧuՇѺ]ڣՍB!Κ4u]zVڭt[=ONp| Lj$Ό4= TrD6\ӱm̉\L }Sfp+ 5aL7p3LzBTաLlVrx5)ԭ79a oX}MoU=.qX`oh)^V jV^4@[w Z _dip}1vxzRc3*E7Ϗ?U rPwb[tUAO+U9h^Xjq ʩj//$Ni9?wjZJ%/I:Qۢmhe N*+\EVV˙kU`>CC;=1I> _ɞ#S ,~9n&[%HN[=Az#GrVWJc^Ub;\έiY`ŏnHC O߬'Cƈ V.t=AzFO@Wgi蚮 ,Xՙ)KA:n"HOҶX?;1 f^je䚮 ,X1Iޯڂ8*AP2Qlߥy''=o-[TN[|䓎Ap[+,X` FO2<N7-(Ti9Y`ů'=Az#7˥%7k׮o35-' ,X5@'Ho0gNRd 5 '=Az`ghk(?$me ̂ ,~!= f?U݇ P]@rM?]$ԕ7vWdxW=s\K#Ă ,~Ȟ`Jm68 /į|m4q#?eLJA,xoϨӿ "-ڒ|įU` ƞ =Az#eԩGieeAy cAn Ǡl!:G7茓ᘵs)|w4սYpPJ0ҥOHZN e鏬 ħd֓wⲌ}JA+pd?4'Ho$ozu nn;}ҁ˨~FKp>=g82JOyx8_6[ %~[Dgp6ک\ևCqs@85}P!9 '&Դ,X{鍤I7Bf/!կlZg -sPW(w#6=(*'LQ޶?ߏ_L<<QÏGutr@ПiO_ T Escm O [e9RŭƀsN:` f}Ȟ =Az#&4xtH^&)_Ut#J,%,2E[Q^{ >4_Z7eB+_uiOs>? <4eΪ~ JP?DfB8U/X`GYǦ w"{Xu7 ZGOyKj=lZe 0jl*')ˬ ޷nj qlBFe6sGjZ>,XwulZy''HOxp`BGǐ+P]st͌ _s)5 ʾ}- .3&@Eձֱ[MNvN f2^[65/Pr`틥NM4D Mn1>L2(Icѣ&wy.*͙k 5}~8ܱ\^FfocKm&@BYb񅚖 \0}߉ֱi}Ȟ =Az85#4!Գ.Z >sdw-͛gk9qMmg=T]iQ|@,Z6 n׫?LkScr y ,X =S_iX`ů zc򛆓?E@ԧk[/oYZ=E{LJHYq1Hr7>Bq. ߾2/}s +]9Ev-/k0Fo>՛K zl ,,=hb ܇{ͨ6> Ϻ(#G"Uϲ@htH[3ϗ;l o;+xgp U,7/VAOj7"{fifuիJ$[lF?2qYP7;rYvL;x ]nSႄ~<,X`wA'j}x wo7)N3/$ý.֫U-_6*po o>O(X6[5 Clt{y @l5DW%s^uIqFjEO@lqLg+44؍ҁҮO=_~&+Gw冪ãS `[KovKtJ@փ}_9c\ ^;*ԠO_ 87t}OVBuQ"z^Y`&)b_ ? FOH,A 7lk']ZAAí~ -x҃-m·f1Bgf?ʒ8vA{>eã0yb(Wi&7{H0K2V ́]߁"e+{/Aۮ ǺoZ z@+HY`1)'?L'HO޸mj"<Ȱx~Y p?m}c+-Ã򃥶 rk!d}v]퀧vy2l0qZfgto} g6k Cc"݁3žf }r}ſL|l{ijSĤ~řy''HO07LS| O8Z5?ܾM,dX:Ht-ū8?,H&7Z.b-qF^˜:I̯/3z.,X {NN^;? '|KpBĞî<N]z3>c9A-7 Pf47ix 5(okbl:-ZMqO)OSĬOм'8CzH{7CMh6WAalZ 7NK7FƬ}]=ĖoW nH8%d8l5^Usp{Ĩİ^sx4|N @4Vo 0UH:6>ANdO ,f*<,(\h  8Sy6As?\Z f8%ޞPK?%q4y.j׿9d Y/ 3xz&æގA=gyaPx ~s$>BQn珱h~*ӳw,X`+YǦ w"{鍋{x>?ƒvJ>y^ gS f09%۾x CΫN%_|·L(=ii.Ppe[wHw`eda/~*D~nz5΋BYP34o~Pܮӗ+,X`+Dش>ANdO qyCJHF@кx6&.T|Bݶ*۠̈ AVwjOx(ĉe1g5;bBYjì-?@&4j-}N }bn]vnCIk1xi; ,Xk M<2؅B|3+r :.[!pNшVwg𡤕o(?t|3~S; MVf!٥e(y8mM@jurugFXt9M̼'Ho\ ηYzC kGOP/byy;p'[ #ll hu}H>d8bv;隆~ЦыZBʆ5'_ٰ>sۚdc8@Shҏv~ wG絀+h0- ;nbt]=H_% ,XT*O_q[m3D f]kw\}ٝ g =q˄=ɺd](\ܯQcH}?Zl?>>kmpgm.&+Vr`ɛ" ~KY*Rڀa|a vn?K>,X8EW;Zy''HO0͚4h{gkBZkDc ~j <:ԡ0嫾bI}|utx|rngJ~GN<(|UYW//N]ywufK'ڀh^܇+WMkZ^@r(-pدoMÂOT;=Az9qa'\Ooѝ|HihYN T4^X*7\ꑐ<(Xܭ:pEW(-8xM\S;jxO;AlNYP|'b4}9 $x^+V[*QyF 5aL7 Uhҙ|bBaЋoEGf5)3(Nя+bYy''HO8irXG|L4d%DH/7m sGf|o !ըSpYy:?>kSg".tdJmYe*n8$_pm򽚖E$^ü-chm+_p.HgY2qX;A~8ZǦ w"{&-ŇÝu%mv㹉[]~ I yFᆜ-_̮88mVƟ!pE4Mtn&ǒ0jSxMPZV2yoakY >uoǭ yvſNM4D l'D{T6| y=&^1k0{m&^g1ˇ8xæT]NPb87>SY\˳7i?܏= ,XYP|V>`~'ZǦ w"{KZ wwhԺwsH]F;r}3R3(y ?f/Yo_D] mqJ' 6BvJ/˥_Mˢfa &_X!gEvԴ\,3+.\` r7v>t Kh'hމ ̺ ҇nhZI > EɎ[|%Q);R܋CgA٤@qc[/gR'(M>h iyY,@-~$u3aHr7>ґgt:vt@ڄobɿtΎOоXDش>ANdO`o>r1b wپCGy9o8>A1p{$߹eg Oj7"C/<){:B=''/ -8Jz$qzM2))ų8EX w"{qS^iV̳ȃ勇96J6^ߪvDEFO*}(Pr;{76c+B_" cRC5+ҥ̿>STO۳֟ ,~@7K3A|¯CN#OW^`)t_v4o9MqO))W:6>ANdO ^;6b7mKW'hۮ4I)'˂͒~B% s[rr&7 99/ m7tB  q] nsQ3W2QfBiɓhCާ+0))ų8E?(M4D WN L3呯kni3ϓXM~;x6nWrJ \U]Y j2h83[޴}?>|duן \#V?wӞL1G()lWr}׿9dPnzoAtA ,?zS(ńvO'31鏊gȅhYy''HOވp!tm9N-~;7]'Oc:Ӂ/ǁ T_р=gg{^P=,(oj,Xs{ _uvoCYJ][mFݾ*d~ӋH];7xmI WIn֘ͬOм'Ho$q rʗ:ע +]BW늡0fCPkPdr8^{{8?vlV 13SҚh,Xo$-Չ>PoOBf[?Cڎ׀{.d[ d焪@rԺ?1njM%̆~lIֿ\}Pd# ,X@Y#+i(:e}8*#?K7<JP?f\ٳLW2i v~XZy'ƞ =Az#h=RӤϤ瓡LRs(>..dԅ^]{0J6$)+gΫz` "-ڒ|Jo=n(w? ;l5ʆw-.~qz BϩMA>ocKm&@|LT8t;>QO;= )}K␫z΁b5C>@YG+ZS`>@ZZ{ځ[,vR^5X4||fo Oi/O#ڀT|ػ!=Az#Y  ^iJם^|iY`}wwpjsĜӾbQf}Ȟ =Az#aiaN +> ÿԷ ^evP;wO_qK~ɿ9?v~{鍸)wj+yAح v 3]fP&u8m| ⢛Qe>M7j}K3)_vp^t4׸ }bn] #8(lunr$Ǎp6pn~t^ CV$oÕqO1)WŒ@D~;)!-lϟ#Hz Oe?PJ/]ymɒiZA2d PjG7~_rY}?:jpg] i'9bVn1ˇo_D] ̽8xoCUOVh7R<;SD'ȯ8vy''HO0~l%jB٣G겔[{l;Ջn- ,X]dիfkOrBٸq3fΐbHP}md~mpu~pjVSE.$$7;}_ƻPܮӗ+xiG(:]Jmk4(NX13.J^pJ T|۬az2lNY sUBFNq MglquEnn1P$|YrU1FCBoTǦώaW'y''HO0qb7F2ꆛkZe)[VzLyµG n9Y` Ãl|Cjע;!4L=\]9zAYǺ[qm5.y J?ʦ5z ]=H_(UN => p7m8ʔ^ փ2W4AS|JUN%“ww.ΣoBSڀ޵!K$-M,2g _Piӧ@ 9ryWư ,XcUo&o} rFQaO<~CAxÕ쫦[3(Irt2p},y 87>SY%ǕƽҴq@s c{lZN~i|̥ lJ.3D wE̎׹-dO_ف8,Xq}7scḫ̌1rkK.V.k7aզz<;riaBbo8OmsQ~D ˟k fމ L}-gBS b]YkZ~,XIQ!A׳m|hR;}{ϗ'oZҢ4O/6 f}Ȟ =>C TC2>MiY`#vv񳆓_mӪ|7VD@+pw,& ҁG'.~V~'Zf'hމ 7 ]K8g zCGEYiulZy''HO0zChÚ ,X =Aza ` ,X3` ,X3`7c=iyX`ů  , {CoӚ ,X = NjjZ.,X`k7^3Q 3Vc =Azĭ_N8YŵMjǍb  {7+^ܐ+ xvzF.}ND9P{;1 &MmޓqEs;zD|QUM2Hp?]`:~F h0SCoy/ѧѻL7abq-QkZN,j4'Hoh%]!~ :núf:'m@rtN0VGhű`fމ 7o B4pN~:B|]5-7 ,X9`ֱi}Ȟ =Az#SЇP~۩ -Rz$Ϗ(IW DoM$>OҊOz_0p~m+kZ>,XwulZy''HOx|o1j5m/P吨_ٽ JO_ dc`߉vyl ,Xh0z7̿Qx+O=m˗~CEUm b iyRf ~[(oX4~_/ۓ&G 󺑋/ee:z "a:_IyN[¿[?,Cg0FmR 7?)׾$6^R>PF6MLc? '=Az#eY@т1sB حfSwKv!ǽrŋ(;Fho}}a~6ꁔSTצJ{$]iw=%9: k 8E}Mh]2;- S~\s_ӽzZ[h"cd.(gD`[d,m}j(*cs"(4ˠ,-}惋 B\; D;㺱P؉;nPlDD 62,A!C:L`ů&)WŢ'Ho=''ؼf(N>>u1RP_k`ԏ̵7 nreܰ5%<@jln#(tYqVOVnU}Y <:K>@&,Z;>* b،lW,`cSSgGq(arм'HokbeRq%%!5U,X@}6kY XXri*&>6=xvO0yh}Ȟ =mjȏmOZG Nɼopw\%?y7hޞ#[_gu/=Q2`絻zۍiQiA))ųqhYy''HOވ4oYaA"$]M1r^2}k|9AoViq[@Pt|~ 4YyPbD }'&*o࿼?%nPq@36y;\ڞ"'c/UyGh9Y`$&2n >wn~) Hy+ns?lپGmx,T~_NzoCKݪ>PSY8I 퀿X%'$Si3.6i9Y cQchm-lm9+2]BW3V^n={֤,=^]>Oм'{ͬ;!>7U iKwG h!p%0":..>i,-˛ ȄzC|2j3n(/x;F^;=`xy;Uæ\KůPhb˓};neKoQ2`Qݠulf}Ȟ =Az\7@tݝ@Fӆ]4!:~/ão^}~b![E9&$'g]~at -'$xjw>F7M s!^YMHg[iHgYCgմ\,X 0ش>ANdO qv:KpopސpS uAwFg&R/5]? %q|=6wuCYܘPUV WUմ,X`QS`;:6O0NhO qs rQ } /@²m8BQ~€{^Mׯ*4,Wg8[pk}]=(^]g p:&-3Al6zMc틥NM4D :A^poބe_ Mݷa!{sUY8Ns= )rU? ௞mmjm"J5^K;w6xB[]sY4(7 V|Tr;("*"EP,ؕXX X@E jk QwŨX ޷wDX3y˛cd~pͳx>S&]?Tmꅃ-tpPo@Vh^_\$;AwufBP@7=}x'Н=zq K{\o{nsvx~p'p xpIrgZD+k~ZŝK0>.Q%*(A rPd5> o[1nCݘ : = BY"@uK $s:/ur4﫯u䜝;>6O'H5G~ )"DyA&3Tx{S,C /:F ߰ 7-B_> Ey$$-]gvm3r] BX I]w҆,(0"*&Y^?oˋe=źX/b}'ہb;>6ٟu''0N~/ H[Xn :|i>_) E8_n;s^3ke -8Sci1ZxANgj{MEPm|xl꧚'BPY<<iFsiqdSB~ n !}:?6=~vاO`]quxO}lܟu''0Nn"b1֛$E4}5RM9N6)K@+@nB|(Vإ:^4?C\puO8xҚ XF5YFY[~AeUy) c.T7tn&༓3.)ws0G*ܹƾX/V_ [ ~%֎x{2[Fv]|Jx.^oCa\{[%ׯ k t 9q3.7: YǾMeAejێ z EINcN<{Y:y S6dM} ^?6=~vاOWUX  oW_"-rEanqƍiwms@r0-PI ~o?М*h~!3d`PAȜ$w:XjZ npwmlm;u( ՠC|ہYL>hlz^4ynԠ 7o$6:;yZx鏭{ّ;a>qMΙCe{|zdalj1(J}ݻtCF/kCeCζX!s]B(j?~ E{mOaW9P(4~8i 80 r =o_ vK1'ڔG_^3wV8շG\YN^F?WnM'p 7/<r̼l :;/gf<H3׬>ht:9-<6\e(U}oP(411GwdҦJ_7(b_z(zZ uj8[7=Gzn Uf.4u P2 pUظ?A֝08q^f>P$:oYzg'̲} dy2D\{p7 ~޼Πv(1ĵS( ۶ ڠ!p"Ҵ5[w7*,4+AR9qC6ޡE OYBmQ]~܁ܟu'O`7G8Íymv~S= +j) p?H\wi{WN r}tn =z!_2[x9ZwO mQ=aWo{}KAݔw?BI)$N`HW=Ɯh@jċFi q:9(l3:77uP(P:|ƢOH[Yؕ?v ?Dž^㙜~F6+<>|ƍێٰ@!?~&[2Wz (#Euҿ4P<-Cϋ0N|߰;%{S0dO,ƖP(<@y^1tkOޠrc;a>qFrԎKX1`lqW6UKP(UhՍvE]kF^]7zz^9;@׻N~ =<6XN}lܟu'O`1k JM9lfP(h՚~bG?Wab}'}qԧ׹^pPlV6YS| Ru)( />r+{o h/X NxS嚁m@:HS}?;S'8֋:X vce~݉'Hf󒊟W@nU%Bvmn BTfK _%En 2S7n֕9k2Ujh8c?4ۗs@q76%Ȟ|[7 zshA)wBP ⸵$[,[1\%a"?uű^,wкD ۫jA79u>] iw} +h4#aш(IxW y8-;ʽ\.nG.ϱ(f[6 $n&+C(kd~Þ#")>EV_w" rnsp`_ؠysC}ڰ'z> |'߲?|%7GxݮLۀ1+!c CF.q"R:ы/Tk0U@ZY#PuqeP'J= ;fӢ%5 $!{~u+|v>FzR5JuvF)UTVNR$\Wf[c`|Kh \ l-Oĺo6ܽ:[Wki? Dqם08q#i?HP &+XeôȽ(w8x8L{:qDaUy(;>6O'HܐJCz B`aP( %6=7kmP( zq B+|Ce-z> B`BP LTCP( 7E-.MmyQ( zqč-6̼@>gqixGP(7 lkKg96(u}hű]Tzu '0nnXjb0i(CϓBNJwa3X35&ujbټN/CϏB`>Aƍc͂wĂ$w A=y{h߽^yNc!Pںk>ilkP>6=O eG;b˪ҦJ*i$ʿ'H~VZ:zlOKїoR(kmFz~!  Rя R3úN [sbͬ)ԍig*4Ǎ5uP(Uh;l SGuKb Eսbfz!u'O` Ƹ-yA uݍڍ&?:F7P-9dڡI3z>Ju;a>q7512Kz~ލnf Ȉ8X"qE,`8X"6qMl`8&6qC88!qpC8%.qpK\8x#qG<8x#>qO|8'>qC@8! qC@8!$!qCHB5ve̐ ̐ ̐ P 3csflΌ͙936g؜3csfl,bl,bl,bl,bl,bllfllfllfllfllflalalalalal\el\el\el\el\elB B HR TAv>BQ*!ÓqDUDb=Ͼ} E׹++psӄPA@hKѶ4U DH|}Ax@ H UU "QBh" /C]( :,jȒ1P0@"p4@: TteL@ -hQ,hv4$r cEh )" EB PPexi@ Qxz 3hm}`h|$E*AUD94j #@_|>Jfi@>NU*Jt: %imk|Wؕ@h|@P4iT"ܵ_p|wp^=QUgzTQBTI@Pz oz}0{_fJ^K{5RP(nJ4Tx@&&L L``M#Lii= LSdє &i4M4@D M4hizdcHl2654أLO)i螦MdzIhj I hJz$H!B&3SPh`AG  4FFh4%I& L4&M4ѵLA 2hѐh h &h$&h` L 0& 4h4i4LLҞ&M $ MOI O!0SʞԞSS2Iɔ4iC?JPzIz@=@@mɯI߿E_^tWy[U?j%x۷d!Vdl}7^pO^]X_%6'-Ei5ͪ`5Vc|95һm~eLz;B i`T\!YIa&L̆CLR,NKƦ%@!3uzDDx2:4ၢM*iV!\ekQ,Ej21>*-S_Z;u 2Kjdr2r9 |ybÊ8x06aAI=j`da:z̪e"eAOk'QJhM\f[2}. ė(۳tK/S6iM֎ﻼ}ؘ1yxQۯ >]4Ί1n&s֗_FH~tk7NO/[Ϗ|l5o0;Y8Myjk5ߞs'O-m_G5yk%pN iՈ#HTۢhvmǩR],?l>zX.7xǟyuܺnOSs^[syMINňgU`R!#$Mݛ=D"'L7`(r|'V?K4ǤK>ҋa烿Ζ!Ǐ@% /WCHDf'2¿eH&Q |X{9;yVfeC52f''j >IĿm "gvr =P?1P8gQ\$TEYߊQhiEPAn FVKmZխZb 6T1$Ł JD u!@]d*b"YAdUPB%FYl 6 sYT>/YE*ABW+NUչƊcXh1[^vkGb+_,ۆ-)5X-cV4HF]^iV/Eld,DҴ Vyp'TneAK%[&DK'Nl<#Rr۹rYp  e ӽiԠǂg c"~p3n~頻́5E&Q9.&m<5>:t^+Ź}M v6ޗZ_Ӊڼ}  sױn >I.kG\rA@u (YZF=gm]\'ixZזy{'4V=#|C}ffx`DDsBHl]D(A-ԒE5 ;\U^[^E}kQMLA0 \ FBA}TcKM.-k:տmo+2n59&vO?= :7.Mzio1|[n_ z߁ԏm7σ평V~åV;ߋw6>ͿƬlY7m җO jORbȜl L aJN>qw]ݭ58iQAškue9߭N 2=3Ho=/}OI<, 攘'BΎxp).{lgNhu3;)hQ _ D$gVk\y[+\q,a& )PR "4E%(;Sgy٣Sxe^,DWC3@?ZBy7_7.xS_|}wsa~\>{;:7o_*ƾgymo&m<9Zm^wuq?v{Noikt;6;,{tx B*} wPAELpEt@<>8>t@ـ@ @ـ @JBxuEIp+y2 jd$/S>?G\5,">ĩ{7Gc'|zfe[QpD6|l'X@npPyYuQD6Y #v0 ͻbq|>A8Ny͢dz( 1׾"{qfG;/<%qAuS SԴﭷIѾLl"̛='0@Q;ȍ/yDrQԘjX?:a Т aCiU)T2FK\ڛN\ 3ALHhvR\U4 :ؚ&eSyfҹݖG﷙sMGXar<~f~WM=]ۮBEAr)DHva]Fۉ {og(Y'LРTHYƴ)[~cng\SjB9L&} p(3JN` 3V8=Nv@DYZ{i% @p=M!dL LC3do_$jIf`'rx !֬ E#*y|bG;9S#ieQ& (~4n>+x: }, =f/H ВNS RߴM`ơ M,7uN/D뾠CravTdν,CC9K&Km!]þ+-s\7*(b(yr)XFL?pQmI YL;{G<+aF!,Q;#[MqN[K~hCj>Gۆ?3㲹 "OL=C||IG5PN33\S/ĎDMsX=1<_ҾzG^nQ]i!؄@rGZi|XDwjDPG_a4>o= Br9|+QDZP `룓I#EL1h ;Pd!d+B}-H/%ɳ+fSd&ۓG#MC_NIFB$v?#gծ@"͏v'VgF֍).VX>?$~%d6u}N"qffq&kSۙyCټ۞oKvMɘ *-4 蓈l<'Vk `hq琉\ȋYa1d#'׼zpfö3zU~xvm$r`M!K Q a\&:8!BAQS OY-dw"/9i(6; bVVԌ͐X -#On@8Zidn@x3r_uY(zINn:EnϷWC">F["J.+jLȍ$[%"@LJ%O'lGg6\5e :z9g$r}-`ޔ5~4+zg}|z5]j=s \xJc9aPOH&T"؟l$bY!pF0 eC1s_&$id52 %`􆈲G 䮮}͊91gBx1qAZࢂ+ڲ>1ѿtYanDx8=P;':iEs Z)lloonkpξ}q,r_ZH}nN5Iss*d9NQdAl<\gD+>L(#)29axRNܢDrJYm;X[ýO>gP'ng8ɨQٕ7\gpE9_=FL]9zcGȝr̃fgJ`4 a vlrpi@_t4z6jEj^g+wać#Fe8uvr_BpOMraPl3hu뎜b9ۯF7nC792~LM).%H"B5ASa]\lQ S?@DO0u"(S:8y,=2dzW$itL@e@$_BH+ ,i;BC@SqK>,~Ēg/͘оCKfsԖk/&yXG=\[l$x]SvvFOPU۝ܓ!"I!* "Q,0{\̩JP@Cyf.D߹YaA:[:H[jwHV'Ww»Q, wm0ɲU?McbϥZ6eR9K9Ga'Y픓dM}/7{,<B}Ֆ^ܸ3%h`W_K[3 MqV ^ݥ:>-:νҌ : CKeZYCz52$|bsfs\}2We;, oB9É~9܄a mR0:YF-H2J#Zq/[G$$RfNѬZ.WM\ܹݷKJ ؗpܹ.݄.w ww2pnl  :RI8PjÈH { ԷI/)}ZUtɡXAcOE,UEVBdZBAɌb* lF-%ԖTFf#VlmDlh֌RiLj!4IUVD&dsي(* Ŷcir!  fAH2d#dI & $a2IyL.4EVA!I9 I 5H1#K+rs#,bRI-wuޞO2#\4chyZzIs)rZ$iL$T,rVA˛\!" F)$H\\]N㓮Nwv:\\wa۝ssp8:tK.s'Wpr˱v똋.'sstvuPuؒ2! $$ȎE0$vnrs"I"HB.GT2Bιwv{ݝp\p\sg4u;΄]v.d2d ! "RHLbADd]뮝\wvnh.k]ݵѭhѬʓo}}z/.!11I Db13秧w\WcD2www:W!stΎLrB#"E$IBAd"F.,đCZ~d   @)ѯ/ont_h&IWGaDT BUUL /syPG3B9Ku[s|ENN L1m-*/W/rŻvQV-|XڹHֹ6bj5Fhzr~R¶\\.!ѯ{UXM4mkE DIA`> k- BHP,!V~s'邇zkt? &VT9B((%o*2=UdnAֽ7>,PkUj!KZSi'E_9, (dL֥ 3wzmצ3mh_ ĺ$,`] $n[P'׬g컖k3J!8Mqv. x'3LJ]-eƾsíPI_Zi+ka1ÓAB0DA}Zm3?n5Dz[K1DC311 C__:%_ߡ_NA I7XDTij6h-3AD&"ڒ)27mfmۿ/{\ɿ[ڕյ !$#$d"/2'5_@O*D=mq"$և Ir6,=! !FHE2 xd@h*:"/ ˋ$*ο,im :7f, gm3T` $$)V[Tjj-ZKhj6Ā"ϑXU B@`ƪK>W>g ŀɖaE?-T4ۘ:)wݺyiUozZ %#% XA93e4S@D(l$d TxhHiTo xm滛xGtnXdeYWk{yFRb6$Qalim&J4&QAAbhH$$aI`A6@̒dĊ(ԡ4VJ(Ԅ"H X$CU9R]'lm?zVm)TUOSvW "!A@=˻,q_g_Jyh}CTɻE{=^Kw CFՠʩ5j^@O(Qʠ.Mm"R HFFK [`"4jsRsb#m߉OGPwѿu!&_5+>\&d3E%hYhFF1S=5~5OnRVJީDsމ MչwĊ.o$IצѤ[:^R;SimOes3H:R2FЄ`-Hm rw}E0L2F,iK0B@T =΂?6F8EUYpHؐK$obX澁e0Mvqp B=@Dhg6i"hUR2}&?q?;̿H{ σka+2?y6@>~k7PX)"C() .oA >O)4[يWKN]V6D~0a*$I&XVD$! ϟlQ]z#).n7-ёc"Qt/^bDQ廯?YgRdb~3$*Y^/hrk.`E|ku/ǣ#wh1/ÂOVAgr=z?=<$SJŧpB e 8-3*z7)C.d8! R[A4\ >s1=+3=9#@pqR6m5̤Ж |)/;b`2;#gk|+'dwT:v&[&,o|_pa=޿,1BGa><}9\:#9ouN~Dzč > ̱i @I.8?yS2t8ֹ~xEyݍ]4fk6co>ԒZ|mWCYW\nӬk8gBy@M'Xl pfl P啗ihMK i?\>92X8=9@hf4aC"lp̌ [&'xҘ>U$""0#AE!ԠaĄpťHGeX$߫HYa\+AVrb (킭:ww4S9NrPɋ"QQMf L#\l}T3@$rfY *sRJҹS%ł֠J l9|` B-)%j&t( iN69kp*!I0H>y.Ji*ino0Zʄ/O:|/bH^ʶZϡKW7ޭ4 y A2 V=<'cn@ Q_4''jZaSI* 9`O#)ltoFX܈umɢ^M4ӥN[sklߖmF^{GjXl@D2ڎ,@@ШSgc%Jz:}ctAՀG-@d$%j|6]SF;tw#XoTK[;Z+ RPjY,'Kj<@ރB#*SxEmcCdUrរ[xHa[#jmH?0Ho3,:>M|sYM|J <(|C4?'oLd NrorY.b1cL k4.A;1 50ȴ hbe|"]KR gs6P("6H%∐Z͊[|~t4|Y!߱pr H/?RGD/#C:M<({Qt%7^KHP$$$d$ddd>%MPpx~Þ kٽ|b,kn' AkA7;[BtV A G,A6 dyh ghx5ʝMPD`z;|ȇ3Bf٩RUZZ거&uz,A8QLցEɋwKh;9`֏oM'V9aH4+/N}q- :ԐhP REs1EQApϩ>8[o3Bj=9"O\r Η;P8d9vX)-MP5VLsc:i$rx փfEzK#b _?@|\~R\%]U9t,Myͽ_Qwº^ &T $d,m. yLA^CAG In-hBCeD"w}<z{K(" &%U yM&[k7:+{TB5 omf%*,"!'W hGy9~1NZo`g'uq-ux8T0h#tgxW+BcpZȵ#mr'u|B[{o 2;b z \>.wYag#qҪB;Ң˨zqPڙ)`E-0(j7F;Ͷ6 qoQB7t͍B^{ ,aم3}Tydܮzc\s;[kZq"m{OV+sgơ v;.womQj8Ƣ@7[^7뽗?yD䠠g@웚rH? b>P>'>)Alx% "(l=|(\P[V>eKIȘf kog122TycҰ#u njfͶw,}[<\2 jѸwIdX+F z2ە-p2bbj.K JH+jQdi2d">0<t! 6HxBB.2XO6 SY|҂zgtc kI )` pmtƾSDrvuLLS nmti6gBƁq6+dpjTZpVxa=N]J5Mj!>lu Aףm9'[颞rvvN>,#ޒ;"hv2jуw<'~7OP"pC9m :);<%# u{.tM` 3M!T6J{K=zOxv{'(*QuC=x- _}B` q=/kp=`:т9:OG\{l6OWl#枯/y>/lm)gZ(UCdK=HZlԯ~:%op %0m[}o^mb*yF4 RHXT] O7&q y W0Ť)0ZP ̇4d(8wtܬ6-FqjFB)l]r,‘K"g mSa s.fɥc?.0l4Ʀ(ԆѺ5R#,Zɛ 8>wVhOm{>ڋQ.ǻQ]́ R9cg?Yuq^.6LJSA5*'Ou~w?p' \*N:Yn_-?c[O>8d mse^-Ou Nv7"s?odi+zcszTy6$ӕBS?n[V;tOg'~ :]U{W)=%;%^l3u9325^~ߺFN] .@l8vwN@%pyHD3+hI <:p'VFik6qdqn@qCƭڻPFqMW}Ү\}毴/۰W>*}duܷhDhS-~{lݰizd4++grvNEbMSr{VI$^8Y 3[^PPlLS1mniM D?Jb&u wL' _^&9>~٧oZSF\ON4t,یj>7xNx=Kpt9/ǯz|4,iN)#qxlU-Gf~庞^6t0lB^ZX1>_x,D'c¹~=ɺȝu<:U`-i ixLo !,aߙۆ!ZKI _pe,HFjf% !"@#:K!D,1N#bx.N+41پǪə1mϖm55NݼuzILl#r8FNc)| J^T&WO{E񯢶}2h bR[,$4Pkn_KWR;s+.v`kph69]9$)6#E.эtDG9{ MyW ;\.vAvuw#2륉M2N+IGP\:]uvUc*Ʈ+˷G]v;&M=`bɓwO;sn{%{Lfytw]Gwj)/-͙]pub,iݴmOWwp1*{׵nuk׻[^wvZ睩jGbi6זuݻ8 斍-ٺ64r9.YBng,kSSjrbW1ɨ dFTȦͳk|uh 5k 0bMZ6-ELF6ڢՍZ5ZEmFֶ*QkmF[QkmlVTZŶړEHA&5-ct3s{̾2TT8E@9GqĹ=MVa7q$N͑yɨfӭщxS//$M)2rF $]N*l"YiB1Ie2(m ZF&dCFJ7TF:B qアbRE#r &nD3!Mm(&rn4Nn[. FcvQ3 .@# vbom]PfUFv("^n VLgq3$C"b -)sU(mI+a+km p\I1iS okmALi Y$W!Lk.8sDQsc uCy D\:5Z@}y{^5%DjthjQZZzj8k[K#nỦN"njTF2%]ilAot0-X)9x`=U('1SxVq[&,RBVĈ7)a 2 ݭ6ت\D e!wt#p$,Rۓj47Ttf\neʈ\o3)^`]a#Y^SEZUXdh0ԌA9VzEřUY(CgwL1LۼɊ[P @$TdQJPCGDR1ѓlPZ[UFwUm L^eQ^z-&FFYSWPB"$4LX*pjK4\iRJfFH#XLC0 wl-fn3#"N[EY-5lΦLHʀj7LI]Ǘ{b/fҍ AbIV  r"t.?=k赵ȉm`Ekj6hڋUhѶ5-j+mF5D!x:l; n) &`" qqkh@ fl @]bb t۪^ٔȦ` "W5ce((5MDQlPи` =@\!c@( Dsv(6"D[|/`|P厄Np"HH(Hߝ-e(8w@P FZV@" )$" "p "%,XQR&\29AX_e`Wyc6Uc+h/>ΏX%,#UD$>K` { 9={o ѹrUяZ9B^lj!{t8sːs*5¦ke)x 5CNX7 @4OPp7f<}lkY"Ǵk{zLu.gs7ጥ^ގk\fL.Z(ZrITQm+LR.\L+$Up)!G=n񻹍2HwN;ə5xQo8F&d2(VU b.Ic+tnlݷ;E\뎛:u]uӮ68 ` Yׄ g)A6| 7l16]^Lkn[[rܭʪ.FƷ6Ӻt 0cBIPPHseσ7,WUWQyXfւE YP6yx!1S^9zlӅ;g&i46s PL IbjER^&H:Ky;kvֹDowQ&ct׳/;WBrgk+l*!d IMtvspjʋ/MŸIFY28 2̨[!BB"Uq[L$pV؉\UlƐzu ^mڎtK60#iw#Cv!W5\{50EaM%B-S@bZnnQ76ګOF(m=#o5]r!0 [TÒ7 ,ox0V`t8& GCvm\&эgrr0lln51T48˭F YB/5p(lq>`*zןz ~:h( N䞈\?D|>e,ITT!V-\126 X6k6AAKFHb4GpfHbPlY]2$ɔHPɊIþ .޸0P4N+Wq惛S0F,W*n-EIWWR䥘RwnulS-wnfĉ A7]V.PWu*TFwMF)Vh[s]lTTT&A1s3e#6,J TDd@cHm`.ۦK`p}(1 [[] J/hCwy߰@: : @ 5D; l@lZ!c( ˚'dL@z:@`wz/GNg#/9NA2tc138I@D$_AZ Kh+ cz9($HHma^38O M645JMw /Al; ac'@/zjk!T$d`Z6n'kT;J2PTRNjP0pSdM%]ۦɗuRYKFtV]d֝ҔRHk\Tm$M-R-䤪]4 M4w]]S3v+Yhpn\sXUZMlX+@EF CDfq5~;_Q5&e F&XΓC6EBWt. dwNƞ fB%.KPiL\``Nmev";rr&FIO5nh]̠Cz?,d`BJbBF %J* "v<{'0ZB* {Ǎͽ$̥rM,+@#4S&2bł\b$X7^FPfc*Kh1rBˎnې]\PVf6jwnFmLfi˹mHD$);tmr|@]=}=}xÀKb77 i{Z1KLb/Jtl#$n3u5]%'L9MÎes$$t !0Gst2aθ{`4^p'e¦( L$]]w7jg]ʺ D[ǥ4cYMt _o,vv80"uZ334fT_zM $T^`DA*)QKEQ _ Ģme1SƻSA-5]Z|*YBH* &IϷɑ`.f 3Ҍ$pt衭Ƙ[ّVj /\+N .E;`8D\&$q+s1˺"*&2sL *6/fL]0o UTԦ )вZ3w$$rny 5r.ES $ḔSu&w M!m0 s+DLdf8n̛Uͺ,&&I$J%'–F\lȠ*(Rd =7{t,Q;u6fhs#\] wu)2fwu%f Hܦ-rrevSYko }4vK$LD !a%bᗻ]8l黮W97snnt@ 54wkn\7\ru]v\.uf;r6.EݝM%t1AI&M òc]3ny&F{\Ѣf$MDdI"Il`LLK5i鮔NO5ͷ^6*kK^޺*Si &-&DczחݫǻEQc{=tѮu\EӐXܼŷ6j&2i6VŨl%FbY 3$  LX2QF"c(I4H#+%1 (2(R 4l3&aϧ~>$ ,k11G$VfD$!pi(\60\,a,!Lʒ+a+ Ģ`E n@--- O)C_Ic(b D#5f1t%L ,5#ܬ nYI*pjRqUˢ"CݽxzVE* '{zc6aYa!k$$ )h/u7=|*;˯}$*T a ۪(fe#B@=u~sA! {~]h. KFh*$M&lʱ)rث+iX+!&i-4Mlq4p ҫgD$#aH⢊)\Lw)s&pyyזu:r%&ɈݮNΑȝ\qY,hrJ˽{Tk\FƬ׷=`gf_[IDGf52ݜJBk.tvk!'0u4u+'RJ"H@!CGM]Ux_c鱮enkS4uI,ڔd&sbk]mAY dE@ u]0]DDǾzCkئ!PVQ/|u|-9 s%1*`"aiwqN1\P+ag61@b{Z*\0)E`8̐3nkrjYe(Vͦa*DeH0`$p,J#c+QRWȼD{zcuۧ.˫n"[өNvkq2,un닮jbZcXl1a 5 iRi2")-jj+ѲyBda)! $bbF0m>luYx+}]v>gDj[taBqOJ@ dDbM-%Ȩ!$ .s`g%0 !!SK,jX7/d4Z! GcM}/) d_'~q $ @hb3w[&7O8Sxmv*vVۛ2R+%-4"HQ9&LUHmu+͛黭Dmu“#$n;LvӘݕ;brZs ѷki7d]9YEmӻŠ泴KmwtIKX ;6SR54VedʃiS1R&QSf5"ƘѵVْSޘ0t$"[4'n`|@4+CF䙖WA3MfWP+ JFwb-Z|ӟI3$1FVa@QO9+rꏠJALz_ܿ u Iɻz4[¹Ju=21\S # k5m-nhж $PM m83~K)$Pu/޹Fۼ"dgSVfysľx{4Zĕ[6lw?5/,!/rYE0[1e_%ơp'T187-r?$~9tHjkmj)IFRFֈS-_o;T‰NZJ_??K#|B~'y_QÚ` VP5u9m6niڭ0(HI3p6z*ɻ{n*(˽٢kcڶ՛:Ō+qeǗSvo#ٗ|?n!%ơ2@4 n"dێ*dx+>+F^]gm4bY?%Ёw"yn/L:No$ $Y=ױ;WfBWkbz|h_Dײ,Iwx-N>ik:вnx\QK0{8BrυY?|տKJX]}fb?Vϗ3Ul4=St3{۾#c(xȈ1:>NƞXa#>~?DZ; !VuЗ]'V%Y`.ױS<ߪ3|5zWmO&i^\=rAbPѷЖ4PF:rŘaӳpCFQGX暏~O`ͤ#Du MO:w~;aEVZ4Lou~o뿛Wf,IT_}~߃r]TBZa FH!5Zޑom~d:nw7vddzf&(yk[~oy[T-yb=iīSq[p`<.M^ܽ'QpR !Ûcg??i:W3s9|yңm4[nKfn &p,#$2T P BC!"[bwOǸ@l t =ZcwӬt+ [V-Pr'=׷ͲqBI{Ӵ\9|>&^-'ž8(;g|Qco xP&yqug$26cuV>4lljfhg:!>_wԡ r&%!LPa}Kڛ&sS^akL>և7S6׫.?WQ0b 2&ܿχL AkpWmN}4Pu) R21/MCIu͔V)Anv2PC8ʋUy+n27EVJTd^M.Ÿ{L! %uj෾zjtx/,*VPDW Z&ŧ%"MFfV!O) P Fj#CNf-3Y8`*mnx~gl8\6K|lzTICp euG* MQ,xvH[hA":`xt 5(5VmpWhi^3f| ]9 ¬l ֢Usy̚집y6;S\Ak+Ts*/!!*b EOyߛ lK't_ HD rphq& p͌wۄ%ՃX,5v cMg2 V`h_V?|ubUB7Ubi+ta/~)RkC }*pbE/}m:"'^0(55gx9f dO>'bVNS>Ya|ly[Yv]T#NLUn uY+ Ay~ޮ\pWS xZ'9q<^۾|ڶ[mY3>}_\0A0ɆJxЪe0 G9f _XC"Q(~ M`b9D;_=H,.9GƶT6`RyJZQ*jr"S>.z>_Pܞ.>gMEFROWwV7xxc_6>鬐G3F$ DUcY #j0 )&FbVHF4FU|ϫhlos#80fڑ\4у~sUS2ACb(dt! Tȥ *fpm[AMqj@Xca"+"F+qumd٨Sק۟bxrmQ(AR1~%ub,hⲩݼ-W#FJQ(G ""4Ui2~g.3,p;^)폊lh_F4UB+Sz)r1$XZh(`*pyJ/f ɚaɭRDun88E bLSmΉf0a!Y=HISlT]W?]uu"|YQ*ÒϏGwmp;ǰ$䷱ ~'Nc PHk`Eb ش)T Rm:cV{MFK}J"{G=RW$k!G` TՏ @nS k4#Qy -RU,f r-EgTߩGmŏ<l/||;Hp^To\s\Dq%gvzvΞudX`t j / GoU^r5poe;h RZ_4n.&w. EA5R!iv aiɰ9 W: Oҫ쮻N"bb6^>18}ϕ ~*U0"S[Փ\ 2Z5 hR ͥ"+x0 P9+ vC,u+;r^ gGls~!>Ѕ&"ÅlRIRȦp奩^Dh3$27,Q[5"TT`Y8D{<#C7U,\t"0$I Z"8<%}_^ϯuQe-s*!G~lTz!t(Qq/B1P=z. Xo#vw"LU)2HQIȷu.mjEM:<,Z e^t8 XǮ\Q~e(C&'/ ht_ƚ%T:'(b PZnr6ZP [B֩eQ(E})Nwr 6~x0VE/(胍폅5&AH J uJ)ڐ[v HP_83KyW& ^ο`ӥ.v.]푌 bwF21i#5.Rt[;)%%5C#I @J5O:A7rTDTZF"JsRֹoQjݚ~)BX.h6ŅPY18D͘ls3!kc.gן:O v& {Twݟ1mc2EE(ט>n#YM 7hF$ 6ds>/Y6 ցţ50"+Ta% HЭ.+Cdo1^f?F琰qP0R=usVzO_V1 Q6@ jVT5" ĊM2B}ۉUg{s] ӺASh)\Dn^Mӓ6O6 Զ#»MX(O5}aǷ6mpGFcډgbTX0TXL yqQ_R ?Yֺ-m?QGGυ'WE1FntX+ Z.,Wt̖&p,@]?oe}F.P d뗌Qc>#{ۓi}lQf@'bOJ_[lO$B9S)%LR԰ S2eVU%uWs* @ !L`k[SQF =iZ!㙁/_ Wq.!V^zъG!j+t*bf.f@bI7rMT |x" 0aոiΡ )Rjz&X5 6WkZ^4*xdԠ'-.4Vb `(c E|3 K1*vTJ@v'Kes 7qU*RjABgvmO5Pb{C^=6FQe[Xj[@{٘lBO3TR\똝P'Lz#^G^wX;(uS:Lc{W%L1UEk:Ԑ(r?\U\eTPFch"6oiӎ1TIcDYu V ~9;~jϜos 6Q jA+?34z3xc)j^N52 rq†^KYD([Uj'P aV$D DRzUw4W3"eVM1gXKy57O Lؤd-j&*7L\o~fm5(f"DBJ:m~.ǪX DY(N16:3ΦGqn^7Ӱ-kP @~arؤlQ@e"/;)x]AUtc-;} FEs fO|[w |-XI fS첩A>sA%h@*>N.̥b#=`jeiS[l&^pn^aԨs*RU+:Wr E/A iUZUҥXQL|yLVS51U6"S*@ЛsB#rgt&ZLN(d !Xw֓ M`qѲ8N"VZ RW(鸖C鑃y~$Z*xN I`eBpZ4d.~jƇwx1"T{?ip0eC٥c~O3p%RAf?] /nh;$B\iE[CQZIf{q?xKW/)CY}'M2U^ւdSR-@$+epb[P;S\12uP_8@XmKr5EnJhsM&|)H8*x:~'K~}ϖqlȪpȄ-y c ZqbʨXЃbH7?;[z#XԱ@Fˣ .N/z6 Xe"B ZOUOHj#K7^:]ķ7pET7WPd!*K^9>BX> ٻ<_ 1m{5hIb_!K{җZva4`;ZVY޿z5vzxrrSAK*i7knWhi9[MĄ<~-|-6ʁ"]#^.r9=7V{Qj7__gYob/imV2}R|tk `ŃCz]kw,MWc%al}[׫ zthМ^u ku87!OߪV3 3M\{v3%>j?GxŒ#QDҜď˒* itg=>ijrWE݌~زH;n[slT"y^R>ie]g xa*쨂 õ31 LDe.9VSP6i+7\%/FVWF=7[83pHu%A 5MZ]kvCou>bĄ/ste̒=u5= _ va%l?aO rxǁ0*D?;*U貮C1otΊ).(eۯ5=(ыPNw} ~vxCvNɹcY|K}.IoUp{X^ܾgCv\ k?>sNVfu8)dGF[%-q.[KrN!V Wg쨕O}Ab~lG ^lNj;Degw%xE$qt\_Mo!n>,?G]ͤT5abD:oԤzu*s<>IzYFemv>T)g}^ý.w*Yw#Uũ_ʦ-Wo}o?6˒S[5sNS)w%¦^ޤޓ6 v濁349x^S J/xM¿ R\BEe%f#̓7_e>)eĜMgGp;+'mL%{P.od8uDH~?쟢{gըΑv^gާynlsh i$6Ǐ}/[6'RUjqw}^ v/mevlg]_?~r%q[7r?wp3kҟ[/-N/*G 0((#Kܮ~%:#VIe ס{LJo38/nm͟/w%9`v:UWfv|0v~o}y]}}m}Pqd7y9dx\}cԃe09P5{ s$&]΅[D(d& 'UrේQZX5DmGk &Ù&M٘h&\ 'W}7q%h.">*{㑾UDBraO 0ãGK~~ZТ{ <6LD=ɗ[m}[>q~WLydbbm2܋3[y}rmV ne$+8F8U#qɻ7ͣؾ'ƻ+U'jo!oYV08Maزgͬ i.K󗩮͊C^UtRࡸU#I]>[ kaoMjaMEf\)^ש hla MT쩫]ۛ];\;V1j.m32k,[Hw:N˰}aX&`_0Cg :a?>tOtB]*ґn r D@0f eL9!@zy_A}((oGr8V<nI% <Ը~7yL:X5s;iw]v1 d[4 ^i_^b?r_s[jtdkW ]N_K+.^݁Ws\*hb>eKr>U4@EtEwj3r_]I`LsV. n)8wH&GɐU0q0E[m#FL 3-D Ә Թx}W8lzwMp5sWa=j jI/+an#uTW%[JݳӫvQZ8OR3i[UZAOjfA$n9m/U붺Zpq bbAcB"eLUj*m$1i4o0K)iS%Xv`Qe0M:2k̡ RC ³p *`#¶'D @ 6V rƠ–A@ Tā 0U"j%g`HL$`cj'b·5){_uTFiUŒ쒫 H EPbU")Ġ,ss P. x){ _aBYy]3Aj%7]Rc1 `YHhfq{.¾^m7Ud1N2UҺ}bέ}3$軛luSDj4Aq2VO8R+r=J0UC3"}rO)< BENڸ /sM*Yԡ)1o{mCaP#LK Dbl;SvlBA#;x;* ܸ.^&'^|yP&`s@kp!hJ6ІT Ş8 e18Nm !m\8*3* œ'a#0'k( XrAҜ^52eTcr)]^yJޚDYS~ UbJҾKL.\vZ˞γ`-Uc' ΍l`!@%e@ 3T,\eaՄh6͢A)!j3J*%AሀΞkEOdΌ T c b"YFeNYm"[cHB5kb ׍ =G!bF> `3;u0 QxaS[;Q)IMR-b+8@+rdk9Bbe8*Ux b P 2*ₔ!56Ғ¶ެS,fn5dZxT2NRIDKV&%+V3mnOlf1O'U()V8T@"[S|:BU32vxn J^iDtTKp,Jq @qf e¥@"at )"A̦̐'aIް T$*'K"ĮZkp~wga>Y1)R:Q"0$#^{4FoLVes';Vs) ̫'kLSTvEF6w1dtNBەkaH2zRfJIfKt5ea=TꂙZ6 2ώ#~# S$e9+RYQ2FQ6euW#d`2 S BZ,@T(bX{/FVp{$.$ "Buꘃ@X趖q)+ -vʪ1) AuPtG 4O2O[]5}!JNj,:V<2yWR8(\W(q(K\(8 ėBڟUƣX@#ЇC꙯`xWVcA>L)ŴR)w^=a!x}֤]zj|O(2|'« GAQnHI=.[Ozvm96f隓L/%pPPgnNm[o3չYt*o %j2򡈝^TO f:%6ƍqt x`   ځCSH*6lh|c9Q\ABEt5XYຫa۹/7>NKthn:,/~n076(l,o@ 8e #^E0N9Ƞi )`*ǝcډH+M,-u|>[0(y@awǃy;2=]Кpn\;%`r =Sas.˔*^xf]SUSQG.H\A YW;P=݂!@!׍ylۻLN1(IT71@Ip'}K+};]XuB&bC$72U}Zgq1)2Ȫ̻z(EI.A@"9ЦRIJ4j),`jUkUkZ> 5-bI-E@)ƊI*5[Z={}aΈP.fS`F-@UaL: ʛ"̳:\ m3_$EV1"ujzaDx *J",5 QcCTՈDDT FN 4aZb͛AzX\b&\wK0v׺{#ه-:B)Yֈ pxҝYqiiإ$ (wDֽkS`oPA`B`%@n#$}:Pz-Е nJ>J\ݭMdE^'m6PA|X (pz8H4<эէ^׹ W2Cvaĺ>7 6j^3Nk񼗐zv7xs[ Sj2Ѥ(=)j^j"֩!PmmQV!4h&̵} jvжڕFf4-0#l֒jH ǂDKCt DA~X -"n&~ xހ 84oEXa{&s5ƋVcXk S(Xozʽ:(rT5UZ y4,X =ܨ\jt@8ٙA3HP M$T׊7&VT7M(;Ha@ !Dh(`E. fR |c"OWr @M @;Ohq[36n]8<o_ Vt~Z/%;[`/ m ;J\UtS F;p;v 3Ӵ@ш)ǪH7`Hp=&458@ޠBmT<rQna45TJP3 Ex؊irhbi5I&)0.'g&O!d+gt`Ai^V {G6 WP4(" !mܜ.B5T:郜Q1ss u@?uPt*Ps!*M/@Ktn@#{Mt}W6&:M͸]jmFbDCv8Ai*3UJT܀y 5'XC\YJ~ׇV^C躎R{+v[R_x{Pg=P؟ps+yKI|\ 2H,78zpŢ E+=bm|Lx;!"@c#xQ8Fqŀ0(M̀=ǒsWWU iC@h*d"|qSEd$QI<oz/{̞..x9zV^RcCֻn țt!GD&ʈ"BF"! O@J!<%ON I~u~>3߽ԩT^ֳ 1 " *eB@˽eH0R!1K(.U{5]9@ʀ {0(UWPZN1A0 &&~@dTr8)P/@" & .\fEPh@)6@o\aEPÞ^~/b'Q Cv}/Lfm/@H x RYHI#W P'NY<\\m@ F`b^mlៗl1+W? )QRY6`mA;.%$ Hͦ[)i6" FAi=JCh+4gxA!2["nb8F)",ELMpqә2 k$(D V[Ay`@6'-# EDkE:S¨fpɡ QnWrsa_vZ r@ 0`L 񝞯 md_X烼6_.sG7}sf@9C5G^*k݈`69a`ۡ 2/|j`wIbϑ'W=ϥh#@d$^(@Zbt}' dt0K} } ($"H Z?NsʝEj~mGs#>v Vوb;|yf:1;c4ey~9 T|Lf]4={{E\t= B0Eԁ`Csz?awnn.z)|F/vߌu^Os{nw  ;  x)'5@K,|(GDz}'B P@DyHP$C׸2m>0.`!n|Ĕ nE3vF԰ឰ`0\+rfjY8(tbܠ? *BK[fq9 .y)OG1"@sW"xJ^>C AO |&F}ay⟐TW@+Sҧ"¹2@h aMp7:.@Ůh T17E4ҏ_=wsP3y`EҰ7 p C ACvHUfݪ])yKZ!S(RU@ޔal\SV B$J Rq.~H4i@!_JU"@LRQ(g(شo„hj (;~,#2vIT(Y8(B A>PBI(%@7JPt Ȅ<^-5+ez]ْ-[-c]50IXX2$BPA$`%! ꩐atxJ42bv Ku6Ɓ-S3j @qMɱj  \ AvM06ܻ`6[NN%T( (ALHP  LP1 >@7PWLsUPpV|uʶ5VMb,"Z{U8  5SNή^ׅKp(b5C;]XvRݦv؝zU6׷ZIkt֕ DĐ&βMhn A@HNH]TA.*!eA<;ˊ=BB 2B1#YuK@.~꫁m af@iG{picBr%g@IRC@Sg\`P FPV:,,Rb1JB1BMp \H*ۨ}KGy?gu{}-Z-^Wt2& V4DBf TD}RJ 7|-*e[1CG@@Ү:H V:lD%}1 B(%"hwa-k vMŁ``9>\ 籣%TUEQ4:},lJݼ4|pqPN}>Sjz5*P"|ݲ|xARBBaAH~k1~vSPr"y'dT N)&(D[ V@EC֪QPH*kih oزq>h@5ذD|sSOzR>bh /Ӻx Y#9Hʇetg(BDBNkH$aQB$dH@&07vQǰ_Ze1fSb$Ot;!h_Mתzt(]Rm/pCUX!UNMy %E$_j~ .@Fu6KI t)G5B`SDL4z/娥C`"|@QPIWHbE5jHF!Z S,UPu˙CcB@Yo.d e ɝ!C[20 6` L uJCA_ 4Hh{ a`X |NJth/3LZBڝإg&bF Z,|D$c0 xby#te՜641Z#f];ٟPyA x $PKɦY+6!ElSg[ B@HE`dBl>4"Q@A$ u J[BeL_o_f䬁Dat: j@ C/-|(HB WZ4]޴Th[4ݬ +UhPnj9D[A?i5ޑ,Qѧa0Ƒ1(D=4g~}tٗ@=k~āq R qRAWh:N2xvF5'kCdP@"@t B '|_A?6+fSYFB ,$` e' U_[oϷ6YAMCZK>ْf@X$`RD>`:vAl!G9" uG("_Gp1CɎg;7'JDU{]N>/bbq$aJ~qTh j4fF!4 ϔ#ۤ88ݝjL0@;5i灸Q6eC&.LeMx4)Nn\Y=e[3a5k [m0RSLF"i0 k!רh  7h`37!g{ & 릦]$͉c"pXˍJO^* Q ĪB엁Q! 0HB9"DPI! $=G#'!„C}"I2C D(;&rJM*[&6k$D=bUrm<ǭ,GP"ZH$؛6h]+;,ȉa,]OD~asP 4y44~9C({Ѝa "0"!R3݉CH :*p7 М@8L)ߕl DZUwuw[PV_w{h  ,*$j^.,A >1_QLRi*T+۩+-G܍Mj^6 Ld6w ~-*.Pfѯ JV[) T xGv=jn 9g ;`A1bCysP0aaa:6{QqE,CPP#})hRk%&ھ}p=s$CqxF#HLwFq Rm]5ZM$/dDL~Z9 BQN>SlPÏ-,@'Ք<]hr\:>)ð}ϊ!!z6jH.#[y@ Ć7'#K7lBzCqSApf; nUhS>"@p !4FL4ɾk sXIJKh(^2*=!ƠQ) YT"4RqąH8 }(s*>C;3_8=Kh琄6آ+"&!tbшЖ EG0q!/oq5 ??eshhU5+bV])J;?h 5z@l$! N*<8 VH 2!)I<(01UT4U5.21rQŞm5CAp[,J_[PŰCK&*뼸 ?r q9RRrx3 @̡,{OF! c( 8P4x.vt[z?3e83BC@6ሕFV4HBBKB6" Y3q \*Ԕf&YڀGnlv#JXlT/`e(lA]PpxgaESdh?9d=|?dD=rUq=??K7X1hC^AD!"Ccܗl Rg ~)AsF[: op`GW2e ԳI'.j˵AQ[YJ7 ▅`"x:baepF$Ȯ%`ne:)e?Ƅ B:6Bs R&SYYsDBX '4UuO˲rHFXï' $wMZ@C P +{BI:-ᤂ(\ɑ pR=l-E"Z/{7dE*(B.h؃# Rݍ U(Dj '6Fa!%n,ۻ[f}̂.% -TiV6Vo-Db%ܣSQP192!1`SmKKQWU_JnP2Lq&a&aRlP !BY-YrbK%*4w0 GPuȐ@PK0 I?7LNL}oSB`L *jZJJelݺZ 6@ oHYT@4*7Z H])5dF C2pJT,j@,Y;O4?QɊa~j@x eBX0/z,矨:;cKDZ2!PD`SS$e42.(l,.E._4Pp 8K"`|Z  vJ ԅje%ъֵڥ-h*64ٶ5K0nLݫ]}LuQj+Zj%2)`2oA1H@ $KaZQ8I%>%^H/Vdj1G!!ӨDJ"yͿ.Q }-r rAo>I_3oO跠0 H@y]*-)DǙf!ArG4@vaA6o\)E\•uaPMݍ"?x R>b#s{ 4U *_,pa3QGW9( `v <d ЉP7S=<-O\ R($qi̙JTT9;*{ҠkRenw}c{YjJK* _TT??|h"B5SX"l|>[bkEgͪE# ! 4" ESQKT,#@6Ưi7RS-JY"4r- @0 -csA$>4(h2xE1H0"1G y>>q[ux! a#4(LzrOEi$ ΪI2"q8H%: wSgf}/$8jP"rpd@_oN2:$Qd@(hDBY~}> zx z/ dtyꋬ'c1}7ؽ;bȈ&CY);n/S.*B 7gu~e.76!!nh_يSs=E@n+{~w'χ<=l2A`gihkGf@)Cdʴ `9q/0t@;}: lR1P!acPG }bAqt  K"*BJCKNݼA5Ύƀ[p2d*l:)+pX;^ndV*T0DS%\PZ 8#tV#[jaZl-gfc?2*V/" H) TRCI'>\eKMw^& Nr?Q݂ gQ}vz|8Z* w d'hLdISo*uǮiv^FPaS%\yO_z}~mTef6=x|=TSiu(5wjuX  |.ݛ85T7ҜH,' qXA.8h2ۮn\$xL$ ftoU9Wz!J,PޅE =5Ϣ6[@ө ZQ(lfB+ *!`J6E9=E%dCs AȍpȠ@@z63ZVM[)*Ԫ ","u=my{_t@ **w%R҅/J ,bP1(3T[ AjJ`>xz/a@,za! é"AK  ¢@!0}'9:0d2[El9 '$b?M߯YR}"Q{ v ЅsU0`@B2AʒQC }z{Z,)Y,SUGT@;k6Ѹ/vI 렆\Y$ `kHUAVn|M(X  ?[ι L h ,'[ڸ]ხ F%KsqQfZRZmf"4͖4@pc\͘)łL). s]rqllJl/MC6i"`mBSNIQx6uԫ,-Pp%-b+1(HuB|jۑ/Շ'@Ű$a e8@L/"$ \زA,*PXCȷ2#I]L_UX&Y^Dn!r"CdI2X`llXV M*!h ` E3r`2X> a!EM@7˅ Dd i}@rnp`h=r , a@P߭mkt߳pRw9GvnۢlI@A[vl(^2 F)tB %頰B& ځ/] 2rX%FA+iFtoyq\% OƻlLHty 48zC8t\Z*5,WVkcP,jZ#''7Mκ&H X7?q|`E@..XEOLw2 wZV Br%GT5t M0"?RC!Mp)Li >Kb臓`4$얦=¡!vBHS{%בrFBI-wlyez͞S?RhCoXWh覹!% R=HC\,pQcD.M*`OdtɋU^`,`ЁҀ)RBEMt)DlJ-$ S.e[I@)(XZ%%b L,0JXB%;Jo(r` rᤊf(arL1C`d A),8aCI@fd : ~H 55VМ=`R2 h# /p qJG|I!#90|PTD&L D$Y  U cMNH3b ₀a0`$9 A @ T(@-CrHTL~)E]pc@֐FfBmn m tP4]Ҹ UjKC0{C%'1!F~xa*ge B@P#>QQtg>33Q:5$#45 C֐NPw@<3B$$B* 7,8#D93t78)đ x?'q(=y]X^65X) NP hiC@ DNS 02W6ny@i]ϓn}(>T<,Or 1HBHKrPp"jv'о.칓- jhrz鄡 !.B4Uk )`*(EQn-4o!tRib|:UduatDTv8kG4Mg,,2RSiFQK5Ae1}]~[T-eDPڄ K JsF36 rL{8EЬlӬKK&Q/u$T)=kGa_AY=|i7W?[/Oǿ{|yׇ^I֝R#-MD"Y3}jd0U*  ީe |ߛ㰕{܅8WeZ棅,-IEJ6wZyucϥkڡ9qD`S1OsG:QG(S~{~~+0O%IAd" 0IA-^']bBATهncڽ}@.#{3{~;!n8s(KďۻxX *A@NH<FH'@ K&Wy8X z E>/ug;j~7-G3bu?RSoA]4I^zk`f#pz:{A(솏_km8mzcJ7ݰ1K?ˎWQGR>*RoQU;c>^ϥ0X(o<`P̈ϿVp$"BB@O, WڽiicL4؇X~o{`b{n^O'm4?Ki-Z2>^m^A+ "*I BI>'Xc} HH"phD%'+Σ۟E9( < YT3"tݥ!twB/R*_~ LkـBm.$ t>zkn"}Nm[C'r©4dڑ~ <[T6LyՕTbP=4ATF~(͔ *;ѳT?}Iu|_" 1@?_yٿy8IgꗇWYp8*D@X\cR*E \bS(鶃ø~s6Mꈙȼ"0Nn&poG|([u2A4bw9UzaEL95tDwOnMgpAΈFJxy=;dl5B\OSyZ;Pg|9 cduHCa+.zp`xRC6= aE}־j`dn/*ҕYԪi Kx6NX4{26dEE0Bn|WO^z4Wͱc]x\fMZDN|HQ/Q2,0R+aA?s_'_s~g}\ge}wQH <`, (8Te˛@H6{W߁@S9_?#綉뻪9dDC4(L?yU*D=䔁Cd?.='*>$A'?h0닧_͟7¾.Џ+2mjP=xS`oa ^A PH Q{L$t;1]AdUT-xB3C|Z./.iOq]nKw\@ZJ !o>>x}w#N;}Z0{Eю]:WHI$ Htto礪%)n;/2Ie5jy?~/5` H*u4=DC;CW\m}߅L(]1aIz]k4FlPəff9x8`Ϊˤh}Q59tBERwVU &d0(}}r@/"%J///`1B?yx8IGs\+!@U}ELh_ΫWy>n^[Sn 7ABp%DA e/|k7ol]H#[C͍+O a1 4 i ?OӬ]/-[ jt",J:9MZl->c>?:ªR '$ q˛-&Ouhs R#bOl;k4OMo%2/a  xLP->V?{>n=#}V;kPӪn̦S6ΐZ4#QA 9TZJJ^TAJotpU.I2"\9J~׳g zuhhfe?Mp#hWRlYXW>l%I3"SE{ ('l4 =e0 cbC_^q%$ $d$ ]w>}kr e@SUY͙ٚl'<6;ˡQ: TļοX$k1{r os!#$#$#|9Wo 8/ҹSޕgT? ];%J0aAL%j@H !2>}OWqtFSE^?`1_lz4K) uLJk]Ʀq^X`_d9ڂ!@nxC-gJ 8|K/ %JLgs,IsqN| N!2h.`_X.1]ơa~q"Ƞ[G f\,1_GkwfJf]4nF~*ʓ(_:;gZyD[$~U[-O7ڍd@^̶˝í+'#C? V~USXZ ݞ0Eĥ_u._P.ZR%i5OŕT;x_k M>H?#b2Rsǘ:vyW[׬KE01KdJKI} lmIرHN#գԕ/](e~6rߣ n"rM֊йSZ69Ŝ:}@D9O7E][<Xo3>7y5ϴJˁw~UuǍt.\%]fQyafbvWTlCf/]>|\l֎e|}HiFό/Ӑ)/>m@{n3s;I{M=>ʚ;tQ`Uw/.}H:&CMRԳbG|rjil8ӢNOÉ xZj WEʢC;v3r-kWED3Ą.cd)9c w;d\ ͞_E/Y'V?b+P=fR9-Ð ausp+8.K}d gsA\?emVۮeQ[o~W޸5.\a w.E$hAtxԐt\y/lqx5mQv H90Da\+sG&'tj3:֣M ?@of:EqM`uFDvɒ/H6&;'YON2}E'dWS' kf sB" =dan뎇cst. ߗI%{GGFb;0G^EVEF C=sVF&A5.{tİ{w:ut- R vrsk}x:c_qiax䆺Ed?%ӥp4!j̕BKA[lM]iIk&׈¤|G绷}f{nj)Uv09~Stm%~)ݹ˾"P^g?mSTM⇦=xȶ3>T$Ӄ~_ ;k}l3)ҘgѦ{ev%!YX{P:Cf ;!U۸Եı @Qꢌ,^ɷTL[,ng$A Uj-ji;8W<Jch 3i($r*NKTR^@,Ŏ%M#I!]e*M85W,!j̠ '688ȹdoݭT0_PJ29b@4}9˭5ȅAqE6vˆ7u1@ $|cpIo>w28~~n3`^d;vwAS8+u,XAy\ww6oΊ"#01u.߱d *K)RPF2NjE~k2k5# VU:РxKe $M#,ZBp!,$ '+<׈]TP;N?Ϸ>m{bSuLI'{P53 r<ϵŮ{j(}Ic7aʄД Q DT=T?Xu9gĊ~]__D>Qԁ,b7 *QV<5=WH**"3Y]8N–>I! 2M.Z!V"_SۅD˰T<G(Y›*Bw_o[mϦ*ܖ֘y,j*T!FIdC\XCگwGW1/k n:iiD:pyxi !xcDP)t[Eۓ1$&" 9z2Ğ((!yiCgNPʢ;,*5Q>MYiD БȟiݽkVO?}kg݈_T@rq(ƿb/yWĢPڭ}W\K`siWݕOPt"Owr鱾>M5<1$L)$EͫΪC,@wUQ V$6S"}yӃyz^h.gȇ o[C@3s6xR_ tDٗz;N& dyWlƷӰ'zlУW5k"0bvcg,cy47MX%_ 1_)S#KmX>hc-=ʟyliu{c%1j{ܫIZPTHж5kKf/[!琾#$"FϊG_ EQ+VfĀс~? b|L ~ = ~ID"HK=>>VA{;[ vEQ >~}H|Uu/ LQ"gu_{v^E fiwzkM  e"[onlJ4_=M"Y`( ~=wxG F+z?;~eYi I$3,!'!>a}>i?t9>㈞ӱmn5<)LS9]Ü'}:a\<y_}73 fDD/ @0>>mwq/A;H $ԒN*n>*; P,0޶"ah)u$$cN|~Y:8nT}Ee 1fYD-'}~dđl+(Bֻ>HcF\<BLڊRtK>]K([< Tq1# H~. :npsNv9ˤBBl?Jj]4[_Cj|Ff'~yKH/.K" <'NZ_TTF ߫?G0|J>kbKxOf7tq=%)j|ޓ_Mm"h dM)UKIo./y139~* VA!C,"dm_jߔ3$ $aJ?H %EDI +Bpz(߱2: j!̈́X E(Kcm̊O鮻V?R7P)=V7@okIfʗk[BZ=/[O{0ߧA:y,SE2mע dA!Pz^g||mXDˊe 1| Qlo_5b%4XFߘvܭW"rω8(.¶0֯.䘱jcf,Y0 h6 i)dGW-X0d3,Qm)LhLMmRŊd7jvK(FٴmVѱRJRRgR6ږllk#mf--TڢMm6[Mڦ#kJѡʹVʹZZ?6իUڒiHHAT`B MͬSVm66LZQkHm)-H5TJ5l+ X(EjԵa%CZVZiRUeTւ(T (VZmnUA#H*V(D"AbP  uꪒa?wxjxGy9U}CH/Q$sKN4tvIJxãw`|7Z di㢣UEڿjq1;ǟ@[xШ|/}O_pR#hfFB2Q n&e{Ty!I9h~7W=G! \+3;mAL6[RՕem0,6ږjٵj FR 0*4+E*UiVmֽ[MZ*F"S,HRkeKj$Sj("Xb$A`mJ;{EYme[-_VZ$,@ V R}UhRi[ջjVTR[*)b5io[fXDC(qgTWp)őmV DH5MTjS+hԪZ+fٵ,ʛe7mMom.afVl2ZlSm5^ֵݕe6YMefҬٶeҩ-L4Xְ^,6-LZYb֓F~OS)IfYfebkBB"(8ɞr  j5%j(Ԛm^1Ԕ4ZZ w H 2$  asZ^Dzݥo*URARFA@=!㡩x|^vA p$P&_Wɭb ⶺ:[q+I6+Q1W~ g5QX2hA E҂ro+7K(1\#$ )RႴ62  "*#bM 66Ǜkŏ[K_i|?y$#Uqu cer*S~ܞN랓{k{֪1FߔD,VW?H\/|Oo3|qO>bpXF'I E[(?b#HhE @RPSr]@! .r%D"~XPK!*Gp wK☐Eqx,Q0HT]dHT@PP]$Aa?J*t}k/P'ACCP" JOP5a']{,8O[* H$H~E?KmmX/SmĽz`ܿ;},:`KU>0Pp?> E;ynڼw5kIw}+6O5:ζ n;mMw(WPUĮߧ5ro*"ܰ<ksmﮥ-<4!6[ܺiKOn=Oݕ2WݦTPW/p9󄺈ߧWg[Vk?揑p?ۆu ZTmMߛ_63tfMp՟oxo'`ճGxۚl[/tײ}zHlt|I%unƬ?0r=7m_˅?L7 ]m~i ߷emG(O Gy=~k{ u10iL3KiG6ޘ_OcU]N'e4YƁ7O){ӿ/a.kկS:nϳã9Ob$I+nؼTx=.sfYOj_9~ןo'cBdvWmʄ~[/י μ|voME_md3k⫹ћ`vOK\94wZݣ+\G=\EyX9^ 5o K1Ks=?_O%c)I\cSޅ_ԣֻջ|H0;4E]Z)OqFpOuor9˃UoX0+ <ܱ}n4[ۿ}k7,4LӞ>u+^1-1`۱, `k]ޮ/F{E)%ha#4^F5Y_Ө(%|kA+R? +yUAot|>H~zN9(T+=||hYG3f`n}6x)^$Gi~xy_[|OW2xf^+kz/,ob@?T5$}ÿNgO5&/L)]5~Lǂ]. -^o sSdT<[0pO|] ̚5}U@QcO9"b20s<3O)sz`!w3YVF%^wCon*{۸;c%Nmddx.\ /[rO_ .g-~\BZ=\`& 'Ս/^/=7o'0a0v L٬ԗm̦Zӱx˛΁j}`t[srW,w@կfy~^6y1~YMЙ9O\Os݌b`ʽ|{X?߶O]FOy@8[-~E_ MNdSx .ZӢ}"zn.0peZ{xboe_G,nM$e3+Xewoifekc ~y_ ԃV+lL6Y!el+*25Zz+\^0̋>E 2`:@$QJ=XsRYք士23XwnmdM}= g;ïl+iu_u)z礕b`pO0۝xmϙ zڢ. wqS6fatt4iF3Ze[3nNv:G&Y`":[NA;Yc޻?߶OfO-< OUkK0?*X/˨ evOgc7ǂT{`chj5t|>YpǾtA/x㗟UHZE㋏gzP(l:%}|[|8vSez>lOg}@tcgV\iM_ ϳK,tRp/M" ;8q߫ґ7H0~!0 ddY㲓a'r[]`Xyex̏"t|>Yzml 7)_7ոaھoiI`\6] ?Vq[.`t?~Ѣ?woޤq]10ReAC]Wˢkyq9l ZuI~wV۾|,I׺ ̣5>7b]~J߁Ճ-~n`uu'K$?߶OV@)\51  x/o`ܾ?L? ]\VW Ewq !@2Xag09mUu:Cԛ~^}Oҁ|M:.^>_>'vD\⣚LIs +[z5wBn`QrlCAYQ﹀yIX)93I|/_35}j'*oZZhX-\2{[*%OY)%D#s>;y VJ{O,ھΗOȺ@:˭{߃kIU~i Ve;xr@ W,_eVJ㑷9r?LW{.{×kɐQkg[m>V[&GmBIϗyV`hf'ǂ^1m?e{/.}w{}"p!r*h2~Lq(C5.k(Ҭȴbݟo'+פVhv<mmVE?yQpEX*x6qI`cl|_ޯ^x\?=53}k.`(«l vW fzݺ'/4w`BuK/?^]ZZR W_7*z0 :zټ9E9B|j=V^ȺSCjl-mdY&>kX&E+!O~{O>,˭Tm1SokiQ债XGfv)md+z:gErYLy__*+vA߿+!/?w`x*abf #Vuu 6;NKu,Q>0ZVj/^d#uCȿ\wfB' P7L\^4!x+Fi9Dacu͢ cd|G=`Ý&̄O+~+:kaJE)9(]oεH0 /݂I``lĴj)k: \ܾx o\$]x|,&W|IG4fW}YZya&h)ȗuͮAwY@/D[tA/=\ #"]M%}R:%Џ q8p= ?2jе~Y~ ߮Ȼ{55:3fbqYW`p|}~}>N?옘_t\50}V؈7]m}b =FzBE֓ǟnzy9ksZ)l@ξ~KlbO0b6=׼:0 FBQgNxL3Nwѷ_a+KlN& Uo];K-#4USgP^,Ky}1^qNޖϹ޵wZ܊M^Jɩ /204rJ何j3`X~8}_`+7+K?n~J~-JGP6-z;Pz=rqM`pM P/UI\Pf%qFW´c'{t?VE^eiѼ+⓰>[tCnI2O`]e-{3w'=x؏s<*6tuJh/}C-gK@NBR4W\d zOn}ז;*@oAw7\noeӟ^-{1з{l [;7~3gSлw_>K˕g' m_Aŷ;4rn8Svނ(F/*T-mBj:k\m}%B ƿE_ϳE圏?HA]xp GW!q;|?|ŚGnå%`3k` lxnj!-6E,~ǯ2R@:-Ǜ_Sle ?'}y8O??纩0)v) >>ŻQ]7f 7+P}q\q,q h^,\gWodצ`sgyO%{[Лdiԯ)0(l=z\_0PvncD\x2|2_Ct9D瓕@/N6[c;Ү k<܇Ê-Du䗶[S2č|R0>Ϭ0N\x.k Q<"}+ Zkἦ?ImP%QI`AwJ3_0Z M䱇{DV}k(1 %"//:iC,s}@QRROk뾦ve5OƷk@q18jM^tJnP,۾mi_Q燗$@9#U@ҿa˾di /M3h gK U[:$ϝ@:`5kбP]t\#@4P+oNt7}F3cXOe`?5qXtFo@GEx3S{h7#L6SLj tR"⵻D[@G쾿dh?׼0 :Qeh]];l<t(;<@gQ8(JJtpHѲRt 5h?3򝯿e@J[ּ^U89(.*KQh10i8dq8\{vg5QێK`G1y I O;n#O+`Ĺ+.0p1<\}i7s.H`rsB `Y'p,8WRMG_|v?e6^#mZ^ZBA^"JOmV$vO޽dڷٌςv.!he3z ځ/_/im ދM7VqmR̺O.!(m '8~@գ0V!_r@[=WĖb]hw5ԃvvt5O>W%SWH"ι)\oR5uǯ!( o ڞ%9lA{ۖZ~a9o[[I>EM~ߨfjunq4p:v sp?@[+ca2].-|NDœDZQ_HOGhP]8x^)-׏\;[SN@9 _lgH@3^3!lh~'F6Kx@3 j:h2CDk)|6shڴ1 @3}hI :`ѓP~'hmR+G7/4VQQ Km'Rv#,v= Gܫ1۹m@SNM{e)>phrVbbq1Df-LA ) NR8!팗ţq|u@\OqxåI& .M8w?F?﹂Exa BCAӈ7+IuF@h1oFu$i;4QwNO ;ؓ/>P5(eN:RN Y'`)dE?y_"ü"'P{W{H {͙+DbjToǠ$1}4yMF՘(X)a]8VxJ4}j@=4e&l YY24U(PNm.K^R<|+Ɲ$ N77gx-2=l hXhDB6PŃw@-thGMr7>.IUE g*@{^`g<߰7mC?iكnA%淚OujM2!\+on~HV-wKrFim hҳ ǜ< ye8^|+%^mO5TMf@돜(: W_h ^I^3]ڃ„.An*ߢ~$ נާZ=Ζk\@V9!G<dž(./7oMnl`|l [`r(+e|ʯẕj Vw#}3R 0͌yс* | 9>w.EӷG82Nő..Axw'w%Ʋ: ԯ=&]>Y$P?w9_&T>>#A}WPlYkn2g@-ӽy3Pv%iw|^ݸoԭ\y7NT^vtO\5]~n F͜@@n3;m\}P߿gs~1ƹ`ye;' ,r6?=l7? ѫa"(& lCwO6BW1wjۄ9♇`{=+} ݲl{.1m!Yږm/vOU> GgP^6.h_5TH2s`uWı}dueF|t,r6&lmK /w/!}:}zrh_rG+~6i:=('wσmwvěŨ`BtL q|_u76C4`s@O68A*x ts=7;~fG.|"浊^|>Mq2/D[|5@ʪL(;ZyeÆ [=?Njc@Yd/yǃoVES7yp/E {Fw=7 v.Ƃu @~Uܼ bG6]gsG ܞ)DC{4BNI {髟,\Y/k[\ۯ䯙e^s;- Mn)򛭫$Tʀ>9U4$Ҁ,-۲^tPWo_ĝUªS?I-F$YD:T0kݼ A"5,՝ZZp޺{MAuwJqwQTsܟMEWG9Ik@{re ^{3TSe''( vZNW.tWl;ZGE`gk@;Sz8J\?* .:pmUzѮIQ4zFUξmJ>-z +M?䀝,9Ȟ_0AɳgW "Ew%oKS/,A? X}5I]\/><^ eW/˹h򆈊8]|n'AM+N=lF}6u<7E48hE\2wuy-c]Udm/rA&6WU NƑ{Z:7YڜnnwL#[b1d۾?$`pz=Y5} WǞonʁ@qNeܔׄ9Aʖ/[^zi(z'/\| v @Q{]~(_k_%:dw[(!&aЂ=1&P<^Xszo72;k=47aX޼CNizY#@z^J G+U>q ֩ކ=ZXos(RXE'%`ٙGWẩk',㲷ZN-J߼xuNu β[qߖu[m(IQM?@e_G [5ʓ8tA\,E(hH87x;y wZ%%߭K|ō⠢EdU8[5uS'@EcP=w*.~"D񵌼 frb!sWT^@EYOnKP^w{7=h a,->NPTϞ$n#{3_u謾EQg7KPxP^NQ31^[%ˏ 7ξjP^؞Wc܅"S?톬QөKCqP17-t!4 vߔ?vkJ#ej$=K2R:vYZ˗(g;E*a\J钧`w`8y&qd9wfbo2`Wz_1R}EKcϝj</eT+ǐ w\mED4q~gX#Y(Qpu`W1!mh`;>5vZ).܊ 8H _]q-rؕ:;qO;Όռq+UrQN!?oE}]bv%8Zp _CyR~Ǝ#[:+)裮܅쒖-83}|= Lm3` d.''/rd}#_fzo0ӑW=o) dCsF@&%ܛ*C ߁~ܮ}0oC@Ȗdec@V/8b} dw0x{q(v%0b9>dK ֻѺOOvTsJ`1+ ȪWY|JAV_Q|q#KSg(s{"~Yn՞}@h;d}Ȥ @;Ѯإ5mLxl`6yE(hJ{1_fϝ]#dӆRV 0x 'YqS;WvQ,r}?`ܨ GG-5*L\WpssPۛ秃jq۬~=%)H;vNhI;//Hw#OT\,ʭeXb0QvۯPϥ֠\ɥ:=i.hSB%+ȳk.rA/+(Hp_[Hu'OʎWC?P>t(UG>?x؟կxq7_}\, *mz Uׄ2YL`{ou[>}҇K}< N?)2 LݛzgfRq_ǛU YΝ#`v4Ĥ s 3>;,% O ɽ'&[}80 . _J齉D7cWI8vԤJ'48?t #jqp}fq>cV `ǑK+xDF;we3@-x:|צ;,Ȼe9bӷ@޻NKY_r=R>7IG]*r%<χ<z4Nqcy$h|!xO/]t 堄ugT|FBRS<:^2b{\|i>/4ޚ9&m-wdn4wnMh]nP뾑)(:&Rm̊v(69iJ}sAI~-OzL(Jukn&|j~월%‚vfj(9|PF'د hCV%AP+]+OsuʵTg8(G\PWHɎ6TPJvgX(J:Uw%YMGAIk)[dJ=ۣ@qk6Hd_ (;gS%M{,AIM!POoHfA6Lcߨ +ƓV_ ,,ø%ogz>r[(m_JY^=JMcz<+vdk#-Bl < t塩n1?tiwY4tʼ/apе+E5$s^7=| &ɳ)@:յVczŀv2;tbX=['Ӭ/,*[MN!=p"]َzܗ [?繃 8o@wf{ NmFdΓ@s} t{RWZ?:iYUŽh=#yaq(O`|6{+bÌc]"+_}3=@Ozߗ#14|nrԓ!C$o>"+*}zS&[Z<{Saq5nGD),>Hg)G:3ۭA=^@:w* e;m֋ wtl5T"s0H)Mh)ĒH )!~O _O GUHy>xsv+zH~KUHRxxƷ ?h ]7$a_!3m4;fʀWǫ}o.N !kv@p{l@~& tq27$!o >s24@ѻHp N&_ e5zUdSw<: *>BO/i= 38E?t/ΐ~n +M2?b_"؊d 4բOk"u/EKL ng`B/df>ߕQ |f H4gJA:~o =\QR67_qҕ'dƭXN;9qh } >xKYh?l]"96f{0dz6'.3ꉚ !G@~;0_nlu50ײu@km?/۸Q0K(ӑ^7@TvܞMk_պzW>y\7oWKEOyUAװKs;{{/.x_uOx.?hmCsvp<~*X_ٶj?]ʌqolfU9> ,.K.B{L?ewe98ڌU6@yV6o)K{2|tw3ͳ>!X+IZ8Ɗq}ˣe$ zcS{q>W-=ɮM@1P"ۚ>Epm6G$Sv#J<{3kՇUԀPgk7l"^GIr<|&Y9qe/!MKtP32+"m˒֥B&FkF@J 2g~pM![)yZ` ! &@HcӃ-V=@uY0#HQ7snC޿vGyW%*yit:/E.{aȳKU"K7_OYOMc"oL+W@Jl2GnW^28P۞zY_abf)κwrŸ{5|^]E6H$PbSf v4:odY>rg~K6Y̅Nn o#^Y\9A;rYP̗tFz鲓hgT qL맢R5xo`1`+s詽i4ǘek}n~ ҿYikr&67,@Yd# =ߊ&YoC3@J@|"?7kzYv|6QgD>;*ƥȎג_&5izP^Wagl^Eq}* ^vkG_ B_4ԧj|= ] !}HҾ<;)x48IiOɖMI;?j0 >u- q^I7U` ?Gur~) _1ֈ{@-0x)\{Gǯxx^xRKo+6nc_AND_821cܯ {-cD}]4`:Oq^9KU?lz_]Y8 ]3&7!e7m5֣J,.ܴ#h=s_5du X2|t-V{R{{4s}Ogĺ[f湊w9:_c\U>ŜAԎ=!q uwH@d >-d*F Kqس[R@<)9 w]~$Zy@,bEk+6P .PѰ 3D].@׃{ tT^μR Ʈpb"Y\}" #(Oɥ_-L3@,ʈzvb=u@l1)J Ďr6+\$oԮqβ2$j'\F%@F#A7|&H?C[ H_!8x 1,vtlH3HoX{b۲" d<sGڞ̺XQJ1 cTw^cȄ/;!^ \z?}'d䣖?L۷\J?k+݊k@`Y5\Od&fڔxcOd'59[@o@f٨ZыvV v zQ |qEmf(+Wп7sC@-9(=B<ڂ #:dDbA}I k0~ORbA2k;L!0=.ډ_p7`}XZt)MGK-WngTzdn^]fێ>1]ljKg%Q]x=}Gb]:لu|nG)uu\yuȲQxQ͚+.{H5SP"pǸrHpǾY@.udB;ضhz:cSB:.s|6%-5DnSi1+~-6)pw>;c،yӹU6^(q=`rCKJ GDSIzT?K /ui7HIU"K<D>zsHYWЎU*?m{We.Yחu+ȷN}@Bc<%~NIEJSHρNrs";l\k&柯yF=)Fv`oqpۗ1 )+>`Md'9X[<z>Vj(dƒ^W~dc(ث̊{k{8#sU70WDU9ƒRVȣ`JCj(WQ\?Xn1x})>U [;*ӧrq6_P9Or=՚~hSlўczWwa{]:YD80Ej)8ٵ&p=A^][<0΋`\gu2rm~+K)oџqz3Ǥig֔W{p_Nvfdz׋׌nȼ P$@}ǻfEO*)(%On'\ eJ/!OP~6 W):_ĝk>'|2(Y25t{/\_pyiSl$^ 6#=ʂ@u9pTG ]:W(M@"=@k&157:5/.xDyGYw#Ŵ* ~ѯpWx>r](l|k YQZGO]kE|o. P6}E>(1ݔY~5ܑwĸo1,qq_d132ց#KI7'+u>fBQ#*@xz: a=U14Rh$i^Y@UݿDd{?|:3Oנ]Q@=ɇ dnP ZE0u8 ncv^W%g+p^vN Z d7_D;W[^V]@ְ/UN:V+y au_| ~\+z.>ϕtPt]vV*K=uXsJdo nG@֔9-Ȇd6A;K!-:ߴj̾FF dl$$@V;a2 0·WtAV<'k1k\zgu?5]P(K;x(-{0k/ƥlIwmrck;?z4`7J ue۵/?q?%kק(CY^檺xk7m\s j'j`}ߔ~oIvw]'!._v,q;=-?~02lP?d;&{L.8i1v7}~ֲFU!kո [pݎ[rO"k5=`tkSW_E/=~yI=8 v]F`Hp`LtNg)xfo=>vU1aì%hGg&5nl %e;Z¬P]"_.d2bC]јkt/BתCOPG= M_T !~J002/z }"P&:E+H.jC`'&0/-p~ ن븾I;1Í?d+a[#Y0'R f\~T70PC*v0m+4A&^tuMPSdc*h ΃f(_W:ƹ3[!c]f@"}?Z*uD 28 V x< Gn F`S.N -껌>!;͈_iv#_Fe#ϹEoMPCMzi!& Gլ&@ݴM$n*)+G a+s>-a@bqguXb$T=u7=Q>o { v桞~D@~G)vX?^Hxt9 ?[mޱ$>ϦDW?e0$VQڗi }@i$uvOyĕZW Q0$d*i~ bf6 k#վךC&j0Cy ͟i} v|.^zoyܽ=ϵ\h)t/;-f`>ҤeԁIK1v#Ӧ.v\/}@)M ƆzPtְΓK^Mw~"_qev\!b0 ~m;p-;ةm ?~n_5i(5EEk'p!@V?7F#Now絧%N1s-z2. j٢LIeky;/q!b N׽$&wh21NxUZ`zث)ɏ|a^C{!ĪnD}r1 62aq^[59`yd'>5Jl@m;܂(y*5-K| 8y\Mgnx_7V6x` <8_<)h1n̂g>Coq1Wyߡ{? }/p@Տ_r ]2ĸC9W2_'ey{#x0b9Ոi޸I:G_.Ǹu[b~bhs;˷ed2$eFjqS3I6 1򩰳k-Snȋ/H/@*N3<2MT$>an x_|\ul%3HlYVjɃ$Q'T$C$:W;\ކ q8ȝzjv$Kz@~ީ D¼8Hh rqdXOCT.$&{>-h߈$,s3ט}-Ab?'m[mARx|5H̝t6HLͥ2b^!a8t$Qna\< Ϩ'^t~0o)?[?\~ ߒ8/vpcT欥R{JVQE&~Ƿ_sB0c>&|۾Uc|v<30]u/̢o{1ee/;頰&#~ze ~N{rl?J}+aR+nw-s|nU%`Ǥ毈zOoe^K> n7EMn)Wْ2ݛOR<-,c+?U:~ǞDvZ`ETaXLh0cVɐv,Ј ˫l ᑵ @@^(ךw ẒI [E p#|h" /ˣ=>v 9 K+6pq9QgK Kue@P}'.MvIX`\4r Ox*_\2\m۰@4_!?[4J-LQ??ya|A@Đ%ոnug1ofhl=pPH=KڅGw~C3^c|PO' 2OYCwD_>ݖ}bwl߷&TBK*#@U|-2C*A^mYkx؁x5'sVV{/;BC^ p䉕nia2:|[>rނNWȳ wy}/@u@`Gb S=R6kן Kꩢ% ϳk QC oQrׂ#A[c#jț1oJZ!g_$5vm7WsyܤLʿ" /84OQJ[*`{FI'lklEl$(;Gmk_ k+[FQƕP߷=_,wB]08sO=aWnfH' Uqlt3 p~~kIض_]M@Y:7a9_x:~nh9>NG^j<3df^TՂu] j'p?(EۻooL{ŗ#uuYS`ۡ{l[s_a<*qưN>:%T, ?I Rv ضjǛoO@cn~Xɳ=;Ha}}ELÂ#%3~,ך'Nyw%sz8匮3e!WUg:lz1K"W]ءw2\5@~qr(@MUs0SKpB@=Q:<%eEY ⸞]ؿ/ICA{DD+؂dߗ]~} v[!\9 P}ZQ}mx-ngedq> 'Zyo_%,Ԟ}y܍m?|,pl!XX3J5Th*WXǞn9ƳHujw? WI#lk4:MYmt LJ]«h}%@r6V /, r{oSp=YP~@ Q6U +iU5Ǟ,[tJ dylvm? FdD.wYn2- KeZΆޥڸ^GI_:4dM5AvOrȞ;_\|jBо3^~@}@C}dɳaY,7,N6=9mdTOՂlC  kQuE4F>QbxA WTh{fWQxdE[3Vsj# sg-cQ:!3]0^ "1+> q(z^CWV[v+⺫uܾEgügl_iu5/7lM2H*~⻠s0$~h+0t]a N{?6 G@=qK 4-KPZ!m<_ ?&ėwJqp>qL._EC`(Ug0}f8uY-CjԻl4PAE^y'֍kLec-&#͡z2䵧uR5]?#Xfz+H"ND- ɷפ R{a gAǰֹoi tzg$7?2ɕ3Gj@RzՍ#X+$Zr+wbv2$)o$9FI'°qG>ՃDII̓I &Nkk.$!jeH4_$.saOYL}AˋBh\Chd+vv2n+oEV9hb̒@k)?XhsNlZǡn-իs~eRWTh;Z$dbe\1n=L h8r˫\e %Y6^ѯVf$ ([;ZD`k<'.ϥ@s=4x-# яv7筗Mp<]"X`u|tоB\e`e OfC;ڮ~k(qa3xU4:tbn^-~M)3#lEaEl15%ʲ S9oQ|}?,W70!bY\W'y?{=nB1Yؠ!ڳVقRDB(ktKFg#KN ,"ޝj݈[OhT@&{ r|| MthT-Nid l8u\ZiFiW+aO0ijfU\[0Qx8 yYҙNcdƼ'G"]yV|XU so@6*1=vdCE. l@7&lJԗpd6{ѫ#ORb  ?GAÏ'w{@(.rgJ;*_wd2/|>U+~A7ߗ`v-7&_n6C7 `ꦾ_'`}g"zgz`*ˡ~S1Tk0˸w l @@B$Jn4;q-?1XwFڀVuWGXo 3cMtY&Ǐxm掲Z0ؾsOin+761bf/?9X|QR Dy︎zء#E:+0ϷJFӔ!.YK 49"gѲųeʒAqhu Plk ŢGAJjncPܳ(aync"x٪:(0} ;cU @1YsjU@ڑu)(En.M%/Yy P+!e#/RmJ+N zt^8zk;(ɸ ܾJk?Gx<1}(^\q{Oin .RdfAWY7(͸J ?< JK3= dAi&~PrbO 6(e8XЏ14VPx#P.N|4?_| Jl[@qǡT~Z({}XtاVIr҆_΂AG^ߐ:3ْǑy6ēʖ/ % SxΤz=wTŶ۹&̟=wM{y.6fzr@Y/M3f۴ mɟn= 4iOQY_7m)%0M;qJ hA'MN֌hzMKG^):tv: Mu{)@Qc/4BǓzɆVin2:gW8>U]eo? .5}B95xuO(kPَaG΁% c~ބy`q5[8gyV䂍=F=BE{}v>e1"#a̴3WV(nz(:;(:bxPzvUs 6ka)uM7l$b0I p~px pL>oc 9Όgz\7ߙH1+ڈ]!' b[k\# %hau49R?KJy3KM S5&__BbU_U OG1-_&ZaX y){Eai9+ (-נayǻ5M/lƳ ,{>m,Bhf |Q˻%@o|?j,0ccqF="eԿ $m]@aT$E[w =@fLmk7(=kqy}, Uh M,yKڨjd ]rCUZ@=EIl.S5@=o^7Oa0lPDBZa(O}o;#+zx.WqXvVWZ=}P|iI,y>/r;UWbXo"˵rBxg<;4~:oMc? n>d8L(h&/f9B+ښlZ_%,ltW6"F X$r,2k* WQ]'@fϴ` jo۳d\;XV9<*u&$tF.K= 2"VYT_< zbw΅ vjdl~d׎?<_Up2)_vp?25>*DOݒQ깯SLI1;f nsG>7c~]k2n2;[Uqwb$Ճt=28+^qU{COLzlm clgcgA}v"ua [0<Τ~Z7~"PQ[}` "uݞJ;m<{c;}F'|Qy%Ah{S8WCzqSw:{ {QI\<*7y@Q{&GԫR3/9[֢So W _U]o+myla\9yْby q.QWԒ_>4D<#TKdG|' p=q?y]3;;U܁.mg9ty0_>->-"خ *o[מb}ֿ /ðLVwV?܇~>޷F5;k8 zaA笠~_"Y/$k92o*}=Έ@ԯ[9Ěxn# e)X|}ecC+̀(R'|~DKeSҎF׌08 n9ۼ~R栗qI ADQ]g[cD{%؟vH%>bzKɠ/)!nf_ Ț^uK@sZG:tK e_~z9+a&pJW+pxgM}hKuMIXrF Л[M hב%m/ɝ;s% 3PrkPPZ%L {z 3J@icC ԀX3P<J;ž 4nIA0|:r/@=dh6P:9c={"8MZPgHoJqN%Pﳯe{@)XK¶d wL,ߓe_!jH :<֏yKYx r ?~eBޚiwWOv* oȡg3CǛTTOKz'd_1OG{;BbN )"䆸B5 /Hy?JxוLڪ( 0'jo;wdHF\'LRO!R+)8#ˑ_\u @ݵʗ%ȿnCߵetGptjpKײاF1? ;'/ASe+OOx{٠1O3MY_م\ q%?Y;-fNiR[` g \gIy\teMWָ=^ _ kE=`V#w`TtaOv 8ьMW9Հm$;t¬C~)(`~9>~oy뚿RT[VOAw tf z2U렻dؘޛ̠ н93NꟻUA,]Et+ ;Ń c$iнy;K zCQ v'##.}yUB x@穠ϩV zf}oq>d_@VeVio;Ox8M[*~<-nQljDSމQx^H*eض# ޏ@2}{ۻV}o/6n~m@F6 trxt9e>\ǔrtegm/¢~ǹށDOGRhn"n\ 3^ϴ_d>1h0k|:1>? MSZ@wEg2MJnǀ{5߿ls8M8[T,fSǥx`~T>TΎ@4yTztws[loKخp.*#D<3)Z 1 3E[ތGpo7}@tyv11?X dc~@BF[ > >-u=y]gesx<ξK&x?M*9@;ӧg˴gX$_PsbGobͮ@\:F0 'Cs@ /+gpym`x0 7,]%?s8k8f#6F_"5x~ծM@%Ih]<ڌWnm]/ A[v1}N]! #A+5K:6;,hnxs> Zx: Z1Akk+М|E!g6O E66}D^*XtAOrj14%V돱'wD1YnZسS%x݇8֠g#>:g0(NL=,-UUn9u\|^@+i&)̝mEn)*h97yj3zcM5ko{}_}f.mZ+eo;1ZI# UKhQߨO.֫ kiuSJۗDV;.%/:@?g;$ml'hI+tx7u%dvλQũ@ku P.\8weM$zki3sUZm\y9"kځa"PԤBr|>?$"ޗͼ_FrnLI <"P"u߷%6((WgJ%`5R |HƗ@ ծMjzsv@c %̭#E/_%N|$>ٽ.OG}3RZ%4T58s./Uw{c](1wF;ʼn>I P\h~~(:7_ 0s=*y7ٞzʲ}!y;XG)(7Ce\?o`.qsFop^˶"049Ei59J99 |dIj0(KM97H| u* `ܖh3MP ~D%0o K1GK11oYpc2d5scdHf! g1(i*p] Kxw U6櫊37<WlJC J+v帾/lƂlaE+RP?廈mݒ?:  KjԊAj'6:Fc&B5r/ T{vZUekA5c񣕁5&> n)be}#TMKty PǼ@HYU/lvT;lgvjC%7AN=q$@%⼍|AoseFPi; ͟>]6g9뼵UI]o@US=uߞjTO*얄1y/_ß Tv >.'eRT$Nٝx {Uj[4f߰onCVy9;~Tz6T9q[m9_W6'am.+T_l?k"M l%ofp}%Mۍ ՗v2 ۲`7ul}'!]a]_mPv`9T!n(,L"Z&u\εrK*Uv0 /)-x : H:A'|\x&>Y_@ ; ʙ![Ce`}5P^cf59_&m@a0}F (Rј"|^oo ίH[-Mlh;Bd8vv(z {j}(a{C0_5R| MZ`n*}l[?3㕖@tUA}q~ =}6Xn>y!w +9hly]:ۙ[@K?SO. D ot /eX՘KbIMԥ )/auŲM`EJ€8b{*?blMHȃ:EZ9ff@ybzܟgp^T녊Bm} l:^ͮd @By/{ߧ;(6 I@Ah,&(>e P'K?vżzNq!9`-]=vPdrg(nQPbѬ0.H-9#"@suz+(v,J[{<4ρRt,(ʨLo롳riWWPT=sފ_?95\ M,z,N 5 G r(>陗KPL ( r<J[߂P.(&>G8Ϧv"/@ (08?>=C`fO ,e͈?(>ϗenERl2(Y̥eWhbAwdb:G7P2쟵Ki@)?AyLWqJ k@)ܢd) (1O #>Z $`(~eaդ9IC ,X Eu9| sWta@PPZO8eux{TTܨrJ ǟS@)#"( 'Rٱ~)e;?i{ڥ']'rlcVV OK2-(P:5׍x=?Fu)o׾8PU(1w.\JK7PbKwWs1ԯ˶i~t @ ^7Åş Js;7wf 4a~MU=ѶpDbn7:iS $"}?l@Ki@j5?=jsg) H' n؟[q&@)PNA#3 w|Dv@ Z /ԫ;qEwXpYJOP;@3SF*s% ~er o 84Ƌi\Y{H9L)߁>@Vܤ Hw-H=s :pD,ȂMaA@/ѧ2d+?|<;&4^{s5> ne8!S@*-aN2-j@n:T{9b]M/^d:^G!v3q&[XZq/a ?kgqW G~f@\S(\:I<1)8[gA,bjkNQWIi_Huql?VftoTm@Fbߒ^ {H JH{mE B)u7o;Gm v)?+*V,W?7ZoژA K 6reW,H6$̤A<'*~xJ\$H?rVy Q>$qLc]#:im7k_FŏY ~x &|Y9;@| %?kd'ڊ>>]'7 `]x 5Wc<`NJN↑CEjK#_zzS@zQ%P9,&_^tC_=Ń3m#( /]_:S (MWܰy7sbvf|+PjmϤ㼦L`={PQI%/U:wCZm@}PB@X]4 Ŝ@|%:ǀ]Im% @wA<ۗHlQ x[}n2U8~&VՖ;fC[i.G!,|W{s O? VQm@"Hܩ@6zڤȺzXnƘ{Ǔb }8̾d T$"@Cȯ'ž|o tO) Pz!P e2sT#I |PE I 5#no1TrbZ?p8|gf]\F?āIڸOrML]{='.>=%OSN> >gJo/PЗGW}/tj4a_yYϿG6-cqPvc=Xv @yAI i@2eˎ$_Og>}.U{Ѝ / ٹ`; zhmڍu={↑eEj3`+ džm/p>ؿJ{mcUJ(ڵ"UE-g4P {uc)Kz;_49ds _-=cc?*Pst e0亱l'_EesIb ?7c0O֫E>?k6~Sχ.u!s(~Y- iqݛO d㾔ȍ. <?>ؓ-g1+, o]@?Fe  JOWsJBE@bڣ|j, x1D=Y/ZGC8fvb P"!FbrX"5Y`_JRq\m6q .9ErbWV'.ș+@Tf1=TF.]s3OeS8pfF _ڄׁ[YMGT+ Q8u) g]b̉@ 4:Vqd70-ؿ:xgV.gOhG+@@2 :zs؇$e0ᎨjF y'{]<1߯ e|‘ĴE# F^-$~2t#)[IKѽ 1&?dΩtDh")b$z(ϷG_Z1c,1XYCeSi!FU}i!)ϸ$6g˞Oc!VRf?bz~,1dE;l)CsK1zVZ8<֡ql1w\$1y1>tb|xA~DlAFU:tԇWXs!길mS3w6ou> gEC\yifD QI' BĴmYF:ōz"$K,,S~CeK,}qX),KL'S'1>_@҈ߵ9 *NJbr(?oe:w# 2PD:kτ9p-#YsP^5J5Bc|Xwߨnx7QlXf4?/qBX 2܃,ӧ`Fwx9خ7a^a2G`t"{W:sV*>~eL.~J\=z H2:A!;D:$~:>"?f~ {s/a#@:wQl0ysT TH<3ؗ]^ `CU< eUzj M)yY{n &{*c}v$ׁ =no:`u׋XY؉ߥ`V|D{/v(Ztw6`%XYfl˯O*LK`&!(Tf;>fxIrqa7H0(5lDEB 9dwGN9>덚*G '/GVz͟U9)vnCdP9lg^*׉ tj,d+'E^?/[x/loBbJ|k9<ŵIf*B7MWYgA%bwC}deOǷ{ꡲI4UV{UEСC;Lc2,RIWK~(R2^upUtx*ǁ)ޭrZ8M3'>%7;#+'/-U|qkTu ]թl,x6Y٧7 1Ymr Zf1]PB~Vti㏲ ^:^]r[ץ*GoPV9"+?}jKW9<2+*wX|cx-]e'-}@T>P7C]w-^Se^"LO}>7 V:1aJ mo2h{,{ ߋ%n#āmԀ9@k޳RNtUYms_5t{"oV"e@̺1_{ ~/=88r,τ`lhBߏ)Xe9qX^_ZJ,fqB$pK'wa}7>WGx"П'܈yD @-J`3G+i$UgMGLܽWNn/K~ T_mrՃF,Hs.k\Fi栂i{9_nR`ټ^Y-{0sԾoDwd>Z= 7`+ߒLIi>B"WpoP V>lkAl9pP G%<\Yk ptS`̇'C\p󥍦p0EDmΪ{^sO=ŎQJj_z ;4g>7/5Le6 Oh9WK]?`R3;;kԢ&psE?l:1lV1 V/n˿}ݰ0VyD'木B0gu0̵O_+'{[kM^^"~ךOQ>W'C2yG SADSaE fYOؿt#FV\ay#lk@+Sp-Xa7\}Ĥ\S_"܃\#tľ0,p݉| l]r#B ~nČ7b4j!HC [tĘӚm?d {N1% 1|Mt]\k2"~3~D ҉z Y>9wDv)~91ϬP_;.At0Z#5q"`wܰ;([iqk )ݑ@6~tX.cc*w-U vHE7#`Eyc v1`'yZm4sџ}f`wy`b؜hVԞݳGsl\dE.ZE%.d* v.k)۶EwqSJp|º5Da7 mvLZJXq2vg,}i.\(;QO\܋I|g`'kvo;`u.A0 뷍c >cmnq!YiJ]ܦY{ ُ328NLs$AQU}"MO}~S*b C3ZbME]b*6!^b Tsd*"\vӥN)iXݣֶ %3Y<ȗ4|:U},btr_?#v},7韲q$⮨b >Hy*E,Low [Gyl b9}vIJPYX="#>v,d. \k? 춋΢bK A,tb)~cbGCӖ8nUךgH.b521y LC잣qܢ-1u; !֋|==.eL F+>G}Kaq 1UܳGI+ 0R.-͆;/Hs| Z vwC'򞁝⥔;`g쨯O'݉- `y]FXԟ8.K>>mu|¼vOq\ʏ9e a_:4qiQ̗U\X] :=CKOۺ;dҎM`S0}yGQ' l,~9P}z8](Zp1޲? s7R6Qm]2{, };߄E.cٯ{v5;# -;i4!lqWzIj,:K?}@zܯ;B/ӽصxb&K\0:i{p+5Q K@Py+\/_^kw?CY~kn8ȹ-޾! _li`p]fp6 r:e/ky e؝BqG %\KB<~ ˽@I}7&L3+0?g2b_.\mU w{)4. Q * )@3껩!v/͘tQw$S{|q wOߵ4*VP ,o)wru /~D2b9,vЉ-ɧ8Y˹|g>DV"ƲS'biA xOA͋Wsu"FЦrDe?D]5Eh*b|b A&;N"&EWqU72\mEu)20l C ;6b0b߬]œk=bX|S|bf1 z!-1nyj~k?Pl_-7~k'އ+ʍW į2c?ۿ51TĬXXL_`^J'^RQwjkn5E b5wk9|_Ts >܅MMv`W1S$uPaFv)jk; vk6`VأdAM,u>O|`W:ع1lΌiCЧ@+}4&jK`{ww mcuM ow5̵I]8ff`Ҿhv/浟}>'?ӫN /[yo:/b7{9MA5e1b}Zs.Ek1Q 5s8iVz)mgYM P%Yy_,`KO"_7>i\|ݑ^{:>u1i1)]/n$ˁyB"hb΀~`|qC0u|>0Oc⽳ wKoSƴ{QW^0i< O,bhNsWzl<6Ag {`u @W:{5_gz:W#G0'ⲟ/5:{pbQ'6} Yo 70TMJ Qf~K0bum\`t'!2%"\ ~na0,آa.o'mD+3rʹ̓nVZ*^U.[\PaޯrEaAl-io:T. \(eAKxE]UPjryN&Tply7j~.ŤuKַ :ӑ~.?wG[KŻ|ͶXb2Z*l;,*7 eQ{Y}on[^z $ç[mzb^Sv?Tog)7G7l[w`4e5y EvW|e.J?r3I셻ߝ{~OW^-y}Pޔ܇[q6xCN`qgt:>Uxן 87 а>osGZ/>]}I{6zRr |-d y̷y_ݗ6묋+w{բa&UecQʿCdo$5˜zJw(g+)eRq"R9u4"]9d{T=29l*Pq.6]uxvR NJt 뭞E컦v~b) QBOniC7J c*DYJ27 g}+B>,4؆hƠP#UWZ0>(jZ;οh/'kpE%coz}ɓٓe`e@X]->lvV=9`<*.5XMI4hψ7#~>V3?mb+#dH쐇Q) r t "~,gLGCoyyc^ʴO l9\erA$h.L _R\Bw;&@RZW$ C o-_$ڞX2h@|Qm_;O"F`+}/~)GށqEEvFqHIűRħ]uq*&"~sAec$p3r*8^Hg4E9j %#3s!h~t$-?\n! EuGHIJn$%d^־?ڀ{G~hk"ӥ.x};aSOw#߮h\ck>׫,}z-%[pC=}WoI1t}F/yq񙘯6?E z_&݇&]J`x<+Ң?a7 o?m?`9 ?~ƴsIkoHw<.9Sa f mp|yS})_mʨx7Kn0+Cvp~F$j^1?꩛WYdr 3"D20}ð4~>$ Wc\p_,T>?yU+m{#]łk`/̽և`kn ɛ8xK$IvvU_lFc@-]d͐`Fq=Q+ P|z k~ҭu7Zb? @|U2YlO㮿 PM}L{%z<$ O;aCƾԥIz:7dR7 ?V}tQ B NtcO='*I{ Pp.W!jyxfRrlgr<ਓﮌX}۶rCng^jH(=tDDqx. ytG'@z0SbY5խq!6ky]t%$b&,?B8~Tz!#+rx^bƕawz>bYxE_pնԵ bTsus"ss+s0Xwt5 +{+qb[t~s:K^<жؤyŏ _Pu~9lӼE7 =|3{N _ME^OrZC8O/E'-E F?eۖ/{gɢ]t.m6/{1 uKNJ8H/>U윅8rU"moM5{[}nH`Y9JlL@kFYP&|sb8[Ye? ۉbp]);yuf|:ݪ!6_\jge}Tns|^Th)6 O\{%pA24ab[l?F 8l9J޿6l?Ђם_o W_Wޏ;fq]p<rrN qHWO.h̩p`8Fc*+/!4Èq\?X~: [?ĀO 5pHxܫSuD>=?8d\\V|_4s";s]_K^|ȉΝgs˄#`w58#94Sw#ԯ?"_[d9Z +[?(`e>%gO}4pþrbѣg b`~߿u˺go=c;5X<& `x0,gזea|1C@/X4s7~8\1t"k7pw& |eϯyk723}/PmY`Ngzd.Η?㟛 Ncau:yw  h%\w xYآBp~6wlk97d7ú"MZQ-۫?-7sN9q*b?Ob}(b`3Xi% ^%@n"r3t:cy/b$oW-Ua^uA+K]dKTbˮ!x\ WYG}wxJby1b6f^cBM(Ӳ"W*8<|׫zɷH_өdv"+ .I"@ֈ?8X]4hs-M( ^V?;15\]ݒգq͆4+bm{(X(b_v&x~:vE\WQG|Rc&M5b=R;XϯN;v뛦}[58egl:𧉋$ g._L'j߿xpp]5 Whkख़S8885x*f z0vós'07}.9e9gf kwW30I_ӿ^$ếgOQp8`"+ͽĈr@ZN90#%%@PLU[,U|ҼxY?]>ݩ`f$t~攦+ri"MN2-Q,F-j+x9`84S'Қ V7W'< WRC2o}yԦd;E( c)g@99pH^@6[%+7 m댜Ҍyt[= =]ڴ_L is#&Lا3O5i惌% _& SROOh );5& k. =ILpn8_ef@, x4::re٬QׁkT{7f_6y Hh /yfXRDW~#u}{n߬r `EGh>z$VX$BiH"fT~[fdOEL" o CR#iyHbN$I*вЛʼ$^eFL:;fB^HⓈL/iy9[&]BR !CHjL_:$^ͷ؁(6!'[ҐԖׯ͜WEgzxGJ;#H򡵔zctI DE7?"OR )ҋx^jh_#L>,va}nz|f:p(r봮݉ [-XG~.ut:V9֋߹<^/o$<؅-1֢G锈G"# pU@8+d+V̱M{ l^G:%fy؃Q _ҔQbaHLOn$_gBtc"̬̠w҅G>@,;\dy-=M͘?jsǘ8)dGB@/uz]o >^ қ&C< V}:݃/shq՛w 2䱽B*H__Ĕݬ+_"* ,$N /yGuQ<$na$n7i&,hAgG=f:H8,[립Q(;r ̡E\3HHI pT-G$@$qC"CҜ HR͞9N$[֮s/#l }搊KHl;=qhIGx"֬sk8; ԇFguWUܥ\<@.>P5/oc>e` PU}ȳҏU@7~PYȔoxÂ@LݎRڇxg^B+`?\H8c_7k ~m 8Ct.z]KK盜!lS'xt{qG<}J||q7yG.qqYA[~Rա~[[Îa_JbA쎅|wZB'w;rB(8qz >܉8UX8Ss#:-Cl3絿F#GVI?doFI!9A`_|!pܴr08jmNV/Gba (ńov><GM&(ֱvMgbjEliPe<}0^!bǁ,џ2@H#GV)o:ps'P'N[t}q]|Onovq[0(@V Ե{u@]QZ;L<,dd7 #?qϴMuLr48g$\}v+k3Rk!r>^1WxbSlu3査gO79(g~qR^s@tUQa) S@yWZϑ4e'lh6WhfR1Ğ+wq' #c"p{QLJW<7R{@D ۏ7 5d7Ii%~ g:E%++?EqSo@\-/]ğy 9)IB^2xR- yg(-@$S|8Krf7@l{p#z<ľ-3_vMT3rqJgȫW]:~۹r da0 oSMzV[ yq'wkrb]ԇL/H!SHXpHh"afn:z4$Ts|޻g"gkedl ,pߜ"mm<5L?soS\$ܡr^l 7 HqA$(e[7g> ǩNه?߈K56"gO!?1#t0F?AT$|j.$ +"fEA‰7LHF}H?aHHV:<7VxMӃHhu[ϭe=@BqggpFo#K6_ʪz[7l׺(Z}\X'iP恄%*it%#!t'. ΃A$&+5D+ n[#騲Zr ,YI1&yuw@ E쾈d#?5m,G=)g9dw~G d|+,U-fw?|M]1jwcY:Is c$wOuƧGOo Ze6ȳ=@zo 0G9rdxa3}3KeȽ\p$Hyuw.mNux̗9ו|՗spqo)B \x'?CvNL;q ER(_Ia+ogzK^e NhmQ&-gԷmGRIK6ԯܩ2|aZpypcf'fTrV,m fܚ[7y `Fr=̾iYf0a-C f?: fҙs?U >} f#@񧁙-0KL9 f?vx^~LUFHtfGf>F `ft1f8Kgἔ}F`ڤtvTwYۚ8ι>7Fj 'WGoLf[Y't,U zL?ժ^~K,`&VK-l f `F=4-xuZiisǷ頵fg: fZӂ#e`v.OLYգ`YjQf'-4!'-{t$T$%hPcߒe&{ɮvDFw ]It$@ڲmd3IE "܍j$ߥO >xԏy,ػp\t~"]5dxSw< /:\e$'rC<y(cd{7#9~U Hot K0D["9'Vluݧ̐\ea G٦)#f:_#oYpHv`%O3<m~5?R2GrʊekHft d5CWܑ BHvBgG\}~>VM9wo(8g9_1ʊS8FTԚ6ǧ'yNuyuE p{ogzl[ǤVXiyf PB0 _Nff[7޳ Rj#u1s1pP cvӕK1剝N<dG׮cK`x|׹0I=1)z#yYV8];猠>71iliFsˀ^H\3̱ Up \rMG*&y/ww̻ĆA[pLK{mC-Cys! pT,aw:~(|!(vCX=dd^zҦly!׶H?]&+yC@"׳c'c6~.m; tY~ig }H 52q |lcaOtyB2 Ke*ԁʪ_468l?5 ۗ|y<HwZp͗A-@*;jk M*Yv)ҧbH.g<$wO`ݦݓ#&&9@zP`}$Hq~@{Seڽݞzf&zN,XY-H_.iim/e@JtWVR5zE ǝʆ{x) HrmqK`}Gg Hd 8V~=xHXPZ(\$KjןWHt08'#1;x1VH,S@d*4xᯏĶ.Dzg }\MHps\bj>;]e׹]}&ĞnDbqc;=*E7䓙v?HGb)w# )Hk!$a|" *d۹+b¿h(gQcH:YG? !l *WA!ioq9dΧJ|YCZ c$^ЀI%z7RĿZ`X+_;!Ik{}Hf#W{. }Ѧ1.B;|tNH_L&MuñʔH$S??9 w'Z"*Z 3ğj=f*@7axיҙq.%.84F"'p Z99R$ R; v QJ@ݗ&i4nC3:ay )4&c}uh^[S@K4^Yhmc W7N,|)B'$-k_Kv֡ѵp~6& +yki $'9K@S)?.~P5hwYtض"[Lf}t9fz7;JIЂ7?Pl~MHcR̠g;0=^;fs˯9 .+71ׅ$=7ͤq+\>=<}?/=#yfTŋK}f(kV/pܟo4kƀvTЎz:%VҜӁLgy5+N<فL;@2lIؔ$W.Nςكm/܁tdx<lKȗlo$H—v?rwM{T/m;Vgl4+Q@*TRɞ5(LH5Z\,*uӒX9<7[e_]`'pH,_I8t$Cl/E{O8kѤy@Sp$lf`kIrQio)g0Ju i6_mlv[ BnD|I3@-˴@12)/EFr:$ݗ0[ݘ[po} ;I7"]~;d7e ^$AO2~5 IǺhd[`E2FE:5HluY`#^"^PDRd=db6[#üCHf3GȾH'6绰Uc$lΝ :H< 'v;4Cp14Z<@Rբ}}@w@{n.Tcɽq?$w!29n-Ne5|^e'-0~];ъX/\sX~Oh%񯌞 {YxU5>r1  ŘY2v>| fg *,֡G7=xW9R3/Vh:{ sF3$(:j..f{Qke^ah*؈<݂]=fP߁Mp_@;F[mvک3 Ǯx1}7'H|\0maXݚKέ @Q7)Ȭ}M04{чay/\0{|[Tv5JnL}.U ܘ:C>w0 4ۆ`0~L}谻&K5/'dq9m &O:ZE6x%$_&IM oyQ$ߣ~?s71wy yQ㓟Ձ@;8qp3']/tE6Uͼ:iiF!8yz_h?/aiFNgOJl'>2$sfp~O;hOMvl< Hf+?pvۇub9ṽo\Xfb`c> z Db?{{^nĝ#%YSޗ$ITBa Qfh |n=s=ƶ7ڬu68}?vb}t?̻7dy@~5sc$<OԊ5 G.sS\ߵָJo]';Iu >>Jy>.2}yyuKqQQZ%9濟# ;}oG6oYb%݃9 =f +׿ _c;&\J$$Sy|+`k_/C2HsU][* HӣtB ǼOfom '~乳 [:CS/ΓS[b?Fs w9S\ j{>7,< c s2g[WJEQi .];…Iv@޳M'}UT|=ޠ'|G#Y@R{Z\HQfeCׁm*a/ex<^߀H)r\҂.<_mtK*FاQӌ>bjOy+"-*whTCRc$xi|WۊHDtKF)~ $"qzwH }M *! OlsCX?V\yDvNGb aoMCHxb$CZ/) ZC2۲JZh8?3NnBɋ=?wiTݬ֎HnCpz ^ 8F/o['匾*92fv 0 8iqz8Q.Ԅ'ɢ_e(8edSn>|P WY6Yr{0>׽e/'WI|ot5paLK=6WK}_F`+񛑜G@~Dm*:uK*fv Һzm} _G}n~6bRSrbҵl Gm\xdȻ}_x:$nJ#@DηEHk _'@ecQ[! d$6r-m@3d]ǎkrlp/-̬ٕedKzE<ӽzd5O@n}rܚAogfW ?b11~Ok*?+3E?;@bZm̱g^/BR=4 K1WRڀ~@(Ȇ.D @k["Jϲʾ#O}&҂DT؞Dps "ђ 17ٳ0g"OKD_sd4"wag1يo| ۵D>;]Dn7\S"Q'zHwW'Y{!D2j*Mz>$ѠsX"4JOf!) 1f f̡mH$rka9q"ei{m/htZ{!Q.fm\$۳0$f^^={ I z!G;:g8 N$֩d$pN$,SvttϥnqLÞ?0 j!шkoo@-S(M6p6CboV3`.~Db3O#х"i4OΎ#dNgGMԲp'jfnI=pԼN_d>O>c;8MNF N{ 雲;ŕv(WTnj*Sz,VKpFsŅ1W`jp!pzof}gRG &]?X~d}~L1Wgbs;~ N'+8-s}~7>fm`K~3,8[]Poai^F p(y.Nx&cl&s Ge  .TX0 :nF/ۡR%I40aQ\e%k V"0˖|Lbao7qLH<f{: 3FbF=q,+l 0S8u} A"~ѷ vvկ c`7<m`%Ӵze%$0RS3d ɜyd\$ wRI)*C$4RI$2$N$P!dN|ُs>kzys[Q'ꭦ쫥A딸#Խt'"|%7s:Sko `krCj"h5s>;)4Lߜ]/sy[8_;MrjƅƘ+?4IJA27"fsF׼UQHCQYL9Ο4Elʎ@jUi~F"uXyqUֺ#H!j!}\&FϒGҨ<6U iPϥr#*5HL^}x[ggWJ?.)4\턐7H0ip^ԫ,)_bO_ р%;k xܐʽ1GL[ʡD`YsύFy: `},M_`pUL/wwrK'eGNUt`N]كysX}}{:֋}aǯacr ׋/pmfP|J)8`/2 ,w Qc^ljľclm\ ~2a}ͺG ,Se`={&%3bUxс5/8}l˰`q|>>}0_I87av%,5vt`Y}K8ǿj C{Y\>}""q:x'\=v~V?ClI.{/;j.iIh粼Phr@U˙-`yl%,{V9<L3+iCFY\9uXr=XyܟV+|LuG/v]yET\kbNz+? טeH%??28j$P\lQj26@}QD>~N]n+S P}+mxXL3X1}8; :xUt.E9Ԧ+x sCm;RkZ/i/sBj>,ʺ]H2Fdu-|Bj%,V,Djj^ZPaںJmR}s> ܎T3KMz"5CVH}&f&WH-߅. i#`^NҶ EC$ 8H^ ߋC0G/588 k#5rZ7KGtSgIRgKFb>\y3ۗӑz}_zɅڏ}.m:Ix׌ϝzmHm\y-"2720$%R؏']-O"6+fڜ֩^;T`eE(I95{uA ; XfTJ?+=9&Y X}x_~S)wt'n)g:)$X"}7r'Kנ"s{d<$ɑ>\;[|o../ uq?ֹsW+vj9XW+(*pG'/:vg6̟McG;Xf+xBp=o͋?EJU-S-eV?[),?ۺ- 5(Is3uGΆ|Wc$Å/En*r'K+w p߽Kh;{ǏN._RƽBXhDŽw-sn+>>8MJ)~ɖV?v8{-o ځ>ˍ@{ hҹ{>@sp_x5Sd&x9[jt `𮬍\ _ 2u/6c@(Gn?` kcT~s{yu o\wp53C&q1ah#b׻glA=J/!%pϛ|ASw,hvG}ZmQF (m2+КU bmiՠv Цkq+ײ0Xw| >.ۜ6GX?cf>x=wu_W 6/켄}Fd}SK?+zGh\_,z!Z;]b<r$|8/*H~oGԞuϙ\w~j5 9V) >.8\L;n+Z %!x;$:^=檁䖫Bx O,8 <%瓑~}M)k҆}si/|iҠs$s}4Rܮx/~RFK 6%-'zxA FHaKC3BFAHhp [7WhuRط3)s޲ "W,`v,Y lwZZ`<ķS'6` ?Z8þ)Wr;6=0#k~ lVVs(3`qӿ|V]J X7ͫ[ zϺt0IX orܢb~4v`x+Sko>%~1m-yϧY`[Ώ/01IkEBiI ^zr=iXcIkfFʀՑsJǃ5y՘ܓU{ h[`}^##\W`KA`=$/PlkM1,LX>r@Zu'U7Y+KG3c.75X_ޒ~"(~oWX5bY=[W]V]aNJhYT:Vukȁ%{X /3W a~G\f_ h5 4Wգt8 SPDQ`-q]^#re`m78_k2t;XY9VַMWM+Kqp\ ۮ^aa}`o*A>2'Jk̳͛ڸѪh>%x5< 5G[Z&i#?Xؓe}F4~u`l<^ަ믕ۏ.k7>wjcHuXWx졝cTjboR-2݅ԬR|dszXlxH0_]Rik#T&SZ'1plIs0RȕXTR?W%I"i.]=*uqU(jTUӐj/琚fO|_?nT R=TT-}S+ޒZ(|d򓒶SH9uH]L'Rm;rV︼>=F!MXHu_ H5VqR5}>[7_PEnl-DkMyAjG_kj[Y̭шTnoWnH72\%gRS=Hms}C"R[!0678m2UZtV4ؖr^n,`HP}ǁk:[ l7ƻIwZyض#Vcގإ%ߓ}p`YS}kUl 5~a6/,[:`D;}JpEДpNd+kZΣ]}OkZ`z/42K U^xEށEҰy% ԿcK0O nI;tw/5ub=PތT3>˓Neb`iSX^{N7=,{j\ ˽`ou*mS 'ÊrjGw(u&UҷK';Se[@ldX. ,klU9qo>Ϝg_O+",G*}+!죋[vv ϤK5*0?Xc.^DU4>EC}iEzi':4UFw M3EHVH;12ي瑞Cju5 xْHP;Ҙ z74μ|4퟉qEi(o(9؍)tX^WxSAU# ͳ^1VWiM92=F#'kƋ `/1tqx"I-i|2HAڧo갨jH+f0mW@Z.eIiZd#%w)H}@\=*1I3c Pqwu0Wv*"mk_bȩ8/s;Vm>s6͍4VG~Bat(!DCk[s4单N8ȴUVC*_fGX`wPy&|*X;6N;M0ׯ|m$oq9 ؋ '֊P;,?q]s$YNsńJ`f.jJ3ZCE9_$Q`]-pƌ쳯w5Y׃6ۺeO$k.j_|HxQ`_lwed;[~Q2s;u #΃7(طϺH[gW?2*)`usjzεO/a%li9g=TtU@[8Uq[h5U-+@c\ʇg5#[}`&^ d5%z1+z~N+w$X_`\sˬ ų|jY%!д/zP}qdGT|ONkL?XxM4뭞V`$4 X͍IW`|kKfuՉwe9`6rX[=QاJߤ݁:];!5K#NnGRSEW .m3)_׺+ >t/ ԧBPn`͍̑bj_R2:YHyYwABPC*]!00Rq=2fa5/GY1{@j_6"5^ɽې H2x "O;"R yeH>k}ڐRqN|"8-;nqTv<9#UʌRUUv8g'RQvH@wJPT]zeR6ZMU2)ucX_󆓻^u95`}n*s@si' c$8e#_EMuֵnt,$𑈫[~6 xmW]c?؜!PL샣l;9Y)3 E@}hwvV WX=c~v/Z@nv=Kp"¿7a_=+X>`7)6.G^l? 6:A@?%lb~څE9ui^=,k 4qhu/@r2]Li${9d6+" GCH}K"+% i$}I؆]\G&ZSbjCԚd{p9BOtk5cm3j_Q>dVuuC]dQLD $ߣ2G@kΨ0Gr>vHahG=O! $mV!NR-;2̏{hFr7cNS bK f $Ede3R%+ՕC HhKKyɉLK /bx/{[. RڤREA~[!9d$5J9LȽێ=*HV5&D݀}7w )3.0ٴ#"҂Gl7vD2NQygeԡ3civ2p68fnDswMU稟pb}I\ 'Tn8>C_9͕ ?חg8cRsǀaXG"!cZ7dzS×?28e´1y"f. 842GMqx{8۝*]lck 6*DtW}?=/꒏yŖG9q@kzOO>X?_ε;&;Sp,{TwBƆ4\M5ywP-W,:`yK_*  ,*.} |`jYnY Ty d^7-X6.pB,UxveV}`)?X ?_x z*2::N^U kO73?^:`Xeueg@|Y {ɂF|̱1XN#ZPOEY捍`oD?;cd\T E`%s4)Whvgkv:[#/'5&m˗>k2ZҞqEL-APDJq]zpOd"5i`퐷{ d?unYx[Tyaׇԙ.&(H5p[U.RpdPjt^1qhJB3}/!եTsgkN#G۷#a/Hu2H'/=;|;Tqk 5fa~8.5=R7`ER;b' %دr JWWH Guzj 54v$MRvBkfEI؉SH_ŠmH)·iJ7;ŏܛ#2+>{}̰a1[ ?lRX|,b>]><HcցP i:j4ڟ;x@ͱT~a KׅT97 5%-RJ?}FlF@k$ R׏M#1jA7=s{(OhJM!y]> s@P p.ع뫌-c's;0^s}O?vv3N[SĬ={ pZ(]x{r5_axnNvAyx3 8%7 '{N8;C/y)痼NZ_4D+EmGn8Oa%i-`zUm8'/:Y*-8~Jb.Lzbk-}HߙuixJ2η:ii^zU[C37=0O)u2XgfYwavR6py8Lj ߲3,^*pfjsa^AN}+'iXs0WX}t3Z.9K;+,6Y ֺ`e} ,oN}= -6kM`"$EzG zpX1b&`eW֝t<mWkR2)Գzj&f+دY w:|O%eK1:X1 ?/cڊH5+œy\d ݫtrhH]+xm:i%y^Qy$#YڵL=e{<'"#3u aE͛x۬Uąujo^;B3ms?Cq~#ZO'>A[dKo0]cTp:JuŁ= ]lpN{ϯyrwc]l*GU{\6!/v9v]aί=ovتA e_Luowݷm켅_⺒$Pyπ͂uNӚlQ0uP\f+g=ހ6 ='`iҺc/p}lN`:d-.tsi`atfOl|ý ?faK:0]e H3q`>̀io^n^ʧ̈y;,HOR:Y9ݚ7ȃhIk9-u `_j UH0d}f Y%6uig/AZO/@]Avkv~sԀ4]7BǍHGZ݂.pt#b$ioA[.HWt]h,Yc TXrLG͏I"Wfi)S컄tǴ^d!~UHgqZHq1E-\Ez"7( C2޿HƎ+8E:&HJ=yHDZ|-ѷѩH\ d% K tַ@zV.hǹuy 餹^HA:fuL>(DHrߓې3H6}#nT4tlrK^}\Mv{lh{p2$?.`}ޣz/ou S}i3%̻34̃%KQ]v,6]dQA t:f"eM \wK k]+o ǟ>7P طmŅnV`O>u_ҺWq6wzeʀ])>9cI쑋jJgAQ ;+.r`.y?ϳMO< ŒuS8KO`Ysx M3h69鉛U?(m|/ސx\/y󿨟|pؓ;..Ŝ=vKk~>4Ps7;a(}r:P dXk%%R Ycھ#:hyxvdfg]p BzR޽H 4һs!`aY>yk#_fo|m b{ȕaf kmg#XJy.a l糕;N_uz?MHڙGM#[JP*/XgQ'`Jc< ;^O;s`)`}No|Nе#*Rm cv eiYwXqϮz<W5xP-]~ZW汃|+FM} -pޟ7w}vj \_X%I+0/"'C <d޸z7.K9| ӓj(,9'`'k X׶2/)Ȼ{mt2.RODD{ni++YE}ȴˇQYX8HqNT*iCa$M>"| I@J6^x &}3_I@Z`gofRg;L!G{30\՟Sh 6 T|r ȕoNųku[ 3TV9KO%o]ʡٯg+tW8ܖSfo- 7pTvT%?/7vfVb[P* 'P4u,E ugL {Bt~MrH Qoy@:s ~@nW01S>NʱCZ *̡^zH]^lt_q \St>ME:, nJ!I1wAMϋ].nHӷЄN2dtupj! BT "B:§&*4Q<;v=-NojBN>V3_Nzn 5 OCz^U=Hז; s)g6yS%כkzMY }f<*ߪuuHB~+ +BE6"'+Q\T-jFz"ǟuk>^GX߅w 7pWn3͗ ;Uda8kVp1)ҟh K~;]_ ];H\NCgqHw~'?z$ BW_o6ۈ՗`}{]T o%7kxvO+^^?y#}8o};lw"enz濦0';Va8z7/~}qEE]2}R5&&XD`Ls"i\*`צ4 zU ~˘Sgn6?E)>%@7@V`M$L֝o8MUcx3vZo v9sX%cp5\٨s*s?vJ` *W>؆ `>!<`;$4Qyw뎈*XBv +t#~ >w `dq߆B0̸wYp P8"C^io`iW"E:Z}=> L >}Fgh`.sF< ;<0#ۮ|lBG\=;DWu7kb_ ,;6!).l!֖ЮTQgPAFxΝ#׀ ߿/ 㳣ߴXfZ %O=`Q~ mz_On`yK2 X1]q2:IjCd4v y2~Z፰"hSOF}m-o /VB AKz?2xml!_VEK!Sކn3d|zepͫp߼˅qX&",Z^^\A@ތZ"[(C;0+1Vg,y"ę*V2bV^m~^4/GZFDO;yjDS"S Ys"ҹ]وY%~HkNkEײ%!BiT\+"]jG*ݷz0",5 ]:"?r ױ`u "/۷_Eo q\ξTJGoq-NeEDH[놈Z~zzxZs=_L^g`u*;󃞗 -.ʑ1}X ,CJ^;V9S)×k4/$w{-Fw( dku.fVX;d[_k[%qXYr2 ]&'Wp>b.P@'l%WleyhjF8-s*51b ,'wp&wAv0QOg5s╎x-3cF~y;nn<ߔ7a*lkYGW+ agc?YIiX'~xT;~2^? s,Jtq0`k9%Wg%'q0rL=d DLE׃QZin0(:^ sY&j`(K!ߨ o<  ”\Mq`3S% 1:zu`؜Ou^e DGWa6E_ Z۽*#xd^ 0$)q2e?\r*zZ:Ň ȦWi0mƫcfrv;Q90%r΋_(z ;Cstg5EO8 F2gExUaߥ$0: ie`4UW1& zۘ{,~@ZwFyb=b,5/a~Y>!{GF;|Hzuiyִ`ozts ˍ~2C5>e@&I _[I˔tXˏĺ߮d^酹1zMY[5ϳQCM#3'|& &b~XlSZٟx!d1y!X_ZB0oٟtyUMOWb=~X!|H-ξYBf0Q_9~QڛODb!ޣ@<$ ɇ-X<|yYq)aGQe| ~u$3 @Vξ+ӱ_ = HJ>Tt@jf<nG1f>!E?PZd;piG"ʚ*,D`,Dn67 =(7߽(lBs9w5CLq#YaBDw-"?L("ez~iDxOLjbGF @?qQ{B"QJxkY)9DtAWD;WQ~w-2kpFDA6D1>ٽ)QE(PI9{{%I?!_I.?rOXm+?sF?ɽXީj)~hHϑޝF|¾G'M͙xC|04 rc$9b]m!; I/h_w ֎7f+rvWdfsCs~)0oN5Ng{'`>_ߥ47 ̢@ݙ̸x2[V\[ )sR,c_O7Obnjb}}D/YI+y;4 y%dې/0dJb F(}˛Myds9@t* D޾'x2xL #`U1ox@]H+~[k&:l{?1c`$Y"[%(1mE@o%\ 9RY=(kӆ_!nD07znw^>9:"Ċk{gQqW o1U2{Z|uy.vu=02M- staAhOs @D2jNDxRx \|V nTT kV`J8<",΅TQQi~Gb_|cۭX.Dhs? K!gW$qq~>"\9G@MQ|1gsj?#Zhr` ?"=~% WEE:DzD qcQ8xA>"~zHjY5Qe՝V|ͪ1܇/LcsǾ_ye!ݻp|\} z({BW%"D:{GF"~~)6^l'bk g=vGM7v>9K]uvڽfclq2<ҟ;(d0fN,y`u?~[z/.D뵅^`})k慷 -<[Yv~36= .fv0+wstr_5ۤ+L+qIsmGQ`;S]82wM|]-%stӓMhyj@ؕ4FPz`iFDRy}{D$Pʎ+2aHѵJx $]@e/dӄʁnKKNj0| ٧Yv ,]y/E)H||uX NWI^Z%i0)7#&$ F2$~[0J LFʇ_@YSD+N(q{B&+ii g] .уobnL-urvTktL^=(t)KY+@ߥ^J  jBO 簪r٦'qm]XWЏ~ p=)  ف؞q qQ ȿ2^y-7q2vlз[򁼘ԯܜO:\?ow@ᢖ^E-dޯ5}C҅\D:Hjǰϓ{2T9۱*h?coB@5BWwDPJ+")ʿ9DL>}uE^ֲkbH&O`zЖJ(vE LJifYH 棞n>וg}ubG_{p >e3[du8"}~\|ly"RWCP p/$H@$Wey/h8$F#D2=7]<9{}^"D܋]O =j9v\{K:Hi[%q~'5DMSkPǞS촇r >?~_ >\*Gޢe`E;:4"܀qW'`n5 ֶGteY0κvAR97S<\:3,M)U/kJ0߹lyP=ktKʳ`[`RR-!,G.+=zc.zB@ޙD`p J ¼X[ 7n5։]Xno;Dzb'u9`yHj~s[ ?z"BWq'$c1z-()qf3X?{* :j;UXǧekf+׍|~?G>LT߼zk`VSK@=R.FLMm UL,L{tx1^:YW}V!`|"Y~RO{>|&6'sۗ lEO X?S0EO_}'vbwKXy5`;yR097dHC8'QǏ. fև"'&! zLDK#mFG_n9Lty xuQ<*|TL7&"֖|dB}S2 )ipce+ $؍ݙø~7p$}={JGe̍7c}Wl/#:kD>zaX:n>jX=Z}cB9S{U'0,zo}J=4 InL[G\0l_o`xd 捊˵=XM-i=GG`_J~bZ;L'לּX> gT*-ݵl$`{7f>'0wi`]/7X-]uܓ.SûguisDP/_7`hXo{D_eVFןn~ 3܊\[f0X׈ Z%kuڹ?~a߫aEnP} <}Is"HHu ^4UQw+M0vy`nWgڃ zV Y;g'rg쇶$sT`vDnf@\!P.LTOcKxXmn \ 76`)}̣[TqMG\ؽOz0IDgY M-\3M 'X9Kkhd4Xn SIA+\ypm5!L/ڟ7`v|mӺb0}M/#3}`QfW=SriH0sΚ8ąr+0kozZMHyTe0s{Z\G ~yH;/fsgDmFBDk=a! I › H/q4yav:<[@TA/38/6YHSxPcWN }}EdͽvL #%f'"m+ ?"WͅH% r#L[u-`/͝"Fϕ͈t5Mk0^wݜ~G}ÝYXwoe-|lÅ􄬅uҿN\WԵFwOwio5~|ܳ 8o8_~Jاsg:[q_q-0=ɯZA|טKIq2ƾMD20%|\ܻ,ʳ6`9TsžL#3Qm}`Ĝ41ܚn#f7Oo30bgϭ-?s1k0|~0$jh `$.|s]>]7`{F+]BeqN2kjLCw}%|A;`K;NVFY0^޿>'2jQ#wx40F~ L`Q.KƱ08t4|0 BM?Y5L~`Ŀ|=uէxy@0Uy&coSzwc`8;0ǰ.s1k2C%L`\.oy/f|fmES`P!n`6yIG0wW4 &FzV`gK}G<f)aEi)y03JK+MN~`8.r"q|krɥ,0-5^&6VB+ru*ou{]ߎm7SU%$6 ~ I8非[s`&b֩%{z`s{,Dgid9wb+K3l͒%֏*I`*a<ffG* ĽwXm̟p|g:wPQ]gtTrUotY|km8e߻H`CVkyEwI2^Y0{j,Np+$DPA~y?q~,Dn-]yu$V'"BqW\ooWk5 s*6c۷Uq߈\+*A:"H'ӣK0O"tILFK,#o~뵚/H?C ܤz'_еoV~J(Vu뱮\vlC/y:!ƏJDg<ǷMFJ#"7qM GןdO!Bm:"*sshAeWz]~Em"كRDt8"!9DL}!AUlfdbpD8/^"nrʲD'%YlD+ۼ cҕN;D8*mN !^>^`fxl|γ 0}#S3By ^̿XUD߹ w&>P%10{p/,mΘfRX?Kk:uϻl;ƇMZy+^߷yOM&0.g6`*ݷ4 B3}Ϙ+ N'}U}l9xqdW15{OĜR`2 7>y}}g2w</w'Րk}Z`xsM 봧y`?1~61;z6i#;-:YX \m5zuXA`)]F ,FR][L+5 +*K ;?$匝HC0+ѷˍibU#ko^"0 ,NT]{ێ`'WMݞ y`>h=O8HoA0~sÜX0jNW簇fXl ;j"T3Y# yWXqznKY=^WM& bWexf1YMn'E`n4\i܍$`?dJsj0_ QL`,=򍄯 !1QG?b]0)~sW17d:_TS0WG[&K=-h ?_.=uWJw*L:JM>XE}u襱Pݴ/I]VoocWyIK-n`7 hbqQs2=EDHy&}q딤K+8#r;'0R~2jmj(i?^F ᪓wO,]D^-Dqszdp$7"?o(G\E_nYD;{ tA0hEt-:x$&_<~r$0]k*: gG_#Ny`Hr:?WsBY&0:OQMGgmU<ν9=;eDy˱%S0Μ/F?o!/5P?tu7;isx޽mKOh00 aFqC`ȝ8tAܙ3ڝ1/:aȈp3k̳p}o/x9gHd+VWIlп7 |c}Lp|=և'^>:0RF?c}8*T7eс]WHzO19s 0tp=󳀡p9sUSU@5zvdPEa;EonjD*t ׎-Od؟k[Do`bXYR׻jk{Uc\LG5'I`}B?x7K+1ٯj2P;n xV)T5k`U(`ֲ~'P>&IuT8pNJ3QKW0nPLӁ2T0PZU&]i`9bm`0qm1٫/HmVXcv^#36}ˣu׸9;W׫zyAծhuWQPis9Ņ(A ~/t!S-ҬUM׾QܮU]z|?h+ps y!¢DoF"Bɫ}/p*A"D܈}䑷&)|ef "=YT#<݅Dww8yyҵWzL| >0a식 s l'DT0;e{n"X|I.3~$_"v?;"Ս!v'!!\w58/ $<%J]Bdٍ]6Z"4yovN0fxEק5f4"7n BƟ5cWTBد{Dx׉zb"aFhw>0{&Hk 0JV})zx"Bq 摑~`˨}||er 0+N<.qdN 0 Y=V8 q|Gw9M7%.wS6am[= whPxbyYO49j:6$n`.?~T+{qv%i_@sǹg@7m%%za^\ "u]y?>|kr_.g=y%Nȓ]ɢ>8FvzG8X_9&پ8wgLu=kÆUjitO=%;+q_`W^œw2}t㸤 Mv~kC VǤlbdz"XMhu:Ifn`vlBWx˝ndzN;/>HV)iXHd'Z8$*bUo7\JM*`1n0`F"'VB*fTo~K:Я XPqu<+X_W]D}zu}Jy'Ah;q'Mo=G]PU ՓN:1{e@{>Vx`E'U: V8Nr0]VeT`+]E&.<?VZ):t7X%3>UR9y$EqqOtO5yM`^4ME>{Pnsc)A$$X 2ro2s?VNf܈ \s 4nߏzp B,y?0$KUuІ YkIO/gwn]\(MVǀ._=M+2 #L%N4~z1}E`ms7i{ <_+1570Ja>ۤ5œ`rciEN^f+֩+O~NUQygKss\~_jMt wC0~GK5Rݘ/6 ַI]+`s먌s_ɿ\m' 6y^r;h0d >АFs#=FGSli%S&IHĈ'qLMZ`iuXՁ/"m͗A-v(e<pݤC&6L1s L\(f[Mꇿ`unWkb|8l*!M;Uݲ&OSHf5G#y}< !rq.?"!Tyiyٌ"f5@3Xd!Dv* Ad놠vDU]vBdJ Jȋ[je|ѹ#"?}ӇH|mY("=w9k%b x9)JbKWdzCqD7ȒE/džMV<dn?uDVr^~®[yJ$Ow~>ڛmqAmϸߌ%hD tZ5)LVم([E`y˦D~Za!Ώ"gQ[ss\W*"rµ1ܷ#.xnoD\T*ٰc6MFxrnen0T\€%VoƜĤmtW7ןw_,U̳#اܘq b_b0J_{ȊMW6y̏z*J@;v L'2@ *\zw@:t' ZJ!`?90TL0'SbuڏW6b]YoSK~k@Is#7Ɉtxt.byWwzX|kHX7 7m^$x=oݟ4 I/`RXZoi;n yjJ907W= S=jTK_/ Āa01ɐ gW,Ea~.tl`Q7F[q-l@w?p [Ե=pu`]psX/@ q'5cI0b{7$X'6hB=;@׻0'Z( NjR6GK}i[7S? OZKlnM{x.x}}oB09N_mIX̝ŻqԵqiqgW RֵaL^6$Jc>6 8`se| 3`LfZwtYdPY"RC?g-`! *DJ8 y }E$ ~PcYL"K}| ~R speI1DY;uI@DZ?"nNus?@gpy'D5;^ku=ҁҴ桱H ~l r/2޶39j?Пmc^w̋_#Ym."]x+n*sg x*/n?I\"<_Ep}im݂@'lM}xUr')ٵGifxoLIjǼJ<>l)oLn}wڟZp;ZWqfk^v,yj_@..H<}w,.Ɓ瘆3@3Bx~ga1d[F;V-Pޱ+@@NM@k1$ly\ }@;i~>yiX󀵸E@I u[y;x٥j BW-YN(^v~86WT*uwL9#(Gzu)Ss֯- 6fnدC;Ӆ? >a7 #cLCp,22-G}xZUoA>2< 5 }CF]3#ݛ6E !'s琑m#roz',.maQa!6Q%(0:tE|; 2r1Տ]1kf#CձB=Ӗ8> np[k02|p4 BQ(lFFJ_~({w+ dl<%2Ƞ]"2 % oWܽd't6"sFpSNZh0;:6\OΌZܑ+ U8!" [x7 n^%:bZŁz$r!Cʭr-p2Xg4wl3929'O:?LrFVb1D,sW̽כRw|*mZ۳>dqS%X`|~vGTz.rɋ/XYsqy>V5*y7}eP(x.e6Da=%R`3]Jq@w@O[EU:\5\x~͙ *n7cyt?KY9Dh]h=]{S5SF[}|/wh8ɂSa:]<ºr-״mQYeGS7eʁ.vGuئzIg EybG܄1_>kF[K](K,5 {2خ0f]XbE4 >I!U{|l#ϭ o?70ϞUm x=s% gz x::UF wDV?`ϴcę!A3)H[D>hT6;x$ydx%֍'TV;W#g͗`tgp:"[)uX@[-H ƒ;zB}ϲqWƯx׸H.D kEly:1YȸE- d{7ߚ| lEm%x1C{BJ? 2oy52[#/"bzg]%7D$@ b ?Kt"2Ok2J`Y' v 0wV#ÈO>(;< o1%9.!#OG^qA OL`}SЗtɛkJ/>Zbι /> ~VRs(X2G[0*7 mjI:* =Cwc>tiiyAz.B_)<_ r&Ӏ .tO.b~.rlmu8?'c$g`st QPy$d# 򏢔_nAĿ"䱎d:"hۅ/[_s WXݵAf(]_#ݳQ9"D^|{o"34$!}0"XXa)jw2"W6cXh]Q' 'joxWnt֊8t<6߱+J-N y^J(7\DZf-ߞG~3)@%jYYq^5f}"vd8M@>b(ş}k=v]^iOdT&nJ,dsRbt̜'5#@7WGOQb`S^׽h|isPw{=xG@h]*:zg}ePH\jSAP/?ԇ%oN;㾝40Vgi]S}ZS|akb1ИڃBq|*bvy= `Vn}R+Hb{4C,_d7ٳ屼Ko|pm+G!*X XY7?F_/1ޯJKc{KXeOAX1+md uNn)X}{W \zzH!`y`-nKƑn9C}%sZpM^B`iw3`åB٨ylr4t\v(lSuX 1[?Ih@Qp3c1/݋5EL:OX/$n`Q7\ ؋{BJιSvn\I$`ʶ@ Xk`w)CDβ!tɍ|Dd,YrCDOɅ*6Z^ USa mO"*WBuPkC"ƤGrFĦǟ7"b){Dlﵓg#k( 9_1֬AjlR5+Hw}qCo4! ><>ۊغ kHߥ Dxbҍ #¿:'ibʧ* RHyN{!UNJvPsttFNMIV# ,UB޿̝% w;تz̋,ab 8>=љWA1+@;]OZPھ>}|F;޷^۵-S(`zE^,3{G^s[sUGÜ@+|'/}P2u6POqx5ԿPR^ 1Bb@:ro4n%bZ P6lsM갳㍈@#l4㪾@}>VV^L^N 8'Evlm "$|jMg@- K7B׋1v5kc 9P+i)ܿv@s;,s#g澙x0P]|@f Pm_zX Ԓ=̧_\?0m_?xh[xNre{طлv1%V*\R,q)uXJ*̌.]gıc%xs GC}nB2In'X^&Ӗa3%}~|NB:?w|u:P ĵћH'-gϑ"H;dT$N~$ ~qgo.:~ˋ3ZHvNcVTW"'#pi==kK@Z#/~V!ɑZHPJQ1C|#C|rïGS -ເtϪx]GJO$-!՘S#F:H^5jh,$tUL.Ȭ`~;VT e;.+winx qS#Jx/iXX|\-99gNd9X9%j-^DjHue2 Rcr4RiGZYo1zwoye=ToO8 ԧ:*Y;Py죶{gI-. y4pz}hPU+ڲeumŶ@]ڴh}ZxR+ЄYݖ2۫D\W^eƁ[/7=Y> Kx nOtDaRUJh%f*VdNBʁa=@ VDٞ< ?+z!ц[ybcV n NeP H Jc޽@m_n6uiw[;pF~hύwEqUc3;z>ˣ4=AD+'P})ux,PE9Db4%V' *Yh^"%2! _+cS.;3SX-*&O6`Yd,\8 V;44&?#{uΟWG``}*Xm,+_/g0|3`xQnbs3ٱ`)Fc+XV39`NvXEc#bv<[N_Km< ," )N`.|QG +yQ]ko=53p~>u6ů}EUtd^{a?ݻ.|ðX|b^?ty}sp96'֞Y;_߉ȱ}f1|o uU_+A]GA*O"՞#[L#Jv#ny$R~G.>Gػw#϶t"_ߨRA|3 N+!UЏHv[g3v)ը6JhH-⦝Hsn/벋Y):HȽѹj_z14Ο,igK 2jf| y?Fw ^Bg:jyf.RzzMLf))Moz)R~o%R5_;-yH57 R0zR}q!⯦jFQԘR~ddaxFA 7uĐ|G%v.<=e, %s9s-1ื!փ^*a1H@1]y}3>^%.4G./rߧ4 u!A ߭O*I2o/@Jd4'^]64+@ /hO_/۟3[fCj^jܾL l/(Ԁi&j'pSU7gSdzwѡ3@Uof #V̋u 4tV 0c..ڀu-Rnyt]Kխb]n̳ pboRͼ b~ $nkL *Ŗt\{eW;T,porφbʵ͂^); ܮ,u/c]7uʖ ܔ䧟O? d*$fb }m`۴ݯߝnw̷SWdO+|X֤>6I^ X/ZgըghnW;%%MOk\#,z9JK{K rb@kXmؿ ւ1ݢ\~`,>e,[ ySf|7 ޻_?Gv8|yyľ]ɤɒbOG H~`Z_~)2i<_@܇vr!EvRHu+ɪk)ꐊ?]]>]Dκ./ EuR[JPlB V"S4C7`h_. 64!o{jؐbՃHh=Rz W>GʷUDf>t"e| sHnӊ |m>syȫ'.LlHIHBγyhUī:O'")?"8בbHڶ&b^X"*>iEHs&RzV+/1u1ޙ)]R ) +o;TCjB|CJ/͗eΌw9ù֌?%?a lXN͈F+C{ 6}O@- .۟ ؏Z- \jϴY:P;u7rKjݖg8!,l_zqs?l_-ѸL2ƾsԿf0v7h67W(#pX2g"bdkuK[e8&ݵ7Y^>8DϹ[?zOͶ#w2֝p/^aN]=n;#m[tcD)gg%eGf֫JMf7SX-W)Bf[;  &7g)XFe<0oN!\׭3/j|Po4Xcq1-Sc#)H{sזEquoX7a}EA96MKۯRN6Ɔ8Nze,K>X/v Pџӂd,>?j;Sp1͜8`Τ~^ggoaK-^DX=)bz]Hzl\g[DxciMGE^tsFlmCSRL[k4RӐWl|q3)}OWfH@E`!?&lLc ãjLzPo <|~d`xs;c^H `602{/]h>Nfw9[<> ~z]6E߹.w8xn\sceVv&u,+45Kb\ܪtCgjx7w{/[\?`nA^.(}\?c+ih3py1(ǹU8~}//ƚzNS {~]XJb8HuqZX r`pSn/ٹނzBEVjVQw ׍4:y"(~}0wM[T<$m} [{vwgE׻}I7jGU/ i׶TF e1[~.bX}U+J]`fff$ޝR7h0㽺]N<<p Y('Ry{/9 ]`B3,`Vkkƃi/TWs0<" x!Xd<@+w}+&{լe'^;Rԩ?2 [zz1Z.Ҙ7.y4Z#wK!MJHcҴ&!45<84B.uҐϮ-6[:7NJ=*cqw!q71~_r#\Qi5Wٶn:T މ_yۿ4Ŕ|<"HO؁ceVC'=}",T\%r0`m}\4N]IW@GoA!'Qwi]iʝ;VuH#c!qK@:~\P'ےws5n{@|"Pnþ덣oD0u ?:pU̫\,Pǹ#4.٪Q-zD|Pg;R{Աk][6-T;ӏ/OR*!}ŧT?ŇR\.y̰8>Η1?^j;W1Nۉ'jbp+P8 6bn=jOcIqmj,@<n><01T%y7ρj|ج v5Est!aw.έ:@s?@4b"ֿ/jB\P7x_rJǟ {UGs"gzzUHvp\(rwnko53 ,tBJD-d]B 7z(# L%qYB`m)_}9q`~]ѝ=|(04Lck>m?{4n<_`8L2y.qiw00F50<"4&Cw\a`,%9^ &ovm D.\T-믮;Xq^1 K`J{Z0 j+<&]'`m/w[D _DDuh5Dh_uS&\\h7"~N([(Bu#ވAz=(UB\@2k|l$xWpm3fT>;!"' v)ۼZF-n/YFɫ4+Ϲ[xDn*R؏%:Z[vm>λ/ WO!+fr}*8=I:e޿]~m> @`?GF)DCJ"|AY/eqݏwV^kfw976!Bl,ㄠ]7D0134Sǁpg#G:Ƈ7 Bɧhe7Fx޷=; z|0PnS`ʞ Px.&z ]y%<2YLVȐ>p?sn12椏SqP4RvaRhML?f†VeT72,|O]V3ԭyql)usA`5qGeCP_亄dK^I#JL`}iڂ&̜m;Put(T!UӔ_~ c>MԀMiO*[~:%" pl=LM8Үnaȑ]Ɵ#go_m|&ˤqa?]q]\y wM4x`PY>}25ԭۿځI崯_`W&U 7nq`0 -e`:|Bّuɳ:& ׫`-Xa& üL$f~&Oh`TT>ioH9yta|dj &1k-hZ19`\=Ԕ-\=;#Fc GQ#8]mN۷^?~Kg߂UרFnjL`Q r ?'ʚF )`k "2Zαǟpؑx}@t%*6DNo*606g& ѲB1D{B~x Pr>oinYk&7lyyPD f̋}CRo0r!,c9~RTƅ}GWC1/`مߗIhF#O9cLfz6,RD}J;n/<?Ϻ+ j@-H Z zX-ZU sS *֙̄s:+i&.mu3w0/oJ&W{ ~X D9G0`(u-I)S7@ó׆`3  f_}:Hƃ`P`9/d`m je\:(/V{A;cA{(S:@PR0p,OQ)z@K2&ﯿ@Q(b}oA?G:oi%fe[gRAoT<ϕ:{L ٫¦4> zR݄@L\k%:]*݂^|\cagy:q>׎;<!g;@ٞ x_w{~8m\׌W=|Rbg}( C@ 2w{1|~:[ {kGdWf"sd_Ad%?^ OEzqDvwEVoU"G3i'w"ٞZ giK1N ~Tzm"ٻ.#"e OEH!ķ[YY"M'k!2ArT"ӔwRA"Խh>ᆱH]fMe:(,"޺CuAΈWH6k;Xȇ?iz{V43AHw")m<5z߇}x}Ւ n$  DzyqD6}˭7ǽ:ȒZfQ^V[fPD}u_ ~F䍁F r|S Ily/в/~hy#0 Bq@S~ e-k Іʗ?~ZIDβI՟ ZߝQZ~S@Q[|v3.D׎}~}KL*Zn}y@ Y/R:>jkۗm,u,Y]rh.LM 4_:qR5sh&t$yv#r"ؗo_56 nD@#O1 l؟sUЄ&|kiR}WH)P y 4nšdhAwpO7hOJ>:uY:^˘A1:)ã2$l=t]Wց Y6~ 찭Z 0zpJ{ v1V0(:#x_g uq7`FŴ vK`q` }&Y ,sP^FA NmP9(훊0{M(wN<58Ή%ґ= 66~ër(l P\۪v)!0|92m+}(=1)Z`fe/ϋ=ڧ#c^SVGiP.J^몑s:PPZA ,gtsxZ]!sxM߭W^` pu(ԃ ; d=C<8ktx#*ˈ YC Ϝ Ft9LƆv!0>DLHW`lD  G]-jqSU8}1_l z閝vlž7juՑ[׫SL!侴/7" ',sI.k3Ra[BH!N*0,<2VU^nއEDinn>oQFՈ_H;%F_ =Gw5"ݱGq>w|7pWg:ɻoC/PG@2֟[986l휏;NB?]`&jt8tMSbOqs< .brm/-o5RUu9N hSH,<<{p t-gv_@N%'Х×:B)蜟g2hz,20ʖxТ);1o_K`P*gpo[U2ϞT @[ >ܻūp^# h->u,ylz%M8.2[ 0O[U+ԁ ?xNi@ވOc:غh~Jk-{7Bg/ş3Ӝ ߟR«NwDY\Qfy=P 7sN`|'cΚ*{_#nAa0 ~{El_Wq9܄* œR&`4JQ1&0J3wu_X/zЕf#_ Ǖ`$'Noxo FL4D+ vF {Ra.{T8yX; |`xAE㎮G q;']G)8m9lM `J"rOo},N&+>,*y.<)vXk;KeGo{b 8VMA0  f,.so(4+g(?YFFH|q{s-)#)=>yqiJ1[+ ƮHRZHdU=7|] Ҽi%xH&anrҸd&׊4CB/"gÜrORiϔYl# KW &7+&)IMi>Δ9iLgI|A#l!}Mʐ41+dTE_BTfwB2ԈHkQv۾LD-`mtu 1(4pQA{ ?!ZES\p>*k(t26sXy~fhz;ו in-a݉4j2R &=5'ӵ7W,B1ttKh{Bvz h5>hwnJzu&`]xh~>~7J'26mv]@k:Uk: yytcܞ8\sd~8\4o40V >+JNp֎͡U?̏cSuWCsˌ*"^ULOq=S@3frj}+ n 9<(r԰ :杳%VhqTi|aG7-9-*\ m'M]8zbhga2Д<]PIЂ5'ڧW_6F+Zm 6luJZV5P :*!aNJf+sfM!Z,XejRT/0P(t<豰g&U}Titƾ=Q/+00z ($!QX''2%L=dN;OEuJ~ &P[cڀ"Z9OOl| Bo67b>_T *Z@I*=|ؙ4uwYPK5~;y$"ΉXy,6Rή:@)TĒ5t`]*@y$7X >?1dEE]$PTX?uP 0i|JB5zH``ٙ xd#=n 7i`][.IǾlX+G n@:i/#gܱl27*CtEU 1:ʍW%DzI 醭)ڱ:{&NF Ѯ[{kH̓8 HW=qkl,;,VfD/)ڹHX%&W,kSHͳHWBi  BLH,>t~Պ#K"H'e\#tPr֗"/j]HwH^wӨ2a2M H15WE/q?oU#֓^RH&9h=fIj@8y9X.Ѵ5dM;1?utX } tʯ hRt wjw.o>>ǿ<^^ooa.?}+P2aMxsj^IsޣXۗHEb3֡]>5RAK+g}zY@W5wюGsN t@w:,.>ڑtnE}JwA_[3賙==Og@ϝY) dVf[Kg)kr@zA3 W} {?1}W6*߱Nsww{@0~ і rv!{.^=ޫMo@o`o+ kK}ɥ C13@OdDA ^?'onr(Qr HlyMhcJ*ߤ}cw(Pw|%^ wm 74.[d!@^{R@wzk@/k l[̀~؀g`O~zmAgvC"oƁ~a4o /9O_zõ%FP%=0jC.УD.=zp@?'Ȇx5&=eq ׳}͌?F(wWfwGj$/T䴨;sV(|q9ך?Fݥǹ")eLzRbl20`~V7p`@Wd zr/~ v"@tbX@yr+􇍷숟*1e-P>{n3q})֝@iWbג屏NP\ .+@%oo]"yNW)egb~%^{ Hsk`5_aO+ߗWOski_46Fo;W/W46~OJN[E9,y1kʂXP~^'(*<~Tv37n7:ؓuD@I.R&TeSZsKюHhݑ>EmERq?6Ԗ&b@|нH͖H~Zµ#v?8X7lrFM ZڑZsH?.^Oj[aJR;3nu~ȃ ih;28ڕ Hu, hlߍ^I4:O'GvXg^YZ4 &s GAv&H}:gN^'Rzf.îR/ 9Ĥ=7RaF&H-a˭CV^b2ީ#ӳ}~MСOG2s<,QEqmHj81..2fC96\Ԏ\Ԥ4=j)HŠ=saA [\X\/r3t?Byl eq /}Eehȼsൿ.0OK}7пv~㽹L|.a֙9XֲT3{˚}bzTs>73j({ W@?S9 YR0gU buRv#TRMC_ d9P3=a^z'q!uQYwlkzh`c2@=QLzX@aQܼ+"@|]޻d\~?}3dz|X 6>*a+uNk0u0@i)3o}W:^>rP(F_䀢s%0RF`P;sYVq~_9}P4Pz5W(3syͲv bpkʸUMkPFx+O!{^(k?F1o a_N^9C̍W\NN}q`: PbZo3os C|(!(`l{1WwZaѡ񿸎u83ὗrC"CR<e{Oٍ\0`2\ʠ~tnPܿ<=H>lw >9C/>Hz6} P o2K?:#TeC*mY>˪Hu]Í8ǻJ1IG^wMJ ? \##e{ULC*sO߾]@*VsHeLry`V R:=nߜ܉Try+lTƥ\fſ|nHX!v~o"#͑JmDʓJ|ґ5uv:!7JJPʵɜRT3Åʛ=0q@6 Uxsm^h";j|'yXLhjGwSWeΉ7º-J6*BKFcFf O˘_m%.gxI[9SOYKMzKx*R;Wub? a͟n [uiS+vwyFXg59?rEcYE`~>N*SvLpd=̟Nۊ-bY8ֻtQw`z}b*wק|T!'!֟;tγUX6_Gf>;1߾ap14yY0/8 tç1u})-w^ N>IA`NK$ Ͱg]-k'凁tz_`oe,9عo߯:%0}2 {@Zi63Hr 7W-a7x5',1vUpjgfl=~E3Ye$̝QtD -8{v?ҷG{4jXhU ݘ/@fҳ{$:ibK3` O~|b&58㢀Afsi/jn}-%\cCHlI?qR@3eH%{ g2tv^@W.{r}}LE@.|6\7_GQHAafij8M9xpPUWlIlHVMKH;pL4x>y%4[F#Ms~~Z{<| Kyxuc78Ѕ4&#+cHsBHKhCG# x25OJG+pkz:.?GuddH'wݠs{Agd O%~BrΉN/(T+wovA<oг͔K?D98ݡ [%m?ãﮝy03/=8=^&}nZnp}vUzdmw>BתhGEyp7ܿu&j":Sȼw7} ;Ofůyi./ɗ]g<#Crp RwpG֝`ܯ>^8}='c_.x܋廱_?y9C8#}K4'Zh@aD΃Qud yhN9]Ň=z@\=W5 }x~mm&fMC'w8mbCI WseZP 1D@-+K@ӎ2-)糣@aNEgq_GB f'ꩩ{$OIq@lx.čK9@oBWOCN! T|HcܩCxlY/\{=O̥@pX&e1qܯ;qmo]Ӄ]Ԉ1SUxvL|`"Xad뗃@ⷳ[v|@t}D.RUؤ%}hEXH7p5"<'Gz9aRyVL6d !委Hu2tRS;Ts4]) C' ̍j苁_8nѷ gf`n&nxmD"YSwݐr*`]Cj,Ԯqw"5ImJ1w+G&Gj1uKHːeWV#RwX RKyTP}vI`)RpYve<8"4T+43CHݮcq^ݵUA> >yIԚ_=X*:eL?b!ԞGL_ Bj G#؏o7@juZr"w[odSqNGֽMy9TioFjNfUǁ{?n sU}spmJVp{Q:PM^];I,^s}!qN`y%VpG|)}~yao>ח?s`5`Neh}p%cǫ~@՜ _(&;Eˢ~'ScηNiwf 7 <xNoގhNdErDK5IEr>ew@s1=3BzHH^$m?[F^|-yD|H~hx$q'=symx)!)~qg5psgPZAҥnv"cq?f{[H[Iiw<'څ+J40WcBCn? #AHyRP87䑇/H"ŧ[~B O|CxIƝ58hH!^4aƇ& F$Cgr%w݂ڒdF`Z ݱ)4D D݋^mH!,euRfڛVx^M-)|&UmܑҫLh=INH!*3^w`)YQ<5a m vq a܌nn^kߍO H$/W!'ԐcֿH!F3ݲ7 )Z^~ZV"Þ ܇Kk\ltn*'콤)%S#9[}׊nVn>;91m*b=?x*k5?~Q(si}z wmUgǜ?:$S8>XG#G~R5OiZd `JsUp/qJGO|~Rgmy}5Zi5pOLw}'1GםVq>9$+~c47]$uQ^:֗c'mȣSX8<"Gb," sW޶m>Ff)s 4 suEzsa7~NW;/_VC?NlMw7caahE~ ezJ4@ge_N䵍bA:SZQl2Hcz56VqQ> qIC /E7Rɴ- t%"` }}f>xW[WG2yA"Êt?mKm֫]c;B@`w>b -}#{tYBb#3T}( tGC5Az8CI{7?f w ~ ܬ\Ģi5ϝ]UE|?[i]r՗L>"W/H @sһp)ݖ|Gu %A~EHi+/HEQ̙pm:HY "nfq,#a䇔h#ޱ!#OiO"]R; )7RfG*κ'WVHbr+W)R.{2ہuoHi`yTT85n.!&p+5bX˞9=¾|>^8)ϣJWR2)vFJ_=fr)&" S|',2mB)sE!_a}HE@J<ŧ , ||cB )!IxR. )W?oAIz+8)h<"k <{.5hywz%KGAbFx=x$pTEF1s:x"T}J>yEjuk Rs]oa}xlYxno;1C'C#GܧGXH=8fg/x|U9}q@oSy)qaދnPl0oAY|<6K3dҤVfK㊧gx\68O#hm7x԰^r&yl:7r߀!f,( WuX?*c)*]2K+CܗwoIV~- ^|-LF\@׀;"5Fd,Bէ @x)*.D E ?u > ]8Z9Gh/xbSH$M.^ J< Ŀ-WÀ3Dgluó@{d+@8}G)|^C,@H<`<3DMWT{/sb̾ T/<~ 󩾡st\B  %!:*FxK l5l-`ݴ/q :'D ͤ]@$s #{vE=WE'4 JJ.B߀nSצ{kH:[9$'˯ɼ _C2R*,9e$}]Y3/=69Td{]R;N! km,f1a-yZdṠFBBsY,p:ݍ1ݪ=BKuM;#yO[/Hn;Ru$[⦃40by84;RPR|#)oeG!_" [{z,SOZFM H~V??=?UF$zmvo$@8;)->Vپ:H$+nȦHR=H kT된]DGg$7~xɧAҝtN#1ϋ<Ǚ>`6ؿbK9k~ګ?k c9Zuc`FEwaW 5WXto qlaO 0so)CAW.P텋&;-ͽiQYvrX 󝹽灑ql0K1sxԹFpU }8_i \ǣOy* W?8[܇O_3eKIYF5`YJA~pz #FE\>K06Wrՠ뮠iqyvh t])AuR}ց["(iSaNyx8u@phQ©ׂGÀ,^.^J$ҽ=S%z^ЙIvnйQ-cg{hKҳUaO^Sk;?7rc`W\`#^F}mn 65Oyh+;1(~qIaSP W;]ܐ2T=kիWc6i` G#F'\O&gqtG8g 0?) 'K}1@%Lf['t5SHttvw8)x2BD2[Ҕ`|+uȴY = R$ `))ܧ6WrF)A|Ig Fҗ'y!Mפa ɄGn|@2 flrHv+;y5x]…c8<ϭuq#gbP]@mq(\A'OoRm GJb4`dYtE4s(wzq5ӌNۗ CN !-+OG! 9Wp4觶\JD@?*<5ڦ(}>רG;[@/\ +;@o-Ϩg ^9vW 7$,> Kf51k_'yf<~xUkq ^) mxhyWEV`, ()a7ADWyw,U|rndz@V=-З:#] ze"|YAojb8hw.$l{ \pn0wי ѥM{*"nw)HsHԹmHT=M Ѩ넄_ [9ؐ`ë:=H0pVo> G-ؐnά+H԰`4$s $ ߥJ^$b'a~j9?UDHdK4)hڷ? ߫,$w"-2gp7]$Y|$"ga2/6G WS$z/!x4t!qQgI5$*M{3= {`S X玫#v6 8_EH!5{`Zy3Eb2smO)9MWlXZ/ 96m|gDZzDd}lHƩ!d{>_7r}_k9`?(tz9 ܡ_fh sK )4J-_`m4Rf<c)a&@žPZߘ6*;se29-`suk` <ϔ.NJlAY})+ ur$7i CO^}~)gj۠70=v|9hSOJǾ^lq̵mqpˎJg:Z>msֿcοWrcLᘗ/:a~4UGɴ/dAw$9YUv+99h_4ËoVn;C1>+)G=h0X#:2R^gduL7r<}H;3gPK<2vJT:hIHHGf@Tx< 1c<@2:H2{Fրv wҦş-)MF^[>??,y31Dwf .!WBBOO4#9gu:ҹ쭬/qv(ܿP\xj*Γρ]. Ľ(~ç!!wy"@'cٙxy"AK[R.$0vf0 '֜WŜX<"KتuSXZ M2Vk59bR$`p; }xļ֑ |LPa>5$\u+6 Ĩ E6"d)$ﳐY(o@|/"gY6Tq\덲!KS݇ڸwrKycVw$[=ڌ}纺ܥ]ԺK%`1Uv[sSj/&E'߆CF_񯅣l$q|%}s 1~$`|zQT0> }䙼|H%mqo"Ty?6|z>LNt?syd\>Y^qna$.+(^\|x3_iMGg S+*qD4{ScBxvVF)< %w= 9Smn|쮰 @Cv|RįԻl?/;l|3fB<fْ{toi{ގnqm\:]h3j={E,԰!A{x-ƝH0Z娡"p$r[ZCDHPԐu+_ʑRC: p_bœe0.y?GLg_j#{8`~U+HBqHp>}V)Nc ȡwop8mm0mũ8 |WBrt n^r$n?]3 HPYFFe 0V,n(.e'juk5պ |Ŗ|i#0~E6-B}PDe_5K1rKCL_c}ς@>|#RyYpO&yҤG+E#*oӱ5?R}Ih̩Lnգ9r>Ȧ=0@,tՂ4fos]1Z!7 Dy_#-G!>_+:q,3BެAILi9 wA+ Pǽ-JĞ鍴B{4o| ]1iڞ}w?G][b 6j2WĹ+ 'y >o[7zK>W"ݹq_ώ1t>!raSDtb:OX"ƘCyBoǿӦg ~w1X5 `26a79Nu=0Tl`ž| a\++"QZ!`` a7>&ccǽoL?mvü_kMK^쇽g~`b;?) ue-0(s 1 n˃}-y<f`^^ځ'Ol(Ɩׯ}ډOYaUZ[PSZ>;de?i$x ~NϙfY*&:k=T`8@M9̒f90g|nR-X?;˸? L5].Wcgs9$]l!nSoS/ ظ&d˩=c.lu?;~3(OElY 臑-8\#*eO@QJtxBB#s1}׮0Й5=}r/pTh~3S)SJ\k>+k I(*ER$B)DD$IHCe?u{|>ᩌI W6se1U9>ʁS?|Y?jZ'i-58Ïyk̀"%,? m0_wɟ.c_w Ps`Fq :vv tV}il/ti| RܛgUe3v( +O0}OnW1cOSfO'/Q#F̟N1J!GLH8/%%d=ᆴܮ0b)gs?1>G[?_]umu˄u} =FLT06W#%;U&#A0˓z$ؼѯ@6-Y䒶>DnIK+V-C[X]N c|0Rˆ_S҉y,O"ϕH6v%`$Tߩj'C/-+qtdˆ`t#s.DTϡ1O[r ceI*MٓN/#&*"Zm%6ug{5$' ID7RZyÈo2#> !jqz=8Dχ\þ5Jvr=!GK]]. H ĵ'c}O8pj}>͒Y-+WO#||ndSXYȂR;&xt\؊zkWa%1 LkXwc:q@zQЉR~ tN_tϘn,:'@w]L O EdqO8oc>t _UEOxꨩܫV#*֌6 :YO:wt؋%Эb9G̱Rlg#qYwSgt ͇ͮdAg0BkQ@q~PihLD>g';tNDqz*R&Aѽ] tKbKqkWGlwb!o~)t`b俏u<301H! FSHoˆWlӉgB+`n @T.0@L2 6Yƒ)0xϖ:Cd`xb'vgqe` W8uzx'!Fc;A@|lXz ܋%Q!a )azÍ:uqe bYr]Ǭ!G @چ5}6X$mhG χӡQ?|}ܥwoØƀ58ngP0P$^aQSjߟ=@t%Gu军@~#m*JX'lk@ p=P >Ɇ@5t1Tw"%L]؏uP@ӳ%o z%܇=o{Akv;w> OJSj;Y=P ^P|[YQ$8'{P=I5.=ŲX*Vy qη}1SO-聽wwPϯ.a8/E2g4GPdǰbJL"t=栰@TX)3ة}NF7 .c6oO馋׿e)PS/~?-!e{+c@y~x~d5lX<1Y@tqN^$1t&l2{#FL#i,MbYڝ'5+r4Z@=~U1lO#NN?#e>ݬ'6L`;"L8=m67od-c]ƨ'S~ zX8ڡ}|+.C>q~wpx$d:.w@l4KDŽu2X=}\ q=~gpLLR, Bǖ>]]!_~hG-*θ ۛ.~oUe#_\o QWO ﴖrW|2,INi0ly god"버x \QZr$ZO<߸R_2] SlR;:\v^`p\4p }#09:RkrL|\gU]S<_aqt xҳ;4΃iK @b85xX_H[_.2$=2L D rskN;Y0MYVo"`08R_ w X_|l`[Y͕t.1F[ 3# WƎCyx-% 89b D`~P~$J A?`ԩ%Lߢ!…v++ ȳy;k7NHy ~iJ HJ z${}) %_į eL$ۆAq:/hT5٫ISiVDO"Ɂ$ླྀ %N g9$wu͠<2l=ތ/%Aps놅x"a S5̨EcO}e8SN ӱC{;ii8p%xV9c474hMyaܪ#jBigC*)yegC- V3phah(ȞCا~Tk||ګ-s |&.ph d8amG$8H^MGSμ~wv,uUY:arx9~W;K')T`y:U;S͋rcXwu9cd atY'yQTeSQos'֕leo#?!Ǒ$qCc8 (]ao%9(s'Oa4#dž sGg>.Rã ;&Mzn{# ϕ#Q`H٧ 9dPÛ&_~gh(FX0n p0uLM Ͼ2bI~qt50lػP^֯Ǩ'iy`ڬAڻ מuy+;{%{AOWWtA "eHF79(Q]b*`X74 SD1My`4tNa`xsi^0bjrcϼ,UTi 5:{7pyFZʒ΂Ƃ\{0\tw.7A^NkWxsC;[%0H5!OOL˒[{L˻^bEK9Mbѕ͂eHĿC>9%E&Loٕ#@W$b&cЍXm>>$O~xPXܶAg*!X=,4MM:a@o5ϼ@,3v#fwjVF&VĂW ¶7Y{=ͨįHG݇$b|SV1~zy#1k8wE weRo:1~̍?O.O #S2/j,qiSnĔ}2K::SSz ^%'.>>D,4lN,:SOvkK;. }زn%yZ=b)̭Om81?RG)mg>51ȝJpazxcp`?8>{ٖysĬsc+P4 korq>I|{[*p<p<%p(8KN eHCh~~+o G\;Ѭ:8>504^Vo)׿ \kx&q{yf-S}||֬/t$?~!(1_Pmy?%p5(/pLd*Ұ/Nod* }xM1/8{9O8IYSYr;{w<rWX]{/Q7׃G$O05Feѽ#5+RuFbDQ`-=10zOvI|F^]]1WwcG:n˃Uƭ`|3K06hxU? {($1`Tu>& .IKjygJ8rĞFk΃q`4o?<% ƕ΂1'^JO0NާF1_[hE&103-{eI>6wc|!x2i->]NMѓ R`T,13*|`K9Oo]hj0&wK©2(rq(M Tsi $F鑈)lK<$Fn YBĨﱞ#OowIDƱDzM+~1&33m tF\0F6[QÙ4Eb!9XWF Jpc V£Y`4(3R%3\dy0O~3q|#&#>6AgԈ0FS&0'0k9gH7dE$F$h蹽D|4;0Ac4dbfoehPM *쪚ޯ/v&%}X7;nl7؏~88t?++'sWay8T%g0k]ލrKrfd*8 crqO1E?9?XS^}3WOCU@5Ia߰Ժ֩'8yw> -c} |ȹ5I O+7s񓗱/SQoR1$ O2^h ^,ęO7k@,eā?JIisbݧCk`Y1L^O| &58?%'>XwOR@m+aNU0ɼu Rǟ~WNZm{P-˿ϙ8%1KvWĦǝd Ι4a[@?W/Wʔp9 DŊGewu_DYo11iρ03C`+8g Qu@8 RyY .Ivl緈5>q;EgIwT{ <~v] s7<Z:/qׄ || `_kHLwC|O7nC"~zr}:"17,E谽7@U}W LbӢrǍo]}XD:ŧT=7ˆ!ƒҽI[z=).G$mrK5QmĒ]X"bjvXE8_G ~#F58єeNmps bxS-CD]4o"#6Xz;\O|i~h[WÈu{#b3ObgG>1Xw׍hf u?v\>'FDFm #o\FލwYT@įܾ][1w#)1ds;:[c ]xIׯJnoZhV%G.ǵbn>U~%K.8$=|,;k8C{WRȞeTe &ba˥77T՞Yo܊YٰsB ]~3Jx%vXJtY ξv:ľ1$}f*=q^4V-8[D|y;  X;[ù/ @-Ԓ} -y>~J8{zu+ިA)i_轔؏0 s"Bu;/]7m{V Ֆx~~E2Dqjx> }ax R4Ϲύ~B_G:8gjdyZ܌u0m&3)z({k-ZW̫KgV1:(j"$ik1kXٍT&j -+* D zXN|3+[#`dR 1^$"@뻓0F 3EYa:ZRNboƺۮ??g_{Qh6Ib}KD|RY$1B}O#\ >kmt,gr ?[Na:"η HDW)] >sDpl=F|P\:S"yNyݪQ |5Ŋ^VZ ;epяԜQ:"؇h,vsɢ`,Q@c}v= ~Vl޻z'`Ȼ,88\D^;b 6 9A'dH);#`;L*Jqtz^k{`|!"ߝp-<-q߇~?F+?I>I7K9T䮪7\E?8%;%Ӓl8 gKW^[H6 MЎ`c%Cp6}ػ߫;u,|yXR?a&R֏6z )`"KifO"\?WLlkɝu`3*Bc}&*R4|Ă|`'|4 |0cq&ˮm|:Ҽ &F:'Dr>\!mE`RhLT2I`B}c?I3 oAOSh]x՚Qը M<$N5_&v9;U`Gy q]Sn۰ >|!]oFa0ع?{o=q o: ؝ | n^) QلT?s`Zpzi.wS`mxyKq09usi/wXTУ*`b+qdILt5V3SܽA'{2Ǎ`,T0&cgadLope LήmeA,'kw|0m҂9$=0t{a&Ouq)\Z9̟>¡e_+BPhƅhиq/5O1tV/a0 R>f &QVM̩DK`9֭D5 ~#pXV9?ua-ܯoI Pz`rVbJnD`'I[F8`A!vUAJ5g2;@p3F8FZ仯aGf ~w:N 0'^>NۂK} 4 j 4TAARRY4LBn D5(//͸S1Mp3 G4 k{N Y|Ш\#:UAZln' <,.5Ϲ*TVAjDt:?vJ2 :&Tvn`G<&(EOѕkcXtb!=kD"_X ZCCK1'춚S17-.ԃݞ/[Itc_ĜL]sAp&gnSWNE`]q^?gz ]bpϦLoLVi>x֊l`,' o_sbF̰G>;;acrVTsM19]O/1Kf v=:ygrUP7k׮G[1Gq\a|mvci ˼5\򁝓f: v,znM`s:#(>0:!zuŕ(3c?#NjĿϩgGVA0&{, # G(A2IU F&;{d6+ p# `8u$K4?ZYH?kq>w綀=ۣ-Ȁ%J _ƘaUK=޳>tUJ6%/ݸ?Mke:IOaGY 0|5`k0jXH?t?s y$;~:fU|4)mrQiv0 jyIT2wvE _FaWkЇ@qK9`8b;0 3n2[`ҍ2̯idKirsa,4ѹ,eGbnKމq`㼹% ^*l6֝_-٣%8OQEVb*կSVU]u+JYٿ ]X0 n[a &m:`Z[ggrGgLs9JR_Hc4VW/lV]&CÖ:ˮ+,4=foT У5U yb7Kwdn1"Gޤ=u)=#vec@ :ߝ=C)˞3@1c^Ysd w'6=^1@?8GtPuiRе; |/~AKn# Z\`/ڎuo2\^vIзsg ]iZ0x3}hގL"1vp@E~0lq8 Ғ?4~z.ϟaYnp̋fW=}n='9.Ze|ȶfR0g`+ye 6O6``;z9`p10U}G% ~`3k'tK`y*Ǿ,`{OMz.n01 MAVbզ`p3|\v =%薿8[:0PžvIgK$'1W+t\eVݵm0pS@g4S{]0c 1KĮ?o(95Aܢvx|0h(|2ѭ:֬>FbmluV?kh|S(bsl vdz >-O;OԾK10G1j1\5c T1e lY52bt)m ctVs!o9 t/÷Cx`L呁k; %$%[qetMՍ1Mb c>Ⱥ-1{csc}/c9zOэuWtC0>7Og |k} ?/ct~crq7F'9a~p1 1߉HSܳ[ tbO[?]< fσ}A)~OЧ.>鑹 _nda}11+[GvuZ9ȋI1q^~SGEn:sS_?z^YM<{ejjN`3TRכgˈli5-'^dB=ZiL_7Sy'@9 }t 蓇kf)1"ɗB@L'%+oQou]뇁KOʾ!`X zQU2Y8Z|>۝Hzuνt-a]+lHX_KsqIcsSzy9KO<>| s=Jo}r'Ƃby0`/w>{[~M'g'Z2@qQ쬵oOsH>#c@nYѠKu_:Z< M1͙h+;N AiI_$l9z)0P*k``A yzJ DYX`~<տ .>T-Oɻ"п~+7Q|=AMṆ IC`{--מRl#欷M;A?q ?q/MMvj\_;+?jw{گ\~A0B+^c不XsK@'o ϷSa.nh{'Gp'WѱFb| ތ-Cpb Z71jH^WLb [HK{Db4X{c_Gb?N"w{[ #޻L%Uv:cYx hꦇm_’$Fc?/0V41W(fMgIq$QaT,Q+s9/aKb}F t2#۞dه#Ycըgc6z39IWTu9@̎Pҡ`x D& ~XZ.և vL3}}=m<~|LXG(w[a/a@o:퓑W0&k;0/|7%=z\yG)/ybQ9uVc.ιʌw̓M!/G>,bUX\cꓝl_V/:#8whx} M{N 4R /5OFZ< `͹ms_Zs-ةunSvw5n}qHw,׸0쟹E *`-kc)? Nyl@973m ( d+~rkrw72pEۤlC(q;5Aw2]T;:}Sg.vfjtOxX%寯&%,\K>C+@\>}q}R|5(W@D\\,>OyYRy)~fHq,5LcD̉{k3-3a.A>e1A@@ڟ#7M˻O>V#fj8&V1;mĸ,G̿rV"ONotb6^zO,':\PHLZkD~S.rzf`ٛJ7M sw3MX3jڊt‰w{1W>7{p=ܧ"ӉBDIĜѽ5fuT[@Lq ##X>lnٕ.s߇ir׶n,Ĕy@ݲ$kzi\#1cIo?s则YqCMb7"vN .Wh%tAmz@W uUu ts Nwy^'EȌq]gйD C ?]Bܻm ƠQ!쇍7J>N9Q!zR>o`OQ~~:[$}@.^ysf?3%ˋԝ!zZAߔ #G6gZj@hk7<,|`aplTvrNÕ@۰+9dX2lr)9'D[ vbn&>r:]QXm)6[6mw:R[)*̈>;1Pl -|m&t`nżtL -ZTP,mQu9M_ _,T>=?|s @Qhv(9V}j@:$];#|-(KӺ)nf 5P>Iu{HJaJ+7ΡO6nOcAPO]-n tc݂lr PʾVUaz@ykyt_<?.n\7S|(b߁Y\@.C(¤I'3G rx tJzb.rj1|PǶcliadQX鿏MKgM=(XV|0c뉐K䇤|j̾ks<)oHc=ijKkj9DK065X_8X|%!GI%g+Mebsw1V&*^#&¬0Rg2tBppoO yY{7ƚ1a[qp$D:FHUE$ƕ~&οa67ۨqߛ㚌]WUN1T7Hz0Vmgr$cSs| gc-{|&h}.$1%ogTQUS%؎H7.$ٙ]{I~:9\Gq }ѰcywB`m1`[t+I%˧/_~;`Ȍ'Nr5V_\il'FJm;Z|Ulgly}SA" 3Omc ,6Ip?7 l㞔i-:3=}΋E=1's'5t3v߳] ۟5ρm枱`u l%AV"?c!`{Tg@lop;y֧6,!2ؖks|=Vo=ח7!!l $-?*ȶ"s4 aO1OY Nm:Wpf p]1/sgp5O*m?ܟ Yo_z@XqJz P[ÀcyQ3:PUCh@]~lVWC.z_ͅ?&b[eK=ִf|_;g!>tM%^8Lʁf '~߫ ݭCtfc }gjj4ûԳoT~uo"v!7^<> :y bգ{&M,7?k~Y"nMg'ϥA>N.*m´MH Wnޗ꣉ғ@=nuW2PKI\2*}8q™vmy̦@`{P~2n"o!ەX^ |ʛmK@ݒ+;]H0VKގ 9Re9`q$i;{ff$\XH {!4#~6HYP} ɬx8>FB;#A Q?㑠˱${Ӽ޽H*pX_A t85#/=I|@X8᱂zH)Gc$(0w# iI =b \s" 1ٺJ#!2CH kIBBʍk{qVE©R#>j-K|+:#;th⛣oxNͦ|K^}R,̚40GEʣHK|/o"?B vq=c>w@֟9+H {BtXK1ږ($( XS!\G(OK<r#K81Γ6Af@w;G.|:Mf(/~xׯZ_q7rzW_CCtXq[oOky\9t:7 @qʡXMTmݦ8-٤7,۪O^]q i Q=:]L΋5ӔӖS%;ZFK!9 (^q!yƷqK{I-?8]uϯP9xb! ލN^6@_*||lj8f}"^ݷb>)bnX(sOs4l[z>[rP#y-Km>,+x>x֫7$=n`Β-֦kEZ8T^c^#ȘOsƓw.k(}sh쟗$2]\):okJ6AMp^O{e}o2nͱj]sxj1 W( wT I<}V>@JoЬפx֯Zlkgl! ;?ma/J*q^Ϡ45 [ׄ푴G".9d}+˛z7ه, @&-5YóYTh"(h͉ԟ d>A P}_.)[Z7eP;oűt`5t~:Cavْw8<Ҹz wG<;^zk2s [cå&{0q֒l#9"-#>ݿ8fyzKLi1 !ޜ񐅅|Nz݂!~X=D'\ҩe_q}HB\/%hDܝV)\G?MXOc\ m 9yE! bgFD-3MT>Gr`~=#q%ۤxM>&6"͂E+?xV)' q7HZ$U\)bM@IľK$Ėw}g|/'=6n~BW5[CᷥWF= {>o> F*POOOz톭`V9uBE"Yjs"[v[S#@[tH T"k.ބbZ*5 f !M@4hy)`3;~c+`+dayϫ:N}a2ދ8Y4rlUcM[跿mɃD+[8&h}33@kb-#|l زkv /jb-Tl*#VﳉH0qa\#*߁bHTd x..|pәUw9ZhMhU4~>~W7zg2{ vOSADX:朑_-/,'۪Yp c ψ}1U=N%V/є4w/NGEEk@xb2څYCdA;01v.Nvϒ#@.;`+Z w,K<ǼoR*p>*o6Cw1>A~Wh(z>s=?[#Gn̳o@[BH8 3B J7#{]d5X,=u["iOK6+$eN-@2OmGRG]mxdcn"$)mdaVh/ i?8#_ԬH|P L?,Hz',$Lf"IlHΔ&HدcH*Dp{8.+'J;/Ջ$5> SmI?+DҹFg}T-⾖u8 I6zI+;"ZaH‡p6ʧKa[ d2ka$5llԔ? 3~:&فBZ `] Zƴ$^YV ?tnyIKsU&;% lyTNSDɏkUs7}0l7FƠ{`K5gy*Q*83B͒@[_ʦ-2q4 swt>7s;|ss8=ga ߸G_{1ChxKbhB >ȗG]sVa~Xʹͺ[藪@[8~\C/<弻w/tB^KO"Ag`uhkhlv@vg[{dй-m9y1 :;5#cSZmၯk,X7Cr@{ xF·-f A`;Z>}yLqa&qt-Ώ/_*o.:{䏊XHG8~jp%㕊Bж?̷_X5ݰL @is%KٚPsfMc>9[:!!*xPTå_CK?F:tZA~E#БQ>z_n? s^hwtzco(mt*tD!y6"7 $ׯ)TɽPd<m)L8!.X6S9~pFɗtG'v^>H^L4(=7|ۀ5$˲~تt^t Y}7ÐmEІI#Yw_q y񏔐\h$7*m__Fr̵Dܣg-N/tސMB26He~9P5z!ɕ|@r^yՑȖ+RO$wqS} 4{YOۆ$$F29i 6|Cr՝fq~_=\S7nx&${gmx$8uIĒ6? tk،d‡p? ;E=>ЪSNTw?5Е9Uj-iM >ֿ1h]nJ(qlz3mZ[݁=QNq=OhmA%~=o>Y_>ru4ƣRh'$F+o)v'͎C[V-r%-|1́?YNhR-6 Dž @1T$:yQ!7||c7|^C4g @n]yqk/K!i>OAۥԐZVud \Ik1Gqms(}uFߟuSJ̞@*ۼ&d$VUσu?kp9Ъ;+ ZĶYX-$,㌐E|0w1Zr6"1GT7$8eW{IIK##nHxjk${MO0IaStf#k%JHtZ@.$Ntߚ\Dۙ̿*- є| U$!h ֌DJ%-s CySH`?B⽅F$$EYo"bHqM' Ѥꨋg!aHUHA":f.&!W<#T'/@W؄ؼ5#$RDLs_vEb}u HD4j 1?ڟq. >ڇ׭wxޝaDzői$οc܏q%|$78o!_]9I$Yˑg)p6'][/hgu1W ]@;,lXS3=SUy4*tfi>:l,6v'yO\XO7]k 6oX_cF'lڷ<+ 6?fB1<~([l>sդmFZ8R#Uyv/P5+6O;lV% ]E{<|}Eh"t)Cϝbm' r9`_liOCd^]fsoe}[͠L)pO>]i*I"hKB}Kmwu(0u3kh4m wyvK{*ʦ= A[8SW7ka c|;@KV?tWVC~X6/rg8zTsC[e:zn Ն]\Nm)_;5жp߳Y;C<TVn5ٰVa29@~ךzg5h3f6O"Hf*wyOImRl A'ތ&"q_s״QAFt$I`DǬ ]ٌ$Jf-۳#O]4Cԁ3YHyۛ(${%W0qaQY#SI: i(ǘk2.B/xCqEqߕ:dݨ$kĩ*aG M y>&pלkDg&[༞/D#g- ͱY߻# ֯[k<)$ܟ4GBGbnXF!HٸHtif$0j + |[;lEz- ߽=DY}O| =l*i=l 7XaXhځ%@c|-+1㿫db.'x`-g]=vh$0nL MO5bY4z.66"c.sntOMkx*Vr4m-瀶^@;%`v@S{ЌUEM+w1KD+%teR}2%z&o(t @9[%N]Snᴒ h;oX;n? N1]7^2PNDJ _aU@k C32R 5={5PU:ƾAzTaJn1xYvQ2P4_:h wцWzsɇ@{P_75yRcgDH<;"8YWLNx6w1œ mHs (?[Wq_&}j9ҁDSʦPQ RΨ8PT +5cM<' P3v% ]s5!3PG54\R|Y )&CJ""mc‡/F=HGYslx)\G~Ǒb#אK!%H L#G}r9ۍma3LFىyۑҩMjFޅHqtosQZꆔ*o?;ٴ)~-}NA<{0z!ő?>H)-/[G88ڤfE,!ģ9zЋ;Hl{)}fC@ =nGۼؙKu):;)?14a>XIWSuR9WR5vfmC/*{ Z ÐbTP2R{Rr*wižPחMF{]N >VӗrwuVG*SQw%#s "`lp.kX~Əu#+0$o0?eV|bcܐ˃e9-u3w][6}FLov~gle[^VV:l~ۧ6]׉.6x]6Skc[)Sus"w7E\I|}#ܘsSijJXngވunbW4x>Vbl mJ`32WR a%H]p_ԆWCȗ{wNg@ x0֑ {F_~< lzggϭL#çI)j`:?b/Lq>/6y3E,mmy C|>̭Vi}ig f5=?fI㸮?5gVP1P^ $/1 =(܂]:LG* Q@yv]|`֗kwx p, ȐS8c0wG,+A/A(wʌa.6,ϼRƼ/}gPJVŃ7EKNedO5ﺖ znjT1Lu!i a+7pt1; 4׎8P2u6}5]~mPf@aM)SPM Pn|et(@6Z-wMAwjLޯSܿ(V]@r@J:o}..!%nm.o1ޥ4!%U蕽ԃџzWaCƧ}QH9mC hu RzmwGR8Śnٞ}1{Ex)E,+ ɡ򛟧|]5F}sJHggh]|!GR&% H7G sowj·e׉ G0֔#ESZ_"tAQ3)=3*œB|s0,\|=vmT^8)}D{TB;=18[WV4b[| 臵HqJRJT@]^Wm,[.:6n;mtH:T쉔..yE{3K}!ug7R?D-~-ח3[A^9Ϲ6x}lۍ7͂ĕXhx.3`ᗠl=+p"{0}ot^5S9>J2X r;X)u  68>6VG(aC?q-~o}'}bMV>k4 朏ɼ)~`#z֏`n~?^:ī+]FaHz|ľ]2FgYlC,ذ2o_}QbǴ6|_:q<tU>u+ n ]Vz/t~l!״?bYIMoA5'{Bt\V,t>l<>>^= S{_Y;5x3gyE L%1٘}ɠvUd&Ψiszc=u==Ftvu/NKnݷ>V۝V:)?޸f.w_p˹[:bhtV3RpX `iWH)}H囐E~RJ >,G*} &M*lZbNmw mSvn%R)f⺺7 ru.B*4Hő/i-R^sTC?輔H5uצ2!aRi)9 Gj7ΤmK@*zc̿7G!՜6HD!\ R \y:?ĄTNḦ"7ٞH*!yI&02=1~,t3RU~ !2o!g[/uo6B;Mke`q-*`f`* _$k8;K`U|>Ծ@?W9}k=Q1P &^\ҥ@u|6cߏLvoiC_{U9(uO1)q: 7Wӏ*;/~[iBWS:Rl_w)(F#)HbSjdB {,;F"ǦJHlw^#Ų9:Uʶg_^B U^⽸_eS\<z*3mە⁺ПYmlp (OZ{T$TOھeLݝ{w%~na^TzƝ}A (BĿsó%x/)ų/.嘫BsmKqw]՘!1ڼ?Aolmoct9vKR:˟K7/hЛagzMNir\p; @) tnh?9oeUX@Yi](}i @R\z]oHώE֚2N_ݐaTvg Y.<$3.}^A-O#Ixv&H2PTEw mq*\YH"Qh}8Rx_d*_IZYU.A!fFHj]hʆyO$d$9[jIÍHz䓖$$y|Bf$um=g_͋uX*:FUH[pMT1$/Q"WVoHjNh6vzzI]_ER7y"KG G)'\&GO:xr!ߕ)(nxx` o^Iu [Y$a($u0Z,]IW&"i`N-[Z&}뷖uyB̫,"2 Xw8mX.wKkYx>fX? b.5!O~$;{: p89OՊu-xC| Ki`]@/կO %8f' X} ?W>w>s:ldgo>Ȍ12jŧX^9G Q7L19B 5ue|ݣ+h<r|C-XGou|w3oqSq_V| u ۙO΋miXוogk'vkH':~|)=SN}.P T<#Xq`*_x'fЛtM {0^SK̀z,h|_Pڀ*&}ޢ7¾KjӿJvts뾹iI&UgbDq7Fpvz-q>W+3+PEYex2z м4z&B%y4au!SmwKܻ)axb8g@O9;}q}dS3.oz7\ E&rO)FI5F+ͻLRTt ֑7MV s43SF;G[t1Њ֎U;돂9PQVVy;7<kS)3`m[p Ӧ?u l/>F¾x֏ S"^<߶M+`{SCt1ޝu O>ٯkv[׃jॳ뵫cq2/߲\ v܎+}r9z Xߑ#}ie·`m/OxXs,mS^Z|}Csnc?6OsX`L*XK~ /ໂ/Hz< 3 K@5v}~a$޿t \.;=~_r7=c,r?BƺGrsG6荆{zDw KO/;dﲲqsI[CIRB% IZ $J( )RF?~=뺯x 8a5~ X׋T» I硿`53bFVWO^jӓ uV\+,hv]i됑j<.X7?r׆~ \s^󖝤rߚ:%`}fZlV, AzԳacPp1cuv`g|,^ַ݀U3{_ʶ:J7ӄUƖ̟j @}S:rֹWWʯvZ6VSyojitʞUfU"ƧZjš\߾{PQ^7W■sIrfr=_N<:[9<-GuOxm'ɕ^ TU~oN?x.fUeJV~vTRV刧m_Oe~F.q8s͕ 2řU?6;V9VRWK 9o6Dg6FjUh;=(9$ hekuj Xۯ=!VCUeJKZ|&ZbXX{ctI,=z:d&X±!KjD,yzZ;|fUJcf}q ވyZ`x 0;??',Ǒ[ NMs %8RstX¬2R`fi'Vo~'6:SL.-WM8i+/+VqSjS[L,F2%6q ϗOeh]'Ǯc/,wҙN[3EotXQ!wJ{Sr7X;Ԝe\UMOyX/h~v3M°o{X?(=-+#&*fy3`u@te0Wvz+.'X#5 f?E`: 2[-KS`S`xH| V]oSyr? GE+ρO9fE.$Ҟ~ZwF CaSmk!W,Ht{Ҩ2\C)R?aam}Zawޯ ,N[ kMM ^?>kV' !kn3tmYsFAj,+p*Hؚ3k9gO=9HO~P3xyB3/woC.x6^?mNɖB*>ϕ?RM3|/yyߋb3ܒ\o1v4 oxע)_𜠥ےxbW bך`Ls蔙ǼuLcVQ/M: vvY*I@d{2JL\;M7*YeþLT0$}ޢqwRK+[+9h`-ב%_yߏd.{Z<\`Iغ UNA7x=VѡRO6*"8ҊO܇ʹCA'eW&W oOMpsB,o.Wt ˿ >,Qu!xk6P/m9Q/ xAMn_`}ZogvX2=P<̓y ~S4\ }+r,=E~twɅEAN8: ͔oA_-Otf`-n*5!ݯ*_:P'DH=븦-f@o_r>ZX Ήo׾FP\Egzd'q$`YU)(QK`,K/mZ5~hJ`PfïՔ{ ~G$FX0gei_l(cD9k!dIt]ft:9%]9~2+? <,LЇLMN{ff5{Fb;!sT#d4@>i8d5(Pq |bK#/4#GKXq#`]Efc`ˡ9Tl R2Xuw=G_},[!,N#n7oGH0&Qo ꞘAlWJA0uX}M":/+?A q^9Y5$ρ w~uooŷ ,yjʓ~O>Љ:۠}a7;#Gw#@BRږ$0K]ĝkYqRP-C$o~}$vYn"‹k ]-PNx!\w݆" \Z}}I$m }&/4~ R\V[]MGAꮲq(nUbnX=7 fV9۽~у `]>-# sl)xUt"6*nebG^~V!L㖶~ueăX4\y%YFD߿7U _[ ?~W2ѯt~1`v?Vof]Ov :Ja{63Ha! > 4ei'`y>?~Ԃu2ߠUO؄j s`cN׎Eg7$sX([SBN+6֥w Ɇ [pyup%:w1A,nc~yߚ6ΑMO!6GeCDȮmn _G'FCN胭s\7SiKc X]hGH3kg@utIȩ;ڲ !t}XmdOjM!;rw4B{CcA3 YHuk_f.7x6\(psE_ {2}!r|[4HW3)GOI7Bnc9d#zYbL,R!39C%=)v" \cÍ!wV=9Ѱ#/fWԮXrW03߼'}Ю?k_8 ^ۛ8JglakCig;YUAN5@ 2o] J'ŏʈ ,@lSyo͟Vk Xrw7Rc|Y ܺ۞lpJH? GVS>؋gvpV /XMc1`]PbkZrn}n%·.4 ͋N`7Z'&<|i<!L[5&lHNʺ=!;r:~.I˧:KqXOy~yV}j!ѓ"~DvG[5Xq%x+-f~._/Д(4XlYdg}FV=4P%%O][塽V=oQB~ NxiV#›dq%))GzRrWri(πj>llԕrƭ7֬\(;iX$/j$ >y 37 0áo@u&&e TлmAC2g;^/#z~XDj5?{W <~J Vn]:d~vTp~ VG׾oI>^VX>j>#_ahH CI\ MI/|47 B)zG7hY:l'} :B\0 d8M__ { 9X0,3wwTI.ߠ]yqs*GJ3O˧[dx0VM/n+Dh8 LAXX? a_AlPb'g4!jQx>D<X؏5u\֬g5CyJĀp2(τÂ5FՔ\gH*vjyۜNBL{Yߵ%c`{]sm] a /v}%ls:߱#l؝R# ܅`mKj`-m [T{acc{J:F\ o ɳ27 #^%}`aPQ~={+Y*)صy,X@I?Gю|݁.'Dԓ{O`RϭN ZٰkK<}o®aI?R߉r%~Eح?"sHzC ?,x̵9_:{dyo݋̋s=e?ܼTI~GL ;-1(Zp7J7BҠm~$!&xPmSE^D5(IAզ8(^ʝ)[?ܾggw &A& )󇞐dnPey "VQ LvmRBxG=P t o0qP6qR,Ix淍sy$BEt(߼/33搿T%Q@1v|:ƆbZph^IqJA ?-H?>CZlMk( mPٱ.4xwx4H̋r(gA#߿]nk(>iѿgy`ow@;#w:JlLfbuBSrq) .w]N-Fq%g_}@v*;w. :ytY$bm>a{ý-*}0:XY vP5ؾl^ '>{ޱ|CA-\vk7o[~6 7M'8we ]\OW:7uM6#`[JӀvt2.yٹ^"v!800WVz ,##G*pwmٽM(97BT{vrSõؾs9lkS$8lR`xVv$6̑zEx+*%Qݰ;d&NRa p_RK_4_P u@M e!\vR+E : B\߅n [+ )N9uPRk@#`}NH޲f' u,^H ~]1 G>/* ♖HH2Oi>DǥTom$T@BrH^.gW$$KaCn>ɩ75oAJjDHV2?ɫ>E?I?5QB2)HxoK=K9ژ[ _HQs3TCMxÚ$#)r!['XE,R).oVb@-!e~d~$cE~K06Cn]bhRz RF&KCW@VEאpQ TۈO $roDj[q{'} hp,5rm&Vrj>8FhZ%yo?,;qZ~7|KemǦ9py%\Ǽ6|A~pL%^_]b% R.GUZC gޗ{Nva1\c`KpypsMv*>بnrpt~olʒ낝q Cև.1~ǿ?^oGH]K #>t9CA;d4׀Y_upG3 Gkj{vW5J%[lo5PEpR=gYBǹ'?;Qfqk9Q7؝Up7 ׾[UY[\}b[Y/ƆΙ'ahɅ] w MGKH{{7l>Pvc aKlk7fÖz ߷ ~AۉXXӰCɺ/-YPC윛rlm;vv lJY,%~e1ra;@ [D3#6'ET]-]R6K튪p :9N{:dlʏh6x/ۃ?~$ ;߽cb U4^v<ۥ-1}>fI\洭|g1Ow+橱݈]޻' v]8;?<55K"ߨ<+,l u} ϻ/zwz ?]dw9\/Xk^tz֬]2]ؒj=}b xVr]"ߵL^V|{oߦ][O%M%J&<Ñc_sV 8p$|:=١{n;74;s9j2w{εDKb|xu ${y8s{t28J_ ߑuŅ/YXȥkߺ_C *3[DpfY}N{&ߢ$45kکCp(f Ɓwrv}CᣕIr%pߖI`im<Ϻs{lj_,QMI\'},o@x߽o ~<'_٢;s keF32(//qՈ?c(5e<\';: >x$v!;G ]XsH|"صyidka2ఋ셃0.8?Q%7a!TOp3ԢJj>)¾"s8 gS ٫٧&¾h~76/A!@d.'zs0礅6S/Ty ܼ 8;@;fџOꛤ|/M5V3½Oq ?CbH׭A>PӀ7 p@EÀ-׸ݹp0)ˣIad]p-x-zc_̭jgBp#o/.ej WՅp۸:!Or4þ1uBpȃx<8p.!818^NgkW#wvĂyg5^}8B >mߵH0~z|{B)==xO!x_ 'x0sM]xC.`*9b1{wf %TW_̓J{7BpzD<ɵd[:sf=A@1u οHO\ݥ!M?7?yt_Y A8Y6wj1 /;vӂ^;֗ l"ۍ61R L7x+Z S{,rjwQ_2-cF}3m+TMΏWfs=S]La4˸7"A el%<Ѧ<4}8OwkbaSYf6.XNg\qy9gyy$΋5GNR\B1H=Tfu+ESV";#w}yW hSG޿4@ kɀ#OE bG+Z;K 㡩9ݬa8*I^u99Gsf8OXwIvxX+ET=M ;9ЄG>^@Ki+;e)H.$Ds&$p{U-p71tqUA*4OK],* Wg\,pgtz_k6WiM p?.c%z)MV6|ۿy V$߲O8|yaB|}KÄ|0GbÔSRrL-pj/B85m9X0w=5y{_< #}`xjizjL ѹ-\I]p>h\0,'[cr r^d9٘6v/,0Uv֋ o %(ulKz!xD*$yY|%8u⍥iyKsUi]sypM>/﹚\fy7x V5;rk,ie8S(yO@PGݙ;sW-|~5>~ 8g";Dxб{T [C'tʺy b'5u2_yY._o[G|:ح[V1izNH):>s82i=UvoMs6?_SG:~ݸ6!g,C#{=-سJZNAOZ7R,8m-W <욤=v k\Zpm8"Hy~9Sࣟɲ\XBˁ 9y$ AO\4JxiܵoNWG//7uMʸvӓ'Aa]c(hf[d+#A[|^ NѡU4u:0|NOW±Mv֖Յpjv9O('6f0^4B2 p^iϩ-.Kl=#^I<$xYl"38-M< RJ8}P{`36SJ p>=C˼R]<4;c[4(#%Fj_QMүżɸ~꾗͏$s.c=:uӤA3$MkOpf|W#CD;e JȾσ̍Wm%hfɳ'G49__@ kSMI!ѵ@:j a"53a\+.^U#};3a AgiDy \_y,Dot|׳C7m[ze[U[>??5:7˯rq̵BcwYr?Ipɷf߶;~*.Ke w!FfxbDHfJBxL1c7C`s` DVhJuޭ)Nn87``;B+_kiSe1u nsePMh?Cy ʶBթD?B$W}W,>oS|i ї5Op|!xD:.V9Nq]]jz8A}A +uvK{ o,$xe3ՅqeC%pRuYWq/-l}ۯ?)c7)x>;}_|R7mKxP9OxT˾{'\]WvsIp%\O8dAt߂>&xi>hTPIw6o1x?Jꏑ Kۜѿ o$fbs2sj]AkhxS,H6Z}'dV==K=p[Fxj ߂la5Yxjs򬗑 >oy/$k"SHt{Y3#RGoSVVcxS ᕿjJm&y ;݉Yn|&bςgiGh8/*srFǘsK ]a=^ЭQ]렍L(tSAmO._ VAo޾5ARkVR.}'yُ3 st׬ĘrqRs}{.Ycm˖433:ǐ߫S}roZDF8LХs,]p4FFozߓ+@pឲ?1,`(C/Ens+RٔxQ!F}Lk}يw9$OgAKYB8B&m)h,tA։Trms0ovoB+([| >vSG_C>y~a9aJ-#4: >af Wiҩ͐SՔ5Ār/ׇС߇B]<7|Q= Ck`MyA㐧Q>U+|B3QQHzH\GXUt.īS=ΪWu2E%8槄xv7 /?cD8N{Z(/='{Z\Ӿ WFp?ܪW"uZcw/u}Hћ5{4nr9(A?NxgLtߕ.sWN鋲mw}xo ď\Ξ=罬Ws QKWZ"iG/A˒Y]ߦ,҇#z%]+h!a'W/%?Ze ?q)Ƥ]E4G'4#kH8׆D y"&Mf#m6p{/8})&,|t85|sRe],3ȖX,2^6Gsn4HW9Z&Ή{~rΩ.}󟧏̃smpgg;$Y>u:NtuIf셌Ͽ? @Vt`<%ֽKơ sZ(< G&P?: SזBf [Vrr{wX8jPyńbR5H1:T}#Ր־Fza6]AoSӊ#!8H+4ZC?xُ3 E*n>r^@ν6SMmz=_ rrAn_G%MARPqY݄~sl CV?ϦK {Sw@b!/@6Fʲm't: }_yqNF? fj!_'a|3$-Y%9hup}wTP|lxoۗ/wO&ѓ&ccۇQ%p2]}iW;w^6,t\=suչ xTk*Af|^_c`tn/?ถ.Kg5 9[qp5t_j2n\åO¼FIf 5=?ry+1 4*umpMZbu.?)|׻Mm\}|bV#F5qnV \ p*#3צΓ'חW3~`\ڃz{6j%vHbf*Spջl;\̯K˯=1pEs[P o$Q Jۋ& _1kMr9Ƞ*|?> PYU*m "PV$"jC>P}/U˺w&w%*%7ZdP)R{*EYHm}s,e%fԋCmUf ]c=Ԇ%;Cey GLG3?m#]+Vǘn M;B]9'pٞP9T'מYDg- >pklp-pRSi\-z7G7ۧ \E Dk`/8 ҋ$ &z+q=g>pݭHtzJȺPXkc 8:`Ih.Cg']+[[8[zXo_=:KvWRn*Bm+8ˇ>V\'M߮h$c{x>!K˂hí݅p=|R\ϭv|KT6i'][McUnj/{KkcbǦ)99:ܼ84 _`Ri n"K #:v&Qp 8l 7ZtM+ F$7=dGae >/VM~I= 4Z&?dͯܵQBnS69M-X67sg!uqNy(V&1:4) 9~]rI cygHKcI]};\;nJ9p Ŀ%=r+ -(zewhߓ# m6Wc {Yx"~%VZ̀]u^j[W/NZ>+\ֺބh'Jr%Cž $vtASB$byfU{4`5В.ZV#- ;-ye/A+ߡYHܼdKGOZzrg& 7uZv .*~~&WC34z),nx&grZ&V< =0@c5hMn:À&.O+cyn~=Tڇ얺 KY4S;fp4l:3 m39RKz_S[A{}7n]CQ3%n7a9|w`3DR^>U>rbޥ5A &8f8Hbঐm<&ބ3Ė [P]?hW/V]!'ybIl؏gd=<--k 73E 9c˳Rjy7=zW5ص]19%$Aʮ`l}avTrYͺ[`{m-Sfɽj}왟ߙ&}';[@Y[Y;)r+ZR8&^k"}MQY)%+Isat|5׶\;OzGW;zXë8/\\kKC?:9Tװ:p=qMf\>%y/.kιFr}\?GTµl#qXb-7DG3 _J^kNy-{~| /{Fȓ Dz,/,ӚzND֐zW? 6^pmx$co>m@=m׆OՑyPޗ2Su S1fE ӥzDL2%r42YȜ4<$ؿt= ׇ~<3DOpm`(Pz>:XN-=%:;Ɓ:@+Vǫ$AW.ȅS K+/+L6B])-lwuBМZU\Z,j꡵Nnh }gB[mo'uػ8mV1Oh]}sC4{p.</K@sQ9^9hW]l+憷}Y$~ZP\qMBĜzh-ˏ&_5+=]>C>%S!h۝8-r+ۍz*y <0K5༳4fA7Jzp-bVuzf|\h[:C|Nojp2٧r%WѓGyiWH5k.(u9<HY3AkdDWj<7heH~LQ<NUb51RV;lU`:c-á`kvHTqtd XVVS`g+SiKoȗSaٿjjz%:ش7e#mo۞MNv1a"oq#{ /&io˘Mo/oh~QY*N^6 |=isbN4؆||Iއv\=uCy`/ܿ6_v{nf(-# E@ jm$y6+[5`Sόc9=|=\F]''~z~&sƊea9r24" _%v܀p 22GWp޼2/\\N\v$>Vm\%/.OԩA_%,?.oOY}{M 8\ 1/d2we}/ׇMU$0\fHjr_ \{M{Gȧp>g .Mg=ٗE]5\"b5 %m6 zse70Ყ?d\T_~ï.߅KKM$o1:l\,o[CUsJCp'Y-(O݄޲Gd.pmϟp -Rcesp(̩ܿ iQ'\^)s+),~yĿ|v2i?=dM_Ox ǹ/>xr})'cѡgu.zE؏臉kbN-/4G'áO3(6|z楜дmгZ_tK>O ޓ^u%XҺp.Y+Bl}+pQ:#Ԛ43 RvKUkU9_U%&xhکgG6?n.+ֶw044H7 quA/JچjlT{z;T:WvB,wu_˷dj=g\)yV -眡7J(fHY;f> CKG.Ƀϒ Y^`Ero 뀳BF:纬W|s?;_?z:f XS̟J[!'aK 'RJ}bV1>XNR!yߔ|@=\#A^Iۺs :s0Xפ7g\.\JtunYr=3X;nr9Fr})s]=,ڙ֙s+L2J}I;tw:{NԹ]F/3_A"UMֹG|xU;m`]?KO+?^2M\anMJ%v adI];+URe ~{ϼ\Vh\i sGԧpq̀M=\Bcy@\n\ |6E܂U"p9khv_Ӏ?Y~J{ E`T]O)~k9fv8</T/O-g[aX toðjV pia͋ϫ> 7 ca۹E: yU`Xi[l\ NbU9e3`kb(cA㫲 ;aP1v+ ='G6 [SAM`0%09˚YbOm}L"08$_{ϡ&J€ngS;3786e5$ozU ӮOq%PF/s^8>%c0ϗjWacw_=ٵ_oi8}K%|\Ek{A[ /*UeVl8r}8 Vˉ,T,HKS`Ⅱn[3$+B<DZ*6ќ7KK[/*HpQ¢]Z`izB[=SF0?"vf%qv׉ݤyQ5ld}L[?Ydsh49,9:%d.icO+:Ur= }ߜS}9\>_YS@epb7?`{o#9֑yOwگ6 sAt?~~3?I&[mB|Y۲+Fl'f <gzgR{&I;PA_ay}^#[Xx:1@O<@1Yx]t "_I9!RK+}偩8pYt΂]8ϳpzQ|Џo+H}Y>{ԓxo+*=iӌ.⧌)O_XHuԽcrq9Cu.ʅ3ep>6-R,8>) Q*ݠ NE+o뒼*oj:^mm0gr#Ln6tVuICP{4S 3 201:~6QLr GvJ#&{e-"~Fa~TuT&[uk[>L6QW /`r<( &r;>dNخ[֯mO`f&10xG+'RPkg LL.Z+dMuH.PwIɏ\( gב'Y0<0Y̞yIeWD\d0YaIk ab^i?&=:a0V&//:I-0]MwW:v s)R_܄}(ĿݟEcwF `z/x6(JO.su{r-ne>0d6sUx0}VIT_$8SԿ6>YDv!⪌S0ϴvӨX;No]Ms*YW '&$ZWP3_x(cnQdkU5ޑ=!m< 鱻` |~r$s# [#$Ųo(2Ӣy0be9; )un0y?욈#vǽ>“tCZo΍y<:Ju5!xfs/̇_/Nr gC.?HiϞcK?M.2=zB;[H# dI=1^C$i<,=1N7ׇ~y>&y ?7%idՏ~7RHbo  @ ׵ 77U$c@?};|Jk>=#d ZCTwbcAu%w.OHTo(fY\Ј2ύ%uL=.47!TPoy3ڷd&e6oeL^;LalC{%a~E`fџ!83LIp LgZWl[E >6BBd|^Lir_^Uq}y ӦE!C0mWRilcL)L_s/#v05 %N3-хN:`zqH64xႎXOޮ-LGB4ߕL..S)ǟ4[r–A7biɤ\gc:P]4FLը́:8kvO k``b%|f;',ϧopo{A,FN Fi/&Vm{X_ϞGVQ0F* 3qz NZN>=]!`/jbgF{;$[Xy/1rߴG-4c`|) 'm_|.Ǝ[_ΞY: &r1tfXO*'DE;l=DdsXA6.sK'cjp8jnn2U|8"(Y΅182L zʒuw 6%Ku;LnE492jcJ*9 0Zb<"O/ {> A۬5kV,uY`˓תd~ͱyK(hhRo<+i~᭰>ZbPA R #Az8l̴AS&yrZ0ծpy h‹ASN%uͿ:7Z@'в s-Jh{ A;wͫ/4km1k7(zZ4ks%2ؔEиNDMɾ4lBM߹[7{ h I^x94#O.6T#gMhɭԿnjjJ Kw%:x&ߒ9Xo;HlGW8!'(״rV^y3(+ɯݏL[4?ExorX%6fP.fJ"1P8BQCqVEm9Oz5(7^ʁN]ۂ}-ZӞ ɂ^%O=Pyir:y)P$Z /U"v23mΕyIذO p܈WE!@ٷ۬Y_mpX/jtg knCYIvPEל8/œ-K[SIeGQ֞sHk73;~=uj+tyPl칒!N~7ς31Gεm}{[PξxϷ<Hv{b˦wqțHNmqRkG]8HH `DOllcOFag| Fq7oXx/;*0I/鹁<>NŮ`D >G툍`O3EiDȷ\uէY0:y}cVO0rim"xvk߸r0b䨵#I>M=O~fccÌ2\78%ϣ#}8QOm' q ?\aWeN)n_Z Ɓ',YBf`d9y& vؐC'F#4p>* Sȼ,eyY| ΅j#@ŰǠ> 0_\ ~:Ipdcv NK\ZM7?T<@tӽhN85 mC-zW]%KKEztunڄ;6o^2]'&]“ĉHΌ SGpN42_Z n4#u:pڲSY8eS~$3S . \z@꨷©hlNϾO^B`*&&5pJ} NuKw5d[BꩍZ|N'5>N+%,R||fI 䛼I+jpڻ87N+K5m_?95 _1nE\pz/ajKRp ]x-I? jٿ?]ꃕW{ZXuBUA!&A}P@,M7=<_1P?:*1;#j# lVp7+x$6S1[a+^t#[veԳ:Z{9zޖ˥VTjz05|(HR(r,$_*Y2 T_|v3WT/yAM1mV,@?tS t\`l{m.PEAhlMٳo,KS ^m4mV-XfR\ZKH_/1O*ʹ] jOPm*H}ePvr还>f~}4'?x~Plj}1{qCQez$8־{ 3g?mw(_ژB0yk=sFs/x\X5;}jւnp#Ov̈́#xG#B;U_ء _"Ky (ֽn "RBzm/rJJ5לq=`L* MKb^m"&8beƆ{Ii)ۈKMhzPLy&1=\6&>#i5^Ŗ7W;/nD,GM`</~gfi]Cd>Wlh5TCNÑH'_8z~dL &8:ub:?.H/&?Wӫ4|wd8mQ;D(\M[`'G{Q~p4|ق-5֚G𥳐PI;6KG̃mdC)p4 -|w)pTqo}DszRYP3l]#Ӟ?1}MlחnZ't6H]4"Vkl*u+ &|fl)خܿ?=ʗ?h͟w}]Oa3qbyzlJS2u߳e~?l݉U<[ 66:*/^-m]VH8 :yJ./!=l`kfabQ l-"R]lZl\^5lN媸|'q_̬ {glm} _aeR:^Hʜ.l\N!6ĔɆ~o[B42)lv? [_unR862{<+vSr}w5k T'\j#vUdl &yʹǙrM'}f OdsOT0&:j0^DJ!T/ё}ˏr>Xi5`љK%QW0RlFJEO}]MkHgsm83'guq~i6O t%`d[5Cs!~\#;c᭷"lI;öU߯:Z$xa3'ace#dM~ ѓڸO N 6B,l~~=635}Kac.3'IMhblv9ot@{d6lSmW6]BgApWznV*.kN mOq`a6 -g QC4gLl"`{H\P\6GжEeyd{'?&?csپply+sGߍD. f[{߷_{ sF;Cd]tbmwsIIHOae<%|c_}%$ʌ'm$Og4W,̓D=NV9Qa8.I|H—}Zɽ4keU#Gv^l.SأM?}1zQ2j~֊] Nf+<ǖ$߿nM46esg~s*w桜oiIq9]yd? 6BfNaõʪn6B9?q;ˀELEu!|Uw#E6& !J?8jnEpFUep+\҆V(#YOܟ;lS e0R7|:Ԯ%u6j jU`}-~itM#lV;5E>߽֯O, Ԏ!H e%?<`!8pI9b>g۵y5oX&O$N٨yG( ZPvlԯ[*㮓i.nMaQ4_{J5'(ZuL3;7ǀ*k&7U vsMfYvd,Ks- DȘE=ѽ/G.K"_C`=7]Gu kcw?A=={?-UUWEt+Mȵ&z#7>M{k'_`J eZF9_m1RuWMF^{E+y<0~ؚjTQ˾~϶z :j&S.ލ}Gx`.ø ldUӄZVYSg~һP#=EΑwW ޽ߖNttju FTf..A'''?]/|p#fԯ~VY2+qA;F?i|0hO+A.? >iC@dvr߆5Wүڶ=?=@i Z.=^Z/-Sݠ6nmRٽ7AcH%o: sl6q2OoPMJ6jXnhW܄ywݝ^мnu-ޅYrӨ}썛G@[:lLhhiك%~LoIx&ҹ~x[P Lo?RwЄZx 4E?L!Tjܨ5yxGA y|`u^{ȯAg 9aqݧ>s0a\IlŔgj"@j6F0D>?-*hM* &ZzI/Va۲Û@zvWP#uP n,#[/*3<muw5ư~OP,7wNXq=ޚIxaAX!qhT. Os@d@]1ԥcӲO88$ EA ePڰԳEy.r ekT>كjF ,K_꺿5%m җ_:%3gI?PZӹ^_Q~% ƈ*MX~! ˫F|0TI6>tM,֣ 6 uҧɼR|:rvrP?.\o Z3#NuBe, Wؓ6^~}ü[`|KzƷEGϑ snb4mFLdo˷{>NDmyVKp., ٟr20&_jmXLI͞J;f=sn67uk0-{2ӷ1Oyڛ_.k #xRa*0wI'SDO^vq!z{[Yrb6ޟGDoNv JL"&ɪĿe?~q/jjDϿ<[d>WwFok&~W!QюVR xHG9[O|,!)!0>%|Kr|7 M ΥAzr܉~J9r@mࣄm9N)fy?ߣpǗ@Ћ)2AYYz|+@a9 + AQ6 M%Ⱥ~d[QO:?3ޭ?},٭"azŒy+]@H^;#7 qno2(*vԻĊrbo6-;CSz28O4/A 鉠S<dfCBDD@/|}rr[h1Q|^} 4noT%#^8/x諔h /l;P2M-M(_-J=ct(w;8UV%zR= ˩S|\jfyq\١I<]3;i[T'P=XS_M'qb$Zhr識 ( 3@u|K޽U}'뽾UOAqy4($\Arukl>(zΜ!?A)Aq)9#a|ؔ׾ /nsGu@I+e]Z("sIŽꉨ#l/)P" %.=5 qPgxOYa\sPXX>%oI ;}$>|zufӔw**/mWO0+x"Z|m;VnP:M/JOZ"#,g*YB{7@\^~D$D6/nc3zVb< 1zȰU5tXMA9G$ՊMS3yV'iyޣMZ|UmnA7kݎ*ο 2N/Akle=4jA7`Dp VE[H]&QQ|w@Мttc.]􍬑W~+5v@(?iW*d]1{ϙR@_ش9t8?IӒז$x)^l:ЩM:ȼvI/ :B}y'h Δo@x/}5}S#'Nk`sQ=Kuf,[ t#-[Ȝg||Iܴ״ 6̯9>/~뎧߉P6Q َM+ΰ HQiJHB*$$IddW! e^幯u=ϙ]owi%<ʡWw检9o{-vp+!Q;QLE~xgYMa8Okפ7"R*x'nbdgN\⋀.zKp~$irоo?n 8w/ހ{pƺfTyQi=_< p:ʏ\|@M*T|<1?q[`OAmǀKKl_}af`~lʏ<h]gA2Ðl_\Wb:bFlf 6/B(;؈UYL BlƝ]{6{͟ 4H$ˤlVœzՍ\6mĹh,.Y1{bLu?l`4` ul&z#U2\k@+=|TK9bBP=ŧ/jJ(|MT6GP>3|wF$f\;hS;vۂRP]>:V k#: a4HbioEy |ߣ|^qRq">yBQ 8_- @f aBA R7`B)x o޻viU,pquޖ aY 쀰xU}?++mEqG!FfWT图 xDuOp]ȽwBǚ@@8'<B M8"k2Í@b:Z "k TXkAɴ1@(ŝ8'Z/A᧒ևL Npr5^ 8ⳍ }vݝ] @xᛁ-Чؾ. |8Q|ݣG@mt Q|5̐Հ%o߹E-@z?W?V;d !ԻX n{-7حvtv_p]u.%Pd|qV+vm~; 2 k5uV7C|["y(lmI~~9ʴ)ԅί}fYlgT`;Ҽ ؗi'owr `Na^v(C\C#첟`G䝛MMu ش]<lZuz=sE񂈝ag{s<>'/E]h}$`}kUl}SrY 2FS=C|A<`/~lkE%:?!o&RMG'=P %:'9؁w"O"%|{ lFi6#?L>}~<#`3f[qlm=Aiiϟc6K6,}Z}v&l:VMԹ{ 0|$ 6__-"_/ /FJ"2ehT#H硚냶h%oo>wHL5D ^?W_~\.'3¡P+O΍kWPEFͯB1S9ϺP-Qq`xN=O6ŘBq#EQs2ȿzj(]T6uiSX? *_w;|OcY̚94}G]?K~11 ?KclbH7ZDM/nֵb@fT #x@`v_ BJ,biӊrZ _ /ӿWqgLK39V%:N҅_ēv"\vJ`\V30Oۋ#66NFƛ!݋/VGe?t JҺtG?8~O: [x3HO^aEY \FwlA@[N ᣨޏu!h+.Vs.=@P =`J2ޥ]L*0g3@`~5aL/ַj{s]‚$S|6`|[|'V;L1'/0ƿ6"Sp'S=Nj0E%nyn m+`b{nLխk x(N:h 嫀yvx 3`^p7Ly|,-|R̋gQޙÅʀIȦSg805}[O zq7gP&o6=l{jOYۇhԚ-rPoQ~G]ZkzʕU&&?qXqի~@szWW~ۣx]ba^{LICIXH[@~zxД](>[&@U> T7LfZIۀz"B!GZ|؏Ӊp皐Fl )!j"n_^M9lJgCA.'ǒrjlj>׾HvL^IK0fϝ٥ڬQSa1=k(g/k YJy@X 14dS:PӁ}q@y芢@;^vB71xW\%@*3g,Pܑ]ִѸqЗK@:$xᐳec?S M@3&$oz^¦ܚEē?7> Dt UHc?0}Pu©ɄGceܭEIgP5 9/jDsSWqd5c48_(DZh%׉7tApXP~fv JV/$R;%(=LփRk7AIeP^4MZs6tȍ<]UiI'Pٻ%YAѐ|k.(o!m֫rP*pbɯ@Wʏ_r;1۽i@ҤrtA: P'p 7J@K;tolOALۜ"P<2kOVwbU8<(o yZ@que(%92 9ٛF~5&p냤 zAD5h/}@Sܧih "mg2k@]>4ϡiVx84Yf&U.Ф#ce2=V4;,#@V }7y&*eh2L8`j tve)+ ]4k׸wAG`<4q{م3j-V)s-;ɨ^RPv64u/@ض6#qh}'(Dn {ϙM;^1Cdm[9Կ}?@vnxofeb1$sNmw%]Oց~:w5"}w5(_%#\@v!S[{fb2ebd1HOz~v7;TGo(3[lv x9p2~ñw#w>'O^}R-+0̏f^B6 qS3 ݙYKŽѡHqdž <Ŭ,9*AVm~k@xT_ 6n:F YMJ2SĨ@!l61 E|wY_},:pPͷOʋLE^j*jBpOPu:[N ~L;sȓ|},;(qFۉō3zAAuIoȟhr KZ䝉 7*`r߾U|j]s\Z/xځRםN]2F;A~GC} P] N}r.AƤ47&~[_O<7oA^Õr>7cyAhʳ|y |N "ܣ~y}pxRV =+gx?T2>f|h/wfأPhЪI+֨ͫ@JZC)ȯ~hV \iPt?m|Гؾ* Zӫ]yV#U٧'3`V\/{e /}$oQ.3|hWZj>}R&}BV'kZZ՛mwD-К-ر!dʍyo |!wQ<, }'gF%OEXhكGw|h>X-"5~B|m+rM3db& D=&"k`eŘ31tX? l@ Yi@m7s5%LO 27oSM (N [s bF sU38iq܍62)'{?dVH(Ik'OŸU[;I5Lgh}+ v"q]c},-Q>љ:?nF1 pN/K:ePBXԀH(C-@T6 E|O֪J(%OM ~ ^SgΓ@173&r%>RO+O= 5P-HsT]\|Rk9mC@j`g1k/la!|~D mB}LAwӵ Y HKv[ RWRn uMO.ҜK³lcifw}KOTri79\ Ң ̓=ȼc } үҵ- 1@[M9&uv]À~f@¶;XY>*/QȂ, OJA WqIw+O\@H9# : V@ s$ks=>oq^vA*΅Q~l<@ZDA2Ѓˌ;rʓ. 0s)._l{iVxh;#? ^S96̳ ={Ā~aGnOiD~1Nzšey #N fQ{y<.t'S6ް)|5)NhFF@x"tSq;>_t>RR41 |mEgݥ.pLoDzOͻ7Wv~Ҁt_E~ L|E:~$S=~HpD63+q2 }h{C!p-+9b<GywBTB?zƎyޯgE[$;O :TU ODsa먜Y+秩 ^A@xƤlM.Bh!8t_bPb~ "|ֱm[x0-?YmG6ѹ ^ |ۇbvj_ ޕ5tI*8X}n.8ȾL#=8x=߳[1~*?sd/wu%^Ptxpa7_@Zz Nz<ζϞ? -z 7V "EQmxရ fK8LP+j@'i98plo˾M_gA6'5$l1d;1 KIP3"d#k0pk:goTl4@ܡ:9ɎST0  ٮ19 )t޿R٤kCIz͓ua}/ox7B^,0x4;FNm4 N8L&nк| `_+pO5@iw;FVKӁtTrێ.uEoRk/zt&+ ?75'`X]!,09d!]Ib?Q.:q1P9FgCc Y@ȼt`gPm_-O׎>| ڳWG=#61r6_x"<{2&O䣾ce&ӣ`*Ѳ_ygݍ )]ȴڞL;7Aj[[ 1T+a^ o71c:~z( /|Cx^S87&ž@k[Eǯ t>썑$HTm>Qݳ "}g4@$s]ӣ,U JevcK2>h85g8 'ֵgD$څv }#H׿X $D1 ^{$lec|Eg BG5S }?_}ۢq3 /''$t{͹AZ"׻VtHwĄ&$ьQY"Ĵo#.y+/ }^K8 +C@ /,;1Tb`ZkXp#?MƄ·PI` zO9xM(O`$ |hR /f m`L/}4aFe$ow_haNZ3䷾?QKaX~]?>1` ǎc~ʺ3-n`~@Яّؐci-^@khyiN}7 k}N_Nܵ)3Zv5cv-_ 0,hQQ_\} |@olH(>WXMExGЖF̦cC9&Q~T#Q_}@ C [Ϣ w\FʘBuAf'0=mtO2GZh7ۿפs@(\UrHwwJ&0qy90maW}ln1B)+B`U{WrDi*{>o>C-F8@2*dvCOQx^dwM!vڎ ꩡnC|ɷ&`Z/*u>Lg1]oK';8uTwց=Ym#IWAh?HU[>ߘN΂hqk"HmQ X GySwo7x ɵkHE~~M&:5@.SL}n hGx2m|@X ɷBz0:QH*! u}$5¥C;0:r!H9>gC[} qZ H> 4]1b0uc+ =oRALg2Hr}X_Gl?҂Т Hx_E{ɨnA.ɪ샱(N䕸 v$& >Tn@H6(yuh%;]ksFwl?Q/mBtWY83Ҁњi-M~՝}f`bgV&^Vџt W?FuC7{Ҋ5ZIƾgy ?}?|?Eto+;J]~LjEEz`{ovL^1`@̈́؆gl:?>O>> lyv@;kzߵ@y$♛rZ>YLʜG.F}y^q?|[WZ@ƞl/Rq=,h?gFx5`z6wE#{ٱ3lgnh _"qy-ƞJ>ic8 . +9kS_e \S6+@K?S~;@/S*,`*05 i`La ~(F_O {VY {0tOW`77,l:(Io &C f,c(j׳?S4Qm ; rLV>sx+'>,| QuRcW٫!M }ܽ! rֆ*~y> .{M|pUlgZ;p*FNsvI_aq GLU`HA*;z(f7TPu+PRH] ùm?fO]y HɝWj{Ϛ] Aܬ_ S}f󆃔QPޜ}9cF 3Ee,g@;Y5˫842nIdvi|eQpH="Kk> K b8gUނA #|c:coA6KbRkQL RV_}aߵcb: c<=2?]@l{\l ܴ?[DXDXI\bg Qm oW? 8LR?ٚAn+ W%Pwdz cjCrͨd{mRL[6N1 towV+?[!_A%eU; V.Rq$l} 3s`q8W$ {y=9d ®XvCo~zʆVGq@Oxh]-TkQ#i>ހ*MްlUL䏃r{^;ƃ RnKZتGzz\5tԅ_>1R\2n9fq.нIſ~d0)KmAnӻj"^-DZsW1O /%s/Y::d(Ϥ/ʞw?B*Y>h+gw#/g$~Hi?فd('f ~xL;# 9; H K@(4Oɖ=CzãN e\[o:v3#w(pE~"3 (AΧ9"ݏ- .Lnee#@t廈򎊼,x3@ҵpXK@{q`!hng`_&ы@1Q?(n, "o^ހp9?hqi4]F$['4^ #s zT E!>('b0/ ďN/ S~K"n{ml f F-;)'ؾwʰ ̣/w)ŵgHWA&_ R+@ͳSL ]dxfih0Ow TkO)( ZkҒ|P9Av@!4[kkcķngMt-sm ضk _#`h/&#g-U *${"{Fx&W?b2@qw&>^SœH~Bи7nԥXBH~X[>?I* S i:O`98WVv&>Sp8p!7d!|-^X.jM-?]0  /B]_uRql(sC;6N^ ɽPͅXd߮w˲@ϽJ V~0♌$.`XeUOo79`'HY>uZNL{-v h 1^!OSq}=$ r? 8BzT.oT {r esYͩBs'ܥ $bQHܸO)je[~ k>_/ V 5. !0DQ%G|2sE];s (~$"։` Cԯ juBXpA8GLWL9(8cz$r\ Ig`.[Ҩͽ:%(/ a}SP?}Y,iKHr+&0?i& _Y9 o@E}A"`L@O`a(a!(t3jcAH8x`vI]{*ӯ潠2@5 Hs#1{gƗA:5m39zL~h&|ceA!Y8I&;t/SI ke5&F?݌٦s(ѰҢjRG n[?۾ӕSA % ǔX)IK1os סG@^q_Wd#s~s0rvH;I̫:(Tx?= m)b1pjم m{>¾a1ݻkY:g( ƵB3n lOһ.`d_Ցƃγ7wM58|AįN?oFΪb#*ćxӭc/ǀs$-0^11,@Ed 3[ ETd,8܁ǞM=s#-% 0 L L%#rxF-@;qԺP u`sW3<j0fr3Yrx#!+-١9<Z(_ۅ] >G6DrCsLN~̏>%m~0R&˟t1e;EyH4Lai0]ȫGykG|,& H0 sio'2#$0'R r_!k}<r"`.Z]"G mD+`87L" H W qk Ygל6S9M2y}$.6HGkhbjqW6[^`NPs7K@2q = J@QݧF~O 3|!R gw0`ΐ? ;jZ <(JsRMi˧_i cx%0cFc0KչwOǁ?I(o^D8Wz/x_=(3T5w^uZgfdA8t^9 o KjK#-{?Lnqm<= OXuZ_1߅~RԯapL7OyR EAI ?i4]Wπ|IKlPj_ ꬝]E.E5 E^ۼAѺ%$cT#RAq꫏$(]}{'˜Dx{|u}=4i٧5:0IxS)UqoxMEeޥo?98 Xǰ²DǖH>IC],p#[gk`hsÑR@p?tE}3n-o1}M Dޟ6 cOb'%_.\0<[^'.,"LhWӣ#/y@k[w2"kb60,+G oME7?YIg[/>рeHg ߿r`+wPﮣxNjNE`^Iڣ~D0EivMP4>w޵1HGW_z7vX./ BVn @9S0ԃ6b$| :Ltb&(xTAމ]PS=j:,lܩ޷-`}hr#zYЂ}DH^/e@H7+r|c&1]k7Njx-~#(%xE ^x# q}zzSܷ(J/toEߐ :9̦L+/ 3UJڅ`7A1VKf䯅'o s([F`qlnȋ6%d5WyK=IG͊`3#]3ɘF&0~_HZăA93Yv03笕;Mց%$!o1a@rAenX &5@+fb~)T Fsk`vg ? [t^&`V@w$k~c;DP ew z?n/u=k-PXy]N=3/y1vRewYgrP]>z!95r0lQos);`n*}Mzy=pgc4AQ`Ծ=ޖ0˥+ͤib9en(jl]:fsV} bg"kv*݇ߑAe7cO7}5vmCsȿ/3cgcb(;0\>bt ]f~=Bs̽Y7)O4܍t7rY^t޼ tU#@ zIГKNz=@R.[|MڙhZkyt1Kn,0W9< ܍C|z16TP3 4GƗfqRt0q?@OزpnpV3± ps߿{>k *LdKF@'V@nm/E>B<@nSqr0ϳU7^Dy?7e[T$sVzIZ{SmC8^KN/SUy2OeU~} Y=TtK9 b#4JMVuN3Ho$#}CH_~#GcڹY`&.:Pt@1Z?v( SU HýBX4q(f Mm x՘qضTnu.z'z.7*PQ\lAz{'mu﹮9e~gpҪ?q^Txpb{oBy` Z@s]ey= p"&k\{](pe':n/Cmw<\ϻׅQZZkǯ*`,*~ֻҮ[T>/8+9c/{:`:8hINW9*;RA}|$Y֜s"ܝ3nve#`ҀdxBqַIP4 ؠ|e &V  1`?G;kz)XfiX3XP)H  w& &*F~DϽoczmCW{h.zV^t=7?Z tsC!7eE7}7e`a`dH/<5T &W6sZ$ \ot tWm*8Vö|Fz/];Qce.F]kTl]釉G d ]%1A X>7.p3<[y ŗmbGDTwwL'n;}jeKX;H/:p T^羧دm7+^GG/^[ZSb=w*+jr{Z'yÂO E@~~>z(t~2 |Z"=nfNN@΀Êǀ|736ȱo;[r˓(,RнVAy!Cd/#>#̤֩N * wM23Gfv:0卾3.+v |7f"7HgFge֖{ ,"xX(?䡺 tnU&+U(*-QkLGZ,W?,q>q̶%jQULYܰʊp˫=@١X>DEJ9S,ŕgBbw蒾҈"ߴ0{vMħM G6ݻIelȡ%PD$AyO)ًy_4;c6Եz4`BwbDx<ҩwk[+մZŽ(4ţ貋P;KT~r ΛOV2<"˝J AkzPdmNjicv]PGl֬@|ҀQWU:uDE+@56iм|Id5.jm)[0U@-WLPۃ 9ԗ菜\'g"`FU9?*f)U+4Mp]Z~~SxA_PczrPzLWfqUlХ+eŏ{Tr+T0odgSb!P(= ꛅD1@xj.i~7=%@[o5wz]I#Mxuw'mt^He*BvLƯUifHhW tģsQn@z7PgV^&?],$JMFr_ hhjʱG:5;9|=}<8#}~ψ=@8R` vIq= Z &K"=_Ϝ< = 4#ϥT,ཹB*:ك s?0ǜޯv'5Yޢ嵑mܟf]='ڐ{_%q:Ho'OFmCnG]@Ģ|/d7?uaDMܗ@^'2™ϻ |=ce'~jP"%29&Zf3dyӇ\Ҝ6+i@)dq  N7;?F'(d4,W (heu y ʷLx'tٺ<ظLegG]5\JwS@veIJ]VG%jK!}}p'P>_# gn7(Qqt1js$'?9/rqkzr=D<ݞkš p|X-N@urY B+9:s9>ɑΔL~iϚDϑqOcfI~xzɋ>YS?m8 ϸ] @%]#h[P.(vo(J?i%A9Im ?ɾ)kآB| ;Aڑe'ʜ@}S$;[>@l#n@@g۪P=M@v }7s32˅} ?@]Tz=ϲ pLQM*A40W^w!~[? L: &5tll``[XsE_BǁqH0/cߝuPw=giHsi-{c̃}chW9ɯԑuLE#s `V[34^"£K9^!"Cо?bJ>fd|c  ]H- =<\ڝPiɶtOU#+'p hg#sČp“ExGoNf%>ꜧo.:w+.V\ӭ@Wdkޅ@ss.zhEZA,!xf3:TzSgyHhaq<X(>@+-M@;ŰWG2~2?.I\?_} 9Ҭ$z~мQ/p]8\FA!tW~cgA6TC~H[^{Y d|u8-g@>aF]d']"  ; w0f `_`cIw`vZ S#9Ks.: 1 #"Uռ;+ggyu )1k-9 _9^wH )ֈgo dH:O ;/T:dQJrs ,Ņ!ǺxQ/=]߰M<첐 oihHEH mQ'Āԕ2+/qx ׌؏e -x d7,f5 ۰@~+ hkZ⑔Ie@&.RC@n;ߦZ^< nwj@?MGD"rfM^DAnVLzj{hI}|VUT)VlV.S@Ӑ$qߛ>4hPr؋954/htj3= 4_pRq>h"#&REmм=Twlٟ{@1|¥{'rT'X]huYGxٻ$Wh/> }UQMU.#Zt8J/*)V@P,Z74 =]\7>(}[%evtuh"o-eS"߾c1}|բh8hn?A|ݲ!ZS58۰mn:0G nc/A31fJA*; ڳ"/f}ƅz4$eOs *!{X^sC˂@XGЮ8%:*MH%tRnnb?>.^~[abq˲W頣7X| 1)t Ia݃ sEK1tKN y72P;y-eM;, 놶sXd"KZߜh.]C7tooYDWyAԏU|}=wKx!hsIȀG2RAkzAm57`ts-sdA|k/bڬi`A-h7Iľm-#4%j HWDu.u-_b*~u-l)WsBY#cPp% hӗFS9P?AfEMiF}E<@› kgzжeIP:*"y[/B0Mkg@cS B_/JS|lG`.lW.!y4~c(/xx|)8[o Z(4M_d;2=z#c4N= 4~@ݺwZ^<(Nы n"[c3WjTҧ*M,Q}ڹ?Q:'w"~zh$58ˋ@-}Wˎ=C>Z = fqO@?n?o? r!\B _F?HRX{/ ۺH= V +Ω W` #!ȥW#,n'҅;A'cZYRQ4) s#CMx(|xod/c ,'9~=Y_ `]Zn8gzaݎ]ɚ'řmh=iNWl@>v5pRȥs_7ux2u(2/WP8K'Q @aQ_, tnn NGnL4MlstF{ѹ(BYȘ#o>gΑ0*ċR?@x'փӨ?p٬@uyгNȍ͂CB}GлϯܖzyLFϤmzb+"y5Z֠gm"{ANu8/0Vf>7꾛zb3͋Uc(~oQ>Ԍ|Hl z.ԫDFUn0%XODz k=PBm5{ J~گ?F钸6`=d~F:0nko**ICG'f7ҝRKOꔜC:\DWh][7GWU?,[%'rԝ<"dU+H?# -NJcG-L݈>x'{msZiae } 2Ch^=~b*tHT@ԓRst㏥쟃Kk,ib輺A,[Х\3"Rotc1i$DLQrcQ+t.ʫ1]7\>tt )[7A 6S>'T':K*:N~TYD6Щ(i!h՟ι:N}(]kgA7iE'N$tƵ7 @T&_dҖF7w·tboeA Ѿ\ aZb(> =T56E GYݽ"a6M.g$a]"?eb|Oi떹fTԵ'~xE vx Xo|8ж y\Ҷ@{|mPӞJi.>_xGFZzd_^.(-j?^yߑeL6@y2KvUgVO3Pp nOWӀ?8Ar0P$=@cJ9| E@@ Y Dlچcohbs N͠=AuY fEuލ?ыj+kvW-5kx[d;P3e*>5˔/+,,Kėt^f#>nnPld:VPٗuD'U#c?25񥭥H+i&n?Vd~P3Zۅj"Tjџ+\Q|GwQW_`̵c_#hh֥>6qwv[22vEl/[1e|h 5ȫ%Pv 8 ]}A n ;"w":R-˱t 2h75 Y矟BfӪ@(rPh &w? . TD,kc@dO4¿7x7h_6խS@機 PߒKĬ!ڇw @?Z ǹ =B`hY! Cii ĝ}iP3yԬQEe)@kxRyK@ٺ6: M'5Ž @z<(8V xhRsA]a̍(CAup&m0Pw`BZ_C•P~ox%pli}܀U(s.M:?5z ߳{A2#|Kՠ;),rtAwVōEmmMpW>'琽ZtСGA- tGfq;x+ρnjϔ׶Iw &@wIh'&hiF:^Mnשf#iEZ~ʫFKPe*lP+?ʿp/C@1toGB'&fF]SArO:iG,:zۼ*WJ} 40Fh74G^R_\Qe CDœ'C)G~61~8KS吵zpq3㳐Q9Qʜ忞m?f"5Nc*<Ќ|j?4M]_;ӏ:Pf4ir9@rz)t XQ_#N{~4>ُ}C#RK{-v6-nE5egQ?yخO|Zܗ3l߀Ov:6+wE B OsjȿJ9s=NJR٥oepN{hVп tr./2_'7Z^IgU8s'ebS*Lr|꽦gWQ~{c&>m&J YM EqF?\B~bGyDZyIA'"[[ϝa379#K#J?'{n|*X6」 u {6rP6rYk}$@iЦX>gJ @cSVQW7/m0uUڸCZs-zE_Va;;nimD@Oӓ{5.6 ,2Wj.mtV^h+z!ZOִ @x2*D !Stӽ.s~呜(ެU׷g{ !dsk:6S̽2,zG›6S/٬7(7#vQ" "}A3X8hOfEC~@v!;(,$1XzkTWb;?y.d#T*>%>LtGco{>Fst93^x S.n#tN}Yޣ8q5gv;/W<:GO Ot`Q16]qק\6u<ΧDM[WW+D]-%<4J@t 1| }I ''W3ee*_~ c+W?h(0}Ra~j>b`ӟGs~Ù[h=@{'6_x! 9t+h^Fd$@*g`B1Dst3;#%T@xzU`hYϚgn;:p®3U]ɀ(F~x_=@z?&Ϥv}fhx aL>ǞI⣢J *hӬ~0K]vLB{}K#!?_uW*-0鏺My捬vYL|g뤙^GIn+`p @j|A*'=c>ٯ&-')`2R¾ 944ҁnرTy~pK<2]sl.<}JY h(Mnݙqpm9ɀ[}яi\iLؗkJ4 ġ WoS&Q=8W{ -B M}{s>{v ?j9dXU z[J 2ha蝳z׀q[ *%3^.[es@H:֟Vn(޷hC yE( jJz.nxL`m‚*p}z4 >ȿ?[t;@oxJ?+Z4|zzM5w0P}7Q.7sP[{GL=9ng|y +*Z{ ;P#?7&/GDk,xFʖB<C]=ЋϾ] ;&e,] d}Źsw8Xд;ʀ 8_Xۑ٣J/!-Jv\ yDݠ# `9TWWIo B&nԾ钣? y;j>\ RAmVŲD{vXś#ߨ ,׋  w j/V#[u@[mItֳ;K(Sˎh~ֿ [ΉڃZP:)ݡJ}X+Eezqy<(M̄@KWϠ6-H]sչV|h_h_6^L2x5ń% Q~/^A_h} %92tϦꮱu}|ԋ|U>(2AAon͒IG4ُZTntJ<")*~uAc6aOĖԂ,?2: ½&R >MRժٯXrbCt~.GtLF>쎭B߷<{>zGJK8Zٵ0z:|[ϧu!aNDv%7CƆ-jQf߻g*'9V|zEudqǶnG⽳'q]4GZ y0i9*柃a0`0>V)c۲M`9Yk —nxZ>',y>>lW684/<Is50N[;8[ͥ%'qLP31cUIOsy`oΗ·z+0&]doR}Ŏu`t]`{cW:QQ :Ű ƩJ اQzpg7:\@3G(/`/J,JH@JmSIJ| w[ư8zW%N0Rt#Xp*f5STt̰y]IC38R̜Lj7pcPsj@xT@dsp"@S2;z!'= OչnZ?aP'V~>|VS~u:rTހ~ힵ%!.+~[2pbߚ:AfeoF|/`^ol(\pVGbEWj@#ᖖBЈLg@c>)4M(j804 J@&APV:'2(µehpГh>ѯ*vpdVT9XHq;+W}*|_ Jyf%uC;ɂڴ_q[=PA:N2P>ߚVt#{nw;@bGCV OrA}纜CN^zsP\ k 259 &a/ZxЯs!{8srύpGă.u*;+yk^^@7.ۉy\8dj Ŵ 1P+nN g dQfmf_P2c\C p/y= Y脑֪W_ _-ivs~ѕ,p_y:vII>W.% NLcIk[ "b*`ɑ,8:s;צ \3׻k[`ɸ9ߵx\wdG,XٞIk;S~SOa) `+du -o.Eo`gP?,vRxaXJԁƹcsW‘Ju9\LCORtDh+9z7oۆ<r1u`)(XGClsZnVXi'ṚCt~п~^y |;_QGiRJȁfCɠmIۮ ?<0mBA['yU-F@[iN:?f'$AۃSrM8ұ+oo1+@[Z;@z_9_imFCAfthm{~zu tuPFК9'1EIܮmZw֒~mͲ5=$>_VL@+S>g3huTrZnv%[7Vr]h5v̕֍ K@_ghi Z?ԆP_.̣zO;o3͵ZN;M@+xPY id5>2P΄~Z _g=AׯOeߜZOȹ@~/nC%^PB5 מZ(פ$"H>!d s a@9;(;hi@8?]x\:]Ͽ;>3ݩwouZ_ıov =hPP2]#dZ.)@iT?Qd(;~TUK#?vd1s=[Џ铱7ryy`PV1?iu(3Nڠ<([-_F\^Wrd2P\}߀p{h,"n @9ZF7q?{;cq ( 3 ih6Ui-˘c`!S0&|3i?*`u80<V~ɁGU&PFo+  u Lmt%װ% {0S?b -' K`f?byW8@؉]{wNGc/z*F3=яuwF0u35k;LCˁai5qG:B3Gޗ93WsJ?'3?x8UfzŁjt~Z9=V`&dә2܄^je$&+`'s)0s=qǘAe׿kʶkAhV5ATvp*!"ߪT\]z;9P~U~h(YɃr>&P٨tT8#| MP`*ϥ-hk6(;۾/_YUޏ|T6C(*&r۲ZATXywTT|O79uGkr:(aWVo @ᾠPf! 'xMcQPuP} )P>OX}FL_T2M|wIT5x>σH;ɝ C?XTr\{@yIR?(ɿ$*,?"@y"ն wk@Y<p"r(yS=PL*,;Vy9PP(̾2kƱ4 ,F1lyX (IU_oY>?v /;^Q Ƌo Z7}:6RPBJu*ᯗo敦׀V_|@S(D?M{ (3OY2xPn߫nqD<[?3>zo5a _j(Pn,3.eX6 b⑂@m,⛒:~AͲ`,3 7OE';Qme!W޵;XLpџP^ zwQueėc,wı>_O YiAŲLF~N!wYP6^+ SV8V_>=j`270h -:MwJE<h੩ qO6{ɗ`ҭ֘ &6'2)Jo{9ԉs>>lJAyKI0rvo0ۗcu0YΔ$6ę[<سB src",¸A>A}-`[f9at ,~/8c"HE=Si`g{;,vN!n8gn =O6 "8O?x oݯ QR&XλFEvզ{mM`!!٣ļc`a;~,L"~[xn}vVU;.A'5 = |̿z8f ܨvdn>b;m +sPK!P3o) j>^;Lj%N5ˇ@vҁhjA )ʘ5MYEPsqa5qvncaY/3,Ǐ7fyTW[9AzJrqYm zFwLc[zcb2\@ -!K>E. ǪVP@~xOηj'jAw[4>y=o[gj] @M@,KSN;7_t!;̣i`.)r:WϑA6V.h4X5v*5eipż<ڹ.T'.lw)vgAMCͦ8T.ľ[~^|=P Ա?Pr\Jigkm2e[|q.\s^:s}j|D[S+idꠟ8G~^H9KPs덞ի톷(/OWb{%g^puޞ@m2m4j/.M͝1^~bSP} # Ȼ߇?x#@4D{\@#} !@{[t}!P[zyăy]H ƸZ _v|6e{o=3jP?<|#/,^wy'W's |T[yb]zP{(>/̝}>{07] T fyHS8oGk8d?-1=O΀ٜm9J`m7o0w,l-soU&fө~0׮/]Y20۫jf#jM8,MfzY鉁`6Mj ՔiUmv#N+*z<UwusU%J. U@ďD5!KosrB k`FzZv0{u̹2|]hU7}74W 9`~UNTR9ȃ]rL| "mϕ9?9SEEm& -ҳYn۪|;;tF(YĚ={՚٨?gJuPVncڠ*maZ8Apv~, On_ u>:|GB 1ȿ3|ھx: k#U_` ~䫪&3~ifOG@/;.f7 3ַ+ћa=SфPh$)Zުcw@( ui{YuJ󮏴;4cY4sj@sTqF0hۇ9hJmۤ)19`жZu1Mqy,/МcgmDzwROhNb;:J#3TUWW3U>fȱ$ ,n~: Jx_6?74ͦl{ h[\;5()@̰uz3wux%;z?я~ƾ_@|U oNydYMP? 4kvQR : Ō̯RH;d /1¼.LcUf4ݾӳOOa7nm'EQ:̻Q8)$.fqW?+u̶O G\2}Si_74hR+]Gy,oL#9~I]e`Kifg|``ل4F\URLUKS4>7-<7=kއp_zҨT0\\PyRn$phff;C{YZp7'%`zߎLL o7+3r fBԡoÿ7Uy ]YEU)0ەP{L_ DUoqL`V`a` f9;OYҋ!˯`-_ۛpH0ֻ΁ݐ,6rȃN= }{_c㇮>yGE箁tu =KΑ M2,\ ö'Qjw6܌i/b[RAz߅:z{B ;FWA-^oIwiҚls 'N! bS@Z!AZxhe.?H+_{QaRݱN?wCùZ>3sH''.ΎG@Z *Kc`%T'S }Zk#:=HE冘1W Ͱ @F@@H3)S 5&]^* K{{CmXH& z'~tŸۊ@:ur"H!te ^ ك<: l*@gL<➨׊}̄þd,5go<.gtc-݌~ޤ hWNGM]kt6\ GoPONq~S׾ŞjF)TuĔojĒP򅠹RK `ϟk`ydgpXrNUR}*o,NAq.up%4+`3rdXXZ X^+77<`d\(i o\ԑs(UR- Xe50s@ʉxT?'[myr `fmp+<K.{^Z,YT>KseR,X$?q9a߅zSƇ熩߾7Nj戛`uٟXZ6G͖ wKi9I;ޔ CҤ} gv%r$J(O$ŀ͌~U= "%n.#r2A~/{ )9ߍ iznNqM@l ^+$2$ĶQjf4V & ^%X3R- 9*L~$:oE+IZ'@xHχ$?*x~,@bG. ^V=;_[uy@2UO{&#tDQ}z]qHw%>Ԭ bCD\ho`֟e (,4> ]þP͡'B,ocj:'/ك=nzj>{[)V˅~d??ľ0bߦCψڴ޳x>/t?_TҪǁo_VZY w 6Xjd l2J߱hqgxY'oph7]~)XM* \w0_9 }t,Au l"Cv':w h//W߂&5l~\VF5?p}$h􀭱\8YLE1"{|:/Q뚱 AKzO>;4}C}#a_<TwB>C_`@Ӧ@ 64V[=l+R!̤w1{eg{),oD7#I( o# P;?;3mπ@^6:X?{,7MˇQ+˄ ς"2/bs}d X$AQqnȾǽ/V"#|wH!Ǯf75@8n]c(ړ,%R[㉒D$K'y)HF餇a\O4k(nq eg{nn r GP;}@l1N -'+@kx"Y:@쇡x7f}I~L<{W | %x&k V,sh.g2S-~=A|wA¯H K̬ 6,5EQē2d0)D[P=Pּ238+Psv鞪Αώ.ڽ۫7f5CIWsOͥL> ?e,P^yb,Ԕ)@M7> nzqn!7/Jh}}A'k_~n@c@M:9D,\dߊi@P-0֬5_e&kj! 1sub> k:*2(cwV':vqR=K}yf_,ujqPgZ0}>X~ٮ&f)EE g@'}ga$jf~6:8ĉ @_ۦqo&>đU8K&g޲vcelv1B!sA .Gq/Z>W 5YG-@tBf.Ε0.Ut3 L#2Sہ9Lb3^~4Ħ8A&2@xeF5>)=@\OO}3#{&g[* 'ObGF&sӕNsPQphd1 'n aN9".~1҃, . ޸x&,r)qYƙ 5#/C@[_o>Y? ˟q{u;xR1ig(/~e% pG[vK+Y>]eG rxq̜e I^%gӼNKRn c#}iE>=u Xuo{ x%ϝ?Rs|(;rPzcL oFsM1ŢWOJ9/K߀)(-pU͔ғfQK>Y1~rxRMrg@)wx bp_#"}j{܃#mc^3oqҳ']nAV/Xr8)w ߑNyq e/ϟq#}Q?ok ~ǂi)o5}?!ηʭI?O w59iMVqdi~86 3 x W]IxU9ϱ߶ @]8foHp;%p%8}#ߵLA@}hFk8/~q|9&2%>Xm\6]h.)okhw& O˚M|TǨ']⻩@5 hw~{ykki9M W7MmiST Ӱ(y%u 陷hQ|݈ؗq5xTrY,0no;yŚ8OP9RTe_U/^u|*%)'ax34Ӏ6Av-ϧ]ʤAҿwQ)d&2qyX&x NI> I}ފ$YuH~ݘD,_/«jY L*jGu}uY1 I||9^ ~_x̝&@[{2[/d 6g\DyF@tJ" $K\y@RM=r~> w8l^́$$0wB9T$11ѷ=Fʽ ?ڵ 9E7^mZvٝ@zO CEՋ*DK[#$s\E;9 ) }7~nzk) :O 3}#GZ?X{>z8T.@y[<,\yP !*o\,TanoPnvkQι5/WF Ϋ<^ 2Fs.W֑q`뿝yb:la,E ~B槴y`}}|}СE{.}l&LIN 4rOj byx f݈{tio%*xGK_'?Jaw7/M=_NNj,&bfC܏hi")ka^GQQ/YJZ];xjNXE/Ի[Qp{zf CiwY+WSi%Ie">m l7dyֹ0% tõBmJx2aW.9M,-P#H?w]j|7﹘@ vFsG`w{+&"}Ҟ @uO9T?"z D#ԙԾ{*'Pz g~=m_3wnJT1~^]OJZZOp|PnX[@M=! p#U%PO َz>`_{Yн@OYXs^-޸sKpwHh=7Mhhh{zˮ:vĚ> @_؀ΓGI$xegփ?*0n9qrLhR@>W6l_ ZZ[U_yt' jW,t47'`7vmgMjig|_ۿ<` 4M@2%S}ŘOʅerRY/s ttQۅY}gḶfCs@{㣺N+iRmaNЮE)мG $h[]#^PQZJa+t:hvG`9(! WƙhwG?3gLz vl<8 x9CŁG(x_^ S\@n Ezt^p-a 7>Rgz?сm%@?_<ߒ2y1 7f ?u6 ǝ9♈?[풺n X^03'€Ic.2˕nS,sk ȱ[yܴ֕ WTbZm{h69uy/\*mIK YK`UYA`D>?Lf> ԟ٣O euK:9{5|e&Zȋħ?rPz$xӱ[wo9dǂ@>{eɭ$;@~Kdq*a7= uoVw2 TyXbN [y97sZ [*𦲦x5Q=`wg  RA^e_v<\c(4ÅFE2{ 4tg[EWjx8繎Wg- =a?zdn-'tBR,d0lܜ1' !HX =Łg] X[y?;wd硳#m[s=R|n?@jv㗊ةz= 2_"_ρ)}@{V)W0偉:)Sy4r1{{pdq轗0ظh"~祗(K-gQg7ί6>:7i(#Y6]qg68IG}wڍq˟T=wm}YFoV>=z9[a\_YJpP=Nvm&VfG_8oatˇd-E@m;VH*{ -5 ^K+h>Frǁȴ՟@14N$R2;3jp*hywc %Zūo$Ŝu 1 >`z&{Sux$ s#@2ؗwH> oYs?;l=""}xnE "@.I|mZ[ wͻ[v 9H00yKXWaۿL;2XK܂@⟴r-W(<g;}Q}>@eY$& w;q/1-8Wsby,N}sOс$<79Aέ?@R.U|e;qGK7L@Q~Dύ/bC@c;g*cjt3k$1xٸ{?PD^4Je8ؿG}NE[΃.[eN1sK6RA( jL9 n;j Ō( yM j\wBD w,B§oBۣP )҅zoӯduzI @) H9R7u-O.{ ;_"+umO0r\ &_Z/?λ@lU"(9}nH*iS3(F@b(t',ZX̡Ca1e f7i)G>ԇAX{ s*xK1}d] kqˣmz D/&EaAn.#&=_gt&!Z@?Xn<:k#τK4vA{ExM]ИzFw}%C=TFr-lo ka,]ޭ./{]?q[ۙЭCF@9y#θ8]?'*n嫋IggXʛǹOlнΞhl q 9zAUyrkYӂ!OKÁ9E}|T{8W'׉_kM@?»o3Q"r=6\?gݵYlQJ;^z,,9Ƒ&BI=]dpXx>5*JN y @"W\*H6z."Nq. uޗ݇ M0ycKj] ^ jZTH ҞTѷǾa<qf- gcLu++7or8p #`ayv2򝶒[nRSi);@߀[=n/qGZspNN3a,dEsK%|?z^^]y :P]Uwd sf.T G^2/co~@:IwE?γ~_RJh? П,<7L0҈hn rt?dN + rw/_MP^~]1Zo@=MAyʶ|e)mvE9t9v=6xqsuN=/'wj܀2PSU*c)v_R2ɧ7f# n5Am ?l[]r?XҒ]cPZd?ÁDzAC<ȩe?oc6<#WJ64E DoEt39{c. D@݂M̬)pT;fR>K\P c#. 7rЇ9PȩrL~̚ &g@nuςg**lT#PbkzܓIAոD3)3v lʽq@{6(zO m)m0OϤ?%zo';G"n˜-vC@lcڀc {HІ Yx ڳyk}ȯTWNl F n:[uo,GR贷5JZvޜZ=o_5,cȳC8By>σ@OLaz9Wp i#@W8tcٗ46̖_[n!NƯɼoش8KKT[_$ԑ- r1Cdȣ˾g`he"mM>gh1ٔR$Zz7S6 m\_}-Gˎ G}{VZ, $-Or Yo$; [~Ir W=o/O1󁮾L3tﵛ>K ϧܥ1#0x _8.ka?fa"ɡg 貼$j3 1@(p Ic[ E>T?xyyfO{S @ 8,q}[MH~c;Q$5g>8u35;UU2Y) -W+"/i*a9)ioGcb>(^{?`fA5Ǯ W~kf%?dq ikagD)P9Zw_̯tbfAnPD"k[5|%!Ja}PQjʖ55O;om7@*c 3(k.D;.Ţ}S^6<,vPh;'Y5ҿ" JkO?xʌ )5B#(Wl5Ģ'@q02cXTbA&2/|T]l7%>߭Y;AvtPѨj _7,pl=(ş|)0ԯrLJ]{(ؙ~4TN RӤZP$*`^w6Rn'P-pw;<>Z0o#,&m(|w{h@PLJ"\ڥ~aDSk@\ۏ<ˉ hWsԤOvK[G8οΟj=s`zv$\oa9:@q|elph獀Q-jN_:yZa=afW8Wv@/X<>hmQݫ;jTq*΅"/Ҁv&z,(&y;gMBn&mDު{7j5.-?}7ʎ}˵ 4;IO[IkRR L0̋]cuh vG"Fƥ{X@h8hGp:Ǿ-\M=3~X"(dl${UV(:ck@\Yw0B/d ;p5 d]=ё -}jC$$ BZA S+%!&@ȩ@xeG;~\? o3Z"F.?q˜ЪoI^~ۜ_d%^qJbz W^νW@xܳ OXсG:3>357/t! EuD *T*3Y >ܿxsBoq~: QxIb&Ҁ߽0GsW6L6_q$,X- j2/g8T#t#&^ 2l;#RD2A)Rb=ҷ"Y JkxiQKx/c:A Zm4S&A*~73 lӖq>A~=:(Q ЋKD[#9rz\P{""}FFT:@q7|hDa 7, v=4x-gO /$A#(<J gNj[i,tM"(geϯ@)eRvu]?na;xN%v}=@PtMsA(m?x)O2(~*Eo=P>tID<W ʂVA?˸ݷM_eG%ARai<FdPB-ty:ouPsnZj,PW`۱qͱ'ԍ7ZQOEB^rŵFZ2P<ݎ[S%Pɉ=:n$ @-|/ G͟ږQUy.W~οq7O+mB)׿e2ֺ1mJ⠛ZǧP 6O)a@%}B8P_jߠ߹=d140z"PG B)WvԟY}VEa\aZg̷B(>bR5SnR ; ws4I멣X:{vb)^6u0o; h!u<CBLeεVy 4ZÊ!3@Ju|ws 98q+.I# BѭW26MG̀[ ShZ7;} 4{-r@3CuhhJM(P- | h; f:5y4uC2q4#'kwn+%%4C^HP@3B8h< 7LX?zkw zókX&ڷkJ;h_ov]ԻA!@#^+1c{CX 䐷o@>Eq}wڀt2U&yg9G\oס/)׻loP_wmntGc'TgD~;n- !ϕDl_8jy'ŷ2o_ MYQķbS(P37lA^58c$LŐOqE^=2W/P?3!߻)*. l7^ǖxg  b"Z0-i:۹.fǿy[%a>2UdERw=a̕, gKQo}˴#!]+y\pwƇqbZi8)w̛ʀHt3XdUoXjc`0f07s -dυro):ZO*D>cߒє80#*{ MpEl L[K0Z s8 D1A* zݖrǾHtĩTc<`ũ5x@Ya:]nN, d NXDU-g'>@PmMjV#3㛷GvbQ9 aO;BP1 ,dd1Eɉg ^ˆQ|RyʃXdKSn&8 X.~tV/#S͝^l?@q{լ7olKU AW䦿 he% "mʈztx'UEYAVqk-}7h~si~W@{k!ٹW|{tvqA']=dP ?T:Q1s#X}68MGU+G@ӑA;Ie-hG &K2-}=Zd3h yCjgtjd1 Ex1̔@7gv/TЮ;ztZ^x'K 0NP(KN8u A;S]N M4v(瘓 hXrȂ5h7%v!1%c:4J!{hV0jGiu fGz5΋d7;h&az3-.g MMw=hoF x 4mq%{ @zƩ|i<C|z@ӠvU}w7b߈'d€fMH WRx|'h*[?nrxSN\ʳr l/ 3Ÿ^_zP24;jA|%l1~h_(ߐc'zp]&ֈo[͆GX'k+M;vە@a+Fɧ^v<潩Ozɣz~x~`nhO?0MoI# ZODrp[@4 _d/ 9[ gQ36kp%]bӞg DMZO@;j[}> vr<DgԳ@6j-HaNOv՗Go롏x'] ": %(nzD:?GܬvC)'bEM*gH6㹱Xx̮}"<75|  B;w3E>nM"n@4=X|qD?58e}:h\57 Uң_>>} 0CSw_[vA2^]%'>׈r.\`n8y4}Y@l*uEh*^`MY$|3[Д%j/W@ӲJhb4֊ךh~g=- 'IꃕgLG|67 [hb moYɬɀezonWм*6~`4er]& 45t%{O2@S@%#vgxy@CR_R45ݒ@c|`Ua]0A쟷rz6zir1q#hz{UCڠ6c<߂U e<9ƴ>J >!JMl}쳪l<ҁ}~J?<}S)b-{%gE!ɧpj Ϫ:jK^ck)Va@|Jo}qU[at꽍@mذ*n(b_{i,=ؖԚz.{q$~}8_qn~58DZc~ .~6%a@gJ@JQx! eߘq 1oy;9@vy Hp=NyHEJ@ʃtMܵHg4=Ktݖa r͇Tj` ^R@Kw@Q|8ۊTlt#}v)$ہ2 E7Q_R߾$ %nկGMZ r/d M%S"ED> tHOy]ҕ~cW4 ,~rsӗt3U G<RV @Jм2enxH"6⚝i!|*yu(N8gI --@>$G ]_ _]?$ 3{ib,h-wb?4%f}TWa c.zZѾ[4(h?aKB vUоPg h3%E@]gI:Z(nk:s TGv~r0k# #6zw  o_}2īwۡZJ}%KYYĺ_rP<t2c*ޯu*G2eQNlOP+r:gqO$eqM զm]@*v%|Rw ),oZTƸ}@Y*4ν_Ka(wU WTe?t5ދMc\=9K;vQO>ΙLܿEI?;szĻ92ĺ sP`B= GE}qX{yg+xZ;G S{~nIcB}~q̃1ZW0o՟걟G_uh΀yA?<;_2c?j?D;·zVߣ/JE=C3&h_T2CC F?> .lLbLP a&r\?g?Llw[&T.` ?}OUa`?6(:d 0s.p}1ֿ/$-#H]\# $uiȻeݕؼ@bgFs:$F {ؗ|u0w^, ~i_I-3v@7*i/V$+n:kM2 N W^XB$"_nR D|h-|j@T} ͤ A{}r~/W`^NJ@2E(Сu)8xz*'&_XvH.^χZc|AC tI>nUI'gLpݬ:~,_`}OA_*k;hbp}DNm=yQ| RPE&g@y^> ֍ zCo|c ծMՐ 25U"Ť!ᦠ"h^|xR>m1-R/1M!SYjyLq1* fp36j/J;_\z[r@9X/L@_[zzb t'Z$:1eGR`~2.# 鬷}AۿkUثEkH% o|oĻtC-[R}Lc r<=}vZf&Php3 5J?@=5rPG_Qɉ"Gwc$UcX]j:Gmq}t$PƷ}ѩOh0s;P֮{@ |c~I85֢TEFy(.i0P jݛW8PZ9u-Ue+_ִ |Ŀ]N Pc.V^|vw\}y/$QOn:Wg} ԓ l4>ֿlD\oס^ E^{Jż]'MK3O=xo˯Xn ՜/YV<'*Z~pG@=oh;Ħy.陊7 fb}#ہO<ǧfwVU:XeN}<<@PۏT[ 䟵*~bǐOx-=fF٩qIw/{gDLՀ8atyxiJ/[8u6dNC~xkz䋚%XJFz^@lpM@^5⊦oa7'w\=sl[,a$s-GyW"|@_$/"ODB89jm.ZA"pk(D6D<~8E^QAg.>ibZzRy(Ͼ?@qԺkA;K4* zǕh{9s@o^&ZQgޥ ގAEv}W{ƽs@_K6wˆpOdVr}ϋs ϰ;ezOX{b7D8@v'恫,W3öQ7r1b}m0=eEF{pQ{?p5^z mB%|AVTqtJ4ZLF^UH5JՕ8Oz%[0rf;C!#NX_vK愶?qϼCmѸ_l Ǐ:b7|G9ø5\4kp1Tvpy:֥Ԕb>Wϕf g^j p[a|1I؇x>bV/`% Wҕ/";y_RŐ7<_֊x﫠5fZvb@~ _tN:0n9q^͎8KHOmuI~ 8oEyj& ozG-PS#W\ΓIȯg>؋\K5hP'K?/ra8KQwӓ)P=(w o{bzն_=3AhqȬ~0 zF:JA׫+;2=׹tb ML=V-9q}|׷Ry,t=<|Q#BaKa`,-2| &`|{FLipEtoYgMO=ug}n?= N\B~v30@;?( [|S?bd Kepm š[gn z&+/d;a7b=緭Gʦ{T z4F{wK?Xeskm* 6gQ z z~=[Y(A>Qg0C$P&\vd^(M93qMCgU'u.]s-@T+uϸyuOQR Q$o;:=y^WW }r_M 190RXwN{\Wnrde%ĭ(59WJԃC%ގFp}E0zRw iv}oՅͫY> dJuz&Ҭ; W0ۧ1D40a9lּ Mtqڥ }z y#O:gwjb ۙ&H 2GC )Iq lAzκ``AdHxoln~m +J#``~W<s FNj*Pqݖ;<}+:&0PUsi=l}{}ӊ'om_K3J00~p^H ցt8yr5ɂɵϛ,@' hz.wa}nN6e0Pzy^?|j7Z x^}~ZVĺ MS4("7z|Iٍ@T2(qJxc8^"ьemОVzGχבvpGyHiy vt0 K2}d2Q+ W~7[3U&kr!j闵vnEZMu„PNs Gm0C;eyƁr>5~oVhB MPp߆ J8H\kl_Rø". W`va~ `Brc51Q)_]%>]qhvs9g>UF_ zGYJC) 0[ YmdO$Dn}d+籙d {Gr`ȷVg;s|/4YzkD+ՙ#lyoƂ dbGsr3I5r+" 3)܊~5b~h^W5pdOoLD|{?|ηI +5$o{&/Z;s q:|d"t l^B)e$u]@gy &}71_9{LL(NA)< dU !!}XOƬ{1?2_2Q6$? fXP4~Qz7gO"NNqyY)n\zm/{9.02|xFV2} ȁ"sGv>U#ezC=ٯ.F\q5"VP%kHb[0;y$OyH#M֨~0ū?2F_P7rQ:04 = sn3V|"0:#"?axHGvfȫTح`y9+o[ބ.]tCfI0 c'w#K0'190Z>qPzo1;ߝYMN/R_Hk8Qݟh߅X+-`y/1ݻ`30J7{v<ɥ>`u#2Nz}g^k0 =x(Υl^~\M%U~f4PUqU՟@U'k~f~M|4Pu/ >ԏZڦ T-6Pt*_̥&@5Oh T&@ g-`~θ; ^FY8/Z:~=@%1FiI"'t*qo,Gǹ\a&"GB1JG >tF8-yZDS3tt,/'@U;*HjۆtûP 7{uޡ"j2湏qysn.MSùXzI ,%q]s ݓŹWAUGVp Tj/0n(T1S{vywC ʪ--7G ݠ|vbw kgJ./ ի"} :M)ԻjG8u(Kj+E/[Ys^^G>Xb#ՐW{)QijkFSzVX3#4qM7(aI Ln4@^7 5_9( A[/`1u5+u"8|>' Oi}za>}UҞ|%3v][ GևT>z}Gʷ .J3mLYiC4<΍o9GI oEKsi8$>.s@ ,pח H"w&8:-}ϓш;ݚιuI-V؋]N~@|5<z/Σs3"˔R=rÙx6qSx}q:o !"nrO8Eŏ0ϽT\:yWR`}BX cp4PV.@뇪羁uzO.Xd䭨 ֗7/S,X_mY;>.3Onh.2P ։U.?.cXy:MEG\YP>TJL,,^j>b(0ݹ3R"^5faCԿȻ3G$;8+("Yn`}>4]3E%u8US~\x΄뷢|=[:9WKEFχ`+`::|MMmKOI9}Dɿ=Fh6^8Z/Os:v9e8 &A=N9hp#3k 4 _4&;˗ţ02q(4{o .0r'Q9w]WHغzajD0\1kOmc>\|Xnm=Fݥ/rjhQkF~ZGmA\ w{ʝC"iț6\u?ppJD&6- ݍq ׷p~"f{]pWfwLQVG0&=XU|뮷(ß;2M20bZO#;!swnW ̡saQ`Frye&SQ6e{  MWfSкXO]s ؟SсcN#`N99'^Vcn}w}LgU=!ܧcF?]J{8Ip|ō"p_6Ro K +/ʀ°Q˩?JQ}jo p^RVv&wGځa<ⅰ&Ɲ yCO^m,D?3 ;>oM'v9L?y'OsւLOm!4U>*VoDiv[$1q[o/4vʵr>rv~ vASS2^8c^G_ {Y= .nsX~gZ= Ȕ`Co`cmme ܿ jAe/P ~wkF6*xeNV6}(A" N.,Z/+"hup^XK=pkC~`YR%6l. NPsK7Xk2׼Z#Fan̳g_ֶw]S>&пGtSlt XTT"ѽG * Wd7 ck{I8iA5P} `ڋ]]ϼ\yIo%e/6͒+8[ )vw;ߔF@ƬX+\ qj3n8~*6GF_v1۶'t0wC{`^1s%A `5L숯$+e%$`Rt &ÝS 5F`:27x0-C8OpLV7 $M/ޗleI(- X N>3N*![E,YҢd+dOJ$B)$eP%~s^>u:13@^ jwkWz{2h ɩ[Fq^mmXKz;%j@,zf `䳹C6ߵ_dA[d46u*6!~w玂v{hg}Tom.k@W~@Uȿt7hv(bȺ-@[Cg48*vJyh'-S\A{wi߿Su.yoV-WmlZ@n!tohئaw$&}E1c#+vQҀ1WtVS1.6E`lʥN=&AD>d_ 0bw6 ^1o|/^b/`dҡduu8o Q+{5a?2F9+h{HGP-)kp#K!^HM O*o3Fs#0"8*UKe0-I<ﲡ fY]s+n_m/pd p~*j =HIK_i%T4ޒF {]JXR۵f%6Qa}gA'vuPJ*]H@*(9sLs)9Y7#JCD~P wk?ef_@@ӏ[^ ky]H; ɉUrE'wFzG|YE,P&x!6Gh+@Ll U#re/3P9V[ ;N>PۣǀʕKxl,@ؙxW" y WokD5o|((j RQx(?G@=Ϫ~޾M`Fd̯pujLяY@Q;7t3 zTb?nՒQJ@y]Ǔxv3eլ}$e*t*P>$TeiO=i@"~La =+CA`ĕrʱ^̡2wT{ V%Τ"O N܎Xs?0 x=o9kv7Tp 0JnF~+:`h%Z>ָXFHMYp\S8X잂6ǣ5b߁q3 AuӒ1ߙA<ʬ%ϙ&sN(2/5Ψ#Vͻ[#˷Yʫ#'t]#?5 Y#Ƥ%]/0MamLb~_#z IH{t.0NG&<6s?ơWXuN%}*CpPE/tq[0F9`I,-U6}`|A\@$#PϽr}8E8 nLvyBI|uGI%+S^Rb6΁ࢀw*-11#'0>(쮏?=vǭWp?t[̡~v|u6܋j=}Q:+7:C쨣QN8;h`-I~0:=pɇ;rQǤqά`ܖû(L0v bX ԥb3n*x8#S5:aNM`3g{k̇׃؞z66oykoEϩ]1Xsk ~OQg,}|ڊ + A[aKhZĕƙy٥R6<Pص%A;2Ghmn 7ş MBHUV ˽۷_O+m=$(Ei`Պz?W|>7|Uڼc+LҖH=h+΋zMP&w5OB(#=:U"{@MLv 9 ^GoeV|vԲ\Au IhN߄znt/CJJ^.șO/ހе@Q*XUiHm3q2h]F\V0ϩ夻pCӛxP=k& N KΨgЧ黌9n u- v+V0D!‡u6/B.=w0Uȣ;rb3$K{ z?>bYV;c`lW٩- [|0ՐVF@UQB<0}\@>KuT@n7Z.ƝJC'Pgm׌{ʨ@{`18 >2uF:|?HU SOY NYNTU>KP#^6Z5>A$̪KAcnxg踱k?pt'6g<б^*:gbԄ`6It5c9S`Y@"E'V 1>>;v`:ض2z}RuyKy>5GXWtj+(J=t/7VmR K~˱@yt5 :WxT%XNt缞]t%w0]ފݼ;ӟtU‹5n9'cVɇra6_ܷT :w2AԻRnZ=2@G;X%a:Tf@u0Ыϧu>叛~}@yr煉3vU ޟy@ Kq~],+=U=@.B68}Sxk{w}; %)W`+L{ˢک)eg6:iuO#:oYb, WWyzd!7yQk?p^7=Jy,^;ǝuN`~Ƿ&BU u 7>e֨ al?2qn<\r*<~f+,z @O;!}|߯sh V.<괏uiG: ׹Mr̗]Ef$FESt31Χ{ZlvSeỆ`F;&`}m̦`0%ܞ f&ܧ{>0̎PLOq 0=66"i@)K^fKlwB<{/m`]㙁3~Aӑ޷L1n]ݶcnt0-*/2!Z)a˵$0#հӵa^},0}'I"#O0)}0ӆM4BtX `WZ̴: (a^uX!)/Ӂܡ]R<$ fUlO~Fbt1x1$fe4IM{}JL&̫yE>zǀI͸.r/I@Mt| 2|RAd{D =kɸy=F3P2ٸs1S8~gGV_9:? AK]کOOO_կkiWUÞ̾}Sh#ωCJP}QTyalOPuogt-U(Ɔ@^+:f/S_=sjG.v`n PP<޿:&W?yA9L%hL&M*9Ъ&Rƻ6yG_~摀[U};{26b.T \Ҭ@+ɫ<9gZC@[3~Gysh?(xtR@8Jh]ڳYM2u:D#󒿃 >@e%?CXz䃽S*ӆk/2"@>U3P1āZ¸3P+j&^l? Ԁj/r0(Y7/ZN{ }LR6*,_쥂@q۔*P7< :X:`:_YPvCq,ݞTuvr_R@lhsԷ!oZ-k^OiI y _ɺLNL{;xub`i= &ns$@QM7ڨ?3y%10y> L|d|}׷ca`LL_1C52Q&\$h Iv _:&/`0I=D LqW42G$2޹Q&,&Gjf`'S2;՝-- y8&c]`Z060pL>M$w>}_j NI*XGç,G0F)i"5vGsᬹ7$:'Zo]V=%۰zp^9<< S(}Yb x'}N5lwp|yu`b6Ʉsܟaڣ& l/d ({#_)=7"3gkvπn* ޗoia g^ƃrN5x=r~ ?D!}f%.?F]dDh'2e[ W>Ag#}@(_|U-8?Z|X9?X>ަ:Y _n{Q/ |C4#ON[yOQ? O"@{^Jć,KS/D=s3Tl]uY: 9ԅn!1ߐCqIp{O'֏qכYE0_':_y>jZ|Yd>2ǽ`R֭vj(Jib=A)0;LRLxhWK?K b?mZ)t0aļEl+n#X)wɾHc`%P~bqI.|j4~ =E󿽫`"A<ɅxNA6 PUB62]&q޶_SΒj+~nY&+`ݱ-߃zGGަL-iU`q{\A32ڠ 1s4Gm&\ 3qhE96?D{{y,Tg`\L,̇@o@3o%s~/)a~=y9ۙC\5^\ P_qRjC֣M[/tڍ}0OϪ$@J~k8ߕW|<]dzEhL5wݏ//٬u{R]o6]Y+?VƙI y" q|}ՑAxv՞9m$,-pK}I_>&4R_˲K`inqH v0ۤ=ιhV2՛7 }c@=nm_D0l$% %G`fu%uU_pVmš`&t>b>d0>wuo}'l47-c!`\e zxbԃ`] 1צ_s842 k.~:<TfP'R&wUcqm:h+>_ &Hq7w /[~8UY/Y ~uAMYWOjܔ0^?Wµwozw(g].|lv¦p0^q.9*Mq5驩`\yTI7S܌\ne}S'`KsEAtx: ^up$c7jXWm,.Ne]G1_J=IͲkg@&q9r ѭб](_)z-R:'8$'A'#t퓴 :V'.`2mjk|݄<3K!sb]j{}އUͯw X!Uﭜy!{umv=4mFɪ=ø)f@>KzCW_ֳ} !jEWϑx&S1G3vV~]7`7-_8s/y3mľεB6h Qcquʕi>#0{ؽؽWӥHk8uT T?]χjW*~Ws;pN7Bv_)Sg8'͞6ًlmԬQ.[FV7W0Zx&' .ځXncu7,ՃQgG}0nFz <7gz8?{F#e 8Oh)p8kXcyMTϡu˳{`+O t|ĬHsvWA4? #Ao\|V|Yz?X܏E ٙicZ( :~0!۟aqH' 7t:iLuQ%PO؊r'#X^4]9r|wM)8ݫLb`W9 li?B>{'Qx,Ȼ"\7uG 1uo"/Uz&% }vf LVn`-T< ۙh[4p}Ǹ g8c wX}4r}O8P&_60>5>n|`őv`(?} 7^\&`: 76yTŽ0%M0nhSu4 c߉t [ﮝ*σ!3ڪj#̔t $e?LNz &E?ƃp߈!3F gnW, ?]1ޣ'>4kKhr>˟3r~٠5f]FzڿE46b5xm6uq}GA{%sn ~J 8Qy@FuJcX1~q&Wb2 TzyA)?nK|_! "m=-/ɽ '=۠=7>ùoEZh=h}Wm ڃF3.2vP䌸V.j*P .ˣh&Pn?4_+d4q%4Ӈ@;۸*s͕xrC<@V~9qJKwz*Lvͩ;Sq B~UG^{>8զ:as띞-l`Jp&%QҒsT-y^/} hԎ|o䪁D2 ʹlE6vPWī&%h v\oN[)n9ކ:'چ9bo∲ ǾCm?fǼE97^d^;ŦsEA=u" |]65ZDȔ9vwм%_=vEsQ=WqoLz ~OW_}-ZII`p0:KV5MLc]s6vAD@0ثR"| fn >2O0g6ۢ ^w_܍-UY B z@#jQ0e31\Tow&9 f//օ<%#049́8b׹T'A2x(V[3?ϬaϔB2ok+/@ D`p0f42`B3DIZ9Qٹ`Fܗ{s3r?vk[`9`yg/3_908|ryMYϕ4kls|L7 =<3dEk w?h-5YQMȒ4m };+1qn6 deł Ͼ ě1_cJr"ϻSx#s2P@V*yeѦ\)dPg.tE/ BZ1DnToFޛtWQS-M-@]@Fi~kwIsJK4+j1k9J H4~V| i0m0hD@#[w7Gzjq;!Ӻ'YCΕcW+ꂙ'4#"a6qX^Kf"H~(eRn9XDHFLAkphg sAs7 <|wa_/4ϧ. nǝX/ {0k}Xnr=Ki6.< zҝ@ﮫi`[GoكWc[y'{2&ezMjZ@&}zhYul?@ /@ z%i{^u^އ۫ޔ\=@PIuױz zM<<^E|Ӎa$~Jr2aK"Ww(!H 4F?gV} z?~:<ļc ᝠ7uAom#0z-x A=ý؏V.k`k ݷS вݩ~ka[=W6Ki8t4V Ka:)$͑N.;R#{42Y]< Д8#Əז.pFl5i웠 $j=񶒁b=ɓ1xS 9oM.z젩@X4E5ޢ;ZJC)Asnn%&Ŀ&OM915C?\b潡w@cdjq k37{g@&OF7֙NiD_w'hE=AӮ:}'5A+8Ͽⵖahw|Zİr Xl<Aw\}=q'`ā?6\$|s@]w$XC7{}"U9n9G|˙6t,;>s$ vunF@ @[o h,+QMn;pK:iҗVFPcFv;ܩc񼲼yj~Y[ wG^_C^tʡ};Q UL@K}7; !mxomd)M ԡ,͎BH )NK5mG-WM> h3j^.ԥs~T@gm{ ޷ȏgz`B/~qc*B{.yu49u2C)B>X}]/xw6å!&ރmz9P-+0 b? K%  NOk Sg^>{ *dK9Jo ro.g$VD=a+ [$_K?Lü)UELz)F!\ƕWԐ䌼a󥘱XOgş,–z+hUO'џg [.sx{+'񜧌)@68Z͍kft@shuIǼ-|"X]S?/?5eM p? m<ϷoZ_NUd,$dc I.T2p.yH"%JɓԦ$g7,>@2{o~E<{0y=Lޒdb =7d I8+ԁ$>ܛH@N$t IuވX#>΃/-7S's6Hr} @sNp@2$R #!@V5;$ A@}kX$#t_zOs @bݔ\}KFow>D]HZ Yyq~2K?ëDg> 6ܾH;syO![y`ooԉC imŌ|;O@AsQ1;2^;^Ș?wM;B\b^KaЊ/>Wq yT&x/~J5$ orDO!=ļ>Y = i>޹hEOF'ѢQ]73'1tf8uܣGINQ"N_h|mW'N  5:owcׅ3/^qo!Oi~+x̴&uӷ+PGfdW bHVy~Zƹޔp tF7[jZJ]QW@7 tk_wenl1 =oS"~K&ݛ2Uun\%m~t˷>N'LA7Xw=[^|#m~7.ݚTߓlSqG,?>8DoNj)|-s@7訩[2}"5t]~5@j1辖ݧ69g>nuXKx33Bt/ȮU #^ۊ9uxn32L]9#uގ201I=KKAR@ijtoMy.,؃'u/ȠG:Xv cx=[ѻa-E",x,D}(q³Ofԉmr;r?j7bJ@m< r[.6uck=FtnQ͡,tu@$sjsb\~B@m64!b} @=8wLb:/{|Dr3(ukIPuxe&CRJ5tE''X =UgyK-`dK6E .ݭ x(U1^MBOg1(scVh2adM;Ɣv]K} ;2qK/偾?+w|NU@?dzh~st+Bkc#Н,C64) Z;l @w}xd0g2iaړ)@wk t0U2*e1N+鳩X`͜~wp,#u"44̫46K&)mgymNYʹ 'LE.Xԭް*ƺd n/ zc/Җ@ۯg[vKN3@=zֳrn)N@|xH~5TbnU>;(r#7P?b{PT:CbCaa=gGYP_w9$&DjJS9<%i@}pg ^VH~ϙ?P43Ըq#N@v^Ԙ3w$5GЇ| zBccKPI@M&S֏ bjyf,& j$.u绳Y;PӺg{z}{QNg@A@=dQe=`U^+=E/zMWWϟ@m_Y] 8!Pn=k |#˿7r~yPΖt lD{~Ip+(?G3۵>W{ ˠ\|(zt:(7iS}A7Sngq~CPc*`UVt%;S?徔 /.1ItX0+(Lhz>?Ƀ$(6!ʯB]]c遲AW~M̻׆4x&?`V|GGi0;(xdyʃr.I (ܹ5({1(W~جEQ;⋰}'</0;bCyy1[s)6; q"&$5d)*1_O#Q}CoPon=mܰs#q cjpv> p/> ?l[6dj}Y umޛ8e=P^]vaQ]?C2u7<˨?Ь3 drʹg#== {{ >yR-!VQ)*d!+t n|prz> 6K3@tboYBf  \V9yE7mOY3EWKA^qU>BczX!%35C/:J>%Hp.{ө{E0X*~D7˟1{B&S 1o V:\@=9Aɹ*nshBo\V:E;0JVs|0%lAPwh茶-]t.S6h9tnMa ̓mbNb}Ha׿t!R׫rH۞~'FYtdt@>^8}~l큑O6](b,s;֫4cO=.pgY{e;K|q>wa{ųLeaa зuDwDe>sk|Gר}qcm?-%U"F,zet< ɈuZ-w\fN@V;`67 <ʞ Cn<,@v}/]J(G@lP#}кX\'rvywmN;8MĀuMG G6Q1;~ͱcj@{w׮ȶy/.Nr­@>wKIǔ5C2ǀf's_Lsalȧ5o9 g:=ַH9Tw w_rHH&5^9U~Ժq|X3/|mq]}9؆9z`_w?$cn5<__R rq!㡏|6kie_|GU5Q:ú(sKQomw;z^3c]Pޫ41ʛ"?TFDnfPޕŃLnPV}}CSecھ2AyaR%(1zzKܰU((we+t8P *( tq|b#WOՂlJ3sރ56 2;B${VԊm 穊.Wʼb8;SǞP=up.DS@}SiKW\}]4V_^q|>uXRBp4eb/'^vDfz>V@7t-> %r L>.Q@ots0xna,u nmJ|CE2l9M=!Xo75~;Kgqo ڰLM#ziDS؀ G.[I0-X-)XZdݒre+6$`#?ĺ1gζ/*^SN9UU8Ɲ tXRviмwh9;PA㔠3gX"h[n{4LwFO.Rp5; a٩ \m~4No{f)J  Wo[ڃwS]CH__xx >[=>puZq{U4^+> /ǟE<[Ξ5X/v-H>a OI[yy4RV@˛fȥߺ'+'/?_mzmNu, _&@|o;-l@Q ߪAeGHs+xQgUI`1f Na݀͞ :ts i\&G@EY ȿɿe O'VBRh: (^\NA' &tT_'3,֕q{p[|i;z6?S>E`1s}=_aܸt俖oO{˲~ǃ-_sݝaǹkEs_ .O;́| lQUD=w k ,_m7>t'AFw̪o݁j7`|^;^ D}VRi1o-;$IpA=ýI5o[6oB$zyCP)??йHKgDan;FF?oweǑ7xô.#z4.Wx_w{FGcG^L!`<.ؖ tw9PZAɗ&&Q_OS_nsۂnkzO_wuڃ.Pk;9RdhPPE|iGqDԭlÇ'PwG2`=a.Ʃ11b!N?6ľ ` o~$1I@GF8$W^uԉL H|V' )kIVJ@M'diR!5@bd_%lN= /2ǚ2llAzRb)zU2[! ='T)5?cU ]2:;!o??G/xK@ݼ~kCZLyjIcA'b z7QǕ5_Dr{53hwZ4rP=5U +7gқ W~74>Z y`>ëÏrŮ@_y~?-oT~k>o .|}(?ݕz7ms$T޸KNn:w.>$MruG[ ƍzPf|+}@sEW$v Wnz>Y~#MOgyMz,*?{QfA@5ts_YlVPt ԣ\z ƉUlT"WU 7}_ÂUc8'd@X73G/^cPwyL P ~nLnWԁclY_d ] `jޥ@HϽ Ka/z"!V l x[vF,!sOs(hǧ'\xQ/b[NB٤, t_:vDž_wb\5GOǯkTL7>-rCOqÆ >POƇ/leBl@8v.QnUsRUoesbw6aZ0q@;+ \bߵ5@(*{ 4e"`@nR]#0cQ*s0r}a?gaymyW"0C `k>W޳.Z5m c9&#!ί|Cded/`*\b ۀq#o2 ._> ̸9 ڨǣ5և? R_mH83 FtO``yX)ik3joSz {z)Z ړ_ԾTѪKB<ƹe} kl_mٳoڽ8GkXFRt5c7+'%rEyk7yKKXs"vςzN~|Nu^{'Q䡋&`Yk$޾ϻԹ"i|ovzzSD,zEQ6fd[/A~IPop֚< ȯf@}4}>  ̕矕SQ]Tfv#=A~bl<)AƮ]UA}twjWr3WE^y[7UA h[oLĩQδ>+*dAO 9^uP*~FH\; q١yh`07o7ֽ<ǯ}ygIC4Yd~'{p:zRw8Ρ|fZnPo)Lם2o@(.P)VJH\KP)\ޱC@q{y<ٽdc(ffމ pO;6eyu7P5gˆCo}S1h(N+bx~Pk~!(6ծ?{D A}@lT4w+(:? hx_,#+'Ih$z@V52M9pNP1/bm(}Ok +bi(PM_P@cߦoPzk&\A?_>(CLJm2(Җ븟p>Rc(/C?ny Oy}-wM7e{[A{m (@I4(䧈g\ oERխI$͔ǖrËNrC%]-ޗPxŮ 0B0w bA}0Xrx.<~&%"/d_F^uxevHy?k3 Qxm6G`(D*v;?I\D 8vCsK[Q>04H3#}}|qb`(?{c6~퍣b0Υsp7`$*G?sv2ؔl F=T-s >٘?g'c߃OJ5Y^3+V@ R4)MCYyQ֙09cV9+tgGy;j+Gp,k߻Y4Y֋ձ/96}Yus@u`sl%ËY\?s4PeuIh5}fh^7j k6ֿηUj,vx jWo5A+etPxr;ږS1YY1x}LP3иD6/PpMU1asn yƚoH84nد5eP1L`rjBƱ-ٳc/WR@Mx Oj|̸W;'zm)t T'bn܊mXWpFT qiAMd$ߣPN~>3Qj;tu`> &?NX=쟎(#Wg 5B]ܿ~(os^(GpϿq_4^Ľ]@F"IE۾I}$L /&͇A;.LRjbf!I<+?wg\w1_ ] {-VyIL$d!nwX%[ CH 7AFN䌻wi}m*Q78tua|QAr9X{O!0\^ }JzU 3K#y[*f8-嬁%̣|?Y?X߽+qUOoB⹸?FkSs^"E?q"Մ|6G^yun GTڋˤJ_lPJ-Uٜw ljkUJ" sUYUP_WI ivډpyD/)R2>ileeM4|U޴ @#,*|NP@uG6ҏ'!T>^cnüס]UN{"f2/ʒbPhܹ:x*׸)v*ۭ*vtuw{P-#e7i;s 9Tb> 9O:*=&xC. PYB5=8Zqy;0P^?Ίrk{>^;.W*C5à}} _ H_ j0,@:6HQȝ Q*i/4=_B#rH3:B^2riƂ3zH ܧZߢ[xBFO31] ĘD Fɕv"/6l+ٵ@bsu_S=F mϔ#6}e7'ߣg1)o3q8 D {|AOw{8L@4Ied:9Y%:+h3RyU/.Y% m@̾.fWr~@b}G1 ˰N&[wx8 > "?| BT$!@bP_h (({@):iuv ɠ WzZğ3l<@xw=hQM76Vs1.Pdc yQ斟|;)) śĦ wu6Pplg9uw^Ɓp. [ c9P0 < eV:R,@xN`:f[m TrS x9}Nʕ@ᦨx+v Fb zX--kv1/cɲhUP 78D@aaK@轧6!OuKwؙ{_n̷VQ@(^ON}>/|~$On1LDI7b-tW77y>F[R}LX\Gnf{E!kxk/{ _mu76iLsB7Sa݇R_϶b&xw˿'0adOwD>m}J,Ӌ gqXGhz~8Hs~ē9Z?5W_ȳXW8ʇ$d;_]-s ?x?+m[O>L2ZF}m/qdocj@U{۸ '"oPy}F>VĖP˖Ќt'?R#@XTu7.O>s7t@`!ڽw?VN~ߠ|}Pa!~%}0+ժ1Peε/˔:FZӓ j:NO>p|7<je~.KE6Ź &XuZ-g<ۉx#2Z_rIMJeC>O#CS'v a_RA끌kjsO9p-}Ћy{Z!נo3Gė9w|ԢևJǚdΟw'<2jcn6V8bf,ro}tro49oǒ5@.0Sq2w1EFc?1 65 ﴸRJ&Gt\s< ;kr@vFt:?y @ݟm[8] &t :C f(*,~$g K%2m6-%S ʾ7;MR`w˻olWolj(0"c6~e LP=4YNwimDKR䇖~P=xfv !>'a_6;(cד@ P6~I];qFU2n*;?eb2Hw`?%T hM?kr$UU72qΰH?-Lj3H 7|\Mn$m6?ID˜_ H&*m;$O_(I;./IAm ӊߝ ^Vv$4L/WJnArZc Fm\QI' )%' $yØA*1 9>>9![mOp3t δ688.]5Gjpd' ߬|tA58w8z>ބ~68K_ 1O 87yjtgA&8>lWEb0?ъ/"/|$| uo/c?zs 3>YzGT $n 8x۩6}_JTC\eq. C'1߂$_8ص?Y4 u8+a6`!j 8`C!O߂q;f*?f TJLYAiepT`a䛦;bYAeVuAEڏTw[E!J>ݧr@ۻ6fd+.*Eԋ~?2|M l<*½Z@Q1 O3HmJi*(np'Td^i3#AđM4*%\H^_BNr?&T>UOkzJ|t(*(x*FtܥpPWrGؙ_x3[PjڜwyJ1"SVPcw m.Ճ=ek6&ePWkTM&[σJPyv(ݤzsֹ~.0{ a2PʺҍA=Gtf/ =F2'^QW~WXAz^cȋ5T\2հ= k'H;ɟ MX9߃{6sῬf~Q_%vœ4l,q۵Sp~F* V*(XWFHji.Yߗ 5O6͜I)RK[o!o6ny^ =<r_ERdA;?gayU(] ݶnb)tu|bJ@, [ CZ Rwle BU7_TAϼZgkϝTVM*Hy+7ZC839iK+ }JE:Pu;'XC ?OM"ϥibaD"^!)kv)'+W ̽8$o~qҼ!ʺ\pȩ*y7Y3ywY p.m36+IgCL-b a~ wϜ>{qW,(7Xr-O78ĬM/j6&TN|̢̊?lkDjr$b*_/(EMp=_ç95to` c h=uŐ3ïlu9x#MMue'αq^CГRp(lژG7տ߻׎ xG:sH:+@+H;V%s<#fX*{ gH>USA@3|\ξ@|E?yXh .H/ug@h; q3I$i{@h_n҆{@lJ_]bE'éߐ$˶b55᠋ R1 ś囁84oNkC5]dxU5Đ _AZ48(IfeMnBA@g7~uj@a?yj~QM?l&Ӷ@H+dojOp7(Aa/']IZP8N+(L;rY(Tf=B 7m@v ^0m,1߻XADn]O; rs/g³J%p8}e(mS_A>_l2YGI ?&gOʵrˠpi^8y1ˋʟuq <a*~S?OJfDy y0¯y&G?^H  ڷG =qW,W)+8nv E?1^Rp@Epu]F88r/ 3q?Q`jǑo̗=pvd$95@ɵQ=Hq! ; 5%64~A|H_Z'n=pw~YuJwU')`vY_w rKhyv=n`?!+׻y&٧}|ӊeaw kãbK_uOTR!$$H3f33ܲV-f *R6$RYʒ(Jd+,IEŚ%Re}?:}u\zLԿ[6iO@;j}/sn =lW>]jCrd 4)_B;"~;M_*+{ Z!,$m $w) !3»Yuu @8[x !&^USWB* b8ȫ e@]>[x[ l>q*-[Y> ا8Keb2? b{0)` Mf7^( /~ɷ<Jzrܛ@85^3pem RP_   {:ELvs/4Z"j̋?cyC[`^kj9>hT| U!$A`^-4G [vscq<ӱepWMIPY:k`65ᾛݘOCC x'Wpq%bf@OcM=w ڼ&И;?O<BۿHhBEĝoCށH@<+:=xp$~]= m 2gۙSrq@Hq wȜs3 +쉿C;ʇ^Ϙ@zגg#& PY| >]|xUY <{7-LbMt&&ќxv o<7I#%m. F/~M}m8D)-K ^˕3U<Y㸍vKA!Xϓ@rR Լs˅oN$oYݟk?U[xaBxooSrجd<~WF%syFp-W %M`p LzW pVjnjk/E5n2ps↼[d* y`~ȎhM$7uO^p:ZܧN\hk3 mwHq>x b7+5+/'־nkƏa2}w o8!≟pUwSCO' 9e)p][q?E{;~TNmi$tĨ>ϫuBu5>p|X ;ƻ=Ju.}krg:s|U@4v XLy|}r!tjN`о,E[N^ᫎ]tYcGp>1=ЃB."Ed3EfoT[۴ X@TB+Mh!S8ƨ aE@w:+H6sUOZ(ɥe*O;r;kaa}С o RfvN?ف@+RHZtaU[ݫ vHow-+b^k 9q?(^ExǰaķRTG<+W /nd7= > E>B:،l/{Li/po<{( ܸҨ{j{'X/9pVnwIժ_ׅ!zNJ")rJ}]{_u1Qow}[Fa<}}x썥}UYO0]V,܊M=ww%qvtrݒ8|['G-CZ'g|_WYֿ?pQ 79r`\w8c|8ZϺeү`^BJWkO%ⓠ@Vyq( /~9,v|*}^q>ֻ5KbvJ0.a{ bc@MNmPK7l5{@>;wP+G:)w9P~vE,&/׀O*Ay _?͂#/A}}O 3m^5>T ص'|+AmH&w;9<W;HuxjV:/%XڻG7IB\NvZeP_z5j}E満zN s~`;s[ɠ:hU0VpodA1;n3*3PxG.pڶGweMtBӁvAY]%\#NɌ="y\*c3MZWZ<mF~$dIHMAgNzf­3]^yVS_? WxV?{I1k+CI &_9sUf&W0mͿxcgm"kAt[^l >%K&j\gmiÓ禰Dc޲6s/_䗊'K}F:hy27Osܺr?{`Jt%-+f2̫~.m[Wѭ`}14X%&kUM:{\ X)uʎ3W#W5Dk=MQֵ#k5kC c[|ܴX;yЎ+֫ oҀnMt`\p9CI+}`|,c?~yjV`)"-,B[޻˅s= XOo֋]UYV{Ta|9ZߜPEQJa:aY]b6{xF0ku5[Ii!22:' b8c]/U;L5suou`x,OJ[J._*y}OlĢy=Vv/XFKzI\j_|* VY% @Z0d $m !i@mR r[[BsPbI޻|?. Ħ.YC@M l3L+Ʒas xGFg8s/@#e&{B~ԭ:K b~M;1($ (*a@ 3fWq@֜d Qn㏒8:XCb=zgFC@߀}@lsRRD.>-;*k i]M鳭@ҊP׍ 2SAe{/7# dmWY{`lԽ;TD^o܋QfQgظOy`ѕkqV푲ƛu[sykR"☏,_3UQH#F"=]r~%G&"yyFܸ(p')J-x1YsgBv ȏ]~ k {6!ϼx[`3NC^:Y_zgwXσ=$g̽5A|ipVB}'%ycUe<]\Q`)f$kJf !dX_rĝ`d=Ϟe|+Pqʌݒgo`1eIOI{>`=.qksBFGRu8/QxB[=֔EuHgqkwľ_yBv >'{6ZK2+0'5W!> TӄG+ك8 DbXo$0Ksl~F0W7Hd四Y:eId_(e@rP|&6$J;p dWGJ#b#>o2,ֿkyܞ?ahz8I;%.z¿ [WTs9`a@6 ;֝D8}u+}X8 }6Ԅ!!`a[,vf-XY4|әr`qj'>>(vyM,`qquBE9ϓso+X\qƎ`qW>;6}U:/X{7[񂏍w{1?'XXNb[n L;58џ6~¾\jsy_ۼPX:~.\0o?17SiX=ޒ7c(+XN:0WΏ, LSu'e9jZ2y0}<[7:g LS|302O s꫈Gpl[0Ҋ;)86R<0xM*ǀ5r.r?:3o~SJWR!ܡ\g`JfD/85OvOnd07~LSva~G ]{a_ C&Ƌ7ߺךbyk*9HqZVKlêN /`_z Xu{4ۋin[ {\6s y~1g~,L] >{^#cDRXë/o0ϡU8vFܵX-ӖV@c_m4R8uNq|fՙ~[[J95-Ub՗0#yU:19 RYjx %/x~F۽5`|;y5~SqMb2@QO{|Q /] ǟʏxJzVP؉$8x䊂VjޕQޮn2Ϡ5.> ËM %a*e:U>lhUN[ҟ@0-hΊ]io0nGf-\'0%Y~L1坊>'K]czyhť1ocPs=; nm-*bn}(:^xY k7hu%}5zGϽ?v:#IfϱZˆPΜGόu~2 ƁrJ1.g+nmeE2P9I\7E_"OPt3NR@l]EC/%4Pr i\yKq4aV}|'`uK@a֡?p5UX$qxUSZ]NZn_ FJ[z[j*c?/o*)1#>+h=7>8V:u Y} qY=͸~F NӬvw-n迟}o Z kŠJ$оv4\]qL hv7EwTS8ОF]ۋv:(@{]! Jڝo h|-jiWe(8~>ƧiżLVT9]PČϷ=~]nʨr,8ZtoR{/h_X*B.[0?&o@sCvCB5@3V7$ ; Pn yk#6bݗ Xǫ~@;lsK>5@;2(=68FVei}jwPZ @Nx}~ґ@W'd:{+m]ӘP6P߽*C|$#@bt'm\W kSN3m1үv|Ξ-/(%<<'o,栟{5V֟Jx}k?Hğ&$6!s 9:|VPή&^ы4OUZ&nxK(PRdע3OgpmnP4>wP[AZc$"h mzh.eQ@xeGż, _]'E}Sb8ù_;[hϗÅ/:n>U"sovuس@1{ {aN7껣hj @q~XrbV/ַo`!ѱQB+XRZ ,: ww(,Թ]Pk4 ٥ӨyJCQͦ)aTB&Zp Xl:0T~s3 [n7a~Ϟ [vUgOw)Y@ˠa5FL=: d Iܝ.?7^9 \[O!۴k. Z.+1ww7!cT W_<pi7e˴U֬ڢ5wkr4F ӼD}S ~A#i`>E_i9y`>h'e= T[GGSO|W0ZqV ?, x潻֚vknc;?V5ϢiVe Xmf/#13~owKvV})~ @b8?* \^q]z n5sv%A`6k|d ԡ"zte1|v33E0o7rc[D埂ë˻~L-?ຆ뼀-MWq7/ZS`޼Z͔Xs5V"M\j$4M!Fs`J+h'fdC v5KzfD E]<}, q:.+!@(q"gϻaxSX)E rGk0<_N2!ߓT 4_XL Kiϗ@ nifJ}N-hPם ݵ ijbۓbиE ؀A>4^}s5ߕtG!X՜c@yg! RGw5Uc_c}7c7=B!@s,.).zA; UΔzQV+  [RiX0;Р􂆄ۓW?nc&rS4ן%>~vW]'77_ꠢ( 4(bx}X9όEe@ .#>qt·l)> ]N▭Oo\ JMH]k<=݁XD?Ԡ Ȧ'@̸w]=_}I0}hiR yAC'f^hLE5|q 4jZs"_'qOT? uh& @ io|]oǀװY}%5@cWGJ/YM7FõQ*554>*>|$@N\ļWxl﹨p;Иsoح <01r 0TZ 淼~sy`W)uK/܍8.P=0Щ`?D)7u4qR'n ߶CQћX[U#]9e9x|W!0(}ӻvmĸռ/*B,;U\LxjwgU`Њ`=X˂=0yhcSaBF[r~_,͵['?.~Q8/‘ws\&dp=;Q( qm~K1ک* !^:λGlݚw ?8}Ce__[aEw{ DS_R2c ĝ|KTF _0]=hј4޳yaG74TU~/Q>N }N)L] w^R0 F68_4*Vq[TĽMS+Sg D-@\Z]qDв@^7"h,*u 4Jl =]>x[4K2<*?{lIS;HU_*hR@'A,H *' /~/m =5=\H{|sH< }Pgx w+@^zHa @,ڷGK6)0P'Z%Z$ڨ!ğGtѩX ϿL""_$6yDݵ/{֢sDcף)ӏ?Ҫ%*[y秪@젰-45Oc6zHnqpwسy? 8? 癥ѽϙ( ǣ>N]k)DYνN09pBEydI̖NEѧkEpo{J&)RZ|^/p(O_ugۀbs8g|ii7u ]G"4;g-< H.~KؕF=p8%)* L|897aIYpY0͸1/'߆ԀSxdah-p2vP.('yWdvpnm^<~Iׁs_Okf_'+/)\NŠߊXGhۺu}.q+wvb5m:^q1źZ̧n0 nT$at` xƒ4ۓ@zg gJ!(aM yX8RЀw4zp>mgz9jZyߖ{gn^9Te H_8=c Z$E~)pSG=<@`Ej5<^zf?!Yr;<1<c~@PxyLP IãAZ^] N{ +cY'ϯLVuqy@X_#Yeݥ#$M#\ 9bkvi ܊ 柦~.,?;)-5{8>BUɝ@^A*gwInm.tޯ[ί!@jQg΃34s՜1ũ`v%[K `9g?*v EW~`i|b%1'O2j2]Q[n?v^\`5(bC![ >{f)џ0_G7 {K^؟L}ٴ`uۆq~+]~#aȋأ1碁=1F2`tvYLά?V:+!w,|=pW${}hF2GI/[\!ǧk711n!`w8 Ji,>~< 2yߪm]+ήd`u//vQ[zWKe||ѽXn.~GE[.n%s5MjuY+XT'*ܷ-q]v7rP vgF@Đ05Q?2{ПIz 1(9 տSZ$OZuP%*9f-g PujR=43\:U#3n}[5Rq͏ϔ>MKP4ɳ6Д3P~r$ҵ|Txp+->t;b}NGkWo!A])`gbv ʪ|Ӏ(E(񳴸.0QcbN=P}W{}G$_[eN;.2 rn`gJk``H;w|G~cy< MikٻJp+}_$xljuº *T<{0ҿϿ\Ш:юWVLѭtl Dv{ 19QqtP8vsHy'So nDFE_bxq+qSquwr_$"A@SYzhGEwG.L͊2Dϴ>B#3I 4ˊkJ4~)=U#MEHR 4!៏#O@s[Ft]*̎^{B@[}*K hG J?@[:1XhvE۞r,6#vԥn~Վ̞3ڞÍؗϗMMl,$ǙVk,o!Фj>x6\xXݕ@<Ӽwh<;xMd5KH0T48 4[v.iQMԣ"Dɹ~1q\eYіK<8%){G}N[pc瓤p#of ;×w͡μ 0i;Qh6;-{9 qwp]"8r>T۹r Gp>O8 3 \.}Y4q uVP?,|/Y|=OQA|}rICf0);? kF߲[cGF݊+QNԢ^N{Hw(-]ݹ7yhM_)`:]CZѴ/"i:Uǽ1gw?,h|̹=˺D!0pBB yPBDʒ[-SRNc-ӶvRCPyHͿvC},kzwZfuEğg~/Iz;r̬,Z{F(/ F|B?Sek{HR :S@zpnwHYĎiE5+y~đ򣼜v)~\q\KM@ 27Q}|dm6B\T ~_b$my e-A=sȼ~2Z$-v/qi> Y8xy#6{eP)V6Fbui7Lx1!CXTM2[?a5׀d4KXE@~A@/"y_ȇW^ːLT}/?l%YFyK=C}3I@%w|EV^qJ(ձ)_ny 3@ wKwY+z}8ITrEK_2~m@<`󦽑@Nܸ,$l}No$m/Cc*Oc%֍>{%d|2x~^!]?ﴲu9ញNZ3K7p}mÃf~Żhl6z 3@v m.MW+`[gXo~'g:_ݫKD޿*%]`7285B| pF<Ʊ2" #x~˾f]{Sr4_0u8~ l[?18f > >}XƋ~~G!n>+߆q+u.q8"WYkd鈫qsj\ Œw Ƽ8Q۵SxKKtpJ[gky1.]-;NjO01̻p9' 埬Bj%0SdWc_Y.vM"MW^x4}% Q 6a mtQlrxNj@1({(Sgfeܖ۶|>zۡ(„#e|?4og{PLy !W"ur*  ( Csm,+?chfGךeo i@d5+oQ8/N#Rh*PV/_$b>BY8nk@N_tևOk EBrB> 5̟tsXrs'@Q]b(z/yj_"K}FоhsMZ򏁌\Н#Ssp|Mȓ UYJ@^4JB<6}PglPXu0'&lÐ P geǀZt(zU+.˿eyt_3ƛm-Gslĝ/GT>'kmQ1 '!.=7_W~b?rx 5Yq[iwSϱBTqIz _2rN!5;ÈCw}9shC~bw #qߦ.M$vz^tߍV '/ؽ/kE}Twcaԝ#[ #=Zz8Fdh!a8_[.rRwtѿ[_% /=|^hG:1̧18vrS%1nRّYJt7r.+[ V=>S1ߋPfۋy|Jvmd1@@)/@=p1 Q|O4Bm;/9BQNn+#V5HakuEҳzf;jq0eK*PhzQ@Mmi@dj ԗ.y@5WUTXq6}>ޤ5|nrl% '݁zM01^+J:+Z[2BM !U]]Flꉻb/WhN7J;=4Nui_jx04+>:&f{5l7@-<^S.'Qޡ)EO LY58 Dvz|荳8,?@wN)/W.5ݶz2W}z|PP2btHj.+@p@@( 8<ӥ,wj778س\)rVJ|p{?ʤi/Ue)3J+S;s?:}::8D{f:(#q8Ktβ_O*s}_ p3tcTcܿ5߁#J Mc{DG(tǁMb f[\s1)po^!ߔ V|ݎs.ˀ#̯ U!'?3 Y8> 3Ϻy1~HEpB}zrpg;0R.z+.f{}0J[aDډ|ٲR#߿Gzrz_c_6b-%@[#pQ}-BNm '|zKn1Oꬦ˜k$0}mVjO&1Q k}ۆ'?IumGx{a@px74y/@$q1ă%{׮XZ?PjO-@nVl*ښ6o1KYˀN|6ַ^#\j}@}3_j:軇q߈ P73D\`oŸNAO)e/.e|\w-j6[fbjqTՓ"[~W hK$K WjޛC +9NMX%l_cW7mYյ4 +<l -=ˑZk6Өy ~, EKKV_-s@km\|DwmE|>ޛ3~\rޓg3F[Kc&T}weо]{Z嫌5pڝWήe%bZE@<>ҷohu63@2^~m̝ޯk֥weƞ@kXay 3ǁִ/*YHZ~@[?*Pu~,p,g'ۀ 4eϧ袎[T nx)p>8 ږi*FkOx8_H;sV骦}?~:O?긺OeԩyYqTwfL 7S錍2NƶWӮbXΓ.]o6g崭x`.NgZ7ԓ7O]DƗFeCߴHs٩ķ88*׷|;kߤ } :X͕u#3-6ow 57}ӭyw\~*GT-Qso&\ʦ׹XR [ dY_Q~NzXݘrΆEt){s|.ӻ QW-{rO"(8>x$Пy 5%׀_uǺxo?=6vgk Hބ~)zb}$N{U _=DO_+$zڋ?y.뚉=)s@UuhIYC{kjq5n'ӊ|Sr> cWI-b +wePY?*|J8P2Wk %=ta٫@ ] BD& 'cC?N-yX4}Jٸ m 5N71?-᧼ $m̥߫Ty>LѦNKKN;^e$얉HE{Cm!ܠ'@0%S1 GƊ~cp#??W8pq_m}O=0WW^hJ-Wxy)'zn76oʣX>0l܂})0M Ob?ffoiMy@gf7osix*V.+zV|7L~C/>S ߄!o*?B>ͻj+(ꄲ&J4BP>yBu %܉c;JS~ \ 2 Vf^f4S)WNX>57;>]N!Yj^= V0{RoElrh^RlqZZw]K uPo|#=mTxḊɧ9͇0:>~0ŧ7co8xenRBzQo;zݨzΘu gu%}54>}ui->u.ՅH.Ag` y7=W>U/qTJx%˶ǀ"7I$[KMwQ6F}FfU.;"KQ/5?$n x a8&Ǯ)2kOZpuE 헐m@ۼOSޠ-?([H /`o:  ?}Oӳr8׻ An֥t5`ܱt2|i`Wml?A@{)@ U7:ό:vLԻ^[11cWtpMœX kï* wCmUֿ!R֋!`}]̞]WЙCw}SJ5` D$Y7/ "z3[m^`6 Zp)ޤ,K%% һy#E"z\ZܪR<5wXKU 7=@E+x`~yQ=on='s<0,suI@d` |DYP2.@ %_;Aqۧj |/č^Re`s׬^qw޻ ~I5xe#=Ʒ L[A`NT,6L2#Zv? M[gFl_f0JdaHYqI>KxӀrhC GZMqH19"7|%.|LkOH 9.GQqJ˽||푏 /og]Xkغv10>77#Ua5`d>(F]Ɗ_~3G,m֮٥ 4_3|좇0:i F}bk`|>x:KFhv9"k}j/{V: j7g'a>.`":n|C\ |R25/}P*HY>w 67-XwR 3L-H; nO#1 uFrѧUxBkpؓug,fڝ(*OY#q.g]7GG~${vYo 9z+/T_lBUT.-)Gsye+/}W3;㼰֑=GUOGz{B <[כ8*)})2/Ob*sJKw@XyAvDZ|A4o#A&ۭA ٕoO ;`>gpiyםzk,8M /=d%>?0^ƒsx;ӵj*q2)BT`%7pG`e-֙T,CqcnT23`]6YG*9 }Ur';XsǿY< x{^K`n`,M>?M a`|k mXe״0G-}G`] _KWr+<'X|;6r"g#2Yc_XV-se}X*.j4+M7Dl'+C.3rڨ8B+wX܋An.qe2O3>O}2XQcG s¾|5}ĪXǮXz/ r2E{xu )*-;y<)@^rG-yq@uKR])=49CWC/Sdxu-u#OmҖ=3>-_ Y/kQ׿|674S9yl=[-PٰCrn#:! O~_ݵ-(/ = G ۷>c|L4훒&*l6֫~݄?4*G&.8McN'Kiagt#tZtᕛs{y/g(߉ՒBGE58S*#o51 Mz{>rj(oS!?<ϓpzf7+$`9J.p̶}Nϻo>iQ?0 b#4Zs姮gω "l_yOtHWWfʳ~}rvϥjL8; P'78(k{- ɄJ۰`Żĭ( nCpЙ=ptJ{gNL|t|o@gRtt^Ǥ{Wϯ4{)SV <%\/.2G?ᾁG,Jm,:^H4h θS=ASˤ:iR3YŨK O'.6%?֕۾πC[O>Z˄=:]{Wf΋gF/~sqr;!tF |^uv".h-$E.\,m:=z>FEx9i9/ٲlKs1/1˟#guD,@V# WrF[ټ{#~ZnaG @h΍@+8d66z)_zbٲ/< hVgVͻ~ZwDd%yʯpuKMGEih8rd; з_~r-h,H𒟲O%e@_fm<^t y}Mn^c[c͡ˈu)W)g!\:7##~ \9H>tOFݾ+^+⦱q[5i/E1!^o>}'εF4]¤v @W\2&+V5G K>rQ_;E{5-G y#tnK!ɦ"]x!Y,q4gb <嶹ߠ92SWf%bkAWG8 t7n ]"џGe,jWѸS[ڥD_wX67]= yyأ%/T$ `6@+wGδ<XD%5=י^[ueN>sK1a߿wy@ C#?b`*֚nSR?#`QWLe+-;"~/"(_2 Q 7Ӛxw8oIo=[xƀyCJ3xz=g^0cӼy1l.3GN`~u?OO70_n? ̚O3^Y|Z|ƫOpϳ*U"Y0;y]xf^`sbD=&+`,OY4fHlvK? "9+#檾Y`8AC+ç(_٬߄G 3T5=x*Q } \''Ufpp^`7>[`7+c[Kffnj `O=ɝ`/~vJ>LW˖Tsʬׁ|B_!<[vwL&cL0Mo}S vϱU {g{D- wϕRS`JkIvo2`zQ'_az:`U:ۦU~(wn_ wZQp9aܟ*ѻF׏%Ybu^\%$u^myH|F1"ݼ 0Fv-em%9`JOpqkSϷAJ;t @־|yو;O}ĻNUg0.gJV_WE[nx[QtnH!վݗ֯ɰd\k+`b.͖Qk1%x"@YQ@o/Ss O3toB>=${p+@mcFu+('`m~lA<<@We;1+X9-vn⥫Xv>ɧ)]:ǀ[m/C!yyrh.넀MO hڰPS`ݍ6X_s ]'FKM5LfX8Y/_W{*x5.a4fZ2P)G;sm^oqFJ l뇃@{&V9rES/>x9 l՘/ݜ?lhKA['nϓnVpXMv #[% X}>;5~ˠ-+>6֋NoUXWLUYq?db[mAo׮h[GۄqKU6- t38\ 9y K!pRA]@=o sduhgʓI{i ZyIi·Re7]? +KY+y3jgL_889ǭGS@x8%{|,籹]#ԓ0^֦OԛŁEg6,8Q/|δ"_4j:`/~% ]WmSe3Kgp>V2p2Lb,]}ߍm0_dw $[=؉]ޢ[n|l܇~=ˣd< O.z][~nuN<1k]k-Vݤn5kZvYt"Z:~cko1n>0C+݋+xo^9iWN /= ~@]8L)b^{V`v9G 7\YYBX_RM;+q*@ytO|噺9,:BA̙շXS}{=>  8l9ȋ9q٘鰒ۯ#ug(`K\ 9h|{} + ?޿A0,=[q.Sg\ݍ.`WWA7Yb<)|,~za W/!O LumOk/ HosS GTHϜ4S,8mKNL OeGo-iQޢDLh[MQ'ݞ~ŖVIĝLKc j{vo%m@=ZJ ^hn@ݛvOx0h8tig{!eDž^۪M΍<|=sXmz3p\3.A s˟@ONJf4N(= z[M{-C͌MГξ&zbVL5@o.b%[cGATAOq'pV8ƩQ v=u5Ѡ][5Uqi<%;=AUa?x3Zgff=GpLFxSY'8!a|'dV.y d=Iˆi QW-k5.u vjڼw$OB?y+msAO\t73رP^J- ;_YÎgyml:pݣ֐g'ybc&hӌkS0~SyF fo~j}T?)0[ mb9{A;~9^'ЮKA\Y Bn~~ΝLlA_mkN _ E?Rv~Q?J0ό fyWWvoK{r .@Q' 7͡Xqu]jh:sԓk⾄rZ^^ϰK|vA9&9Ζ\"з *l8,.҆A/g>gZ{H 5$Y94qFoL{Գ>dKY+˱\ z jE;p|`st.tYmkWwA/f*z o}4 9}`$EgE@/LEu3s#M?cRR1O@oVW5{;ԑj磧{;o xJɧMS~ 6ۏM<kfvqO~^AлI-b֠P$C͈g\"?S?sq rfmk߸UX<ptBZD3o?`_پZ੣=P^[ah Rh pka#Af[݉:3EտԬA>$@LF '{OtDwo8n#ڦ;Цxwϻ#<2 u*?И9Z[Vr hp2C:)`yh24tAXiӱ{dB;2Ӷ;և˓T=z rm;0)ZFq+rh[sqV0ᨏhyЗ~Vz̳RZ'g? Zƽ%L@둡\ELV;# yV렚߽&Ъ%uFyU6.R5cb Z5e՟smQC?{k~O;V؇ 5yU9s h=Z#د 4:}25Z}"[`^:h)j~P:Fc@5"huOD֫VڭfhjyQaKtpLR=XQ_h)G']/v=xph,qK$r>mSjDk} ,[^Uk}k=s@shͩٛV-fEhU/UYBh#@{+e'Y2Y@߶j_o;$\\h+EW@~II;,fk6ԞpQ,i`tYGniHmؠT@!Cmx.1 +<>~T e0NI t7o2e1`^EZ0F~X<\@v~Кnڼ$2/+?L:r?mqx/7Nkpp`YG0Ic]m+(h ~ gwLo%ѐ%%i"=֟ړ ZG6He:&ywhJ~i֫<m>UWhgls h>Va@Њ?V Z9<@ ap݃88n.ZwJ&/Vifwʌǎ 3CM߻?>\6|6ZGVAj_h=&dc:6IAk|,4__?#_qmO l~ςK;ANڳOnn8ІƂh"VTsql1+^t)A)[;\վ߆*e?x0ho37YI}>мB}说l :ozn}d %׷I'S~~'JqC鋀@Wص26G@|~ofN@v.i/˔#>*jQ[qDġGO{c;R^8rn0.U&7La!:|Ҏ`S sOTzM^wj~oE2Q' 7-"rM<`|? m#hzf}EߨIϕGP|@뱚̟z>1+`>pQn>Er6 >5-}~|zw0/*񶵎W4s2;`6<ڼ Qfy?VR}cMB<ΪL> *Pl1/q?yZ+*l|A仾F  J\M)BMdNE?;E׍V!zQ8'O.[OMJ'( 4y_wgW2@SѕB:~vMbT5zae96ꁦT`H0f&˱+T^ٗ7 ;O&ՙ17 5> wڕ-N@o<鏺[u¶E.WG OW&ޟ&f<@oqW2߼r%лkRnzC[JY̤+hzћU|hrs1Y6a_MܛOmdpfv Om_.N7 &P؋3>" ޹%QE sn+2C0;+yo+?AW]ナ#Ư"ľͤk:~hgs'u`!g#˺+4Zn[UOz0hݫ~ jWep[:̐6+: oo-64 mFyB͑h_ɨpo]@kB[o>Vi^reKRͻ4+0ZށG @}mj\3@K3lmY*hPغ!Д}0@h{h&ZșrqD0w{[ qƉ-s`mw.}(OzC87M̝݅Eo\L[f5 F˳Ω`N| ;,% G`9`>S@fF\Q0ˑ)0B.0?^F\ybT;+'[KF?qǑ/~24zߝšOph8q zcIDh>qo>[;ǯi91FE8o߇NvYihF9Oߧ?qS+дYS4v)@mSާ|Ʃq5҃w3)kxO&Lc@Jl@+д\H" d-D̯VpGrޝM{ {5h^>ZTܖָ*Og 9|vZz#hMf͑KZ!OU\7䁚yɑ|>0fQp>^mWS0Kږhf}7Lm7gH5}"~JA%j|v /S%=.f+"$Z6Y6Zwvmw~XJ椒C>/ɦ;@񎵇,G[QϾ{$dquU uP{Q%hܟ1{z¨ͨ?@+XN1 ZYOµBe.!hUxL`=~n[qHD-%u 6}(,N?s}Z=dn}5=xu1ukᚵh<ފ2I+@k՞(jXaZj9tU.ޢZ^9ՊUzDh\sS̛,&˃V_{A~ hKhCf%P]z;6"U5\džt~ڨS׳=y#qMGk4͕PS]^T6E7Ou $wI-KK9k0f6g 4% j-Yxبg=,eڥvMl]SPwWj0kg{Γ~ h`WW;&qPho|s8/pr̊h>?Pw~εw?M:"}3/~҅]I9R+ThmZדo+4h, CTӸ_`KОFfcws1NGkگ 3l,̬U:隅`z)G2'>Ff؂a3i>13 5q`Z$}Uall0i/m&m60RIVeRD,2ܳK.q-qC 6fug2f^~g~K oJfRREr fAڇN C5'oΌ`,io)a04&A'u||ݙ>ٕ/2i+'sqD0Kǫ' $|%l3|SSk: lsGw=hT6܌RuL,x5fF ͈eklοcA={+yR<~ً0P4K|fS)@gj/O".yl(?ҘFCQ&xPmshAsWjhtEg~v[ 5W@^|46 _]K^Zq+̥$ xZ/ ɋEj~/?b~>(^] /xSɻ7׺ٟz:'%l=ЪM ;/Fnt@pn]IdX< lytv_tuv9ߏb] $B^b<6?"@;O@;hVbvKu9~xHcB@;0,}М=N.O"nKV@;b]CA<=sh^ӁfISG h2rų@ch%lt%)̮ +JvgMev~RC?"-T}3wT M'G?}&X/ĺL'aOlgYt{YkTdnqC@S`>*z 4הDĻJoRfb>ŝ@9aq89b<ke9q6ZhomT 1|R t^Y HN ((^kYZFN=ĺ,he3"{,}dmF:ik_DC23{VQF LtGٶVHw`d#f)B"Rf >]MΆǼDٞ;g)Bġ6ۈoƧ:ޝĸ9`6L>|J2K0 eSC>qT/= xԍ9eR); v֋zx*dj֪`O )ɦ%[+#Agz@ɘ@P9TmoGӟ?,LǼ`! 9$ѽ ^xgU5;zItNvYn9Pw>al@=7@}nmn&<<R2N/<2͙^u_אח]6s#hNip ['YcZ>g@0@3l.%.xw]V4b}_s9Uܡ-D7mh}7!o0?+ꊑ-^7Z̢NX= cNs--nhWarNC+4,ݷhXyr Ezn>x|* kWn|˦l_c_Q؋IIFl_r0^?p[8HrG=ɶ8o;Q<$iO,APc닏׬)CT0<>BQ>sXpwup!He{VNVW6.gM.}"N4C^vݺp `=~jS.5zTu}@I^jC :6Za=l7ÚjɾNA}͍?A7?!i=/9r 髕cjjDʱpw }VO5bD̃þgԂZ vscۋzP3ZV_F{@ͮ!jǚ$ mZKKݒ1j96olA-ZLWVp%<7y^t_{t@-QDb\*]cnӵl@-anCYP+9j|h:eʜajJ+LA-9>Ÿ%28~wҷ –k0~JefiPffP =@hzs_UVE %EA-p@ks:;}']4w Y2o~,~\C`wx_01_)-m/ϝoص]`tE!em:h@æCA㛽3,@:aR`pպ:h`&ssC:z4? V]V9 uYxkuLx؉0^ZFS~^8< G'/e50j);Y 3ŗޫVI*g6_n?ae=7PTp11ϓykN-q̸:pIu[4sbKԇ-xw;7~ Fu8^|6(8$j狡vtRIiy8\}{} KwGěWN}r;JRQm} >@~$*5{'z=uuy~yQ&PvK?,%E U:vȵD@n>2}\=qr P?+(Ŀ+_=JL?ğ9qD'ߴ_;0*?n#D/ ;t(\FGL?WնOQms`:8Ey~WF17 OSYJRttS Lg:;MԄ$۰7Џ¥7CEߟE?~Cs}Kpb]w~.(`1X׏w:JӯN_wrRlmyf̃[Ԯ yɎ?ZkF4@]yx} :7i|Pakbfӎ ˵-~t./58\Fr21k@9\\e W@u@CQP5s}/GPQ|ˉ玺k/\~ `PWΦ At]5MSC} @Q>-"N'̻L'|[1_'PuzuCߌN W0+q_4'?{5/PzHPt}Y (9g8ꧏd|KٰoO,ƍc@=@\M֕{RYRy9Z1_[#?#So} {G@LZamDg-+a/zl^lbAEKp vv/+bZ fX, Ģ&C@0pXcD4I 5;{EI0~Oê/*uiSMq pg0bp VVzħXPhU߲Kp_}kkˀ{4S 7;_CycMrb@|E<2h(b qvX:Z @|~oU$ [‚޽䘆X=8Nv}'vg Ĝ_b66GľebVXww^ Fmi*Y؟2I4􁊆āhkw#~}oe^}ǖ*|#mfo\ٷ:?yTz[=D|-?'*6M_`z._t0=.9W-3(`Pq3JLllۖI0uf혰@>f|/?:| y\]`z5S 5kϳ?@{jݰ (q#^z2[vҾ8/x& ̃D_ZZp=>Ul4/'?q-zuyxߝ'SWN 3 o۾"[wk`ge{h{u*|W_C~U|WaŮ_Un '1.LA3Ew忺(q"5"ف톙LP{(9 R@>)(-=@VtW>s Qg&|yajSe.9jS "6wE8 k9uU^fbPYg#~yGѸ_Rʲ(N黼
\n") ## id <- paste("\n
",dimnames(x)[[1]],"    ",sep="") #- id justification # id <- dimnames(x)[[1]] len <- nchar(id, type="chars") pad <- NULL; if(!all(max(len)==len)) { for(i in 1:length(id)) { pad <- c(pad, paste( rep(" ", max(len)-len[i]),collapse="" )) } } id <- paste("\n
",id,pad,"   ",sep="") if(colorscheme=="clustal") { # Clustal coloring al <- matrix( paste("",x,"",sep=""), nrow=nrow(x)) } else { #- Color by entropy score he <- entropy(x) score <- he$H.10.norm; score[ which(he$freq[c("-"),]>0.6) ] = 0 rn <- cbind( (score > 0.4), (score > 0.575), (score > 0.75), (score > 0.9) ) rn[ rn[,2], 1] = FALSE; rn[ rn[,3], 2] = FALSE; rn[ rn[,4], 3] = FALSE al=x b <- matrix( paste("",x,"",sep=""), nrow=nrow(x)) l <- matrix( paste("",x,"",sep=""), nrow=nrow(x)) m <- matrix( paste("",x,"",sep=""), nrow=nrow(x)) h <- matrix( paste("",x,"",sep=""), nrow=nrow(x)) al[ , which(rn[,1])] = b[ , which(rn[,1])] al[ , which(rn[,2])] = l[ , which(rn[,2])] al[ , which(rn[,3])] = m[ , which(rn[,3])] al[ , which(rn[,4])] = h[ , which(rn[,4])] } #- Dont color unconserved positions if(Entropy > 0) { if(colorscheme=="clustal") he <- entropy(x) execlude <- unique( c(which(he$H.10.norm < Entropy), which(he$freq[c("-"),]>0.6)) ) al[,execlude] = x[,execlude] } #- Dont color gaps ind<-which(x=="-",arr.ind=TRUE); al[ind]=x[ind] cat(head, body, file=file, append=append) for(i in 1:length(id)) cat( id[i], al[i,], sep="", file=file, append=TRUE) cat(paste("\n
\n", "
", caption ,"
\n", " \n\n"), file=file, append=TRUE) } bio3d/R/plot.rmsip.R0000644000176200001440000000072414046015221013703 0ustar liggesusers"plot.rmsip" <- function(x, xlab=NULL, ylab=NULL, col=gray(50:0/50), zlim=c(0,1), ...) { ##opar <- par(no.readonly = TRUE) ##on.exit(par(opar)) if(is.null(xlab)) xlab <- "a" if(is.null(ylab)) ylab <- "b" image(1:ncol(x$overlap), 1:nrow(x$overlap), x$overlap, col=col, zlim=zlim, xlab=xlab, ylab=ylab, ...) mtext(paste("RMSIP:", round(x$rmsip, 2)), side=3, line=0.5, at=0.5, adj=0, ...) } bio3d/R/write.fasta.R0000644000176200001440000000253714046015221014027 0ustar liggesusers"write.fasta" <- function(alignment=NULL, ids=NULL, seqs=alignment$ali, gap=TRUE, file, append = FALSE) { if (is.null(seqs)) stop("write.fasta: please provide a 'seqs' or 'alignment' input object") if (!is.null(alignment)) { if (is.null(alignment$id) | is.null(alignment$ali)) { stop("write.fasta: 'alignment' should be a list with '$id' and '$ali'components") } if (is.null(ids)) { ids=alignment$id } } else { if (is.null(ids)) { n.ids <- nrow(seqs) if(is.null(n.ids)) { n.ids=1 } ids=seq( 1, length=n.ids ) } } if(!gap) { seqs[is.gap(seqs)] <- "" } if (!append) { ##file.remove(file, showWarnings = FALSE) suppressWarnings( file.remove(file) ) } nseqs <- length(ids) if (nseqs == 1) { # change for shortening lines (<=60) - Xinqiu cat(">", ids, "\n", file = file, append = TRUE, sep = "") cat(seqs, file = file, append = TRUE, sep = "", fill = 60) # cat(">", ids, "\n", seqs, "\n", file = file, # append = TRUE, sep = "") } else { for (i in 1:nseqs) { cat(">", ids[i], "\n", file = file, append = TRUE, sep = "") cat(seqs[i,], file = file, append = TRUE, sep = "", fill = 60) # cat(">", ids[i], "\n", seqs[i,], # "\n", file = file, append = TRUE, sep = "") } } } bio3d/R/torsion.xyz.R0000644000176200001440000000231114046015221014114 0ustar liggesusers"torsion.xyz" <- function(xyz, atm.inc=4) { if(!is.vector(xyz) || !is.numeric(xyz)) stop("input 'xyz' should be a numeric vector") natm <- length(xyz)/3 if(natm < 4) stop("Need at least four atoms to define a dihedral") if(natm %% 1 != 0) stop("There should be three 'xyz' elements per atom") m.xyz <- matrix(xyz, nrow=3) atm.inds <- c(1:4); out<-NULL while(atm.inds[4] <= natm) { if( any(is.na( m.xyz[,atm.inds] )) ) { torp <- NA } else { d1 <- m.xyz[,atm.inds[2]] - m.xyz[,atm.inds[1]] d2 <- m.xyz[,atm.inds[3]] - m.xyz[,atm.inds[2]] d3 <- m.xyz[,atm.inds[4]] - m.xyz[,atm.inds[3]] u1 <- (d1[c(2,3,1)] * d2[c(3,1,2)]) - (d2[c(2,3,1)] * d1[c(3,1,2)]) u2 <- (d2[c(2,3,1)] * d3[c(3,1,2)]) - (d3[c(2,3,1)] * d2[c(3,1,2)]) ctor <- sum(u1*u2)/sqrt( sum(u1*u1) * sum(u2*u2) ) ctor[ctor > 1] <- 1; ctor[ctor < -1] <- -1 torp <- matrix(acos(ctor)*(180/pi),ncol=1) if( sum(u1 * ((u2[c(2,3,1)] * d2[c(3,1,2)]) - (u2[c(3,1,2)] * d2[c(2,3,1)]))) < 0) torp <- -torp } out <- c(out, torp) atm.inds <- atm.inds + atm.inc } if(atm.inc == 1 & natm > 4) out <- c(NA, out, NA, NA) return(out) } bio3d/R/pdbsplit.R0000644000176200001440000001354214046015221013417 0ustar liggesusers`pdbsplit` <- function(pdb.files, ids=NULL, path="split_chain", overwrite=TRUE, verbose=FALSE, mk4=FALSE, ncore=1, progress=NULL, ...) { toread <- file.exists(pdb.files) toread[substr(pdb.files, 1, 4) == "http"] <- TRUE if (all(!toread)) stop("No corresponding PDB files found") if (any(!toread)) { warning(paste("Missing files:\n\t", paste(pdb.files[!toread], collapse = "\n\t"), sep = "")) pdb.files <- pdb.files[toread] } ## Parallelized by parallel package ncore <- setup.ncore(ncore, bigmem = FALSE) if(ncore>1) { mylapply <- mclapply prev.warn <- getOption("warn") options(warn=1) } else mylapply <- lapply ## Faster method to fetch chain IDs in a PDB file "quickscan" <- function(pdbfile) { fi <- readLines(pdbfile) fi = fi[ grep("^ATOM", fi) ] chains <- unique(substr(fi, 22,22)) chains[chains == " "] <- NA return(chains) } if(!verbose) ## Initialize progress bar pb <- .init.pb(ncore, min=0, max=length(pdb.files)) if(!file.exists(path)) dir.create(path) "splitOnePdb" <- function(i, pdb.files, ids, path, overwrite, verbose, ...) { ## edit for shiny version if(!is.null(progress)) { progress$inc(1/length(pdb.files)) } ## edit end out <- c(); skipped <- c(); unused <- NULL; if(!overwrite && !verbose) { chains <- quickscan(pdb.files[i]) } else if(overwrite && !verbose) { invisible(capture.output( pdb <- read.pdb(pdb.files[i], verbose=verbose, ...) )) chains <- unique(pdb$atom[, "chain"]) } else { pdb <- read.pdb(pdb.files[i], verbose=verbose, ...) chains <- unique(pdb$atom[, "chain"]) } if(!is.null(ids)) { ids <- unique(ids) ## Match 'ids' with 'pdbId_chainId' combinations tmp.names <- paste0(basename.pdb(pdb.files[i], mk4=mk4), "_", chains) tmp.inds <- unique(unlist(lapply(ids, grep, tmp.names))) if(length(tmp.inds)==0) { ## Skip pdb file if no match were found unused <- basename.pdb(pdb.files[i], mk4=mk4) chains <- c() } else { chains <- chains[tmp.inds] } } if(!overwrite && !verbose) { tmp.names <- paste0(basename.pdb(pdb.files[i], mk4=mk4),"_", chains, ".pdb") new.name <- file.path(path, tmp.names) if(all(file.exists(new.name))) { out <- c(out, new.name) skipped <- paste(basename(pdb.files[i]), " (", paste(chains, collapse=","), ")", sep="") return( list(out=out, unused=unused, skipped=skipped) ) } else { if(!verbose) invisible(capture.output( pdb <- read.pdb(pdb.files[i], verbose=verbose, ...) )) else pdb <- read.pdb(pdb.files[i], verbose=verbose, ...) } } if (length(chains) > 0) { for (j in 1:length(chains)) { if(!verbose) .update.pb(pb, step=1/length(chains)) ##if (!is.na(chains[j])) { new.pdb <- NULL sel <- atom.select(pdb, chain=chains[j], verbose=verbose) #==== new.pdb <- trim.pdb(pdb, sel, sse=TRUE) ## Multi-model records if (nrow(pdb$xyz)>1) { for ( k in 1:nrow(pdb$xyz) ) { str.len <- nchar(nrow(pdb$xyz)) new.name <- paste(basename.pdb(pdb.files[i], mk4=mk4), "_", chains[j], ".", formatC(k, width=str.len, format="d", flag="0"), ".pdb", sep = "") new.name <- file.path(path, new.name) xyz <- pdb$xyz[k, sel$xyz] if(length(new.pdb$xyz) > 0) { write.pdb(new.pdb, file = new.name, xyz=xyz, sse=TRUE) out <- c(out, new.name) } else { warning(paste0(basename(new.name), " has 'xyz' of length zero")) } } } else { new.name <- paste0(basename.pdb(pdb.files[i], mk4=mk4), "_", chains[j], ".pdb") new.name <- file.path(path, new.name) if(length(new.pdb$xyz) > 0) { if(!file.exists(new.name) | overwrite ) write.pdb(new.pdb, file = new.name, sse=TRUE) out <- c(out, new.name) } else { warning(paste0(basename(new.name), " has 'xyz' of length zero")) } } ##} } } else { if(!verbose) .update.pb(pb, step=1) } gc() return( list(out=out, unused=unused, skipped=skipped) ) } outdata <- mylapply(1:length(pdb.files), splitOnePdb, pdb.files, ids, path, overwrite, verbose, ...) if(ncore>1) options(warn=prev.warn) ##### Collect data ##### outfiles <- c() unused <- c(); skipped <- c(); for(i in 1:length(outdata)) { tmp.out <- outdata[[i]] outfiles <- c(outfiles, tmp.out$out) unused <- c(unused, tmp.out$unused) skipped <- c(skipped, tmp.out$skipped) } if(!verbose) { .update.pb(pb) .close.pb(pb) } if(!is.null(ids)) { ids.used <- NULL; nonmatch <- NULL if(length(outfiles)>0) { ids.used <- sub(".pdb$", "", basename(outfiles)) tmp.fun <- function(x, y) { ifelse(length(grep(x,y))>0, TRUE, FALSE) } tmp.inds <- unlist(lapply(ids, tmp.fun, ids.used)) nonmatch <- ids[!tmp.inds] } ## Elements of 'pdb.files' not in use if(length(unused)>0) { unused <- paste(unused, collapse=", ") warning(paste("unmatched pdb files:", unused)) } ## Elements of 'ids' not in use if(length(nonmatch)>0) { nonmatch <- paste(nonmatch, collapse=", ") warning(paste("unmatched ids:", nonmatch)) } } if(length(skipped)>0) { warning(paste(skipped, collapse=", ")) } return(outfiles) } bio3d/R/read.crd.R0000644000176200001440000000053714046015221013260 0ustar liggesusers"read.crd" <- function(file, ...) { ## from tools package: pos <- regexpr("\\.([[:alnum:]]+)$", file) ext <- ifelse(pos > -1L, substring(file, pos + 1L), "") if(ext %in% c("crd")) { class(file)=c("character", "charmm") } if(ext %in% c("inpcrd", "rst")) { class(file)=c("character", "amber") } UseMethod("read.crd", file) } bio3d/R/bounds.sse.R0000644000176200001440000000640614046015221013662 0ustar liggesusers#' Obtain A SSE Object From An SSE Sequence Vector #' #' Inverse process of the funciton \code{\link{pdb2sse}}. #' #' @details call for its effects. #' #' @param x a character vector indicating SSE for each amino acid residue. #' @param pdb an object of class \code{pdb} as obtained from #' function \code{\link{read.pdb}}. Can be ignored if \code{x} has 'names' #' attribute for residue labels. #' #' @return a 'sse' object. #' #' @note In both \code{$helix} and \code{$sheet}, an additional #' \code{$id} component is added to indicate the original numbering of the sse. #' This is particularly useful in e.g. \code{trim.pdb()} function. #' #' @seealso \code{\link{pdb2sse}} #' #' @author Xin-Qiu Yao & Barry Grant #' #' @examples #' \donttest{ #' # PDB server connection required - testing excluded #' #' pdb <- read.pdb("1a7l") #' sse <- pdb2sse(pdb) #' sse.ind <- bounds.sse(sse) #' sse.ind #' } bounds.sse <- function(x, pdb=NULL) { if(length(x) == 0) return (NULL) strings <- names(x) if(is.null(strings)) { if(!is.null(pdb)) { strings <- paste(pdb$atom[pdb$calpha, "resno"], pdb$atom[pdb$calpha, "chain"], pdb$atom[pdb$calpha, "insert"], sep = "_") if(length(strings) != length(x)) stop("pdb doesn't match x") } else { strings <- paste(seq_along(x), NA, NA, sep="_") } } else { if(!is.null(pdb)) { warning("The x has 'names' attributes. The pdb is ignored") } } lstrings <- strsplit(strings, split="_") resno <- as.numeric(sapply(lstrings, "[", 1)) chain <- sapply(lstrings, "[", 2) chain[chain == "NA"] <- "" insert <- sapply(lstrings, "[", 3) insert[insert == "NA"] <- "" id <- as.numeric(sapply(lstrings, "[", 4)) sse.string <- paste(x, chain, id, sep="_") # bounds doesn't work, use rle2 instead rl <- rle2(sse.string) inds <- cbind(seq_along(rl$inds), start = c(1, rl$inds[-length(rl$inds)]+1), end = rl$inds, length = rl$lengths ) # inds <- bounds(sse.string, dup.inds=TRUE, pre.sort=FALSE) # sort segments based on sse id (i.e. keep the original order of sse) ind.order <- order(id[inds[, "start"]]) inds <- inds[ind.order, , drop = FALSE] # helix h.inds <- which(x[inds[, "start"]] %in% c("H", "G")) if(length(h.inds) > 0) { h.id <- id[inds[h.inds, "start"]] if(any(is.na(h.id))) h.id <- seq_along(h.id) h <- list(start = resno[inds[h.inds, "start"]], end = resno[inds[h.inds, "end"]], chain = chain[inds[h.inds, "start"]], id = h.id) names(h$start) <- insert[inds[h.inds, "start"]] names(h$end) <- insert[inds[h.inds, "end"]] } else { h <- list(start=NULL, end=NULL, chain=NULL, id=NULL) } # sheet e.inds <- which(x[inds[, "start"]] == "E") if(length(e.inds) > 0) { e.id <- id[inds[e.inds, "start"]] if(any(is.na(e.id))) e.id <- seq_along(e.id) e <- list(start = resno[inds[e.inds, "start"]], end = resno[inds[e.inds, "end"]], chain = chain[inds[e.inds, "start"]], id = e.id) names(e$start) <- insert[inds[e.inds, "start"]] names(e$end) <- insert[inds[e.inds, "end"]] } else { e <- list(start=NULL, end=NULL, chain=NULL, id=NULL) } sse <- list(helix = h, sheet = e) class(sse) <- 'sse' return( sse ) } bio3d/R/trim.pdb.R0000644000176200001440000000476114046015221013320 0ustar liggesuserstrim <- function(...) UseMethod("trim") "trim.pdb" <- function(pdb, ..., inds=NULL, sse=TRUE) { if(!is.pdb(pdb)) stop("input 'pdb' must be a PDB list object as returned from 'read.pdb'") cl <- match.call() extra.args <- list(...) if(length(extra.args)>0) { if(!is.null(inds)) warning("Multiple atom selection terms provided. Using only argument 'inds'") else if(is.select(extra.args[[1]])) # to be back-compatible with the habit calling trim.pdb(pdb, inds) inds = extra.args[[1]] else inds = atom.select(pdb, ...) } if(is.null(inds)) stop("no selection indices provided") if(!is.list(inds)) stop("selection indices must be provided i.e. from 'atom.select'") if(is.null(inds$atom) || is.null(inds$xyz)) stop("selection indices must be provided i.e. from 'atom.select'") ## Trim atom components atom <- pdb$atom[inds$atom,] ## Add calpha indices if non-existing if(is.null(pdb$calpha)) { ca.inds <- atom.select(pdb, "calpha") pdb$calpha <- rep(FALSE, nrow(pdb$atom)) pdb$calpha[ca.inds$atom] <- TRUE } ## Trim calpha indices calpha <- pdb$calpha[inds$atom] ## Trim xyz components xyz <- trim.xyz(pdb$xyz, col.inds = inds$xyz) ## Trim SSE components helix <- NULL; sheet <- NULL; if(sse) { ss <- pdb2sse(pdb, verbose = FALSE) ##- Trim sse vector calpha2 <- which(pdb$calpha) %in% inds$atom ss <- ss[calpha2] ##- New sse new.sse <- bounds.sse(ss) helix <- new.sse$helix if(length(helix$start) > 0) { ##- add back other components add <- pdb$helix[!names(pdb$helix) %in% names(new.sse$helix)] ##- match sse number in case some sse are completely removed add <- lapply(add, function(x) x[new.sse$helix$id]) helix <- c(helix, add) } sheet <- new.sse$sheet if(length(sheet$start) > 0) { ##- add back other components add <- pdb$sheet[!names(pdb$sheet) %in% names(new.sse$sheet)] ##- match sse number in case some sse are completely removed add <- lapply(add, function(x) x[new.sse$sheet$id]) sheet <- c(sheet, add) } ##- remove 'id'; Maybe we don't need it? helix$id <- NULL sheet$id <- NULL } output <- list(atom = atom, helix = helix, sheet = sheet, seqres = pdb$seqres, ## return unmodified xyz = xyz, calpha = calpha, call = cl) class(output) <- class(pdb) return(output) } bio3d/R/print.pdb.R0000644000176200001440000000022114046015221013464 0ustar liggesusersprint.pdb <- function(x, printseq=TRUE, ...) { ## Print a summary of basic PDB object features y <- summary.pdb(x, printseq=printseq, ...) } bio3d/R/consensus.R0000644000176200001440000000213214046015221013607 0ustar liggesusers"consensus" <- function(alignment, cutoff=0.6) { # Determine the consensus sequence for a given alignment if(is.list(alignment)) alignment=alignment$ali aa <- c("V","I","L","M", "F","W","Y", "S","T", "N","Q", "H","K","R", "D","E", "A","G", "P","C", "-","X") composition <- table(alignment) unk <- composition[!names( composition ) %in% aa] if(length(unk) > 0) { warning(paste("\nnon standard residue code:",names(unk),"maped to X")) for(i in 1:length(unk)) alignment[alignment==names(unk[i])]="X" } len <- ncol(alignment) freq <- matrix(0, nrow = 22, ncol = ncol(alignment), dimnames = list(aa,seq(1:len))) for (i in 1:len) { freq[names(summary((as.factor(toupper(alignment[,i]))))), i] <- (summary(as.factor(toupper(alignment[,i])))/length(alignment[,i])) } cons.freq <- apply(freq[1:20,], 2, max) cons.tmp <- aa[apply(freq[1:20,], 2, which.max)] cons.tmp[cons.freq <= cutoff] = "-" return(list(seq=cons.tmp, freq=freq, seq.freq=cons.freq, cutoff=cutoff)) } bio3d/R/plot.dccm.R0000644000176200001440000001514314046015221013460 0ustar liggesusersplot.dccm <-function(x, resno=NULL, sse=NULL, colorkey=TRUE, at=c(-1, -0.75, -0.5, -0.25, 0.25, 0.5, 0.75, 1), main="Residue Cross Correlation", # pad=0.022 helix.col = "gray20", sheet.col = "gray80", inner.box=TRUE, outer.box=FALSE, xlab="Residue No.", ylab="Residue No.", margin.segments=NULL, segment.col=vmd_colors(), segment.min=1, ...) { requireNamespace("lattice", quietly = TRUE) colnames(x) = NULL; rownames(x)=NULL ##-- Customized axis tick labels if(!is.null(resno)) { if(is.pdb(resno)) { ## Take Calpha residue numbers from PDB input ca.inds <- atom.select(resno, "calpha", verbose = FALSE) resno <- resno$atom$resno[ca.inds$atom] } if(length(resno) != nrow(x)) { warning("Length of input 'resno' does not equal the length of input 'x'; Ignoring 'resno'") resno=NULL } } scales <- NULL dots <- list(...) if('scales' %in% names(dots)) { scales <- dots$scales } if(!"at" %in% names(scales)) { xy.at <- pretty(1:ncol(x)) xy.at <- xy.at[xy.at <= ncol(x)] xy.at[1] <- 1 if(is.null(resno)) { scales$at <- xy.at scales$labels <- xy.at } else { labs <- resno[xy.at] labs[is.na(labs)] <- "" scales$at <- xy.at scales$labels <- labs } } dots$scales <- scales draw.segment <- function(start, length, xymin, xymax, fill.col="gray", side=1) { ##-- Draw Annotation On Plot Margins, used for SSE and CLUSTER members ## draw.segment(store.grps[,"start"], store.grps[,"length"], ## xymin=xymin, xymax=xymax, side=1, fill.col="red") if(side==1) { ## Bottom Margin grid.rect(x=unit(start-0.5, "native"), y=0, gp = gpar(fill=fill.col, col=NA), just=c("left","bottom"), width=unit(length-0.5, "native"), height=xymin, vp=vpPath("plot_01.toplevel.vp","plot_01.panel.1.1.vp")) } if(side==2) { ## Left Margin grid.rect(x=0, y=unit(start-0.5, "native"), gp = gpar(fill=fill.col, col=NA), just=c("left","bottom"), width=xymin, height=unit(length-0.5, "native"), vp=vpPath("plot_01.toplevel.vp","plot_01.panel.1.1.vp")) } if(side==3) { ## Top Margin grid.rect(x=unit(start-0.5, "native"), y=xymax, gp = gpar(fill=fill.col,col=NA), just=c("left","bottom"), width=unit(length-0.5, "native"), height=unit(1, "npc"), vp=vpPath("plot_01.toplevel.vp","plot_01.panel.1.1.vp")) } if(side==4) { ## Right Margin grid.rect(x=xymax, y=unit(start-0.5, "native"), gp = gpar(fill=fill.col,col=NA), just=c("left","bottom"), width=unit(1, "npc"), height=unit(length-0.5, "native"), vp=vpPath("plot_01.toplevel.vp","plot_01.panel.1.1.vp")) } } ##-- Main Plot p1 <- do.call(lattice::contourplot, c(list(x, region = TRUE, labels=FALSE, col="gray40", at=at, xlab=xlab, ylab=ylab, colorkey=colorkey, main=main), dots)) ##-- Check sse if(is.pdb(sse)) { sse <- pdb2sse(sse) sse <- bounds.sse(unname(sse)) } if(length(sse$helix$start)==0 && length(sse$sheet$start)==0) sse <- NULL xymin=0; xymax=1 if (is.null(sse) && is.null(margin.segments)) { print(p1) } else { xlim <- p1$x.limits ylim <- p1$y.limits uni <- 1/(max(xlim)-min(xlim)) pad=0.02 ## This should be setable! padref <- pad/uni if(!is.null(sse)) { ##-- Adjust Top and Right margins for 'sse' xymax <- 1-(pad) p1$x.limits[2]=xlim[2]+padref p1$y.limits[2]=ylim[2]+padref } if(!is.null(margin.segments)) { ##-- Adjust Bottom and Left margins for 'segments' xymin = pad p1$x.limits[1]=xlim[1]-padref p1$y.limits[1]=ylim[1]-padref ##- Format margin annotation object grps <- table(margin.segments) ## Exclude small grps less than 'segment.min' grps = names( grps[grps > segment.min] ) store.grps <- NULL; for(i in 1:length(grps)) { store.grps <- rbind(store.grps, cbind( bounds(which(margin.segments == grps[i])), "grp"=as.numeric(grps[i])) ) } ## Margin segment colors if(is.null(segment.col)) { segment.col <- (store.grps[,"grp"]) } else { segment.col <- segment.col[(store.grps[,"grp"])] } } print(p1) if(!is.null(sse)) { ##-- SSE annotation if(length(sse$helix$start) > 0) { ## dont have a pdb$helix$length if( is.null(sse$helix$length) ) { sse$helix$length <- (sse$helix$end+1)-sse$helix$start } ## TOP draw.segment(sse$helix$start, sse$helix$length, xymin=xymin, xymax=xymax, fill.col=helix.col, side=3) ## RIGHT draw.segment(sse$helix$start, sse$helix$length, xymin=xymin, xymax=xymax, fill.col=helix.col, side=4) } if(length(sse$sheet$start) > 0) { if( is.null(sse$sheet$length) ) { sse$sheet$length <- (sse$sheet$end+1)-sse$sheet$start } ## TOP draw.segment(sse$sheet$start, sse$sheet$length, xymin=xymin, xymax=xymax, fill.col=sheet.col, side=3) ## RIGHT draw.segment(sse$sheet$start, sse$sheet$length, xymin=xymin, xymax=xymax, fill.col=sheet.col, side=4) } } if(!is.null(margin.segments)) { ##-- Cluster annotation ## BOTTOM draw.segment(store.grps[,"start"], store.grps[,"length"], xymin=xymin, xymax=xymax, fill.col=segment.col, side=1) ## LEFT draw.segment(store.grps[,"start"], store.grps[,"length"], xymin=xymin, xymax=xymax, fill.col=segment.col, side=2) } if(!outer.box) { grid.rect(x=0, y=0, gp = gpar(fill=NA,col="white"), just=c("left","bottom"), width=1,height=1, vp=vpPath("plot_01.toplevel.vp","plot_01.panel.1.1.vp")) } if(inner.box) { grid.rect(x=xymin, y=xymin, gp = gpar(fill=NA,col="black"), just=c("left","bottom"), width=xymax, height=xymax, vp=vpPath("plot_01.toplevel.vp","plot_01.panel.1.1.vp")) } } } bio3d/R/read.crd.amber.R0000644000176200001440000000126414046015221014343 0ustar liggesusers read.crd.amber <- function(file, ...) { cl <- match.call() if(missing(file)) { stop("read.pdb: please specify a PDB 'file' for reading") } ##- Check if file exists locally or on-line if(!file.exists(file)) { stop("No input PDB file found: check filename") } ## parse CRD file with cpp function crd <- .read_crd(file) if(!is.null(crd$error)) stop(paste("Could not read", file)) else class(crd) <- c("amber", "crd") if(is.na(crd$time)) crd$time <- NULL if(!length(crd$velocities)>0) crd$velocities <- NULL if(!length(crd$box)>0) crd$box <- NULL crd$xyz <- as.xyz(crd$xyz) crd$call <- cl ## finished return(crd) } bio3d/R/stride.R0000644000176200001440000001312014046015221013060 0ustar liggesusers"stride" <- function(pdb, exefile = "stride", resno=TRUE) { ## Log the call cl <- match.call() infile <- tempfile() outfile <- tempfile() write.pdb(pdb, file=infile) os1 <- .Platform$OS.type if(os1 == "windows") { shell( paste(exefile," -f",outfile," ",infile,sep="") ) } else { system( paste(exefile," -f",outfile," ",infile,sep="") ) } raw.lines <- readLines(outfile) type <- substring(raw.lines, 1, 3) unlink(c(infile, outfile)) raw.loc <- raw.lines[type == "LOC"] raw.tor <- raw.lines[type == "ASG"] phi <- as.numeric(substring(raw.tor, 43,49)) psi <- as.numeric(substring(raw.tor, 53,59)) # DEBUG: SSE length is inconsistent with the sequence length; # Read ASG instead of LOC lines sse <- substring(raw.tor, 25,25) cha <- substring(raw.tor, 10,10) acc <- as.numeric(substring(raw.tor, 65, 69)) res.num <- suppressWarnings(as.numeric(substring(raw.tor, 12, 15))) if(any(is.na(res.num))) { ins <- which(is.na(res.num)) res.num[ins] <- as.numeric(substring(raw.tor, 11, 14))[ins] if(resno) { warning("Insertions are found in PDB: Residue numbers may be incorrect. Try again with resno=FALSE") } else { ii <- diff(res.num) ii[ii==0] <- 1 #Consecutive numbers at insertion residues ii[ii<0] <- 2 #Jumps at possible chain termination res.num <- res.num[1] + c(0, cumsum(ii)) } } # res.ind <- 1:length(res.num) # res.name <- substring(raw.tor, 6, 8) h.res <- bounds(res.num[which(sse == "H")], pre.sort=FALSE) g.res <- bounds(res.num[which(sse == "G")], pre.sort=FALSE) e.res <- bounds(res.num[which(sse == "E")], pre.sort=FALSE) t.res <- bounds(res.num[which(sse == "T")], pre.sort=FALSE) ## sseInfo <- cbind(resIndex=res.ind, resNumber=res.num, ## resName=res.name, sse=sse) # start <- as.numeric(substring(raw.loc, 23,27)) # end <- as.numeric(substring(raw.loc, 42,45)) # chain <- substring(raw.loc, 29,29) # # sse <- substring(raw.loc, 6,9) # # h.ind <- sse == "Alph" # g.ind <- sse == "310H" # e.ind <- sse == "Stra" # t.ind <- sse == "Turn" # # sse.type <- sse # sse.type[h.ind] <- "H" # sse.type[g.ind] <- "G" # sse.type[e.ind] <- "E" # sse.type[t.ind] <- "T" h.ind <- h.res; g.ind <- g.res e.ind <- e.res; t.ind <- t.res if(length(h.res) > 0) { res.ind <- which(sse == "H") h.ind[, "end"] <- res.ind[cumsum(h.res[, "length"])] h.ind[, "start"] <- h.ind[, "end"] - h.res[, "length"] + 1 } if(length(g.res) > 0) { res.ind <- which(sse == "G") g.ind[, "end"] <- res.ind[cumsum(g.res[, "length"])] g.ind[, "start"] <- g.ind[, "end"] - g.res[, "length"] + 1 } if(length(e.res) > 0) { res.ind <- which(sse == "E") e.ind[, "end"] <- res.ind[cumsum(e.res[, "length"])] e.ind[, "start"] <- e.ind[, "end"] - e.res[, "length"] + 1 } if(length(t.res) > 0) { res.ind <- which(sse == "T") t.ind[, "end"] <- res.ind[cumsum(t.res[, "length"])] t.ind[, "start"] <- t.ind[, "end"] - t.res[, "length"] + 1 } if(!resno) { h.res <- h.ind; g.res <- g.ind e.res <- e.ind; t.res <- t.ind } sheet = list(start=NULL, end=NULL, length=NULL, chain=NULL) helix = list(start=NULL, end=NULL, length=NULL, chain=NULL, type=NULL) turn = sheet if(length(h.res)>1) { helix$start = c(helix$start,h.res[, "start"]) helix$end = c(helix$end, h.res[, "end"]) helix$length = c(helix$length, h.res[, "length"]) helix$chain = c(helix$chain, cha[h.ind[, "start"]]) helix$type = c(helix$type, sse[h.ind[, "start"]]) } if(length(g.res)>1) { helix$start = c(helix$start,g.res[, "start"]) helix$end = c(helix$end, g.res[, "end"]) helix$length = c(helix$length, g.res[, "length"]) helix$chain = c(helix$chain, cha[g.ind[, "start"]]) helix$type = c(helix$type, sse[g.ind[, "start"]]) } if(length(helix$start) > 0) helix <- lapply(helix, function(x) {names(x) <- 1:length(helix$start); return(x)}) if(length(e.res)>1) { sheet$start = c(sheet$start,e.res[, "start"]) sheet$end = c(sheet$end, e.res[, "end"]) sheet$length = c(sheet$length, e.res[, "length"]) sheet$chain = c(sheet$chain, cha[e.ind[, "start"]]) } if(length(sheet$start) > 0) sheet <- lapply(sheet, function(x) {names(x) <- 1:length(sheet$start); return(x)}) if(length(t.res)>1) { turn$start = c(turn$start,t.res[, "start"]) turn$end = c(turn$end, t.res[, "end"]) turn$length = c(turn$length, t.res[, "length"]) turn$chain = c(turn$chain, cha[t.ind[, "start"]]) } if(length(turn$start) > 0) turn <- lapply(turn, function(x) {names(x) <- 1:length(turn$start); return(x)}) # if(any(h.ind | g.ind)) { # helix=list(start = c(start[h.ind], start[g.ind]), # end = c(end[h.ind], end[g.ind]), # length = ( c(end[h.ind], end[g.ind]) - # c(start[h.ind], start[g.ind]) + 1), # chain = c(chain[h.ind], chain[g.ind]), # type = c(sse.type[h.ind], sse.type[g.ind])) # } # if(any(e.ind)) { # sheet = list(start = start[e.ind], # end = end[e.ind], # length = (end[e.ind] - start[e.ind] + 1), # chain = chain[e.ind]) # } # if(any(t.ind)) { # turn = list(start = start[t.ind], # end = end[t.ind], # length =(end[t.ind] - start[t.ind] + 1), # chain = chain[t.ind]) # } out <- list(helix = helix, sheet=sheet, hbonds=NULL, turn=turn, phi=phi, psi=psi, acc=acc, sse=sse, call=cl) class(out) <- "sse" return(out) } bio3d/R/angle.xyz.R0000644000176200001440000000145714046015221013517 0ustar liggesusers"angle.xyz" <- function(xyz, atm.inc=3) { if(!is.vector(xyz) || !is.numeric(xyz)) stop("input 'xyz' should be a numeric vector") natm <- length(xyz)/3 if(natm < 3) stop("Need at least three atoms to define an angle") if(natm %% 1 != 0) stop("There should be three 'xyz' elements per atom") m.xyz <- matrix(xyz, nrow=3) atm.inds <- c(1:3); out <- NULL while(atm.inds[3] <= natm) { if( any(is.na( m.xyz[,atm.inds] )) ) { ang <- NA } else { d1 <- m.xyz[,atm.inds[1]] - m.xyz[,atm.inds[2]] d2 <- m.xyz[,atm.inds[3]] - m.xyz[,atm.inds[2]] ang <- sum(d1*d2) / (sqrt(sum(d1^2)) * sqrt(sum(d2^2)) ) ang[ang > 1] <- 1; ang[ang < -1] <- -1 ang <- acos(ang) * (180/pi) } out <- c(out, ang) atm.inds <- atm.inds + atm.inc } return(out) } bio3d/R/plot.dmat.R0000644000176200001440000000376514046015221013506 0ustar liggesusers"plot.dmat" <- function(x, key = TRUE, resnum.1 = c(1:ncol(x)), resnum.2 = resnum.1, axis.tick.space = 20, zlim = range(x, finite = TRUE), nlevels = 20, levels = pretty(zlim, nlevels), color.palette = bwr.colors, col = color.palette(length(levels) -1), axes = TRUE, key.axes, xaxs = "i", yaxs = "i", las = 1, grid = TRUE, grid.col = "yellow", grid.nx = floor(ncol(x)/30), grid.ny = grid.nx, center.zero = TRUE, flip=TRUE, ...) { if (missing(x)) { stop("no 'x' distance matrix specified") } if(center.zero) { if(zlim[1]<0) { ## make levels equidistant around 0 levels = pretty(c(-max(abs(zlim)),max(abs(zlim))), nlevels) } } mar.orig <- (par.orig <- par(c("mar", "las", "mfrow")))$mar on.exit(par(par.orig)) # Color key if(key) { w <- (3 + mar.orig[2]) * par("csi") * 2.54 layout(matrix(c(2, 1), ncol = 2), widths = c(1, lcm(w))) par(las = las) mar <- mar.orig mar[4] <- mar[2] mar[2] <- 1 par(mar = mar) plot.new() plot.window(xlim = c(0, 1), ylim = range(levels), xaxs = "i", yaxs = "i") rect(0, levels[-length(levels)], 1, levels[-1], col = col) if (missing(key.axes)) { if (axes) axis(4) } else key.axes box() } # Matrix plot mar <- mar.orig mar[4] <- 1 par(mar = mar) class(x)=NULL z <- as.matrix(as.data.frame(t(x))) nums <- seq(1,ncol(x),by=axis.tick.space) if(flip) { ylim = c(ncol(z),1) } else { ylim = c(1,ncol(z)) } image(x=1:ncol(x), y=1:nrow(x), z=z, zlim=zlim, col=col, yaxt="n", xaxt="n", ...) #xlab="Residue Number", ylab="Residue Number") axis(side=1, at=nums, labels=resnum.1[nums]) axis(side=2, at=nums, labels=resnum.2[nums]) if(grid) grid(grid.nx ,grid.ny, col=grid.col) box() } bio3d/R/read.dcd.R0000644000176200001440000002455314046015221013246 0ustar liggesusers"read.dcd" <- function(trjfile, big=FALSE, verbose=TRUE, cell = FALSE){ # Version 0.2 ... Tue Jan 18 14:20:12 PST 2011 # Version 0.1 ... Thu Mar 9 21:18:54 PST 2005 # # Description: # Reads a CHARMM or X-PLOR/NAMD binary # trajectory file with either big- or # little-endian storage formats # # Details: # Reading is accomplished with two different # functions. # 1. 'dcd.header' which reads headder info # 2. 'dcd.frame' takes the header info and # reads frame by frame producing a # nframes/natom*3 matrix of cartisean # coordinates #===DCD=FORMAT============================================== #HDR NSET ISTRT NSAVC 5-ZEROS NATOM-NFREAT DELTA 9-ZEROS #CORD files step1 step zeroes (zero) timestep zeroes #C*4 INT INT INT 5INT INT DOUBLE 9INT # [CHARACTER*20] #=========================================================== #NTITLE TITLE #INT C*MAXTITL #C*2 C*80 #=========================================================== #NATOM #INT #=========================================================== #CELL(I), I=1,6 (DOUBLE) #=========================================================== #X(I), I=1,NATOM (SINGLE) #Y(I), I=1,NATOM #Z(I), I=1,NATOM #=========================================================== dcd.header <- function(trj,...) { # Read DCD Header section end = .Platform$endian # Check endianism check <- readBin(trj,"integer",1,endian=end) # first thing in file should be an '84' header if (check != 84) { # if not we have the wrong endianism if (end == "little") { end="big" } else { end="little" } check <- readBin(writeBin(check, raw()), "integer", 1, endian = end) if (check != 84) { close(trj) stop("PROBLEM with endian detection") } } hdr <- readChar(trj, nchars=4) # data => CORD or VELD # how big is the file 'end.pos' cur.pos <- seek(trj, where=1, origin = "end") # pos ? end.pos <- seek(trj, where=cur.pos, origin= "start") icntrl <- readBin(trj,"integer", 20, endian=end) # data => header info # header information: nframe = icntrl[1] # number of frames first = icntrl[2] # number of previous steps step = icntrl[3] # frequency of saving nstep = icntrl[4] # total number of steps nfile <- nstep/step # number of files last <- first + (step * nframe) # last step # 5 zeros ndegf = icntrl[8] # number of degrees of freedom nfixed = icntrl[9] # number of fixed atoms delta = icntrl[10] # coded time step cryst = icntrl[11] # crystallographic group block = icntrl[12] # extra block? # 9 zeros vers = icntrl[20] # flush to end of line a<-readBin(trj,"integer",1, endian=end) # should be '84' line tail ## cur.pos<-seek(trj, where=92, origin= "start") # position 92 rm(icntrl) # tidy up # Are we CHARMM or X-PLOR format charmm=FALSE; extrablock=FALSE; four.dims=FALSE if (vers != 0) { charmm=TRUE # charmm version number if (cryst == 1) { # check for extrablock = TRUE # extra free } # atom block & if (block == 1) { # extra four four.dims=TRUE # dimensions } } else { # re-read X-PLOR delta as a double cur.pos <- seek(trj, where=44, origin= "start") delta = readBin(trj,"double", 1, endian=end) seek(trj, where=cur.pos, origin= "start") } #=======# # Title # a<-readBin(trj,"integer",1, endian=end) # flush FORTRAN header ntitle <- readBin(trj,"integer",1, endian=end) # data => Num title lines title<-NULL # store title & date cur.pos <- seek(trj, where=NA) ## 100 for (i in 1:ntitle) { ### ==> !!!nasty hack due to invalid UTF-8 input (Jun 5th 07) !!! <=== ### ll<-try(title<-c( title, readChar(trj,80) ),silent=TRUE) } # OR: title<- readChar(trj, (ntitle*80)) if(class(ll)=="try-error") { warning("Check DCD header data is correct, particulary natom") ##cur.pos <- seek(trj, where=260, origin= "start") # pos 260 cur.pos <- seek(trj, where=(80*ntitle+cur.pos), origin= "start") } ### == end hack a<-readBin(trj,"integer",1, endian=end) # flush FORTRAN tail #=======# # Natom # a<-readBin(trj,"integer",1, endian=end) # flush FORTRAN header natom <- readBin(trj,"integer",1, endian=end) # number of atoms a<-readBin(trj,"integer",1, endian=end) # flush FORTRAN tail ##cur.pos <- seek(trj, where=276, origin= "start") # pos 276 #=============# # Freeindexes # if (nfixed != 0) { # Free (movable) atom indexes if nfixed > 0 a <- readBin(trj,"integer",1, endian=end) # flush FORTRAN header free.ind <- readBin(trj,"integer", (natom-nfixed), endian=end ) a <- readBin(trj,"integer",1, endian=end) # flush FORTRAN tail print("FIXED ATOMS IN SIMULATION => CAN'T READ YET") } if (verbose) { ## EDIT ## R version 2.11.0 does not like "\0", just remove for now - Apr 12 2010 ## cat( sub(" +$","",gsub(pattern="\0", replacement="", x=title)),sep="\n" ) cat(" NATOM =",natom,"\n") cat(" NFRAME=",nframe,"\n") cat(" ISTART=",first,"\n") cat(" last =",last,"\n") cat(" nstep =",nstep,"\n") cat(" nfile =",nfile,"\n") cat(" NSAVE =",step,"\n") cat(" NDEGF =",ndegf,"\n") cat(" version",vers,"\n") } # Done with Header :-) header <- list(natom=natom, nframe=nframe, first=first, last=last, nstep=nstep, nfile=nfile, step=step, ndegf=ndegf, nfixed=nfixed, charmm=charmm, extrablock=extrablock, four.dims=four.dims, end.pos=end.pos, end=end) } dcd.frame <- function(trj, head, cell) { # DCD step/frame data # read one frame from the current conection 'trj' # which should have been already through # 'dcd.header' so the "where" position is at # the start of the cooedinate section #============# # Free atoms # # Uncomment the next two lines if reading cell # parameters only works with CHARMM DCD files # if(!head$charmm && cell) # stop("Cell parameters can only be read from CHARMM dcd files.") if ( head$charmm && head$extrablock) { # CHARMM files may contain lattice parameters a <- readBin(trj,"integer",1, endian=head$end) # flush FORTRAN header u <- readBin(trj, "numeric", size = 8, n = (a/8),endian = head$end) a <- readBin(trj,"integer",1, endian=head$end) # flush FORTRAN tail } ##cur.pos <- seek(trj, where=332, origin= "start") # pos 332 #========# # Coords # if (head$nfixed == 0) { a <- readBin(trj,"integer",1, endian=head$end) # flush FORTRAN header x <- readBin(trj,"numeric", # read x coords size=4, n=(a/4), endian=head$end) a <- readBin(trj,"integer",1, endian=head$end) # flush FORTRAN tail a <- readBin(trj,"integer",1, endian=head$end) # flush FORTRAN header y <- readBin(trj,"numeric", # read y coords size=4, n=(a/4), endian=head$end) a <- readBin(trj,"integer",1, endian=head$end) # flush FORTRAN tail a <- readBin(trj,"integer",1, endian=head$end) # flush FORTRAN header z <- readBin(trj,"numeric", # read z coords size=4, n=(a/4), endian=head$end) a <- readBin(trj,"integer",1, endian=head$end) # flush FORTRAN tail } else { # not implemented yet! => cant cope with fixed atoms } #===============# # 4th dimension # if (head$charmm && head$four.dims) { # CHARMM files may contain an extra block? a <- readBin(trj,"integer",1, endian=head$end) # flush FORTRAN header seek(trj, where=a, origin= "current") # skip this block a <- readBin(trj,"integer",1, endian=head$end) # flush FORTRAN tail } # Done with coord frame :-) #coords <- list(x=x, # y=y, # z=z) if(cell) to.return <- c( u[c(1,3,6)], (180/pi)*acos(u[c(5,4,2)])) else to.return <- as.vector(rbind(x,y,z)) class(to.return) = "xyz" return(to.return) } # Check if file exists if( !file.exists(trjfile) ) { stop(paste("No input DCD file found with name:", trjfile)) } # Open file conection trj <- file(trjfile, "rb") #verbose=T head<-dcd.header(trj,verbose) nframes = head$nframe natoms = head$natom # blank xyz data structures # format: rows => nframes, cols => natoms ### ==> !!! Insert to read big dcd files (Sep 29th 08) !!! <=== ### ###xyz <- matrix(NA, nrow=nframes,ncol=natoms*3) if(!big) { if(cell) to.return <- matrix(NA, nrow=nframes,ncol=6) else to.return <- matrix(NA, nrow=nframes,ncol=natoms*3) } else { ##-! Insert to read big dcd files (Sep 29th 08) oops <- requireNamespace("bigmemory", quietly = TRUE) if(!oops) stop("Please install the bigmemory package from CRAN") if(cell) to.return <- bigmemory::big.matrix(nrow=nframes,ncol=6, init = NA, type = "double") else to.return <- bigmemory::big.matrix(nrow=nframes,ncol=natoms*3, init = NA, type = "double") } ### ==> !!! end big.matrix insert if(verbose){ cat("Reading (x100)") } store <- NULL # fill xyz with frame coords if(verbose) pb <- txtProgressBar(1, nframes, style=3) for(i in 1:nframes) { curr.pos <- seek(trj, where=0, origin= "current") if (curr.pos <= head$end.pos) { to.return[i,]<- as.vector( dcd.frame(trj,head,cell) ) if (verbose) { setTxtProgressBar(pb, i) # if(i %% 100==0) { cat(".") } } # print(paste("frame:",i,"pos:",curr.pos)) store<-cbind(store,curr.pos) } else { print("Premature end of file") print(paste(" last frame:",i, "nframe:",head$nframe )) break } } # if(verbose) { cat("done",sep="\n") } if(verbose) cat("\n") close(trj) ##class(to.return) = "xyz" if(big) { warning("Returned a 'big.memory' matrix that is not fully supported by some Bio3D functions.") return(to.return) } else { return( as.xyz(to.return) ) } } bio3d/R/identify.cna.R0000644000176200001440000000250314046015221014144 0ustar liggesusersidentify.cna <- function(x, labels=NULL, cna=NULL, ...){ ## Be carefull with input argument order ## - 'labels' can take any input and screw up priniting ## e.g. if you pass cna as the second argument! ## Should this perhaps be able to take just a cna object as input ## - Possible if cna object has layout defined ## - Could take extra layout option for custom graphs ## x <- plot(net) ## ## d <- identify.cna(x, cna=net) ## d <- identify.cna(x, labels=summary(net)$members) oops <- requireNamespace("igraph", quietly = TRUE) if (!oops) { stop("igraph package missing: Please install, see: ?install.packages") } if(dim(x)[2] != 2){ stop("'x' object must be a Nx2 numeric matrix") } x.norm <- igraph::layout.norm(x, -1, 1, -1, 1) if( !is.null(labels) ) { ## Use input labels inds <- identify(x.norm[,1], x.norm[,2], labels, ...) return( labels[inds] ) } else { if(is.null(cna)) { ## Use standard labels inds <- identify(x.norm[,1], x.norm[,2], ...) return(inds) } else { ## Take labels from cna object!! labels.all <- summary.cna(cna) labels.short <- labels.all$tbl$members labels.full <- labels.all$members inds <- identify(x.norm[,1], x.norm[,2], labels.short, ...) return( labels.full[inds] ) } } } bio3d/R/cov.nma.R0000644000176200001440000000261514046015221013136 0ustar liggesuserscov.nma <- function(nma) { if(!inherits(nma, "nma")) stop("provide a 'nma' object as obtain from function 'nma.pdb()'") dims <- dim(nma$U) cov <- matrix(0, ncol=dims[1], nrow=dims[1]) tmpU <- nma$U[, (nma$triv.modes+1):ncol(nma$U)] tmpL <- nma$L[(nma$triv.modes+1):ncol(nma$U)] for(j in 1:ncol(tmpU) ) { cov <- cov + ( (tmpU[,j] %*% t(tmpU[,j])) / tmpL[j]) } return(cov) } cov.enma <- function(enma, ncore=NULL) { if(!inherits(enma, "enma")) stop("provide a 'enma' object as obtain from function 'nma.pdbs()'") if(any(is.na(enma$fluctuations))) stop("provide 'enma' object calculated with argument 'rm.gaps=TRUE'") ncore <- setup.ncore(ncore, bigmem = FALSE) if(ncore>1) mylapply <- mclapply else mylapply <- lapply if(!inherits(enma, "enma")) stop("provide 'enma' object as obtained from nma.pdbs") dims <- dim(enma$U.subspace) mycalc <- function(i, enma) { cov <- matrix(0, ncol=dims[1], nrow=dims[1]) tmpU <- enma$U.subspace[,,i] tmpL <- enma$L[i,] for(j in 1:ncol(tmpU) ) { cov = cov + ( (tmpU[,j] %*% t(tmpU[,j])) / tmpL[j]) } cat(".") return(cov) } covs.list <- mylapply(1:dims[3L], mycalc, enma) cat("\n") covs <- array(0, dim=c(dims[1], dims[1], dims[3])) for ( i in 1:dims[3L] ) covs[,,i]=covs.list[[i]] return(covs) } .tr <- function(mat) { return(sum(diag(mat))) } bio3d/R/bounds.R0000644000176200001440000000264414046015221013071 0ustar liggesusers"bounds" <- function (nums, dup.inds=FALSE, pre.sort=TRUE) { if(dup.inds) { ## bounds of concetive duplicated numbers s.ind <- which(!duplicated(nums)) e.ind <- c(s.ind[-1]-1, length(nums)) return(cbind(1:length(s.ind),"start"=s.ind,"end"=e.ind, "length"=(e.ind - s.ind + 1))) } else { if (!is.numeric(nums)) stop("must supply a numeric vector") if (length(nums)==0) return(nums) if(pre.sort) { ## should we pre-sort... nums <- sort(unique(nums)) } if (length(nums) == 1) { bounds <- c(nums, nums, 1) names(bounds) <- c("start", "end", "length") ## Edit here to return matrix (not vector) ## following dssp bug report from Yun Liu ## Fri, Apr 29, 2011 return( t(as.matrix(bounds)) ) } bounds <- nums[1] nums.start <- nums[1] diff.i <- 1 for (i in 2:length(nums)) { if ((nums[i] - diff.i) != nums.start) { bounds <- c(bounds, nums[i - 1], nums[i]) nums.start <- nums[i] diff.i <- 1 } else { diff.i <- diff.i + 1 } } bounds <- c(bounds, nums[length(nums)]) bounds <- matrix(bounds, ncol = 2, byrow = TRUE, dimnames = list(c(1:(length(bounds)/2)), c("start", "end"))) bounds <- cbind(bounds, length = (bounds[, 2] - bounds[,1]) + 1) return(bounds) } } bio3d/R/basename.pdb.R0000644000176200001440000000071314046015221014111 0ustar liggesusersbasename.pdb <- function(x, mk4=FALSE, ext=".pdb") { ## ##- Extract PDB basename/identifier from filenames ## like "basename()" for PDB files ## E.g.: ## basename.pdb("/somedir/somewhere/1bg2_myfile.pdb") ## Will give: 1bg2_myfile ## basename.pdb("/somedir/somewhere/1bg2_myfile.pdb", TRUE) ## Will give: 1bg2 y <- sub(paste0("\\", ext, "$"),"", basename(x)) if(mk4) { y <- substr(y,1,4) } names(y) <- x return(y) } bio3d/R/xyz2atom.R0000644000176200001440000000011314046015221013361 0ustar liggesusersxyz2atom <- function(xyz.ind) { return( unique( ceiling(xyz.ind/3) ) ) } bio3d/R/print.xyz.R0000644000176200001440000000162414046015221013561 0ustar liggesusersprint.xyz <- function(x, ...) { ## Print a summary of bio3d 'xyz' object features if(!inherits(x, "xyz")) { stop("Input should be a bio3d 'xyz' object") } if( is.null(nrow(x)) ) x <- t(as.matrix(x)) cat( paste0("\n Total Frames#: ", nrow(x), "\n Total XYZs#: ", ncol(x), ", (Atoms#: ", round(ncol(x)/3,3), ")\n\n") ) if(ncol(x) > 7) { s <- paste(" [1] ", paste(round(x[1,1:3],3),collapse=" "), " <...> ", paste( round(x[nrow(x),(ncol(x)-2):ncol(x)], 3), collapse=" "), " [",length(x),"]", sep="") } else { s <- paste(" [1] ", paste(round(x[1,],3),collapse=" "), " [",length(x),"]", sep="") } cat(s,"\n\n") i <- paste(attributes(x)$names, collapse = ", ") j <- paste("Matrix DIM =", nrow(x), "x", ncol(x)) cat(strwrap(paste(" + attr:", i, "\n",j), width = 45, exdent = 8), sep = "\n") } bio3d/R/dccm.R0000644000176200001440000000037414046015221012503 0ustar liggesusers`dccm` <- function(x, ...) { if(inherits(x, "matrix")) { class(x) <- c("matrix", "xyz") UseMethod("dccm", x) } else if(inherits(x, "array")) { class(x) <- c("matrix", "mean") UseMethod("dccm", x) } else UseMethod("dccm") } bio3d/R/overlap.R0000644000176200001440000000235114046015221013242 0ustar liggesusers"overlap" <- function(modes, dv, nmodes=20) { if(missing(modes)) stop("overlap: 'modes' must be prodivded") if(missing(dv)) stop("overlap: 'dv' must be prodivded") if ("pca" %in% class(modes)) { ev <- modes$U mass <- NULL first.mode <- 1 } else if("nma" %in% class(modes)) { ev <- modes$modes mass <- modes$mass first.mode <- modes$triv.modes+1 nmodes <- modes$triv.modes + nmodes } else { if(!inherits(modes, c("matrix", "pca.loadings"))) stop("overlap: 'modes' must be an object of type 'pca', 'nma', or 'matrix'") ev <- modes mass <- NULL first.mode <- 1 } if (nrow(ev)!=length(dv)) stop("overlap: unequal vector lengths") if ( ncol(ev) < nmodes ) { nmodes <- dim(ev)[2L] warning("nmodes larger than dimensions of 'modes'") } inds <- seq(first.mode, nmodes) ev <- ev[,inds] ## Normalize vectors - mass-weighted if normal modes are ev <- normalize.vector(ev, mass) dvn <- normalize.vector(dv, mass) overlap.values <- inner.prod(ev, dvn, mass)**2 cum <- cumsum(overlap.values) out <- list(overlap=overlap.values, overlap.cum=cum) return(out) } bio3d/R/network.amendment.R0000644000176200001440000000713514046015221015237 0ustar liggesusersnetwork.amendment <- function(x, membership, minus.log=TRUE){ ## Check for presence of igraph package oops <- requireNamespace("igraph", quietly = TRUE) if (!oops) { stop("igraph package missing: Please install, see: ?install.packages") } if(!inherits(x, "cna")){ stop("Input x must be a 'cna' class object as obtained from cna()") } if(!is.numeric(membership)){ stop("Input membership must be a numeric vector") } if(length(membership) != length(x$communities$membership)){ stop("Input membership and x$community$membership must be of the same length") } contract.matrix <- function(cij.network, membership,## membership=comms$membership, collapse.method="max", minus.log=TRUE){ ## Function to collapse a NxN matrix to an mxm matrix ## where m is the communities of N. The collapse method ## can be one of the 'collapse.options' below ## convert to the original cij values if "-log" was used if(minus.log){ cij.network[cij.network>0] <- exp(-cij.network[cij.network>0]) } collapse.options=c("max", "median", "mean", "trimmed") collapse.method <- match.arg(tolower(collapse.method), collapse.options) ## Fill a 'collapse.cij' nxn community by community matrix node.num <- max(x$communities$membership) if(node.num > 1){ collapse.cij <- matrix(0, nrow=node.num, ncol=node.num) inds <- pairwise(node.num) for(i in 1:nrow(inds)) { comms.1.inds <- which(membership==inds[i,1]) comms.2.inds <- which(membership==inds[i,2]) submatrix <- cij.network[comms.1.inds, comms.2.inds] ## Use specified "collapse.method" to define community couplings collapse.cij[ inds[i,1], inds[i,2] ] = switch(collapse.method, max = max(submatrix), median = median(submatrix), mean = mean(submatrix), trimmed = mean(submatrix, trim = 0.1)) } if(minus.log){ collapse.cij[collapse.cij>0] <- -log(collapse.cij[collapse.cij>0]) } ## Copy values to lower triangle of matrix and set colnames collapse.cij[ inds[,c(2,1)] ] = collapse.cij[ inds ] colnames(collapse.cij) <- 1:ncol(collapse.cij) } else{ warning("There is only one community in the $communities object. $community.cij object will be set to 0 in the contract.matrix() function.") collapse.cij <- 0 } class(collapse.cij) <- c("dccm", "matrix") return(collapse.cij) } x$communities$membership <- membership x$community.cij <- contract.matrix(x$cij, membership, minus.log=minus.log) cols=vmd_colors() # if(sum(x$community.cij)>0){ x$community.network <- igraph::graph.adjacency(x$community.cij, mode="undirected", weighted=TRUE, diag=FALSE) ##-- Annotate the two networks with community information ## Check for duplicated colors if(max(x$communities$membership) > length(unique(cols)) ) { warning("The number of communities is larger than the number of unique 'colors' provided as input. Colors will be recycled") } ## Set node colors igraph::V(x$network)$color <- cols[x$communities$membership] igraph::V(x$community.network)$color <- cols[ 1:max(x$communities$membership)] ## Set node sizes igraph::V(x$network)$size <- 1 igraph::V(x$community.network)$size <- table(x$communities$membership) # } return(x) } bio3d/R/blast.pdb.R0000644000176200001440000000430014046015221013437 0ustar liggesusers`blast.pdb` <- function(seq, database="pdb", time.out=NULL, chain.single=TRUE) { if(inherits(seq, "fasta")) { if(is.matrix(seq$ali)) { if(nrow(seq$ali)>1) warning("Multiple sequences detected - using only the first sequence in input object") seq <- as.vector(seq$ali[1,]) } else { seq <- as.vector(seq$ali) } } ## Extract sequence 'seq' from possible pdb input if(is.pdb(seq)) { seq <- pdbseq(seq) } ## Run NCBI blastp on a given 'seq' sequence against a given 'database' if(!is.vector(seq)) { stop("Input 'seq' should be a single sequence as a single or multi element character vector (as obtained from the pdbseq() function)") } seq <- paste(seq, collapse="") if( !(database %in% c("pdb", "nr", "swissprot")) ) stop("Option database should be one of pdb, nr or swissprot") ##- Submit if(nchar(seq)>30) { urlput <- paste("https://blast.ncbi.nlm.nih.gov/Blast.cgi?CMD=Put&DATABASE=", database,"&HITLIST_SIZE=20000&PROGRAM=blastp&CLIENT=web&QUERY=", paste(seq,collapse=""), sep="") } else { # mimic the 'Automatically adjust parameters for short input sequences' option on NCBI urlput <- paste("https://blast.ncbi.nlm.nih.gov/Blast.cgi?CMD=Put&DATABASE=", database,"&HITLIST_SIZE=500&PROGRAM=blastp&CLIENT=web&", "MATRIX=PAM30&MATRIX_NAME=PAM30&EXPECT=200000&", "WORD_SIZE=2&GAPCOSTS=9 1&", "THRESHOLD=11&", "COMPOSITION_BASED_STATISTICS=0&QUERY=", paste(seq,collapse=""), sep="") } txt <- scan(urlput, what="raw", sep="\n", quiet=TRUE) rid <- sub("^.*RID = " ,"",txt[ grep("RID =",txt) ]) urlget <- paste("https://blast.ncbi.nlm.nih.gov/Blast.cgi?CMD=Get", "&FORMAT_OBJECT=Alignment", "&ALIGNMENT_VIEW=Tabular", "&RESULTS_FILE=on", "&FORMAT_TYPE=CSV", "&ALIGNMENTS=20000", "&DESCRIPTIONS=20000", "&RID=",rid, sep="") blast <- get.blast(urlget, time.out = time.out, chain.single=chain.single) return(blast) } bio3d/R/plot.blast.R0000644000176200001440000001022414046015221013652 0ustar liggesusers`plot.blast` <- function(x, cutoff=NULL, cut.seed=NULL, cluster=TRUE, mar=c(2, 5, 1, 1), cex=1.5, ...) { ## b <- blast.pdb( pdbseq( read.pdb("4q21") ) ) ## plot(b, 188) ## cut.seed=110 cl <- class(x) if("hit.tbl" %in% names(x)) x <- x$hit.tbl panelplot <- function(z=x$mlog.evalue, ylab="-log(Evalue)", gp=gp, ...) { z=as.numeric(z) plot(z, xlab="", ylab=ylab, col=gps, ...) abline(v=gp, col="gray70", lty=3) pos=c(rep(4, length(gp))[-length(gp)],2) text( gp, z[gp], labels=paste0("Nhit=",gp ,", x=", round(z[gp])), col="black", pos=pos, cex=cex, ...) ##"gray50" } ##- Setup plot arangment opar <- par(no.readonly = TRUE) on.exit(par(opar)) if("blast" %in% cl) par(mfcol=c(4,1), mar=mar, cex.lab=cex) if("hmmer" %in% cl & "kg" %in% names(x)) par(mfcol=c(4,1), mar=mar, cex.lab=cex) ##- Find the point pair with largest diff evalue dx <- abs(diff(x$mlog.evalue)) dx.cut = which.max(dx) if(!is.null(cutoff)) { ##- Use suplied cutoff gps = rep(2, length(x$mlog.evalue)) gps[ (x$mlog.evalue >= cutoff) ] = 1 } else { if(cluster) { ## Ask USER whether to continue with clustering with many hits nhit <- length(x$mlog.evalue) if(nhit > 9999) { cluster <- readline( paste0(" Note: ", nhit, " hits, continue with TIME-CONSUMING clustering [y/n/q](n): ") ) cluster <- switch(cluster, y=TRUE, yes=TRUE, q="QUIT", FALSE) if(cluster=="QUIT") { stop("user stop") } } } if(is.null(cut.seed)) { ## Use mid-point of largest diff pair as seed for ## cluster grps (typical PDB values are ~110) cut.seed = mean( x$mlog.evalue[dx.cut:(dx.cut+1)] ) } if(cluster){ ##- Partition into groups via clustering ## In future could use changepoint::cpt.var hc <- hclust( dist(x$mlog.evalue) ) if(!is.null(cutoff)) { cut.seed=cutoff } gps <- cutree(hc, h=cut.seed) } if(!cluster || (length(unique(gps))==1)) { ##- Either we don't want to run hclust or hclust/cutree ## has returned only one grp so here we will divide ## into two grps at point of largest diff gps = rep(2, length(x$mlog.evalue)) gps[1:dx.cut]=1 } } gp.inds <- na.omit(rle2(gps)$inds) gp.nums <- x$mlog.evalue[gp.inds] cat(" * Possible cutoff values: ", floor(gp.nums), "\n", " Yielding Nhits: ", gp.inds, "\n\n") if( is.null(cutoff) ) { ## Pick a cutoff close to cut.seed i <- which.min(abs(gp.nums - cut.seed)) cutoff <- floor( gp.nums[ i ] ) } inds <- x$mlog.evalue >= cutoff cat(" * Chosen cutoff value of: ", cutoff, "\n", " Yielding Nhits: ", sum(inds), "\n") ##- Plot each alignment statistic with annotated grps panelplot(gp=gp.inds) panelplot(x$bitscore, ylab="Bitscore", gp=gp.inds) if("identity" %in% names(x)) panelplot(x$identity, ylab="Identity", gp=gp.inds) if("alignmentlength" %in% names(x)) panelplot(x$alignmentlength, ylab="Length", gp=gp.inds) if("kg" %in% names(x)) { tbl <- table(x$kg[inds], cut(x$score[inds], 20)) tbl=tbl[, seq(ncol(tbl), 1), drop=FALSE] cols <- seq(1,nrow(tbl)) barplot(tbl, col=cols, ylab="Frequency", border="grey50") box() legend("topleft", rownames(tbl), col=cols, pch=15, ncol=3, cex=cex*0.8, box.lwd = .5, box.lty=2, box.col = "grey50", bg = "white") tbl <- table(x$kg[!inds], cut(x$score[!inds], 20)) tbl=tbl[, seq(ncol(tbl), 1), drop=FALSE] cols <- seq(1,nrow(tbl)) barplot(tbl, col=cols, ylab="Frequency", border="grey50") legend("topleft", rownames(tbl), col=cols, pch=15, ncol=3, cex=cex*0.8, box.lwd = .5, box.lty=2, box.col = "grey50", bg = "white") box() } ##- Return details of hits above cutoff out <- cbind("pdb.id"=x$pdb.id[inds], "acc"=x$acc[inds], "group"=gps[inds]) rownames(out) <- which(inds) o <- list(hits=out, pdb.id=x$pdb.id[inds], acc=x$acc[inds], inds=inds) class(o) <- "blast" return(invisible(o)) } bio3d/R/amsm.xyz.R0000644000176200001440000000611214046015221013357 0ustar liggesusers## class DistanceCalculator --> calculate() "amsm.xyz" <- function(xyz, ncore=NULL) { if(!is.matrix(xyz)) stop("'xyz' must be a trajectory matrix") natoms <- ncol(xyz) / 3 atom.pairs <- natoms * (natoms -1) / 2 ## Distance Calculator ## returns a list of 4x4 matrices M <- .amsm.distCalc(xyz, ncore=ncore) ## we use 'list' in this version of the code if(class(M)=="list") Mlist <- TRUE else Mlist <- FALSE ## assign the atom mov. sim. matrix matrixCorr <- matrix(0, nrow=natoms, ncol=natoms) maxEigenVal <- 0 ## solve eigenvalue problems ij <- combn(natoms,2) for ( i in 1:atom.pairs ) { atom.inds <- ij[,i] if(Mlist) { ev <- eigen(M[[i]]) maxDist <- M[[i]][1,1] } else { ev <- eigen(M[,,i]) maxDist <- M[1,1,i] } maxEigenVal <- max(ev$values) hei <- 1 - (sqrt(maxDist / maxEigenVal)) matrixCorr[atom.inds[1], atom.inds[2]] <- hei matrixCorr[atom.inds[2], atom.inds[1]] <- hei ##matrixCorr[atom.inds[1], atom.inds[2]] <- maxDist ##matrixCorr[atom.inds[2], atom.inds[1]] <- maxDist ##if(max(ev$values)>maxEigenVal) ## maxEigenVal <- max(ev$values) } ##matrixCorr <- 1 - sqrt(matrixCorr / maxEigenVal) diag(matrixCorr) <- 1 return(matrixCorr) } ## class DistanceCalculator --> DistanceCalculator() ".amsm.distCalc" <- function(xyz, ncore=NULL) { if(!is.matrix(xyz)) stop("'xyz' must be a trajectory matrix") ## Parallelized by package 'parallel' ncore <- setup.ncore(ncore, bigmem = FALSE) ## used for vectProdSum vectPS <- function(xyz.ab) { a <- xyz.ab[1:3]; b <- xyz.ab[4:6]; m <- (a[2] * b[3]) - (a[3] * b[2]) n <- (a[3] * b[1]) - (a[1] * b[3]) o <- (a[1] * b[2]) - (a[2] * b[1]) return(c(m,n,o)) } ## used for matrixPSum matrPS <- function(xyz.ab) { a <- xyz.ab[1:3]; b <- xyz.ab[4:6]; m <- a[1] * b + b[1] * a n <- a[2] * b + b[2] * a o <- a[3] * b + b[3] * a return(c(m,n,o)) } for.atompair2 <- function(i, xyz, ij, M) { ij <- ij[,i] inds <- rep(ij*3,each=3) - c(2,1,0) xyz.ab <- xyz[, inds] vectProdSum <- rowSums(apply(xyz.ab, 1, vectPS)) matrixPSum <- rowSums(apply(xyz.ab, 1, matrPS)) suma <- sum((xyz.ab[,1:3]-xyz.ab[,4:6])^2) ##M <- matrix(0, ncol=4, nrow=4) M[1,1] = suma M[1,2] = vectProdSum[1]; M[1,3] = vectProdSum[2]; M[1,4] = vectProdSum[3]; M[2,2] = matrixPSum[1]; M[2,3] = matrixPSum[2]; M[2,4] = matrixPSum[3]; M[3,3] = matrixPSum[5]; M[3,4] = matrixPSum[6]; M[4,4] = matrixPSum[9]; ## symmerty M[2,1] = M[1,2] M[3,1] = M[1,3] M[4,1] = M[1,4] M[3,2] = M[2,3] M[4,2] = M[2,4] M[4,3] = M[3,4] return(M) } ##atom.pairs <- natoms * (natoms -1) / 2 natoms <- ncol(xyz) / 3 M <- matrix(0, ncol=4, nrow=4) ij <- combn(natoms,2) if(ncore==1) { all.Ms <- lapply(1:ncol(ij), for.atompair2, xyz, ij, M) } else { all.Ms <- mclapply(1:ncol(ij), for.atompair2, xyz, ij, M, mc.cores=ncore) } return(all.Ms) } bio3d/R/vec2resno.R0000644000176200001440000000063314046015221013501 0ustar liggesusers`vec2resno` <- function(vec, resno) { ## replicate vec based on concetive ## similar resno entries if(is.pdb(resno)) resno <- resno$atom[,"resno"] res.len <- rle(resno)$lengths if(length(vec) != length(res.len)) stop("Length miss-match of 'vec' and concetive 'resno'") if( sum(res.len) != length(resno) ) stop("Replicated length Miss-match") return( rep(vec, times=res.len)) } bio3d/R/aanma.pdbs.R0000644000176200001440000003216214046015221013601 0ustar liggesusers#' Ensemble Normal Mode Analysis with All-Atom ENM #' #' Perform normal mode analysis (NMA) on an ensemble of aligned protein #' structures using all-atom elastic network model (aaENM). #' #' @details This function builds elastic network model (ENM) using all heavy #' atoms and performs subsequent normal mode analysis (NMA) on a set of #' aligned protein structures obtained with function \code{\link{read.all}}. #' The main purpose is to automate ensemble normal mode analysis using #' all-atom ENMs. #' #' By default, the effective Hessian for all C-alpha atoms is calculated #' based on the Hessian built from all heavy atoms (including ligand atoms if #' \code{ligand=TRUE}). Returned values include aligned mode vectors and #' (when \code{full=TRUE}) a list containing the full \sQuote{nma} objects #' one per each structure. When \sQuote{rm.gaps=TRUE} the unaligned atoms #' are ommited from output. With default arguments \sQuote{rmsip} provides #' RMSIP values for all pairwise structures. #' #' When \code{outmodes} is provided and is not \sQuote{calpha} #' (e.g. \sQuote{noh}. See \code{\link{aanma}} for more details), the #' function simply returns a list of \sQuote{nma} objects, one per each #' structure, and no aligned mode vector is returned. In this case, the #' arguments \code{full}, \code{subspace}, and \code{rm.gaps} are ignored. #' This is equivalent to a wrapper function repeatedly calling #' \code{\link{aanma}}. #' #' @param pdbs an \sQuote{pdbs} object as obtained from \code{\link{read.all}}. #' @param fit logical, if TRUE C-alpha coordinate based superposition is #' performed prior to normal mode calculations. #' @param full logical, if TRUE return the complete, full structure, #' \sQuote{nma} objects. #' @param subspace number of eigenvectors to store for further analysis. #' @param rm.gaps logical, if TRUE obtain the hessian matrices for only #' atoms in the aligned positions (non-gap positions in all aligned #' structures). Thus, gap positions are removed from output. #' @param ligand logical, if TRUE ligand molecules are also included in the #' calculation. #' @param outpath character string specifing the output directory to #' which the PDB structures should be written. #' @param gc.first logical, if TRUE will call gc() first before mode calculation #' for each structure. This is to avoid memory overload when #' \code{ncore > 1}. #' @param ncore number of CPU cores used to do the calculation. #' @param ... additional arguments to \code{\link{aanma}}. #' #' @return Returns a list of \sQuote{nma} objects (\code{outmodes} is provided #' and is not \sQuote{calpha}) or an \sQuote{enma} object with the following #' components: #' \item{fluctuations }{ a numeric matrix containing aligned atomic #' fluctuations with one row per input structure. } #' \item{rmsip }{ a numeric matrix of pair wise RMSIP values (only the ten #' lowest frequency modes are included in the calculation). } #' \item{U.subspace }{ a three-dimensional array with aligned #' eigenvectors (corresponding to the subspace defined by the first N #' non-trivial eigenvectors (\sQuote{U}) of the \sQuote{nma} object). } #' \item{L }{ numeric matrix containing the raw eigenvalues with one row #' per input structure. } #' \item{full.nma }{ a list with a \code{nma} object for each input #' structure (available only when \code{full=TRUE}). } #' #' @seealso #' For normal mode analysis on single structure PDB: #' \code{\link{aanma}} #' #' For conventional C-alpha based normal mode analysis: #' \code{\link{nma}}, \code{\link{nma.pdbs}}. #' #' For the analysis of the resulting \sQuote{eNMA} object: #' \code{\link{mktrj.enma}}, \code{\link{dccm.enma}}, #' \code{\link{plot.enma}}, \code{\link{cov.enma}}. #' #' Similarity measures: #' \code{\link{sip}}, \code{\link{covsoverlap}}, #' \code{\link{bhattacharyya}}, \code{\link{rmsip}}. #' #' Related functionality: #' \code{\link{read.all}}. #' #' @author Xin-Qiu Yao & Lars Skjaerven #' #' @examples #' \donttest{ #' # Needs MUSCLE installed - testing excluded #' if(check.utility("muscle")) { #' #' ## Fetch PDB files and split to chain A only PDB files #' ids <- c("1a70_A", "1czp_A", "1frd_A", "1fxi_A", "1iue_A", "1pfd_A") #' files <- get.pdb(ids, split = TRUE, path = tempdir()) #' #' ## Sequence Alignement #' aln <- pdbaln(files, outfile = tempfile()) #' #' ## Read all pdb coordinates #' pdbs <- read.all(aln) #' #' ## Normal mode analysis on aligned data #' modes <- aanma(pdbs, rm.gaps=TRUE) #' #' ## Plot fluctuation data #' plot(modes, pdbs=pdbs) #' #' ## Cluster on Fluctuation similariy #' sip <- sip(modes) #' hc <- hclust(dist(sip)) #' col <- cutree(hc, k=3) #' #' ## Plot fluctuation data #' plot(modes, pdbs=pdbs, col=col) #' #' ## RMSIP is pre-calculated #' heatmap(1-modes$rmsip) #' #' ## Bhattacharyya coefficient #' bc <- bhattacharyya(modes) #' heatmap(1-bc) #' #' } #' } aanma.pdbs <- function(pdbs, fit=TRUE, full=FALSE, subspace=NULL, rm.gaps=TRUE, ligand=FALSE, outpath=NULL, gc.first=TRUE, ncore=NULL, ...) { if(!inherits(pdbs, "pdbs") || is.null(pdbs$all)) stop("input 'pdbs' should be a list object as obtained from 'read.all()'") ## Log the call cl <- match.call() if(!is.null(outpath)) dir.create(outpath, FALSE) ## Parallelized by parallel package ncore = setup.ncore(ncore) if(ncore>1) { prev.warn <- getOption("warn") options(warn=1) on.exit(options(warn=prev.warn)) } dots <- list(...) aligned.modes <- TRUE if('outmodes' %in% names(dots)) { if(dots$outmodes == 'noh') { warning(paste('Non C-alpha atoms are selected for output modes.', 'A plain list of "nma" objects will be returned.')) aligned.modes <- FALSE } else if(dots$outmodes == 'calpha') { ## use default select, i.e. 'non-gap' C-alpha positions. dots$outmodes <- NULL } else { stop('Unsupported "outmodes"') } } if("keep" %in% names(dots)) nm.keep <- dots$keep else nm.keep <- NULL if('rtb' %in% names(dots)) { rtb <- dots$rtb if(isTRUE(rtb)) { if('nmer' %in% names(dots) && dots$nmer!=1) stop( paste('Currently only nmer=1 is supported for', 'RTB based ensemble normal mode analysis') ) } } else { rtb <- formals(aanma.pdb)$rtb } if('reduced' %in% names(dots)) reduced <- dots$reduced else reduced <- formals(aanma.pdb)$reduced gaps.res <- gap.inspect(pdbs$ali) gaps.pos <- gap.inspect(pdbs$xyz) ## Number of modes to store in U.subspace if(is.null(subspace)) { keep <- length(gaps.pos$f.inds)-6 } else { keep <- subspace if (length(gaps.pos$f.inds) < (keep+6)) keep <- length(gaps.pos$f.inds)-6 } if(!is.null(nm.keep) && keep > nm.keep) keep <- nm.keep ## Convert from pdbs to pdb all.pdb <- pdbs2pdb(pdbs, all.atom=TRUE, ncore=ncore) ## Check if some structures are unavailable keep.inds <- which(sapply(all.pdb, is.pdb)) if(length(keep.inds) == 0) stop('No pdb file is found.') if(length(keep.inds) != length(all.pdb)) { warning(paste('Following pdb coordinates are not found: ', pdbs$id[-keep.inds], sep='')) pdbs <- trim(pdbs, row.inds=keep.inds, col.inds=1:ncol(pdbs$ali)) all.pdb <- all.pdb[keep.inds] } ## Remove ligand if(!ligand) all.pdb <- mclapply(all.pdb, trim, 'protein', mc.cores=ncore) ## Non-gap position for each pdb nogap.inds <- mclapply(1:length(all.pdb), function(i) { pdb <- all.pdb[[i]] pdb2aln.ind(pdbs, pdb, aln.id = pdbs$id[i], gaps.res$f.inds, file=NULL)$b }, mc.cores=ncore) if(fit) { cat('Fitting pdb structures') all.pdb <- mclapply(1:length(all.pdb), function(i) { cat('.') pdb <- all.pdb[[i]] xyz <- fit.xyz(pdbs$xyz[1, ], pdb$xyz, gaps.pos$f.inds, nogap.inds[[i]]$xyz) if(!is.null(outpath)) ofile <- file.path(outpath, basename(pdbs$id[i])) else ofile <- tempfile() write.pdb(pdb, xyz=xyz, file=ofile) read.pdb(ofile) }, mc.cores=ncore, mc.allow.recursive=FALSE) cat('done\n') } else { if(!is.null(outpath)) mclapply(1:length(all.pdb), function(i) write.pdb(all.pdb[[i]], file=file.path(outpath, basename(pdbs$id[i]))), mc.cores = ncore) } if(aligned.modes) { #### Prepare for NMA calculation #### ## Fluctuations for each structure if(rm.gaps) flucts <- matrix(NA, nrow=nrow(gaps.res$bin), ncol=length(gaps.res$f.inds)) else flucts <- matrix(NA, nrow=nrow(gaps.res$bin), ncol=ncol(gaps.res$bin)) ## List object to store each modes object if(full) all.modes <- list() else all.modes <- NULL ## 3D array- containing the modes vectors for each structure if(rm.gaps) modes.array <- array(NA, dim=c(length(gaps.pos$f.inds), keep, nrow(gaps.res$bin))) else modes.array <- array(NA, dim=c(ncol(pdbs$xyz), keep, nrow(gaps.res$bin))) ## store eigenvalues of the first modes L.mat <- matrix(NA, ncol=keep, nrow=nrow(gaps.res$bin)) ### Memory usage ### dims <- dim(modes.array) mem.usage <- sum(c(as.numeric(object.size(modes.array)), as.numeric(object.size(L.mat)), as.numeric(object.size(flucts)), as.numeric(object.size(matrix(NA, ncol=dims[3], nrow=dims[3]))) ))*2 if(full) { if(is.null(nm.keep)) tmpncol <- dims[2] else tmpncol <- nm.keep size.mat <- object.size(matrix(0.00000001, ncol=tmpncol, nrow=dims[1])) size.vec <- object.size(vector(length=dims[1], 'numeric')) tot.size <- ((size.mat * 2) + (size.vec * 4)) * length(pdbs$id) mem.usage <- mem.usage+tot.size } mem.usage=round(mem.usage/1048600,1) #### Print overview of scheduled calcualtion #### cat("\nDetails of Scheduled Calculation:\n") cat(paste(" ...", length(pdbs$id), "input structures", "\n")) if(keep>0) cat(paste(" ...", "storing", keep, "eigenvectors for each structure", "\n")) if(keep>0) cat(paste(" ...", "dimension of x$U.subspace: (", paste(dims[1], dims[2], dims[3], sep="x"), ")\n")) if(fit) cat(paste(" ...", "coordinate superposition prior to NM calculation", "\n")) if(full) cat(paste(" ... individual complete 'nma' objects will be stored", "\n")) if(rm.gaps) cat(paste(" ... aligned eigenvectors (gap containing positions removed) ", "\n")) if(reduced) cat(paste(" ... reduced all-atom ENM will be employed", "\n")) if(rtb) cat(paste(" ... rotation-translation block (RTB) approximation will be applied", "\n")) if(mem.usage>0) cat(paste(" ...", "estimated memory usage of final 'eNMA' object:", mem.usage, "Mb \n")) cat("\n") } ##### Start modes calculation ##### ## Initialize progress bar pb <- .init.pb(ncore, min=0, max=length(pdbs$id)) all.modes <- mclapply(1:length(all.pdb), function(i) { if(gc.first) gc() pdb <- all.pdb[[i]] nogap.inds <- nogap.inds[[i]] if(aligned.modes) { if(rm.gaps) capture.output( modes <- try(do.call(aanma, c(list(pdb=pdb, outmodes=nogap.inds), dots))) ) else capture.output( modes <- try(do.call(aanma, c(list(pdb=pdb), dots))) ) } else { capture.output( modes <- try(do.call(aanma, c(list(pdb=pdb), dots))) ) } if(inherits(modes, 'try-error')) { .close.pb(pb) stop(paste('Encounter errors in ', i, 'th structure', sep='')) } .update.pb(pb) modes$call <- NULL return( modes ) }, mc.cores=ncore) ## Finish progress bar .close.pb(pb) if(!aligned.modes) return( all.modes ) ##### Finalize calculation ##### for(i in 1:length(all.modes)) { if(rm.gaps) { flucts[i, ] <- all.modes[[i]]$fluctuations modes.array[,,i] <- all.modes[[i]]$U[, 7:(keep+6)] } else { flucts[i, !is.gap(pdbs$ali[i, ])] <- all.modes[[i]]$fluctuations modes.array[!is.gap(pdbs$xyz[i, ]),, i] <- all.modes[[i]]$U[, 7:(keep+6)] } L.mat[i, ] <- all.modes[[i]]$L[7:(keep+6)] } if(!full) all.modes <- NULL ##### RMSIP ###### rmsip.map <- NULL if(rm.gaps) { rmsip.map <- .calcRMSIP(modes.array, ncore=ncore) rownames(rmsip.map) <- basename(rownames(pdbs$xyz)) colnames(rmsip.map) <- basename(rownames(pdbs$xyz)) if(!fit) warning("rmsip calculated on non-fitted structures: ensure that your input coordinates are pre-fitted.") } if(fit) { xyz <- fit.xyz(fixed = pdbs$xyz[1, ], mobile = pdbs, fixed.inds = gaps.pos$f.inds, mobile.inds = gaps.pos$f.inds, ncore = ncore) } else { xyz <- pdbs$xyz } rownames(flucts) <- basename(rownames(pdbs$xyz)) out <- list(fluctuations=flucts, rmsip=rmsip.map, U.subspace=modes.array, L=L.mat, full.nma=all.modes, xyz=xyz, call=cl) class(out) <- "enma" return(out) } bio3d/R/dccm.nma.R0000644000176200001440000000631514046015221013256 0ustar liggesusers"dccm.nma" <- function(x, nmodes=NULL, ncore=NULL, progress = NULL, ...) { nma <- x if (missing(nma)) stop("dccm.nma: must supply a 'nma' object, i.e. from 'nma'") if(!"nma" %in% class(nma)) stop("dccm.nma: must supply 'nma' object, i.e. from 'nma'") ## Check for multiple cores ncore <- setup.ncore(ncore, bigmem = FALSE) if(ncore > 1) { mcparallel <- get("mcparallel", envir = getNamespace("parallel")) mccollect <- get("mccollect", envir = getNamespace("parallel")) } ## Inner product between all pairs of residues cross.inner.prod <- function(a, b) { mat <- apply(a, 1, "%*%", t(b)) return(mat) } ## Calc initial correlations for a subset of modes corrmats <- function(r.inds, core.id, nma, corr.mat, freqs, progress) { for ( i in r.inds ) { mode <- matrix(nma$U[,i], ncol=3, byrow=TRUE) corr.mat <- corr.mat + (cross.inner.prod(mode, mode) / (freqs[i]**2)) if(core.id==1) { setTxtProgressBar(pb, i) } if(!is.null(progress)) { if(i %% 20 == 0) { progress$set(i) } } } return(corr.mat) } if(!is.null(nma$frequencies)) { freqs <- nma$frequencies } else { freqs <- nma$force.constants } if(is.null(nmodes)) nmodes <- length(nma$L) else { nmodes <- nmodes + nma$triv.modes if(nmodes>length(nma$L)) { warning("'nmodes' larger than the number of modes") nmodes <- length(nma$L) } } ## Initialize progress bar ##ptm <- proc.time() pbmax <- nmodes + nma$natoms pb <- txtProgressBar(min=(nma$triv.modes+1), max=pbmax, style=3) ## Allocate the correl matrix corr.mat <- matrix(0, nma$natoms, nma$natoms) ## Which modes to use for calculation mode.inds <- (nma$triv.modes+1):nmodes core.ids <- rep(1:ncore, length.out=length( mode.inds )) if(ncore>1) jobs <- list() for ( i in 1:ncore ) { rinds <- mode.inds[ which(core.ids==i) ] if(ncore>1) { q <- mcparallel(corrmats(rinds, i, nma, corr.mat, freqs, progress)) jobs[[i]] <- q } else corr.mat <- corrmats(rinds, i, nma, corr.mat, freqs, progress) } ## Collect all jobs, and sum matrices if(ncore>1) { res <- mccollect(jobs, wait=TRUE) for ( job in res ) { corr.mat <- corr.mat + job } } ## Basis for normalization a <- vector('numeric', length=nrow(corr.mat)) k <- length(mode.inds) ## for ProgressBar ! inds <- rep(1:nrow(corr.mat), each=3) for ( j in (nma$triv.modes+1):nmodes ) { v <- nma$U[, j] * nma$U[, j] a <- a + ( tapply( v, inds, sum) / (freqs[j]**2)) k <- k+1 setTxtProgressBar(pb, k) if(!is.null(progress)) { if(j %% 20 == 0) { progress$set(k) } } } close(pb) a <- sqrt(a) bn <- a%o%a ## Normalized correlation matrix corr.mat <- corr.mat / bn class(corr.mat) <- c("dccm", "matrix") ##t <- proc.time() - ptm ##cat(" Done in", t[[3]], "seconds.\n") return(corr.mat) } bio3d/R/is.xyz.R0000644000176200001440000000005314046015221013033 0ustar liggesusersis.xyz <- function(x) inherits(x, "xyz") bio3d/R/pdb.annotate.R0000644000176200001440000003645214046015221014160 0ustar liggesusers"pdb.annotate" <- function(ids, anno.terms=NULL, unique=FALSE, verbose=FALSE, extra.terms=NULL) { oops <- !requireNamespace("httr", quietly = TRUE) if(oops) { stop("Please install the httr package from CRAN") } if(!is.null(extra.terms)) { message("Currently 'extra.terms' is not supported") extra.terms <- NULL } if(inherits(ids, "blast")) ids = ids$pdb.id if(!is.vector(ids)) { stop("Input argument 'ids' should be a vector of PDB identifiers/accession codes") } ## Basic annotation terms (note 'citation' is a meta term) anno.basicterms <- c("structureId", "chainId", "macromoleculeType", "chainLength", "experimentalTechnique", "resolution", "scopDomain", "pfam", "ligandId", "ligandName", "source", "structureTitle", "citation", "rObserved", "rFree", "rWork", "spaceGroup") if(is.null(anno.terms)) { anno.terms <- anno.basicterms } else { anno.terms <- match.arg(anno.terms, anno.basicterms, several.ok=TRUE) anno.terms <- unique(anno.terms) } anno.terms.input <- anno.terms ## Check if we have any valid terms remaining if( length(anno.terms) == 0 ) { stop( paste("No valid anno.terms specified. Please select from:\n\t ", paste(anno.basicterms, collapse=", ")) ) } ## force the structureId and chainId terms to be present req.terms <- c("structureId", "chainId") if(any(c("ligandId", "ligandName") %in% anno.terms)) { ## force ligandChainId req.terms <- c(req.terms, "ligandChainId") } inds <- req.terms %in% anno.terms if(!all(inds)) { anno.terms <- c(req.terms[!inds], anno.terms) } if (missing(ids)) { stop("please specify PDB ids for annotating") } if (any(nchar(ids) != 4)) { # warning("ids should be standard 4 character PDB-IDs: trying first 4 characters...") # if(unique) { # ids <- unique(substr(basename(ids), 1, 4)) # } ## first 4 chars should be upper ## any chainId should remain untouched - see e.g. PDB ID 3R1C mysplit <- function(x) { str <- unlist(strsplit(x, "_")) if(length(str)>1) { paste(toupper(str[1]), "_", str[2], sep="") } else { toupper(str[1]) } } ids <- unlist(lapply(ids, mysplit)) } else { ids <- toupper(ids) } ids.short <- unique( substr(basename(ids), 1, 4) ) ## prepare query baseurl <- "https://data.rcsb.org/graphql" anno.terms.new <- unlist(sapply(anno.terms, .map_terms)) anno.terms.new <- c(anno.terms.new, extra.terms) query <- "query($id: [String!]!){ entries(entry_ids: $id){ " query <- paste(query, paste( sapply(anno.terms.new, .string2json), collapse="\n"), "\n}}", sep="") resp <- httr::POST(baseurl, httr::accept_json(), body = list(query=query, variables=list(id=ids.short)), encode="json") if(httr::http_error(resp)) { stop('Access to PDB server failed') } else { ret <- httr::content(resp) } if("error" %in% names(ret)) { stop('Retrieving data from PDB failed') } ## Generate a formatted table ## Also taking care of merging data for unique structureId, ## excluding non-requested chain IDs, formatting citation, etc. data <- .format_tbl(ret, ids, anno.terms, unique=unique) if(unique) { rownames(data) <- data$structureId } else { rownames(data) <- paste(data$structureId, data$chainId, sep="_") } ## include only requested terms ## (NOTE: need to modify for future support of 'extra.terms') col.inds <- which(colnames(data) %in% anno.terms.input) data <- data[, col.inds, drop=FALSE] return(data) } ## map a string to JSON-like input parameters .string2json <- function(x) { x <- strsplit(x, split="\\.")[[1]] if(length(x)>1) { paste( paste(x, collapse="{"), paste(rep("}", length(x)-1), collapse=""), sep="") } else if(length(x)==0) { "" } else { x } } ## map from old terms to the new ones .map_terms <- function(x) { switch(x, "structureId" = "entry.id", "chainId" = "polymer_entities.polymer_entity_instances.rcsb_polymer_entity_instance_container_identifiers.auth_asym_id", "macromoleculeType" = "polymer_entities.polymer_entity_instances.polymer_entity.entity_poly.rcsb_entity_polymer_type", "chainLength" = "polymer_entities.polymer_entity_instances.polymer_entity.entity_poly.rcsb_sample_sequence_length", "experimentalTechnique" = "rcsb_entry_info.experimental_method", "resolution" = "rcsb_entry_info.resolution_combined", "scopDomain" = paste( "polymer_entities.polymer_entity_instances.rcsb_polymer_instance_feature", c("name", "type"), sep="."), "pfam" = paste( "polymer_entities.polymer_entity_instances.polymer_entity.rcsb_polymer_entity_annotation", c("annotation_id", "name", "type"), sep="."), "ligandChainId" = "nonpolymer_entities.nonpolymer_entity_instances.rcsb_nonpolymer_entity_instance_container_identifiers.auth_asym_id", "ligandId" = "nonpolymer_entities.nonpolymer_entity_instances.nonpolymer_entity.nonpolymer_comp.chem_comp.id", "ligandName" = "nonpolymer_entities.nonpolymer_entity_instances.nonpolymer_entity.nonpolymer_comp.chem_comp.name", "source" = "polymer_entities.polymer_entity_instances.polymer_entity.rcsb_entity_source_organism.ncbi_scientific_name", "structureTitle" = "struct.title", "citation" = paste("rcsb_primary_citation", c( "rcsb_authors", "rcsb_journal_abbrev", "year"), sep="."), "rObserved" = "refine.ls_R_factor_obs", "rFree" = "refine.ls_R_factor_R_free", "rWork" = "refine.ls_R_factor_R_work", "spaceGroup" = "symmetry.space_group_name_H_M" ) } ## Return a formatted table/data.frame .format_tbl <- function(x, query.ids, anno.terms, unique=FALSE) { if(!"data" %in% names(x)) { stop("No data retrieved") } x <- x$data$entries pdb.ids <- sapply(x, function(x) x$entry$id) chain.ids <- lapply(x, function(x) { lapply(x$polymer_entities, function(y) { sapply(y$polymer_entity_instances, function(z) { id <- z$rcsb_polymer_entity_instance_container_identifiers$auth_asym_id if(is.null(id)) { id<- as.character(NA) } id }) }) }) nchains <- sapply(chain.ids, function(x) length(unlist(x))) nchains.entity <- sapply(chain.ids, sapply, length) # ids <- paste(rep(pdb.ids, nchains), unlist(chain.ids), sep="_") ids <- rep(pdb.ids, nchains) chainId <- unlist(chain.ids) out <- data.frame(structureId=ids, chainId=chainId, stringsAsFactors=FALSE) if("chainLength" %in% anno.terms) { cl <- lapply(x, function(x) { lapply(x$polymer_entities, function(y) { sapply(y$polymer_entity_instances, function(z) { cl <- z$polymer_entity$entity_poly$rcsb_sample_sequence_length if(is.null(cl)) { cl <- as.integer(NA) } cl }) }) }) # cl <- rep(unlist(cl), unlist(nchains.entity)) cl <- unlist(cl) out$chainLength <- cl } if("experimentalTechnique" %in% anno.terms) { em <- sapply(x, function(x) { em <- x$rcsb_entry_info$experimental_method if(is.null(em)) { em <- as.character(NA) } em }) em <- rep(em, nchains) out$experimentalTechnique <- em } if("resolution" %in% anno.terms) { reso <- sapply(x, function(x) { reso <- x$rcsb_entry_info$resolution_combined[[1]] if(is.null(reso)) { reso <- as.numeric(NA) } reso }) reso <- rep(reso, nchains) out$resolution <- reso } if("macromoleculeType" %in% anno.terms) { moltype <- lapply(x, function(x) { lapply(x$polymer_entities, function(y) { sapply(y$polymer_entity_instances, function(z) { typ <- z$polymer_entity$entity_poly$rcsb_entity_polymer_type if(is.null(typ)) { typ <- as.character(NA) } typ }) }) }) # moltype <- rep(unlist(moltype), unlist(nchains.entity)) moltype <- unlist(moltype) out$macromoleculeType <- moltype } if("scopDomain" %in% anno.terms) { scop <- lapply(x, function(x) { lapply(x$polymer_entities, function(y) { sapply(y$polymer_entity_instances, function(z) { types <- sapply(z$rcsb_polymer_instance_feature, "[[", "type") s <- z$rcsb_polymer_instance_feature[[which(types=="SCOP")[1]]]$name if(is.null(s)) { s <- as.character(NA) } s }) }) }) scop <- unlist(scop) out$scopDomain <- scop } if("pfam" %in% anno.terms) { pfam <- lapply(x, function(x) { lapply(x$polymer_entities, function(y) { sapply(y$polymer_entity_instances, function(z) { types <- sapply(z$polymer_entity$rcsb_polymer_entity_annotation, "[[", "type") p <- z$polymer_entity$rcsb_polymer_entity_annotation[[which(types=="Pfam")[1]]]$name if(is.null(p)) { p <- as.character(NA) } p }) }) }) pfam <- unlist(pfam) out$pfam <- pfam } if("ligandChainId" %in% anno.terms) { lch <- lapply(x, function(x) { unlist( lapply(x$nonpolymer_entities, function(y) { sapply(y$nonpolymer_entity_instances, function(z) { id <- z$rcsb_nonpolymer_entity_instance_container_identifiers$auth_asym_id if(is.null(id)) { id <- as.character(NA) } id }) }) ) }) } if("ligandId" %in% anno.terms) { lid <- lapply(1:length(x), function(i) { x <- x[[i]] lch <- lch[[i]] chain.ids <- unlist(chain.ids[[i]]) id <- unlist( lapply(x$nonpolymer_entities, function(y) { sapply(y$nonpolymer_entity_instances, function(z) { id <- z$nonpolymer_entity$nonpolymer_comp$chem_comp$id if(is.null(id)) { id <- as.character(NA) } id }) }) ) id <- tapply(id, lch, function(x) { count <- table(x) x <- unique(x) count <- count[x] x[count>1] <- paste(x[count>1], " (", count[count>1], ")", sep="") paste(x, collapse=",") }) id <- id[chain.ids] }) lid <- unlist(lid) out$ligandId <- lid } if("ligandName" %in% anno.terms) { lname <- lapply(1:length(x), function(i) { x <- x[[i]] lch <- lch[[i]] chain.ids <- unlist(chain.ids[[i]]) nam <- unlist( lapply(x$nonpolymer_entities, function(y) { sapply(y$nonpolymer_entity_instances, function(z) { nam <- z$nonpolymer_entity$nonpolymer_comp$chem_comp$name if(is.null(nam)) { nam <- as.character(NA) } nam }) }) ) nam <- tapply(nam, lch, function(x) { count <- table(x) x <- unique(x) count <- count[x] x[count>1] <- paste(x[count>1], " (", count[count>1], ")", sep="") paste(x, collapse=",") }) nam <- nam[chain.ids] }) lname <- unlist(lname) out$ligandName <- lname } if("source" %in% anno.terms) { src <- lapply(x, function(x) { lapply(x$polymer_entities, function(y) { sapply(y$polymer_entity_instances, function(z) { src <- sapply(z$polymer_entity$rcsb_entity_source_organism, function(z2) { src <- z2$ncbi_scientific_name if(is.null(src)) { src <- as.character(NA) } src }) if(length(src)>1) { paste(src, collapse="/") } else { src } }) }) }) # src <- rep(unlist(src), unlist(nchains.entity)) src <- unlist(src) out$source <- src } if("structureTitle" %in% anno.terms) { title <- sapply(x, function(x) { title <- x$struct$title if(is.null(title)) { title <- as.character(NA) } title }) title <- rep(title, nchains) out$structureTitle <- title } if("citation" %in% anno.terms) { citation <- sapply(x, function(x) { aut <- x$rcsb_primary_citation$rcsb_authors if(!is.null(aut) && length(aut)>1) { aut <- paste(aut[[1]], ", et al.", sep="") } jrnl <- x$rcsb_primary_citation$rcsb_journal_abbrev year <- x$rcsb_primary_citation$year if(!is.null(year)) { year <- paste("(", year, ")", sep="") } citation <- paste(aut, jrnl, year) if(length(citation)==0) { citation <- as.character(NA) } citation }) citation <- rep(citation, nchains) out$citation <- citation } if("rObserved" %in% anno.terms) { robs <- sapply(x, function(x) { robs <- x$refine[[1]]$ls_R_factor_obs if(is.null(robs)) { robs <- as.numeric(NA) } robs }) robs <- rep(robs, nchains) out$rObserved <- robs } if("rFree" %in% anno.terms) { rfree <- sapply(x, function(x) { rfree <- x$refine[[1]]$ls_R_factor_R_free if(is.null(rfree)) { rfree <- as.numeric(NA) } rfree }) rfree <- rep(rfree, nchains) out$rFree <- rfree } if("rWork" %in% anno.terms) { rwork <- sapply(x, function(x) { rwork <- x$refine[[1]]$ls_R_factor_R_work if(is.null(rwork)) { rwork <- as.numeric(NA) } rwork }) rwork <- rep(rwork, nchains) out$rWork <- rwork } if("spaceGroup" %in% anno.terms) { sg <- sapply(x, function(x) { sg <- x$symmetry$space_group_name_H_M if(is.null(sg)) { sg <- as.character(NA) } sg }) sg <- rep(sg, nchains) out$spaceGroup <- sg } # Filter the table query.ids <- sub("\\.", "_", query.ids) ## allow PDBId.chainId inds <- lapply(query.ids, function(x) { if(nchar(x)==4) { which(out$structureId %in% x) } else { which(paste(out$structureId, out$chainId, sep="_") %in% x) } }) chk <- sapply(inds, length) if(any(chk==0)) { warning(paste("Annotation data could not be found for PDB ids:\n ", paste(unique(query.ids[chk==0]), collapse=", "))) } query.ids <- query.ids[chk>0] out <- out[unique(unlist(inds)), , drop=FALSE] if(unique) { # Fold the table based on PDB IDs out <- tapply(1:nrow(out), factor(out$structureId, levels=unique(out$structureId)), function(i){ out <- out[i, , drop=FALSE] labs <- colnames(out); names(labs) <- labs cols <- lapply(labs, function(j) { if(j %in% c("chainId", "macromoleculeType", "chainLength", "scopDomain", "pfam", "ligandId", "ligandName", "source")) { paste(out[, j], collapse=";") } else { out[1, j] } }) as.data.frame(cols, stringsAsFactors=FALSE) }, simplify=FALSE) out <- do.call(rbind, out) rownames(out) <- NULL } req.terms <- c("structureId", "chainId") out <- out[, c(req.terms, setdiff(anno.terms, c(req.terms, "ligandChainId"))), drop=FALSE] out } bio3d/R/atom2mass.R0000644000176200001440000000235314046015221013502 0ustar liggesusersatom2mass <- function(...) UseMethod("atom2mass") atom2mass.default <- function(x, mass.custom=NULL, elety.custom=NULL, grpby=NULL, rescue=TRUE, ...){ if(!is.null(mass.custom)) { if(!all(c("symb","mass") %in% names(mass.custom))) stop("'mass.custom' must contains 'symb' and 'mass' components") inds <- unlist(lapply(mass.custom, is.factor)) mass.custom[inds] <- lapply(mass.custom[inds], as.character) } elements <- rbind(mass.custom[,c("symb","mass")], elements[,c("symb","mass")]) symb <- atom2ele.default(x, elety.custom, rescue, ...) M <- elements[match(symb, elements[,"symb"]), "mass"] if(any(is.na(M))) stop(paste("\n\tatom2mass: mass of element '", symb[is.na(M)], "' unknown", sep="")) if(!is.null(grpby)) { if(length(grpby) != length(M)) warning("'grpby' as been recycled") M <- unlist(lapply(split(M, grpby), sum)) } return(M) } atom2mass.pdb <- function(pdb, inds=NULL, mass.custom=NULL, elety.custom=NULL, grpby=NULL, rescue=TRUE, ...){ if(!is.null(inds)) pdb <- trim.pdb(pdb, inds) atom.names <- pdb$atom[,"elety"] M <- atom2mass.default(atom.names, mass.custom, elety.custom, grpby, rescue, ...) return(M) } bio3d/R/print.prmtop.R0000644000176200001440000000464714046015221014260 0ustar liggesusersprint.prmtop <- function(x, printseq=TRUE, ...) { if(!is.null(x$SOLVENT_POINTER)) sbox <- TRUE else sbox <- FALSE cn <- class(x) natom <- x$POINTERS[1] ##nca <- length(which(x$ATOM_NAME=="CA" & x$AMBER_ATOM_TYPE=="CX")) if(sbox) { nres.total <- x$POINTERS[12] nres.solute <- x$SOLVENT_POINTER[1] nmol.total <- x$SOLVENT_POINTER[2] nmol.solute <- x$SOLVENT_POINTER[3]-1 natom.per.mol <- x$ATOMS_PER_MOLECULE[1:nmol.solute] box.dim <- x$BOX_DIMENSIONS } else { nres.total <- x$POINTERS[12] nres.solute <- nres.total nmol.total <- length(which(x$ATOM_NAME=="OXT")) nmol.solute <- nmol.total } cat("\n Call:\n ", paste(deparse(x$call), sep = "\n", collapse = "\n"), "\n\n", sep = "") cat(" Class:\n ", paste(cn, collapse=", "), "\n\n", sep = "") cat(" System information:", "\n") cat(" Total number of atoms: ", natom, "\n", sep="") if(nres.solute!=nres.total) { cat(" Solute residues: ", nres.solute, " (of ", nres.total, ")\n", sep="") cat(" Solute molecules: ", nmol.solute, " (of ", nmol.total, ")\n", sep="") } else { cat(" Solute residues: ", nres.solute, "\n", sep="") cat(" Solute molecules: ", nmol.solute, "\n", sep="") } if(sbox) cat(" Box dimensions: ", paste(round(box.dim,2), collapse=" x "), "\n", sep="") if(printseq) { aa <- aa321(x$RESIDUE_LABEL[1:nres.solute]) if(nres.solute > 225) { ## Trim long sequences before output aa <- c(aa[1:225], "......", aa[(nres.solute-3):nres.solute]) } aa <- paste(" ", gsub(" ","", strwrap( paste(aa,collapse=" "), width=120, exdent=0) ), collapse="\n") cat("\n") cat(" Sequence:\n", aa, "\n", sep="") ## other residues if(nres.total>nres.solute) { unq.res <- unique(x$RESIDUE_LABEL[(nres.solute+1):length(x$RESIDUE_LABEL)]) unq.res <- paste(" ", gsub(" ","", strwrap( paste(unq.res,collapse=" "), width=120, exdent=0) ), collapse="\n") cat("\n") cat(" Residues in solvent:\n", unq.res, "\n", sep="") } } cat("\n") #i <- paste( attributes(x)$names, collapse=", ") #cat(strwrap(paste(" + attr:",i,"\n"),width=45, exdent=8), sep="\n") invisible( c(natom=natom, nres=nres.total, nres.solute=nres.solute, nmol=nmol.total, nmol.solute=nmol.solute) ) } bio3d/R/community.tree.R0000644000176200001440000000375014046015221014560 0ustar liggesuserscommunity.tree <- function(x, rescale=FALSE){ ## Check for presence of igraph package oops <- requireNamespace("igraph", quietly = TRUE) if (!oops) { stop("igraph package missing: Please install, see: ?install.packages") } if(!inherits(x, "cna")){ stop("Input should be a 'cna' class object as obtained from cna()") } rescaling <- function(membership){ original.comms <- unique(membership) new.comms <- c(1:length(unique(membership))) a<-1 ## index to keep track of community number for(j in 1:length(membership)){ membership[membership == original.comms[a]] <- new.comms[a] a <- a +1 } return(membership) } num.of.nodes <- length(igraph::V(x$network)) membership <- c(1:num.of.nodes) merge.table <- x$communities$merges membership.table <- matrix(NA, nrow=dim(merge.table)[1]+1, ncol=num.of.nodes) membership.table[1,] <- c(1:num.of.nodes) num.of.comms <- c(num.of.nodes, rep(NA,dim(merge.table)[1])) for(i in 1:dim(merge.table)[1]){ comm.number <- num.of.nodes + i if(merge.table[i,1] < num.of.nodes){ membership[merge.table[i,1]] <- comm.number } else{ change.inds <- which(membership == merge.table[i,1]) membership[change.inds] <- comm.number } if(merge.table[i,2] < num.of.nodes){ membership[merge.table[i,2]] <- comm.number } else{ change.inds <- which(membership == merge.table[i,2]) membership[change.inds] <- comm.number } membership.table[i+1,] <- membership ## i+1 because the first line is where each node forms a separated community (it will match also the modularity values) num.of.comms[i+1] <- length(unique(membership)) } ## Rescale community number starting from 1 if(rescale){ membership.table <- t(apply(membership.table,1,rescaling)) } output <- list("tree" = membership.table, "modularity" = x$communities$modularity, "num.of.comms" = num.of.comms) return(output) } bio3d/R/fit.xyz.R0000644000176200001440000001722714046015221013215 0ustar liggesusers"fit.xyz" <- function(fixed, mobile, fixed.inds = NULL, mobile.inds = NULL, verbose = FALSE, prefix = "", pdbext = "", outpath = "fitlsq", full.pdbs=FALSE, ncore=1, nseg.scale=1, # to resolve the memory problem in using multicore ...) { # Parallelized by parallel package (Tue Dec 11 17:41:08 EST 2012) ncore <- setup.ncore(ncore) if(ncore > 1) { # Issue of serialization problem # Maximal number of cells of a double-precision matrix # that each core can serialize: (2^31-1-61)/8 R_NCELL_LIMIT_CORE = 2.68435448e8 R_NCELL_LIMIT = ncore * R_NCELL_LIMIT_CORE if(nseg.scale < 1) { warning("nseg.scale should be 1 or a larger integer\n") nseg.scale=1 } } ### Addation (Mon Jul 23 17:26:16 PDT 2007) if( is.null(fixed.inds) && is.null(mobile.inds) ) { if(is.list(mobile)) { fixed.inds <- intersect(which(!is.gap(fixed)), gap.inspect(mobile$xyz)$f.inds ) } else { fixed.inds <- intersect(which(!is.gap(fixed)), gap.inspect(mobile)$f.inds ) } mobile.inds <- fixed.inds warning(paste("No fitting indices provided, using the", length(fixed.inds)/3, "non NA positions\n")) } if (is.null(fixed.inds)) fixed.inds=which(!is.gap(fixed)) if (is.null(mobile.inds)) mobile.inds=gap.inspect(mobile)$f.inds if (length(fixed.inds) != length(mobile.inds)) stop("length of 'fixed.inds' != length of 'mobile.inds'") # if(!is.xyz(fixed) || !is.numeric(fixed)) if(!is.numeric(fixed)) stop("input 'fixed' should be a numeric 'xyz' vector or matrix") if(is.vector(mobile)) { # INPUT is a single vector if(!is.numeric(mobile)) stop("input 'mobile' should be numeric") if( any(is.na(fixed[fixed.inds])) || any(is.na(mobile[mobile.inds])) ) { stop(" NA elements selected for fitting (check indices)") } fit <- rot.lsq(xx=mobile, yy=fixed, xfit=mobile.inds, yfit=fixed.inds, verbose=verbose) return(as.xyz(fit)) } else { if(is.list(mobile)) { # INPUT is a list object if(!is.numeric(mobile$xyz)) stop("non numeric input 'mobile$xyz'") if( any(is.na(fixed[fixed.inds])) || any(is.na(mobile$xyz[,mobile.inds])) ) { stop(" NA elements selected for fitting (check indices)") } if(ncore>1 && is.matrix(mobile$xyz) ) { # Parallelized RLIMIT = floor(R_NCELL_LIMIT/ncol(mobile$xyz)) nDataSeg = floor((nrow(mobile$xyz)-1)/RLIMIT)+1 nDataSeg = floor(nDataSeg * nseg.scale) lenSeg = floor(nrow(mobile$xyz)/nDataSeg) fit = vector("list", nDataSeg) for(i in 1:nDataSeg) { istart = (i-1)*lenSeg + 1 iend = if(i1) mylapply <- mclapply # for(i in 1:length(mobile$id)) { mylapply(1:length(mobile$id), function(i) { ### pdb <- read.pdb( paste(pdb.path,"/",mobile$id[i],pdbext,sep=""), ... ) pdb <- read.pdb( full.files[i], ... ) res.resno <- mobile$resno[i,core.inds.atom] res.chains <- mobile$chain[i,core.inds.atom] chains <- unique(res.chains[!is.na(res.chains)]) if(length(chains)==0) { ##string <- paste("///", ## paste(mobile$resno[i,core.inds.atom],collapse = ","), ## "///CA/", sep="") inds <- atom.select(pdb, resno=res.resno, elety="CA", verbose=verbose)$xyz } else { if(length(chains)==1) { #string <- paste("//",chains,"/", # paste(res.resno, collapse = ","), # "///CA/", sep="") inds <- atom.select(pdb, resno=res.resno, chain=chains, elety="CA", verbose=verbose)$xyz } else { # indices for each chain inds <- NULL for(j in 1:length(chains)) { #string <- paste("//",chains[j],"/", # paste(res.resno[ res.chains==chains[j] ], # collapse = ","), # "///CA/", sep="") inds <- c(inds, atom.select(pdb, resno=res.resno[ res.chains==chains[j] ], chain=chains[j], elety="CA", verbose=verbose)$xyz) } } } pdb.xyz <- pdb$xyz #if (het) # pdb.xyz <- c(pdb.xyz, # as.numeric(t(pdb$het[,c("x","y","z")]))) if(length(inds) > length(fixed.inds)) { warning("Looks like we have a multi-chain pdb with no chain id: ignoring extra indices\n\t") inds <- inds[1:length(fixed.inds)] } xyz.fit <- rot.lsq(xx=pdb.xyz, yy=fixed, xfit=inds, # sort!! yfit=fixed.inds) write.pdb(xyz = xyz.fit, pdb = pdb, ##het = het, file = file.path(outpath, paste(basename(mobile$id[i]), "_flsq.pdb",sep = "")) ) return (NULL) } ) } return(as.xyz(fit)) } else { if(full.pdbs) warning("Need 'mobile' list object for 'full.pdbs=TRUE'") if(is.matrix(mobile)) { # INPUT is a matrix if(!is.numeric(mobile)) stop("input 'mobile' should be numeric") if( any(is.na(fixed[fixed.inds])) || any(is.na(mobile[,mobile.inds])) ) { stop("error: NA elements selected for fitting") } if(ncore > 1) { # Parallelized RLIMIT = floor(R_NCELL_LIMIT/ncol(mobile)) nDataSeg = floor((nrow(mobile)-1)/RLIMIT)+1 nDataSeg = floor(nDataSeg * nseg.scale) lenSeg = floor(nrow(mobile)/nDataSeg) fit = vector("list", nDataSeg) for(i in 1:nDataSeg) { istart = (i-1)*lenSeg + 1 iend = if(i= -1.0E-12]<-1.0E-12 # form A A <- prj$vectors # make explicitly rh system # A[,3] <- v3cross(A[,1],A[,2]) # inline the cross-product function call. b<-A[,1]; c <- A[,2] A[1,3] <- (b[2] * c[3]) - (b[3] * c[2]) A[2,3] <- (b[3] * c[1]) - (b[1] * c[3]) A[3,3] <- (b[1] * c[2]) - (b[2] * c[1]) # form B (==RA) (Equation 8) B <- R %*% A # normalize B # B <- sweep(B,2,sqrt(apply(B^2,2,sum)),"/") B <- sweep(B,2,sqrt(prj$values),"/") # make explicitly rh system # B[,3] <- v3cross(B[,1],B[,2]) # inline the cross-product function call. b<-B[,1]; c <- B[,2] B[1,3] <- (b[2] * c[3]) - (b[3] * c[2]) B[2,3] <- (b[3] * c[1]) - (b[1] * c[3]) B[3,3] <- (b[1] * c[2]) - (b[2] * c[1]) # form U (==Ba) (Equation 7) # U is the rotation matrix U <- B %*% t(A) # here we apply transformation matrix to *all* elements of xx # rotate xx (Uxx) xx <- U %*% xx if(verbose) { ## also apply it to the subset, in order to compute residual x <- U %*% x ## estimate of residuals frmsd <- sqrt(sum((x-y)^2)/dim(y)[2]) cat("#rmsd= ",round(frmsd,6),"\n") } # fest <- iest - sum(sqrt(prj$values)) # print(sqrt((2*fest)/dim(y)[2])) # return xx centred on y xx <- sweep(xx,1,ybar,"+") as.vector(xx) } bio3d/R/dssp.pdb.R0000644000176200001440000002742514046015221013320 0ustar liggesusers## NOTE: ## We do not support old-version DSSP any longer ## Please update your DSSP program to the newest version "dssp.pdb" <- function (pdb, exefile = "dssp", resno=TRUE, full=FALSE, verbose=FALSE, ...) { ## Log the call cl <- match.call() ## determine path to exefile os1 <- Sys.info()["sysname"] exefile <- .get.exepath(exefile) message(exefile) success <- .test.exefile(exefile) if(!success) { stop(paste("Launching external program 'dssp' (or 'mkdssp') failed\n", " make sure '", exefile, "' is in your search path", sep="")) } ## check atom composition - need backbone atoms to continue SSE analysis checkatoms <- TRUE if(checkatoms) { ## check on backbone atoms inds <- atom.select(pdb, "backbone", verbose=verbose) tmp <- trim.pdb(pdb, inds) resid <- paste(tmp$atom$resno, tmp$atom$chain, sep="-") musthave <- c("C", "CA", "N", "O") incomplete <- sapply(unique(resid), function(x) { inds <- which(resid==x) elety <- sort(tmp$atom$elety[inds]) if(!all(musthave %in% elety)) return(TRUE) else return(FALSE) }) if(all(incomplete)) stop("No residues found with a complete set of backbone atoms") if(any(incomplete)) warning(paste("Residues with missing backbone atoms detected:", paste(unique(resid)[incomplete], collapse=", "), collapse=" ")) ## check for non-protein atoms inds <- atom.select(pdb, "protein", verbose=verbose, inverse=TRUE) if(length(inds$atom) > 0) warning(paste("Non-protein residues detected in input PDB:", paste(unique(pdb$atom$resid[ inds$atom ]), collapse=", "))) } infile <- tempfile() outfile <- tempfile() write.pdb(pdb, file = infile) cmd <- paste(exefile, infile, outfile) if(verbose) cat(paste("Running command:\n ", cmd , "\n")) if(os1 == "Windows") { status <- shell(paste(shQuote(exefile), infile, outfile), ignore.stderr = !verbose, ignore.stdout = !verbose) } else { status <- system(cmd, ignore.stderr = !verbose, ignore.stdout = !verbose) } if(!(status %in% c(0,1))) { stop(paste("An error occurred while running command\n '", cmd, "'", sep="")) } ## ## For Debug (Tue Aug 3 18:22:11 PDT 2010) ## -- Following multi chain error report from Heiko Strathmann ## outfile <- "2jk2.dssp" ## outfile <- "4q21.dssp" ## trim <- function(s) { s <- sub("^ +", "", s) s <- sub(" +$", "", s) s[(s == "")] <- NA s } split.line <- function(x, split=" ") { tmp <- unlist(strsplit(x, split=split)) inds <- which(tmp!="") return(trim(tmp[inds])) } raw.lines <- readLines(outfile) unlink(c(infile, outfile)) type <- substring(raw.lines, 1, 3) raw.lines <- raw.lines[-(1:which(type == " #"))] ## delete chain breaking lines aa <- substring(raw.lines, 14, 14) if(any(aa == "!")) raw.lines <- raw.lines[-which(aa == "!")] cha <- substring(raw.lines, 12, 12) sse <- substring(raw.lines, 17, 17) res.name <- substring(raw.lines, 14, 14) res.id <- as.numeric(substring(raw.lines, 1, 5)) ## dssp residue IDs res.num <- as.numeric(substring(raw.lines, 6, 10)) ## Residue numbers res.insert <- substring(raw.lines, 11, 11) ## Insertion codes res.ind <- 1:length(res.num) ## Internal indices ## names for output sse vector ins <- trim(res.insert) ins[ ins=="" ] = NA names(sse) <- paste(res.num, cha, ins, sep="_") if(any(res.insert!=" ")) { if(resno) { warning("Insertions are found in PDB: Residue numbers may be incorrect. Try again with resno=FALSE") } else { ii <- diff(res.num) ii[ii==0] <- 1 #Consecutive numbers at insertion residues ii[ii<0] <- 2 #Jumps at possible chain termination res.num <- res.num[1] + c(0, cumsum(ii)) } } if(full) { ## Difference between sse res id and internal res indices diff <- res.id - res.ind names(diff) <- res.id ## Beta bridge partner residue ids bp1 <- as.numeric(substring(raw.lines, 26, 29)) bp2 <- as.numeric(substring(raw.lines, 30, 33)) bp1[bp1==0] <- NA bp2[bp2==0] <- NA ## Convert from dssp SSE residue IDs to internal residue indices bp1[ !is.na(bp1) ] <- as.vector(bp1[ !is.na(bp1) ] - diff[as.character(bp1[!is.na(bp1)])]) bp2[ !is.na(bp2) ] <- as.vector(bp2[ !is.na(bp2) ] - diff[as.character(bp2[!is.na(bp2)])]) ## H-bond records hbonds <- split.line(split.line(substring(raw.lines, 40, 83), split=","), split=" ") hbonds <- matrix(as.numeric(hbonds), ncol=8, byrow=TRUE) hbonds <- as.data.frame(hbonds) for(i in seq(1,7,by=2)) { hbonds[[i]][ which(hbonds[[i]]==0) ] <- NA ## Convert from relative to absolute residue numbering hmm <- res.id + hbonds[[i]] ## Convert from dssp SSE residue IDs to internal residue indices hbonds[[i]][ !is.na(hmm) ] <- as.vector(hmm[ !is.na(hmm) ] - diff[as.character(hmm[!is.na(hmm)])]) } ## Bind bridge pair and H-bond records to one matrix hbonds <- cbind(bp1, bp2, hbonds) cnames <- c("BP1", "BP2", "NH-O.1", "E1", "O-HN.1", "E2", "NH-O.2", "E3", "O-HN.2", "E4") colnames(hbonds) <- cnames if(resno) { ## 2 col matrix mapping the res.ind's to res.num and chain id tmp.map <- cbind(res.num, cha) row.names(tmp.map) <- res.ind ## Add an additional matrix holding the Chain IDs hbonds <- cbind(hbonds, data.frame(matrix(NA, ncol=6, nrow=nrow(tmp.map)), stringsAsFactors=FALSE)) colnames(hbonds) <- c(cnames, "ChainBP1", "ChainBP2", "Chain1", "Chain2", "Chain3", "Chain4") ## Add chain IDs for each entry tmp.inds <- which(!is.na(hbonds[,"BP1"])) tmp.names <- as.character(hbonds[tmp.inds,"BP1"]) hbonds[tmp.inds,"BP1"] <- as.numeric(tmp.map[tmp.names, "res.num"]) hbonds[tmp.inds,"ChainBP1"] <- tmp.map[tmp.names, "cha"] tmp.inds <- which(!is.na(hbonds[,"BP2"])) tmp.names <- as.character(hbonds[tmp.inds,"BP2"]) hbonds[tmp.inds,"BP2"] <- as.numeric(tmp.map[tmp.names, "res.num"]) hbonds[tmp.inds,"ChainBP2"] <- tmp.map[tmp.names, "cha"] tmp.inds <- which(!is.na(hbonds[,"NH-O.1"])) tmp.names <- as.character(hbonds[tmp.inds,"NH-O.1"]) hbonds[tmp.inds,"NH-O.1"] <- as.numeric(tmp.map[tmp.names, "res.num"]) hbonds[tmp.inds,"Chain1"] <- tmp.map[tmp.names, "cha"] tmp.inds <- which(!is.na(hbonds[,"O-HN.1"])) tmp.names <- as.character(hbonds[tmp.inds,"O-HN.1"]) hbonds[tmp.inds,"O-HN.1"] <- as.numeric(tmp.map[tmp.names, "res.num"]) hbonds[tmp.inds,"Chain2"] <- tmp.map[tmp.names, "cha"] tmp.inds <- which(!is.na(hbonds[,"NH-O.2"])) tmp.names <- as.character(hbonds[tmp.inds,"NH-O.2"]) hbonds[tmp.inds,"NH-O.2"] <- as.numeric(tmp.map[tmp.names, "res.num"]) hbonds[tmp.inds,"Chain3"] <- tmp.map[tmp.names, "cha"] tmp.inds <- which(!is.na(hbonds[,"O-HN.2"])) tmp.names <- as.character(hbonds[tmp.inds,"O-HN.2"]) hbonds[tmp.inds,"O-HN.2"] <- as.numeric(tmp.map[tmp.names, "res.num"]) hbonds[tmp.inds,"Chain4"] <- tmp.map[tmp.names, "cha"] ## Set row names to "RESNUM-CHAINID" row.names(hbonds) <- apply(tmp.map, 1, paste, collapse="-") } } else { hbonds <- NULL } # column numbers of phi and psi are different between # the old and new versions of DSSP phi <- as.numeric(substring(raw.lines, 104, 109)) psi <- as.numeric(substring(raw.lines, 110, 115)) acc <- as.numeric(substring(raw.lines, 35, 38)) h.res <- bounds(res.num[which(sse == "H")], pre.sort=FALSE) g.res <- bounds(res.num[which(sse == "G")], pre.sort=FALSE) e.res <- bounds(res.num[which(sse == "E")], pre.sort=FALSE) t.res <- bounds(res.num[which(sse == "T")], pre.sort=FALSE) h.ind <- h.res; g.ind <- g.res e.ind <- e.res; t.ind <- t.res if(length(h.res) > 0) { res.ind <- which(sse == "H") h.ind[, "end"] <- res.ind[cumsum(h.res[, "length"])] h.ind[, "start"] <- h.ind[, "end"] - h.res[, "length"] + 1 } if(length(g.res) > 0) { res.ind <- which(sse == "G") g.ind[, "end"] <- res.ind[cumsum(g.res[, "length"])] g.ind[, "start"] <- g.ind[, "end"] - g.res[, "length"] + 1 } if(length(e.res) > 0) { res.ind <- which(sse == "E") e.ind[, "end"] <- res.ind[cumsum(e.res[, "length"])] e.ind[, "start"] <- e.ind[, "end"] - e.res[, "length"] + 1 } if(length(t.res) > 0) { res.ind <- which(sse == "T") t.ind[, "end"] <- res.ind[cumsum(t.res[, "length"])] t.ind[, "start"] <- t.ind[, "end"] - t.res[, "length"] + 1 } if(!resno) { h.res <- h.ind; g.res <- g.ind e.res <- e.ind; t.res <- t.ind } sheet = list(start=NULL, end=NULL, length=NULL, chain=NULL) helix = list(start=NULL, end=NULL, length=NULL, chain=NULL, type=NULL) turn = sheet ## ToDo: Add "type" for turns and strands too... if(length(h.res)>1) { # if(is.null(nrow(h.res))) # h.s <- as.matrix(t(h.res)) helix$start = c(helix$start,h.res[, "start"]) helix$end = c(helix$end, h.res[, "end"]) helix$length = c(helix$length, h.res[, "length"]) helix$chain = c(helix$chain, cha[h.ind[, "start"]]) helix$type = c(helix$type, sse[h.ind[, "start"]]) } if(length(g.res)>1) { # if(is.null(nrow(g.res))) # g.s <- as.matrix(t(g.res)) helix$start = c(helix$start,g.res[, "start"]) helix$end = c(helix$end, g.res[, "end"]) helix$length = c(helix$length, g.res[, "length"]) helix$chain = c(helix$chain, cha[g.ind[, "start"]]) helix$type = c(helix$type, sse[g.ind[, "start"]]) } if(length(helix$start) > 0) helix <- lapply(helix, function(x) {names(x) <- 1:length(helix$start); return(x)}) if(length(e.res)>1) { # if(is.null(nrow(e.res))) # e.s <- as.matrix(t(e.res)) sheet$start = c(sheet$start,e.res[, "start"]) sheet$end = c(sheet$end, e.res[, "end"]) sheet$length = c(sheet$length, e.res[, "length"]) sheet$chain = c(sheet$chain, cha[e.ind[, "start"]]) } if(length(sheet$start) > 0) sheet <- lapply(sheet, function(x) {names(x) <- 1:length(sheet$start); return(x)}) if(length(t.res)>1) { # if(is.null(nrow(t.res))) # t.s <- as.matrix(t(t.res)) turn$start = c(turn$start,t.res[, "start"]) turn$end = c(turn$end, t.res[, "end"]) turn$length = c(turn$length, t.res[, "length"]) turn$chain = c(turn$chain, cha[t.ind[, "start"]]) } if(length(turn$start) > 0) turn <- lapply(turn, function(x) {names(x) <- 1:length(turn$start); return(x)}) out <- list(helix = helix, sheet = sheet, hbonds = hbonds, turn = turn, phi = phi, psi = psi, acc = acc, sse = sse, call=cl) class(out) <- "sse" return(out) } bio3d/R/nma.pdb.R0000644000176200001440000000532114046015221013111 0ustar liggesusers"nma.pdb" <- function(pdb, inds=NULL, ff='calpha', pfc.fun=NULL, mass=TRUE, temp=300.0, keep=NULL, hessian=NULL, outmodes=NULL, ... ) { ## Log the call cl <- match.call() if(!is.pdb(pdb)) stop("please provide a 'pdb' object as obtained from 'read.pdb()'") if(!is.null(outmodes) & !is.select(outmodes)) stop("provide 'outmodes' as obtained from function atom.select()") ## Prepare PDB ## Take only first frame of multi model PDB files if(nrow(pdb$xyz)>1) { warning("multimodel PDB file detected - using only first frame") pdb$xyz=pdb$xyz[1,, drop=FALSE] } ## Trim to only CA atoms if(is.null(inds)) { ca.inds <- atom.select(pdb, "calpha", verbose=FALSE) pdb.in <- trim.pdb(pdb, ca.inds) } ## or to user selection else { pdb.in <- trim.pdb(pdb, inds) if(!all(pdb.in$atom$elety=="CA")) stop("non-CA atoms detected") } ## Indices for effective hessian if(is.select(outmodes)) { ## re-select since outmodes indices are based on input PDB inc.inds <- .match.sel(pdb, pdb.in, outmodes) pdb.out <- trim.pdb(pdb.in, inc.inds) } else { pdb.out <- pdb.in inc.inds <- atom.select(pdb.in, "all", verbose=FALSE) } ## fetch number of atoms and sequence natoms.in <- ncol(pdb.in$xyz)/3 natoms.out <- ncol(pdb.out$xyz)/3 sequ <- pdb.in$atom$resid if (natoms.in<3) stop("nma: insufficient number of atoms") ## check structure connectivity conn <- inspect.connectivity(pdb.in$xyz) if(!conn) { warning("Possible multi-chain structure or missing in-structure residue(s) present\n", " Fluctuations at neighboring positions may be affected.") } ## Define force field if (is.null(pfc.fun)) { pfc.fun <- load.enmff(ff) } else { ## Use customized force field if(!is.function(pfc.fun)) stop("'pfc.fun' must be a function") } ## Process input arguments args <- .nma.args(pfc.fun=pfc.fun, ...) ## Use aa2mass to fetch residue mass if (mass) { masses.in <- do.call('aa2mass', c(list(pdb=sequ, inds=NULL), args$am.args)) masses.out <- masses.in[ inc.inds$atom ] } ## No mass-weighting else { masses.out <- NULL; } ## NMA hessian hessian <- .nma.hess(pdb.in$xyz, pfc.fun, args=args, hessian=hessian, pdb=pdb.in) ## effective hessian hessian <- .nma.trim.hessian(hessian, inc.inds) ## mass weight hessian if(!is.null(masses.out)) hessian <- .nma.mwhessian(hessian, masses=masses.out) ## diagaonalize - get eigenvectors ei <- .nma.diag(hessian) ## make a NMA object m <- .nma.finalize(ei, xyz=pdb.out$xyz, temp=temp, masses=masses.out, natoms=natoms.out, keep=keep, call=cl) return(m) } bio3d/R/pymol.pdbs.R0000644000176200001440000002156314046015221013667 0ustar liggesusers## takes a vector of residue numbers and generates a string ## e.g. (1,2,3,5,8,9) --> "1-3,5,8-9" .resno2str <- function(res, sep=c("+", "-")) { res <- res[!is.na(res)] if(!length(res)>0){ return(NULL) } else { res1 <- bounds(res) res2 <- paste(res1[,"start"], res1[,"end"], sep=sep[2]) inds <- res1[,"start"] == res1[,"end"] res2[inds] <- res1[inds, "start"] res3 <- paste(res2, collapse=sep[1]) return(res3) } } pymol <- function(...) UseMethod("pymol") pymol.pdbs <- function(pdbs, col=NULL, as="ribbon", file=NULL, type="script", exefile = "pymol", user.vec=NULL, ...) { allowed <- c("session", "script", "launch") if(!type %in% allowed) { stop(paste("input argument 'type' must be either of:", paste(allowed, collapse=", "))) } allowed <- c("ribbon", "cartoon", "lines", "putty") if(!as %in% allowed) { stop(paste("input argument 'as' must be either of:", paste(allowed, collapse=", "))) } if(!is.null(col) & !inherits(col, "core")) { if(length(col) == 1) { allowed <- c("index", "index2", "rmsf", "gaps", "user") if(!col %in% allowed) { stop(paste("input argument 'col' must be either of:", paste(allowed, collapse=", "))) } } else { if(!is.numeric(col)) { stop("col must be a numeric vector with length equal to the number of structures in the input pdbs object") } if(length(col) != length(pdbs$id)) { stop("col must be a vector with length equal to the number of structures in input pdbs") } } } ## output file name if(is.null(file)) { if(type=="session") file <- "R.pse" if(type=="script") file <- "R.pml" } ## Check if the program is executable if(type %in% c("session", "launch")) { ## determine path to exefile exefile1 <- .get.exepath(exefile) ## Check if the program is executable success <- .test.exefile(exefile1) if(!success) { stop(paste("Launching external program failed\n", " make sure '", exefile, "' is in your search path", sep="")) } exefile <- exefile1 } ## add support for "prefix" and "pdbext" dots <- list(...) if("prefix" %in% names(dots)) { pdbs$id <- paste(dots$prefix, pdbs$id, sep="") } if("pdbext" %in% names(dots)) { pdbs$id <- paste(pdbs$id, dots$pdbext, sep="") } ## use temp-dir unless we output a PML script if(type %in% c("session", "launch")) tdir <- tempdir() else tdir <- "." pdbdir <- paste(tdir, "pymol_pdbs", sep="/") if(!file.exists(pdbdir)) dir.create(pdbdir) pmlfile <- tempfile(tmpdir=tdir, fileext=".pml") psefile <- tempfile(tmpdir=tdir, fileext=".pse") ids <- basename.pdb(pdbs$id) ## include stuff in the b-factor column bf <- NULL if(as == "putty") { bf <- rmsf(pdbs$xyz) } else { if(!is.null(col)) { ## RMSF coloring if(col[1] == "rmsf") { bf <- rmsf(pdbs$xyz) } ## color by index of pdbs$ali if(col[1] == "index2") { bf <- 1:ncol(pdbs$ali)/ncol(pdbs$ali) } ## color by user defined vector if(col[1] == "user") { if(is.null(user.vec) || !is.numeric(user.vec) || length(user.vec) != ncol(pdbs$ali)) { stop("User defined color vector must be numeric and the same dimension as pdbs") } bf <- user.vec } } } ## use all all-atom PDBs if they exist if(all(file.exists(pdbs$id))) { allatom <- TRUE files <- pdbs$id ## align all-atom PDBs to pdbs$xyz for(i in 1:length(pdbs$id)) { pdb <- read.pdb(files[i]) sele <- atom.select(pdb, "calpha") gaps <- is.gap(pdbs$xyz[i,]) pdb$xyz <- fit.xyz(pdbs$xyz[i, !gaps], pdb$xyz, fixed.inds = 1:length(pdbs$xyz[i, !gaps]), mobile.inds = sele$xyz) fn <- paste0(pdbdir, "/", ids[i], ".pdb") ## store new b-factor column to PDB tmpbf <- NULL if(!is.null(bf)) { gaps <- is.gap(pdbs$ali[i,]) tmpbf <- pdb$atom$b*0 tmpbf[sele$atom] <- bf[!gaps] } write.pdb(pdb, b=tmpbf, file=fn) files[i] <- fn } } else { ## use pdbs$xyz to build CA-atom PDBs allatom <- FALSE files <- rep(NA, length(pdbs$id)) for(i in 1:length(pdbs$id)) { pdb <- pdbs2pdb(pdbs, inds=i)[[1]] fn <- paste0(pdbdir, "/", ids[i], ".pdb") ## store new b-factor column to PDB tmpbf <- NULL if(!is.null(bf)) { gaps <- is.gap(pdbs$ali[i,]) tmpbf <- bf[!gaps] } write.pdb(pdb=pdb, b=tmpbf, file=fn) files[i] <- fn } } ## load PDBs lines <- rep(NA, 5*length(pdbs$id)) for(i in 1:length(files)) { lines[i] <- paste("load", files[i]) } ## line pointer l <- i ## Structure representation (as) if(as == "putty") { lines[l+1] <- "cartoon putty" lines[l+2] <- "as cartoon" lines[l+3] <- "unset cartoon_smooth_loops" lines[l+4] <- "unset cartoon_flat_sheets" lines[l+5] <- "spectrum b, rainbow" lines[l+6] <- "set cartoon_putty_radius, 0.2" l <- l+6 as <- "cartoon" } if(!allatom) { if(!as %in% c("cartoon", "ribbon")) { warning("'as' set to 'ribbon' for c-alpha only structures") as <- "ribbon" } lines[l+1] <- paste0("set ", as, "_trace_atoms, 1") l <- l+1 } lines[l+1] <- paste("as", as) l <- l+1 ## representation ends ## Coloring if(!is.null(col)) { if(inherits(col, "core")) { core <- col l <- l+1 lines[l] <- "color grey50" for(j in 1:length(files)) { res <- .resno2str(pdbs$resno[j, core$atom]) if(!is.null(res)) { selname <- paste0(ids[j], "-core") lines[l+1] <- paste0("select ", selname, ", ", ids[j], " and resi ", res) lines[l+2] <- paste0("color red, ", selname) l <- l+2 } } } if(col[1] == "gaps") { l <- l+1 lines[l] <- "color grey50" gaps <- gap.inspect(pdbs$ali) for(j in 1:length(files)) { res <- .resno2str(pdbs$resno[j, gaps$t.inds]) if(!is.null(res)) { selname <- paste0(ids[j], "-gap") lines[l+1] <- paste0("select ", selname, ", ", ids[j], " and resi ", res) lines[l+2] <- paste0("color red, ", selname) l <- l+2 } } } if(length(col) > 1 & is.vector(col)) { ## add more colors here cols <- c("grey40", "red", "green", "blue", "cyan", "purple", "yellow", "grey90", "magenta", "orange", "pink", "wheat", "deepolive", "teal", "violet", "limon", "slate", "density", "forest", "smudge", "salmon", "brown") for(j in 1:length(files)) { lines[l+1] <- paste0("color ", cols[col[j]], ", ", ids[j]) l <- l+1 } } ## color by RMSF if(col[1] == "rmsf") { l <- l+1 lines[l] <- "spectrum b, rainbow" } ## color by index of individual structures if(col[1] == "index") { for(i in 1:length(pdbs$id)) { l <- l+1 lines[l] <- paste("spectrum count, rainbow,", ids[i], "and name C*") } } ## color by index of alignment if(col[1] == "index2") { for(i in 1:length(pdbs$id)) { l <- l+1 lines[l] <- paste("spectrum b, rainbow,", ids[i]) } } ## color by user defined vector if(col[1] == "user") { for(i in 1:length(pdbs$id)) { l <- l+1 lines[l] <- paste("spectrum b, rainbow,", ids[i]) } } } ## coloring ends lines[l+1] <- "zoom" l <- l+1 if(type == "session") { lines[l+1] <- paste("save", normalizePath(psefile, winslash='/', mustWork=FALSE)) } lines <- lines[!is.na(lines)] write.table(lines, file=pmlfile, append=FALSE, quote=FALSE, sep="\n", row.names=FALSE, col.names=FALSE) if(type %in% c("session", "launch")) { if(type == "session") args <- "-cq" else args <- "" ## Open pymol cmd <- paste(exefile, args, pmlfile) os1 <- Sys.info()["sysname"] if (os1 == "Windows") { status <- shell(paste(shQuote(exefile), args, pmlfile)) } else { status <- system(cmd) } if(!(status %in% c(0,1))) { stop(paste("An error occurred while running command\n '", exefile, "'", sep="")) } } if(type == "session") { file.copy(psefile, file, overwrite=TRUE) unlink(pmlfile) unlink(psefile) message(paste("PyMOL session written to file", file)) invisible(file) } if(type == "script") { file.copy(pmlfile, file, overwrite=TRUE) unlink(pmlfile) message(paste("PyMOL script written to file", file)) invisible(file) } } bio3d/R/covsoverlap.R0000644000176200001440000000363214046015221014140 0ustar liggesuserscovsoverlap <- function(...) UseMethod("covsoverlap") covsoverlap.enma <- function(enma, ncore=NULL, ...) { if(!inherits(enma, "enma")) stop("provide a 'enma' object as obtain from function 'nma.pdbs()'") if(any(is.na(enma$fluctuations))) stop("provide 'enma' object calculated with argument 'rm.gaps=TRUE'") ncore <- setup.ncore(ncore, bigmem = FALSE) if(ncore>1) mylapply <- mclapply else mylapply <- lapply cat("Calculating pairwise covariance overlap coefs") m <- dim(enma$U.subspace)[3] mat <- matrix(NA, m, m) ##inds <- pairwise(m) inds <- rbind(pairwise(m), matrix(rep(1:m,each=2), ncol=2, byrow=T)) mylist <- mylapply(1:nrow(inds), function(row) { i <- inds[row,1]; j <- inds[row,2]; a <- list(U=enma$U.subspace[,,i], L=enma$L[i, ]) b <- list(U=enma$U.subspace[,,j], L=enma$L[j, ]) val <- covsoverlap.nma(a, b, ...) out <- list(val=val, i=i, j=j) cat(".") return(out) }) for ( i in 1:length(mylist)) { tmp <- mylist[[i]] mat[tmp$i, tmp$j] <- tmp$val } mat[ inds[,c(2,1)] ] = mat[ inds ] ##diag(mat) <- rep(1, n) rownames(mat) <- basename(rownames(enma$fluctuations)) colnames(mat) <- basename(rownames(enma$fluctuations)) cat("\n") return(round(mat, 6)) } covsoverlap.nma <- function(a, b, subset=NULL, ...) { if(any(missing(a), missing(b))) stop("provide eigenvectors and eigenvalues") dims.a <- dim(a$U) dims.b <- dim(b$U) if(dims.a[1]!=dims.b[1]) stop("dimension mismatch") if(!is.null(subset)) { if(subset>ncol(a$U)) subset <- ncol(a$U) a$U <- a$U[,1:subset] b$U <- b$U[,1:subset] a$L <- a$L[1:subset] b$L <- b$L[1:subset] } sumb <- 0 for( k in 1:ncol(a$U) ) { tmp <- sqrt(a$L[k] * b$L) overlap <- c((t(a$U[,k]) %*% b$U)**2) sumb <- sumb + sum( tmp * overlap ) } return(1 - ( sum(a$L + b$L) - 2 *sumb ) / sum(a$L + b$L)) } bio3d/R/seqaln.R0000644000176200001440000002337714046015221013070 0ustar liggesusers"seqaln" <- function(aln, id=NULL, profile=NULL, exefile = "muscle", outfile = "aln.fa", protein = TRUE, seqgroup = FALSE, refine = FALSE, extra.args = "", verbose = FALSE, web.args = list(), ... ) { ## Log the call cl <- match.call() ## alignment to fasta object aln <- as.fasta(aln, id=id) ## nothing to align? if(!nrow(aln$ali) > 1 && is.null(profile)) { warning("nothing to align") aln$ali <- aln$ali[ , !is.gap(aln$ali), drop=FALSE] colnames(aln$ali) <- NULL return(aln) } if(!is.null(profile) & !inherits(profile, "fasta")) stop("profile must be of class 'fasta'") ## determine path to exefile test <- try( .get.exepath(exefile), silent=TRUE ) if(inherits(test, 'try-error')) { success <- FALSE } else { exefile <- test success <- TRUE if(verbose) message(exefile) } if(grepl("clustalo", tolower(exefile))) { prg <- "clustalo" ##ver <- "--version" if(!is.null(profile)) args <- c("", "--profile1", "--in", "--out") else args <- c("--in", "--out") extra.args <- paste(extra.args,"--force") if(seqgroup) extra.args <- paste(extra.args, "--output-order=tree-order") else extra.args <- paste(extra.args, "--output-order=input-order") if(verbose) extra.args <- paste(extra.args,"--verbose") if(!is.null(profile) && length(grep("dealign", extra.args))==0) warning("profile alignment with clustalo: consider using extra.args='--dealign'") #if(protein) # extra.args <- paste(extra.args,"--seqtype Protein") #else # extra.args <- paste(extra.args,"--seqtype DNA") } else if(grepl("msa", tolower(exefile))) { # Use bioconductor MSA package for alignment! if( !requireNamespace("msa", quietly=TRUE) ) { stop("msa package missing: Please install it from Bioconductor, see: ?BiocManager::install") } if( !requireNamespace("Biostrings", quietly=TRUE) ) { stop("Biostrings package missing: Please install it from Bioconductor, see: ?BiocManager::install") } if(!is.null(profile)) { stop("Currently profile based alignment is not supported by 'msa'") } if(refine) { warning("Currently 'refine=TRUE' is not supported by 'msa'. Ignored") } # Write a temporary FASTA file to disc tf <- tempfile(pattern = "bio3d_aln",fileext = ".fasta") write.fasta(aln, gap=FALSE, file=tf) if(protein) { inputSeqs <- Biostrings::readAAStringSet(tf) } else { inputSeqs <- Biostrings::readDNAStringSet(tf) } # Alignmnet and conversion for Bio3D if(seqgroup) { order <- "aligned" } else { order <- "input" } res <- msa::msaMuscle(inputSeqs, order=order, ...)#type="protein", order="input" #res <- msa::msaMuscle(tf, type="protein",...) naln <- msa::msaConvert(res, type="bio3d::fasta") if(!is.null(outfile)) write.fasta(naln, file=outfile) naln$call=cl return(naln) } else { prg <- "muscle" ##ver <- "-version" if(!is.null(profile)) args <- c("-profile", "-in1", "-in2", "-out") else args <- c("-in", "-out") if(refine) extra.args <- paste(extra.args,"-refine") if(protein) extra.args <- paste(extra.args,"-seqtype protein") else extra.args <- paste(extra.args,"-seqtype dna") } ## Check if the program is executable if(success) { os1 <- Sys.info()["sysname"] success <- .test.exefile(exefile) } if(!success) { if(length(web.args)==0) { stop(paste("You do not have ", prg, " installed/working locally on your machine.\n", " We can attempt to use the EBI webserver if you provide an email address (required by the EBI).\n", " Please note that the EBI states (see their Terms of Use):\n", " 'Using fake e-mail address may result in your jobs being killed and your IP, Organisation or entire domain being black-listed.'\n", sep="")) } cat('\n\nWill try to align sequences online...\n\n') default.web.args <- list(email='', title='', timeout=90) vnames <- names(web.args) vnames <- vnames[nzchar(vnames)] for(v in vnames) default.web.args[v] <- web.args[v] web.args <- default.web.args if(!is.null(profile)) stop('Sequence-profile alignment is not supported by online web service.') if(!grepl('@', web.args$email)) stop('A valid E-Mail address is required to use EMBL-EBI Web Service') naln <- .ebi_msa(aln, email=web.args$email, method=prg, protein=protein, title=web.args$title, timeout=web.args$timeout) if(!is.null(outfile)) write.fasta(naln, file=outfile) } else { ## Generate temporary files toaln <- tempfile() write.fasta(aln, file=toaln) profilealn <- NULL if(!is.null(profile)) { profilealn <- tempfile() write.fasta(profile, file=profilealn) } if(is.null(outfile)) fa <- tempfile() else fa <- outfile ## Build command to external program if(is.null(profile)) { cmd <- paste(args[1], toaln, args[2], fa, extra.args, sep=" ") } else { cmd <- paste(args[1], args[2], profilealn, args[3], toaln, args[4], fa, extra.args, sep=" ") } if(verbose) cat(paste("Running command:\n ", paste(exefile, cmd), "\n")) ## Run command if (os1 == "Windows") { status <- shell(paste(shQuote(exefile), cmd), ignore.stderr = !verbose, ignore.stdout = !verbose) } else { status <- system(paste(exefile, cmd), ignore.stderr = !verbose, ignore.stdout = !verbose) } if(!(status %in% c(0,1))) { stop(paste("An error occurred while running command\n '", exefile, "'", sep="")) } naln <- read.fasta(fa, rm.dup=FALSE) ## Delete temporary files if(!is.null(profile)) unlink(profilealn) unlink(toaln) if(is.null(outfile)) unlink(fa) } ## Re-group sequences to initial alignment order ## (muscle groups similar sequences by default) if(!seqgroup) { if(is.null(profile)) { ord <- match(aln$id, naln$id) naln$id <- naln$id[ord] naln$ali <- naln$ali[ord,] } } naln$call=cl return(naln) } ## A client for EMBL-EBI multiple sequence alignment (MSA) Web Service. ## - 'x' must be a 'fasta' object. ## - 'email' must be a valid E-Mail address. .ebi_msa <- function(x, email, method=c('muscle', 'clustalo'), protein=TRUE, title='', timeout=90) { method <- match.arg(method) oops <- requireNamespace("httr", quietly = TRUE) if(!oops) stop("Please install the httr package from CRAN") # oops <- requireNamespace("XML", quietly = TRUE) # if(!oops) # stop("Please install the XML package from CRAN") # Check number of sequences if(length(x$id)>500) stop("Number of sequences exceeds 500.") baseUrl <- paste('http://www.ebi.ac.uk/Tools/services/rest/', method, sep='') # check if API works url <- paste(baseUrl, '/parameters', sep='') resp <- httr::GET(url) if(httr::http_error(resp)) stop('EMBL-EBI msa-API request failed.') # submit a job url <- paste(baseUrl, '/run', sep='') seqs <- paste(paste('>', x$id, sep=''), apply(x$ali, 1, paste, collapse=''), sep='\n', collapse='\n') format <- switch(method, muscle='fasta', clustalo='fa') resp <- switch(method, muscle = { httr::POST(url, body=list(email=email, title=title, format=format, tree='none', order='aligned', sequence=seqs), encode='form') }, clustalo = { httr::POST(url, body=list(email=email, title=title, stype=ifelse(protein, 'protein', 'dna'), outfmt=format, dealign='true', sequence=seqs), encode='form') } ) # check for errors if(httr::http_error(resp)) stop('EMBL-EBI msa-API job submission failed.') # get job id jobid <- httr::content(resp, 'text') cat('Job successfully submited (job ID: ', jobid, ')\n', 'Waiting for job to finish...', sep='') # poll job status every 3s; stop if "error" obtained 3 times. # will also stopped if time out. url <- paste(baseUrl, '/status/', jobid, sep='') checkInterval = 3 errorCount=0 time = 0 status <- 'PENDING' while((status %in% c('RUNNING', 'PENDING')) || (status == 'ERROR' && errorCount < 2)) { status <- httr::content(httr::GET(url), 'text') if(status == 'ERROR') { errorCount <- errorCount + 1 } else { if(errorCount > 0) errorCount <- errorCount - 1 } if(status %in% c('RUNNING', 'PENDING', 'ERROR')) Sys.sleep(checkInterval) time <- time + checkInterval if(time >= timeout) stop(paste('\nConnection time out. Check your results from following URL:\n', baseUrl, '/result/', jobid, '/aln-fasta', sep='')) } if(status != 'FINISHED') stop('\nJob failed. Check your E-Mails for more information') cat('Done.\n') # check result type url <- paste(baseUrl, '/resulttypes/', jobid, sep='') resp <- httr::GET(url) # types <- XML::xmlToDataFrame(XML::xmlParse(httr::content(resp, 'text')), stringsAsFactors=FALSE) types <- httr::content(resp) types <- as.data.frame(t(sapply(types[[1]], function(x) x)), stringsAsFactors=FALSE) if(!any(grepl('fasta', types$identifier))) stop('Returned results do not contain FASTA format.') # get the results type <- types$identifier[grep('fasta', types$identifier)] url <- paste(baseUrl, '/result/', jobid, '/', type, sep='') resp <- httr::content(httr::GET(url), 'text') tfile <- tempfile() cat(resp, sep='', file=tfile) aln <- read.fasta(tfile) unlink(tfile) return(aln) } bio3d/R/orient.pdb.R0000644000176200001440000000335214046015221013640 0ustar liggesusers"orient.pdb" <- function (pdb, atom.subset = NULL, verbose = TRUE ) { ## x <- c(rep(10,3), rep(0,3), rep(-10,3)) ## write.pdb(xyz=x, file="t1.pdb") ## write.pdb(xyz=orient.pdb(x), file="t2.pdb") if (missing(pdb)) { stop("pdb.orient: must supply 'pdb' object, e.g. from 'read.pdb'") } if(is.list(pdb)) { xyz <- pdb$xyz } else { if (!is.vector(pdb)) { stop("pdb.orient: input 'pdb' should NOT be a matrix") } xyz <- pdb } xyz <- matrix( xyz, ncol=3, byrow=TRUE ) if (is.null(atom.subset)) atom.subset <- c(1:nrow(xyz)) if (length(atom.subset) > nrow(xyz)) { stop("pdb.orient: there are more 'atom.subset' inds than there atoms") } ## Center on mean xyz positions xyz.bar <- apply(xyz[atom.subset, ], 2, mean) xyz <- sweep(xyz, 2, xyz.bar) ## Determine principal axis S <- var(xyz[atom.subset, ]) prj <- eigen(S, symmetric = TRUE) ## Mke rotation explicitly rh system ## z <- xyz %*% (prj$vectors) A <- prj$vectors b <- A[,1]; c <- A[,2] A[1,3] <- (b[2] * c[3]) - (b[3] * c[2]) A[2,3] <- (b[3] * c[1]) - (b[1] * c[3]) A[3,3] <- (b[1] * c[2]) - (b[2] * c[1]) ## Rotate z <- xyz %*% (A) if (verbose) { cat("Dimensions:", "\n") cat(" x min=", round(min(z[, 1]), 3), " max=", round(max(z[, 1]), 3), " range=", round(max(z[, 1]) - min(z[, 1]), 3), "\n") cat(" y min=", round(min(z[, 2]), 3), " max=", round(max(z[, 2]), 3), " range=", round(max(z[, 2]) - min(z[, 2]), 3), "\n") cat(" z min=", round(min(z[, 3]), 3), " max=", round(max(z[, 3]), 3), " range=", round(max(z[, 3]) - min(z[, 3]), 3), "\n") } z <- round(as.vector(t(z)),3) z <- as.xyz(z) invisible(z) } bio3d/R/gnm.R0000644000176200001440000001471414046015221012361 0ustar liggesusers#' Gaussian Network Model #' #' Perform Gaussian network model (GNM) based normal mode analysis (NMA) for #' a protein structure. #' #' @details This function builds a Gaussian network model (an isotropic elastic network #' model) for C-alpha atoms and performs subsequent normal mode analysis (NMA). #' The model employs a distance cutoff for the network construction: Atom pairs with #' distance falling within the cutoff have a harmonic interaction with a uniform force constant; #' Otherwise atoms have no interaction. Output contains N-1 (N, the number of residues) #' non-trivial modes (i.e. the degree of freedom is N-1), which can then be used to #' calculate atomic fluctuations and covariance. #' #' @param x an object of class \code{pdb} as obtained from function \code{\link{read.pdb}}. #' @param inds atom and xyz coordinate indices obtained from \code{\link{atom.select}} that #' selects the elements of \code{pdb} upon which the calculation should be based. #' If not provided the function will attempt to select all calpha atoms automatically. #' @param temp numerical, temperature for which the amplitudes for scaling the atomic #' displacement vectors are calculated. Set \sQuote{temp=NULL} to avoid scaling. #' @param keep numerical, final number of modes to be stored. Note that all subsequent analyses #' are limited to this subset of modes. This option is useful for very large structures and #' cases where memory may be limited. #' @param outmodes atom indices as obtained from \code{\link{atom.select}} specifying the atoms #' to include in the resulting mode object. #' @param gamma numerical, global scale of the force constant. #' @param cutoff numerical, distance cutoff for pair-wise interactions. #' @param check.connect logical, if TRUE check chain connectivity. #' #' @return Returns an object of class \sQuote{gnm} with the following components: #' \item{force.constants}{ numeric vector containing the force constants corresponding #' to each mode. } #' \item{fluctuations}{ numeric vector of atomic fluctuations. } #' \item{U}{ numeric matrix with columns containing the raw eigenvectors. } #' \item{L}{ numeric vector containing the raw eigenvalues. } #' \item{xyz}{ numeric matrix of class \code{xyz} containing the Cartesian coordinates #' in which the calculation was performed. } #' \item{temp}{ numerical, temperature for which the amplitudes for scaling the atomic #' displacement vectors are calculated. } #' \item{triv.modes}{ number of trivial modes. } #' \item{natoms}{ number of C-alpha atoms. } #' \item{call}{ the matched call. } #' #' @seealso #' \code{\link{gnm.pdbs}} #' #' @author Xin-Qiu Yao & Lars Skjaerven #' #' @references #' Bahar, I. et al. (1997) \emph{Folding Des.} \bold{2}, 173. #' #' @examples #' ## Fetch stucture #' pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) #' #' ## Calculate normal modes #' modes <- gnm(pdb) #' #' ## Print modes #' print(modes) #' #' ## Plot modes #' plot(modes) #' gnm <- function(x, ...) { UseMethod("gnm") } #' @rdname gnm gnm.pdb <- function(x, inds=NULL, temp=300.0, keep=NULL, outmodes=NULL, gamma=1.0, cutoff=8.0, check.connect=TRUE, ...) { pdb <- x ## Log the call cl <- match.call() if(!is.pdb(pdb)) stop("please provide a 'pdb' object as obtained from 'read.pdb()'") if(!is.null(outmodes) & !is.select(outmodes)) stop("provide 'outmodes' as obtained from function atom.select()") ## Prepare PDB ## Take only first frame of multi model PDB files if(nrow(pdb$xyz)>1) { warning("multimodel PDB file detected - using only first frame") pdb$xyz=pdb$xyz[1,, drop=FALSE] } ## Trim to only CA atoms if(is.null(inds)) { ca.inds <- atom.select(pdb, "calpha", verbose=FALSE) pdb.in <- trim.pdb(pdb, ca.inds) } ## or to user selection else { pdb.in <- trim.pdb(pdb, inds) if(!all(pdb.in$atom$elety=="CA")) stop("non-CA atoms detected") } ## Indices for effective hessian if(is.select(outmodes)) { ## re-select since outmodes indices are based on input PDB inc.inds <- .match.sel(pdb, pdb.in, outmodes) pdb.out <- trim.pdb(pdb.in, inc.inds) } else { pdb.out <- pdb.in inc.inds <- atom.select(pdb.in, "all", verbose=FALSE) } ## fetch number of atoms and sequence natoms.in <- ncol(pdb.in$xyz)/3 natoms.out <- ncol(pdb.out$xyz)/3 if (natoms.in<2) stop("gnm: insufficient number of atoms") ## check structure connectivity if(check.connect) { conn <- inspect.connectivity(pdb.in$xyz) if(!conn) { warning("Possible multi-chain structure or missing in-structure residue(s) present\n", " Fluctuations at neighboring positions may be affected.") } } ## build Kirchhoff matrix K <- cmap(pdb.in, scut=1, dcut=cutoff, mask.lower=FALSE) K[!is.na(K) & K > 0] <- -1 diag(K) <- - apply(K, 1, sum, na.rm=TRUE) if(length(inc.inds$atom) < nrow(K)) { # calculate effective Kirchhoff ptm <- proc.time() # cat(" Extracting effective Kirchhoff..") inc.inds <- inc.inds$atom kaa <- K[inc.inds, inc.inds] kqq.inv <- chol2inv(chol(K[-inc.inds, -inc.inds])) kaq <- K[inc.inds, -inc.inds] kqa <- t(kaq) K <- kaa - crossprod(crossprod(kqq.inv, kqa), kqa) t <- proc.time() - ptm # cat("\tDone in", t[[3]], "seconds.\n") } ## diagonalize - get eigenvectors ei <- eigen(K, symmetric=TRUE) ei$values <- ei$values[length(ei$values):1] ei$vectors <- ei$vectors[, length(ei$values):1] if(any(ei$values[-1] < 0)) { warning("Negative eigenvalue(s) detected! \ This can be an indication of an unphysical input structure.") } ## keep only a subset of modes - including trivial modes if(!is.null(keep)) { if(keep > ncol(ei$vectors)) keep <- ncol(ei$vectors) keep.inds <- seq(1, keep) ei$vectors <- ei$vectors[, keep.inds] ei$values <- ei$values[keep.inds] } ## fluctuations kb <- 0.00831447086363271 f <- t(ei$vectors[, -1]**2) / ei$values[-1] f <- colSums(f) * 3 * kb * temp / gamma ## make a GNM object gnm <- list(force.constants = ei$values, fluctuations = f, U = ei$vectors, L = ei$values, xyz = pdb.out$xyz, temp = temp, triv.modes=1, natoms = natoms.out, call = cl) class(gnm) <- c('EnergeticModes', 'gnm', 'nma') return(gnm) } bio3d/R/as.pdb.mol2.R0000644000176200001440000000275314046015221013617 0ustar liggesusers as.pdb.mol2 <- function(mol, ...) { cl <- match.call() natoms <- nrow(mol$atom) pdbn <- list() allset <- FALSE resid <- strtrim(mol$atom$resid, 3) chain <- NULL if(!is.null(mol$substructure)) { if(all(c("root_atom", "subst_type", "chain") %in% colnames(mol$substructure))) { key1 <- paste(mol$atom$resno, mol$atom$resid, sep="-") rownames(mol$substructure) <- key1[ mol$subs$root_atom ] resid <- mol$substructure[key1, "sub_type"] chain <- mol$substructure[key1, "chain"] allset <- TRUE } } if(!allset & length(unique(mol$resid)) > 1) { warning("insuffient data in SUBSTRUCTURE to set residue and chain identifiers in PDB") } pdb <- as.pdb.default(pdb = NULL, xyz = mol$xyz, type = rep("ATOM", natoms), resno = mol$atom$resno, resid = resid, eleno = mol$eleno, elety = mol$atom$elena, chain = chain, insert = NULL, alt = NULL, o=NULL, b=NULL, segid=NULL, elesy=unlist(lapply(strsplit(mol$atom$elety, split="[.]"), function(x) x[1])), charge=mol$atom$charge) pdb$call <- cl return(pdb) } bio3d/R/entropy.R0000644000176200001440000000421614046015221013274 0ustar liggesusers"entropy" <- function(alignment) { # Calculate the Shannon entropy score for each position # in an alignment if(is.list(alignment)) alignment=alignment$ali aa <- c("V","I","L","M", "F","W","Y", "S","T", "N","Q", "H","K","R", "D","E", "A","G", "P", "C", "-","X") composition <- table(alignment) unk <- composition[!names( composition ) %in% aa] if(length(unk) > 0) { warning(paste("non standard residue code:",names(unk),"mapped to X\n ")) for(i in 1:length(unk)) alignment[alignment==names(unk[i])]="X" } len <- ncol(alignment) freq.22 <- matrix(0, nrow = 22, ncol = ncol(alignment), dimnames = list(aa,seq(1:len))) freq.10 <- matrix(0, nrow = 10, ncol = ncol(alignment), dimnames = list(c(1:10),c(1:len))) for (i in 1:len) { freq.22[names(summary((as.factor(toupper(alignment[,i]))))), i] <- (summary(as.factor(toupper(alignment[,i])))/length(alignment[,i])) freq.10[1,i] <- sum(freq.22[1:4,i]) # Hydrophobic, Aliphatic freq.10[2,i] <- sum(freq.22[5:7,i]) # Aromatic freq.10[3,i] <- sum(freq.22[8:9,i]) # Ser/Thr freq.10[4,i] <- sum(freq.22[10:11,i]) # Polar freq.10[5,i] <- sum(freq.22[12:14,i]) # Positive freq.10[6,i] <- sum(freq.22[15:16,i]) # Negative freq.10[7,i] <- sum(freq.22[17:18,i]) # Tiny freq.10[8,i] <- sum(freq.22[19,i]) # Proline freq.10[9,i] <- sum(freq.22[20,i]) # Cysteine freq.10[10,i] <- sum(freq.22[21:22,i]) # Gaps } entropy.22 <- vector(length = len) entropy.10 <- entropy.22 for (i in 1:len) { # entropy_i = sum[i] (P(X_i)log2(P(X_i))) entropy.22[i] <- -1*sum(freq.22[freq.22[, i] != 0, i] * log2(freq.22[freq.22[, i] != 0, i])) entropy.10[i] <- -1*sum(freq.10[freq.10[, i] != 0, i] * log2(freq.10[freq.10[, i] != 0, i])) } out <- list(H=entropy.22, H.10=entropy.10, H.norm=1-(if(max(entropy.22)==0) entropy.22 else (entropy.22/max(entropy.22))), H.10.norm=1-(if(max(entropy.10)==0) entropy.10 else (entropy.10/max(entropy.10))), freq=freq.22) } bio3d/R/as.fasta.R0000644000176200001440000000164214046015221013274 0ustar liggesusers"as.fasta" <- function(x, id=NULL, ...) { cl <- match.call() if(is.list(x)) { if(is.null(id)) id <- x$id x <- x$ali } if(is.vector(x)) { if(any(nchar(x)>1)) stop("provide a matrix/vector of one letter amino acid codes") ##x <- seqbind(lapply(lapply(x, strsplit, ""), unlist)) x <- as.matrix(t(x)) } if(is.matrix(x)) { if(is.null(id)) id <- rownames(x) if(is.null(id)) id <- paste("seq",1:nrow(x), sep="") if(any(id=="") | any(is.na(id))) { id[id==""] <- NA inds <- which(is.na(id)) id[inds] <- paste("seq", inds, sep="") } if(nrow(x) != length(id)) stop("length of 'id' does not match number of rows in alignment") rownames(x) <- id } else { stop("provide a sequence character matrix/vector") } out <- list(id=id, ali=x, call=cl) class(out) <- "fasta" return(out) } bio3d/R/write.pqr.R0000644000176200001440000002032214046015221013523 0ustar liggesusers`write.pqr` <- function (pdb = NULL, xyz = pdb$xyz, resno = NULL, resid = NULL, eleno = NULL, elety = NULL, chain = NULL, o = NULL, b = NULL, append = FALSE, verbose =FALSE, chainter = FALSE, file = "R.pdb") { ## For Testing: ## resno = NULL; resid = NULL;eleno = NULL;elety = NULL;chain = NULL;o = NULL;b = NULL; het = FALSE;append = FALSE;verbose =FALSE;chainter = FALSE ## pdb=mt; eleno=eleno.new; resno=resno.new; file="t3.pqr" if(is.null(xyz) || !is.numeric(xyz)) stop("write.pqr: please provide a 'pdb' object or numeric 'xyz' vector") if(any(is.na(xyz))) stop("write.pqr: 'xyz' coordinates must have no NA's.") xyz <- as.xyz(xyz) xyz <- trim(xyz, row.inds=1) natom <- ncol(xyz)/3 nfile <- 1 if (nrow(xyz)>1) { warning("write.pqr: no multimodel PQR support") xyz <- trim(xyz, row.inds=1) ##natom <- ncol(xyz)/3 ##nfile <- nrow(xyz) ##if (verbose) { ## cat("Multiple 'xyz' rows will be interperted as multimodels/frames\n") } card <- rep('ATOM', natom) if(!is.null(pdb)) { # if(natom == 1) ## make sure we are a matrix # pdb$atom <- t(as.matrix(pdb$atom)) card <- pdb$atom$type if (is.null(resno)) resno = pdb$atom[, "resno"] if (is.null(resid)) resid = pdb$atom[, "resid"] if (is.null(eleno)) eleno = pdb$atom[, "eleno"] if (is.null(elety)) elety = pdb$atom[, "elety"] if (is.null(chain)) { chain = pdb$atom[, "chain"] } else { if(length(chain)==1) chain=rep(chain, natom) } if (is.null(o)) o = pdb$atom[, "o"] if (is.null(b)) b = pdb$atom[, "b"] if (any(is.na(o))) { o = rep("0.00", natom) } if (any(is.na(b))) { b = rep("1.00", natom) } #if (any(is.na(chain))) { chain = rep(" ", natom) } chain[is.na(chain)]= "" } else { if (is.null(resno)) resno = c(1:natom) if (is.null(resid)) resid = rep("ALA", natom) if (is.null(eleno)) eleno = c(1:natom) if (is.null(elety)) elety = rep("CA", natom) if (is.null(chain)) { chain = rep("", natom) } else { if (length(chain) == 1) chain = rep(chain, natom) } if (is.null(o)) o = rep("0.00",natom) if (is.null(b)) b = rep("1.00", natom) chain[is.na(chain)]= "" } if (!is.logical(append)) stop("write.pqr: 'append' must be logical TRUE/FALSE") if (length(as.vector(xyz))%%3 != 0) { stop("write.pqr: 'length(xyz)' must be divisable by 3.") } check.lengths <- sum(length(resno), length(resid), length(eleno), length(elety), length(o), length(b)) if (check.lengths%%natom != 0) { stop("write.pqr: the lengths of all input vectors != 'length(xyz)/3'.") } o <- as.numeric(o) b <- as.numeric(b) eleno <- as.character(eleno) resno <- as.character(resno) ## Inserted Jul 8th 2008 for adding TER between chains ter.lines <- (which(!duplicated(chain))[-1] - 1) #### #### ## Edit: Sat Aug 1 14:48:48 PDT 2009 #### ## for speed imporvment and for #### ## implementing 6 character atom numbers #### if(nfile==1) { coords <- matrix(round(as.numeric(xyz), 3), ncol = 3, byrow = TRUE) if (verbose) { cat(paste("Writing 1 frame with",natom,"atoms ")) } coords <- matrix(round(as.numeric(xyz), 3), ncol = 3, byrow = TRUE) lines <- matrix(, ncol=1, nrow=natom) ## Four format otions: regular; elety > 3; eleno > 5; eleno > 5 & elety > 3 ## cases nchar(elety) > 3; nchar(eleno) > 5 cases <- matrix(1,ncol=2,nrow=natom) cases[(nchar(eleno) > 5) ,1] = 3 cases[(nchar(elety) < 4) ,2] = 0 cases <- rowSums(cases) ind.1 <- which(cases==1) ind.2 <- which(cases==2) ind.3 <- which(cases==3) ind.4 <- which(cases==4) atom.print.1 <- function(card = "ATOM", eleno, elety, alt = "", resid, chain = "", resno, insert = "", x, y, z, o = "0.00", b = "1.00", segid = "") { format <- "%-6s%5s %-3s%1s%-4s%1s%4s%1s%3s%8.3f%8.3f%8.3f%8.4f%8.3f%6s%4s" sprintf(format, card, eleno, elety, alt, resid, chain, resno, insert, "", x, y, z, o, b, "", segid) } atom.print.2 <- function(card = "ATOM", eleno, elety, alt = "", resid, chain = "", resno, insert = "", x, y, z, o = "0.00", b = "1.00", segid = "") { format <- "%-6s%5s %-4s%1s%-4s%1s%4s%1s%3s%8.3f%8.3f%8.3f%8.4f%8.3f%6s%4s" sprintf(format, card, eleno, elety, alt, resid, chain, resno, insert, "", x, y, z, o, b, "", segid) } atom.print.3 <- function(card = "ATOM", eleno, elety, alt = "", resid, chain = "", resno, insert = "", x, y, z, o = "0.00", b = "1.00", segid = "") { format <- "%-4s%7s %-3s%1s%-4s%1s%4s%1s%3s%8.3f%8.3f%8.3f%8.4f%8.3f%6s%4s" sprintf(format, card, eleno, elety, alt, resid, chain, resno, insert, "", x, y, z, o, b, "", segid) } atom.print.4 <- function(card = "ATOM", eleno, elety, alt = "", resid, chain = "", resno, insert = "", x, y, z, o = "0.00", b = "1.00", segid = "") { format <- "%-4s%7s %-4s%1s%-4s%1s%4s%1s%3s%8.3f%8.3f%8.3f%8.4f%8.3f%6s%4s" sprintf(format, card, eleno, elety, alt, resid, chain, resno, insert, "", x, y, z, o, b, "", segid) } if(length(ind.1)>0) { lines[ind.1,] <- atom.print.1( card = card[ind.1], eleno = eleno[ind.1], elety = elety[ind.1], resid = resid[ind.1], chain = chain[ind.1], resno = resno[ind.1], x = coords[ind.1, 1], y = coords[ind.1, 2], z = coords[ind.1, 3], o = o[ind.1], b = b[ind.1] ) } if(length(ind.2)>0) { lines[ind.2,] <- atom.print.2( card = card[ind.2], eleno = eleno[ind.2], elety = elety[ind.2], resid = resid[ind.2], chain = chain[ind.2], resno = resno[ind.2], x = coords[ind.2, 1], y = coords[ind.2, 2], z = coords[ind.2, 3], o = o[ind.2], b = b[ind.2] ) } if(length(ind.3)>0) { lines[ind.3,] <- atom.print.3( card = card[ind.3], eleno = eleno[ind.3], elety = elety[ind.3], resid = resid[ind.3], chain = chain[ind.3], resno = resno[ind.3], x = coords[ind.3, 1], y = coords[ind.3, 2], z = coords[ind.3, 3], o = o[ind.3], b = b[ind.3] ) } if(length(ind.4)>0) { lines[ind.4,] <- atom.print.4( card = card[ind.4], eleno = eleno[ind.4], elety = elety[ind.4], resid = resid[ind.4], chain = chain[ind.4], resno = resno[ind.4], x = coords[ind.4, 1], y = coords[ind.4, 2], z = coords[ind.4, 3], o = o[ind.4], b = b[ind.4] ) } write.table(lines, file=file, quote=FALSE, row.names=FALSE, col.names=FALSE, append=append) #### #### End of Edit: removed big chunks of old code #### } else { if (verbose) { cat(paste("Writing",nfile,"frames with",natom,"atoms"),"\n") cat("Frame Progress (x50) ") } stop("REMOVED code for multimodel PQR as these files dont have much support") } if (verbose) cat(" DONE","\n") } bio3d/R/dccm.enma.R0000644000176200001440000000443114046015221013420 0ustar liggesusers"dccm.enma" <- function(x, ncore=NULL, na.rm=FALSE, ...) { enma <- x if(!inherits(enma, "enma")) stop("input should be an 'enma' object as obtained from 'nma.pdbs'") ## Parallelized by parallel package ncore <- setup.ncore(ncore, bigmem = FALSE) if(ncore>1) mylapply <- mclapply else mylapply <- lapply mass <- TRUE if(!is.null(enma$call$mass)) mass <- enma$call$mass pi <- 3.14159265359 dims <- dim(enma$U.subspace) if(is.null(enma$full.nma)) { if((dims[1]-6)>dims[2]) warning(paste(dims[2], "modes used in the calculation of the DCCMs")) } myCalcDCCM <- function(i, enma, na.rm=FALSE, ...) { if(is.null(enma$full.nma)) { if(mass) { freqs <- sqrt(abs(enma$L[i,])) / (2 * pi) fcs <- NULL } else { freqs <- NULL fcs <- enma$L[i,] } if(na.rm) { inds <- which( !is.na(enma$U.subspace[,1,i]) ) U <- enma$U.subspace[inds,,i] } else U <- enma$U.subspace[,,i] dummy.nma <- list(U=U, L=enma$L[i,], modes=NULL, frequencies=freqs, force.constants=fcs, triv.modes=0, natoms=nrow(U)/3) ##natoms=nrow(enma$U.subspace[,,i])/3) class(dummy.nma) <- "nma" invisible(capture.output( cm.tmp <- dccm.nma(dummy.nma, ncore=1, ...) )) } else { invisible(capture.output( cm.tmp <- dccm.nma(enma$full.nma[[i]], ncore=1, ...) )) } .update.pb(pb) return(cm.tmp) } ## do the calc pb <- .init.pb(ncore, min=0, max=dims[3L]) all.dccm <- mylapply(1:dims[3L], myCalcDCCM, enma, na.rm=na.rm, ...) .close.pb(pb) if(any(is.na(enma$U.subspace))) arr <- FALSE else arr <- TRUE if(arr) { ## convert to a 3d-array dccm.arr <- array(0, dim=c(dims[1L]/3, dims[1L]/3, dims[3L])) ## collect data for(i in 1:length(all.dccm)) { tmp.cm <- all.dccm[[i]] dccm.arr[,,i] <- tmp.cm } } if(arr) { avg <- apply(dccm.arr, 1:2, mean) class(avg) <- c("matrix", "dccm") out <- list(all.dccm=dccm.arr, avg.dccm=avg) } else { out <- list(all.dccm=all.dccm, avg.dccm=NULL) } return(out) } bio3d/R/read.fasta.R0000644000176200001440000000331714046015221013605 0ustar liggesusers"read.fasta" <- function(file, rm.dup=TRUE, to.upper=FALSE, to.dash=TRUE) { ## Log the call cl <- match.call() ## Version 0.3 ... Thu Apr 26 19:17:09 PDT 2007 ## uses scan instead of read.table raw.fa <- scan(file, what=character(0), sep="\n", quiet = TRUE, na.strings='') ind <- grep(">", raw.fa) ## seq id lines if(length(ind) == 0) { stop("read.fasta: no '>' id lines found, check file format") } if (to.dash) { raw.fa[-ind] <- gsub("[/.]","-", raw.fa[-ind]) } if (to.upper) { raw.fa[-ind] <- toupper(raw.fa[-ind]) } ind.s <- ind+1 ## seq start and end lines ind.e <- c((ind-1)[-1], length(raw.fa)) seq.dim <- apply(cbind(ind.s, ind.e), 1, function(x) sum( nchar(raw.fa[ (x[1]:x[2])]) )) seq.format <- function(x, max.seq=max(seq.dim)) { fa <- rep("-",max.seq) fa[ c(1:x[3]) ] <- unlist(strsplit( raw.fa[ (x[1]:x[2]) ], split="")); return(fa) } ##seq.format( cbind(ind.s[1], ind.e[1], seq.dim[1]) ) store.fa <- t(matrix(apply(cbind(ind.s, ind.e, seq.dim), 1, seq.format), ncol=length(ind))) rownames(store.fa) <- gsub("^>| .*", "",raw.fa[ind], perl=TRUE) ## if (to.dash) { store.fa <- gsub("[/.]","-", store.fa ) } ## if (to.upper) { store.fa <- toupper(store.fa) } if (rm.dup) { ## remove duplicated seq id's ## dups <- as.numeric(duplicated(row.names(store.fa))) dups <- duplicated(row.names(store.fa)) if (any(dups)) { print(paste(" ** Duplicated sequence id's: ", row.names(store.fa)[dups]," **",sep="")) store.fa <- store.fa[!dups,] } } output <- list(id=rownames(store.fa), ali=store.fa, call=cl) class(output) <- "fasta" return(output) } bio3d/R/as.select.R0000644000176200001440000000071214046015221013452 0ustar liggesusers"as.select" <- function(x, ...) { cl <- match.call() if(is.select(x)) { return(x) } else { if(!is.vector(x)) stop("provide a numeric vector of atom indices") if(all(is.logical(x))) x <- which(x) if(!all(is.numeric(x))) stop("provide a numeric vector of atom indices") sele <- NULL sele$atom <- x sele$xyz <- atom2xyz(x) sele$call <- cl class(sele) <- "select" return(sele) } } bio3d/R/load.enmff.R0000644000176200001440000001116714046015221013610 0ustar liggesusers## All-atom ENMs "ff.aaenm" <- function(r, ...) { a <- 7424; k <- a * r^(-6) k[k>1500]=1500 return(k) } ff.aaenm2 <- function(r, atom.id, pdb, ...) { # all non-covalent interactions a <- 7424; k <- a * r^(-6) # intra-residue res <- paste(pdb$atom$resno, pdb$atom$chain, pdb$atom$insert, sep="-") myres <- res[atom.id] intra.inds <- which(res == myres) k[ intra.inds ] = 200 covalent.inds <- which(r < 2) k[ r < 2 ] = 1500 k[k>1500]=1500 return(k) } ## Coarse-grained ENMs #"ff.aaanm" <- function(r, cutoff=7, gamma=1, ...) { # ifelse( r>cutoff, 0, gamma ) #} "ff.anm" <- function(r, cutoff=15, gamma=1, ...) { ifelse( r>cutoff, 0, gamma ) } "ff.pfanm" <- function(r, cutoff=NULL, ...) { if(is.null(cutoff)) return(r^(-2)) else ifelse( r>cutoff, 0, r^(-2)) } "ff.calpha" <- function(r, rmin=2.9, ...) { ## MMTK Units: kJ / mol / nm^2 ##a <- 128; b <- 8.6 * 10^5; c <- 2.39 * 10^5; ## Bio3D Units: kJ / mol / A^2 ## In case of unreasonable CA-CA distance if(!is.null(rmin)) r[(r 0), which(inds.k12 <= natoms)) ] ks[inds.k12] <- 43.52 ks[atom.id]=0 ## should in principle not get this far ... if(any(is.na(ks))) { stop(paste("Incompatible protein sequence:\n", " Paramters only exists for standard amino acid residues")) } ## sdENM FF is in arbitrary units ## The values given were arbitrarily normalized, so that ## the average kappa (over all amino acid pairs) is equal to 1, at d = 6 Ang. ## scale to kJ / mol / A^2 range: ks <- ks * 0.0083144621 * 300 * 10 return(ks) } "ff.reach" <- function(r, atom.id, ...) { natoms <- length(r) ## units in kJ/mol/A^2 ## Table 1 - line DHFR #af <- 6770; as <- 2.08; #bf <- 0.951; bs <- 0.0589; #k12 <- 860; k13 <- 26.7; k14 <- 17; ## by correspondance with Kei (29 aug'13) ## line 38, page 1644, 2008 Biophysical J af <- 4810; as <- 1.7; bf <- 0.872; bs <- 0.068; ## avgering over table 1 k12 <- 866; k13 <- 28.7; k14 <- 24.16667; ## Calculate default interactions ks <- (af * exp(-bf*r)) + (as * exp(-bs*r)) ## Differentiate between k12, k13, k14 inds.k12 <- c(atom.id -1, atom.id+1) inds.k13 <- c(atom.id -2, atom.id+2) inds.k14 <- c(atom.id -3, atom.id+3) inds.k12 <- inds.k12[ intersect(which(inds.k12 > 0), which(inds.k12 <= natoms)) ] inds.k13 <- inds.k13[ intersect(which(inds.k13 > 0), which(inds.k13 <= natoms)) ] inds.k14 <- inds.k14[ intersect(which(inds.k14 > 0), which(inds.k14 <= natoms)) ] ks[inds.k12] <- k12; ks[inds.k13] <- k13; ks[inds.k14] <- k14; return(ks) } "load.enmff" <- function(ff='calpha') { ## Bahar "ANM"-ff if (ff=="anm") { ff <- ff.anm } ## Yang Song and Jernigan (PNAS 2009) else if (ff=="pfanm") { ff <- ff.pfanm } ## Hinsen "C-alpha"-ff else if (ff=="calpha") { ff <- ff.calpha } ## sdENM else if(ff=="sdenm") { ff <- ff.sdenm } ## REACH else if(ff=="reach") { ff <- ff.reach } ## All-atom ENM else if(ff=="aaenm") { ff <- ff.aaenm } ## All-atom ENM else if(ff=="aaenm2") { ff <- ff.aaenm2 } else { stop("force field not defined") } return(ff) } bio3d/R/trim.pdbs.R0000644000176200001440000000377114046015221013503 0ustar liggesusers## Use for trimming a pdbs object, either by removing structures, ## or by removing columns trim.pdbs <- function(pdbs, row.inds=NULL, col.inds=NULL, ...) { if(!inherits(pdbs, "pdbs")) stop("input 'pdbs' should be a list object as obtained from 'read.fasta.pdb'") ## Log the call cl <- match.call() if(is.null(row.inds)) row.inds <- seq(1, nrow(pdbs$resno), by=1) if(is.null(col.inds)) { gaps <- gap.inspect(pdbs$resno[row.inds,,drop=FALSE]) col.inds <- which(gaps$col < dim(pdbs$resno[row.inds,,drop=FALSE])[1L]) } if(any(col.inds<0)) col.inds.xyz <- atom2xyz(abs(col.inds)) * sign(rep(col.inds, each=3)) else col.inds.xyz <- atom2xyz(col.inds) new <- NULL new$id =pdbs$id[row.inds] new$xyz = as.xyz(pdbs$xyz[row.inds, col.inds.xyz, drop=FALSE]) new$resno =pdbs$resno[row.inds, col.inds, drop=FALSE] new$b =pdbs$b[row.inds, col.inds, drop=FALSE] new$chain =pdbs$chain[row.inds, col.inds, drop=FALSE] new$ali =pdbs$ali[row.inds, col.inds, drop=FALSE] new$resid =pdbs$resid[row.inds, col.inds, drop=FALSE] new$sse =pdbs$sse[row.inds, col.inds, drop=FALSE] new$call =cl if(!is.null(pdbs$insert)) { new$insert =pdbs$insert[row.inds, col.inds, drop=FALSE] } if(!is.null(pdbs$all)) { col.inds.all <- which(pdbs$all.grpby %in% abs(col.inds)) col.inds.all <- col.inds.all * sign(rep(col.inds, rle(pdbs$all.grpby[col.inds.all])$length)) if(any(col.inds.all<0)) col.inds.all.xyz <- atom2xyz(abs(col.inds.all)) * sign(rep(col.inds.all, each=3)) else col.inds.all.xyz <- atom2xyz(col.inds.all) new$all = as.xyz(pdbs$all[row.inds, col.inds.all.xyz, drop=FALSE]) new$all.elety = pdbs$all.elety[row.inds, col.inds.all, drop=FALSE] new$all.resno = pdbs$all.resno[row.inds, col.inds.all, drop=FALSE] new$all.resid = pdbs$all.resid[row.inds, col.inds.all, drop=FALSE] new$all.grpby = vec2resno(1:ncol(new$ali), pdbs$all.grpby[col.inds.all]) } class(new) <- c("pdbs", "fasta") return(new) } bio3d/R/unbound.R0000644000176200001440000000056714046015221013253 0ustar liggesusers"unbound" <- function(start, end=NULL) { if(is.matrix(start) && all(c("start", "end") %in% colnames(start))) { if(is.null(end)) end = start[, "end"] start = start[, "start"] } if(length(start)!=length(end)) stop("start and end must are not the same length") ex <- NULL for(i in 1:length(start)) { ex <- c(ex, start[i]:end[i]) } return(ex) } bio3d/R/var.xyz.R0000644000176200001440000000111614046015221013211 0ustar liggesusers"var.xyz" <- function(xyz, weights=TRUE) { ## Calculate pairwise distances natoms <- ncol(xyz) / 3 all <- array(0, dim=c(natoms,natoms,nrow(xyz))) for( i in 1:nrow(xyz) ) { dists <- dist.xyz(xyz[i,]) all[,,i] <- dists } ## Calculate variance of pairwise distances all.vars <- apply(all, 1:2, var) if(weights) { ## Make the final weights wts <- 1 - (all.vars / max(all.vars, na.rm=TRUE)) wts[is.na(wts)] <- 1 return(wts) } else { return(all.vars) } } "var.pdbs" <- function(pdbs, ...) { xyz <- pdbs$xyz return(var.xyz(xyz, ...)) } bio3d/R/atom2xyz.R0000644000176200001440000000021514046015221013364 0ustar liggesusers"atom2xyz" <- function(num) { num3 <- num*3 c(t(matrix(c(((num3) - 2), ((num3) - 1), (num3)), ncol=3))) } bio3d/R/mktrj.nma.R0000644000176200001440000000407514046015221013500 0ustar liggesusers"mktrj.nma" <- function(nma = NULL, # nma data structure mode = 7, # which mode to move along mag = 10, # magnification factor step = 1.25, # step size file = NULL, # output pdb file pdb = NULL, # pdb structure object rock = TRUE, ... ) { # args for write.pdb ## make a trjactory of atomic displacments along a given mode if(!inherits(nma, "nma")) stop("mktrj.nma: must supply 'nma' object, i.e. from 'nma'") if(is.null(file)) file <- paste("mode_", mode, ".pdb", sep="") #if(nma$L[mode]<=0) # stop("Mode with eigenvalue <=0 detected. Check 'mode' index.") xyz <- as.vector(nma$xyz) nstep <- c(seq(step, to=mag, by=step)) #zcoor <- cbind(sqrt(nma$L[mode])) %*% nstep zcoor <- cbind(1) %*% nstep scor <- function(x,u,m) { return(x*u+m) } plus <- sapply(c(zcoor), scor, u=nma$modes[,mode], m=xyz) minus <- sapply(c(-zcoor), scor, u=nma$modes[,mode], m=xyz) if(rock) { coor <- cbind(xyz, plus, plus[,rev(1:ncol(plus))], xyz, minus, minus[,rev(1:ncol(minus))]) } else { coor <- cbind(plus[,rev(1:ncol(plus))], xyz, minus) } coor <- as.xyz(t(coor)) pdb.out <- NULL if(!is.null(pdb)) { if(!is.pdb(pdb)) stop("provide a 'pdb' object as obtained from 'read.pdb()'") ## guess the configuration of the nma/pdb object natoms <- length(nma$xyz) / 3 if(nrow(pdb$atom) == natoms) pdb.out <- pdb else if(length(atom.select(pdb, "calpha")$atom) == natoms) pdb.out <- trim(pdb, "calpha") else if(length(atom.select(pdb, "noh")$atom) == natoms) pdb.out <- trim(pdb, "noh") else { warning("'nma' and 'pdb' mismatch. Input argument 'pdb' will be ignored") pdb.out <- NULL } } write.pdb(xyz=coor, pdb=pdb.out, file=file, ...) invisible(coor) } bio3d/R/dm.xyz.R0000644000176200001440000000655314046015221013033 0ustar liggesusersdm.xyz <- function(xyz, grpby=NULL, scut=NULL, mask.lower=TRUE, gc.first=FALSE, ncore=1, ...) { ## Parallelized by parallel package ncore <- setup.ncore(ncore, bigmem = FALSE) if(ncore > 1) { mcparallel <- get("mcparallel", envir = getNamespace("parallel")) mccollect <- get("mccollect", envir = getNamespace("parallel")) } ## function for multicore calculation of dmats calcdm <- function(r.inds, core.id, xyz) { j <- 1 out <- vector("list", length=length(r.inds)) for(i in r.inds) { if(gc.first) gc() dmi <- .dm.xyz1(xyz[i,], grpby=grpby, scut=scut, mask.lower=mask.lower) out[[j]] <- dmi j <- j+1 .update.pb(pb) } return(out) } xyz <- as.xyz(xyz) if(nrow(xyz)>1) { ## dimensions of final array d3 <- nrow(xyz) if(!is.null(grpby)) d1 <- length(unique(grpby)) else d1 <- ncol(xyz)/3 dms <- array(data=0.00, dim=c(d1, d1, d3)) ## multicore setup if(ncore>1) { jobs <- list() } ## run calcdm() for each core pb <- .init.pb(ncore, min=0, max=nrow(xyz)) core.ids <- sort(rep(1:ncore, length.out=d3)) for( i in 1:ncore ) { r.inds <- which(core.ids==i) if(ncore>1) { q <- mcparallel(calcdm(r.inds, i, xyz)) jobs[[i]] <- q } else { dm.list <- calcdm(r.inds, i, xyz) } } .close.pb(pb) ## Collect all jobs if(ncore>1) res <- mccollect(jobs, wait=TRUE) else res <- list(dm.list) ## list to array i <- 1 for ( job in res ) { for(mat in job) { dms[,,i] <- mat i <- i+1 } } } else { dms <- .dm.xyz1(xyz, grpby=grpby, scut=scut, mask.lower=mask.lower) } class(dms) <- 'dmat' return(dms) } .dm.xyz1 <- function(xyz, grpby=NULL, scut=NULL, mask.lower=TRUE) { ##-- New distance matrix function with 'grpby' option ## dm(pdb$xyz, grpby=pdb$atom[,"resno"], scut=3) xyz=as.xyz(xyz) if(dim(xyz)[1L]>1) { warning("multiple frames detected - using only the first row in xyz matrix") xyz = xyz[1,, drop=FALSE] } xyz=as.vector(xyz) ##- Full Distance matrix (could use 'dm' or 'dist.xyz') d <- as.matrix(dist(matrix(xyz, ncol = 3, byrow = TRUE))) ##- Mask lower.tri if( mask.lower ) d[lower.tri(d)] = NA ##- Mask concetive atoms if( is.null(grpby) ) { if (!is.null(scut)) { d[diag.ind(d, n = scut)] = NA if(!mask.lower) d[lower.tri(d)] = t(d)[lower.tri(d)] } return(d) } else { ##- Group by concetive numbers in 'grpby' if( length(xyz) != (length(grpby)*3) ) stop("dimension miss-match in 'xyz' and 'grpby', check lengths") ##- Bounds of 'grpby' numbers inds <- bounds(grpby, dup.inds=TRUE) nres <- nrow(inds) ##- Per-residue matrix m <- matrix(, ncol=nres, nrow=nres) ij <- pairwise(nres) ## Ignore concetive groups (residues) if (!is.null(scut)) ij <- ij[ij[,2]-ij[,1] > (scut-1),] ##- Min per residue for(k in 1 : nrow(ij) ) { t.d <- d[ (inds[ij[k,1],"start"]:inds[ij[k,1],"end"]), (inds[ij[k,2],"start"]:inds[ij[k,2],"end"]) ] if(!all(is.na(t.d))) m[ij[k,1],ij[k,2]] <- min(t.d, na.rm=TRUE) else m[ij[k,1],ij[k,2]] <- NA } if( !mask.lower ) m[lower.tri(m)] = t(m)[lower.tri(m)] return(m) } } bio3d/R/core.find.R0000644000176200001440000002356614046015221013454 0ustar liggesuserscore.find <- function(...) UseMethod("core.find") core.find.default <- function(xyz, ...) core.find.pdbs(xyz, ...) core.find.pdb <- function(pdb, verbose=TRUE, ...) { if(nrow(pdb$xyz)<4) stop("provide a multi model PDB file with 4 or more frames") inds1 <- atom.select(pdb, "calpha", verbose=verbose) inds2 <- atom.select(pdb, "nucleic", elety="P", verbose=verbose) inds <- combine.select(inds1, inds2, operator="OR", verbose=verbose) tmp <- trim.pdb(pdb, inds) core <- core.find.pdbs(tmp$xyz, verbose=verbose, ...) ## map to pdb inds full.ids <- paste(pdb$atom$elety, pdb$atom$resno, pdb$atom$chain, sep="-") tmp.ids <- paste(tmp$atom$elety, tmp$atom$resno, tmp$atom$chain, sep="-") core$step.inds <- which(full.ids %in% tmp.ids[core$step.inds])[core$step.inds] core$atom <- which(full.ids %in% tmp.ids[core$atom]) core$c1A.atom <- which(full.ids %in% tmp.ids[core$c1A.atom]) core$c0.5A.atom <- which(full.ids %in% tmp.ids[core$c0.5A.atom]) core$xyz <- atom2xyz(core$atom) core$c1A.xyz <- atom2xyz(core$c1A.atom) core$c0.5A.xyz <- atom2xyz(core$c0.5A.atom) ##core$resno <- which(full.ids %in% tmp.ids[core$resno])[core$resno] ##core$c1A.resno <- which(full.ids %in% tmp.ids[core$c1A.resno])[core$c1A.resno] ##core$c0.5A.resno <- which(full.ids %in% tmp.ids[core$c0.5A.resno])[core$c0.5A.resno] core$resno <- tmp$atom$resno[core$resno] core$c1A.resno <- tmp$atom$resno[core$c1A.resno] core$c0.5A.resno <- tmp$atom$resno[core$c0.5A.resno] return(core) } "core.find.pdbs" <- function(pdbs, shortcut = FALSE, rm.island = FALSE, verbose = TRUE, stop.at = 15, stop.vol = 0.5, write.pdbs = FALSE, outpath="core_pruned", ncore = 1, nseg.scale = 1, progress = NULL, ...) { ## Itterative core deffination for lsq fit optimisation ## (core positions are those with low ellipsoid volume) # Parallelized by parallel package (Fri Apr 26 16:49:38 EDT 2013) ncore <- setup.ncore(ncore) if(ncore > 1) { # Issue of serialization problem # Maximal number of cells of a double-precision matrix # that each core can serialize: (2^31-1-61)/8 R_NCELL_LIMIT_CORE = 2.68435448e8 R_NCELL_LIMIT = ncore * R_NCELL_LIMIT_CORE if(nseg.scale < 1) { warning("nseg.scale should be 1 or a larger integer\n") nseg.scale=1 } } error.ellipsoid<-function(pos.xyz) { S<-var(pos.xyz) prj <- eigen(S, symmetric = TRUE) prj$values[prj$values < 0 & prj$values >= -1.0E-12]<-1.0E-12 vol<-4/3*pi*prod( sqrt( prj$values ) ) out<-list(vol=vol, U=prj$vectors, L=prj$values) } if(is.matrix(pdbs)) { xyz <- pdbs xyz.inds <- which(apply(is.na( xyz ), 2, sum)==0) res.inds<-xyz.inds[seq(3,length(xyz.inds),by=3)]/3 pdbseq = rep("ALA",length(xyz.inds)/3) pdbnum = c(1:(length(xyz.inds)/3)) } else { if( (is.list(pdbs)) && (inherits(pdbs, "pdbs")) ) { xyz=pdbs$xyz xyz.inds <- which(apply(is.na( xyz ), 2, sum)==0) res.inds <- which(apply(pdbs$ali=="-", 2, sum)==0) pdbseq = aa123(pdbs$ali[1,]); pdbnum = pdbs$resno[1,] } else { stop("input 'pdbs' should either be: a list object from 'read.fasta.pdb' or a numeric 'xyz' matrix of aligned coordinates") } } # First core = all non gap positions res.still.in <- res.inds # indices of core residues xyz.still.in <- xyz.inds # indices of core xyz's new.xyz.inds <- xyz.inds # indices of core xyz's xyz.moved <- xyz # core-fitted coords throwout.res <- NULL # non-core res inds throwout.xyz <- NULL # non-core xyz inds remain.vol <- NULL core.length <- NULL if(!length(res.still.in) > stop.at) { stop(paste0("Insufficient non-gap residues in alignment: \n", " non-gap residues (", length(res.still.in), ") <= 'stop.at' argument (", stop.at, ")")) } fit.to = rep(FALSE,ncol(xyz.moved)) # Preliminary fitting fit.to[ as.vector(xyz.still.in) ]<-TRUE # on first structure # xyz.tmp <- t(apply(xyz.moved, 1, # to find mean structure # rot.lsq, # for next fitting # yy=xyz.moved[1,], # xfit=fit.to)) xyz.tmp <- fit.xyz(xyz.moved[1,], xyz.moved, which(fit.to), which(fit.to), ncore=ncore, nseg.scale=nseg.scale) mean.xyz <- apply(xyz.tmp,2,mean) if(write.pdbs) { dir.create(outpath,FALSE) } while(length(res.still.in) > stop.at) { ## edit for shiny version if(!is.null(progress)) { progress$inc(1/length(res.inds)) } ## edit end # Core fitting, (core => pdbnum[ res.still.in ]) fit.to = rep(FALSE,ncol(xyz.moved)) fit.to[ as.vector(xyz.still.in) ]<-TRUE # xyz.moved <- t(apply(xyz.moved, 1, # rot.lsq, # #yy=xyz.moved[1,], # yy=mean.xyz, # xfit=fit.to)) xyz.moved <- fit.xyz(mean.xyz, xyz.moved, which(fit.to), which(fit.to), ncore=ncore, nseg.scale=nseg.scale) mean.xyz <- apply(xyz.moved,2,mean) i<-1; j<-3 volume<-NULL # ellipsoid volume if(ncore > 1) { e <- mclapply(1:(length(new.xyz.inds)/3), function(j) { error.ellipsoid( xyz.moved[, new.xyz.inds[atom2xyz(j)]] )$vol }) volume <- unlist(e) } else { while(j<=length( new.xyz.inds )) { e<-error.ellipsoid(xyz.moved[,new.xyz.inds[i:j]]) volume<-c(volume,e$vol) i<-i+3;j<-j+3 } } record <- cbind(res.still.in , # store indices and volumes matrix(new.xyz.inds,ncol=3,byrow=3), volume) # Find highest volume (most variable position) if (shortcut) { if (length(res.still.in) >= 35) { # remove four at a time highest.vol.ind <- rev(order(volume))[1:4] } else { highest.vol.ind <- which.max(volume) } } else { # no shortcut rm one at a time highest.vol.ind <- which.max(volume) } if (rm.island) { # Exclude length 4 residue islands check <- bounds( res.still.in ) check.ind <- which(check[,"length"] < 4) if ( length(check.ind) > 0 ) { res.cut=NULL for (r in 1:length(check.ind)) { res.cut <- c(res.cut, check[check.ind[r],"start"]: check[check.ind[r],"end"]) } highest.vol.ind <- unique( c(highest.vol.ind, which( is.element(res.still.in, res.cut)) )) } } # rm position from "new.xyz.inds" xyz.exclude <- record[highest.vol.ind,c(2:4)] inds.torm <- which(is.element( new.xyz.inds, as.vector(xyz.exclude) )) new.xyz.inds <- new.xyz.inds[ -inds.torm ] # Store details of the residue we excluded tmp.vol <- sum(record[-highest.vol.ind,5]) throwout.res <- c( throwout.res, as.vector(record[highest.vol.ind,1])) throwout.xyz <- rbind( throwout.xyz, record[highest.vol.ind,2:4] ) remain.vol <- c(remain.vol, tmp.vol) res.still.in <- record[-highest.vol.ind,1] xyz.still.in <- record[-highest.vol.ind,2:4] core.length <- c(core.length,length(res.still.in)) if(verbose) { # Progress report cat( paste(" core size",length(res.still.in),"of", length(res.inds))," vol =", round(tmp.vol,3),"\n" ) if(write.pdbs) { # Write current core structure write.pdb(file = file.path(outpath, paste("core_", sprintf("%04.0f", length(res.still.in)),".pdb",sep="")), #xyz = xyz[1, new.xyz.inds ], xyz = mean.xyz[ new.xyz.inds ], resno = pdbnum[ res.still.in ], resid = pdbseq[ res.still.in ], b = round((volume[-highest.vol.ind] / max(volume[-highest.vol.ind]) * 1),2) ) } } if(tmp.vol < stop.vol) { cat(paste(" FINISHED: Min vol (",stop.vol,") reached\n")) break } } # ordered thro-out lists ordered.res<-as.vector(c(throwout.res, res.still.in)) ordered.xyz<-rbind(throwout.xyz, xyz.still.in) rownames(ordered.xyz)=NULL vol = c(remain.vol, rep(NA,stop.at)) len = c(core.length,rep(NA,stop.at)) blank<-rep(NA, len[1]); blank[na.omit(len)]=na.omit(vol) ordered.vol<-c(rev(blank),NA); blank[na.omit(len)]=na.omit(len) ordered.len<-c(rev(blank),NA) # sample cores (volume < 1 A^3, < 0.5 A^3, or the final core) if( min(ordered.vol,na.rm=TRUE) < 1) { a.atom <- sort(ordered.res[which(ordered.vol<1)[1]:length(ordered.vol)]) a.xyz <- sort(as.vector(ordered.xyz[which(ordered.vol<1)[1]: length(ordered.vol),])) a.resno <- as.numeric(pdbnum[a.atom]) } else { a.atom <- NULL a.xyz <- NULL a.resno <- NULL } if( min(ordered.vol,na.rm=TRUE) < 0.5) { b.atom <- sort(ordered.res[which(ordered.vol<0.5)[1]:length(ordered.vol)]) b.xyz <- sort(as.vector(ordered.xyz[which(ordered.vol<0.5)[1]: length(ordered.vol),])) b.resno <- as.numeric(pdbnum[b.atom]) } else { b.atom <- NULL b.xyz <- NULL b.resno <- NULL } tmp.inds <- which(!is.na(ordered.vol)) c.atom <- sort(ordered.res[tmp.inds[length(tmp.inds)]:length(ordered.vol)]) c.xyz <- atom2xyz(c.atom) c.resno <- as.numeric(pdbnum[c.atom]) output <- list(volume = ordered.vol, length = ordered.len, resno = pdbnum[ ordered.res ], step.inds = ordered.res, atom = c.atom, xyz = c.xyz, c1A.atom = a.atom, c1A.xyz = a.xyz, c1A.resno = a.resno, c0.5A.atom = b.atom, c0.5A.xyz = b.xyz, c0.5A.resno = b.resno ) class(output)="core"; return(output) } bio3d/R/biounit.R0000644000176200001440000001346714046015221013255 0ustar liggesusers#' Biological Units Construction #' #' Construct biological assemblies/units based on a 'pdb' object. #' #' @details #' A valid structural/simulation study should be performed on the biological #' unit of a protein system. For example, the alpha2-beta2 tetramer form of #' hemoglobin. However, canonical PDB files usually contain the asymmetric unit of #' the crystal cell, which can be: #' \enumerate{ #' \item One biological unit #' \item A portion of a biological unit #' \item Multiple biological units #' } #' The function performs symmetry operations to the coordinates based on the #' transformation matrices stored in a 'pdb' object returned by #' \code{\link{read.pdb}}, and returns biological units stored as a list of #' \code{pdb} objects. #' #' @param pdb an object of class \code{pdb} as obtained from #' function \code{\link{read.pdb}}. #' @param biomat a list object as returned by \code{read.pdb} #' (pdb$remark$biomat), containing matrices for #' symmetry operation on individual chains to build biological units. #' It will override the matrices stored in \code{pdb}. #' @param multi logical, if TRUE the biological unit is returned as a #' 'multi-model' \code{pdb} object with each symmetric copy a distinct #' structural 'MODEL'. Otherwise, all copies are represented #' as separated chains. #' @param ncore number of CPU cores used to do the calculation. By default #' (\code{ncore=NULL}), use all available CPU cores. #' #' @return #' a list of \code{pdb} objects with each representing an individual #' biological unit. #' #' @seealso \code{\link{read.pdb}} #' #' @author Xin-Qiu Yao #' #' @examples #' \donttest{ #' # PDB server connection required - testing excluded #' #' pdb <- read.pdb("2dn1") #' biounit <- biounit(pdb) #' pdb #' biounit #' } #' \dontrun{ #' biounit <- biounit(read.pdb("2bfu"), multi=TRUE) #' write.pdb(biounit[[1]], file="biounit.pdb") #' # open the pdb file in VMD to have a look on the biological unit #' } biounit <- function(pdb, biomat = NULL, multi = FALSE, ncore = NULL) { if(!is.pdb(pdb)) stop("Please provide a 'pdb' object as obtained from 'read.pdb()'") if(!is.null(biomat)) remarks <- biomat else remarks <- pdb$remark$biomat if(is.null(remarks)) stop("Can't find 'remark' records for building biological units") ncore = setup.ncore(ncore) cl <- match.call() if(!is.null(remarks)) { # check max number of copies ncopy.max <- max(sapply(remarks$mat, length)) if(!multi && ncopy.max > 10) cat("It is slow to represent many symmetric copies as separated chains\n Try multi = TRUE\n") # Are chains treated differently? nn <- sapply(remarks$mat, function(x) length(unique(names(x)))) if(any(nn > 1) && multi) stop("Can't store as multiple models as separated symmetry operations are performed on distinct chains within one biological unit") biounits <- lapply(1:remarks$num, function(i) { # the transformation matrices mats <- remarks$mat[[i]] # applied to the chains chain <- remarks$chain[[i]] # number of copies ncopy <- length(mats) if(!multi) { ## save copies as individual chains # The original copy stored as spearated chains biounit0 <- lapply(chain, function(x) trim.pdb(pdb, chain=x, verbose=FALSE) ) # available chain ID repository chains0 <- setdiff(c(LETTERS, letters, 0:9), chain) jch <- 1 used.chain <- NULL biounit <- NULL for(j in 1:ncopy) { mt <- mats[[j]] chs <- strsplit(names(mats)[j], split=" ")[[1]] for(k in chs) { bio <- biounit0[[match(k, chain)]] xyz <- rbind(matrix(bio$xyz, nrow=3), 1) xyz <- matrix(mt %*% xyz, nrow = 1) if(! k %in% used.chain) { ch <- k used.chain <- c(used.chain, k) } else { ch <- chains0[jch] jch = jch + 1 } bio$xyz <- xyz bio$atom[, "chain"] <- ch bio$atom[, c("x", "y", "z")] <- round(matrix(xyz, ncol=3, byrow=TRUE), digits=3) biounit <- c(biounit, list(bio)) } } biounit <- do.call(cat.pdb, c(biounit, list(rechain = FALSE))) # # temporarily write the pdb of biounit and re-read it # tmpf <- tempfile() # write.pdb(biounit, file=tmpf) # biounit = read.pdb(tmpf, verbose=FALSE) } else { ## save copies as multi-models # The original copy biounit <- trim.pdb(pdb, chain=chain, verbose=FALSE) xyz = rbind(matrix(biounit$xyz, nrow=3), 1) ll <- mclapply(2:ncopy, function(j) { mt <- mats[[j]] xyz = matrix(mt %*% xyz, nrow=1) xyz }, mc.cores = ncore ) biounit$xyz <- rbind(biounit$xyz, do.call(rbind, ll)) class(biounit$xyz) <- "xyz" } biounit$call <- cl return(biounit) } ) # end of lapply(1:remarks$num) ## multimeric state nchs <- sapply(biounits, function(x) length(unique(x$atom[, "chain"])) * nrow(x$xyz)) mer <- c("monomer", "dimer", "trimer", "tetramer", "multimer") names(biounits) <- paste(remarks$method, ".determined.", mer[ifelse(nchs>5, 5, nchs)], " (", nchs, " chains)", sep="") # if(length(biounits) == 1) biounits = biounits[[1]] } return(biounits) } bio3d/R/gnm.pdbs.R0000644000176200001440000001313314046015221013302 0ustar liggesusers#' @param ... (in \code{gnm.pdbs}) additional arguments passed to \code{gnm.pdb}. #' @inheritParams aanma.pdbs #' @rdname gnm gnm.pdbs <- function(x, fit=TRUE, full=FALSE, subspace=NULL, rm.gaps=TRUE, gc.first=TRUE, ncore=NULL, ...) { pdbs <- x if(!inherits(pdbs, "pdbs")) stop("input 'pdbs' should be a list object as obtained from 'read.fasta.pdb'") ## Log the call cl <- match.call() ## Parallelized by parallel package ncore <- setup.ncore(ncore) if(ncore>1) { prev.warn <- getOption("warn") options(warn=1) on.exit(options(warn=prev.warn)) } dots <- list(...) if('outmodes' %in% names(dots)) { warning('Customized "outmodes" is not supported') dots$outmodes <- NULL } if("keep" %in% names(dots)) nm.keep <- dots$keep else nm.keep <- NULL dots$check.connect <- FALSE gaps.res <- gap.inspect(pdbs$ali) gaps.pos <- gap.inspect(pdbs$xyz) ## Check connectivity con <- inspect.connectivity(pdbs, cut=4.05) if(!all(con)) { warning(paste(paste(basename(pdbs$id[which(!con)]), collapse=", "), "might have missing residue(s) in structure:\n", " Fluctuations at neighboring positions may be affected.")) } ## Number of modes to store in U.subspace if(is.null(subspace)) { keep <- length(gaps.res$f.inds)-1 } else { keep <- subspace if (length(gaps.res$f.inds) < (keep+1)) keep <- length(gaps.res$f.inds)-1 } if(!is.null(nm.keep) && keep > nm.keep) keep <- nm.keep if(fit) { xyz <- fit.xyz(pdbs$xyz[1, ], pdbs, gaps.pos$f.inds, gaps.pos$f.inds, ncore=ncore) pdbs$xyz[,] <- xyz } #### Prepare for NMA calculation #### ## Fluctuations for each structure if(rm.gaps) flucts <- matrix(NA, nrow=nrow(gaps.res$bin), ncol=length(gaps.res$f.inds)) else flucts <- matrix(NA, nrow=nrow(gaps.res$bin), ncol=ncol(gaps.res$bin)) ## List object to store each modes object if(full) all.modes <- list() else all.modes <- NULL ## 3D array- containing the modes vectors for each structure if(rm.gaps) modes.array <- array(NA, dim=c(length(gaps.res$f.inds), keep, nrow(gaps.res$bin))) else modes.array <- array(NA, dim=c(ncol(pdbs$ali), keep, nrow(gaps.res$bin))) ## store eigenvalues of the first modes L.mat <- matrix(NA, ncol=keep, nrow=nrow(gaps.res$bin)) ### Memory usage ### dims <- dim(modes.array) mem.usage <- sum(c(as.numeric(object.size(modes.array)), as.numeric(object.size(L.mat)), as.numeric(object.size(flucts)), as.numeric(object.size(matrix(NA, ncol=dims[3], nrow=dims[3]))) ))*2 if(full) { if(is.null(nm.keep)) tmpncol <- dims[2] else tmpncol <- nm.keep size.mat <- object.size(matrix(0.00000001, ncol=tmpncol, nrow=dims[1])) size.vec <- object.size(vector(length=dims[1], 'numeric')) tot.size <- ((size.mat * 2) + (size.vec * 4)) * length(pdbs$id) mem.usage <- mem.usage+tot.size } mem.usage=round(mem.usage/1048600,1) #### Print overview of scheduled calcualtion #### cat("\nDetails of Scheduled Calculation:\n") cat(paste(" ...", length(pdbs$id), "input structures", "\n")) if(keep>0) cat(paste(" ...", "storing", keep, "eigenvectors for each structure", "\n")) if(keep>0) cat(paste(" ...", "dimension of x$U.subspace: (", paste(dims[1], dims[2], dims[3], sep="x"), ")\n")) if(fit) cat(paste(" ...", "coordinate superposition prior to NM calculation", "\n")) if(full) cat(paste(" ... individual complete 'gnm' objects will be stored", "\n")) if(rm.gaps) cat(paste(" ... aligned eigenvectors (gap containing positions removed) ", "\n")) if(mem.usage>0) cat(paste(" ...", "estimated memory usage of final 'eGNM' object:", mem.usage, "Mb \n")) cat("\n") ##### Start modes calculation ##### ## Initialize progress bar pb <- .init.pb(ncore, min=0, max=length(pdbs$id)) all.modes <- mclapply(1:length(pdbs$id), function(i) { if(gc.first) gc() pdb <- pdbs2pdb(pdbs, i, rm.gaps = FALSE)[[1]] sele <- match(gaps.res$f.inds, which(!is.gap(pdbs$ali[i, ]))) sele <- as.select(sele) if(rm.gaps) modes <- try(do.call(gnm, c(list(x=pdb, outmodes=sele), dots))) else modes <- try(do.call(gnm, c(list(x=pdb), dots))) if(inherits(modes, 'try-error')) { .close.pb(pb) stop(paste('Encounter errors in ', i, 'th structure', sep='')) } .update.pb(pb) modes$call <- NULL return( modes ) }, mc.cores=ncore) ## Finish progress bar .close.pb(pb) ##### Finalize calculation ##### for(i in 1:length(all.modes)) { if(rm.gaps) { flucts[i, ] <- all.modes[[i]]$fluctuations modes.array[,,i] <- all.modes[[i]]$U[, 2:(keep+1)] } else { flucts[i, !is.gap(pdbs$ali[i, ])] <- all.modes[[i]]$fluctuations modes.array[!is.gap(pdbs$ali[i, ]),, i] <- all.modes[[i]]$U[, 2:(keep+1)] } L.mat[i, ] <- all.modes[[i]]$L[2:(keep+1)] } if(!full) all.modes <- NULL ##### RMSIP ###### rmsip.map <- NULL if(rm.gaps) { rmsip.map <- .calcRMSIP(modes.array, ncore=ncore) rownames(rmsip.map) <- basename(rownames(pdbs$xyz)) colnames(rmsip.map) <- basename(rownames(pdbs$xyz)) if(!fit) warning("rmsip calculated on non-fitted structures: ensure that your input coordinates are pre-fitted.") } rownames(flucts) <- basename(rownames(pdbs$xyz)) out <- list(fluctuations=flucts, rmsip=rmsip.map, U.subspace=modes.array, L=L.mat, full.nma=all.modes, call=cl) class(out) <- c("egnm", "enma") return(out) } bio3d/R/pdb2aln.R0000644000176200001440000000512114046015221013112 0ustar liggesusers"pdb2aln" <- function(aln, pdb, id="seq.pdb", aln.id=NULL, file="pdb2aln.fa", ...) { # check inputs if(!inherits(aln, "fasta") || !is.pdb(pdb)) stop("Incorrect type of input object: Should be 'pdb2aln(aln, pdb, ...)'") cl <- match.call() # Mask the gaps in the first sequence to get the # reference of original alignment positions aln$ali[1, is.gap(aln$ali[1,])] <- "X" aa1 <- pdbseq(pdb) if(!is.null(aln.id)) findid <- grep(aln.id, aln$id) if(is.null(aln.id) || length(findid)==0) { # do sequence-profile alignment naln <- seq2aln(seq2add=aa1, aln=aln, id=id, file=tempfile(), ...) # check if the old alignment doesn't change if(!identical(aln$ali, naln$ali[1:(nrow(naln$ali)-1), !is.gap(naln$ali[1,]), drop = FALSE])) warning("Alignment changed! Try aln.id with the closest sequence ID in the alignment") } else { # do pairwise sequence alignment if(length(findid) > 1) { warning(paste("Multiple entities found in alignment for id=", aln.id, ". Use the first one...", sep="")) } idhit <- findid[1] ##- Align seq to masked template from alignment tmp.msk <- aln$ali[idhit, ] tmp.msk[is.gap(tmp.msk)] <- "X" dots = list(...) dots$outfile = tempfile() args = c(list(aln = seqbind(tmp.msk, aa1)), dots) seq2tmp <- do.call(seqaln.pair, args) ##- check sequence identity ii <- seq2tmp$ali[1,]=='X' ide <- seqidentity(seq2tmp$ali[, !ii])[1,2] if(ide < 0.4) { warning(paste("Sequence identity is too low (<40%).", "You may want profile alignment (set aln.id=NULL)", sep=" ")) } ##- Insert gaps to adjust alignment ins <- is.gap( seq2tmp$ali[1,] ) ntmp <- matrix("-", nrow=nrow(aln$ali), ncol=(ncol(aln$ali)+sum(ins))) ntmp[,!ins] <- aln$ali ## Add seq to bottom of adjusted alignment naln <- seqbind(ntmp, seq2tmp$ali[2,]) rownames(naln$ali) <- c(rownames(aln$ali), id) naln$id <- c(aln$id, id) } # original alignment positions (include gaps) # and CA indices of PDB ref <- matrix(NA, nrow=2, ncol=ncol(naln$ali)) rownames(ref) <- c("ali.pos", "ca.inds") ref[1, !is.gap(naln$ali[1,])] <- 1:ncol(aln$ali) ref[2, !is.gap(naln$ali[id,])] <- atom.select(pdb, "calpha", verbose=FALSE)$atom # remove X naln$ali[1, naln$ali[1,]=="X"] <- "-" if(!is.null(file)) write.fasta(naln, file=file) out <- list(id=naln$id, ali=naln$ali, ref=ref, call=cl) class(out) <- "fasta" return (out) } bio3d/R/read.cif.R0000644000176200001440000000652714046015221013256 0ustar liggesusersread.cif <- function(file, maxlines = -1, multi=FALSE, rm.insert=FALSE, rm.alt=TRUE, verbose=TRUE) { cl <- match.call() warning("beta version of `read.cif`. please use with caution") warning("helix/sheet records could not be parsed") if(missing(file)) { stop("read.cif: please specify a CIF 'file' for reading") } if(!is.logical(multi)) { stop("read.cif: 'multi' must be logical TRUE/FALSE") } ##- Check if file exists locally or on-line putfile <- NULL if(substr(file,1,4)=="http") { ## cpp function can not read from http putfile <- tempfile(fileext=".cif") rt <- try(download.file(file, putfile, quiet = !verbose), silent=TRUE) if(inherits(rt, "try-error")) { file.remove(putfile) stop("File not found at provided URL") } else { file <- putfile } } toread <- file.exists(file) if(toread & basename(file) != file) { file <- normalizePath(file) } ## Check for 4 letter code and possible on-line file if(!toread) { if(nchar(file)==4) { cat(" Note: Accessing on-line CIF file\n") file <- get.pdb(file, path=tempdir(), quiet=TRUE, format="cif") } else { stop("No input CIF file found: check filename") } } ## parse CIF file with cpp function pdb <- .read_cif(file, maxlines=maxlines, multi=multi) ## remove temp file if we downloaded it above if(!is.null(putfile)) { file.remove(putfile) } #if(verbose) # cat(" ", pdb$header, "\n") #pdb$header <- NULL if(!is.null(pdb$error)) stop(paste("Error in reading CIF file", file)) else class(pdb) <- c("pdb") ## this should be cif perhaps? if(pdb$models > 1) pdb$xyz <- matrix(pdb$xyz, nrow=pdb$models, byrow=TRUE) pdb$xyz <- as.xyz(pdb$xyz) ## set empty strings to NA pdb$atom[pdb$atom==""] <- NA pdb$atom[pdb$atom=="?"] <- NA pdb$atom[pdb$atom=="."] <- NA pdb$models <- NULL ## Remove 'Alt records' if (rm.alt) { if ( sum( !is.na(pdb$atom$alt) ) > 0 ) { first.alt <- sort( unique(na.omit(pdb$atom$alt)) )[1] cat(paste(" PDB has ALT records, taking",first.alt,"only, rm.alt=TRUE\n")) alt.inds <- which( (pdb$atom$alt != first.alt) ) # take first alt only if(length(alt.inds)>0) { pdb$atom <- pdb$atom[-alt.inds,] pdb$xyz <- trim.xyz(pdb$xyz, col.inds=-atom2xyz(alt.inds)) } } } ## Remove 'Insert records' if (rm.insert) { if ( sum( !is.na(pdb$atom$insert) ) > 0 ) { cat(" PDB has INSERT records, removing, rm.insert=TRUE\n") insert.inds <- which(!is.na(pdb$atom$insert)) # rm insert positions pdb$atom <- pdb$atom[-insert.inds,] pdb$xyz <- trim.xyz(pdb$xyz, col.inds=-atom2xyz(insert.inds)) } } if(any(duplicated(pdb$atom$eleno))) warning("duplicated element numbers ('eleno') detected") ## construct c-alpha attribute ca.inds <- atom.select.pdb(pdb, string="calpha", verbose=FALSE) pdb$calpha <- seq(1, nrow(pdb$atom)) %in% ca.inds$atom ## set call pdb$call <- cl return(pdb) } bio3d/R/plot.nma.R0000644000176200001440000000156314046015221013326 0ustar liggesusers"plot.nma" <- function(x, pch = 16, col = par("col"), cex = 0.8, mar = c(6, 4, 2, 2), ...) { opar <- par(no.readonly = TRUE) on.exit(par(opar)) par(cex = cex, mar = mar) layout(matrix(c(1,2,3,3), 2, 2, byrow = TRUE)) if(!is.null(x$frequencies)) { freqs <- x$frequencies main <- "Frequencies" } else { freqs <- x$force.constants main <- "Force constants" } if(length(freqs)>=100) n <- 100 else n <- length(freqs) plot(x$L[1:n], type = "h", pch = pch, xlab = "Mode index", ylab = "", main = "Eigenvalues", col = col) plot(freqs[1:n], type = "h", pch = pch, xlab = "Mode index", ylab = "", main = main, col = col) plot.bio3d(x$fluctuations, pch = pch, xlab = "Residue index", ylab = "", main = "Fluctuations", col = col, ...) } bio3d/R/atom.select.R0000644000176200001440000000007214046015221014006 0ustar liggesusers"atom.select" <- function(...) UseMethod("atom.select") bio3d/R/cat.pdb.R0000644000176200001440000000615414046015221013112 0ustar liggesuserscat.pdb <- function(..., renumber=FALSE, rechain=TRUE) { cl <- match.call() objs <- list(...) are.null <- unlist(lapply(objs, is.null)) objs <- objs[!are.null] if(length(objs)==1) if(is.null(cl$rechain)) rechain = FALSE else if(length(objs)<1) return(NULL) if(any(!unlist(lapply(objs, is.pdb)))) stop("provide PDB objects as obtained from read.pdb()") ## avoid NA as chain ID na.inds <- lapply(objs, function(x) is.na(x$atom$chain)) if(any(unlist(na.inds))) { na.inds <- which(unlist(lapply(na.inds, function(x) any(x)))) for(i in na.inds) { tmp <- objs[[i]] tmp$atom$chain[ is.na(tmp$atom$chain) ] <- " " objs[[i]] <- tmp } } ## save original chain IDs ori.chain <- unlist(lapply(objs, function(x) unique(x$atom$chain))) ## always assign new chain identifiers ## and bring back original chain ID later if rechain=FALSE k <- 1 chain.repo <- c(LETTERS, letters, 0:9) for(i in 1:length(objs)) { x <- objs[[i]] objs[[i]] <- .update.chain(x, chain.repo[k:length(chain.repo)]) k <- k + length(unique(x$atom$chain)) } ## concat objects new <- objs[[1]] if(length(objs) > 1) { for(i in 2:length(objs)) { new$atom <- rbind(new$atom, objs[[i]]$atom) new$xyz <- cbind(new$xyz, objs[[i]]$xyz) new$seqres <- c(new$seqres, objs[[i]]$seqres) new$helix <- c(new$helix, objs[[i]]$helix) new$sheet <- c(new$sheet, objs[[i]]$sheet) } } ## merge SSE info for(i in c("helix", "sheet")) { sse <- new[[i]] if(!is.null(sse)) { coms <- names(sse) names(sse) <- NULL # avoid nested naming in results inds <- which(!duplicated(coms)) for(j in inds) sse[[j]] <- do.call(c, sse[coms %in% coms[j]]) sse <- sse[inds] names(sse) <- coms[inds] new[[i]] <- sse } } ## renumber residues chk <- try(clean.pdb(new, consecutive = !rechain, force.renumber = renumber, verbose=FALSE), silent=TRUE) if(inherits(chk, "try-error")) { warning("cat.pdb(): Bad format pdb generated. Try rechain=TRUE and/or renumber=TRUE") new['helix'] <- list(NULL) new['sheet'] <- list(NULL) } else new <- chk if(!rechain) new <- .update.chain(new, ori.chain) ## build new PDB object new$call <- cl ## remap " " chain IDs to NA values new$atom$chain[ new$atom$chain==" " ] <- as.character(NA) ## check connectivity chains <- unique(new$atom$chain) for(i in 1:length(chains)) { sele <- atom.select(new, chain=chains[i], verbose=FALSE) tmp <- trim.pdb(new, sele) if(!inspect.connectivity(tmp)) warning(paste("possible chain break in molecule: chain", chains[i])) } return(new) } .update.chain <- function(x, chain.repo = LETTERS) { new <- x chains <- unique(x$atom$chain) for(j in 1:length(chains)) { inds <- which(x$atom$chain==chains[j]) new$atom$chain[inds] <- chain.repo[j] if(!is.null(x$helix)) new$helix$chain[x$helix$chain==chains[j]] <- chain.repo[j] if(!is.null(x$sheet)) new$sheet$chain[x$sheet$chain==chains[j]] <- chain.repo[j] } new } bio3d/R/gap.inspect.R0000644000176200001440000000200014046015221013774 0ustar liggesusers"gap.inspect" <- function(x) { # Report the number of gaps, ("-",".",NA), per # row (i.e. seq) and col (i.e. position) in a # given "alignment" 'x' if(is.vector(x)) { gaps <- is.gap(x) inds <- which(gaps) f.inds <- which(!gaps) gap.pos <- as.numeric(gaps) gap.col <- gap.pos gap.row <- sum(gaps) } else { if(is.list(x)) { if(inherits(x, "pdbs")) { x <- x$xyz; warning("Taking $xyz component (NOT $ali for which you should use 'gap.inspect(x$ali)')") } else { x <- x$ali } } gap.pos1 <-( as.numeric(x=="-") + as.numeric(x==".") ) gap.pos2 <- as.numeric(is.na(gap.pos1)) gap.pos<-matrix( colSums(rbind(gap.pos1,gap.pos2), na.rm=TRUE), ncol=ncol(x)) gap.col <- colSums(gap.pos) gap.row <- rowSums(gap.pos) inds <- which(gap.col!=0) ##f.inds=(1:ncol(x))[-inds] f.inds <- which(gap.col == 0) } output=list(t.inds=inds, f.inds=f.inds, row=gap.row, col=gap.col, bin=gap.pos) } bio3d/R/read.fasta.pdb.R0000644000176200001440000001535514046015221014356 0ustar liggesusers"read.fasta.pdb" <- function(aln, prefix="", pdbext="", fix.ali = FALSE, pdblist=NULL, ncore=1, nseg.scale=1, progress=NULL, ...) { ## Log the call cl <- match.call() # Parallelized by parallel package (Fri Apr 26 17:58:26 EDT 2013) ncore <- setup.ncore(ncore) if(ncore > 1) { # Issue of serialization problem # Maximal number of cells of a double-precision matrix # that each core can serialize: (2^31-1-61)/8 R_NCELL_LIMIT_CORE = 2.68435448e8 R_NCELL_LIMIT = ncore * R_NCELL_LIMIT_CORE if(nseg.scale < 1) { warning("nseg.scale should be 1 or a larger integer\n") nseg.scale=1 } } if(is.null(pdblist)) { files <- paste(prefix, aln$id, pdbext,sep="") ##cat(files,sep="\n") toread <- file.exists(files) ## check for online files toread[ substr(files,1,4)=="http" ] <- TRUE if(all(!toread)) stop("No corresponding PDB files found") ## Avoid multi-thread downloading if(any(substr(files,1,4) == "http")) { ncore = 1 # options(cores = ncore) } } else { toread <- rep(FALSE, length(pdblist)) files <- rep(NA, length(pdblist)) } blank <- rep(NA, ncol(aln$ali)) retval <- mclapply(1:length(aln$id), function(i) { coords <- NULL; res.nu <- NULL res.bf <- NULL; res.ch <- NULL res.id <- NULL; res.ss <- NULL ## edit for shiny version if(!is.null(progress)) { progress$inc(1/length(aln$id)/2) } ## edit end cat(paste("pdb/seq:",i," name:", aln$id[i]),"\n") if(!toread[i] & is.null(pdblist)) { warning(paste("No PDB file found for seq", aln$id[i], ": (with filename) ",files[i]), call.=FALSE) coords <- rbind(coords, rep(blank,3)) res.nu <- rbind(res.nu, blank) res.bf <- rbind(res.bf, blank) res.ch <- rbind(res.ch, blank) res.id <- rbind(res.id, blank) res.ss <- rbind(res.ss, blank) } else { if(is.null(pdblist)) pdb <- read.pdb( files[i], verbose=FALSE, ... ) else pdb <- pdblist[[i]] ca.inds <- atom.select(pdb, "calpha", verbose=FALSE) pdbseq <- aa321(pdb$atom$resid[ca.inds$atom]) aliseq <- toupper(aln$ali[i,]) tomatch <- gsub("X","[A-Z]",aliseq[!is.gap(aliseq)]) if(length(pdbseq)<1) stop(paste(basename(aln$id[i]), ": insufficent Calpha's in PDB"), call.=FALSE) ##-- Search for ali residues (1:15) in pdb start.num <- regexpr(pattern = paste(c(na.omit(tomatch[1:15])),collapse=""), text = paste(pdbseq,collapse=""))[1] if (start.num == -1) { start.num <- 1 ##stop(paste(basename(aln$id[i]), ": starting residues of sequence does not match starting residues in PDB"), call.=FALSE) } ##-- Numeric vec, 'nseq', for mapping aln to pdb nseq <- rep(NA,length(aliseq)) ali.res.ind <- which(!is.gap(aliseq)) if( length(ali.res.ind) > (length(pdbseq) - start.num + 1) ) { warning(paste(aln$id[i], ": sequence has more residues than PDB has Calpha's"), call.=FALSE) ali.res.ind <- ali.res.ind[1:(length(pdbseq)-start.num+1)] ## exclude extra tomatch <- tomatch[1:(length(pdbseq)-start.num+1)] ## terminal residues } nseq[ali.res.ind] = start.num:((start.num - 1) + length(tomatch)) ##-- Check for miss-matches match <- aliseq != pdbseq[nseq] if ( sum(match, na.rm=TRUE) >= 1 ) { mismatch.ind <- which(match) mismatch <- cbind(aliseq, pdbseq[nseq])[mismatch.ind,] n.miss <- length(mismatch.ind) if(sum(mismatch=="X") != n.miss) { ## ignore masked X res details <- seqbind(aliseq, pdbseq[nseq]) details$ali[is.na(details$ali)] <- "-" rownames(details$ali) <- c("aliseq","pdbseq") details$id <- c("aliseq","pdbseq") resmatch <- which(!apply(details$ali, 2, function(x) x[1]==x[2])) resid <- paste(pdb$atom$resid[ca.inds$atom][nseq][resmatch][1], "-", pdb$atom$resno[ca.inds$atom][nseq][resmatch][1], " (", pdb$atom$chain[ca.inds$atom][nseq][resmatch][1], ")", sep="") cat("\n ERROR Alignment mismatch. See alignment below for further details\n") cat(" (row ", i, " of aln and sequence of '", aln$id[i], "').\n", sep="") cat(" First mismatch residue in PDB is:", resid, "\n") cat(" occurring at alignment position:", which(match)[1], "\n\n") .print.fasta.ali(details) msg <- paste(basename.pdb(aln$id[i]), " alignment and PDB sequence miss-match\n", " beginning at position ", which(match)[1], " (PDB RESNO ", resid, ")", sep="") stop(msg, call.=FALSE) } } ##-- Store nseq justified/aligned PDB data ca.ali <- pdb$atom[ca.inds$atom,][nseq,] coords <- rbind(coords, as.numeric( t(ca.ali[,c("x","y","z")]) )) res.nu <- rbind(res.nu, ca.ali[, "resno"]) res.bf <- rbind(res.bf, as.numeric( ca.ali[,"b"] )) res.ch <- rbind(res.ch, ca.ali[, "chain"]) res.id <- rbind(res.id, ca.ali[, "resid"]) sse <- pdb2sse(pdb, verbose = FALSE) res.ss <- rbind(res.ss, sse[nseq]) } ## end else for (non)missing PDB file return (list(coords=coords, res.nu=res.nu, res.bf=res.bf, res.ch=res.ch, res.id=res.id, res.ss=res.ss)) } , mc.cores=ncore) ## end mylapply retval <- do.call(rbind, retval) coords <- matrix(unlist(retval[, "coords"]), nrow=length(aln$id), byrow=TRUE) res.nu <- matrix(unlist(retval[, "res.nu"]), nrow=length(aln$id), byrow=TRUE) res.bf <- matrix(unlist(retval[, "res.bf"]), nrow=length(aln$id), byrow=TRUE) res.ch <- matrix(unlist(retval[, "res.ch"]), nrow=length(aln$id), byrow=TRUE) res.id <- matrix(unlist(retval[, "res.id"]), nrow=length(aln$id), byrow=TRUE) if( any(sapply(retval[, "res.ss"], is.null)) ) { res.ss <- NULL } else { res.ss <- matrix(unlist(retval[, "res.ss"]), nrow=length(aln$id), byrow=TRUE) rownames(res.ss) <- aln$id } rownames(aln$ali) <- aln$id rownames(coords) <- aln$id rownames(res.nu) <- aln$id rownames(res.bf) <- aln$id rownames(res.ch) <- aln$id rownames(res.id) <- aln$id if(fix.ali) { i1 <- which(is.na(res.nu)) i2 <- which(is.gap(aln$ali)) if(!identical(i1, i2)) { aln$ali[i1] <- aln$ali[i2[1]] warning("$ali component is modified to match $resno") } } out<-list(xyz=coords, resno=res.nu, b=res.bf, chain = res.ch, id=aln$id, ali=aln$ali, resid=res.id, sse=res.ss, call = cl) class(out)=c("pdbs","fasta") class(out$xyz) = "xyz" return(out) } bio3d/R/vmd_colors.R0000644000176200001440000000230414046015221013737 0ustar liggesusersvmd_colors <- function(n=33, picker=FALSE, ...){ ## RGB numbers red <- c(0, 1, 0.35, 1, 1, 0.5, 0.6, 0, 1, 1, 0.25, 0.65, 0.5, 0.9, 0.5, 0.5, 0, 0.88, 0.55, 0, 0, 0, 0, 0.02, 0.01, 0.27, 0.45, 0.9, 1, 0.98, 0.81, 0.89, 0.96) green <- c(0, 0, 0.35, 0.50, 1, 0.5, 0.6, 1, 1, 0.6, 0.75, 0, 0.9, 0.4, 0.3, 0.5, 0, 0.97, 0.9, 0.9, 0.9, 0.88, 0.76, 0.38, 0.04, 0, 0, 0, 0, 0, 0, 0.35, 0.72) blue <- c(1, 0, 0.35, 0, 0, 0.2, 0.6, 0, 1, 0.6, 0.75, 0.65, 0.4, 0.7, 0, 0.75, 0, 0.02, 0.02, 0.04, 0.5, 1, 1, 0.67, 0.93, 0.98, 0.9, 0.9, 0.66, 0.23, 0, 0, 0) ## Setup color indices max.col <- length(red) inds <- (1:n) if( n > max.col ) { inds <- inds %% max.col inds[inds==0] <- max.col warning( paste("Colors will be recycled: input 'n' >", max.col) ) } cols <- rgb(red[inds], green[inds], blue[inds], ...) names(cols) <- c(1:n) if(picker) { ## Draw a pie chart to help with color choice if(n > 50) { warning("Chart will likely be crowded, set n=33 to see all colors") } pie(rep(1, length(cols)), labels=paste(inds, cols), col=cols, cex=0.75) } return(cols) } bio3d/R/sip.R0000644000176200001440000000267114046015221012372 0ustar liggesuserssip <- function(...) UseMethod("sip") sip.nma <- function(a, b, ...) { if(length(a$fluctuations)!=length(b$fluctuations)) stop("dimension mismatch") return(sip.default(a$fluctuations, b$fluctuations)) } sip.enma <- function(enma, ncore=NULL, ...) { if(!inherits(enma, "enma")) stop("provide a 'enma' object as obtain from function 'nma.pdbs()'") ncore <- setup.ncore(ncore, bigmem = FALSE) if(ncore>1) mylapply <- mclapply else mylapply <- lapply gaps <- gap.inspect(enma$fluctuations) dims <- dim(enma$fluctuations) m <- dims[1] mat <- matrix(NA, m, m) ##inds <- pairwise(m) inds <- rbind(pairwise(m), matrix(rep(1:m,each=2), ncol=2, byrow=T)) mylist <- mylapply(1:nrow(inds), function(row) { i <- inds[row,1]; j <- inds[row,2]; out <- list(val=sip.default( enma$fluctuations[i,gaps$f.inds], enma$fluctuations[j,gaps$f.inds]), i=i, j=j) return(out) }) for ( i in 1:length(mylist)) { tmp <- mylist[[i]] mat[tmp$i, tmp$j] <- tmp$val } mat[ inds[,c(2,1)] ] = mat[ inds ] ##diag(mat) <- rep(1, n) colnames(mat) <- basename(rownames(enma$fluctuations)) rownames(mat) <- basename(rownames(enma$fluctuations)) return(round(mat, 6)) } sip.default <- function(v, w, ...) { if(length(v)!=length(w)) stop("dimension mismatch") return(as.numeric(((t(v) %*% w)**2) / ((t(v) %*% v)*(t(w) %*% w)))) } bio3d/R/nma_funs.R0000644000176200001440000002345514046015221013410 0ustar liggesusers".nma.args" <- function(pfc.fun=NULL, ...) { ## Arguments to functions build.hessian and aa2mass bh.names <- names(formals( build.hessian )) am.names <- names(formals( aa2mass )) #rtb.names <- names(formals( rtb )) dots <- list(...) bh.args <- dots[names(dots) %in% bh.names] bh.args <- bh.args[ !('pfc.fun' %in% names(bh.args)) ] am.args <- dots[names(dots) %in% am.names] #rtb.args <- dots[names(dots) %in% rtb.names] ## Check for optional arguments to pfc.fun ff.names <- names(formals( pfc.fun )) ff.args <- dots[names(dots) %in% ff.names] ## Redirect them to build.hessian bh.args <- c(bh.args, ff.args) ## Arguments without destination all.names <- unique(c(bh.names, am.names, ff.names)) if(!all(names(dots) %in% all.names)) { oops <- names(dots)[!(names(dots) %in% all.names)] stop(paste("argument mismatch:", oops)) } if(length(bh.args)==0) bh.args=NULL if(length(am.args)==0) am.args=NULL #if(length(rtb.args)==0) # rtb.args=NULL out <- list(bh.args=bh.args, am.args=am.args) #, rtb.args=rtb.args) return(out) } ## extract effective hessian for RTB approach .nma.trim.hessian.rtb <- function(hessian, inc.inds=NULL, pdb=NULL, nmer=1) { if(!is.matrix(hessian)) stop("hessian must be a matrix") if(is.null(inc.inds)) return(hessian) if(nrow(hessian) == length(inc.inds$xyz)) return(hessian) cat(" Extracting effective Hessian with RTB..") ptm <- proc.time() exc.inds <- combine.select(atom.select(pdb), inc.inds, operator='-', verbose=FALSE) pdb <- trim(pdb, exc.inds) inc.inds <- inc.inds$xyz kaa <- hessian[inc.inds, inc.inds] ei <- rtb(hessian[-inc.inds, -inc.inds], pdb=pdb, mass=FALSE, nmer=nmer, verbose=FALSE) if(any(ei$values<=0)) { warning("Not all eigenvalues are positive!") } inds <- which(ei$values > 0) kaq <- hessian[inc.inds, -inc.inds] kqa <- t(kaq) ukqa <- crossprod(ei$vectors[, inds], kqa) k <- kaa - crossprod(ukqa * (1/ei$values[inds]), ukqa) t <- proc.time() - ptm cat("\tDone in", t[[3]], "seconds.\n") return(k) } ## extract effective hessian ".nma.trim.hessian" <- function(hessian, inc.inds=NULL) { if(!is.matrix(hessian)) stop("hessian must be a matrix") if(is.null(inc.inds)) return(hessian) if(nrow(hessian) == length(inc.inds$xyz)) return(hessian) ptm <- proc.time() cat(" Extracting effective Hessian..") inc.inds <- inc.inds$xyz kaa <- hessian[inc.inds, inc.inds] ##kqq.inv <- solve(hessian[-inc.inds, -inc.inds]) kqq.inv <- chol2inv(chol(hessian[-inc.inds, -inc.inds])) kaq <- hessian[inc.inds, -inc.inds] kqa <- t(kaq) ##k <- kaa - ((kaq %*% kqq.inv) %*% kqa) k <- kaa - crossprod(crossprod(kqq.inv, kqa), kqa) t <- proc.time() - ptm cat("\tDone in", t[[3]], "seconds.\n") return(k) } ## mass-weight hessian ".nma.mwhessian" <- function(hessian, masses=NULL) { if(!is.matrix(hessian)) stop("hessian must be a matrix") if(is.null(masses)) stop("masses must be provided") #cat(" Mass weighting Hessian...") #ptm <- proc.time() dims <- dim(hessian) natoms <- dims[1] / 3 if(length(masses)!=natoms) stop("dimension mismatch") masses <- sqrt(masses) inds <- rep(1:natoms, each=3) col.inds <- seq(1, ncol(hessian), by=3) for ( i in 1:natoms ) { m <- col.inds[i] hessian[,m:(m+2)] <- hessian[,m:(m+2)] * (1/masses[i]) hessian[,m:(m+2)] <- hessian[,m:(m+2)] * (1/masses[inds]) } #t <- proc.time() - ptm #cat("\tDone in", t[[3]], "seconds.\n") return(hessian) } ## wrapper for generating the hessian matrix ".nma.hess" <- function(xyz, pfc.fun, args=NULL, hessian=NULL, pdb=NULL) { natoms <- ncol(as.xyz(xyz))/3 if(nrow(xyz)>1) xyz=xyz[1,,drop=FALSE] ## Build the Hessian Matrix if(is.null(hessian)) { cat(" Building Hessian...") ptm <- proc.time() H <- do.call('build.hessian', c(list(xyz=xyz, pfc.fun=pfc.fun, pdb=pdb), args$bh.args)) t <- proc.time() - ptm cat("\t\tDone in", t[[3]], "seconds.\n") } else { H <- hessian } return(H) } ## diagonalize hessian ".nma.diag" <- function(H, symmetric=TRUE) { ## Diagonalize matrix cat(" Diagonalizing Hessian...") ptm <- proc.time() ei <- eigen(H, symmetric=symmetric) t <- proc.time() - ptm cat("\tDone in", t[[3]], "seconds.\n") return(ei) } ## build a NMA object ".nma.finalize" <- function(ei, xyz, temp, masses, natoms, keep, call) { if(length(masses)>0) mass <- TRUE else mass <- FALSE xyz=as.xyz(xyz) dims <- dim(ei$vectors) dimchecks <- c(ncol(xyz)/3==natoms, ifelse(mass, length(masses)==natoms, TRUE), dims[1]/3==natoms) #dims[2]/3==natoms) if(!all(dimchecks)) stop(paste("dimension mismatch when generating nma object\n", paste(dimchecks, collapse=", "))) ## Raw eigenvalues ei$values <- round(ei$values, 6) ## Trivial modes first - sort on abs(ei$values) sort.inds <- order(abs(ei$values)) ei$values <- ei$values[sort.inds] ei$vectors <- ei$vectors[, sort.inds] ## hard code 6 trivial modes triv.modes <- seq(1, 6) ## keep only a subset of modes - including trivial modes if(!is.null(keep)) { if(keep>ncol(ei$vectors)) keep <- ncol(ei$vectors) keep.inds <- seq(1, keep) ei$vectors <- ei$vectors[,keep.inds] ei$values <- ei$values[keep.inds] } ## Frequencies are given by if (mass) { pi <- 3.14159265359 freq <- sqrt(abs(ei$values)) / (2 * pi) force.constants <- NULL } else { freq <- NULL force.constants <- ei$values } ## Raw unmodified eigenvectors: ## ei$vectors ## V holds the eigenvectors converted to unweighted Cartesian coords: V <- ei$vectors ## Change to non-mass-weighted eigenvectors if(mass) { wts.sqrt <- sqrt(masses) tri.inds <- rep(1:natoms, each=3) V <- apply(V, 2, '*', 1 / wts.sqrt[tri.inds]) } ## Temperature scaling kb <- 0.00831447086363271 if ( !is.null(temp) ) { if (!is.null(freq)) { amplitudes <- sqrt(2* temp * kb) / (2* pi * freq[ -triv.modes ]) amplitudes <- c(rep(1,length(triv.modes)), amplitudes) } else if(!is.null(force.constants)) { amplitudes <- sqrt((2* temp * kb) / force.constants[ -triv.modes ]) amplitudes <- c(rep(1,length(triv.modes)), amplitudes) } } else { amplitudes <- rep(1, times=3*natoms) } ## Temperature scaling of eigenvectors for ( i in (length(triv.modes)+1):ncol(V) ) { V[,i] <- (V[,i] * amplitudes[i]) } ## Check if first modes are zero-modes if(any(ei$values<0)) { warning("Negative eigenvalue(s) detected! \ This can be an indication of an unphysical input structure.") } ## Output to class "nma" nma <- list(modes=V, frequencies=NULL, force.constants=NULL, fluctuations=NULL, U=ei$vectors, L=ei$values, xyz=xyz, mass=masses, temp=temp, triv.modes=length(triv.modes), natoms=natoms, call=call) if(mass) { class(nma) <- c("VibrationalModes", "nma") nma$frequencies <- freq } else { class(nma) <- c("EnergeticModes", "nma") nma$force.constants <- force.constants } ## Calculate mode fluctuations nma$fluctuations <- fluct.nma(nma, mode.inds=NULL) ## Notes: ## U are the raw unmodified eigenvectors ## These mode vectors are in mass-weighted coordinates and not ## scaled by the thermal amplitudes, so they are orthonormal. ## V holds the eigenvectors converted to unweighted Cartesian ## coordinates. Unless you set temp=NULL, the modes are ## also scaled by the thermal fluctuation amplitudes. return(nma) } .inds2ids <- function(pdb, inds=NULL) { if(!is.null(inds)) { paste(pdb$atom$chain[inds$atom], pdb$atom$resno[inds$atom], pdb$atom$elety[inds$atom], pdb$atom$insert[inds$atom], sep="_") } else { paste(pdb$atom$chain, pdb$atom$resno, pdb$atom$elety, pdb$atom$insert, sep="_") } } ".match.sel" <- function(a, b, inds) { ## a= original pdb ## b= trimmed pdb ## inds= indices of pdb 'a' to keep ## find corresponding atoms in b ids.a <- .inds2ids(a, inds) ids.b <- .inds2ids(b) inds <- which(ids.b %in% ids.a) return(as.select(inds)) } ".nma.reduce.pdb" <- function(pdb) { pdb$atom$resid <- aa123(aa321(pdb$atom$resid)) ## Selected side chain atoms ## Using whatever is furthest away from CA, including N and O atoms. aa.elety <- list( ARG = c("NH1", "NH2"), HIS = c("CE1", "CG"), LYS = c("NZ"), ASP = c("OD1", "OD2"), GLU = c("OE1", "OE2"), SER = c("OG"), THR = c("CG2", "OG1"), ## "OG1" ASN = c("OD1", "ND2"), GLN = c("NE2", "OE1"), CYS = c("SG"), ##GLY = c(), PRO = c("CG"), ALA = c("CB"), VAL = c("CG1", "CG2"), ILE = c("CD1", "CG2"), LEU = c("CD1", "CD2"), MET = c("CE"), PHE = c("CZ"), TYR = c("OH"), TRP = c("CH2", "NE1") ) pdb <- trim(pdb, "noh") sele <- atom.select(pdb, elety=c("N", "CA", "C")) for(i in 1:length(aa.elety)) { resid = names(aa.elety)[i] elety = aa.elety[[i]] sele2 <- atom.select(pdb, resid = resid, elety = elety) if(length(sele2$atom)>0) { sele <- combine.select(sele, sele2, operator="OR", verbose=FALSE) } } #return(sele) return(trim(pdb, sele)) } bio3d/R/bwr.colors.R0000644000176200001440000000156414046015221013671 0ustar liggesusers"bwr.colors" <- function (n) { # Derived from the function colorpanel # by Gregory R. Warnes if(n<3) warning("not sensible to ask for less than 3 colors") odd = FALSE if (n != as.integer(n/2) *2) { n <- n + 1 odd = TRUE } low <- col2rgb("blue") mid <- col2rgb("white") high <- col2rgb("red") lower <- floor(n/2) upper <- n - lower red <- c(seq(low[1, 1], mid[1, 1], length = lower), seq(mid[1,1], high[1, 1], length = upper))/255 green <- c(seq(low[3, 1], mid[3, 1], length = lower), seq(mid[3, 1], high[3, 1], length = upper))/255 blue <- c(seq(low[2, 1], mid[2, 1], length = lower), seq(mid[2, 1], high[2, 1], length = upper))/255 if (odd) { red <- red[-(lower + 1)] green <- green[-(lower + 1)] blue <- blue[-(lower + 1)] } rgb(red, blue, green) } bio3d/R/dm.R0000644000176200001440000000324014046015221012170 0ustar liggesusers"dm" <- function(...) UseMethod("dm") "dm.pdb" <- function(pdb, inds=NULL, grp=TRUE, verbose=TRUE, ...) { if(!is.pdb(pdb)) { stop("input 'pdb' should be either: 1. an object returned from from 'read.pdb' or 2. a numeric 'xyz' vector of coordinates") } if(!is.null(inds)) { pdb <- trim.pdb(pdb, inds) } if(grp) grpby <- paste(pdb$atom$resno, pdb$atom$chain, pdb$atom$insert, sep="-") else grpby <- NULL d <- dm.xyz(pdb$xyz, grpby=grpby, ...) class(d) <- "dmat" return(d) } "dm.pdbs" <- function(pdbs, rm.gaps=FALSE, all.atom=FALSE, aligned.atoms.only=NULL, ...) { if(!is.pdbs(pdbs)) stop("Input should be a 'pdbs' object as obtained from 'read.fasta.pdb()' or 'read.all()'.") if(rm.gaps) { dots <- list(...) if("grpby" %in% names(dots) && !is.null(dots[["grpby"]])) { if(length(unique(dots[["grpby"]])) != ncol(pdbs$ali)) { stop("rm.gaps=TRUE not supported for non-residue wise grouping.") } } } if(!all.atom) { dmat <- dm.xyz(pdbs$xyz, ...) } else { # set a new default value of grpby for all-atom distance matrix dm.default <- list(grpby=pdbs$all.grpby) dm.args <- .arg.filter(dm.default, dm.xyz, ...) if(is.null(aligned.atoms.only)) { aligned.atoms.only <- FALSE } if(aligned.atoms.only) { # only consider aligned (equivalent) atoms gaps <- gap.inspect(pdbs$all) pdbs$all[, gaps$t.inds] <- NA } dmat <- do.call("dm.xyz", c(list(xyz=pdbs$all), dm.args)) } if(rm.gaps) { gaps.res <- gap.inspect(pdbs$ali) dmat <- dmat[gaps.res$f.inds, gaps.res$f.inds, ] } return(dmat) } bio3d/R/nma.pdbs.R0000644000176200001440000003154414046015221013302 0ustar liggesusers## Two options - both calculating modes on the FULL structure: ## 1 - use k <- kaa - ((kaq %*% kqq.inv) %*% kqa) to derive hessian for core atoms ## 2 - return the full objects "nma.pdbs" <- function(pdbs, fit=TRUE, full=FALSE, subspace=NULL, rm.gaps=TRUE, varweight=FALSE, outpath = NULL, ncore=1, progress = NULL, ...) { if(!inherits(pdbs, "pdbs")) stop("input 'pdbs' should be a list object as obtained from 'read.fasta.pdb'") ## Log the call cl <- match.call() if(!is.null(outpath)) dir.create(outpath, FALSE) ## Parallelized by parallel package ncore <- setup.ncore(ncore, bigmem = TRUE) prev.warn <- getOption("warn") if(ncore>1) { mylapply <- mclapply options(warn=1) } else mylapply <- lapply ## Passing arguments to functions aa2mass and nma am.names <- names(formals( aa2mass )) nm.names <- names(formals( nma.pdb )) dots <- list(...) am.args <- dots[names(dots) %in% am.names] nm.args <- dots[names(dots) %in% nm.names] ## Limiting input if("mass" %in% names(nm.args)) mass <- nm.args$mass else mass <- TRUE if("ff" %in% names(nm.args)) ff <- nm.args$ff else ff <- 'calpha' if("temp" %in% names(nm.args)) temp <- nm.args$temp else temp <- 300 if("keep" %in% names(nm.args)) nm.keep <- nm.args$keep else nm.keep <- NULL if(!all((names(nm.args) %in% c("mass", "ff", "temp", "keep")))) { war <- paste(names(nm.args)[! names(nm.args) %in% c("mass", "ff", "temp", "keep") ], collapse=", ") warning(paste("ignoring arguments:", war)) } ## Force field pfc.fun <- load.enmff(ff) ## Check for optional arguments to pfc.fun ff.names <- names(formals( pfc.fun )) ff.args <- dots[names(dots) %in% ff.names] ## Set indicies gaps.res <- gap.inspect(pdbs$resno) gaps.pos <- gap.inspect(pdbs$xyz) ## check for missing masses before we start calculating if(any(pdbs$ali=="X") & mass==TRUE) { resnames <- c(bio3d::aa.table$aa3, names(am.args$mass.custom)) ops.inds <- which(pdbs$ali=="X", arr.ind=TRUE) unknowns <- c() for(i in 1:nrow(ops.inds)) { j <- ops.inds[i, ] resid <- pdbs$resid[j[1], j[2]] if(any(!(resid %in% resnames))) unknowns <- c(unknowns, resid[!resid%in%resnames]) } if(length(unknowns)>0) { options(warn=prev.warn) unknowns <- paste(unique(unknowns), collapse=", ") stop(paste0("Unknown mass for amino acid(s): ", unknowns, "\n Provide mass with argument 'mass.custom=list(", unknowns[1], "=100.00)',", "\n or ommit mass weighting with argument 'mass=FALSE'.")) } } ## Check connectivity con <- inspect.connectivity(pdbs, cut=4.05) if(!all(con)) { warning(paste(paste(basename(pdbs$id[which(!con)]), collapse=", "), "might have missing residue(s) in structure:\n", " Fluctuations at neighboring positions may be affected.")) } ## Use for later indexing pdbs$inds <- matrix(NA, ncol=ncol(pdbs$resno), nrow=nrow(pdbs$resno)) ## Number of modes to store in U.subspace if(is.null(subspace)) { keep <- length(gaps.pos$f.inds)-6 } else { keep <- subspace if (length(gaps.pos$f.inds) < (keep+6)) keep <- length(gaps.pos$f.inds)-6 } ## Coordiantes - fit or not if(fit) { xyz <- fit.xyz(fixed = pdbs$xyz[1, ], mobile = pdbs, fixed.inds = gaps.pos$f.inds, mobile.inds = gaps.pos$f.inds, ncore = ncore) } else xyz <- pdbs$xyz ## Fluctuations for each structure if(rm.gaps) flucts <- matrix(NA, nrow=nrow(gaps.res$bin), ncol=length(gaps.res$f.inds)) else flucts <- matrix(NA, nrow=nrow(gaps.res$bin), ncol=ncol(gaps.res$bin)) ## store residue numbers (same as pdbs$inds[,gaps$f.inds]) ##resnos <- flucts ## List object to store each modes object if(full) all.modes <- list() else all.modes <- NULL ## 3D array- containing the modes vectors for each structure if(rm.gaps) modes.array <- array(NA, dim=c(length(gaps.pos$f.inds), keep, nrow(gaps.res$bin))) else modes.array <- array(NA, dim=c(ncol(pdbs$xyz), keep, nrow(gaps.res$bin))) ## store eigenvalues of the first modes L.mat <- matrix(NA, ncol=keep, nrow=nrow(gaps.res$bin)) if(is.null(outpath)) fname <- tempfile(fileext = "pdb") ##### Start calculation of variance weighting ##### wts <- NULL if(is.logical(varweight)) { if(varweight) wts <- var.xyz(xyz, weights=TRUE) } else { dims.vw <- dim(varweight) if(all(dims==ncol(xyz)/3)) { wts <- varweight varweight <- TRUE } else stop("incompatible length of varweight vector") } ### Memory usage ### dims <- dim(modes.array) mem.usage <- sum(c(as.numeric(object.size(modes.array)), as.numeric(object.size(L.mat)), as.numeric(object.size(flucts)), as.numeric(object.size(matrix(NA, ncol=dims[3], nrow=dims[3]))) ))*2 if(full) { if(is.null(nm.keep)) tmpncol <- dims[2] else tmpncol <- nm.keep size.mat <- object.size(matrix(0.00000001, ncol=tmpncol, nrow=dims[1])) size.vec <- object.size(vector(length=dims[1], 'numeric')) tot.size <- ((size.mat * 2) + (size.vec * 4)) * length(pdbs$id) mem.usage <- mem.usage+tot.size } mem.usage=round(mem.usage/1048600,1) #### Print overview of scheduled calcualtion #### cat("\nDetails of Scheduled Calculation:\n") cat(paste(" ...", length(pdbs$id), "input structures", "\n")) if(keep>0) cat(paste(" ...", "storing", keep, "eigenvectors for each structure", "\n")) if(keep>0) cat(paste(" ...", "dimension of x$U.subspace: (", paste(dims[1], dims[2], dims[3], sep="x"), ")\n")) if(fit) cat(paste(" ...", "coordinate superposition prior to NM calculation", "\n")) if(varweight) cat(paste(" ...", "weighting force constants based on structural variance", "\n")) if(full) cat(paste(" ... individual complete 'nma' objects will be stored", "\n")) if(rm.gaps) cat(paste(" ... aligned eigenvectors (gap containing positions removed) ", "\n")) if(mem.usage>0) cat(paste(" ...", "estimated memory usage of final 'eNMA' object:", mem.usage, "Mb \n")) cat("\n") ##### Start modes calculation ##### pb <- txtProgressBar(min=0, max=length(pdbs$id), style=3) ## shared memory to follow progress bar if(ncore>1) iipb <- bigmemory::big.matrix(1, length(pdbs$id), init=NA) ## call .calcAlnModes for each structure in 'pdbs' alnModes <- mylapply(1:length(pdbs$id), .calcAlnModes, pdbs, xyz, gaps.res, mass, am.args, nm.keep, temp, keep, wts, rm.gaps, full, pfc.fun, ff, ff.args, outpath, pb, ncore, env=environment(), ## edit for shiny version progress=progress) ## edit end close(pb) ##### Collect data ##### for(i in 1:length(alnModes)) { tmp.modes <- alnModes[[i]] modes.array[,,i] = tmp.modes$U L.mat[i, ] = tmp.modes$L flucts[i, ] = tmp.modes$flucts if(full) all.modes[[i]] = tmp.modes$modes } remove(alnModes) invisible(gc()) ##### RMSIP ###### rmsip.map <- NULL if(rm.gaps) { rmsip.map <- .calcRMSIP(modes.array, ncore=ncore) rownames(rmsip.map) <- basename(rownames(pdbs$xyz)) colnames(rmsip.map) <- basename(rownames(pdbs$xyz)) if(!fit) warning("rmsip calculated on non-fitted structures: ensure that your input coordinates are pre-fitted.") } if(ncore>1) { # rm(iipb, pos = ".GlobalEnv") ## remove global iipb variable options(warn=prev.warn) ## restore warning option } rownames(flucts) <- basename(rownames(pdbs$xyz)) out <- list(fluctuations=flucts, rmsip=rmsip.map, U.subspace=modes.array, L=L.mat, full.nma=all.modes, xyz=xyz, call=cl) class(out) = "enma" return(out) } .calcRMSIP <- function(x, ncore=1) { if(ncore>1) mylapply <- mclapply else mylapply <- lapply n <- dim(x)[3] mat <- matrix(NA, n, n) inds <- rbind(pairwise(n), matrix(rep(1:n,each=2), ncol=2, byrow=T)) mylist <- mylapply(1:nrow(inds), function(row) { return(list( rmsip=rmsip(x[,,inds[row,1]], x[,,inds[row,2]])$rmsip, i=inds[row,1], j=inds[row,2]) ) }) for ( i in 1:length(mylist)) { tmp.rmsip <- mylist[[i]] mat[tmp.rmsip$i, tmp.rmsip$j] <- tmp.rmsip$rmsip } mat[ inds[,c(2,1)] ] = mat[ inds ] return(round(mat, 4)) } ## Calculate 'aligned' normal modes of structure i in pdbs .calcAlnModes <- function(i, pdbs, xyz, gaps.res, mass, am.args, nm.keep, temp, keep, wts, rm.gaps, full, pfc.fun, ff, ff.args, outpath, pb, ncore, env=NULL, ## edit for shiny version progress=NULL) { ## edit end ## Set indices for this structure only f.inds <- NULL f.inds$res <- which(gaps.res$bin[i,]==0) f.inds$pos <- atom2xyz(f.inds$res) ## similar to $resno but sequential indices pdbs$inds[i, f.inds$res] <- seq(1, length(f.inds$res)) ## Indices to extract from Hessian inds.inc <- pdbs$inds[i, gaps.res$f.inds] inds.exc <- pdbs$inds[i, gaps.res$t.inds][ !is.na(pdbs$inds[i, gaps.res$t.inds]) ] inds.inc.xyz <- atom2xyz(inds.inc) inds.exc.xyz <- atom2xyz(inds.exc) ## Generate content of PDB object tmp.xyz <- xyz[i, f.inds$pos] resno <- pdbs$resno[i,f.inds$res] chain <- pdbs$chain[i,f.inds$res] ## Fix for missing chain IDs chain[is.na(chain)] <- "" ## 3-letter AA code is provided in the pdbs object ## avoid using aa123() here (translates TPO to THR) resid <- pdbs$resid[i,f.inds$res] sequ <- resid ## Build a dummy PDB to use with function nma.pdb() pdb.in <- as.pdb.default(xyz=tmp.xyz, elety="CA", resno=resno, chain=chain, resid=resid, verbose=FALSE) if(!is.null(outpath)) { fname <- file.path(outpath, basename(pdbs$id[i])) write.pdb(pdb.in, file=fname) } if(mass) { masses <- try( do.call('aa2mass', c(list(pdb=sequ, inds=NULL), am.args)), silent=TRUE ) if(inherits(masses, "try-error")) { hmm <- attr(masses,"condition") cat("\n\n") stop(paste(hmm$message, "in file", basename(pdbs$id[i]))) } masses.in <- masses masses.out <- masses } else { masses.in <- NULL masses.out <- NULL } natoms.in <- nrow(pdb.in$atom) natoms.out <- natoms.in if(rm.gaps) { ## Second PDB - containing only the aligned atoms sele <- list(atom=inds.inc, xyz=inds.inc.xyz) class(sele) <- "select" pdb.out <- trim.pdb(pdb.in, sele) natoms.out <- nrow(pdb.out$atom) if(mass) masses.out <- masses.in[ inds.inc ] inc.inds <- list(xyz=inds.inc.xyz) } else { pdb.out <- pdb.in inc.inds <- NULL } ## Build full hessian bh.args <- c(list(fc.weights=wts[f.inds$res, f.inds$res]), ff.args) args <- list(bh.args=bh.args) invisible(capture.output( hessian <- .nma.hess(pdb.in$xyz, pfc.fun=pfc.fun, pdb=pdb.in, args=args, hessian=NULL))) ## extract effective hessian invisible(capture.output( hessian <- .nma.trim.hessian(hessian, inc.inds=inc.inds))) ## Mass-weight hessian if(!is.null(masses.out)) invisible(capture.output( hessian <- .nma.mwhessian(hessian, masses=masses.out))) ## Diagonalize invisible(capture.output( ei <- .nma.diag(hessian) )) ## Build an NMA object invisible(capture.output( modes <- .nma.finalize(ei, xyz=pdb.out$xyz, temp=temp, masses=masses.out, natoms=natoms.out, keep=nm.keep, call=NULL) )) if(rm.gaps) modes.mat <- matrix(NA, ncol=keep, nrow=nrow(modes$U)) else modes.mat <- matrix(NA, ncol=keep, nrow=ncol(pdbs$xyz)) j <- 1 for(k in 7:(keep+6)) { if(rm.gaps) modes.mat[, j] <- modes$U[,k] else modes.mat[f.inds$pos, j] <- modes$U[,k] j <- j+1 } if(rm.gaps) { flucts <- modes$fluctuations } else { flucts <- rep(NA, length=ncol(pdbs$resno)) flucts[f.inds$res] <- modes$fluctuations } ## Progress bar if(ncore>1) { iipb <- get("iipb", envir = env) iipb[1,i] <- 1 j <- length(which(!is.na(bigmemory::as.matrix(iipb)))) } else j <- i setTxtProgressBar(pb, j) ## edit for shiny version if(!is.null(progress)) { progress$inc(1/length(pdbs$id)) } ## edit end L <- modes$L[seq(7, keep+6)] if(!full) { remove(modes) modes <- NULL } out <- list(modes=modes, U=modes.mat, L=L, flucts=flucts) ##f.inds=f.inds) invisible(gc()) return(out) } bio3d/R/struct.aln.R0000644000176200001440000001521414046015221013671 0ustar liggesusers"struct.aln" <- function(fixed, mobile, fixed.inds = NULL, mobile.inds = NULL, write.pdbs = TRUE, outpath = "fitlsq", prefix = c("fixed", "mobile"), max.cycles = 10, cutoff = 0.5, ... ) { if(missing(fixed)) stop("align: must supply 'pdb' object, i.e. from 'read.pdb'") if(missing(mobile)) stop("align: must supply 'pdb' object, i.e. from 'read.pdb'") if(!is.pdb(fixed)) stop("align: 'fixed' must be of type 'pdb'") if(!is.pdb(mobile)) stop("align: 'mobile' must be of type 'pdb'") ## if indices are provided, make new PDB entities if ( !is.null(fixed.inds) ) { if(length(fixed.inds$atom)<2) stop("align: insufficent atom indices for fitting") #a <- NULL #a$atom <- fixed$atom[fixed.inds$atom, ] #a$xyz <- fixed$xyz[fixed.inds$xyz] #a$calpha <- as.logical(a$atom[,"elety"] == "CA") a <- trim.pdb(fixed, fixed.inds) } else { a <- fixed fixed.inds <- atom.select(fixed, 'all', verbose=FALSE) } if ( !is.null(mobile.inds) ) { if(length(mobile.inds$atom)<2) stop("align: insufficent atom indices for fitting") #b <- NULL #b$atom <- mobile$atom[mobile.inds$atom, ] #b$xyz <- mobile$xyz[mobile.inds$xyz] #b$calpha <- as.logical(b$atom[,"elety"] == "CA") b <- trim.pdb(mobile, mobile.inds) } else { b <- mobile mobile.inds <- atom.select(mobile, 'all', verbose=FALSE) } "xyz.dist" <- function(v) { a <- v[1:3]; b <- v[4:6] sqrt(sum((a-b)**2)) } "resi.dev" <- function(xyz.a, xyz.b, cycle=1, cutoff = 0.5) { k <- matrix(xyz.a, ncol=3, byrow=T) l <- matrix(xyz.b, ncol=3, byrow=T) devs <- apply( cbind(k,l), 1, "xyz.dist") m <- median(devs) std <- sd(devs) cut <- m + (2*std) inds <- which( devs > cut ) if ( (std < cutoff) || (length(inds)==0) ) { return( NULL ) } else { cat( " Cycle ", i, ": ", length(inds), " atoms rejected", "\n", sep="") cat(" Mean: ", round(m,1), " Std: ", round(std,1), " Cut: ", round(cut,1), "\n", sep="" ) return(inds) } } "remap.inds" <- function(pdb.init, inds.init, inds.trunc.atom) { ## Map back to indices for the entire PDB given inds.full <- NULL inds.full$atom <- inds.init$atom[inds.trunc.atom] inds.full$xyz <- atom2xyz(inds.full$atom) inds.full$logical <- atom2xyz(seq(1, nrow(pdb.init$atom))) %in% inds.full$xyz return(inds.full) } "parse.pdb" <- function(pdb, gaps, s, i) { pdbseq <- aa321(pdb$atom[pdb$calpha, "resid"]) aliseq <- toupper(s$ali[i, ]) tomatch <- gsub("X", "[A-Z]", aliseq[!is.gap(aliseq)]) start.num <- regexpr(pattern = paste(c(na.omit(tomatch[1:15])), collapse = ""), text = paste(pdbseq, collapse = ""))[1] nseq <- rep(NA, length(aliseq)) ali.res.ind <- which(!is.gap(aliseq)) ali.res.ind <- ali.res.ind[1:length(pdbseq)] nseq[ali.res.ind] = start.num:((start.num - 1) + length(tomatch)) pdb$atom <- cbind(pdb$atom, index=seq(1, nrow(pdb$atom))) ca.ali <- pdb$atom[pdb$calpha, ][nseq, ] at.inds <- ca.ali[, "index"] return(at.inds) } ## PDB list for sequence alignment pdb.list <- NULL pdb.list[[1]] <- a pdb.list[[2]] <- b ## Sequence alignment s <- lapply(pdb.list, pdbseq) s <- t(sapply(s, `[`, 1:max(sapply(s, length)))) s[is.na(s)] <- "-" s <- seqaln(s, id = c("fixed", "mobile"), ...) gaps <- gap.inspect(s$ali) ## Parse truncated PDBs at.inds.a <- parse.pdb(a, gaps, s, 1) at.inds.b <- parse.pdb(b, gaps, s, 2) ## Fetch indices for fitting (truncated pdb) at.a <- as.numeric(at.inds.a[gaps$f.inds]) at.b <- as.numeric(at.inds.b[gaps$f.inds]) ## Indices for full pdb - done with the truncated ones a.inds.full <- remap.inds(fixed, fixed.inds, at.a) b.inds.full <- remap.inds(mobile, mobile.inds, at.b) ## Perform the initial fitting fit <- rot.lsq(mobile$xyz, fixed$xyz, xfit=b.inds.full$logical, yfit=a.inds.full$logical) rmsd.init <- rmsd(as.vector(fixed$xyz), fit, a.inds=a.inds.full$xyz, b.inds=b.inds.full$xyz) cat("\n") cat(" Initial RMSD (", length(gaps$f.inds), " atoms): ", rmsd.init, "\n", sep="") if ( write.pdbs ) { dir.create(outpath, FALSE) fname <- file.path(outpath, paste(prefix[2], "_", 0, ".pdb", sep="")) write.pdb(mobile, xyz=fit, file=fname) } ## Refinement process rmsd.all <- c(rmsd.init) for ( i in seq(1,max.cycles) ) { if(i>max.cycles) break ## Find residues with largest structural deviation exc <- resi.dev(fixed$xyz[a.inds.full$xyz], fit[b.inds.full$xyz], cycle = i, cutoff = cutoff) if ( is.null(exc) ) { break } else { ## Remove atoms for new round of fitting exc <- atom2xyz(exc) tmp <- seq(1,length( a.inds.full$logical )) exc.a <- tmp[which( a.inds.full$logical )][exc] a.inds.full$logical[exc.a] <- FALSE tmp <- seq(1,length( b.inds.full$logical )) exc.b <- tmp[which( b.inds.full$logical )][exc] b.inds.full$logical[exc.b] <- FALSE ## Build new xyz and atom indices a.inds.full$xyz <- which(a.inds.full$logical) b.inds.full$xyz <- which(b.inds.full$logical) a.inds.full$atom <- xyz2atom(a.inds.full$xyz) b.inds.full$atom <- xyz2atom(b.inds.full$xyz) ## Fit based on new indices fit <- rot.lsq(mobile$xyz, fixed$xyz, xfit=b.inds.full$logical, yfit=a.inds.full$logical) if ( write.pdbs ) { fname <- file.path(outpath, paste(prefix[2], "_", i, ".pdb", sep="")) write.pdb(mobile, xyz=fit, file=fname) } ## Calculate RMSD tmp.rmsd <- rmsd(as.vector(fixed$xyz), fit, a.inds=a.inds.full$xyz, b.inds.full$xyz) rmsd.all <- c(rmsd.all, tmp.rmsd) num.resi <- length(which(a.inds.full$logical))/3 cat(" RMSD (", num.resi, " of ", length(gaps$f.inds), " atoms): ", tmp.rmsd, "\n", sep="") } } if ( write.pdbs ) { fname <- file.path(outpath, paste(prefix[1], ".pdb", sep="")) write.pdb(fixed, file=fname) } a.inds.full$logical <- NULL b.inds.full$logical <- NULL out <- list("a.inds"=a.inds.full, "b.inds"=b.inds.full, xyz=as.xyz(fit), rmsd=rmsd.all) return(out) } bio3d/R/clean.pdb.R0000644000176200001440000003356214046015221013430 0ustar liggesusers#' Inspect And Clean Up A PDB Object #' #' Inspect alternative coordinates, chain breaks, bad residue #' numbering, non-standard/unknow amino acids, etc. Return #' a 'clean' pdb object with fixed residue numbering and optionally #' relabeled chain IDs, corrected amino acid names, removed water, #' ligand, or hydrogen atoms. All changes are recorded in a log in the #' returned object. #' #' @details call for its effects. #' #' @param pdb an object of class \code{pdb} as obtained from #' function \code{\link{read.pdb}}. #' @param consecutive logical, if TRUE renumbering will result in #' consecutive residue numbers spanning all chains. Otherwise new residue #' numbers will begin at 1 for each chain. #' @param force.renumber logical, if TRUE atom and residue records are renumbered #' even if no 'insert' code is found in the \code{pdb} object. #' @param fix.chain logical, if TRUE chains are relabeled based on chain breaks detected. #' @param fix.aa logical, if TRUE non-standard amino acid names are converted into #' equivalent standard names. #' @param rm.wat logical, if TRUE water atoms are removed. #' @param rm.lig logical, if TRUE ligand atoms are removed. #' @param rm.h logical, if TRUE hydrogen atoms are removed. #' @param verbose logical, if TRUE details of the conversion process are printed. #' #' @return a 'pdb' object with an additional \code{$log} component storing #' all the processing messages. #' #' @seealso \code{\link{read.pdb}} #' #' @author Xin-Qiu Yao & Barry Grant #' #' @examples #' \donttest{ #' # PDB server connection required - testing excluded #' #' pdb <- read.pdb("1a7l") #' clean.pdb(pdb) #' } "clean.pdb" <- function(pdb, consecutive=TRUE, force.renumber = FALSE, fix.chain = FALSE, fix.aa = FALSE, rm.wat = FALSE, rm.lig = FALSE, rm.h = FALSE, verbose=FALSE) { if(!is.pdb(pdb)) stop("Input should be a 'pdb' object") cl <- match.call() ## processing message ## stored as an N-by-3 matrix with columns: ## FACT, OPERATION, IMPORTANT NOTE log <- NULL ## a flag to indicate if the pdb is clean clean <- TRUE ## Recognized amino acid names prot.aa <- bio3d::aa.table$aa3 ## for residues and atoms renumbering first.eleno = 1 first.resno = 1 ## remove water if(rm.wat) { wat <- atom.select(pdb, "water", verbose = FALSE) if(length(wat$atom) > 0) { pdb$atom <- pdb$atom[-wat$atom, ,drop=FALSE] pdb$xyz <- pdb$xyz[, -wat$xyz, drop=FALSE] log <- .update.log(log, paste("Found", length(wat$atom), "water atoms"), "REMOVED") } } ## remove ligands if(rm.lig) { lig <- atom.select(pdb, "ligand", verbose = FALSE) if(length(lig$atom) > 0) { pdb$atom <- pdb$atom[-lig$atom, ,drop=FALSE] pdb$xyz <- pdb$xyz[, -lig$xyz, drop=FALSE] log <- .update.log(log, paste("Found", length(lig$atom), "ligand atoms"), "REMOVED") } } ## remove hydrogens if(rm.h) { h.inds <- atom.select(pdb, "h", verbose = FALSE) if(length(h.inds$atom) > 0) { pdb$atom <- pdb$atom[-h.inds$atom, ,drop=FALSE] pdb$xyz <- pdb$xyz[, -h.inds$xyz, drop=FALSE] log <- .update.log(log, paste("Found", length(h.inds$atom), "hydrogens"), "REMOVED") } } ## check if 'alt' coords exist if(any(rm.p <- !is.na(pdb$atom$alt) & pdb$atom$alt != "A")) { pdb$atom <- pdb$atom[!rm.p, , drop=FALSE] pdb$xyz <- pdb$xyz[, -atom2xyz(which(rm.p)), drop=FALSE] log <- .update.log(log, paste("Found", sum(rm.p), "ALT records"), "REMOVED") } ## Some initial check: ## 1. Are all amino acid and/or nucleic acid residues ## distinguished by the combination chainID_resno_insert? .check.residue.ambiguity(pdb) ## 2. Check and clean up SSE annotation pdb <- .check.sse(pdb) log <- .update.log(log, pdb$log) ## 3. Fix pdb$calpha if it is mismatch pdb$atom ca.inds <- atom.select(pdb, "calpha", verbose = FALSE) calpha <- seq(1, nrow(pdb$atom)) %in% ca.inds$atom if(!identical(pdb$calpha, calpha)) { pdb$calpha <- calpha log <- .update.log(log, "pdb$calpha", "UPDATED") } ## 4. Fix object class if it is incorrect if(!inherits(pdb, "pdb") || !inherits(pdb, "sse") || !inherits(pdb$xyz, "xyz")) { class(pdb) <- c("pdb", "sse") class(pdb$xyz) <- "xyz" log <- .update.log(log, "Object class", "UPDATED") } ########### ## following operations are on an independent object npdb <- pdb ## check chain breaks and missing chain ids has.fixed.chain <- FALSE capture.output( new.chain <- chain.pdb(npdb) ) chain <- npdb$atom[, "chain"] if(any(is.na(npdb$atom[, "chain"]))) { log <- .update.log(log, "Found empty chain IDs", ifelse(fix.chain, "FIXED", "NO CHANGE"), ifelse(fix.chain, "ALL CHAINS ARE RELABELED", "")) if(fix.chain) { npdb$atom[, "chain"] <- new.chain has.fixed.chain <- TRUE } else if(clean) clean <- FALSE } else { ## check if new chain id assignment is consistent to original one chn.brk <- bounds(chain[ca.inds$atom], dup.inds=TRUE, pre.sort=FALSE) new.chn.brk <- bounds(new.chain[ca.inds$atom], dup.inds=TRUE, pre.sort=FALSE) if(!isTRUE(all.equal(chn.brk, new.chn.brk))) { log <- .update.log(log, "Found inconsistent chain breaks", ifelse(fix.chain, "FIXED", "NO CHANGE"), ifelse(fix.chain, "ALL CHAINS ARE RELABELED", "")) log <- .update.log(log, "Original chain breaks:") if(nrow(chn.brk) == 1) { log <- .update.log(log, " No chain break") } else { pre.ca <- ca.inds$atom[chn.brk[-nrow(chn.brk), "end"]] pre.log <- capture.output( print(npdb$atom[pre.ca, c("resid", "resno", "chain")], row.names = FALSE) ) log <- .update.log(log, pre.log) } log <- .update.log(log) log <- .update.log(log, "New chain breaks:") if(nrow(new.chn.brk) == 1) { log <- .update.log(log, " No chain breaks") } else { new.ca <- ca.inds$atom[new.chn.brk[-nrow(new.chn.brk), "end"]] new.log <- capture.output( print(npdb$atom[new.ca, c("resid", "resno", "chain")], row.names = FALSE) ) log <- .update.log(log, new.log) } if(fix.chain) { npdb$atom[, "chain"] <- new.chain has.fixed.chain <- TRUE } else if(clean) clean <- FALSE } } ## Renumber residues and atoms renumber <- FALSE if( any(!is.na(npdb$atom[, "insert"])) ) { renumber <- TRUE log <- .update.log(log, "Found INSERT records", "RENUMBERED") npdb$atom[, "insert"] <- as.character(NA) } else if(force.renumber) { renumber <- TRUE log <- .update.log(log, "force.renumber = TRUE", "RENUMBERED") } else if(has.fixed.chain) { ## check again the ambiguity of residue labeling chk <- try(.check.residue.ambiguity(npdb)) if(inherits(chk, "try-error")) { renumber <- TRUE log <- .update.log(log, "Found ambiguious residues after chain relabeling", "RENUMBERED") } } if(renumber) { ## Assign consecutive atom numbers npdb$atom[,"eleno"] <- seq(first.eleno, length=nrow(npdb$atom)) ## Determine what chain ID we have chain <- unique(npdb$atom[, "chain"]) ##- Assign new (consecutive) residue numbers for each chain prev.chain.res = 0 ## Number of residues in previous chain for(i in 1:length(chain)) { inds <- which(npdb$atom[, "chain"] == chain[i]) ## Combination of chain id, resno and insert code uniquely defines a residue (wwpdb.org) ## Here we use original pdb because we assume it should at least ## distinguish different residues by above combination. ## We don't use the modified pdb (npdb) because all non-protein residues ## are assigned a chain ID as "X" after calling chain.pdb(); ## These residues could have the same resno (which are still in original ## form) as they may be assigned different chain IDs in the original pdb. res <- paste(pdb$atom[inds, "chain"], pdb$atom[inds, "resno"], pdb$atom[inds, "insert"], sep="_") n.chain.res <- length(unique(res)) new.nums <- (first.resno+prev.chain.res):(first.resno+n.chain.res-1+prev.chain.res) npdb$atom[inds, "resno"] <- vec2resno(new.nums, res) if(consecutive) { ## Update prev.chain.res for next iteration prev.chain.res = prev.chain.res + n.chain.res } } } ## update SSE if(has.fixed.chain || renumber) { ## Must use original pdb to unfold SSE sse <- pdb2sse(pdb, verbose = FALSE) if(!is.null(sse)) { id <- sub(".*_.*_.*_([^_]*)$", "\\1", names(sse)) names(sse) <- paste(npdb$atom[ca.inds$atom, "resno"], npdb$atom[ca.inds$atom, "chain"], npdb$atom[ca.inds$atom, "insert"], id, sep = "_") new.sse <- bounds.sse(sse) if(length(new.sse$helix$start) > 0) { npdb$helix$start <- new.sse$helix$start npdb$helix$end <- new.sse$helix$end npdb$helix$chain <- new.sse$helix$chain } if(length(new.sse$sheet$start) > 0) { npdb$sheet$start <- new.sse$sheet$start npdb$sheet$end <- new.sse$sheet$end npdb$sheet$chain <- new.sse$sheet$chain } if(!isTRUE(all.equal(npdb$helix, pdb$helix)) || !isTRUE(all.equal(npdb$sheet, pdb$sheet)) ) log <- .update.log(log, "SSE annotation", "UPDATED") } } ## update seqres if(has.fixed.chain && !is.null(npdb$seqres)) { tinds <- combine.select(atom.select(npdb, 'protein'), atom.select(npdb, 'nucleic'), operator='+', verbose=FALSE) npdb2 <- trim(npdb, tinds) id <- paste(npdb2$atom$resno, npdb2$atom$chain, npdb2$atom$insert, sep='_') chs <- npdb2$atom[!duplicated(id), "chain"] names(npdb$seqres) <- chs if(!identical(npdb$seqres, pdb$seqres)) log <- .update.log(log, "SEQRES", "UPDATED") } ## update amino acid name naa.atom <- which(npdb$atom[, "resid"] %in% prot.aa[-c(1:20)]) naa.res <- intersect(ca.inds$atom, naa.atom) unk.atom <- which(!npdb$atom[, "resid"] %in% prot.aa) unk.res <- intersect(ca.inds$atom, unk.atom) if(length(naa.res) > 0) { log <- .update.log(log, paste("Found", length(naa.res), "non-standard amino acids"), ifelse(fix.aa, "FIXED", "NO CHANGE"), ifelse(fix.aa, "AMINO ACID NAMES ARE CHANGED", "")) tbl <- table(npdb$atom[naa.res, "resid"]) tbl <- paste(" ", names(tbl), "(", tbl, ")", collapse = ",") log <- .update.log(log, tbl) if(fix.aa) { npdb$atom[naa.atom, "resid"] <- aa123(aa321(npdb$atom[naa.atom, "resid"])) log <- .update.log(log, " Converted to") tbl <- table(npdb$atom[naa.res, "resid"]) tbl <- paste(" ", aa123(aa321(names(tbl))), "(", tbl, ")", collapse = ",") log <- .update.log(log, tbl) } else if(clean) clean <- FALSE } if(length(unk.res) > 0) { log <- .update.log(log, paste("Found", length(unk.res), "unknow amino acids"), "NO CHANGE") tbl <- table(npdb$atom[unk.res, "resid"]) tbl <- paste(" ", names(tbl), "(", tbl, ")", collapse = ",") log <- .update.log(log, tbl) # if(clean) clean <- FALSE } ## update pdb$call npdb$call <- cl ## is the pdb clean? # if(clean) # log <- .update.log(log, "PDB is clean!") if(!clean) { msg <- "PDB is still not clean. Try fix.chain=TRUE and/or fix.aa=TRUE" # log <- .update.log(log, msg) warning(msg) } ## format log # log <- .format.log(log) if(verbose) print(log) npdb$log <- log return(npdb) } .update.log <- function(log, fact="", op="", note="") { if(is.null(fact)) log else if(is.data.frame(fact)) .update.log(log, fact[,1], fact[,2], fact[,3]) else rbind(log, data.frame(Data = fact, Action = op, Note = note)) } .format.log <- function(log, format = c("print", "cat"), op.sign = "->", note.sign = "!!") { format <- match.arg(format) if(!is.null(log)) { log <- apply(log, 1, function(x) { if(nchar(x[2]) == 0) sprintf("%-40s", x[1]) else if(nchar(x[3]) == 0) paste(sprintf("%-40s", x[1]), op.sign, sprintf("%-12s", x[2])) else paste(paste(sprintf("%-40s", x[1]), op.sign, sprintf("%-12s", x[2]), note.sign, x[3], note.sign) ) } ) } else { log <- "No problem found" } log <- switch(format, print = log, cat = paste(paste(log, collapse="\n"), "\n", sep="") ) return(log) } .check.residue.ambiguity <- function(pdb) { ca.inds <- atom.select(pdb, "calpha", verbose = FALSE) c1p.inds <- atom.select(pdb, "nucleic", elety = "C1'", verbose = FALSE) inds <- combine.select(ca.inds, c1p.inds, operator = "+", verbose = FALSE) if(length(inds$atom) > 0) { strings <- paste(pdb$atom[inds$atom, "resno"], pdb$atom[inds$atom, "chain"], pdb$atom[inds$atom, "insert"], sep = "_") if(any(duplicated(strings))) stop(".check.residue.ambiguity(): Found ambiguous residue labeling") } invisible(NULL) } .check.sse <- function(pdb) { log <- NULL if(!is.null(pdb$helix) | !is.null(pdb$sheet)) { if(is.null(pdb$helix)) { pdb$helix <- list(start=NULL, end=NULL, chain=NULL, type=NULL) log <- .update.log(log, "Helix is null but sheet is not", "UPDATED") } if(is.null(pdb$sheet)) { pdb$sheet <- list(start=NULL, end=NULL, chain=NULL, sense=NULL) log <- .update.log(log, "Sheet is null but helix is not", "UPDATED") } } # if there is problem to generate sse vector ss <- try(pdb2sse(pdb, verbose = FALSE)) if(inherits(ss, "try-error")) stop(".check.sse(): Unable to generate SSE sequence") pdb$log <- log return(pdb) } bio3d/R/pca.R0000644000176200001440000000027014046015221012333 0ustar liggesusers"pca" <- function(...) { dots <- list(...) if(inherits(dots[[1]], "matrix")) { class(dots[[1]]) <- c("matrix", "xyz") UseMethod("pca", dots[[1]]) } UseMethod("pca") } bio3d/R/is.select.R0000644000176200001440000000006014046015221013456 0ustar liggesusersis.select <- function(x) inherits(x, "select")bio3d/R/summary.pdb.R0000644000176200001440000000770314046015221014041 0ustar liggesuserssummary.pdb <- function(object, printseq=FALSE, ...) { ## Print a summary of basic PDB object features if( !is.pdb(object) ) { stop("Input should be a pdb object, as obtained from 'read.pdb()'") } ## Multi-model check and total atom count nmodel <- nrow(object$xyz) if( is.null(nmodel) ) { ntotal <- length(object$xyz)/3 nmodel = 1 } else { ntotal <- length(object$xyz[1,])/3 } nxyz <- length(object$xyz) nres <- sum(object$calpha) chains <- unique(object$atom[,"chain"]) all.inds <- atom.select(object, "all", verbose=FALSE)$atom prot.inds <- atom.select(object, "protein", verbose=FALSE)$atom nuc.inds <- atom.select(object, "nucleic", verbose=FALSE)$atom other.inds <- all.inds[! (all.inds %in% c(prot.inds, nuc.inds)) ] nprot <-length(prot.inds) nnuc <-length(nuc.inds) nresnuc <- length(unique( paste(object$atom$chain[nuc.inds], object$atom$insert[nuc.inds], object$atom$resno[nuc.inds], sep="-"))) het <- object$atom[other.inds,] nhet.atom <- nrow(het) if(is.null(nhet.atom) | nhet.atom==0) { nhet.atom <- 0 nhet.res <- 0 hetres <- "none" } else { hetres.resno <- apply(het[,c("chain","resno","resid")], 1, paste, collapse=".") nhet.res <- length(unique(hetres.resno)) hetres.nres <- table(het[,c("resid")][!duplicated(hetres.resno)]) hetres <- paste( paste0( names(hetres.nres), " (",hetres.nres, ")"), collapse=", ") } if((nprot+nnuc+nhet.atom) != ntotal) warning("nPROTEIN + nNUCLEIC + nNON-PROTEIN + nNON-NUCLEIC != nTotal") cat("\n Call: ", paste(deparse(object$call), sep = "\n", collapse = "\n"), "\n", sep = "") s <- paste0("\n Total Models#: ", nmodel, "\n Total Atoms#: ", ntotal, ", XYZs#: ", nxyz, " Chains#: ", length(chains), " (values: ", paste(chains, collapse=" "),")", "\n\n Protein Atoms#: ", nprot, " (residues/Calpha atoms#: ", nres,")", "\n Nucleic acid Atoms#: ", nnuc, " (residues/phosphate atoms#: ", nresnuc,")", "\n\n Non-protein/nucleic Atoms#: ", nhet.atom, " (residues: ", nhet.res, ")", "\n Non-protein/nucleic resid values: [ ", hetres," ]", "\n\n") cat(s) if(printseq) { ##protein if(nres>0) { prot.pdb <- trim.pdb(object, as.select(prot.inds)) aa <- pdbseq(prot.pdb) if(!is.null(aa)) { if(nres > 225) { ## Trim long sequences before output aa <- c(aa[1:225], "......", aa[(nres-3):nres]) } aa <- paste(" ", gsub(" ","", strwrap( paste(aa,collapse=" "), width=120, exdent=0) ), collapse="\n") cat(" Protein sequence:\n", aa, "\n\n", sep="") } } ## nucleic if(nresnuc>0) { na.pdb <- trim.pdb(object, as.select(nuc.inds)) aa <- paste(object$atom$chain[nuc.inds], object$atom$insert[nuc.inds], object$atom$resno[nuc.inds], object$atom$resid[nuc.inds], sep="-") aa <- aa[!duplicated(aa)] aa <- unlist(lapply(strsplit(aa, "-"), function(x) x[4])) aa <- .aa321.na(aa) if(nresnuc > 225) { ## Trim long sequences before output aa <- c(aa[1:225], "......", aa[(nresnuc-3):nresnuc]) } aa <- paste(" ", gsub(" ","", strwrap( paste(aa,collapse=" "), width=120, exdent=0) ), collapse="\n") cat(" Nucleic acid sequence:\n", aa, "\n\n", sep="") } } i <- paste( attributes(object)$names, collapse=", ") cat(strwrap(paste(" + attr:",i,"\n"),width=45, exdent=8), sep="\n") invisible( c(nmodel=nmodel, natom=ntotal, nxyz=nxyz, nchains=length(chains), nprot=nprot, nprot.res=nres, nother=nhet.atom, nother.res=nhet.res) ) } bio3d/R/plot.fluct.R0000644000176200001440000001342314046015221013666 0ustar liggesusers"plot.fluct" <- function(x, col = NULL, label = rownames(x), signif = FALSE, p.cutoff = 0.005, q.cutoff = 0.04, s.cutoff = 5, n.cutoff = 2, mean = FALSE, polygon = FALSE, spread=FALSE, offset=1, ncore = NULL, ...) { ## check input data if(is.vector(x)) x = matrix(x, nrow=1) if(!is.matrix(x) || !is.numeric(x)) stop("provide a numeric matrix or vector") ## check colors, which also define groups of input data if signif=TRUE if(is.null(col)) col <- seq(1, nrow(x)) if(length(col) != nrow(x)) stop("length of col doesn't match dimension of x") if(any(is.na(col))) { x = x[!is.na(col), ] col = col[!is.na(col)] } ## check for significance calculation if(signif) { ns <- table(col) inds.signif <- which(ns >= s.cutoff) if(length(inds.signif) < 2) { warning("Insufficient samples to calculate significance") signif = FALSE } } ## extract some values from '...' since we still do some plots here ## These could be removed after merging this function with plot.bio3d() dots = list(...) if("rm.gaps" %in% names(dots)) rm.gaps = dots$rm.gaps else rm.gaps = formals(plotb3)$rm.gaps ## gaps positions gaps.pos <- gap.inspect(x) if(rm.gaps) yvals = x[, gaps.pos$f.inds, drop=FALSE] else yvals = x if("ylim2zero" %in% names(dots)) ylim2zero = dots$ylim2zero else ylim2zero = formals(plotb3)$ylim2zero if("xlim" %in% names(dots)) xlim = dots$xlim else xlim = c(1, ncol(yvals)) if("ylim" %in% names(dots)) ylim = dots$ylim else ylim = range(yvals, na.rm = TRUE) if(spread) { ylim[2] = ylim[2] + (offset * (length(unique(col))-1)) } if(ylim2zero) ylim[1] = 0 if(! "ylab" %in% names(dots)) dots$ylab = "Fluctuation" dots$xlim = xlim dots$ylim = ylim ##################################################################### if(signif) { ncore = setup.ncore(ncore) # op = par(no.readonly = TRUE) op = par()$new on.exit(par(new=op)) pairs <- pairwise(length(inds.signif)) ## get p-value and q-value for each non-gap position p.all <- mclapply(gaps.pos$f.inds, function(i) { p.i <- apply(pairs, 1, function(j) { inds1 <- which(col == names(ns)[inds.signif[j[1]]]) inds2 <- which(col == names(ns)[inds.signif[j[2]]]) p = t.test(x[inds1, i], x[inds2,i], alternative="two.sided")$p.value q <- abs(mean(x[inds1, i]) - mean(x[inds2, i])) c(p, q) }) c(p=min(p.i[1, ]), q=p.i[2, which.min(p.i[1,])]) }) ## p-values with gaps inserted pvalue <- rep(NA, ncol(x)) pvalue[gaps.pos$f.inds] <- sapply(p.all, "[", "p") ## q-values, i.e. difference of mean values, with gaps inserted qvalue <- rep(NA, ncol(x)) qvalue[gaps.pos$f.inds] <- sapply(p.all, "[", "q") if(rm.gaps){ pvalue = pvalue[gaps.pos$f.inds] qvalue = qvalue[gaps.pos$f.inds] } sig <- which(pvalue<=p.cutoff & qvalue >= q.cutoff) ## - start plotting if(length(sig) > 0) { ## Plot significance as shaded blocks bds <- bounds(sig) ii <- which(bds[, "length"] >= n.cutoff) if(length(ii) > 0) { plot.new() plot.window(xlim=xlim, ylim=ylim) ## to show bricks for single site significance adjust = 0.1 rect(bds[ii,1]-adjust, rep(ylim[1], length(ii)), bds[ii,2]+adjust, rep(ylim[2], length(ii)), col=rep("lightblue", length(ii)), border=NA) ## add this for plot.bio3d on the same device par(new=TRUE) } } } if(mean) { # calculate mean values and replace yvals = apply(x, 2, tapply, col, mean, na.rm=TRUE) col = unique(col) if(!is.null(label)) label = unique(label) if(!is.matrix(yvals)) yvals = matrix(yvals, nrow=1) else yvals = yvals[col, , drop=FALSE] # correct order change due to tapply # still keep the same gaps in first row # this will help plot SSE in plot.bio3d() yvals[1, is.na(x[1, ])] = NA x = yvals if(rm.gaps) yvals = x[, gaps.pos$f.inds, drop=FALSE] # trick to leave gap position unchanged. # Won't affect plot because plot.bio3d() only picks up the first row # All plots in this function should be done with yvals!! x = rbind(x, gap.mark=rep(0, ncol(x))) x["gap.mark", gaps.pos$t.inds] = NA } ## Plot fluctuations if(polygon) { spread <- FALSE dots$type = "n" do.call(plot.bio3d, c(list(x=x), dots)) xx = yvals[1, ] ylim2 = range(xx, na.rm = TRUE) if(ylim2zero) ylim2[1] = 0 n = bounds(which(is.na(xx))) if(length(n)>0) xx[n[, 1:2]] = ylim2[1] # color for polygon n.col = do.call(rgb, c(as.list(col2rgb(col[1])/255), list(alpha=0.4))) polygon(c(1, seq_along(xx), length(xx)), c(ylim2[1], xx, ylim2[1]), col = n.col, border=NA) } else { do.call(plot.bio3d, c(list(x=x), dots)) } if(!spread) { ## Plot all lines for(i in 1:nrow(yvals)) lines(yvals[i, ], col=col[i], lwd=2) } else { unq.col <- unique(col) for(i in 1:length(unq.col)) { tmp.col <- unq.col[i] grp.inds <- which(col==tmp.col) off <- ((i-1)* offset) for(j in 1:length(grp.inds)) lines(yvals[grp.inds[j], ] + off, col=tmp.col) } } ## legend if(!is.null(label)) legend('topright', legend=label, text.col=col, bty='n') if(signif) out <- list(signif=sig) else out <- NULL invisible(out) } bio3d/R/write.mol2.R0000644000176200001440000000570014046015221013575 0ustar liggesuserswrite.mol2 <- function(mol, file="R.mol2", append=FALSE) { if(!is.mol2(mol)) stop("input should be of class 'mol2' as obtained by 'read.mol2'") if(any(is.na(mol$atom))) { mol$atom[ is.na(mol$atom) ] = "" } if(!is.null(mol$bond)) { if(any(is.na(mol$bond))) mol$bond[ is.na(mol$bond) ] = "" } if(!is.null(mol$substructure)) { if(any(is.na(mol$substructure))) mol$substructure[ is.na(mol$substructure) ] = "" } raw.lines <- c() raw.lines <- c(raw.lines, "@MOLECULE") raw.lines <- c(raw.lines, mol$name) if(length(mol$info) < 5) mol$info <- c(mol$info, rep(NA, 5-length(mol$info))) mol$info[is.na(mol$info)] = "" fmt <- paste(rep("%7s", length(mol$info)), collapse=" ") raw.lines <- c(raw.lines, sprintf(fmt, mol$info[1], mol$info[2], mol$info[3], mol$info[4], mol$info[5]) ) raw.lines <- c(raw.lines, "@ATOM") fmt <- "%7s %-8s %9.4f %9.4f %9.4f %-5s %5s %-9s %8.4f " for ( i in 1:nrow(mol$atom) ) { raw.lines <- c(raw.lines, paste0( sprintf(fmt, mol$atom[i, 1], mol$atom[i, 2], mol$atom[i, 3], mol$atom[i, 4], mol$atom[i, 5], mol$atom[i, 6], mol$atom[i, 7], mol$atom[i, 8], mol$atom[i, 9] ), mol$atom[i, 10]) ) } if(!is.null(mol$bond)) { raw.lines <- c(raw.lines, "@BOND") fmt <- "%7s %5s %5s %-5s " for ( i in 1:nrow(mol$bond) ) { raw.lines <- c(raw.lines, paste0( sprintf(fmt, mol$bond[i, 1], mol$bond[i, 2], mol$bond[i, 3], mol$bond[i, 4] ), mol$bond[i, 5]) ) } } if(!is.null(mol$substructure)) { raw.lines <- c(raw.lines, "@SUBSTRUCTURE") fmt <- "%7s %-8s %-10s %8s %4s %-6s %4s %4s " for ( i in 1:nrow(mol$substructure) ) { raw.lines <- c(raw.lines, paste0( sprintf(fmt, mol$substructure[i, 1], mol$substructure[i, 2], mol$substructure[i, 3], mol$substructure[i, 4], mol$substructure[i, 5], mol$substructure[i, 6], mol$substructure[i, 7], mol$substructure[i, 8] ), mol$substructure[i, 9]) ) } } write.table(raw.lines, file = file, quote = FALSE, na="", row.names = FALSE, col.names = FALSE, append = append) } bio3d/R/print.nma.R0000644000176200001440000000163314046015221013502 0ustar liggesusers"print.nma" <- function(x, nmodes=6, ...) { cn <- class(x) cat("\nCall:\n ", paste(deparse(x$call), sep = "\n", collapse = "\n"), "\n\n", sep = "") cat("Class:\n ", cn[1], " (", cn[2], ")", "\n\n", sep = "") cat("Number of modes:\n ", length(x$L), " (", x$triv.modes, " trivial)", "\n\n", sep="") inds <- (x$triv.modes+1):(x$triv.modes+nmodes) if(!is.null(x$frequencies)) { freqs <- round(x$frequencies[inds], 3) cat("Frequencies:\n", sep="") } else { freqs <- round(x$force.constants[inds], 3) cat("Force constants:\n", sep="") } i <- x$triv.modes for ( f in freqs ) { i <- i+1 cat(" Mode ", i, ": \t", f, "\n", sep="") } cat("\n") i <- paste( attributes(x)$names, collapse=", ") cat(strwrap(paste(" + attr:",i,"\n"),width=60, exdent=8), sep="\n") invisible(x) } bio3d/R/read.ncdf.R0000644000176200001440000001234614046015221013423 0ustar liggesusers`read.ncdf` <- function(trjfile, headonly = FALSE, verbose = TRUE, time=FALSE, first = NULL, last= NULL, stride = 1, cell = FALSE, at.sel = NULL){ # Adding option 'at.sel' to select a subset of the structure using # an object of class 'select' # Currently file open in SHARE mode is not supported by NCDF package. # Multicore support is suppressed # ncore = 1 ##- Load ncdf4 package oops <- requireNamespace("ncdf4", quietly = TRUE) if(!oops) stop("Please install the ncdf4 package from CRAN") # open files nc <- lapply(trjfile, function (fnm) { nc <- ncdf4::nc_open(fnm, readunlim=FALSE) conv <- ncdf4::ncatt_get( nc, varid=0, "Conventions")$value if(conv!="AMBER") warning(paste("File conventions is not set to AMBER", fnm, sep=": ")) return(nc) }) # set first and last frame no for each file # used for time/frame range selection flen <- unlist(lapply(nc, function(n) return(n$dim$frame$len))) frange <- matrix(c(1, cumsum(flen[-length(nc)])+1, cumsum(flen)), nrow=length(nc)) if(verbose) { if(length(trjfile)>1) print(paste("Reading ", length(trjfile), "files")) else print(paste("Reading file", trjfile)) print(paste("Produced by program:", ncdf4::ncatt_get( nc[[1]], varid=0, "program")$value)) print(paste("File conventions", ncdf4::ncatt_get( nc[[1]], varid=0, "Conventions")$value, "version", ncdf4::ncatt_get( nc[[1]], varid=0, "ConventionVersion")$value)) print(paste("Frames:", sum(flen))) print(paste("Atoms:", nc[[1]]$dim$atom$len)) } # read heads, cell, or coordinates retval <- lapply(seq_along(nc), function (inc) { first.atom <- 1 count.atom <- -1 if(!is.null(at.sel)) { if(!is.select(at.sel)) stop("'at.sel' must be an object of class 'select'. See 'atom.select'.") atom.ind <- xyz2atom(at.sel$xyz) first.atom <- min(atom.ind) count.atom <- diff(range(atom.ind)) + 1 } nc <- nc[[inc]] frange <- frange[inc,] ss = 1 ee = nc$dim$frame$len if (!is.null(c(first, last))) { #check frame No or time if(time) { btime <- ncdf4::ncvar_get(nc, "time", 1, 1) etime <- ncdf4::ncvar_get(nc, "time", nc$dim$frame$len, 1) } else { btime = frange[1] etime = frange[2] } if((!is.null(first) && (etime < first)) || (!is.null(last) && last >=0 && btime > last) || (!is.null(first) && !is.null(last) && last >=0 && last < first) ) { # if(verbose) print(paste("Skip file", nc$filename)) ncdf4::nc_close(nc) return() } if(!headonly) { timeall <- btime:etime if(time) timeall <- ncdf4::ncvar_get(nc, "time") ss <- if(is.null(first)) 1 else which((timeall - first) >=0 )[1] if(is.null(last) || last < 0 || last > etime) { ee = nc$dim$frame$len } else { ee <- which((timeall - last) <= 0) ee <- ee[length(ee)] } } } tlen = ee - ss + 1 conv <- ncdf4::ncatt_get( nc, varid=0, "Conventions")$value if(headonly) { ## Report only header information return(list("file"=nc$filename, "conv"=conv, "frames"=nc$dim$frame$len, "atoms"=nc$dim$atom$len)) ##time <- ncdf4::ncvar_get(nc,"time") } if(cell) { celldata <- ncdf4::ncvar_get(nc, "cell_lengths", c(1, ss), c(-1, tlen)) celldata <- t( rbind(celldata, ncdf4::ncvar_get(nc, "cell_angles", c(1, ss), c(-1, tlen))) ) if(time) rownames(celldata) <- ncdf4::ncvar_get(nc, "time", ss, tlen) ncdf4::nc_close(nc) return( celldata ) } if(count.atom < 0) count.atom = nc$dim$atom$len # To solve 32-bit limitation problem with large trajectory file .check <- (3 * count.atom * tlen) / (2^31 - 1) if(.check > 1) { .nb <- floor(.check) + 1 .nn <- floor(tlen / .nb) .ss <- seq(ss, ss + tlen - 1, .nn) .tlen <- rep(.nn, length(.ss) - 1) .tlen <- c(.tlen, tlen - sum(.tlen)) coords <- sapply(1:length(.ss), function(i) ncdf4::ncvar_get(nc, "coordinates", c(1, first.atom, .ss[i]), c(-1, count.atom, .tlen[i]), collapse_degen=FALSE)) } else { coords <- ncdf4::ncvar_get(nc, "coordinates", c(1, first.atom, ss), c(-1, count.atom, tlen), collapse_degen=FALSE) } if(!is.null(at.sel)) coords <- coords[,atom.ind - first.atom + 1,] coords <- matrix( coords, ncol=(dim(coords)[2]*3), byrow=TRUE ) if(time) rownames(coords) <- ncdf4::ncvar_get(nc, "time", ss, tlen) ncdf4::nc_close(nc) return( coords ) } ) if(headonly) { retval <- do.call("c", retval) } else if(cell) { retval <- do.call(rbind, retval) ##retval <- as.data.frame(retval, stringsAsFactors=FALSE) } else { retval <- do.call(rbind, retval) ## take every "stride" frame retval <- as.xyz(subset(retval, (1:nrow(retval)) %in% seq(1, nrow(retval), stride))) } return( retval ) } bio3d/R/seqidentity.R0000644000176200001440000000610014046015221014130 0ustar liggesusers"seqidentity" <- function( alignment , normalize=TRUE, similarity=FALSE, ncore=1, nseg.scale=1) { # Parallelized by parallel package (Sun Jul 7 17:35:38 EDT 2013) ncore <- setup.ncore(ncore) if(ncore > 1) { # Issue of serialization problem # Maximal number of cells of a double-precision matrix # that each core can serialize: (2^31-1-61)/8 R_NCELL_LIMIT_CORE = 2.68435448e8 R_NCELL_LIMIT = ncore * R_NCELL_LIMIT_CORE if(nseg.scale < 1) { warning("nseg.scale should be 1 or a larger integer\n") nseg.scale=1 } } ## set labels for output seqide matrix ids <- NULL if(inherits(alignment, c("fasta", "pdbs"))) { ids <- basename.pdb(as.character(alignment$id)) } if(is.matrix(alignment) & !is.null(rownames(alignment))) { ids <- basename.pdb(as.character(rownames(alignment))) } ## continue with ali matrix only if(inherits(alignment, c("fasta", "pdbs"))) { alignment <- alignment$ali } ## calculate similarity instead of identity? if(similarity) { alnTo10 <- function(x) { new <- rep(NA, length(x)) aa <- c("V","I","L","M", "F","W","Y", "S","T", "N","Q", "H","K","R", "D","E", "A","G", "P", "C", "-","X") new[ x %in% aa[1:4] ] = "V" # Hydrophobic, Aliphatic new[ x %in% aa[5:7] ] = "F" # Aromatic new[ x %in% aa[8:9] ] = "S" # Ser/Thr new[ x %in% aa[10:11] ] = "N" # Polar new[ x %in% aa[12:14] ] = "R" # Positive new[ x %in% aa[15:16] ] = "D" # Negative new[ x %in% aa[17:18] ] = "A" # Tiny new[ x %in% aa[19] ] = "P" # Proline new[ x %in% aa[20] ] = "C" # Cysteine new[ x %in% aa[21:22] ] = "-" # Gaps return(matrix(new, nrow=1)) } alignment <- t(apply(alignment, 1, alnTo10) ) } alignment[is.gap(alignment)] = NA ide <- function(x, y) { #### Edit by Heiko Strathmann #### Wed Aug 4 10:48:16 PDT 2010 #### Fix for bug with all gap sequences r <- sum(x==y, na.rm=TRUE) t <- sum(complete.cases(cbind(x,y))) if (normalize && t != 0) { r <- r/t } ################################## return( round(r, 3) ) } nseq <- nrow(alignment) inds <- pairwise( nseq ) ni <- nrow(inds) if(ncore > 1) { RLIMIT = R_NCELL_LIMIT nDataSeg = floor((ni-1)/RLIMIT) + 1 nDataSeg = floor(nDataSeg * nseg.scale) lenSeg = floor(ni/nDataSeg) s = NULL for(i in 1:nDataSeg) { istart = (i-1)*lenSeg + 1 iend = if(iP1;", ids, "\n", file = file, append = TRUE, sep = "") cat(head, "\n", file = file, append = TRUE) cat(seqs, "*", file = file, append = TRUE, sep = "", fill = 60) } else { for (i in 1:nseqs) { head = "sequence" if(pdb.file[i]!="") { head = "structureX" if(chain.first[i] == "") chain.first[i] = "@" if(resno.first[i] == "") resno.first[i] = "FIRST" if(resno.last[i] == "") resno.last[i] = paste("+", sum(!is.gap(seqs[i,])), sep="") } head = paste(head, pdb.file[i], resno.first[i], chain.first[i], resno.last[i], chain.last[i], "", "", "", "", sep=":") cat(">P1;", ids[i], "\n", file = file, append = TRUE, sep = "") cat(head, "\n", file = file, append = TRUE) cat(seqs[i,], "*", file = file, append = TRUE, sep = "", fill = 60) } } } bio3d/R/seq2aln.R0000644000176200001440000000113314046015221013134 0ustar liggesusersseq2aln <- function(seq2add, aln, id="seq", file = "aln.fa", ...) { ##- Add a sequence 'seq2add' to an existing alignment 'aln' ## Adds at the bottom of alignment cl <- match.call() if(!inherits(aln, "fasta")) stop("Input 'aln' should be a 'fasta' object") tmp.seq = as.fasta(seq2add) if(nrow(tmp.seq$ali) > 1) warning("Multiple sequences in 'seq2add' should be pre-aligned") dots = list(...) # fixed arguments dots$profile = aln dots$outfile = file args = c(list(aln=seq2add, id=id), dots) naln = do.call(seqaln, args) naln$call = cl return(naln) } bio3d/R/build.hessian.R0000644000176200001440000000743714046015221014334 0ustar liggesusers"build.hessian" <- function(xyz, pfc.fun, fc.weights=NULL, pdb=NULL, ... ) { if(missing(xyz)) stop("build.hessian: 'xyz' coordinates must be provided") if (!is.function(pfc.fun)) stop("build.hessian: 'pfc.fun' must be a function") ## Coordinates xyz = as.xyz(xyz) if(nrow(xyz)>1) xyz=xyz[1,,drop=FALSE] xyz=as.vector(xyz) xyz <- matrix(xyz, ncol=3, byrow=TRUE) natoms <- nrow(xyz) ## Check provided weight matrix if(!is.null(fc.weights)) { if(!is.matrix(fc.weights)) stop("'fc.weights' must be a numeric matrix") if((nrow(fc.weights) != natoms) || (ncol(fc.weights) != natoms) ) stop("'fc.weights' must be numeric matrix with dimensions NxN") } build.submatrix <- function(xyz, natoms, fc.weights=NULL, pdb=NULL, ...) { ## Full Hessian Hsm <- matrix(0, ncol=3*natoms, nrow=3*natoms) ## Indices relating atoms and columns in the sub-hessian col.inds <- seq(1, ncol(Hsm), by=3) ## Weight indices inds <- rep(1:natoms, each=3) ## Convenient indices for accessing the hessian inds.x <- seq(1, natoms*3, by=3) inds.y <- inds.x+1 inds.z <- inds.x+2 for ( i in 1:natoms ) { ## Calculate difference vectors and force constants diff.vect <- t(t(xyz) - xyz[i,]) ##dists <- apply(diff.vect, 1, function(x) sqrt(sum(x**2))) dists <- sqrt(rowSums(diff.vect**2)) ## quicker ! ## pfc.fun takes a vector of distances ff.names <- names(formals( pfc.fun )) args <- list(dists) if('atom.id' %in% ff.names) args <- c(args, list(atom.id=i)) if('pdb' %in% ff.names) args <- c(args, list(pdb=pdb)) args <- c(args, list(...)) force.constants <- do.call(pfc.fun, args) ## Scale the force constants if(!is.null(fc.weights)) { force.constants <- force.constants * fc.weights[i,] } force.constants <- (-1) * force.constants / (dists**2) ## since we divide on zero, ensure no Inf values force.constants[i] <- 0 diff.vect[i,] <- 0 ## Hessian elements dxx <- diff.vect[,1] * diff.vect[,1] * force.constants dyy <- diff.vect[,2] * diff.vect[,2] * force.constants dzz <- diff.vect[,3] * diff.vect[,3] * force.constants dxy <- diff.vect[,1] * diff.vect[,2] * force.constants dxz <- diff.vect[,1] * diff.vect[,3] * force.constants dyz <- diff.vect[,2] * diff.vect[,3] * force.constants ## Place the elements m <- col.inds[i] ## Off-diagonals Hsm[inds.x, m ] <- dxx Hsm[inds.y, m+1 ] <- dyy Hsm[inds.z, m+2 ] <- dzz Hsm[inds.y, m ] <- dxy Hsm[inds.z, m ] <- dxz Hsm[inds.x, m+1 ] <- dxy Hsm[inds.z, m+1 ] <- dyz Hsm[inds.x, m+2 ] <- dxz Hsm[inds.y, m+2 ] <- dyz ## Diagonal super elements Hsm[inds.x[i], m] <- sum(Hsm[inds.x, m]) * (-1) Hsm[inds.y[i], m] <- sum(Hsm[inds.y, m]) * (-1) Hsm[inds.z[i], m] <- sum(Hsm[inds.z, m]) * (-1) Hsm[inds.x[i], m+1] <- sum(Hsm[inds.x, m+1]) * (-1) Hsm[inds.y[i], m+1] <- sum(Hsm[inds.y, m+1]) * (-1) Hsm[inds.z[i], m+1] <- sum(Hsm[inds.z, m+1]) * (-1) Hsm[inds.x[i], m+2] <- sum(Hsm[inds.x, m+2]) * (-1) Hsm[inds.y[i], m+2] <- sum(Hsm[inds.y, m+2]) * (-1) Hsm[inds.z[i], m+2] <- sum(Hsm[inds.z, m+2]) * (-1) } return(Hsm) } H <- build.submatrix(xyz=xyz, natoms=natoms, fc.weights=fc.weights, pdb=pdb, ... ) return(H) } bio3d/R/pairwise.R0000644000176200001440000000203414046015221013413 0ustar liggesusers"pairwise" <- function(N) { # deternine the indices for pairwise # comparison of N things (where N = 'number.of.things') # Used in function 'identity' # # A <- read.fasta(system.file("examples/kinesin.fa", # package = "bio3d")) # # N<-nrow(A$ali) # # comparison indices # inds<-pairwise(N) # # store score in 's' # s<-rep(NA,nrow(inds)) # # go through all comparisons # for(i in 1:nrow(inds)) { # s[i]<-ide(A$ALI[ inds[i,1], ], A[ inds[i,2], ]) # } # # reformat 's' as a NxN matrix # mat<-matrix(NA,ncol=N,nrow=N) # mat[inds]<-s; mat[inds[,c(2,1)]]<-s if (!is.numeric(N) || N<0 || length(N)>1) { stop("pairwise: N must be positve numeric and of length 1") } pair <- matrix(NA, ncol=2, nrow= ( ((N*N)/2)-(N/2) )) start<-1 for(i in 1:(N-1)) { end = N-i inds = start:( (start-1)+end ) pair[inds,1] = rep(i, end) pair[inds,2] = (i+1):N start = start+end } return(pair) } bio3d/R/plot.pca.loadings.R0000644000176200001440000000154314046015221015113 0ustar liggesusers"plot.pca.loadings" <- function(x, resnums= seq(1,(length(x[,1])/3), 25), ... ) { # Plot residue loadings along PC1 to PC3 if given an xyz # C-alpha matrix of "loadings" (e.g. as returned from # 'pca.xyz' such a 'pca.trj$loadings') # For more info see 'pca.res.loadings' # # To Do: add gap.cols options if(is.list(x)) x=x$U pos <- resnums*3 op <- par(no.readonly=TRUE) on.exit(par(op)) par(mfrow=c(3,1), mar=c(4,4,2,2)) plot(abs(x[,1]),main="",type="h", axes=FALSE, xlab="Index Number", ylab="PC1") axis(1, at=pos, labels=resnums) axis(2) box() plot(abs(x[,2]),main="",type="h", axes=FALSE,xlab="Index Number",ylab="PC2") axis(1, at=pos,labels=(pos)/3) axis(2) box() plot(abs(x[,3]),main="",type="h", axes=FALSE,xlab="Index Number",ylab="PC3") axis(1, at=pos,labels=(pos)/3) axis(2) box() } bio3d/R/pdb.pfam.R0000644000176200001440000000520414046015221013261 0ustar liggesuserspdb.pfam <- function(ids, best.only=TRUE, compact=TRUE) { ##-- Annotate PDBs with PFAM hits from RCSB PDB ## Input 'pdbid' can be a vector of ids with chainID: ## ## pdb.pfam(c("1bg2", "2kin", "4q21", "3kin_A")) ## ## There are often multiple hits to a structure. The option ## 'best.only' will keep the lowest eValue one only. ## oops <- requireNamespace("XML", quietly = TRUE) if(!oops) { stop("Please install the XML package from CRAN") } ##- 'ids' may optionally contain chain ID (e.g '3kin_A') pdbid <- ids ## keep a copy of input 'ids' for later reporting ids <- toupper(ids) chains <- rep(NA, length(ids)) standard.ids <- nchar(ids) == 4 if(any(!standard.ids)) { ids[!standard.ids] <- sub("\\.pdb$","", basename(ids[!standard.ids])) chains[!standard.ids] <- substr(ids[!standard.ids],6,6) ids[!standard.ids] <- substr(ids[!standard.ids],1,4) } url <- paste0("http://www.rcsb.org/pdb/rest/hmmer?structureId=", paste0(ids, collapse=",")) xl <- try(XML::xmlToList(url), silent=TRUE) ##- Exit with NULL if PFAM annotation page not found (cant load) if(!is.list(xl)) { return(NULL) } ## Else process and order data.frame df <- data.frame(matrix(unlist(xl), ncol=8, byrow=TRUE), stringsAsFactors=FALSE) colnames(df) <- names(xl[1]$pfamHit) df <- df[order(df$eValue),] ## Add ID in from of 'pdbID_chainID' and PFAMname_PFAMacc df$ID = paste(df$structureId, df$chainId,sep="_") df$PFAM = paste0(df$pfamName," (",df$pfamAcc,")") ##- Optionally keep top hit for each structure only if(best.only) { df <- df[!duplicated(df$ID),] } ##- If chain Id was found in input keep only entries for that chain ind <- !is.na(chains) if(any(ind)) { ## Exclude entries that match PDBID but not PDBID_chainID filter.id1 <- ids[ind] filter.id2 <- paste(ids[ind], chains[ind],sep="_") filter.ind1 <- which(df$structureId %in% filter.id1) filter.ind2 <- which(df$ID %in% filter.id2) filter.ind <- filter.ind1[!filter.ind1 %in% filter.ind2] if(length(filter.ind) > 0) { df <- df[-filter.ind,] } } ##- Check if any 'pdbids' were not found and add a blank row to df missing <- !toupper(ids) %in% df$structureId if( any(missing) ){ warning(paste("PFAM annotation not found for pdbid(s):", paste(pdbid[missing], collapse=", "))) blank <- matrix(rep(NA, ncol(df)*sum(missing)), nrow=sum(missing)) colnames(blank) <- colnames(df) blank[,"ID"] <- toupper(pdbid[missing]) df <- rbind(df,blank) } ## Optionally rtn a subset of data cols only if(compact) { return(df[,c("ID","PFAM","pfamDesc","eValue")]) } else { return(df) } } bio3d/R/pfam.R0000644000176200001440000000216714046015221012522 0ustar liggesusers"pfam" <- function(id, alignment='seed', verbose=FALSE) { ##alignment <- 'full' ## seed, ncbi, full, metagenomics oops <- requireNamespace("RCurl", quietly = TRUE) if(!oops) stop("Please install the RCurl package from CRAN") cl <- match.call() format <- "fasta" url = paste('http://pfam.xfam.org/family/', id, '/acc', sep='') if(verbose) cat("Fetching accession from", url, "\n") if(!RCurl::url.exists(url)) { cat(url, "\n") stop("Url does not exist") } accid <- readLines(url, warn=FALSE)[1] ## download alignment url <- paste('http://pfam.xfam.org/family/', accid, '/alignment/', alignment, '/format?format=', format, sep='') if(verbose) cat("Fetching alignment from", url, "\n") if(!RCurl::url.exists(url)) { cat(url, "\n") stop("Url does not exist") } tmpfile <- tempfile() success <- download.file(url, tmpfile, quiet=!verbose) if(success==1) stop("Download failed") if(verbose) cat("Alignment successfully downloaded (", tmpfile, ")\n") fasta <- read.fasta(tmpfile) unlink(tmpfile) fasta$call=cl return(fasta) } bio3d/R/print.select.R0000644000176200001440000000122114046015221014177 0ustar liggesusersprint.select <- function(x, ...){ ## Print a summary of atom selection object features if(!inherits(x, "select")) { stop("Input should be a 'select' object, as obtained from 'atom.select()'") } cat("\n Call: ", paste(deparse(x$call), sep = "\n", collapse = "\n"), "\n", sep = "") cat( paste0("\n Atom Indices#: ", length(x$atom), " ($atom)", "\n XYZ Indices#: ",length(x$xyz), " ($xyz)\n\n" ) ) ## Add call if( length(x$atom) != (length(x$xyz)/3) ) warning("Atom and XYZ Indices Miss-Match") i <- paste(attributes(x)$names, collapse = ", ") cat(strwrap(paste(" + attr:", i), width = 45, exdent = 8), sep = "\n") } bio3d/R/vmd.cna.R0000644000176200001440000001525214046015221013124 0ustar liggesusersvmd.ecna <- function(x, n=1, ...) { if(!inherits(x, "ecna")) { stop("The input 'x' must be an object of class 'ecna'.") } if(!(length(n)==1 && is.numeric(n) && n>0)) { stop("Input 'n' must be an nonzero integer.") } if(n > length(x)) { stop("Wrong index of networks.") } vmd(x[[n]], ...) } vmd.cna <- function(x, pdb, layout=layout.cna(x, pdb, k=3), col.sphere=NULL, col.lines="silver", weights=NULL, radius=table(x$communities$membership)/5, alpha=1, vmdfile="network.vmd", pdbfile="network.pdb", full=FALSE, launch=FALSE, exefile=NULL, ...) { ## Draw a cna network in VMD ## Check for presence of igraph package oops <- requireNamespace("igraph", quietly = TRUE) if (!oops) { stop("igraph package missing: Please install, see: ?install.packages") } if(is.null(weights)){ weights <- igraph::E(x$community.network)$weight if(is.null(x$call$minus.log)){ weights <- exp(-weights) } else{ if(x$call$minus.log){ weights <- exp(-weights) } } } if(is.null(col.sphere)) { ## Get colors from network and convert to 0:17 VMD color index col.sphere <- match(igraph::V(x$community.network)$color, vmd_colors())-1 } else { ## Check supplied color(s) will work in VMD if(!all(col.sphere %in% c(0:17))) { warning("Input 'col.sphere' may not work properly in VMD - should be 0:17 color index value") } } ##-- VMD draw functions for sphere, lines and cone .vmd.sphere <- function(cent, radius=5, col="red", resolution=25) { ## .vmd.sphere( matrix(c(0,0,0, 1,1,1), ncol=3,byrow=T) ) if(ncol(cent) != 3) stop("Input 'cent' should be a 3 col xyz matrix") n <- nrow(cent); scr <- rep(NA, n) if(length(col) != n) col <- rep(col, length=n) if(length(radius) != n) radius <- rep(radius, length=n) for(i in 1:n) { scr[i] <- paste0("draw color ", col[i], "\ndraw sphere {", paste(cent[i,], collapse = " "), "} radius ", radius[i], " resolution ",resolution, "\n") } return(scr) } .vmd.lines <- function(start, end, radius=0.2, col="silver", resolution=25) { ## .vmd.lines( start=matrix(c(0,0,0), ncol=3,byrow=T), ## end=matrix(c(1,1,1), ncol=3,byrow=T) ) if(ncol(start) != 3) stop("Input 'start' and 'end' should be 3 col xyz matrices") n <- nrow(start); scr <- rep(NA, n) if(length(col) != n) col <- rep(col, length=n) if(length(radius) != n) radius <- rep(radius, length=n) for(i in 1:n) { scr[i] <- paste0("draw color ", col[i], "\ndraw cylinder {", paste(start[i,], collapse = " "), "} {", paste(end[i,], collapse = " "), "} radius ", radius[i], " resolution ",resolution, "\n") } return(scr) } .vmd.cone <- function(start, end, radius=5, col="silver", resolution=25) { warning("not here yet") } ##- Set alpha if needed scr <- NULL if(alpha != 1) scr <- paste("material change opacity Transparent", alpha,"\ndraw material Transparent\n") ##- Lets get drawing ##radius = V(x$community.network)$size ###radius = table(x$raw.communities$membership)/5 if(!full) { scr <- c(scr, .vmd.sphere( layout, radius=radius, col=col.sphere)) ## Edges ##edge.list <- unlist2(get.adjlist(x$community.network)) ##start.no <- as.numeric(names(edge.list)) ##end.no <- as.numeric((edge.list)) ##inds <- which(end.no > start.no) ##start <- layout[start.no[inds],] ##end <- layout[end.no[inds],] edge.list <- igraph::get.edges(x$community.network, 1:length(igraph::E(x$community.network))) start <- layout[edge.list[,1],] end <- layout[edge.list[,2],] ## weights=E(x$community.network)$weight ##/0.2 scr <- c(scr, .vmd.lines(start=start, end=end, radius=weights, col=col.lines)) } ## full network if(full) { ## Calpha PDB if(!all(pdb$atom$elety == "CA")) { message("Trimming provided PDB to calpha atoms") pdb.ca <- trim(pdb, "calpha") } else { pdb.ca <- pdb } if(length(x$network[1]) != nrow(pdb.ca$atom)) stop("Mismatch between provided network and pdb") ## Edges edge.list <- igraph::get.edges(x$network, 1:length(igraph::E(x$network))) start <- matrix(pdb.ca$xyz[, atom2xyz(edge.list[,1]) ], ncol=3, byrow=TRUE) end <- matrix(pdb.ca$xyz[, atom2xyz(edge.list[,2]) ], ncol=3, byrow=TRUE) ## Edge colors and radius col2 <- match(igraph::V(x$network)$color, vmd_colors())-1 names(col2) = 1:nrow(pdb.ca$atom) col3 = apply(edge.list, 1, function(x) { if(col2[x[1]]==col2[x[2]]) col2[x[1]] else 16 ## black }) rad3 = apply(edge.list, 1, function(x) { if(col2[x[1]]==col2[x[2]]) 0.1 else 0.25 }) scr2 = .vmd.lines(start=start, end=end, radius=rad3, col=col3) scr = c(scr, scr2) } cat(scr, file=vmdfile, sep="") ## Output a PDB file with chain color # Use the chain field to store cluster membership data for color in VMD if(!is.null(igraph::V(x$network)$color)) { ch <- vec2resno(match(igraph::V(x$network)$color, vmd_colors()), resno=pdb$atom[, "resno"]) } else { ch <- vec2resno(vec=x$communities$membership, resno=pdb$atom[,"resno"]) } write.pdb(pdb, chain=LETTERS[ch], file=pdbfile) ## Launch option ... ## vmd -pdb network.pdb -e network.vmd if(launch) { ## Find default path to external program if(is.null(exefile)) { exefile <- 'vmd' if(nchar(Sys.which(exefile)) == 0) { os1 <- Sys.info()["sysname"] exefile <- switch(os1, Windows = 'vmd.exe', # to be updated Darwin = '/Applications/VMD\\ 1.9.*app/Contents/MacOS/startup.command', 'vmd' ) } } if(nchar(Sys.which(exefile)) == 0) stop(paste("Launching external program failed\n", " make sure '", exefile, "' is in your search path", sep="")) cmd <- paste(exefile, pdbfile, "-e", vmdfile) os1 <- .Platform$OS.type if (os1 == "windows") { cmd <- paste(shQuote(exefile), pdbfile, "-e", vmdfile) shell(cmd) } else{ system(cmd) } } } bio3d/R/is.mol2.R0000644000176200001440000000005514046015221013054 0ustar liggesusersis.mol2 <- function(x) inherits(x, "mol2") bio3d/R/rgyr.R0000644000176200001440000000377314046015221012566 0ustar liggesusers# radius of gyration # xyz: length 3N, 1D array of atomic coordinates, # M*3N matrix, or a list object containing xyz # mass: length N 1D array of atomic masses [amu], # or a PDB object having masses stored in the # "B-factor" column rgyr <- function(xyz, mass=NULL, ncore=1, nseg.scale=1) { # Parallelized by parallel package ncore <- setup.ncore(ncore) if(ncore > 1) { # Issue of serialization problem # Maximal number of cells of a double-precision matrix # that each core can serialize: (2^31-1-61)/8 R_NCELL_LIMIT_CORE = 2.68435448e8 R_NCELL_LIMIT = ncore * R_NCELL_LIMIT_CORE if(nseg.scale < 1) { warning("nseg.scale should be 1 or a larger integer\n") nseg.scale=1 } } # check xyz, vector, matrix, or list if(is.list(xyz)) xyz <- xyz$xyz if(is.vector(xyz)) xyz <- matrix(xyz, nrow=1) #check mass array and load masses if(is.list(mass)) mass <- mass$atom[,"b"] if(is.null(mass)) # assume carbon mass <- rep(12.01, ncol(xyz)/3) if(ncol(xyz)/3 != length(mass)) stop("The length of masses doesn't match the number of atoms") rg <- function (xyz, mass) { nAtom <- length(mass) mc <- matrix(xyz, 3, nAtom) v <- replicate(3, mass) * t(mc) com <- colSums(v)/sum(mass) recenteredpos <- mc - replicate(nAtom, com) rog_sq <- sum(colSums(recenteredpos**2) * mass) rog_sq <- rog_sq / sum(mass) return( sqrt(rog_sq) ) } if(ncore > 1) { RLIMIT = R_NCELL_LIMIT nDataSeg = floor((nrow(xyz)-1)/RLIMIT)+1 nDataSeg = floor(nDataSeg * nseg.scale) lenSeg = floor(nrow(xyz)/nDataSeg) rog <- NULL for(i in 1:nDataSeg) { istart = (i-1)*lenSeg + 1 iend = if(i 1) { print("PDB has multiple END/ENDMDL records") if (!multi) { print("multi=FALSE: taking first record only") raw.lines <- raw.lines[ (1:raw.end[1]) ] type <- type[ (1:raw.end[1]) ] } else { print("multi=TRUE: 'read.dcd' will be quicker!") } } if ( length(raw.end) !=1 ) { if (length(raw.lines) == maxlines) { # have not yet read all the file print("You may need to increase 'maxlines'") print("check you have all data in $atom") } } # split by record type raw.header <- raw.lines[type == "HEADER"] raw.seqres <- raw.lines[type == "SEQRES"] raw.helix <- raw.lines[type == "HELIX "] raw.sheet <- raw.lines[type == "SHEET "] raw.atom <- raw.lines[type == "ATOM "] het.atom <- raw.lines[type == "HETATM"] # also look for "TER" records rm(raw.lines) if (verbose) { if (!is.character0(raw.header)) { cat(" ", raw.header, "\n") } } seqres <- unlist(strsplit( trim(substring(raw.seqres,19,80))," ")) helix <- list(start = as.numeric(substring(raw.helix,22,25)), end = as.numeric(substring(raw.helix,34,37)), chain = trim(substring(raw.helix,20,20)), type = trim(substring(raw.helix,39,40))) sheet <- list(start = as.numeric(substring(raw.sheet,23,26)), end = as.numeric(substring(raw.sheet,34,37)), chain = trim(substring(raw.sheet,22,22)), sense = trim(substring(raw.sheet,39,40))) # format ATOM records as a character matrix atom <- matrix(trim(sapply(raw.atom, split.string)), byrow=TRUE, ncol=nrow(atom.format[ !drop.ind,]), dimnames = list(NULL, atom.format[ !drop.ind,"name"]) ) # Alt records with m[,"alt"] != NA if (rm.alt) { if ( sum( !is.na(atom[,"alt"]) ) > 0 ) { cat(" PDB has ALT records, taking A only, rm.alt=TRUE\n") alt.inds <- which( (atom[,"alt"] != "A") ) # take first alt only if(length(alt.inds)>0) atom <- atom[-alt.inds,] } } # Insert records with m[,"insert"] != NA if (rm.insert) { if ( sum( !is.na(atom[,"insert"]) ) > 0 ) { cat(" PDB has INSERT records, removing, rm.insert=TRUE\n") insert.inds <- which(!is.na(atom[,"insert"])) # rm insert positions atom <- atom[-insert.inds,] } } het <- matrix(trim(sapply(het.atom, split.string)), byrow=TRUE, ncol=nrow(atom.format[ !drop.ind,]), dimnames = list(NULL, atom.format[ !drop.ind,"name"]) ) output<-list(atom=atom, het=het, helix=helix, sheet=sheet, seqres=seqres, xyz=as.numeric(t(atom[,c("x","y","z")])), calpha = as.logical(atom[,"elety"]=="CA")) class(output) <- "pdb" return(output) } bio3d/R/plot.hmmer.R0000644000176200001440000000041114046015221013652 0ustar liggesusers`plot.hmmer` <- function(x, ...) { allowed <- c("phmmer", "hmmsearch", "jackhmmer") if(!any(inherits(x, allowed))) stop(paste("please provide the results of a hmmer search of type:", paste(allowed, collapse=", "))) plot.blast(x, ...) } bio3d/R/formula2mass.R0000644000176200001440000000165514046015221014213 0ustar liggesusers"formula2mass" <- function(form, sum.mass=TRUE) { errmsg <- paste("error while parsing formula. \n", " provide input on the form: 'C3 H5 N O1'") if(class(form)!="character" || missing(form)) stop(errmsg) eles <- unlist(strsplit(form, " ")) mass <- c() for ( i in 1:length(eles) ) { ele <- unlist(strsplit(eles[i], "")) inds.a <- grep("[0-9]", ele) inds.b <- grep("[A-z]", ele) num <- paste(ele[inds.a], collapse="") char <- paste(ele[inds.b], collapse="") if(nchar(num)==0) num <- 1 if(length(inds.a)==0) inds.a <- 0 if(length(inds.b)==0) stop(errmsg) if(nrow(bounds(inds.a))>1 || nrow(bounds(inds.b))>1 ) stop(errmsg) mass <- c(mass, atom2mass(char) * as.numeric(num)) } if(sum.mass) mass <- sum(mass) return(mass) } bio3d/R/as.pdb.R0000644000176200001440000001223714046015221012745 0ustar liggesusersas.pdb <- function(...) UseMethod("as.pdb") as.pdb.default <- function(pdb=NULL, xyz=NULL, type = NULL, resno = NULL, resid = NULL, eleno = NULL, elety = NULL, chain = NULL, insert= NULL, alt = NULL, o = NULL, b = NULL, segid = NULL, elesy = NULL, charge = NULL, verbose=TRUE, ...) { cl <- match.call() ## which input argument to determine number of atoms from input <- list(pdb=pdb, xyz=xyz, eleno=eleno, resno=resno, resid=resid) nulls <- unlist(lapply(input, is.null)) inds <- which(!nulls) if(length(inds)==0) stop("insufficient arguments. provide 'pdb', 'xyz', 'eleno', 'resno', and/or 'resid'") ## check content of pdb if(!is.null(pdb)) { if(!is.pdb(pdb)) stop("'pdb' must be of class 'pdb' as obtained from 'read.pdb'") } ## check content of xyz if(!is.null(xyz)) { if(!(is.numeric(xyz) & (is.matrix(xyz) | is.vector(xyz)))) stop("'xyz' must be a numeric vector/matrix") xyz <- as.xyz(xyz) } ## if pdb is provided use it to determine natoms if (inds[1]==1) { natoms <- nrow(pdb$atom) } ## if xyz is provided use it to determine natoms else if (inds[1]==2) { natoms <- ncol(xyz)/3 } ## else use eleno, resno, or resid else { natoms <- length(input[[inds[1]]]) } if(verbose) { cat("\n") cat(" Summary of PDB generation:\n") cat(paste(" .. number of atoms in PDB determined by '", names(input)[inds[1]], "'\n", sep="")) } ## set value of 'xyz' if(!is.null(xyz)) { if((ncol(xyz)/3)!=natoms) stop("ncol(xyz)/3 != length(resno)") } else { if(!is.null(pdb)) xyz <- as.xyz(pdb$xyz) else xyz <- as.xyz(rep(NA, natoms*3)) } ## generic function to set the values of remaining columns of PDB .setval <- function(values=NULL, typ=NULL, default=NULL, class="character", repfirst=FALSE) { if(!is.null(values)) { if(class=="character") fun=is.character if(class=="numeric") fun=is.numeric if(!fun(values)) stop(paste("'", typ, "' must be a ", class, " vector", sep="")) if(length(values)==1 & repfirst) values <- rep(values, natoms) if(length(values)!=natoms) stop(paste("length(", typ, ") != natoms", sep="")) } else { if(!is.null(pdb)) values <- pdb$atom[[typ]] else values <- default } return(values) } type <- .setval(type, typ="type", default=rep("ATOM", natoms), class="character", repfirst=TRUE) eleno <- .setval(eleno, typ="eleno", default=seq(1, natoms), class="numeric", repfirst=FALSE) elety <- .setval(elety, typ="elety", default=rep("CA", natoms), class="character", repfirst=TRUE) resno <- .setval(resno, typ="resno", default=seq(1, natoms), class="numeric", repfirst=FALSE) chain <- .setval(chain, typ="chain", default=rep("A", natoms), class="character", repfirst=TRUE) resid <- .setval(resid, typ="resid", default=rep("ALA", natoms), class="character", repfirst=TRUE) elesy <- .setval(elesy, typ="elesy", default=rep(NA, natoms), class="character", repfirst=TRUE) segid <- .setval(segid, typ="segid", default=rep(NA, natoms), class="character", repfirst=TRUE) o <- .setval(o, typ="o", default=rep(NA, natoms), class="numeric", repfirst=TRUE) b <- .setval(b, typ="b", default=rep(NA, natoms), class="numeric", repfirst=TRUE) alt <- .setval(alt, typ="alt", default=rep(NA, natoms), class="character", repfirst=FALSE) insert <- .setval(insert, typ="insert", default=rep(NA, natoms), class="character", repfirst=FALSE) charge <- .setval(charge, typ="charge", default=rep(NA, natoms), class="numeric", repfirst=TRUE) ## make the data frame for the final PDB object atom <- list() atom$type <- type atom$eleno <- eleno atom$elety <- elety atom$alt <- alt atom$resid <- resid atom$chain <- chain atom$resno <- resno atom$insert <- insert atom$x <- xyz[1, seq(1, natoms*3, by=3)] atom$y <- xyz[1, seq(2, natoms*3, by=3)] atom$z <- xyz[1, seq(3, natoms*3, by=3)] atom$o <- o atom$b <- b atom$segid <- segid atom$elesy <- elesy atom$charge <- charge atom <- data.frame(atom, stringsAsFactors=FALSE) out <- list() out$atom <- atom out$xyz <- xyz class(out) <- "pdb" ## should account for new resno and chain #if(!is.null(pdb)) { #out$helix <- pdb$helix #out$sheet <- pdb$sheet #out$seqres <- pdb$seqres #class(out) <- class(pdb) #} unwhich <- function(x, n) { out <- rep_len(FALSE, n) out[x] <- TRUE return(out) } ca.inds <- atom.select(out, "calpha", verbose=verbose) out$calpha <- unwhich(ca.inds$atom, natoms) out$call <- cl if(verbose) { resid <- unique(paste(atom$chain, atom$resno, sep="-")) cat(paste(" .. number of atoms in PDB: ", natoms, "\n")) cat(paste(" .. number of calphas in PDB:", sum(out$calpha), "\n")) cat(paste(" .. number of residues in PDB:", length(resid), "\n")) cat("\n") } return(out) } bio3d/R/aa321.R0000644000176200001440000000242414046015221012402 0ustar liggesusers"aa321" <- function (aa) { # convert three-letters amino-acid code into # one-letter IUPAC code, for instance "ALA" into "A". # new residues should be added to through the util/make_aatable.R script aa1 <- c("-", ".", "X", bio3d::aa.table$aa1) aa3 <- c("---", "---","UNK", bio3d::aa.table$aa3) convert <- function(x) { if(is.na(x)) return(NA) if (all(x != aa3)) { warning(paste("Unknown 3-letters code for aminoacid:",x)) return("X") # mask unk } else { return(aa1[which(x == aa3)]) } } return(as.vector(unlist(sapply(aa, convert)))) } ".aa321.na" <- function (aa) { # convert three-letters amino-acid code into # one-letter IUPAC code, for instance "ALA" into "A". aa1 <- c("-",".","X", "C", "G", "T", "A", "U", "I", "C", "G", "T"," A", "U", "I") aa3 <- c("---", "---","UNK", "DC", "DG", "DT", "DA", "DU", "DI", "C", "G", "T", "A", "U", "I") convert <- function(x) { if(is.na(x)) return(NA) if (all(x != aa3)) { warning(paste("Unknown 3-letters code for residue:",x)) return("X") # mask unk } else { return(aa1[which(x == aa3)]) } } return(as.vector(unlist(sapply(aa, convert)))) } bio3d/R/mktrj.pca.R0000644000176200001440000000320014046015221013455 0ustar liggesusers"mktrj.pca" <- function(pca=NULL, # pca data structure pc=1, # which pc to move along mag=1, # magnification factor step=0.125, # step size file=NULL, # output pdb file pdb=NULL, # reference pdb object rock=TRUE, ... ) { # args for write.pdb ## make a trjactory of atomic displacments along a given pc if(class(pca)!="pca") { stop("input should be a list object of class 'pca' (from 'pca.xyz')") } if(is.null(file)) file <- paste("pc_", pc, ".pdb", sep="") if(!is.null(pdb)) { if(is.pdbs(pdb)) pdb <- pdbs2pdb(pdb, inds=1, rm.gaps=TRUE)[[1]] if(!is.pdb(pdb)) { warning("Unrecognized 'pdb' object. Ignored") pdb <- NULL } } nstep <- c(seq(step, to=mag, by=step)) zcoor <- cbind(sqrt(pca$L[pc])) %*% nstep ##- Bug fix: Fri Jun 15 14:49:24 EDT 2012 ## plus <- apply(zcoor, 2, pca.z2xyz, pca) ## minus <- apply( (-(zcoor)), 2, pca.z2xyz, pca) scor <- function(x,u,m) { return(x*u+m) } plus <- sapply(c(zcoor), scor, u=pca$U[,pc], m=pca$mean) minus <- sapply(c(-zcoor), scor, u=pca$U[,pc], m=pca$mean) if(rock) { coor <- cbind(pca$mean, plus, plus[,rev(1:ncol(plus))], pca$mean, minus, minus[,rev(1:ncol(minus))]) } else { coor <- cbind(plus[,rev(1:ncol(plus))], pca$mean, minus) } coor <- as.xyz(t(coor)) write.pdb(xyz=coor, file=file, pdb=pdb, ...) invisible(coor) } bio3d/R/atom.select.mol2.R0000644000176200001440000001143114046015221014657 0ustar liggesusers.match.statbit <- function(pdb, statbit) { if(!is.character(statbit)) stop("'statbit' must be a character vector") pdb$atom$statbit %in% statbit } .match.elena <- function(pdb, elena) { if(!is.character(elena)) stop("'elena' must be a character vector") pdb$atom$elena %in% elena } atom.select.mol2 <- function(mol, string=NULL, eleno = NULL, elena = NULL, elety = NULL, resid = NULL, chain = NULL, resno = NULL, statbit = NULL, operator = "AND", inverse = FALSE, value = FALSE, verbose=FALSE, ...) { #str.allowed <- c("noh", "h") #if(!is.null(string)) { # if(!(string %in% str.allowed)) { # stop("Not a valid selection string shortcut.\n\t Please use 'h' or 'noh'\n") # } #} cl <- match.call() pdb <- as.pdb(mol) if(!is.mol2(mol)) stop("'mol' must be an object of class 'mol2'") ## check input operator op.tbl <- c(rep("AND",3), rep("OR",4)) operator <- op.tbl[match(operator, c("AND","and","&","OR","or","|","+"))] if(!operator %in% c("AND", "OR")) stop("Allowed values for 'operator' are 'AND' or 'OR'") ## check input string if(!is.null(string)) { str.allowed <- c("all", "protein", "notprotein", "nucleic", "notnucleic", "water", "notwater", "calpha", "cbeta", "backbone", "back", "ligand", "h", "noh") if(!(string %in% str.allowed)) stop("Unknown 'string' keyword. See documentation for allowed values") } ## verbose message output if(verbose) cat("\n") .verboseout <- function(M, type) { cat(" .. ", sprintf("%08s", length(which(M))), " atom(s) from '", type, "' selection \n", sep="") } ## combine logical vectors .combinelv <- function(L, M, operator) { if(operator=="AND") M <- L & M if(operator=="OR") M <- L | M return(M) } if(operator=="AND") M <- rep(TRUE, nrow(pdb$atom)) if(operator=="OR") M <- rep(FALSE, nrow(pdb$atom)) if(!is.null(string)) { M <- switch(string, all = M <- rep(TRUE, nrow(pdb$atom)), protein = .is.protein(pdb), notprotein = !.is.protein(pdb), nucleic = .is.nucleic(pdb), notnucleic = !.is.nucleic(pdb), water = .is.water(pdb), notwater = !.is.water(pdb), calpha = .is.protein(pdb) & .match.elety(pdb, "CA"), cbeta = .is.protein(pdb) & .match.elety(pdb, c("CA", "N", "C", "O", "CB")), backbone = .is.protein(pdb) & .match.elety(pdb, c("CA", "N", "C", "O")), back = .is.protein(pdb) & .match.elety(pdb, c("CA", "N", "C", "O")), ligand = !.is.protein(pdb) & !.is.nucleic(pdb) & !.is.water(pdb), h = .is.hydrogen(pdb), noh = !.is.hydrogen(pdb), NA ) if(verbose) { .verboseout(M, 'string') } } if(!is.null(eleno)) { L <- .match.eleno(mol, eleno) if(verbose) .verboseout(L, 'eleno') M <- .combinelv(L, M, operator) } if(!is.null(elety)) { L <- .match.elety(mol, elety) if(verbose) .verboseout(L, 'elety') M <- .combinelv(L, M, operator) } if(!is.null(elena)) { L <- .match.elena(mol, elena) if(verbose) .verboseout(L, 'elena') M <- .combinelv(L, M, operator) } if(!is.null(resid)) { L <- .match.resid(mol, resid) if(verbose) .verboseout(L, 'resid') M <- .combinelv(L, M, operator) } if(!is.null(chain)) { L <- .match.chain(pdb, chain) if(verbose) .verboseout(L, 'chain') M <- .combinelv(L, M, operator) } if(!is.null(resno)) { L <- .match.resno(mol, resno) if(verbose) .verboseout(L, 'resno') M <- .combinelv(L, M, operator) } if(!is.null(statbit)) { L <- .match.statbit(mol, statbit) if(verbose) .verboseout(L, 'statbit') M <- .combinelv(L, M, operator) } if(verbose) cat(" ..", sprintf("%08s", length(which(M))), "atom(s) in final combined selection \n") if(inverse) { if(verbose) { cat(" ..", sprintf("%08s", length(which(!M))), "atom(s) in inversed selection \n") } sele <- as.select(which(!M)) } else sele <- as.select(which(M)) sele$call <- cl keep.bonds <- matrix(as.numeric(t(mol$bond[, c("origin","target")])) %in% sele$atom, ncol=2, byrow=T) bond.inds <- which(apply(keep.bonds, 1, all)) sele$bond <- bond.inds if(value) return(trim.pdb(pdb, sele)) else return(sele) } bio3d/R/read.all.R0000644000176200001440000002172614046015221013263 0ustar liggesusers"read.all" <- function(aln, prefix="", pdbext="", sel=NULL, rm.wat=TRUE, rm.ligand=FALSE, compact=TRUE, ncore=NULL, ...) { ## Usage: ## sel <- c("N", "CA", "C", "O", "CB", "*G", "*D", "*E", "*Z") ## pdbs.all <- read.all(aln, sel=sel) if(!inherits(aln, 'fasta')) stop( paste("input 'aln' should be a list object as obtained from ", "'seqaln()', 'pdbaln()', or 'read.fasta.pdb()'") ) dots <- list(...) if(!'verbose' %in% names(dots)) dots$verbose = FALSE ## Log the call cl <- match.call() ncore <- setup.ncore(ncore) files <- paste(prefix, aln$id, pdbext,sep="") ##cat(files,sep="\n") toread <- file.exists(files) ## check for online files toread[ substr(files,1,4)=="http" ] <- TRUE if(all(!toread)) stop("No corresponding PDB files found") ## Avoid multi-thread downloading if(any(substr(files,1,4) == "http")) { ncore = 1 } if(ncore>1) { prev.warn <- getOption("warn") options(warn=1) on.exit(options(warn=prev.warn)) } ## make default selection if(is.null(sel)) sel <- store.atom() blank <- rep(NA, ncol(aln$ali)) blank.all <- rep(NA, ncol(aln$ali)*length(sel)) # for (i in 1:length(aln$id)) { rtn <- mclapply(1:length(aln$id), function(i) { cat(paste("pdb/seq:",i," name:", aln$id[i]),"\n") if(!toread[i]) { warning(paste("No PDB file found for seq", aln$id[i], ": (with filename) ",files[i]), call.=FALSE) coords <- rep(blank,3) res.nu <- blank res.bf <- blank res.ch <- blank res.id <- blank res.ss <- blank res.in <- blank ## all atom data coords.all <- rep(blank.all, 3) elety.all <- blank.all resid.all <- blank.all resno.all <- blank.all hetatm <- NULL ## ##coords.all ## } else { pdb <- do.call(read.pdb, c(list(files[i]), dots) ) ## Always remove hydrogen pdb <- atom.select(pdb, 'noh', value=TRUE, verbose=FALSE) hetatm <- atom.select(pdb, 'protein', inverse=TRUE, value=TRUE, verbose=FALSE) if(rm.wat) hetatm <- trim(hetatm, 'water', inverse=TRUE, verbose=FALSE) if(rm.ligand) hetatm <- trim(hetatm, 'ligand', inverse=TRUE, verbose=FALSE) if(nrow(hetatm$atom)==0) hetatm <- NULL ## Following works on protein only pdb <- atom.select(pdb, 'protein', value=TRUE, verbose=FALSE) ca.inds <- atom.select(pdb, "calpha", verbose=FALSE) pdbseq <- pdbseq(pdb) aliseq <- toupper(aln$ali[i,]) tomatch <- gsub("X","[A-Z]",aliseq[!is.gap(aliseq)]) if(length(pdbseq)<1) stop(paste(basename(aln$id[i]), ": insufficent Calpha's in PDB"), call.=FALSE) ##-- Search for ali residues (1:15) in pdb start.num <- regexpr(pattern = paste(c(na.omit(tomatch[1:15])),collapse=""), text = paste(pdbseq,collapse=""))[1] if (start.num == -1) { stop("Starting residues of sequence not found in PDB") } ##-- Numeric vec, 'nseq', for mapping aln to pdb nseq <- rep(NA,length(aliseq)) ali.res.ind <- which(!is.gap(aliseq)) if( length(ali.res.ind) > (length(pdbseq) - start.num + 1) ) { warning(paste(aln$id[i], ": sequence has more residues than PDB has Calpha's"), call.=FALSE) ali.res.ind <- ali.res.ind[1:(length(pdbseq)-start.num+1)] ## exclude extra tomatch <- tomatch[1:(length(pdbseq)-start.num+1)] ## terminal residues } nseq[ali.res.ind] = start.num:((start.num - 1) + length(tomatch)) ##-- Check for miss-matches match <- aliseq != pdbseq[nseq] if ( sum(match, na.rm=TRUE) >= 1 ) { mismatch.ind <- which(match) mismatch <- cbind(aliseq, pdbseq[nseq])[mismatch.ind,] n.miss <- length(mismatch.ind) if(sum(mismatch=="X") != n.miss) { ## ignore masked X res details <- rbind(aliseq, !match, pdbseq[nseq], pdb$atom[pdb$calpha,"resno"][nseq] ) #### calpha[,"resno"][nseq] ) ###- typo?? details <- seqbind(aliseq, pdbseq[nseq]) details$ali[is.na(details$ali)] <- "-" rownames(details$ali) <- c("aliseq","pdbseq") details$id <- c("aliseq","pdbseq") resmatch <- which(!apply(details$ali, 2, function(x) x[1]==x[2])) resid <- paste(pdb$atom$resid[ca.inds$atom][nseq][resmatch][1], "-", pdb$atom$resno[ca.inds$atom][nseq][resmatch][1], " (", pdb$atom$chain[ca.inds$atom][nseq][resmatch][1], ")", sep="") cat("\n ERROR Alignment mismatch. See alignment below for further details\n") cat(" (row ", i, " of aln and sequence of '", aln$id[i], "').\n", sep="") cat(" First mismatch residue in PDB is:", resid, "\n") cat(" occurring at alignment position:", which(match)[1], "\n\n") .print.fasta.ali(details) msg <- paste(basename.pdb(aln$id[i]), " alignment and PDB sequence miss-match\n", " beginning at position ", which(match)[1], " (PDB RESNO ", resid, ")", sep="") stop(msg, call.=FALSE) } } ##-- Store nseq justified PDB data ca.ali <- pdb$atom[pdb$calpha,][nseq,] coords <- as.numeric( t(ca.ali[,c("x","y","z")]) ) res.nu <- ca.ali[, "resno"] res.bf <- as.numeric( ca.ali[,"b"] ) res.ch <- ca.ali[, "chain"] res.id <- ca.ali[, "resid"] res.in <- ca.ali[, "insert"] sse <- pdb2sse(pdb, verbose = FALSE) if(!is.null(sse)) res.ss <- sse[nseq] else res.ss <- blank raw <- store.atom(pdb) coords.all <- as.numeric( raw[c("x","y","z"), sel, nseq] ) elety.all <- c(raw[c("elety"),sel,nseq]) resid.all <- c(raw[c("resid"),sel,nseq]) resno.all <- c(raw[c("resno"),sel,nseq]) ## raw <- store.main(pdb) ## b <- cbind(b, raw[,,nseq]) } # end else list(coords=coords, coords.all=coords.all, res.nu=res.nu, res.bf=res.bf, res.ch=res.ch, res.id=res.id, res.in=res.in, res.ss=res.ss, elety.all=elety.all, resid.all=resid.all, resno.all=resno.all, hetatm=hetatm) }, mc.cores=ncore, mc.allow.recursive=FALSE) # end for tryerr <- which(sapply(rtn, inherits, 'try-error')) if(length(tryerr)>0) { stop(as.character(rtn[[tryerr[1]]])) } coords <- do.call( rbind, unname(sapply(rtn, '[', 'coords')) ) res.nu <- do.call( rbind, unname(sapply(rtn, '[', 'res.nu')) ) res.bf <- do.call( rbind, unname(sapply(rtn, '[', 'res.bf')) ) res.ch <- do.call( rbind, unname(sapply(rtn, '[', 'res.ch')) ) res.id <- do.call( rbind, unname(sapply(rtn, '[', 'res.id')) ) res.ss <- do.call( rbind, unname(sapply(rtn, '[', 'res.ss')) ) res.in <- do.call( rbind, unname(sapply(rtn, '[', 'res.in')) ) if( all(is.na(res.ss)) ) res.ss <- NULL if( all(is.na(res.in)) ) { res.in <- NULL } else { res.in[is.na(res.in)] <- '' } coords.all <- do.call( rbind, unname(sapply(rtn, '[', 'coords.all')) ) elety.all <- do.call( rbind, unname(sapply(rtn, '[', 'elety.all')) ) resid.all <- do.call( rbind, unname(sapply(rtn, '[', 'resid.all')) ) resno.all <- do.call( rbind, unname(sapply(rtn, '[', 'resno.all')) ) hetatm.all <- unname(sapply(rtn, '[', 'hetatm')) if(all(sapply(hetatm.all, is.null))) hetatm.all <- NULL rownames(aln$ali) <- aln$id rownames(coords) <- aln$id rownames(res.nu) <- aln$id rownames(res.bf) <- aln$id rownames(res.ch) <- aln$id rownames(res.id) <- aln$id if(!is.null(res.ss)) rownames(res.ss) <- aln$id if(!is.null(res.in)) rownames(res.in) <- aln$id rownames(coords.all) <- aln$id rownames(elety.all) <- aln$id rownames(resid.all) <- aln$id rownames(resno.all) <- aln$id if(!is.null(hetatm.all)) names(hetatm.all) <- aln$id atm <- rep( rep(sel,each=3), ncol(aln$ali)) colnames(coords.all) = atm atm <- rep( sel, ncol(aln$ali)) colnames(elety.all) = atm colnames(resid.all) = atm colnames(resno.all) = atm coords <- as.xyz(coords) coords.all <- as.xyz(coords.all) width <- ncol(elety.all) / ncol(aln$ali) grpby <- rep(1:ncol(aln$ali), each=width) if(compact) { # remove columns that have NA in all rows rm.inds <- which(apply(elety.all, 2, function(x) all(is.na(x)))) if(length(rm.inds) > 0) { coords.all <- as.xyz(coords.all[, -atom2xyz(rm.inds)]) elety.all <- elety.all[, -rm.inds, drop=FALSE] resid.all <- resid.all[, -rm.inds, drop=FALSE] resno.all <- resno.all[, -rm.inds, drop=FALSE] grpby <- grpby[-rm.inds] } } out<-list(xyz=coords, all=coords.all, resno=res.nu, insert=res.in, b=res.bf, chain = res.ch, id=aln$id, ali=aln$ali, resid=res.id, sse=res.ss, all.elety=elety.all, all.resid=resid.all, all.resno=resno.all, all.grpby=grpby, all.hetatm=hetatm.all, call = cl) class(out)=c("pdbs", "fasta") return(out) } bio3d/R/plot.geostas.R0000644000176200001440000000051614046015221014215 0ustar liggesusersplot.geostas <- function(x, at=seq(0, 1, 0.1), main="AMSM with Domain Assignment", col.regions=rev(heat.colors(200)), margin.segments=x$grps, ...) { plot.dccm(x$amsm, at=at, main=main, col.regions=col.regions, margin.segments=margin.segments, ...) } bio3d/R/bhattacharyya.R0000644000176200001440000000502214046015221014414 0ustar liggesusersbhattacharyya <- function(...) UseMethod("bhattacharyya") bhattacharyya.nma <- function(...) bhattacharyya.matrix(...) bhattacharyya.pca <- function(...) bhattacharyya.matrix(...) bhattacharyya.enma <- function(enma, covs=NULL, ncore=NULL, ...) { if(!inherits(enma, "enma")) stop("provide a 'enma' object as obtain from function 'nma.pdbs()'") if(any(is.na(enma$fluctuations))) stop("provide 'enma' object calculated with argument 'rm.gaps=TRUE'") if(is.null(covs)) { cat("Calculating covariance matrices") covs <- cov.enma(enma, ncore=ncore) } cat("Calculating pairwise bhattacharyya coefs") sim.mat <- bhattacharyya.array(covs, ncore=ncore) rownames(sim.mat) <- basename(rownames(enma$fluctuations)) colnames(sim.mat) <- basename(rownames(enma$fluctuations)) return(sim.mat) } bhattacharyya.matrix <- function(a, b, q=90, n=NULL, ...) { if(!is.matrix(a) & is.matrix(b)) stop("provide covariance matrices") a <- ((1 / .tr(a)) * a)*1000 b <- ((1 / .tr(b)) * b)*1000 ei <- eigen( (a + b)/2 ) if(is.null(n)) { percent <- (ei$values/sum(ei$values))*100 cumv <- cumsum(percent) n <- which(cumv>q)[1] } # ca <- det((t(ei$vectors[,1:n]) %*% a) %*% ei$vectors[,1:n]) # cb <- det((t(ei$vectors[,1:n]) %*% b) %*% ei$vectors[,1:n]) # d <- prod(ei$values[1:n]) ## use logarithm to avoid numerical underflow log.ca <- determinant((t(ei$vectors[,1:n]) %*% a) %*% ei$vectors[,1:n])$modulus log.cb <- determinant((t(ei$vectors[,1:n]) %*% b) %*% ei$vectors[,1:n])$modulus log.ca <- as.numeric(log.ca); log.cb <- as.numeric(log.cb) log.d <- sum(log(ei$values[1:n])) # ndb <- (1/(2*n)) * log( d / sqrt(ca*cb) ) ndb <- (1/(2*n)) * ( log.d - 0.5 * (log.ca + log.cb) ) bc <- exp( -ndb ) return(bc) } bhattacharyya.array <- function(covs, ncore=NULL, ...) { ncore <- setup.ncore(ncore, bigmem = FALSE) if(ncore>1) mylapply <- mclapply else mylapply <- lapply dims <- dim(covs) m <- dims[3] mat <- matrix(NA, m, m) ##inds <- pairwise(m) inds <- rbind(pairwise(m), matrix(rep(1:m,each=2), ncol=2, byrow=T)) mylist <- mylapply(1:nrow(inds), function(row) { i <- inds[row,1]; j <- inds[row,2]; val <- bhattacharyya.matrix(covs[,,i], covs[,,j], ...) out <- list(val=val, i=i, j=j) cat(".") return(out) }) for ( i in 1:length(mylist)) { tmp <- mylist[[i]] mat[tmp$i, tmp$j] <- tmp$val } mat[ inds[,c(2,1)] ] = mat[ inds ] ##diag(mat) <- rep(1, n) cat("\n") return(round(mat, 6)) } bio3d/R/torsion.pdb.R0000644000176200001440000001143114046015221014032 0ustar liggesusers"torsion.pdb" <- function(pdb) { colpaste <- function(x,col.names=colnames(x)) { apply(x, 1, function(row) paste(row[col.names], collapse=".")) } getinds <- function(atoms,ref=atom.names) { sort(atom2xyz(charmatch(atoms, ref))) } repadd <- function(num, nrep=nres, toadd=nxyz) { c(num, rep(num, (nrep-1)) + rep(cumsum(rep(toadd, (nrep-1))), each=length(num))) } ##-- List atoms form each residue of each chain atom.data <- colpaste(pdb$atom,c("elety","resno","chain")) atom.list <- matrix(unlist(strsplit(atom.data,"\\.")), ncol=3, byrow=TRUE) res.data <- colpaste(pdb$atom,c("resno","chain", "resid", "insert")) res.data <- sub(".NA", "", res.data) res.list <- unique(res.data) atom.names <- c("N","CA","C","O","CB", "*G","*G1","*G2","*D","*D1", "*D2","*E","*E1","*E2","*Z", "NH1","NH2") atom.greek <- c("N","CA","C","O","CB", "G","G1","G2","D","D1", "D2", "E","E1","E2", "Z", "*","*") coords <- NULL; blank <- matrix(NA, nrow=3, ncol=length(atom.names)) ##-- Store coords as a 3 x Natm x Nres = [xyz,atm,res] matrix for(i in 1:length(res.list)) { res.blank <- blank res.ind <- which(res.list[i]==res.data) ### --- Start Edit: Wed Dec 8 18:30:07 PST 2010 ### blank.ind <- charmatch(atom.list[res.ind,1], atom.names, nomatch=0) + ### charmatch(substr(atom.list[res.ind,1],2,4), atom.greek, nomatch=0) ### ### Bug Fix for NMR structures: make sure we have no Hydrogens atoms.noh <- atom.list[res.ind,1] atoms.noh[ grep("H",atoms.noh) ] = "H" blank.ind <- charmatch(atoms.noh, atom.names, nomatch=0) + charmatch(substr(atoms.noh,2,4), atom.greek, nomatch=0) ### --- End Edit res.blank[,blank.ind[blank.ind!=0]] <- matrix(pdb$xyz[atom2xyz(res.ind[blank.ind!=0])], nrow=3) coords <- cbind(coords,res.blank) } natm <- length(atom.names); nxyz <- 3*natm nres <- length(coords)/(nxyz) dim(coords) <- c(3, natm, nres) dimnames(coords)=list(xyz=c("x","y","z"), atm=atom.names, res=res.list) ##-- Torsions for selected atoms co <- c(coords) chi1 <- torsion.xyz( co[ repadd( getinds( c("N","CA","CB","*G") )) ] ) chi11 <- torsion.xyz( co[ repadd( getinds( c("N","CA","CB","*G1") )) ]) ###chi12 <- torsion.xyz( co[ repadd( getinds( c("N","CA","CB","*G2") )) ]) chi2 <- torsion.xyz( co[ repadd( getinds( c("CA","CB","*G","*D") )) ]) chi21 <- torsion.xyz( co[ repadd( getinds( c("CA","CB","*G","*D1") )) ]) ###chi22 <- torsion.xyz( co[ repadd( getinds( c("CA","CB","*G","*D2") )) ]) ## New catch for atom name CG1 of ILE residues chi2.ILE <- torsion.xyz( co[ repadd( getinds( c("CA","CB","*G1","*D1") )) ]) chi3 <- torsion.xyz( co[ repadd( getinds( c("CB","*G","*D","*E") )) ]) chi31 <- torsion.xyz( co[ repadd( getinds( c("CB","*G","*D","*E1") )) ]) ##chi32 <- torsion.xyz( co[ repadd( getinds( c("CB","*G","*D","*E2") )) ]) chi4 <- torsion.xyz( co[ repadd( getinds( c("*G","*D","*E","*Z") )) ]) chi51 <- torsion.xyz( co[ repadd( getinds( c("*D","*E","*Z", "NH1") )) ]) ###chi52 <- torsion.xyz( co[ repadd( getinds( c("*D","*E","*Z", "NH2") )) ]) omega <- torsion.xyz( co[ repadd( c(4:9, 52:57) ) ]) alpha <- c(NA, torsion.xyz( co[ repadd( c(4:6,55:57,106:108,157:159) ) ])) phi <- c(NA, torsion.xyz( co[ repadd( c(7:9,52:60) ) ])) psi <- torsion.xyz( co[ repadd( c(1:9,52:54) ) ]) ## alpha c("CA","CA","CA","CA") ## omega c("CA","C","N","CA") ## phi c("C","N","CA","C") ## psi c("N","CA","C","N") ##- Old Output with redundent angles (e.g. chi22 etc.). ### out <- list(psi=psi, phi=phi[-(nres+1)], omega=omega, ### chi1=chi1, chi11=chi11, chi12=chi12, ### chi2=chi2, chi21=chi21, chi22=chi22, ### chi3=chi3, chi31=chi31, chi32=chi32, ### chi4=chi4, ### chi51=chi51, chi52=chi52, ### alpha=alpha[-(nres+1)], coords=coords) ##- New reduced output with only one chi per sidechain position tor.collapse <- function(a1, a11) { a <- a1 got.a11 <- !(is.na(a11)) a[got.a11] <- a11[got.a11] return(a) } chi1.F <- tor.collapse(chi1, chi11) chi2.F <- tor.collapse(chi2, chi21) chi2.F <- tor.collapse(chi2.F, chi2.ILE) chi3.F <- tor.collapse(chi3, chi31) ## New table/matrix for output tbl=cbind(phi[-(nres+1)], psi, chi1.F, chi2.F, chi3.F, chi4, chi51) colnames(tbl) <- c("phi", "psi", "chi1", "chi2", "chi3", "chi4", "chi5") rownames(tbl) <- res.list out <- list(psi=psi, phi=phi[-(nres+1)], omega=omega, chi1=chi1.F, ##chi11=chi11, chi12=chi12, chi2=chi2.F, ##chi21=chi21, chi22=chi22, chi3=chi3.F, ##chi31=chi31, chi32=chi32, chi4=chi4, chi5=chi51, ##chi51=chi51, chi52=chi52, alpha=alpha[-(nres+1)], coords=coords, tbl=tbl ) } bio3d/MD50000644000176200001440000006147214046425767011613 0ustar liggesusers1005a5e34e322b8c0b642a06a17ae30e *DESCRIPTION 45cb41b55c7a199f4a53b89549099320 *NAMESPACE df23e25f1b9982557507af3d7651ad76 *NEWS 5d2c9874a418b707c4e12d96087fbe77 *R/RcppExports.R 5e199f7bdb3b2dac728d499af72a66cd *R/aa123.R 3a1c88e13bfe0be7c84120618822e090 *R/aa2index.R 5e13a692c22b3737ee31536557624864 *R/aa2mass.R 4885bccc6c6f90ae732f4228e4d2982d *R/aa321.R 136ef786c6ea8b94ac8e6c38316a32cd *R/aanma.R 4dd420d5576ff7b15385cb4e23070195 *R/aanma.pdb.R 9203c05378158366800fbf1f4a9e9acd *R/aanma.pdbs.R 8a2d7097e2f56c21e41f4532d20b41b9 *R/aln2html.R df1256cc99bbbd413860c6bc997851af *R/amsm.xyz.R ef880390ae3f58420b0ab4121506c05b *R/angle.xyz.R 8bbe09682fd79a8cdf9ecd409923f0c1 *R/arg_filter.R 3870b339a62143463ffe0e037b41134f *R/as.fasta.R 99ce62a5cad5b025855f2f8e174f398d *R/as.pdb.R 29d38e33c2e2798192b9860ce3ff9c39 *R/as.pdb.mol2.R 735f3ec1cd23c14ff58380b5b2c1a549 *R/as.pdb.prmtop.R 209e33ae16d4d9b25880946ada95f3c2 *R/as.select.R a178e265e7a83136b94398d6d2e85411 *R/as.xyz.R 1ad61b9c92f5e0abc66f15a97831b1ef *R/atom.select.R 05c3ac3502d26d964bad1216c25fb724 *R/atom.select.mol2.R c87e5ffd9a2481698200875e09758034 *R/atom.select.pdb.R 178384007753ddf9965cf5ed6183f103 *R/atom.select.pdbs.R 472881c06fa417e3342cd7d3f6dbb00a *R/atom.select.prmtop.R 6452eb305af0761adbd1a0e58d661ee7 *R/atom2ele.R 17a8373e8df1a455dc17192f295bfb21 *R/atom2mass.R 48a555c4bee0d0dd3c02418713af7a87 *R/atom2xyz.R 0c8a1dadda8ce2e8a2a9ca2de0125dd7 *R/basename.pdb.R 46dc0dd398308a651bdb007b88416647 *R/bhattacharyya.R c5af3447d6746e0544490d7fdb9040b8 *R/binding.site.R d216833257b72d8919350d6e84f1842b *R/biounit.R e2a8b9de4eb5ea92976f2cd3f214f836 *R/blast.pdb.R e30e78857cdcc09122a065928319fd1f *R/bounds.R e1889cc2c0e3a6f4d6edb848d252d8fa *R/bounds.sse.R abae5f5457ba8820a71069b82b8e5600 *R/build.hessian.R d466ea5cf94d1383b2df41cb5e695735 *R/bwr.colors.R 3e5027282efcdbcb0cee6308108d285f *R/cat.pdb.R bad94ca1330e847c7207826aa802d5cc *R/chain.pdb.R 158d1cde1eda06147b7bfb36bf08e583 *R/check.utility.R 081ab9198e86dafb1122f3df3ba3833a *R/clean.pdb.R 77bf6f8c3ed1e2ae5b82da30c5fea159 *R/cmap.R acbd558702c931c73a8b0040cb21ca12 *R/cmap.pdb.R 59bd3ce7f893392b424cb7625b6a5b38 *R/cna.R 7c5098bfa91b96cfb2847c7794883862 *R/cna.dccm.R b434f392be51d2d4f00046046b07e547 *R/cna.ensmb.R 0f2b585f659d99f542ae9f221135fc23 *R/cnapath.R 6624ac64efb374dd2e0896326ea811f9 *R/com.R e00189a7a762151be9f33223a236a63c *R/com.pdb.R c2fdd1f28bdef7d151e51b340a84f278 *R/com.xyz.R 786907c3ba7816f42bb9bfbc44222405 *R/combine.select.R adc8ba00d757ae235f46787889d12cca *R/community.aln.R 7162e7da956bafb2c40385d31eb314a0 *R/community.tree.R 6b063f818fa98667191a4069019c216d *R/consensus.R 0530ddc97b7d04bcb2612fc117af0210 *R/conserv.R c64ddbcdf11184b7f20bb08c95722bcc *R/convert.pdb.R b32b403008982a8c148809adc06f8b98 *R/core.cmap.R f0bbfe1c4c4463dcafdc126619617acc *R/core.find.R 5a2e60494f76459eeb447bbd65f584a9 *R/cov.nma.R 63cac65301a42de99972432b1c7c081b *R/covsoverlap.R fef75828e128d284e8ca624977e44960 *R/dccm.R d09f37402425958e25d133c2dd229f99 *R/dccm.enma.R f41d92e86f92802cda8592a70e296701 *R/dccm.gnm.R 57437256a88ba8b90b47ab9e18fd147c *R/dccm.nma.R 23eaf0d596f3476d788742a3349a4e1c *R/dccm.pca.R d91b246892e32c43275c30647ce65525 *R/dccm.xyz.R 96286e9d868f5c4f6e059689acff33cd *R/deformation.nma.R 1beb2e06307b69059f64d6524ae68bcd *R/diag.ind.R d9885c3180310f8b8778ee222d632567 *R/difference.vector.R b4724d94d0fdfd4c75681308a67dffe5 *R/dist.xyz.R 7cb9b6c73a0110974aff88392d089d28 *R/dm.R fd217d92c369bd9026049a02ffa14e5d *R/dm.xyz.R 9bcc4353cde242101d7ce9c54fe33aa9 *R/dssp.R 10343dc3bb6980664a5df9cb6eddb1b8 *R/dssp.pdb.R 1e468e2685c24dcdc0a2974760c1a081 *R/dssp.pdbs.R 9f9aa73363a01367436a9941c20e412c *R/dssp.xyz.R 8e116ead75a3792026291a58fc50227e *R/entropy.R c60b8e4b0b3933d0ef586305fccac69e *R/exefile.R 83a16eebc26c7c1fdf0b7979cbc4a79e *R/filter.cmap.R ef71c2e6b7602fffefa6e0470d6cf45b *R/filter.dccm.R 5eee2af1c1b9b9e818e854afaf60f16a *R/filter.identity.R 5819acbe37a406c25ed69b5068b428f3 *R/filter.rmsd.R ee379599d8254472d6df82f8ff595439 *R/fit.xyz.R 7f0c0d6133252ca6896fd8f6d9cbc369 *R/fluct.nma.R 1969f6a1b39e4ebd9328ff9d4fd14db5 *R/formula2mass.R 228a1e2d7bae2b06cb955dc2849228e8 *R/gap.inspect.R 7e1043b7e2ece35717f40879ceeeef54 *R/geostas.R 86047edc0502daf7e9cfe3828e283f49 *R/get.blast.R 41a1e8d12c0efd27858a761de5cac412 *R/get.pdb.R 7f6508bcf15d3df3218ef28113f5e57e *R/get.seq.R 47addc7fcd0744086985af22e2b862cd *R/gnm.R 1ab7a0ea647f9cbd5794af9d3636cd0f *R/gnm.pdbs.R a4650a718115f929a223abf936958772 *R/hclustplot.R f6b38088f3046794d87363462b97c6ac *R/hmmer.R a1c7b2c881e3b27c86678708818782d4 *R/identify.cna.R 9face02e76a999d40e7d3c8f47d45565 *R/inner.prod.R b8eaf3135026219319f713351f3913d6 *R/inspect.connectivity.R e98eaffc9877f0b00818c04bc36bd40a *R/is.gap.R 46766d6ca465170d8cd8bc96513eee7a *R/is.mol2.R b133ffa086b43005b943f9a2f0450579 *R/is.pdb.R c5e4dd60572e029d5a99aff57a12814a *R/is.select.R ff4bae24762c94c65b4c10d9774a76ee *R/is.xyz.R f3a1ce298492f7992b91429f9a65154b *R/layout.cna.R 74e549c90c82575fbe6244218df80790 *R/lbio3d.R 40f1a5ea30049046032402c4b73e3f67 *R/load.enmff.R d6fd5c79cc8300c03b80f69ac8404bca *R/mask.dccm.R 8919406e86f3472e4feed5dcb3037231 *R/mktrj.R 9de0863253f48da4d6c43af988fbe42d *R/mktrj.enma.R 7ba177c301ac5950f189337668d0b14c *R/mktrj.nma.R b9666ca7dbb29a832950c980270417bd *R/mktrj.pca.R d7ed0d61455e1b71a749685e0b7a7894 *R/mono.colors.R f4fc89df3e865cf4220e6717fe500bdf *R/motif.find.R 489983bdb7185d46ab76029409646ca2 *R/mustang.R 5cad0ac0f01ee0e00c0451c3245feef0 *R/network.amendment.R 8d1844c9a1b04949d3e74ca4e559ef89 *R/nma.R ae4ce06bc71f20c2384460a6b47bec6e *R/nma.pdb.R 22d0d3fc55e3913ee83801c24fb8e071 *R/nma.pdbs.R 274c79ff0feeb26e8dda4bb052154378 *R/nma_funs.R 70d776448b5ed1c49b1d15b12d5e5db0 *R/normalize.vector.R 1f8acdc2387bae8073ffd6dd4f817dbb *R/orient.pdb.R d5031efe05fbe7d9479ca11aeff7a2a8 *R/overlap.R bfb07d8049ba981029b5cef22eb8b367 *R/pairwise.R 62256d8b7089775e90288f10c833d060 *R/pb.R 6e76c8e31335687df8b369a1bdb3f57d *R/pca.R feda760575734d91fc5369f1294a703d *R/pca.array.R 964e746cc789e91cccfdf3c2f79cfd5a *R/pca.pdbs.R 84c8023e33a4752ca0044234df7ef9f8 *R/pca.tor.R 0fafa8786086504978300303eab268c8 *R/pca.xyz.R aa2203381972bfc6c7d53022885d1c4a *R/pdb.annotate.R 92030f163f3d67913fb7a1b9b57be15a *R/pdb.pfam.R 026945ae25900ec0a924501a99fafacc *R/pdb2aln.R c653c556af553f30ddaeaf2466a69a49 *R/pdb2aln.ind.R 159761971c152bf2db899a25a7754ceb *R/pdb2sse.R 38f860744b4c046f20bc48c8a79b2821 *R/pdbaln.R 13dc32cf8bba028bd221a1f250f419a7 *R/pdbfit.R e8c7d4d37eea6e88fec1eb94482e3b44 *R/pdbs2pdb.R 52008285c2a3d82504a914ae54b7fef9 *R/pdbs2sse.R 3a9e52c15521ad9349e878e392d9aa1c *R/pdbseq.R 84f13855d8297308a5cfb58e63f43da0 *R/pdbsplit.R 7758d93051e9c763dc940893213f357f *R/pfam.R b50eb47056bfa7568bdd97482808de4e *R/plot.blast.R 86be6e01618d198115bcd4b59e8da3ae *R/plot.cmap.R 405b39a11f3ad341d229977ab6012385 *R/plot.cna.R 5f37909e7127bfda49e14dbc8e9ce4f7 *R/plot.core.R 12bb9e2b6232061d0b1ca0873bb6f62d *R/plot.dccm.R b797ea804a7649c70974d5ce7d28ca81 *R/plot.dmat.R 8fe618fdd7b9d92e61002bdc0f35f774 *R/plot.enma.R c8a33f3c13fb9fe2e1152655c6c16fd3 *R/plot.fasta.R dccf527bd23922cbef6ff1209b9496b0 *R/plot.fluct.R 76eb4ca559a6d9c93d795cfb3b9f0262 *R/plot.geostas.R dae1f890d18936dffe91bdf08830e114 *R/plot.hmmer.R 96ce31a0a82978d5e81866671c00f772 *R/plot.matrix.loadings.R 119543f73aa719e47a54ee1b1418fc94 *R/plot.nma.R 0d553d0c777fba08972d519c854d12d0 *R/plot.pca.R ceca3cfe8aadbc4ac81d8cb23ef8f665 *R/plot.pca.loadings.R a0110652e10e3b8634be2998e54c7a7d *R/plot.pca.score.R 1ae081a21e5b24c73f7a4cb6357410bf *R/plot.pca.scree.R b44899b6b43adf43fd010a9faf160ddc *R/plot.rmsip.R 8e198ecfacb7f24eca13082d1ca19dcb *R/plotb3.R 6d64ba753c41667a9f45f73810b978d9 *R/print.cna.R efea2031c5476d8714166c6ac612cdca *R/print.core.R d36bd215d9fc19dee5911ff92cd429ee *R/print.enma.R 963c784e8e86027a377b13bc333b01ff *R/print.fasta.R 1f34d5688cd4496a9b22cb58dd33066a *R/print.geostas.R 1547e70322d8525acaddbc42d0269c6a *R/print.nma.R 82dceefd5f52949a08489965d718db12 *R/print.pca.R 6ca64945413d2668612d10860d5d2be3 *R/print.pdb.R cde3ee5c511a32f80759a997d811a93b *R/print.prmtop.R 1a5f62d5aa393ebddcb43f70c5b36941 *R/print.select.R 586a84798de867b332fe10af487a4546 *R/print.sse.R 5cab345f774a13ba6147967a5d902a27 *R/print.xyz.R 48a31b7ffd4c43170f3ae1e87537c329 *R/project.pca.R 9a13e6bbe9316d39ccb36a5bf980c23d *R/prune.cna.R 15c04b14fa0e879be09ea48492d6fde3 *R/pymol.dccm.R 37ff368a1c16edd47126ed0a13f75495 *R/pymol.modes.R 65d6cb0ca2fb46cbeee7d3f08192f1e2 *R/pymol.pdbs.R c9f6375dde9166fb35832e0e7dd48fe7 *R/read.all.R 4f6fbb9bd10eb009ec555583c8c65661 *R/read.cif.R 23e0e05cbb55e57f91cf69b331f9b39a *R/read.crd.R e992c6a2601ea9188eb30f15d2023d4e *R/read.crd.amber.R 5e91c75f612d033c3edf6eaf88312661 *R/read.crd.charmm.R 2b859e33356a8d733724a69fb956d049 *R/read.dcd.R fc5751a6dc90b7345c5cff9b2f2dbb2c *R/read.fasta.R 61fc2552fc4769508339662dd5b62b36 *R/read.fasta.pdb.R bc664fc717b560c83a3eee4d6972e4f7 *R/read.mol2.R eddc09241d5064deceb16ed56264d355 *R/read.ncdf.R b23630ea3657e24d520aba1c585e8f49 *R/read.pdb.R 5c81d409990b6eba721cc160a833446e *R/read.pdb2.R 69b73edb0238dabf39cd14f0afe45190 *R/read.pdcBD.R c88e499f2e478f7e15453c19374e344e *R/read.pqr.R ed58c2fade5372f69a398f211c8f81e3 *R/read.prmtop.R 9d6d66eb18a8533831a0bfedcd2453cf *R/rgyr.R 8dce578e11588b72651d4fa775a3e318 *R/rle2.R ded56142e753b51c44283dfff308b8d9 *R/rmsd.R 46fa1ef681dc41ce4054a0fb8b9e339c *R/rmsf.R 1f9d56bce23f0ba1a46c27adef9f5e38 *R/rmsip.R 9213954e43f1c8b542bb051cac91769d *R/rot.lsq.R cd2c33f5f607e1531abd7c6488bed778 *R/rtb.R 7810801163901688ee3cab960c83f316 *R/seq2aln.R 5c1439bc3e3cf6da7b010c1c796dc4bf *R/seqaln.R 5bd5ce11e71b9a75a87e3dc71deadd17 *R/seqaln.pair.R 6b313bded9b39072693f189cee48c6fa *R/seqbind.R d0643c9813d7168e8fde6b129da1bf36 *R/seqidentity.R 11659491aee16827ee1b026a6b287274 *R/setup.ncore.R b265ab922ed09417822b6bce32d57452 *R/sip.R 573372f565bb10e9a426d37d68b9eee3 *R/sse.bridges.R 324b201de4f40e9617eb8f80d6ad8c6d *R/store.atom.R 4ad767749c167d3f8dd2dc6c30325e23 *R/stride.R b99422fe7b442863aca6042552724b74 *R/struct.aln.R 02b9229d7c25dfe12356d97abc055c25 *R/summary.cna.R 262055ae077cb8cb99bb8a239dace045 *R/summary.cnapath.R c75b67a9b7274163e06567328630a4a2 *R/summary.pdb.R 9592f26c110e4456bc5712d123b80848 *R/torsion.pdb.R 02ecdf3e7234170d2cc17cefef944ac4 *R/torsion.xyz.R d657629f5eb86376fa71a061b78f5305 *R/trim.mol2.R 61afb6d0d8211337b78b748e90fe8685 *R/trim.pdb.R e38b1fe038cc8153ba8967c93e1bd937 *R/trim.pdbs.R 7f585f9541a0e392a23eb381d6653e36 *R/trim.xyz.R 8d3ccf7b583e943a9e46c3c4af39267f *R/unbound.R 72c5a4d149aeeb907ec7e4cc45e2ae60 *R/uniprot.R d5d3df69651197f3f0547daf0e613d1a *R/var.xyz.R 6edf654c5a36ccb0db5f5226b2d40616 *R/vec2resno.R b323eb922cf8f9036d515e605b7cda1e *R/vmd.R 61b12b6a8496c648f79006f61936c78e *R/vmd.cna.R ab10921b668e85514e04075664439293 *R/vmd.cnapath.R f8814744b4feae467bc874c5f617fe25 *R/vmd_colors.R 91577affd2d5930b392467972a3598ab *R/wrap.tor.R 09cb8f145e08d41466a11b90c9fd6b8a *R/write.crd.R 47c309cafdd3923790727f5ba4f3264c *R/write.fasta.R 1e1b0227e7768f3147548f04d61d7032 *R/write.mol2.R b1e0b5a0e37995a494cf65c7b7cb78b7 *R/write.ncdf.R 8015083d683d1da1e5dc76906e93256e *R/write.pdb.R 548106c98ad8bf2b3b63686d9b7947ad *R/write.pir.R a97c9312ea73b4e105a583707d4a5578 *R/write.pqr.R 9e57938c5fa7ce30265b29e8750f4810 *R/xyz2atom.R 98844a8d357b5252b450e9e40e702643 *README.md 3608ceff54bc6844c2f4b7afe280cd05 *build/vignette.rds b4187321783b82378e3f9be255107088 *data/aa.index.rda 7448b9c2b4cfb706700635d36566a0bd *data/aa.table.rda 7d55fffdd06d238f83012dffdab1d452 *data/atom.index.rda fa83e2ac0f558f03e525c98b46597781 *data/elements.rda a895de8af57cb0ccc8c4dc32a1911f6a *data/hivp.RData bc06c7fcb03535dbc7f0d1e1b3a1f345 *data/kinesin.RData 1a009064df11a8cb036d86a398669efa *data/sdENM.RData ff5d52ecf3f780cbc5c693e87895aacb *data/transducin.RData 9c7346600e9e15eabbf6db7f04b6fb53 *demo/00Index 78e18dac008a0095a72e33647296befc *demo/md.R 5115f75c59507335aca02b35327f2324 *demo/nma.R 37555f4c7b54f97ed5466b49a958a176 *demo/pca.R b7e58ea62baf621f669d3afd84de90f2 *demo/pdb.R b50546f526b9da77fa3d599ccc8f5fdf *inst/CITATION c1ff9ff92aedf699779a4ea75a71ec35 *inst/doc/bio3d_vignettes.Rmd 6999083b4f357edfe57ac2a5844579c0 *inst/doc/bio3d_vignettes.html ea4074c1ad01d8237901b03688f91fec *inst/examples/1dpx.pdb 83ea2593e2c4021492c564f437f0072f *inst/examples/1hel.pdb 7275ccf3f0ab303ae18f01617f420056 *inst/examples/aspirin.mol2 a919bcdc124d3860979252b045358337 *inst/examples/crambin.inpcrd fe8c318484c84e12a0e921c62c08c29d *inst/examples/crambin.prmtop 13633a8eddafb92595c4c0fcbcf22aff *inst/examples/hivp.dcd c9ae51f55e66796d9095b12c2cedc2ea *inst/examples/hivp.pdb b97811463e69c24e6ed8ca61cae7fe3d *inst/examples/hivp_xray.fa 35d529053130d3a6a9d02956cd68abfd *inst/examples/kif1a.fa 962f834069acd3b4fad3fbafe30cab65 *inst/examples/test.pdb cdffbec11fea0886a52591d8650fefc1 *inst/examples/transducin.fa 89fb7d71149c8b40c36ae78f0f676535 *inst/matrices/bio3d.mat 738fed81a10b6bfcc3fe72d96e49643b *inst/matrices/blosum62.mat da8648797ac7625cb14af0741eb80340 *inst/matrices/custom.mat 8ce757a60ee4b6fb9c1dd4ad611352d6 *inst/matrices/emboss_properties.mat 10899946c2edb54f64d77fda863120e7 *inst/matrices/pam30.mat 80d78a8630e33427108c62548dc8ea85 *inst/matrices/properties.mat 4eca44c2cbbe16f4c1920e5c5b5fec6b *inst/matrices/similarity.mat 11a6667645407124ad81fbc0b5c8fe0e *inst/staticdocs/index.r 84b94802d97473728f4c15cb759a2554 *man/aa.index.Rd b58366535e4316def8b4618edc13a951 *man/aa.table.Rd 3c2731aa1146f06cf8747657bfe3dcb7 *man/aa123.Rd 6dc1b206df39ff99949a27f6212c475d *man/aa2index.Rd 1a9206737603466d327ee69ec3a66c24 *man/aa2mass.Rd 6eb71c3d14e610c32922f09a9b8a0846 *man/aanma.pdb.Rd 2022fea6a3f4a30c7f07b64296434d6b *man/aanma.pdbs.Rd a5514ac0ca96d02ff905c0da79bf6e8f *man/aln2html.Rd d4f87a2c9c4344b5e83f155f4c8e11e6 *man/angle.xyz.Rd b938b57f3b0f1e5bc88dc3064a0617dd *man/as.fasta.Rd bdf205c76d1455afde6431a58fcf7c63 *man/as.pdb.Rd 9be4f170fa002fb27e8e94ebbb440e95 *man/as.select.Rd 83141303adc7a82321f5513341f8731b *man/atom.index.Rd 66da56130bd14995f92b06253a5cd9d7 *man/atom.select.Rd 4789893b56ab5844a4cee73d0e7ecd03 *man/atom2ele.Rd c50d66e01ab90e135a211081f819a63c *man/atom2mass.Rd 7e752beacb85941f5ef50ee69a8dc7da *man/atom2xyz.Rd 71788475bc11e8b02f7ee4390ba439e7 *man/basename.pdb.Rd 29c5ac74c5b69f1fabfa396f54592f46 *man/bhattacharyya.Rd 2b016053e31cdc45a613b567ba314ea9 *man/binding.site.Rd 87e8bd01372612166285da3e7f1c49da *man/bio3d.package.Rd dbd7e0074496cc7b17b14d530c12ffdf *man/biounit.Rd 4ce022e382b5ad08a4f764cd87d8f11e *man/blast.pdb.Rd 9ca205b70db6da407022e6e8e3df592b *man/bounds.Rd dc9e849aaf90dfb616f49cbb15d69ef5 *man/bounds.sse.Rd e583167d79325233586ddb72489aee62 *man/bwr.colors.Rd ebaf46fa27bfd05dc5942e64d43ce547 *man/cat.pdb.Rd 5d52d3d192dad296c32f585115506a16 *man/chain.pdb.Rd 2fa034ee371c6082702a19c92b70eb79 *man/check.utility.Rd bae1ae7de8d02f12ef172259d1ad5159 *man/clean.pdb.Rd 3562365fa2850b531d6c52fbc8db3b19 *man/cmap.Rd 5d6d2c477bf7445f12eb56d92456df43 *man/cna.Rd 13cf273490994d0d6f2946e94d879bd9 *man/cnapath.Rd 529d9997941a9a428056c8b0f7c7fc88 *man/com.Rd 1cea06bfbdd42f7234addcff9a7b820d *man/combine.select.Rd c0a6d970ca6159a5e2253a1a3cbbe4a0 *man/community.aln.Rd a8470946f6d83580eb0eafb829c00ef4 *man/community.tree.Rd a452eb11788c87bb9691a661d345d056 *man/consensus.Rd d75b4dd2fd167c244c62d2f2dcd51967 *man/conserv.Rd 2b82724e66f9241d2447506aa0aeba67 *man/convert.pdb.Rd 32847e4b713b4bafa54b3aec1105dd3c *man/core.cmap.Rd 9c678cce60f3e35238c0084148bd9c0b *man/core.find.Rd 599c676a63178db798ce860fe23d5fa9 *man/cov.nma.Rd 8f42632b8d3049280b4c636c7cc5eead *man/covsoverlap.Rd c7152000fe9db3ad35b66ca4583ee5d7 *man/dccm.Rd e8444b390af39397ff632e19815e7503 *man/dccm.enma.Rd beaaaf8bd7f739d02093f84ae33341d8 *man/dccm.gnm.Rd c0a199dee27f88fcb0ec23ca6c874db2 *man/dccm.nma.Rd 63909426bf66693d90c5fccfab8ebe07 *man/dccm.pca.Rd 3a93322b00f3bd03c6335fb81dd7928a *man/dccm.xyz.Rd 7c1fdc4408d2875de7a7597816d232f4 *man/deformation.nma.Rd c923b626ecfa0810c4ed642ec372cb8a *man/diag.ind.Rd 913b46273cfb376ea575391d0ee17feb *man/difference.vector.Rd 679eeb81251cf1c0d339bf1daba92a6d *man/dist.xyz.Rd 89470ad6356d34887cfa5f16f1a59112 *man/dm.Rd 812928b8922c13779dc41042e052a37a *man/dssp.Rd 8756af3faa9d144be4f192fde9c1640a *man/elements.Rd 4d4179906785d741e4ff180391d3599a *man/entropy.Rd 19652be0b9a2f46c17f4c788e627681e *man/example.data.Rd 691f07b387b01e083dc507780677f744 *man/filter.cmap.Rd 77cb80df3dfd3a4b3880354b72513449 *man/filter.dccm.Rd 5fe3188b87cda4c0bf39c59680715635 *man/filter.identity.Rd de1dd34d923f2bd6d46ea41397d6a4f3 *man/filter.rmsd.Rd b67d3ed0ae79fb4c5ea9f8f689cc52bc *man/fit.xyz.Rd e7e8d1f2f4c6eb26e4656bdfcfeef3ed *man/fluct.nma.Rd 1ffc100dfdffa67dcccfd30544913950 *man/formula2mass.Rd cbe6a6f50db0ecfb66fa2c48d9f3e470 *man/gap.inspect.Rd 29f8d0ff1655774ebe5ab380cca1c3cd *man/geostas.Rd 259a32d11fb99fb854695a40679b779f *man/get.pdb.Rd bf6f1d06b451d361e1665b6c009eae90 *man/get.seq.Rd 0b96e2e65c1d4d7d70d37835c687892b *man/gnm.Rd 1560274da20f8df6d1c90ada44a2f53d *man/hclustplot.Rd 1aa6ebb16bfe8baf51566d66bdce3031 *man/hmmer.Rd 174d45fffd551d6a79684bcbe74594b7 *man/identify.cna.Rd d1db147f827dd27adec412411efb1b7b *man/inner.prod.Rd a6e0dbb5bbbdd54641f51a13468365ac *man/inspect.connectivity.Rd 86678483ad473128779e86d25f800840 *man/is.gap.Rd fce94b808315219a039e5fd5087aff28 *man/is.mol2.Rd b70ea5b1c25fdc58287a5a2f92f507a1 *man/is.pdb.Rd 5b8b6e9f18c4acf77ea4e8fc1231a6c8 *man/is.select.Rd f2cd959d3b0bd3cd16ddff0f00318276 *man/is.xyz.Rd ea59632bc1ae69ba8bcc5a5e1769eb9c *man/layout.cna.Rd 060c0199ec1ba752ab79d7a43456209c *man/lbio3d.Rd 7ba02458e721a3eb7791c88c4ad76138 *man/load.enmff.Rd 8cf75bfa87062538b1dd73a3d3032938 *man/mask.dccm.Rd 1638a12b0d2a05ef9fb6462ca359c9ec *man/mktrj.Rd 80013dfda9be3aff846a2ca0f83004df *man/motif.find.Rd 7ff174dfe08c8c4c30fd8c28a26f9ef2 *man/mustang.Rd 0ab1fcc8dc037069f0b39c8dacf49433 *man/network.amendment.Rd 71ad2ee50aa734cec2af2cc417da5ed2 *man/nma.Rd 393d48481b2a670707acef6fb4c8c2f8 *man/nma.pdb.Rd 6e890c02b3cc848b7a5bf0566bac24af *man/nma.pdbs.Rd 6f18fd042d34d3ef235f7ebc5759a61e *man/normalize.vector.Rd 473ba3c98c1325eb6733d4dbaf5b6f9f *man/orient.pdb.Rd ee0c1d7ffbf7de55827341ecb861e240 *man/overlap.Rd e8833cb53be9a897b63dee8e0e7da248 *man/pairwise.Rd 6b30dceb8f37b251feb5ab5d3f56afee *man/pca.Rd 65c547dd3cff5352b29ecaa337a00f6d *man/pca.array.Rd e436c1892ed7b3430ff6a6e9a9c98471 *man/pca.pdbs.Rd 818f18c8b96cc71126a52e969f53a6e9 *man/pca.tor.Rd 53cface21cbb40bd3ca870b4e2372836 *man/pca.xyz.Rd 86398133edf2519d840be01da9ca91a7 *man/pdb.annotate.Rd 5be6f31a7292bee0be3cd10600844d73 *man/pdb2aln.Rd 3abac689ec64769ff39e4c9d7a8cf639 *man/pdb2aln.ind.Rd 9fa70c11e473f83db218cb2f4816e11c *man/pdb2sse.Rd 2ec1fbfae80fb0dc74fc39c0d5c31419 *man/pdbaln.Rd 811cc4d61c4ca9b60bc88d7304ec2106 *man/pdbfit.Rd 37131ba0bb18840fd787175d073735bc *man/pdbs2pdb.Rd 9af1b77250c2376faf568991b2d2bb80 *man/pdbs2sse.Rd 4df376e6d9caa6384ae2a63db6dad93a *man/pdbseq.Rd 0f5f8241ff4eed029d4de0376d3d9451 *man/pdbsplit.Rd 6d07b414a2896edf8527005aea0cb728 *man/pfam.Rd d4d0f0a5b0cd78d1068838bea9582675 *man/plot.bio3d.Rd c2fc3a3fc68b25960fadfc01856d6891 *man/plot.cmap.Rd 7586da62e9ab5fa30706feffb5316ba7 *man/plot.cna.Rd b93f1f7706d412ea33d044ff0b331375 *man/plot.core.Rd e983addd2c909060b66007af0df30909 *man/plot.dccm.Rd b25abe5c5c275ff51d8b8249cfea136a *man/plot.dmat.Rd 89081aa2e053d47877dc8bcd962907f5 *man/plot.enma.Rd a14759a107ac7956f786117a70be390f *man/plot.fasta.Rd 7138ba6823879c2483e3a8cea972aeb9 *man/plot.fluct.Rd 1d336234f2c664954aa84a2241c4b9dc *man/plot.geostas.Rd a3f5d4c511425d3eda4cc9f50b73923a *man/plot.hmmer.Rd f7f5a8f59c15ca7c81fa2d5935120809 *man/plot.matrix.loadings.Rd cde80be2caee0007d3aae194170a4373 *man/plot.nma.Rd 799f03f06c73b55b22b68cae1ed24d1c *man/plot.pca.Rd c6d01fbaab9a9a055e0358186a5215d8 *man/plot.pca.loadings.Rd ae438e3711efafcf3b92f50cbc4ce171 *man/plot.rmsip.Rd e7e2d8b3a9289ec0b75b03e97e6cd713 *man/print.cna.Rd 5199c78f35bcb8aade5e662e4cbf968e *man/print.core.Rd fbd2570538e2c23bd7a8992291f3ea23 *man/print.fasta.Rd 9cd68565f972204cd7a130537019529b *man/print.xyz.Rd 84648862fc42e524d2136b413f71b251 *man/project.pca.Rd 7c4cc0978c045b12e39747381f5912be *man/prune.cna.Rd f7b5b7a8587ea525f4f93e48ec8f2435 *man/pymol.Rd bbcd9a2272643a6a21624b9ac529026d *man/read.all.Rd debe46ba72c904999884f3341ab3e0bf *man/read.cif.Rd 2019088967922f8588c3946894828f35 *man/read.crd.Rd 23e20c7591353eb20ee10a13a5c2b2e5 *man/read.crd.amber.Rd 18f77ab523572c2e13b3749a4c5a634c *man/read.crd.charmm.Rd 033136ba003643685b20aeb67fcf94fb *man/read.dcd.Rd 0ee24dbc69145726044f89efe451a8f9 *man/read.fasta.Rd fbe9889d1abb5110a943a1c7a2c6c7d9 *man/read.fasta.pdb.Rd e464eb9cba639e23986c61444c65ad93 *man/read.mol2.Rd ba1caf18d75c10689c3fcd877bded386 *man/read.ncdf.Rd 62f8fd25c2b04663b7643f972baf2528 *man/read.pdb.Rd 6e3ad77352cf6c4e2dd4fb7354994cae *man/read.pdcBD.Rd 5ab0698d800bdb8b7c006b50fbabb69a *man/read.pqr.Rd deedf7efb2952c0a745edd65808f4b29 *man/read.prmtop.Rd 57fdce686ee9a7163fd5d7d11263ec6d *man/rgyr.Rd e916b3a1dc4123b0b80b2c0c2939c3e1 *man/rle2.Rd 917bde7f1d46c7f065fba50151b25916 *man/rmsd.Rd 0edcdcabf8263e255f8b8fbb6385e4ee *man/rmsf.Rd a271c09d4ce2e24c86fcafc5fa66edaf *man/rmsip.Rd 3ef8d4666baeaa9f66b846e55a90a724 *man/sdENM.Rd 3e804c81607cc5f7b0ed1ba8a46f8dde *man/seq2aln.Rd 721d6e39789d8d7c92cefaf5250befea *man/seqaln.Rd 7c4ed004c061ce35cb349d6f83eb5372 *man/seqaln.pair.Rd 678abd82bb014d24f3372cc7e2b299aa *man/seqbind.Rd 482e3d9e6896cee6f90f3d2767d6f214 *man/seqidentity.Rd 25cfad04dae510fb7f6014aab50909ec *man/setup.ncore.Rd 8fdefbb073ef2fd752b62d5dcb2c8a32 *man/sip.Rd b9c1625f98df791d0a4e76604a09dda7 *man/sse.bridges.Rd af3965c5649462ca5c5c1778140242da *man/store.atom.Rd 655a396c3da16f478b6a60fb042e4830 *man/struct.aln.Rd e11dfa2cce7b480f56e0153a82d9dd91 *man/torsion.pdb.Rd 2bfdfc55c6bc21de9c0519fb3ec99eb7 *man/torsion.xyz.Rd 6b60ea4ab1b2df24c0434f4289b9aa55 *man/trim.mol2.Rd 63ce6004ceb8bcd8c1a5bf17ab642f28 *man/trim.pdb.Rd 46b164a4619290bad96ee94d3d413a68 *man/trim.pdbs.Rd 52149be72b4031fc5caf28fc8ae5ef79 *man/trim.xyz.Rd 67c2777942274c48a7271290b6e23928 *man/unbound.Rd eaa8ce55814e03c1b385a195b90f6a29 *man/uniprot.Rd 8d1f856736a9fb3121a0dc347b65d70c *man/var.xyz.Rd 77cc057f3957a606eb0f899a98170541 *man/vec2resno.Rd 6c6b8f23a003537ddebe105e5deed14a *man/vmd.cna.Rd 2180250f10d808b67fb61cb50fea8e91 *man/vmd_colors.Rd 1bd7706fbadf8fc9c50b0d6b66bc4fc8 *man/wrap.tor.Rd 5a7e2af1e926232bd2a33395e2b6e438 *man/write.crd.Rd 5b7f663c597744d07cd88628db85a122 *man/write.fasta.Rd 9f23868cb6336228b1a59ba814014e5d *man/write.mol2.Rd bdba01d334d362c4d19eebe205766ab4 *man/write.ncdf.Rd 36aeb1e09f1f685aead3ca2d2a572422 *man/write.pdb.Rd 625ceb8c4d935f7937e18c20349cfdbb *man/write.pir.Rd 69a99c1725e03f159a4c112d53eabded *man/write.pqr.Rd 19d931cc54e940b9125c68554d1d91c3 *src/Makevars 44902fcb257ca863d0d518340acaa873 *src/RcppExports.cpp 1358a5ca323fe8cbd5883151808c2838 *src/convert.h 4311765ab076cb1f4b1e96adc4b29c18 *src/gzstream.cpp c32e16a810b222875c935750f705e675 *src/gzstream.h e9f4b892d2ef97fb8276dced2905266e *src/init.c 99408ab5e21920e6249cb9a8229dadae *src/read_cif.cpp 6580911a047279f2ce6cba55b91b9779 *src/read_crd.cpp b258fea92497a8e3f84692bd2b52fbee *src/read_pdb.cpp fbac5722a584bdd47928b5ffebfba3c4 *src/read_prmtop.cpp 19aace048998023dc6bda812f696bfaa *src/utils.cpp 1539d29f6aeb429787b8aaff9cab2693 *src/utils.h 7ffe3e756f90cee9d1c7a3a9504c8775 *tests/testthat.R e562ac9c81e2be76674885a50d7daef9 *tests/testthat/test-aa2mass.R 1c9b5c113f5a3df53f41556673cd35c2 *tests/testthat/test-aanma.R ed5e17dbb713aa12d999985601db24b7 *tests/testthat/test-aanma.pdbs.R f4a44448a8ae2a889fe195f7ac7bc89c *tests/testthat/test-atom.select.R ad7f0e5862c60ef29595c538f79b6ea5 *tests/testthat/test-atom2mass.R daa3ef9e24b87d51f1d69be2ba73e385 *tests/testthat/test-clean.pdb.R df734a56c16ed2286c2a22404610e44b *tests/testthat/test-cmap.R 87d3b42efc165f69f4a49e20484ad3cb *tests/testthat/test-cna.R 36b28b709f967ac73ffbddd875581c1c *tests/testthat/test-core.find.R 43444589d48a434fa0d98b0be3821bf6 *tests/testthat/test-dccm.R 47f12cf7b78fbb0babfbddbebe98d58f *tests/testthat/test-deformation.R 0fc53ca2b7b7cf3f3133ed23552c792e *tests/testthat/test-dssp.R 8deaca65abbabc8af816d845e65822c9 *tests/testthat/test-fitting.R 90f83f900951fb2294367293dd4df599 *tests/testthat/test-get.pdb.R 8b30d150f8f89a4b85042d9a75875c63 *tests/testthat/test-get.seq.R 8279591f9aff5854a242050dc08a49c2 *tests/testthat/test-gnm.R bd4c0b6b923391b510e290a6f4cd643e *tests/testthat/test-mol2.R cf8eea920886aee022a6364974d74d7f *tests/testthat/test-nma.R 049cd8b11592a79053243d7ea1071045 *tests/testthat/test-nma.pdbs.R baf983dfe1b2cdc7d191936c5b90fa84 *tests/testthat/test-overlap.R 40ceba65a3f1831a50bd9807b54285da *tests/testthat/test-pca.R 7a7fd7bde47a838bbdd16bff84baaa94 *tests/testthat/test-pdb.annotate.R b0a56a2947afca64021c5d6fbd15f106 *tests/testthat/test-pdbsplit.R 947ad244025c6845d08f5c748a973fd7 *tests/testthat/test-read.all.R 1cd2162d0c7bdf7bb7baf644c38dc51c *tests/testthat/test-read.cif.R 023023edfad99f9741fe5b952414d125 *tests/testthat/test-read.ncdf.R 75f30d421298d40f771594fcb3d9b21f *tests/testthat/test-read.pdb.R 61e0586230215210805dae1af57be23a *tests/testthat/test-rmsd.R 87841a455963de938fc9552fc7bfcd3f *tests/testthat/test-seqaln.R 6df4c57a5670a44aacc181a2e01b8b72 *tests/testthat/test-vector-funs.R c1ff9ff92aedf699779a4ea75a71ec35 *vignettes/bio3d_vignettes.Rmd bio3d/inst/0000755000176200001440000000000014046127635012237 5ustar liggesusersbio3d/inst/examples/0000755000176200001440000000000014046015221014040 5ustar liggesusersbio3d/inst/examples/transducin.fa0000644000176200001440000003100014046015221016514 0ustar liggesusers>http://www.rcsb.org/pdb/files/1TND.pdb -----------------------------ARTVKLLLLGAGESGKSTIVKQMKIIHQDGY SLEECLEFIAIIYGNTLQSILAIVRAMTTLNIQYGDSARQDDARKLMHMADTIEE-GTMP KEMSDIIQRLWKDSGIQACFDRASEYQLNDSAGYYLSDLERLVTPGYVPTEQDVLRSRVK TTGIIETQFSFKDLNFRMFDVGGQRSERKKWIHCFEGVTCIIFIAALSAYDMVLVEDDEV NRMHESLHLFNSICNHRYFATTSIVLFLNKKDVFSEKIKKAHLSICFPDYNGPNTYEDAG NYIKVQFLELNMRRDVKEIYSHMTCATDTQNVKFVFDAVTDIIIKENLKDCGL- >http://www.rcsb.org/pdb/files/1TAD.pdb -----------------------------ARTVKLLLLGAGESGKSTIVKQMKIIHQDGY SLEECLEFIAIIYGNTLQSILAIVRAMTTLNIQYGDSARQDDARKLMHMADTIEE-GTMP KEMSDIIQRLWKDSGIQACFDRASEYQLNDSAGYYLSDLERLVTPGYVPTEQDVLRSRVK TTGIIETQFSFKDLNFRMFDVGGQRSERKKWIHCFEGVTCIIFIAALSAYDMVLVEDDEV NRMHESLHLFNSICNHRYFATTSIVLFLNKKDVFSEKIKKAHLSICFPDYNGPNTYEDAG NYIKVQFLELNMRRDVKEIYSHMTCATDTQNVKFVFDAVTDIIIKE-------- >http://www.rcsb.org/pdb/files/1TAG.pdb -----------------------------ARTVKLLLLGAGESGKSTIVKQMKIIHQDGY SLEECLEFIAIIYGNTLQSILAIVRAMTTLNIQYGDSARQDDARKLMHMADTIEE-GTMP KEMSDIIQRLWKDSGIQACFDRASEYQLNDSAGYYLSDLERLVTPGYVPTEQDVLRSRVK TTGIIETQFSFKDLNFRMFDVGGQRSERKKWIHCFEGVTCIIFIAALSAYDMVLVEDDEV NRMHESLHLFNSICNHRYFATTSIVLFLNKKDVFSEKIKKAHLSICFPDYNGPNTYEDAG NYIKVQFLELNMRRDVKEIYSHMTCATDTQNVKFVFDAVTDIII---------- >http://www.rcsb.org/pdb/files/3V00.pdb --HMGAGASAEEKHSRELEKKLKEDAEKDARTVKLLLLGAGESGKSTIVKQMKIIHQDPY SLEECLEFIAIIYGNTLQSILAIVRAMTTLNIQYGDSARQDDARKLMHMADTIEE-GTMP KEMSDIIQRLWKDSGIQACFDRASEYQLNDSAGYYLSDLERLVTPGYVPTEQDVLRSRVK TTGIIETQFSFKDLNFRMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMHLFNSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAG NYIKVQFLELNMRRDVKEIYSHMTCATDTQNVKFVFDAVTDIIIKENLKDCGLF >http://www.rcsb.org/pdb/files/1FQJ.pdb ------------------------------RTVKLLLLGAGESGKSTIVKQMKIIHQDGY SLEECLEFIAIIYGNTLQSILAIVRAMTTLNIQYGDSARQDDARKLMHMADTIEE-GTMP KEMSDIIQRLWKDSGIQACFDRASEYQLNDSAGYYLSDLERLVTPGYVPTEQDVLRSRVK TTGIIETQFSFKDLNFRMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAG NYIKVQFLELNMRRDVKEIYSHMTCATDTQNVKFVFDAVTDIIIKENL------ >http://www.rcsb.org/pdb/files/1FQK.pdb ------------------------------RTVKLLLLGAGESGKSTIVKQMKIIHQDGY SLEECLEFIAIIYGNTLQSILAIVRAMTTLNIQYGDSARQDDARKLMHMADTIEE-GTMP KEMSDIIQRLWKDSGIQACFDRASEYQLNDSAGYYLSDLERLVTPGYVPTEQDVLRSRVK TTGIIETQFSFKDLNFRMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAG NYIKVQFLELNMRRDVKEIYSHMTCATDTQNVKFVFDAVTDIIIKENLK----- >http://www.rcsb.org/pdb/files/2XNS.pdb ------------------------------REVKLLLLGAGESGKSTIVKQMKIIHEAGY SEEECKQYKAVVYSNTIQSIIAIIRAMGRLKIDFGDSARADDARQLFVLAGAAEE-GFMT AELAGVIKRLWKDSGVQACFNRSREYQLNDSAAYYLNDLDRIAQPNYIPTQQDVLRTRVK TTGIVETHFTFKDLHFKMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAA AYIQCQFEDLNKRKDTKEIYTHFTCATDTKNVQFVFDAVTDVIIKNN------- >http://www.rcsb.org/pdb/files/1KJY.pdb ----------------------------GAREVKLLLLGAGESGKSTIVKQMKIIHEAGY SEEECKQYKAVVYSNTIQSIIAIIRAMGRLKIDFGDSARADDARQLFVLAGAAEE-GFMT AELAGVIKRLWKDSGVQACFNRSREYQLNDSAAYYLNDLDRIAQPNYIPTQQDVLRTRVK TTGIVETHFTFKDLHFKMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAA AYIQCQFEDLNKRKDTKEIYTHFTCATDTKNVQFVFDAVTDVIIKNNLK----- >http://www.rcsb.org/pdb/files/2OM2.pdb ----------------------------GAREVKLLLLGAGESGKSTIVKQMKIIHEAGY SEEECKQYKAVVYSNTIQSIIAIIRAMGRLKIDFGDSARADDARQLFVLAGAAEE-GFMT AELAGVIKRLWKDSGVQACFNRSREYQLNDSAAYYLNDLDRIAQPNYIPTQQDVLRTRVK TTGIVETHFTFKDLHFKMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAA AYIQCQFEDLNKRKDTKEIYTHFTCATDTKNVQFVFDAVTDVIIKNNLK----- >http://www.rcsb.org/pdb/files/4G5Q.pdb -----------------------------AREVKLLLLGAGESGKSTIVKQMKIIHEAGY SEEECKQYKAVVYSNTIQSIIAIIRAMGRLKIDFGDSARADDARQLFVLAGAAEE-GFMT AELAGVIKRLWKDSGVQACFNRSREYQLNDSAAYYLNDLDRIAQPNYIPTQQDVLRTRVK TTGIVETHFTFKDLHFKMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAA AYIQCQFEDLNKRKDTKEIYTHFTCATDTKNVQFVFDAVTDVIIKNNLKD---- >http://www.rcsb.org/pdb/files/1GP2.pdb ---LSAEDKAAVERSKMIDRNLREDGEKAAREVKLLLLGAGESGKSTIVKQMKIIHEAGY SEEECKQYKAVVYSNTIQSIIAIIRAMGRLKIDFGDAARADDARQLFVLAGAAEE-GFMT AELAGVIKRLWKDSGVQACFNRSREYQLNDSAAYYLNDLDRIAQPNYIPTQQDVLRTRVK TTGIVETHFTFKDLHFKMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAA AYIQCQFEDLNKRKDTKEIYTHFTCATDTKNVQFVFDAVTDVIIKNNL------ >http://www.rcsb.org/pdb/files/1AGR.pdb ---LSAEDKAAVERSKMIDRNLREDGEKAAREVKLLLLGAGESGKSTIVKQMKIIHEAGY SEEECKQYKAVVYSNTIQSIIAIIRAMGRLKIDFGDAARADDARQLFVLAGAAEE-GFMT AELAGVIKRLWKDSGVQACFNRSREYQLNDSAAYYLNDLDRIAQPNYIPTQQDVLRTRVK TTGIVETHFTFKDLHFKMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAA AYIQCQFEDLNKRKDTKEIYTHFTCATDTKNVQFVFDAVTDVIIKNNLKDCGLF >http://www.rcsb.org/pdb/files/1CIP.pdb ------------------------------REVKLLLLGAGESGKSTIVKQMKIIHEAGY SEEECKQYKAVVYSNTIQSIIAIIRAMGRLKIDFGDAARADDARQLFVLAGAAEE-GFMT AELAGVIKRLWKDSGVQACFNRSREYQLNDSAAYYLNDLDRIAQPNYIPTQQDVLRTRVK TTGIVETHFTFKDLHFKMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAA AYIQCQFEDLNKRKDTKEIYTHFTCATDTKNVQFVFDAVTDVIIKNN------- >http://www.rcsb.org/pdb/files/1GFI.pdb -------------------------------EVKLLLLGAGESGKSTIVKQMKIIHEAGY SEEECKQYKAVVYSNTIQSIIAIIRAMGRLKIDFGDAARADDARQLFVLAGAAEE-GFMT AELAGVIKRLWKDSGVQACFNRSREYQLNDSAAYYLNDLDRIAQPNYIPTQQDVLRTRVK TTGIVETHFTFKDLHFKMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAA AYIQCQFEDLNKRKDTKEIYTHFTCATDTKNVQFVFDAVTDVIIK--------- >http://www.rcsb.org/pdb/files/1GIA.pdb --------------------------------VKLLLLGAGESGKSTIVKQMKIIHEAGY SEEECKQYKAVVYSNTIQSIIAIIRAMGRLKIDFGDAARADDARQLFVLAGAAEE-GFMT AELAGVIKRLWKDSGVQACFNRSREYQLNDSAAYYLNDLDRIAQPNYIPTQQDVLRTRVK TTGIVETHFTFKDLHFKMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAA AYIQCQFEDLNKRKDTKEIYTHFTCATDTKNVQFVFDAVTDVI----------- >http://www.rcsb.org/pdb/files/2ZJY.pdb ------------------------------REVKLLLLGAGESGKSTIVKQMKIIHEAGY SEEECKQYKAVVYSNTIQSIIAIIRAMGRLKIDFGDAARADDARQLFVLAGAAEE-GFMT AELAGVIKRLWKDSGVQACFNRSREYQLNDSAAYYLNDLDRIAQPNYIPTQQDVLRTRVK TTGIVETHFTFKDLHFKMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAA AYIQCQFEDLNKRKDTKEIYTHFTCATDTKNVQFVFDAVTDVIIKNNL------ >http://www.rcsb.org/pdb/files/3ONW.pdb ------------------------------REVKLLLLGAGESGKSTIVKQMKIIHEAGY SEEECKQYKAVVYSNTIQSIIAIIRAMGRLKIDFGDSARADDARQLFVLAGAAEE-GFMT AELAGVIKRLWKDSGVQACFNRSREYLLNDSAAYYLNDLDRIAQPNYIPTQQDVLRTRVK TTGIVETHFTFKDLHFKMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAA AYIQCQFEDLNKRKDTKEIYTHFTCATDTKNVQFVFDAVTDVIIKNN------- >http://www.rcsb.org/pdb/files/1BH2.pdb ------------------------------REVKLLLLGAGESGKSTIVKQMKIIHEAGY SEEECKQYKAVVYSNTIQSIIAIIRAMGRLKIDFGDAARADDARQLFVLAGAAEE-GFMT AELAGVIKRLWKDSGVQACFNRSREYQLNDSAAYYLNDLDRIAQPNYIPTQQDVLRTRVK TTGIVETHFTFKDLHFKMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAA AYIQCQFEDLNKRKDTKEIYTHFTCSTDTKNVQFVFDAVTDVIIKN-------- >http://www.rcsb.org/pdb/files/1GG2.pdb ---LSAEDKAAVERSKMIDRNLREDGEKAAREVKLLLLGAGESGKSTIVKQMKIIHEAGY SEEECKQYKAVVYSNTIQSIIAIIRAMGRLKIDFGDAARADDARQLFVLAGAAEE-GFMT AELAGVIKRLWKDSGVQACFNRSREYQLNDSAAYYLNDLDRIAQPNYIPTQQDVLRTRVK TTGIVETHFTFKDLHFKMFDVGAQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAA AYIQCQFEDLNKRKDTKEIYTHFTCATDTKNVQFVFDAVTDVIIKNNL------ >http://www.rcsb.org/pdb/files/1GIT.pdb ------------------------------REVKLLLLGAGESGKSTIVKQMKIIHEAGY SEEECKQYKAVVYSNTIQSIIAIIRAMGRLKIDFGDAARADDARQLFVLAGAAEE-GFMT AELAGVIKRLWKDSGVQACFNRSREYQLNDSAAYYLNDLDRIAQPNYIPTQQDVLRTRVK TTGIVETHFTFKDLHFKMFDVGAQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAA AYIQCQFEDLNKRKDTKEIYTHFTCATDTKNVQFVFDAVTDVIIKNNL------ >http://www.rcsb.org/pdb/files/3QI2.pdb ----------------------------GAREVKLLLLGARESGKSTIVKQMKIIHEAGY SEEECKQYKAVVYSNTIQSIIAIIRAMGRLKIDFGDSARADDARQLFVLAGAAEE-GFMT AELAGVIKRLWKDSGVQACFNRSREYQLNDSAAYYLNDLDRIAQPNYIPTQQDVLRTRVK TTGIVETHFTFKDLHFKMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAA AYIQCQFEDLNKRKDTKEIYTHFTCATDTKNVQFVFDAVTDVIIKNN------- >http://www.rcsb.org/pdb/files/1SVK.pdb -------------------------------EVKLLLLGAGESGKSTIVKQMKIIHEAGY SEEECKQYKAVVYSNTIQSIIAIIRAMGRLKIDFGDAARADDARQLFVLAGAAEE-GFMT AELAGVIKRLWKDSGVQACFNRSREYQLNDSAAYYLNDLDRIAQPNYIPTQQDVLRTRVP TTGIVETHFTFKDLHFKMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAA AYIQCQFEDLNKRKDTKEIYTHFTCATDTKNVQFVFDAVTDVIIK--------- >http://www.rcsb.org/pdb/files/1SVS.pdb ------------------------------REVKLLLLGAGESGKSTIVKQMKIIHEAGY SEEECKQYKAVVYSNTIQSIIAIIRAMGRLKIDFGDAARADDARQLFVLAGAAEE-GFMT AELAGVIKRLWKDSGVQACFNRSREYQLNDSAAYYLNDLDRIAQPNYIPTQQDVLRTRVP TTGIVETHFTFKDLHFKMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAA AYIQCQFEDLNKRKDTKEIYTHFTCATDTKNVQFVFDAVTDVIIKNN------- >http://www.rcsb.org/pdb/files/3FFA.pdb -------------------------------EVKLLLLGAGESGKSTIVKQMKIIHEAGY SEEECKQYKAVVYSNTIQSIIAIIRAMGRLKIDFGDAARADDARQLFVLAGAAEE-GFMT AELAGVIKRLWKDSGVQACFNRSREYQLNDSAAYYLNDLDRIAQPNYIPTQQDVLRTRVK TTGIVETHFTFKDLHFKMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAA AYIQCQFEDLNKRKDTKEIYTHFTCATDAKNVQFVFDAVTDVIIKNNL------ >http://www.rcsb.org/pdb/files/1GIL.pdb --------------------------------VKLLLLGAGESGKSTIVKQMKIIHEAGY SEEECKQYKAVVYSNTIQSIIAIIRAMGRLKIDFGDAARADDARQLFVLAGAAEE-GFMT AELAGVIKRLWKDSGVQACFNRSREYQLNDSAAYYLNDLDRIAQPNYIPTQQDVLRTRVK TTGIVETHFTFKDLHFKMFDVGGLRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAA AYIQCQFEDLNKRKDTKEIYTHFTCATDTKNVQFVFDAVTDVI----------- >http://www.rcsb.org/pdb/files/1AS0.pdb ------------------------------REVKLLLLGAVESGKSTIVKQMKIIHEAGY SEEECKQYKAVVYSNTIQSIIAIIRAMGRLKIDFGDAARADDARQLFVLAGAAEE-GFMT AELAGVIKRLWKDSGVQACFNRSREYQLNDSAAYYLNDLDRIAQPNYIPTQQDVLRTRVK TTGIVETHFTFKDLHFKMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAA AYIQCQFEDLNKRKDTKEIYTHFTCATDTKNVQFVFDAVTDVII---------- >http://www.rcsb.org/pdb/files/1AS2.pdb ------------------------------REVKLLLLGAVESGKSTIVKQMKIIHEAGY SEEECKQYKAVVYSNTIQSIIAIIRAMGRLKIDFGDAARADDARQLFVLAGAAEE-GFMT AELAGVIKRLWKDSGVQACFNRSREYQLNDSAAYYLNDLDRIAQPNYIPTQQDVLRTRVK TTGIVETHFTFKDLHFKMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTDTSIILFLNKKDLFEEKIKKSPLTICYPEYAGSNTYEEAA AYIQCQFEDLNKRKDTKEIYTHFTCATDTKNVQFVFDAVTDVIIKN-------- >http://www.rcsb.org/pdb/files/2ODE.pdb -------------------------------EVKLLLLGAGESGKSTIVKQMKIIHEDGY SEDECKQYKVVVYSNTIQSIIAIIRAMGRLKIDFGEAARADDARQLFVLAGSAEE-GVMT PELAGVIKRLWRDGGVQACFSRSREYQLNDSASYYLNDLDRISQSNYIPTQQDVLRTRVK TTGIVETHFTFKDLYFKMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTETSIILFLNKKDLFEEKIKRSPLTICYPEYTGSNTYEEAA AYIQCQFEDLNRRKDTKEIYTHFTCATDTKNVQFVFDAVTDVIIKNNL------ >http://www.rcsb.org/pdb/files/2V4Z.pdb ------------------------------KEVKLLLLGAGESGKSTIVKQMKIIHEDGY SEDECKQYKVVVYSNTIQSIIAIIRAMGRLKIDFGEAARADDARQLFVLAGSAEE-GVMT PELAGVIKRLWRDGGVQACFSRSREYQLNDSASYYLNDLDRISQSNYIPTQQDVLRTRVK TTGIVETHFTFKDLYFKMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTETSIILFLNKKDLFEEKIKRSPLTICYPEYTGSNTYEEAA AYIQCQFEDLNRRKDTKEIYTHFTCATDTKNVQFVFDAVTDVIIKNN------- >http://www.rcsb.org/pdb/files/4G5R.pdb ------------------------------KEVKLLLLGAGESGKSTIVKQMKIIHEDGY SEDECKQYKVVVYSNTIQSIIAIIRAMGRLKIDFGEAARADDARQLFVLAGSAEE-GVMT PELAGVIKRLWRDGGVQACFSRSREYQLNDSASYYLNDLDRISQSNYIPTQQDVLRTRVK TTGIVETHFTFKDLYFKMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTETSIILFLNKKDLFEEKIKRSPLTICYPEYTGSNTYEEAA AYIQCQFEDLNRRKDTKEIYTHFTCATDTKNVQFVFDAVTDVIIKNNLKE---- >http://www.rcsb.org/pdb/files/2IHB.pdb -------------------------------EVKLLLLGAGESGKSTIVKQMKIIHEDGY SEDECKQYKVVVYSNTIQSIIAIIRAMGRLKIDFGEAARADDARQLFVLAGSAEE-GVMT PELAGVIKRLWRDGGVQACFSRSREYQLNDSASYYLNDLDRISQSNYIPTQQDVLRTRVK TTGIVETHFTFKDLYFKMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTETSIILFLNKKDLFEEKIKRSPLTICYPEYTGSNTYEEAA AYIQCQFEDLNRRKDTKEIYTHFTCATDTKNVQFVFDAVTDVIIKNNLK----- >http://www.rcsb.org/pdb/files/4G5O.pdb -----------------------------AKEVKLLLLGAGESGKSTIVKQMKIIHEDGY SEDECKQYKVVVYSNTIQSIIAIIRAMGRLKIDFGEAARADDARQLFVLAGSAEE-GVMT PELAGVIKRLWRDGGVQACFSRSREYLLNDSASYYLNDLDRISQSNYIPTQQDVLRTRVK TTGIVETHFTFKDLYFKMFDVGGQRSERKKWIHCFEGVTAIIFCVALSDYDLVLAEDEEM NRMHESMKLFDSICNNKWFTETSIILFLNKKDLFEEKIKRSPLTICYPEYTGSNTYEEAA AYIQCQFEDLNRRKDTKEIYTHFTCATDTKNVQFVFDAVTDVIIKNNLKE---- bio3d/inst/examples/test.pdb0000644000176200001440000003474114046015221015517 0ustar liggesusersTITLE A CURATED PDB FILE FOR BIO3D FUNCTION TESTING COMPND 3 CHAIN: A, B; REMARK 470 MISSING ATOM REMARK 470 M RES CSSEQI ATOMS REMARK 470 ARG B 2 CA HET CA A 8 1 HET GDP A 7 40 HETNAM CA CALCIUM ION HETNAM GDP GUANOSINE-5'-DIPHOSPHATE FORMUL 2 CA CA 2+ FORMUL 3 GDP C10 H15 N5 O11 P2 FORMUL 4 HOH *5(H2 O) ATOM 1 N GLY A 1 16.622 88.040 40.142 1.00 0.00 N ATOM 2 H GLY A 1 16.225 88.048 41.071 1.00 0.00 H ATOM 3 CA GLY A 1 16.176 89.039 39.198 1.00 0.00 C ATOM 4 HA2 GLY A 1 16.896 89.857 39.171 1.00 0.00 H ATOM 5 HA3 GLY A 1 16.099 88.591 38.207 1.00 0.00 H ATOM 6 C GLY A 1 14.824 89.586 39.597 1.00 0.00 C ATOM 7 O GLY A 1 14.138 89.018 40.440 1.00 0.00 O ATOM 8 N TES A 2 14.454 90.706 38.990 1.00 0.00 N ATOM 9 H TES A 2 15.096 91.143 38.344 1.00 0.00 H ATOM 10 CA TES A 2 13.180 91.367 39.252 1.00 0.00 C ATOM 11 HA TES A 2 13.061 91.524 40.324 1.00 0.00 H ATOM 12 CB TES A 2 13.160 92.738 38.548 1.00 0.00 C ATOM 13 HB1 TES A 2 13.269 92.596 37.473 1.00 0.00 H ATOM 14 HB2 TES A 2 12.214 93.239 38.754 1.00 0.00 H ATOM 15 HB3 TES A 2 13.983 93.349 38.919 1.00 0.00 H ATOM 16 C TES A 2 12.002 90.500 38.785 1.00 0.00 C ATOM 17 O TES A 2 12.186 89.530 38.069 1.00 0.00 O ATOM 18 N GLY A 3 10.806 90.823 39.256 1.00 0.00 N ATOM 19 H GLY A 3 10.699 91.591 39.903 1.00 0.00 H ATOM 20 CA GLY A 3 9.618 90.086 38.859 1.00 0.00 C ATOM 21 HA2 GLY A 3 9.709 89.045 39.170 1.00 0.00 H ATOM 22 HA3 GLY A 3 8.737 90.528 39.325 1.00 0.00 H ATOM 23 C GLY A 3 9.458 90.138 37.351 1.00 0.00 C ATOM 24 O GLY A 3 9.767 91.152 36.714 1.00 0.00 O ATOM 25 N GLU A 4 9.011 89.022 36.777 1.00 0.00 N ATOM 26 H GLU A 4 8.933 88.195 37.351 1.00 0.00 H ATOM 27 CA GLU A 4 8.800 88.888 35.337 1.00 0.00 C ATOM 28 HA GLU A 4 8.427 87.889 35.110 1.00 0.00 H ATOM 29 CB GLU A 4 7.782 89.910 34.849 1.00 0.00 C ATOM 30 HB2 GLU A 4 8.175 90.910 35.034 1.00 0.00 H ATOM 31 HB3 GLU A 4 7.634 89.770 33.778 1.00 0.00 H ATOM 32 CG GLU A 4 6.447 89.747 35.573 1.00 0.00 C ATOM 33 HG2 GLU A 4 6.108 88.729 35.382 1.00 0.00 H ATOM 34 HG3 GLU A 4 6.622 89.877 36.641 1.00 0.00 H ATOM 35 CD GLU A 4 5.388 90.726 35.112 1.00 0.00 C ATOM 36 OE1 GLU A 4 5.496 91.926 35.460 1.00 0.00 O ATOM 37 OE2 GLU A 4 4.438 90.287 34.414 1.00 0.00 O ATOM 38 C GLU A 4 10.048 88.888 34.470 1.00 0.00 C ATOM 39 O GLU A 4 9.954 88.911 33.256 1.00 0.00 O ATOM 40 N SER A 5 11.217 88.779 35.087 1.00 0.00 N ATOM 41 H SER A 5 11.273 88.828 36.094 1.00 0.00 H ATOM 42 CA SER A 5 12.463 88.755 34.325 1.00 0.00 C ATOM 43 HA SER A 5 12.402 89.476 33.510 1.00 0.00 H ATOM 44 CB SER A 5 13.669 89.114 35.211 1.00 0.00 C ATOM 45 HB2 SER A 5 14.563 89.086 34.588 1.00 0.00 H ATOM 46 HB3 SER A 5 13.520 90.126 35.587 1.00 0.00 H ATOM 47 OG SER A 5 13.825 88.226 36.298 1.00 0.00 O ATOM 48 HG SER A 5 14.587 88.489 36.820 1.00 0.00 H ATOM 49 C SER A 5 12.700 87.449 33.545 1.00 0.00 C ATOM 50 O SER A 5 13.314 87.463 32.469 1.00 0.00 O ATOM 51 N GLY A 5I 12.210 86.338 34.087 1.00 0.00 N ATOM 52 H GLY A 5I 11.719 86.378 34.969 1.00 0.00 H ATOM 53 CA GLY A 5I 12.360 85.044 33.440 1.00 0.00 C ATOM 54 HA2 GLY A 5I 11.379 84.765 33.055 1.00 0.00 H ATOM 55 HA3 GLY A 5I 13.051 85.182 32.608 1.00 0.00 H ATOM 56 C GLY A 5I 12.879 83.922 34.335 1.00 0.00 C ATOM 57 O GLY A 5I 13.210 82.847 33.824 1.00 0.00 O TER ATOM 58 N SER B 1 3.347 80.074 30.363 1.00 0.00 N ATOM 59 H SER B 1 3.644 79.127 30.177 1.00 0.00 H ATOM 60 CA SER B 1 2.423 80.307 31.476 1.00 0.00 C ATOM 61 HA SER B 1 1.632 80.987 31.159 1.00 0.00 H ATOM 62 CB SER B 1 1.780 78.988 31.941 1.00 0.00 C ATOM 63 HB2 SER B 1 0.927 79.234 32.573 1.00 0.00 H ATOM 64 HB3 SER B 1 1.434 78.452 31.057 1.00 0.00 H ATOM 65 OG SER B 1 2.691 78.165 32.670 1.00 0.00 O ATOM 66 HG SER B 1 2.248 77.357 32.938 1.00 0.00 H ATOM 67 C SER B 1 3.060 81.006 32.684 1.00 0.00 C ATOM 68 O SER B 1 4.276 81.085 32.807 1.00 0.00 O ATOM 69 N ARG B 2 2.215 81.494 33.583 1.00 0.00 N ATOM 70 H ARG B 2 1.220 81.443 33.416 1.00 0.00 H ATOM 71 HA ARG B 2 3.667 81.786 35.055 1.00 0.00 H ATOM 72 CB ARG B 2 2.761 83.671 34.576 1.00 0.00 C ATOM 73 HB2 ARG B 2 3.353 83.835 33.676 1.00 0.00 H ATOM 74 HB3 ARG B 2 1.744 84.028 34.411 1.00 0.00 H ATOM 75 CG ARG B 2 3.391 84.442 35.753 1.00 0.00 C ATOM 76 HG2 ARG B 2 2.694 84.426 36.591 1.00 0.00 H ATOM 77 HG3 ARG B 2 4.316 83.942 36.040 1.00 0.00 H ATOM 78 CD ARG B 2 3.697 85.908 35.366 1.00 0.00 C ATOM 79 HD2 ARG B 2 4.359 85.878 34.500 1.00 0.00 H ATOM 80 HD3 ARG B 2 2.750 86.367 35.083 1.00 0.00 H ATOM 81 NE ARG B 2 4.329 86.735 36.417 1.00 0.00 N ATOM 82 HE ARG B 2 3.807 87.549 36.709 1.00 0.00 H ATOM 83 CZ ARG B 2 5.485 86.470 37.023 1.00 0.00 C ATOM 84 NH1 ARG B 2 6.159 85.389 36.705 1.00 0.00 N ATOM 85 HH11 ARG B 2 5.798 84.761 36.001 1.00 0.00 H ATOM 86 HH12 ARG B 2 7.035 85.190 37.166 1.00 0.00 H ATOM 87 NH2 ARG B 2 6.006 87.302 37.921 1.00 0.00 N ATOM 88 HH21 ARG B 2 5.521 88.156 38.155 1.00 0.00 H ATOM 89 HH22 ARG B 2 6.884 87.075 38.365 1.00 0.00 H ATOM 90 C ARG B 2 1.721 81.801 35.924 1.00 0.00 C ATOM 91 O ARG B 2 0.502 81.932 35.813 1.00 0.00 O ATOM 92 N TES B 3 2.277 81.237 36.980 1.00 0.00 N ATOM 93 H TES B 3 3.264 81.024 36.997 1.00 0.00 H ATOM 94 CA TES B 3 1.476 80.868 38.127 1.00 0.00 C ATOM 95 HA TES B 3 0.487 81.323 38.066 1.00 0.00 H ATOM 96 CB TES B 3 1.307 79.333 38.262 1.00 0.00 C ATOM 97 HB TES B 3 0.758 78.962 37.397 1.00 0.00 H ATOM 98 CG1 TES B 3 2.649 78.651 38.335 1.00 0.00 C ATOM 99 HG11 TES B 3 3.199 79.021 39.201 1.00 0.00 H ATOM 100 HG12 TES B 3 2.505 77.575 38.429 1.00 0.00 H ATOM 101 HG13 TES B 3 3.215 78.863 37.428 1.00 0.00 H ATOM 102 CG2 TES B 3 0.483 78.998 39.497 1.00 0.00 C ATOM 103 HG21 TES B 3 -0.502 79.458 39.413 1.00 0.00 H ATOM 104 HG22 TES B 3 0.373 77.917 39.579 1.00 0.00 H ATOM 105 HG23 TES B 3 0.987 79.379 40.385 1.00 0.00 H ATOM 106 C TES B 3 2.134 81.432 39.368 1.00 0.00 C ATOM 107 O TES B 3 3.351 81.598 39.421 1.00 0.00 O ATOM 108 N LYS B 4 1.308 81.763 40.345 1.00 0.00 N ATOM 109 H LYS B 4 0.311 81.683 40.205 1.00 0.00 H ATOM 110 CA LYS B 4 1.782 82.317 41.594 1.00 0.00 C ATOM 111 HA LYS B 4 2.696 82.888 41.429 1.00 0.00 H ATOM 112 CB LYS B 4 0.717 83.254 42.183 1.00 0.00 C ATOM 113 HB2 LYS B 4 -0.220 82.699 42.226 1.00 0.00 H ATOM 114 HB3 LYS B 4 1.032 83.513 43.194 1.00 0.00 H ATOM 115 CG LYS B 4 0.511 84.557 41.353 1.00 0.00 C ATOM 116 HG2 LYS B 4 -0.169 85.197 41.916 1.00 0.00 H ATOM 117 HG3 LYS B 4 1.482 85.045 41.268 1.00 0.00 H ATOM 118 CD LYS B 4 -0.068 84.308 39.935 1.00 0.00 C ATOM 119 HD2 LYS B 4 0.367 83.379 39.566 1.00 0.00 H ATOM 120 HD3 LYS B 4 -1.146 84.186 40.042 1.00 0.00 H ATOM 121 CE LYS B 4 0.225 85.450 38.931 1.00 0.00 C ATOM 122 HE2 LYS B 4 -0.218 86.364 39.327 1.00 0.00 H ATOM 123 HE3 LYS B 4 1.307 85.569 38.867 1.00 0.00 H ATOM 124 NZ LYS B 4 -0.332 85.177 37.557 1.00 0.00 N ATOM 125 HZ1 LYS B 4 -1.334 85.067 37.616 1.00 0.00 H ATOM 126 HZ2 LYS B 4 -0.113 85.950 36.945 1.00 0.00 H ATOM 127 HZ3 LYS B 4 0.078 84.330 37.190 1.00 0.00 H ATOM 128 C LYS B 4 2.147 81.178 42.544 1.00 0.00 C ATOM 129 O ALYS B 4 1.284 80.471 43.043 1.00 0.00 O ATOM 130 O BLYS B 4 1.284 80.471 43.043 1.00 0.00 O TER HETATM 131 O1B GDP A 7 8.875 86.447 37.778 1.00 0.00 O HETATM 132 PB GDP A 7 9.784 85.563 37.007 1.00 0.00 P HETATM 133 O2B GDP A 7 9.897 84.148 37.414 1.00 0.00 O HETATM 134 O3B GDP A 7 11.201 86.125 36.990 1.00 0.00 O HETATM 135 O3A GDP A 7 9.360 85.532 35.497 1.00 0.00 O HETATM 136 PA GDP A 7 8.710 84.388 34.580 1.00 0.00 P HETATM 137 O1A GDP A 7 7.423 83.996 35.135 1.00 0.00 O HETATM 138 O2A GDP A 7 9.740 83.380 34.358 1.00 0.00 O HETATM 139 O5* GDP A 7 8.528 85.213 33.238 1.00 0.00 O HETATM 140 C5* GDP A 7 7.532 86.212 33.034 1.00 0.00 C HETATM 141 H50 GDP A 7 7.861 87.119 33.469 1.00 0.00 H HETATM 142 H51 GDP A 7 6.616 85.919 33.477 1.00 0.00 H HETATM 143 C4* GDP A 7 6.730 85.907 31.739 1.00 0.00 C HETATM 144 H40 GDP A 7 5.939 86.652 31.657 1.00 0.00 H HETATM 145 O4* GDP A 7 7.571 86.158 30.624 1.00 0.00 O HETATM 146 C1* GDP A 7 7.617 85.023 29.734 1.00 0.00 C HETATM 147 H10 GDP A 7 7.037 85.139 28.819 1.00 0.00 H HETATM 148 N9 GDP A 7 9.008 84.960 29.259 1.00 0.00 N HETATM 149 C8 GDP A 7 10.142 84.689 29.984 1.00 0.00 C HETATM 150 H80 GDP A 7 10.044 84.440 31.030 1.00 0.00 H HETATM 151 N7 GDP A 7 11.252 84.763 29.319 1.00 0.00 N HETATM 152 C5 GDP A 7 10.826 85.121 28.035 1.00 0.00 C HETATM 153 C6 GDP A 7 11.584 85.355 26.856 1.00 0.00 C HETATM 154 O6 GDP A 7 12.802 85.280 26.720 1.00 0.00 O HETATM 155 N1 GDP A 7 10.785 85.705 25.782 1.00 0.00 N HETATM 156 H1N GDP A 7 11.237 85.903 24.912 1.00 0.00 H HETATM 157 C2 GDP A 7 9.418 85.808 25.821 1.00 0.00 C HETATM 158 N2 GDP A 7 8.800 86.145 24.706 1.00 0.00 N HETATM 159 H21 GDP A 7 9.226 86.351 23.813 1.00 0.00 H HETATM 160 H22 GDP A 7 7.794 86.225 24.754 1.00 0.00 H HETATM 161 N3 GDP A 7 8.689 85.595 26.916 1.00 0.00 N HETATM 162 C4 GDP A 7 9.460 85.249 27.988 1.00 0.00 C HETATM 163 C3* GDP A 7 6.222 84.464 31.525 1.00 0.00 C HETATM 164 H30 GDP A 7 5.697 83.680 32.071 1.00 0.00 H HETATM 165 C2* GDP A 7 7.196 83.836 30.552 1.00 0.00 C HETATM 166 H20 GDP A 7 8.029 83.460 31.146 1.00 0.00 H HETATM 167 O2* GDP A 7 6.667 82.782 29.758 1.00 0.00 O HETATM 168 H2* GDP A 7 7.378 82.474 29.191 1.00 0.00 H HETATM 169 O3* GDP A 7 4.933 84.502 30.955 1.00 0.00 O HETATM 170 H3* GDP A 7 4.539 83.643 30.787 1.00 0.00 H HETATM 171 CA CA A 8 8.662 83.157 38.911 1.00 0.00 CA HETATM 172 O HOH B 5 10.341 83.033 40.331 1.00 14.52 O HETATM 173 O HOH B 6 6.852 83.372 37.663 1.00 10.61 O HETATM 174 O HOH B 7 7.480 82.206 40.427 1.00 12.26 O HETATM 175 O HOH B 8 8.135 85.033 39.786 1.00 15.76 O HETATM 176 O HOH B 9 13.941 92.866 34.673 1.00 2.00 O END bio3d/inst/examples/hivp_xray.fa0000644000176200001440000013476014046015221016374 0ustar liggesusers>d1hhp__ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1nh0a_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1nh0b_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1s65a_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPANIIGRNLLTQIGATLNF >d1s65b_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPANIIGRNLLTQIGATLNF >d1kzka_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1kzkb_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1sdua_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLMTQIGATLNF >d1sdub_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLMTQIGATLNF >d1s6ga_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1s6gb_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1k1ta_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPIMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPSNIIGRNLLTQIGATLNF >d1k1tb_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPIMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPSNIIGRNLLTQIGATLNF >d1sdta_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1sdtb_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1sdva_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPANIIGRNLLTQIGATLNF >d1sdvb_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPANIIGRNLLTQIGATLNF >d1s6sa_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNVIGRNLLTQIGATLNF >d1s6sb_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNVIGRNLLTQIGATLNF >d1k1ua_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPIMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLMTQIGATLNF >d1k1ub_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPIMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLMTQIGATLNF >d1dazc_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPIMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1dazd_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPIMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1difa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1difb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1d4la_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVIEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1d4lb_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVIEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1mtra_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVIEEMNLPGKWKPKMIGGIIGGGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1mtrb_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVIEEMNLPGKWKPKMIGGIIGGGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1ffic_ PQITLWKRPLVTIKIGGQLKEALLDTGADNTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1ffid_ PQITLWKRPLVTIKIGGQLKEALLDTGADNTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1k2ba_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRDLMTQIGATLNF >d1k2bb_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRDLMTQIGATLNF >d1ec0a_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1ec0b_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1b6la_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVIEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1b6lb_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVIEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1d4ia_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1d4ib_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1d4ha_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1d4hb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1b6ja_ PQITLWQRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1b6jb_ PQITLWQRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1g35a_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1g35b_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1ebwa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1ebwb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1b6oa_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVIEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1b6ob_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVIEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1d4ja_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1d4jb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1proa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1prob_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1fejc_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLMTQIGATLNF >d1fejd_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLMTQIGATLNF >d1hvia_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hvib_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1izha_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1izhb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1b6na_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVIEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1b6nb_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVIEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1hvka_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hvkb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hxwa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hxwb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1ff0c_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPIMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1ff0d_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPIMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1fg6c_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRDLLTQIGATLNF >d1fg6d_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRDLLTQIGATLNF >d1mt9a_ PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLE-MNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPANI-GRNLLTQIGCTLNF >d1mt9b_ PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLE-MNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPANIIGRNLLTQIGCTLNF >d2aida_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d2aidb_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1mt7a_ PQITLWKRPLVTI-IGGQLKEAL-NTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPANIIGRNLLTQIGCTLNF >d1mt7b_ PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPANI-GRNLLTQIGCTLNF >d1b6ka_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVIEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1b6kb_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVIEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1hvja_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hvjb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hpxa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hpxb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hvla_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hvlb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1bwba_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPFNVIGRNLLTQIGCTLNF >d1bwbb_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPFNVIGRNLLTQIGCTLNF >d1ec3a_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1ec3b_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1npaa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1npab_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d2bpva_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d2bpvb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1b6ma_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVIEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1b6mb_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVIEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1fffc_ PQITLWKRPLVTIKIGGQLKEALLDTGADNTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1fffd_ PQITLWKRPLVTIKIGGQLKEALLDTGADNTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1ebza_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1ebzb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1ajxa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1ajxb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1qbsa_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1qbsb_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1g2ka_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1g2kb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1kjha_ PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLE-MNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1kjhb_ PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YD-IPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1mesa_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNVIGRNLLTQIGCTLNF >d1mesb_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNVIGRNLLTQIGCTLNF >d1dw6c_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLMTQIGATLNF >d1dw6d_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLMTQIGATLNF >d1d4ka_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVIEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1d4kb_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVIEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1kjga_ PQITLWKRPLVTIRIGGQLK-ALLNTGADDTVLE-MNLPGKWKPKMIG----GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1kjgb_ PQITLWKRPLVTI-IGGQLK-ALLNTGADDTVLEEMNLPGKWKPKMIG----GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1ajva_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1ajvb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1qbra_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1qbrb_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1mera_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNVIGRNLLTQIGCTLNF >d1merb_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNVIGRNLLTQIGCTLNF >d1fg8c_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRDLLTQIGATLNF >d1fg8d_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRDLLTQIGATLNF >d1hvra_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1hvrb_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1hiva_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hivb_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d2bpya_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d2bpyb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1d4ya_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1d4yb_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1cpia_ PQITLWQRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1cpib_ PQITLWQRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1hiha_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hihb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1a30a_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1a30b_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hsga_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hsgb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1odxa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKTIGTVLVGPTPANIIGRNLLTQIGCTLNF >d1odxb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKTIGTVLVGPTPANIIGRNLLTQIGCTLNF >d1f7aa_ PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLEEMNLPGKWKPKMIG----GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1f7ab_ PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLEEMNLPGKWKPKMIG----GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1g6la1 PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGMTLNF >d1g6la2 PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hpva_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hpvb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1npwa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1npwb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1b6pa_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVIEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1b6pb_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVIEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1qbua_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1qbub_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1fgcc_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1fgcd_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1kjfa_ PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLE--MLPGKWKPKMIG----GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1kjfb_ PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLEEMNLPGKWKPKMIG----GGFIKVRQ YD-IPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1kj7a_ PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLEEMNLPGKWKPKMIG----GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1kj7b_ PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLEEMNLPGKWKPKMIG----GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1meua_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPFNVIGRNLLTQIGCTLNF >d1meub_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPFNVIGRNLLTQIGCTLNF >d1hvha_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1hvhb_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1ec2a_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1ec2b_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hwra_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1hwrb_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1hsha_ PQFSLWKRPVVTAYIEGQPVEVLLDTGADDSIVAGIELGNNYSPKIVGGI--GGFINTKE YKNVEIEVLNKKVRATIMTGDTPINIFGRNILTALGMSLNL >d1hshb_ PQFSLWKRPVVTAYIEGQPVEVLLDTGADDSIVAGIELGNNYSPKIVGGI--GGFINTKE YKNVEIEVLNKKVRATIMTGDTPINIFGRNILTALGMSLNL >d1hshc_ PQFSLWKRPVVTAYIEGQPVEVLLDTGADDSIVAGIELGNNYSPKIVGGI--GGFINTKE YKNVEIEVLNKKVRATIMTGDTPINIFGRNILTALGMSLNL >d1hshd_ PQFSLWKRPVVTAYIEGQPVEVLLDTGADDSIVAGIELGNNYSPKIVGGI--GGFINTKE YKNVEIEVLNKKVRATIMTGDTPINIFGRNILTALGMSLNL >d1odya_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGAWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1odyb_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGAWKPKAIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1mrwa_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1mrwb_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1msma_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1msmb_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1mrxa_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEICGHKAIGTVLVGPTPFNVIGRNLLTQIGCTLNF >d1mrxb_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEICGHKAIGTVLVGPTPFNVIGRNLLTQIGCTLNF >d1bwaa_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPFNVIGRNLLTQIGCTLNF >d1bwab_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPFNVIGRNLLTQIGCTLNF >d1htga_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1htgb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1npva_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1npvb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1msna_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEICGHKAIGTVLVGPTPFNVIGRNLLTQIGCTLNF >d1msnb_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEICGHKAIGTVLVGPTPFNVIGRNLLTQIGCTLNF >d1ohra_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1ohrb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1aida_ PQITLWQRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1aidb_ PQITLWQRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1lv1a1 PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGMTLNF >d1lv1a2 PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1ec1a_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1ec1b_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1meta_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPFNIIGRNLLTQIGCTLNF >d1metb_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPFNIIGRNLLTQIGCTLNF >d1a94a_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWEPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1a94b_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWEPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1a94d_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWEPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1a94e_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWEPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1odwa_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1odwb_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hvsa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPANIIGRNLLTQIGCTLNF >d1hvsb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPANIIGRNLLTQIGCTLNF >d1ebkc_ -QITLWKQPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1ebkd_ PQITLWKQPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1ebke_ PQITLWKQPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1ebkf_ PQITLWKQPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d3tlha_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d4phva_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d4phvb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hvc__ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1ebya_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1ebyb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1a8ka_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1a8kb_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1a8kd_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1a8ke_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1mt8a_ PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLEEMNLPGKWKPKMIG----GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPANIIGRNLLTQIGCTLNF >d1mt8b_ PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLE-MNLPGKWKPKMIG----GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPANIIGRNLLTQIGCTLNF >d1bv9a_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNVIGRNLLTQIGCTLNF >d1bv9b_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNVIGRNLLTQIGCTLNF >d1qbta_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1qbtb_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1hxba_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hxbb_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1izia_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKVIGTVLVGPTPTNVIGRNLLTQIGCTLNF >d1izib_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKVIGTVLVGPTPTNVIGRNLLTQIGCTLNF >d1iiqa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1iiqb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1axaa_ PQITLWQRPLVTIKIGGQLKEALLDTGSDDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1axab_ PQITLWQRPLVTIKIGGQLKEALLDTGSDDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1dmpa_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1dmpb_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1bv7a_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPFNIIGRNLLTQIGCTLNF >d1bv7b_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPFNIIGRNLLTQIGCTLNF >d1lzqa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKVIGTVLVGPTPTNVIGRNLLTQIGCTLNF >d1lzqb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKVIGTVLVGPTPTNVIGRNLLTQIGCTLNF >d1m0ba_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1m0bb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hefe_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEENSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hosa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hosb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1a9ma_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIHGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1a9mb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIHGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1sbga_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1sbgb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d4hvpa_ PQITLWQRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d4hvpb_ PQITLWQRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d2bpza_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d2bpzb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hbva_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hbvb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1c70a_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1c70b_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d7hvpa_ PQITLWQRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d7hvpb_ PQITLWQRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1hpoa_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hpob_ PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hege_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEENSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1mtba_ PQITLWQRPLVTIRIGGQLKEALLNTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1mtbb_ PQITLWQRPLVTIRIGGQLKEALLNTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1htfa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1htfb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1gnoa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1gnob_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1a8ga_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1a8gb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1c6za_ PQITLWQRPVVTIKIGGQLMEALIDTGADDTVLEEMDLPGRWKPKIIGGI--GGFVKVRQ YDQIPIEICGHKVIGTVLVGPTPTNIIGRNLLTQIGCTLNF >d1c6zb_ PQITLWQRPVVTIKIGGQLMEALIDTGADDTVLEEMDLPGRWKPKIIGGI--GGFVKVRQ YDQIPIEICGHKVIGTVLVGPTPTNIIGRNLLTQIGCTLNF >d1upj__ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1c6ya_ PQITLWQRPVVTIKIGGQLMEALIDTGADDTVLEEMDLPGRWKPKIIGGI--GGFVKVRQ YDQIPIEICGHKVIGTVLVGPTPTNIIGRNLLTQIGCTLNF >d1c6yb_ PQITLWQRPVVTIKIGGQLMEALIDTGADDTVLEEMDLPGRWKPKIIGGI--GGFVKVRQ YDQIPIEICGHKVIGTVLVGPTPTNIIGRNLLTQIGCTLNF >d8hvpa_ PQITLWQRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d8hvpb_ PQITLWQRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1n49a_ PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPANIIGRNLLTQIGCTLNF >d1n49b_ PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPANIIGRNLLTQIGCTLNF >d1n49c_ PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPANIIGRNLLTQIGCTLNF >d1n49d_ PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPANIIGRNLLTQIGCTLNF >d1hpsa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hpsb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1gnma_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPDNIIGRNLLTQIGCTLNF >d1gnmb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPDNIIGRNLLTQIGCTLNF >d5hvpa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d5hvpb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1aaqa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1aaqb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d2bpwa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d2bpwb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1gnna_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPNNIIGRNLLTQIGCTLNF >d1gnnb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPNNIIGRNLLTQIGCTLNF >d1bdqa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDSIVAGIELPGRWKPKMVGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPINIIGRNLLTQIGCTLNF >d1bdqb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDSIVAGIELPGRWKPKMVGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPINIIGRNLLTQIGCTLNF >d1vika_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1vikb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d3aida_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d3aidb_ PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1fb7a_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIVGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLMTQIGCTLNF >d2bpxa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d2bpxb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1c6xa_ PQITLWQRPVVTIKIGGQLMEALIDTGADDTVLEEMDLPGRWKPKIIGGI--GGFVKVRQ YDQIPIEICGHKVIGTVLVGPTPTNIIGRNLLTQIGCTLNF >d1c6xb_ PQITLWQRPVVTIKIGGQLMEALIDTGADDTVLEEMDLPGRWKPKIIGGI--GGFVKVRQ YDQIPIEICGHKVIGTVLVGPTPTNIIGRNLLTQIGCTLNF >d1d4sa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPFNVIGRNLLTQIGCTLNF >d1d4sb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPFNVIGRNLLTQIGCTLNF >d2upja_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d2upjb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1htea_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1hteb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1vija_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1vijb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1bdra_ PQITLWQRPLVTIKIGGQLKEALLDTGADDSVVAGIELPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1bdrb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDSVVAGIELPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1bdla_ PQITLWQRPLVTIKIGGQLKEALLDTGADDSIVAGIELPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1bdlb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDSIVAGIELPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1k2ca_ PQITLWKRPLVTIKIGGQLKEALLDTGADNTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPSNIIGRNLLTQIGATLNF >d1k2cb_ PQITLWKRPLVTIKIGGQLKEALLDTGADNTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPSNIIGRNLLTQIGATLNF >d1kj4a_ PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1kj4b_ PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1kj4c_ PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1kj4d_ PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1fqxa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1fqxb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d3hvp__ PQITLWQRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1muia_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1muib_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d3phv__ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d9hvpa_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d9hvpb_ PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1bvga_ -QVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1bvgb_ -QVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1bvea_ -QVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d1bveb_ PQVTLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d2hvp__ ------QRPLVTIKIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1k6c_a PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQIPIEICGHKAIGTVLVGPTPTNVIGRNLLTQIGCTLNF >d1k6c_b PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQIPIEICGHKAIGTVLVGPTPTNVIGRNLLTQIGCTLNF >d1k6p_a PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQIPIEICGHKAIGTVLVGPTPTNVIGRNLLTQIGCTLNF >d1k6p_b PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQIPIEICGHKAIGTVLVGPTPTNVIGRNLLTQIGCTLNF >d1k6t_a PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQIPIEICGHKAIGTVLVGPTPTNVIGRNLLTQIGCTLNF >d1k6t_b PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQIPIEICGHKAIGTVLVGPTPTNVIGRNLLTQIGCTLNF >d1k6v_a PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQIPIEICGHKAIGTVLVGPTPTNVIGRNLLTQIGCTLNF >d1k6v_b PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQIPIEICGHKAIGTVLVGPTPTNVIGRNLLTQIGCTLNF >d1rl8_a PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGAWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPANIIGRNLLTQIGCTLNF >d1rl8_b PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGAWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPANIIGRNLLTQIGCTLNF >d1rpi_a PQITLWQRPIVTIKIGGQLKEALLNTGADDTVLEEVNLPGRWKPKLIGGI--GGFVKVRQ YDQVPIEICGHKVIGTVLVGPTPANVIGRNLMTQIGCTLNF >d1rpi_b PQITLWQRPIVTIKIGGQLKEALLNTGADDTVLEEVNLPGRWKPKLIGGI--GGFVKVRQ YDQVPIEICGHKVIGTVLVGPTPANVIGRNLMTQIGCTLNF >d1rq9_a PQITLWQRPIVTIKIGGQLKEALLNTGADDTVLEEVNLPGRWKPKLIGGI--GGFVKVRQ YDQVPIEICGHKVIGTVLVGPTPANVIGRNLMTQIGCTLNF >d1rq9_b PQITLWQRPIVTIKIGGQLKEALLNTGADDTVLEEVNLPGRWKPKLIGGI--GGFVKVRQ YDQVPIEICGHKVIGTVLVGPTPANVIGRNLMTQIGCTLNF >d1sgu_a PQITLWQRPLVTIKIGGQLREALLDTGADDTIFEEISLPGRWKPKMIGGI--GGFVKVRQ YDQIPIEICGHKVIGTVLVGPTPANVIGRNLMTQIGCTLNF >d1sgu_b PQITLWQRPLVTIKIGGQLREALLDTGADDTIFEEISLPGRWKPKMIGGI--GGFVKVRQ YDQIPIEICGHKVIGTVLVGPTPANVIGRNLMTQIGCTLNF >d1sh9_a PQITLWQRPLVTIKIGGQLREALLDTGADDTIFEEISLPGRWKPKMIGGI--GGFVKVRQ YDQIPIEICGHKVIGTVLVGPTPANVIGRNLMTQIGCTLNF >d1sh9_b PQITLWQRPLVTIKIGGQLREALLDTGADDTIFEEISLPGRWKPKMIGGI--GGFVKVRQ YDQIPIEICGHKVIGTVLVGPTPANVIGRNLMTQIGCTLNF >d1sp5_a PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1sp5_b PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1t3r_a PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1t3r_b PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1t7i_a PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQIPIEICGHKAIGTVLVGPTPTNVIGRNLLTQIGCTLNF >d1t7i_b PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQIPIEICGHKAIGTVLVGPTPTNVIGRNLLTQIGCTLNF >d1t7j_a PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQIPIEICGHKAIGTVLVGPTPTNVIGRNLLTQIGCTLNF >d1t7j_b PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGRWKPKMIGGI--GGFIKVRQ YDQIPIEICGHKAIGTVLVGPTPTNVIGRNLLTQIGCTLNF >d1t7k_a PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1t7k_b PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1tcx_a PQITLWQRPLVTIKIGGQLKEALLDTGADDTILEEMSLPGRWKPKMVGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPINIIGRNLLTQIGCTLNF >d1tcx_b PQITLWQRPLVTIKIGGQLKEALLDTGADDTILEEMSLPGRWKPKMVGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPINIIGRNLLTQIGCTLNF >d1tsq_a PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPANIIGRNLLTQIGCTLNF >d1tsq_b PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPANIIGRNLLTQIGCTLNF >d1tsu_a PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1tsu_b PQITLWKRPLVTIRIGGQLKEALLNTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1tw7_a PQITLWQRPIVTIKIGGQLKEALLNTGADDTVLEEVNLPGRWKPKLIGGI--GGFVKVRQ YDQVPIEICGHKVIGTVLVGPTPANVIGRNLMTQIGCTLNF >d1tw7_b PQITLWQRPIVTIKIGGQLKEALLNTGADDTVLEEVNLPGRWKPKLIGGI--GGFVKVRQ YDQVPIEICGHKVIGTVLVGPTPANVIGRNLMTQIGCTLNF >d1u8g_a PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1u8g_b PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1w5v_a PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1w5v_b PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1w5w_a PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1w5w_b PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1w5x_a PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1w5x_b PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1w5y_a PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1w5y_b PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1wbk_a PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1wbk_b PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1wbm_a PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1wbm_b PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1xl2_a PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1xl2_b PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1xl5_a PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1xl5_b PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1ytg_a PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1ytg_b PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1yth_a PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1yth_b PQITLWKRPLVTIRIGGQLKEALLDTGADDTVLEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1z1h_a PQITLWKRPLVTIRIGGQLKEALLDTGADDTVIEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1z1h_b PQITLWKRPLVTIRIGGQLKEALLDTGADDTVIEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1z1r_a PQITLWKRPLVTIRIGGQLKEALLDTGADDTVIEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1z1r_b PQITLWKRPLVTIRIGGQLKEALLDTGADDTVIEEMNLPGKWKPKMIGGI--GGFIKVRQ YDQIPVEIXGHKAIGTVLVGPTPVNIIGRNLLTQIGXTLNF >d1zp8_a PQITLWKRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1zpa_a PQITLWKRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1ztz_a PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d1ztz_b PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d2a4f_a PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d2a4f_b PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d2aoc_a PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNVIGRNLLTQIGATLNF >d2aoc_b PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNVIGRNLLTQIGATLNF >d2aod_a PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d2aod_b PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d2aoe_a PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPANIIGRNLLTQIGATLNF >d2aoe_b PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPANIIGRNLLTQIGATLNF >d2aof_a PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPANIIGRNLLTQIGATLNF >d2aof_b PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPANIIGRNLLTQIGATLNF >d2aog_a PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPANIIGRNLLTQIGATLNF >d2aog_b PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPANIIGRNLLTQIGATLNF >d2aoh_a PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPANIIGRNLLTQIGATLNF >d2aoh_b PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPANIIGRNLLTQIGATLNF >d2aoi_a PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d2aoi_b PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d2aoj_a PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d2aoj_b PQITLWKRPLVTIKIGGQLKEALLDTGADDTVIEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQIIIEIAGHKAIGTVLVGPTPVNIIGRNLLTQIGATLNF >d2bb9_a PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d2bb9_b PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d2bbb_a PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d2bbb_b PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d2bqv_a PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d2bqv_b PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d2sam_a PQFHLWKRPVVTAHIEGQPVEVLLDTGADDSIVTGIELGPHYTPKIVGGI--GGFINTKE YKNVEIEVLGKRIKGTIMTGDTPINIFGRNLLTALGMSLNF >d7upj_a PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF >d7upj_b PQITLWQRPLVTIKIGGQLKEALLDTGADDTVLEEMSLPGRWKPKMIGGI--GGFIKVRQ YDQILIEICGHKAIGTVLVGPTPVNIIGRNLLTQIGCTLNF bio3d/inst/examples/hivp.dcd0000644000176200001440000106161414046015221015473 0ustar liggesusersTCORDuu?TCreated by DCD pluginREMARKS Created 14 September, 2016 at 11:45005^OBNNBm@B:Bd0B-&BPBB*B#B7+B)BjB}?MBPBF_BfaBoVB\KBV>B0B%BBhBBB|BJ B% B*B\3B5B2B6B,B^*B#Bd1B,;B-6B:BRHBbIBsJBJB'LBpWB#[\B"oBAnB^gB!hB]BfB= bBTBoWBxVB#[ZBZBOBOB@BC=BNKBIByRB^:MBPByiFB'DB#[DBѢ8BL4B`(BD #B}?B9Bf$B}!BL7*B*Bm#BTc*B!0%B$BBBHaBshB~A)\AVAB`AffAJB BK BB AAlAwARB`B(BkBBB{'B6Bd>B}?MBPBF_BfaBoVB\KBV>B0B%BBhBBB|BJ B% B*B\3B5B2B6B,B^*B#Bd1B,;B-6B:BRHBbIBsJBJB'LBpWB#[\B5^OBNNBm@B:Bd0B-&BPBB*B#B7+B)BjB;B(4BZd,B^:'BshBBBXB#BZ!B-BB0B9BBbLB'QB_BqbBWBuWBrNBDOBzKBMBWBY`BcB$cBeB%eBq[BzMB'1EBw8BJ*B!0B!BGBŠ!B`e)B/6BNBBkHBKVB= _BB`]B)[BhBZmBkbBfBMZB_BQBwTBNBTc`BHafBRbBjBTcdB oBulB33]BP]BVXBYBq=UBHBsFB17B3BqCBEBPBףMBESBGB%GBݤDBBŠEB)\TBOBŠEBP9B/BK BhB BX9BB"BwB{B!B?50B@9B6Bs2B 0B'BR#B\B5'B.B*B-B:Bsh:Bv?BR>BJDBNBSB/BuByxBG}B pB!wBjqBŠbBݤcBZ_BbBffdBbYBXBZdKB\KBNbYB QBz[B\RB'1VBOBvSBUBX9MBLLB?By6BN-B+B5^4B3.BV0B-B!B%BBV"B1BB%BBHAABq=BshB BB{B/ BX9A ByBA| Bd; BB7BBT)B3ByBB{KBZB`eaB)\oBmBfBdYB}PB`eABR4B;(B(BbB`eBX9B%BC%B/BB`:B=BNABHBJABLBBD;BDFBPBjFBNb=Br@B/]LBFB}OB#[IB)OB=IBNJB= CB%CB!6B/]BEBjFB{BB/CBw6B;BB-B/BP $BX9#B94B B-BJBVB;_!By*BL3B BB LB/][BZeBݤ[BP dBZBjbBףaB%dBznB uBsB pBF6pBeBݤYBLBj?B/4B &BsB!BBB`*Bd;7BB`DByiSBXTB`B dBbfBlByBIB/xB]BwBLzB'rBx|BwBFʭ㥋9>B`>$= /9x9J q=\&wff^J X9!X9&jb%"V?ɿrB` u"^{`{ˡhL7+ґ~n= +-}|7ѿ-=??ҿffA*#_1\;߈)\ș"nh}ˡ-jp)\d;[v^I'14VD5G w&ˡ1l&B`- d;bE5^?G@ @xA"@$@ƛ?P>ԼjD@p@&@AAxCAjtAffA̢ARAAAq=A9ATAZAr6AD@7@D@`?;>Zd3@w/@\@A-Aף^A#yAAL7A㥺AAZdA?5AGA/A/}AL7]A"A&A@n@I@?@a@@/ABAQAA= kA̋AOA&AxA'1AA-AynAR~ATARAQAnAAd;gA+bASWAMDApA;aAyNAq=AzAB`A/AwA`An@ff@r@ A@S@u AAV@}?@= =b(R00335B}+B)B7BB^: BE BYBV#BX9&B -B!2B@B.FB(MB%LB@B-6B/Bn)B)B0B2BP B;HB~UBPB'1\B]B94eB#nBqBzB}BfqBlBq]BTB#[MBˡDBuOB5^ZBDbB94iBˡsByuBurBcBy_BVBNB?B#B%B= B94BS!BzBBB|BNb(B,B@8B@BjLBDKBBovB}?rBbB7 `B33]B-2TBJ `B)]BDgBNgBjHB WNBq\By^BffkBkBwB1Bw{BsBjgBz_BLQBACBq=BV.B-2+BJ BCB B|$B2Bd;=BCBNBjIByLBqLB}VB=`BeBlB+sBHxB)\qB$tB%pB}Bx~BF6{BO}BbqBѢoBCaB]BQBJB$WBNBD WB VB;_OBd;LB{@B >BGB"=BHB!0?BEB?CB@EByiQB,LBVSBQFB:B!=B 6Byi7Bh*B33(BwBbBBBj<#B=BB+ BffB, BB!0B\B BB`eB33Bp BBBA-2B B+B3B`e%B1BuB=5B 8BV2B?3Byi+BBmgBB!Bo"B*Bˡ BB# BmBAA'1A AAshAGA;_BYBjBy(Bm8B9B.Bs"BDBBB^BAAshAA{A}BBF6BD!B}?'BVBB+BJB AAAA BBX9BNb B/B,3ByiAB.?B'3BP/B$BJ B-BC BBmBK B3BxBfB7 &B(BF5Bb:BuBB#ہBBB`pBIlB/^B}WBBNBLB{YBsVB)^BxYB!RB/]OBDB^?BYHB?BHB@BRIBw>FByiKBhWBݤOB}WB&KBSCB-AB:BB;_6B )B !BBJB#BBt+B6B?B.LB= KBJ VBWB[B;dB1mBztBvB-B5^wBBzBB)BӃBB|B,xBhBeB^B$WBmcB;\BXdB+cB{[B\BXRBOBxVBNB/]YB'QByUBGOByPBZBmRBTB`eFB=B9Bm8BF?B4B#4B,B$Bh,B ,B7 6B\1BT)BB`eBB`BXBdBy BhBJB'BB'BDBZdB/]BˡBNBAB&B1B!:BHBPLBVYBWBfB#iBTwBD{BZdzBopBfB-[BףNB;>B:Bz,B)\(BTBqB W%Bq&B5B~Q^z2n33XhmdH @/TUPVn?nR?Zd[?㥇@Q@ AAnDA/>A{AԏAvA"cA}?7AZd A+@?h7Y5^= "juHrh>P'@x@QAn6At]A}Au\A"uA/KA1AZdAw@K@t=EƿL7A}?ktsGIA|)\?E@h@/@= @&@@ @^@!@RA@n@P@ AD@Ⱦ@-M@o;@z?p?XI@X1@(@r@p@K@rh@Nbh@= @C?ˡ?y>"{NbPOʱ-^9!GW00 ;B94/B?*BŠB BLBDBo)B.B:B?CBRNBR\BLgBGuBQ}BPsBD iB\BSBJBNBw>CBHBQIBIB#LB9YBTccBPmBPjBJjBOlBAhBKsBzBZBP BB5^BBhBJBBm'BTBvBjBJ cBVB7 YBeBqB)uB?BَBBB;_BBB߆BB BwBŠmB_BWB%bBiBYvBY{BlBBDŽBu~B|BqzBrtBfB]BLPB JB#WBDWBu_B]B{aBnB/]lBX_BhBIqB+cBpYBPBGB/:B2Bf$Bd;3B33@BFB=TBA\BeBeBGYBCMBIBd;@B8B)BL7&BBwBX B+-B4B@=BVDBn>BBBn8B;Bo4BJ:Bsh4B-%B"B}#B+B/B6By-Bd;)B%BpB33BAˡAMA AB, BBB(BŠ4B{CB= CB8B+B-BX!BBDB B$B+AB`A'B-2B9B/BB1BOB+ B'BBEA94ByiBB'B-2$B.B=Bw>?BMBTcIB=Bff6BZ(B'B?5 BuBd;BB&BBVB1B."BD 'B5Bq9BXFBąBBGBvxBtiBdBYBWBcB`BkBףiBjgB%dB^B/]VBWB@PBZBVSBsXBYBZBfB}[BmgbBUBBOB(YB)\VBTUB}IB7HBF9BHa.B5B5B BByB{7B.B7Bף4B;B#6BŠ0B=$B\#BVBBYBBfBrBL%Bs#BBqB)B{BVBuB}!Bd,B5B.>BJBwPBTc_BdBvsBDuBBR8B+BsBLlBF^B QBshCB}?BB5^5B/Bb%BB`#B#,B1B?BHBOB= XBL7SBKXBTBRaBbiBTjBmB)xBbBBnB7ɀB@B'Bp33GzJu(M6TU$>m[SȐjlʮЪ33V(Оx]v6 xL7Y#A/o{q=:lOvʡ=ВК^$F{ R:Q.(N5^xzFʘd;;ߢ Ah&[33/X9"n,#C"5rHv2MjX%eB`?t3XB`!|C $x'G^)\olGJ *@ @M? ד?B`?J r@R?C@@@tA(A?5DAuHAbxAshAAqApIA!Ao@O@-=?r jwhI;?r@9@1&AGA1vA҂AMnASA mAOAE A@S@33?-ף d;HZc/-Kg}?ENb0?&A@Ц@j@v@A$@AAA$Ad;AA@@ A+@!@Tm@@G1@j@ƣ@?5@+Ay@A@Nb@@@:@@}?J w'OS;Ġq=tl%-Zd300yi@B6B/4B&Bj'B)\Bw>(B4B78BFBffOB'[B iBFsBu~BB|B= sB9hBbBVB(\BPPB)PB-MBRNBdOBqZBPcBBpBqBuB'yBJ }BqBd;BHB!BBB#[B#ەBőBލBB}BhvBsgB+aBlXByi`BTgBqB}{B-2BŅBvBҊB BmBB BBPBӍBbyBqlBcB$qBnB}B}BBEBdB6B\B,BPBzBSnB-`B$XBdB;aBNdBbBcB7sBZoBbBMhBqBgB^B=RBoHB94:B@0BD#B-B9B}AB1OB;VB_BH^B TBHBS?BѢ1B'BBmB~ B-ByBq=BvBmg&Bs/Bp2Bw>:B3Bu;B;BAB(;Byi/B-2'Bu#B!(B$Bh)B!B^:BH BBApAA= A^:BF6BR8B%BHa/BV>Bq=CBOBR8RBLBt@B5B'BV"BB BTBA7AACA B B BHB\BBAnA1ATBV BTcB#[B$ B)Bb7B:BѢFBqBB4B)3BJ)B+Bsh&BBB~Bw>Bj B WBףB)(B!0-BLBmMB}B}B۹BBz|BtB5iB iBvBtB}BwBP {BsBupBCfB7cBYBdB`BZiBhBmBF{BwBrBsByjBhuBFpBoB+cB3]BOBL7MBMBPBE_B XB?aB-2bBH^BcB-2XBXB^NBTQBbLBwBB5B*B!2Bs=B :B5CBJBITBcBfkBJzB0BCzBBfB BBlB'qBBʍB}?B?BB{B/]nBubB-XB7 JB>BŠFBݤCBRPBXBgBNbvBsxBJB`%BB\OBN"BѐBՐB BBIB`BHaBHBB给BP B+BwBdBBBB\BBnB3BBsBmgtB8Bsh{B5B{BWB)xBxBD ~BvBZduBdgB^BYBSByi[BKVB1YBXB= LBSBkJBPBFBVBB5BG6Bk0BJ )B-B{&B /BѢ1B;B{=B0Bݤ%B#!BP 'B$B/B3B>BIBNB#[BR`BIoBSsB6B(BJBFBB\OBF|BunBbBTBSBGB;GB{?BFAB'1NBUBaBSfB iB nB|hBkB dBpBS|B|BBqB}B BF6BBq=B}B/33}7}yjV{+VcMVZvQ?5IIˡDףd;jZV@&^(t kd;HshM[7Sȃyh7id;Iz%MC q= Nb?PZ>vH'1~ @(?˿/݈ҭ̨v;5= [R~/Syƌ97O GZj"p H{0/;L7Aff*6Z^t Qt 8I/u`>Gף&9Zd#o>nB@x?(|?{@@p@@Al A8A= YAjAvDA.AAX9@?;߿d;-uAֿ?m@CA|AD8A1TA\*ADAXA@|@)\?z?/ J /]{~jt?= ?@&>VP?{?7q@E@J @Z|@-}??V@@VN@mk@ @q=Z@a@>m?J "X9-}?V?5^@R@'1A @ZAl@@)\?#9ףZdR "y o3%/L1R00QBCBJGB=BDBF6?BIBSB{XBVdBNgBsB)\BP BB'qBYBBVB3BwBwBhmBlBF6jBdB(lBR8zBոBJ̇BnBvBBBNbBBBBԫBڬB+GBZBDB)BrBFBBB`%BbBõB5BsBB7B/B5BLB\BZB4BϷBmBDBLB,BssB'1|BnBB= Bf&B-2BڔBX9BB WBsBdB[B&B|BByiB)\~BS|BzBVB.BFxBL7{B ׀BwBJkBH`BTB#IB!0ZBdBdBDqB7oBj<{BX9xBRuBYuBkBulB`B)\cBwXBXBOB@B7CB%LBHBffRB[BVeBotBr}BB WBÆB#BR8BBo҆BQBB{TB'B^BSBpBoRB}yBpBj"۽)\?G@VU@I?Zd&IJ ^$=t7ff $Qlp?R&@@)\@@j@{~@@r@E@@}@A@)\>T㵿Ev%w7~H^bHX9lL7 N+G xף-rˡԠPr^q=q={mʿ>5^:{vvfm绿K;t= ,/5X9,+(d@n?T-@?4@-@#A@@rA"A^9A331AZAzRAף~A7AƕAtAq=AJ TAVA@-@?o33;S#1>&i@@#ATAnnAJ A(AbdAq=xABAףA= A@|@@Z?)? ?KO@@M@D@{@w@!@@Aٺ@@/ݜ@j@@pAAo A@@q=@d;w@O@@Z@\@Nb8@G@@;Aj2ATAl/AEAq=An"Ax@'1@n?>?55^Cbn1J (00VJBmg;B;B.BZ.B}%Bff1BB`DBLSB-2ZBˡaBM]BsWB/KBABD 3B&B|B"B1BBS BkBA#Bw-BG9B 6BL7?B9B)@B@BP JBAB#8BF6/B)B&0Br'BP-B;_%BuB33BBANbA#ABBVBw#B?52Bk:BSHBoPB_BG^ByYBoKBQDBL6BHa.BLB#[B;_ BFB-A Bq=A BBIBB#BAABffAbB BP B%$B&B2B\?B{EBNBNbHB9B8B,B+0B`e-BK B1B"B3BFBwBuByi*B-B39B?BBKBXBzB_BBRxB|BuBOsBB}BBlBbЇB1BBbBBB˃B`zBu}B|BF}B:BLB`%BN|BNbwBBu~B!0BMqBnB-bBaBjBTkBHvBzwBj<|BqBjBw>=B/Bj1B5^,B&Bd0B!.Bd;BEAB9IBGBT|U>uCyp-gIj `Nbw?L7a@I@@uP@(ܾ1Pl ";A8VJ r^?%@V@@uA|A@t@@jA@}?m@b8@>~j>  !¿Xm("B`=933\#1ƾˡ%?= nR xOML7b1I= ffSZd>X9L@j,@PWK>F+@-?`0ٮ" {>D>;ߟ?M2@@p@"@L7@F@AR>A&AX9AG=A7AXYAHAAxAxAFAIAAAAtAV8A A٪@$.@ ף0?Gn2?m@(@PAMLAleA+AAKgAbA7)ATAI@-@M@x@? ?>+@AH@#۽@m@B@R@9@@(@B`@h@ff@̜@AA AB`AQAp#AE A-@@j@V.@D? @u@&@AI.AQA'A6A!AjAף@Zd@V?̬?w>U>zEXA= wp00WBKBVIB,;B;Byi6B#?BGBoNB"YBRcB9oB!}B{BߏBKB{TBBB"xB`jBqlB,bBeB_BV]Bo^BTkBmuBB`B5BeB1BBxBxBjBs(BzB?BYB!BԛBBBBq}B{BuvBTckBPoByBBw>B3BHB{BlBBB:BB馐B-rB#ۅB{|BNbxB3BTcBFvB1BޏB BB BBBBLBTvBlB&hBosBbqB= wBJ sBsBߏB\ρB7 vB?}BuB-zBPqBeB7YBLBCB6BB36B+BTBBBB%Bs(B6B?B@ByiLB)DBxLB= KByQB{HB|AB6B'/B0B*B).BE(BI BB B7AA~ABB= BB+,Bk3BN@BGBNUB{VBOB5BBB4B9BZd7B)BX"Bo.B{(BXB5!B5+BL8BABQQBUBZdBGBBHB̘B7B؏BNBsBBՏB1ȕBshB)ܕB|BWB㥎BCBYB`B,B㥎B?BɉBݤBBBhBB|B|BHzBBj<{B~B94uBoBPyBzB݁BB+BrBjBgB/[B^BTB7YBjSB"ZBYQB`CB;BCB;JBPB-^BgBrBmg~B5BB馌BVB/]BBBşBWB'BBBB BBɄBBhuBqB-eB_BeBhkB'uB BރBB吆BB)܈BNByBRxBL7BfBYBB%B?BfBBL7BɛB+B1B!pBB#ۆBBByB33BCzBuBnBuhBd;]BVbBwYBjfB"eBŠnB rB#yBzBBL7B%B=xB~zB`eqBoBbBO\B= QBCBbCB5^B}5Bj5BѢ@BBB= QBuUBF`B}lBiBtB,wBBKBBBB؇BVB33B#xBwjB fBZBd;QBZEB`e>B9LBMB \BcBjcHVX #oCCS1 Nb >"[a+F^$B`m'}?ΓI, ?'1@-@@\@@@P@/@/@@@@@rLA6A;A$AshA7APSAA$Au6AUAcA?A/IAu$A1JAAzAAdAd;OA`A\@}?@!@MB>X'17Aq?̀@33@X9@ A@'1@@up@ ?P-B`5^t" !"IM1((|;B`ؿ}?>@@@T@#A&A9RAbPAA@(@-?!`0<(?L7? @Zd @(@M@@jL@GA@ 33;gL7>X9t=Z@*@B`E@B`?T? @)\?005kB{^BD ZBJBJBzEBJB%SB]B}hB%uBSB8B{Bw>BBBBB1BP |BVyBmBTcnB{hB1gB'1cBnBxB!BbBB^zB=ʆB\BNBlBqBBbХBBB,B{ԔBBBĴB|wBsBJgBfB'1oB!0}BBwBٌBNbB+BB%BF6BuSBkBB{BJ̆B=JBBNBB:BBBFB'BBB`B=ʀBN{BJnBJlByB&yB2B'1|BB{BBmBBȁB-2B练Bq~BqBjZB_B WnBnBzyBffpBogB_BZPBBB6B ,Bd;BB% B` BCBS'B%1B%=B@BLBˡKBSBUBJWB=JBBBq5B4BC1B*BZ)BTBBBoA9AL7AvA+BB,B"B0B BJBIBsh=BABG>BBB?5@Bl1B-Bw:Bx5BŠ(B\-B+8BEB#OBQ^BPbBpBRxBڟBBRBBɖBw>B#BBHB%BpB?5B\BBsBRBBOB B BҊBډBۊBBBuBVrB}jBlBxB|tBd;xBsBkB.tBsB{BwBnB_B!^BZdSBP MB1NBѢABHB3DBGNB WOB}BB9B1:BCBCBRBfYB'`BNmBqB94BBpB`BB(BKB94BeBL7BBkB5BmwBbtBhBngBaBD aBjBMoB\xB-BBB+GBY~B%~B^zBBVΈBBBBB֐BFBJ̒BT#BjBxB'lBqiBSuB7nBsBkB+kBffcB`B?5UBRBYMBWBUB$^BfBX9oB~~BuB΅BH!ByBBj}BBuBgB^BLOBIBTFBݤGBzQBFOB']B1`B{cBgB_BeB_B^:eBHadBZBQBAEBDBD OBoIBuNBHTB+YBDgBljBswB){BsBOxB33pByB3B.BBDBB BHB B)|BqBygBxYBjPBCBTcMBHHBVB`B`enB%|B7ɁBõBWBB3BBBBABF6BX9B%B=JBVΟBZd@I@&@Ԝ@@9Ⱦ}\shQHb`0Fd;#m'?5 TGA?J "@A@7@OM@|@'1(@3?+/3m7$ffʑJ j Qz?O=u?H?Kˡ&B`B`Q@3@n@shQ?1?>Ā?S@?F@q=@R@D@@$@\2@o>1ܿZdV"Zd`E̬Ϳ ?@@B`@y@{@'14A-4AA?5BAX!AoWA?A5^lACqA^AjAyAxwANbLAbpA%uAףFAhYATiAwAA_A tAvLA)\GAVAnAAVZA\^AC-AGAQA33@A@F=J ¾V`?@@\@?5.@@m{?!"@l'= 㥣-E5^2( 7 (&= ?33&"T㵿+Z4@5^@oAVA}?QAMVA҇AAaAGEAA@ID@>w?1ܿ"۾^F>+?Z|@u@(@y@@+O@ˡ??5^@{@9@= @\(AAAA5^Aף6A= ;A00S_BPPBMB1>B)\AB9BLCBRLBtTB+bBlB)zBZBB^ByiBH!B BgBɶByisB1rBVgBѢfBpcB5^aBݤ`BklBJxBBCBBB#[BBޑB^zB B#BߣBRB%BiBB BBB$B)vBrBgB.kBqB@B BBBVNBkBB-B-rBBBfBf&B/BBBBBBʎBBB'1B,Bs(B֋BBBF4B&BBB%B{B!B#,B'6B>B?BHB)DB= LBNBZTB?HBB>BZ4BH/B1BG*BO*BN"BOBz B%BnAZAwAqB W BL7By#B1BVB}0B(BBOBsh BBvA1 B BBKB7"BHa'BtBBx B@B BEB BBm&By#Bݤ-B:BBBJBNHB%;Bsh>B6B9B7B.(B$B/BF6(B\B= %B,Bl9BshEBTByYBJhBոBABRBj|B33BFB׎BcBUBBf&BdBBZ$BXB33BjB7ɓB֔B'BBBBDˉB%BByBntBpBDrBt}B7uBsh{BshrB lBhwBJpBvBpB-2oB`aBl\BSBuLB%PBwDBIBBBuLBOBBB5B`8Bm?BBB7RBn[BX9cBpBkvBLBvB94BBN"B-B?B`B[BBEB BB)}BAyBXlBjB^B&]B.eBbiBswBJBBB܅BXBmgB ‚BhшBffB#یB^BkBdBVBBDBB BBB/B-2BrB/݅B}B+yB1BzyB'~B uBhtB%hBwcBXBX9[BRBw>]B]B/iB,kBˡuB/B BBBuB7 zBoB{lBN_BCYBrLB`?BFEB?BMJBBBBTIBݤFBGKBOB1DBF6LBJEBOBjRb~`P=Q8\˿^Id;@l@@q=@X?L7??~?$??h @@#ۥ@@Zd@Zd@/ݸ@L79@ k?zvE+@}?@7@`AVA--AףAZd@@ffN@+Dʕ"q=^/ݰZG`L7aZd[= =bX$@ҽ?{@@AEBXBB7ɔBBoBCBzBB|BqB|BdB\OB BZBPBbЍB+ljBõBd{BfB4BNuBjBjB{sB9qB9rBNoBFmBd{Bv|BxmBqqB yBBoBPfB~ZB)\OBrEBJ9B'+BTc5B$CBIBXB\BxfBbB\B{OB@CB(5Bw>.B!BB/]BRB)Bl"BF(B%/B;BT;BNbEB!@BEBHDBPKBѢAB4B^,BŠ+B/BHa-BR2By)BBB; B AAX9ABJBP BB{-B5B^:BBdJB9YBq]B"TBDB1?BTc/B(BBB1 B\BAdB WBBvBBZBBBB#B}?B94 BD BRB B $Bw0B'1>BEB)NBLB;_=B;B0Bv6B/Br!B+BX'BI BBEBZBN,B7BhFB+JB{YBj|B9BNjBBŕBvBnB3sB/BLBBBdBJ̞BݗB,B/B1B)ܞB)ܙBDKB9BuSByBuBB|B=zBHuBzB#BBBlBRB BTcBB}BB5B{B-2oB?dBq=dBGWBf[B'1TBN]BX\BPBIBݤRBXB?\BkBsBFzB!0BqBq}BBP BD˕BRBB7B= B/]BmBlB)ܑBB BBwBshBBF6}BzBNzBByBًBTcBËBBVBoRBnBVNBBBEBBϐBBVΌBuB&BBẊB=BJ BтB}B%oBnBvB|lBJoB$cBaBWBTBFBZdABn?BIBR8NBѢXBdBRpB~BABiBBNB94B`e~BuuBHgBIZBKBF@B.;B6BnCBV>BR8EBXGB^:QBPZBYBSeBeB`ejB!oB`gBVdBD YB]B=_B SBRB/]QB/]QB_B1_BjBmBfBdlBiBnBuBJwBjyBMBb~B;B}BF|B+tBiBNbaBsSB/MBAIB33TBXNB\[B^BunBxBׁBֈBDBńBϷB]BXBkBfBqB$B%ƔBD˛BB"KAYA|!A/A+@̐@5^?/?(t@@-U@j?zl@@?X94=rvV?`尿?MR@q=@1@,Aq=A?5@Ar@z@=@=tS¥B`PǿpjB`mVο-Q>A@Ώ@+@TAvA= AA@bAAA"+AMRASUAEACYA%AAA`@9X@EA;o㥋v #== g@$@uAKA%cASAb`A!AA!~AA+AAAA+AOAAwAAAshA+AASAA33A5^A%Aף|A@ALAPApATAeAnnALA+CAAARAn@@ZD@??@ף`@V@Ȣ@@V@@@Ԉ@sh?xaODףOKwT w}?5}? Zd??@@ף(AA@AxAC{A+AԡAFA{AI@A Ad;@(@'18@v?~?什?x@+@Q@ A@ Aw@@b@A&A)\A$A+[A!dAGoAlaAX9rA AnA00QBCB%BBL4B#[:B$5B=BJBHMBj<\BˡcBNmBzBBD BBoB-BB~BqBwoB.cBIaB'1]BoYB+\BiB rBѢBP BBwBBdB\ϒBXBrBB-2B͌BuSBVB;BbB%BoB= B&zBApBwBw>BoBBBLBD BҔBBBnByBݤBNbBB xBpBMyB'{BB= BBiB۹BVBˡBBBBgBBvB pBwyB}?tB94tBrB oB#}Bt|BmBD sB;zBpBgBo\B'NBXBBj8BJ*Br/B>B/FB1UB^B?fB#[`BK\BNBCB4B/B#BBhBQBB^:B33!B.B8BxB?KBMBPVB MB;=B^>B4BX6B2Bף%B7 BX9+B$BףBBZ Bk-Bw7B!0GBIBWBBwB'1BMBIBŜBDB-BBuSB`B>BB+GBIBB#BoBBB BB吘B$BRBB结BhQBX9B؊BNBBB)BԎB-rBBTBqBqBBBBBlBT#B1uBK|BHaoBjsBshlBL`B~\BhBB`nBshvBBBEBVΒBBq}BB_B}B%B,BDKBj|B{BB B%B`%BVBJB7ɓBB B{ԅB^B2BJ̆Bm'BBEBDB%BB+B B3B-BõBNBBBBBMBBaBj|BB B;BsB?BZB\BBÎB\BLBJBh|BwnBB`mB)jBxBxB=JB=ʃBĈBuӍBffB7 BZB҈BϊBڄBuӂBwBpnB`aBuUBUBJBTBMBUBOB;_VBL7TBNUBcBcBTcrBsB@rBoBshbB%^B_B7 WB7UB^BX[B7 iB-2lBLwB㥀B}BVBlBB`eB^B;B BVBBRB܆BGBZdyBoB+dB\]BYBgBjBIuBJxBBÇBBBBjB}B/B`BNBBD BQB+ǢBBq=BARA@@\@Zd@?@J ? 8@;OM?b8?Il?`|?52D @^@@B`ASAXABLGBQBF6[BffhB#[vBF6BB8BهB/]BzB}qBfB hB[Bj]BTXBTB(TB%bBmBxB}}B~B%B{ԁB+LJBdBBP BeB3BB;B_BmBõBw~B BZdtBlBt`B\aB{nB'1}B BJB BBsBWB)\BfBMBZ$BBL7BxBXuBBN"B3sB%BB'BVBnB/BBkB5~B9rB\fBcBoB lBHoBlBTkB=zB= {BnBEsBB`B+vBtlBu_B`eSByiEBR>Bb0Byi6BKEBIBsWB[B{dB`BTWBMBBB/4B'B!BMBw> BVBBB!Br#BJ/B3B=Bq==BCBIEB-IBy?B6B-*B)\&B&B} Bs$BBףBBAMAL7Ad;AA?5A BvB'1$B-Bq:B-CBQBNBMIB9B2B#BBBd BBTAVABbA BN BBB}BnBZBCBA|BbB B WBB$BѢ/BX97BBB;AB5B5B-BI0BC1Bu"BwB/)B"BBMBu#B1B W;BfIBF6MB~[B@BD˳BB%ƬB B)BգBŞBZ$@7@@ˡ@R@A-@ A"AS+A"AA@ˡ}@@+@sha@;ߋ@S@D@ A{AKA7[AJ 4AANbxA҅AogAAMAjAyA-AXApAPA00cBrVB+PBB`AB>BŠ4B#[yjD\Zd sh" T7'1X9`q=t<ʡ?O-¿ ׋/V+|߿? 8@X @j@ˡe@K@B`@mA/A}?=AxA#A@w@{@Nb?~ \jEvshF@@jAz:Aj0AZd/ALAtAAzAXA A{AA9AAAOAٵAAďA גAnAvA-AA|A`A|AҰAԚAƝAA(ACApAA ׆A7yAAGA+Ao@;@Q@@B`'AA^/A)AACEA?5:A%YAIAv,A@p@Zd?ztVξ/Dk/=t33/ݬFV w?ms@@uA{AZAFkATA= AHA®AAAˡAAƜAىACYAR AA@P@Ĕ@7@@@$$AVGAGAVdA}?3A0AD&ApcANb~AףzAtAwAVAwAoAwAA/ݏA00dB!VBMBF6>BX99B-.B+2B9B-FB{QBK`B\hBBvB)\B`eBLB ByBBsBeBD ]B]BoUBѢ]BSWBYBTB_BKmBshrBNbtBZdpBNbqB%iBsByB=JB9tByBӒBB5BP BDB?5BvBB`kBm]BVVB~IBPHBNB]BscBuqB9tB|BJLBw~BdB9BˡB#ۍBT#BŇBIBBҋB BBBF6B/]BBdB{B-wBsjBf\BHaYBwMB5^PB&^BqaBlBmBVrB#[BBuBYBJ BJ|B'{BfflBBeBVB+UBGBWB_BeBrB\nBxB%nB{`B/WBshKBEB):B,B$BOB%B"B)B-4B7B'CB`eBsh BnBX9 B{AJ AXAJ AbA1A}?AKA- BBB'-BT4BABf;BI2B-'B' BBX9BjBkBtAAVAjBB$B%B'%Bo,B\BvBNbBˡBBVBBB'BlBoB"B-2-Bu;B;BѢ1B4B(/B7 1B.BBABo,B7)Bk$Bb.Bq=5B?AB;KBVBff`BmB7IB~BBL7BBԟBlB1ȘBB'BBBݤBNBd;BEB!B9BT#BXyBXB!BjBBLwB%FBjBBBZdxB`epBwaBZB^BLYBP eBG`B`lB1hBroBxBSqBwBsBrB7pBtgB!_BuTBfYB94cB\B[BdBgB vBHxB\B?5BkB܂BoBBqBBLB4BB:BB͌BB-BbvBiB^\BPQB\BI[BgBnrBBBBRxBBߐB2BBw>BќBX9BB33BtB؝BxBLwBsh AjA! AA!@@= ?v@H@G??B`q=!Q l"mko?X9@sh@$Az A-@@Z@V?Zd x,:^n:N&+&'!hL71$ 9H>u?J S jTZ俘npx-uB`m˿&yƿff?m@sh?-@)\G@q=@5^"@&1@Z?tSE&lЮtt6Q8?/-@`@$A@@wAy2A AAA\AzRAL7AćAPA`AlAAyA|AuADzA1AZxAGAAKAиAAxAADAX9AKAX9A AADAKcA;cAI&AA@@S@ˡ@A?5 A"MA?5NA OA7}ATgA'1`AMA.Ash@ף@9 @->t>m&vC+?H:?uȿnZdKw>T]@X@ұ@XA AYAaAAAlAd;AzAZAAVA'1AzA?A^A+AS@33A/Ash A ANbA;ATUA8AJAAAjA!sBgBmBfeBZjBiB%mBQjB@wBj|BB͌BmB/]BB%BgBvBfB}B?BpBZBBNjBљBBؐBhQBBBu}B+GBXB=JBB,BڔBBmBB BCB'B'BB؀B{B}?BBB5BB͒BBwBpB{TBBd;BmgyB|iBjBZsB9uBqzBo~BT#BBBYBոBy)BBf&ByBL7uBfBbBTB^:gBpBsBB~B@B+B}yB{nB gB]BHSBCB7BT,B#BT,B6By@BHBTB)SBF]BX9XB9YBYB%WBIJBC>B4B34B5B4B#9B@/B^:&BB-BsBMA|AQApA9BBD B33$BG0B:BqEB@B{3Bp&B3&BABzBq=BB{ BkBBBhBw)BF1B>BuEB8BNb5By(B=&BBBBˡ$B#B%Br+Bs5BAB'NB QB}KBQIBVEBzDBOAB-3B2B?BY8B1B+=B'ABBOBrTB bB iBwBBVΨBSBBBBBoҙB[B,BB4Bd;BB9BB1ȥB,BBB|BH!BmBIB{BBBFB33BF6B1ȂBBPBˊB+GB}?B%FBgBH!B WBZBBBB.rB~pBaBJ fBRXB bBT^BjUBLOBFPB/]^BgBnuBj<BBڊBB2B!0B›Bs(B`B͡BBq@}?M@%@x@^@mc@ >y-21GEB`ſK?d;?H@+@Q@D@̘@(@p@A AX5A+A!AAK A@Nb@j$@($N1ףпZd?5~?? @@yAUAIAQ2AudA&AT{AkA/ݒAA7A'1AAXA'1ADAHAAZdA צAªAZdA{AٱAˡAMA$A= AҽAzAOAA/AAAoAXANbAaA+OA7AOAT Ad;A-KA>A`AXA1HATwAffAJ AʔAˡA&cA;5A$A@@@|'@ȶ>'@1<-"wNb(@@9A$0A!hA"yAA)\AAA1AA+AAAAA1AZdAsAVoA!2A|7AA@&A= A.Aw_ArRAL7}AGQAףTATA·AAZAٟAAAbAyAAoAХA00nBbBFXBJ KB#FB};BF?BDFB%RB)\ZBRgBqB{BB…BBoBy|BwB%pBgBiBmaBjB#bBZdeBD_BIiBAuBxBBF|B BxBw~BB7B{Bs(B#BBTBܘBBw~B'1BeB?uBHyBqlBpiBwBB=B馈BhчB)BˏB3BBӍBBHBmgB7IB BNjBBBFBmBBPMBBBCBBj<}B#mBgBVZB]B}lBmBGyBbvBB{BBBڀB)BB#ۅBDB5^yBuBXfBŠbB,UBq^B%kBlB}{B%zBm'BjwBoBufB)\ZBYSBffLBr=BX4B)%B)B ,BP4BuBAB=B39Bq=8B)B-,B9B/4B-B,9BHaBBMBVBcB`mBw|BHBBBB/B%BZdBBByBZBَBB`BdBB@B}B BbЕBmBBPMB)BBB{TBqByBxB+BoҁB^:B㥃B}BӄBBBBNB}B(sBeBѢ[B+]BATB1ZBQBDSB-2LBIBCBIBJPBOUB!0cB=hBoqBBBsBBBؕB לBYB?BˤBHBFBBףB-B#[BBuBBvByinB/nBxBo~BBsB BBڅBŅBoBߏBuBB͒BَB8B-Bq=BD˙BBBq}BBVNBqBݤBυBBB9B+GBB1ȂB BB%~B-sBRqBw>iBuB.pBYtB)~BX9B̊BffBB)B.BȋBBBrxBqBbBWB XBp[BRhB+dBgBKaB/]dB'dB-aBP lBXjB'1yB!0xB;}BHyB= kBkfBzhBbaB_B/jB}iBsvBsuBB?BףB{BnBMBw~BB)\BBD˓BwB֏BWBBB+BvB9hB\BsWBcBG_B7 mBtB/BBnBFvBwB=B5^BBÝBBL7BFvBBvBѣB-BR"A?AA~6AZd%AA(@7@@ף(@u@b"[Nb@}?sh = b !?Vf@#@5^ ADA?AAzANb@@q=J?Q$ M2t-G!^ffv= ?bP@T@Nb@y@SA'1@(@+@|?Q& >Zd;?~=O>ƻ?ˡu@l@v~@@#ە@L7@n@Q@"K@?/?}?ME^t `0{F@F@ @V6AQ.AAh5AVhARTA6AFkAhAףA7AEA-ADAAffA!AȎARAArA7AbA{A AwAAAZAA9AvA'1AƲA}?AX9A'1AmOA(A/@@L7@EAHAH>A#uAvA'1|AnAAȯAAARApA/FA~AB`@L7Q@{.@9 /Do?ף@/@!A&9AxsAn|AAIAOAʸAASAuA`AA-AGAwAR~AOAZXA+2A%KAu&A1A~A|;A/SAKyAjbAA/HA(2Aˡ7AtAxuAbA{AL7AmAAtqAuXA9^ASA00Nb~BTqBdBNVBMBuEBVGBKB^:ZBaBnBYtB}BLBB3B?uBwBuBkBcBufB_BˡgB33aBjcB\ZB-2cBL7nBwBZyBX9tBqwB/mB%sB}B~BD BB8BܔBBߏB+B0B6B}9B8BD :BJ-BE2Bq=@B/]BfEBHBUB[BcByioBnB5|BB+BBB5BBUBuSB-BmgBZBuBZxBpvB/jBVlB94eB33cB!0pB94xB ‚BBBBqBfBBUB BBUBXyBBZdBBBMBSBҠB/BuBfBB^B9BwBBqB@BB`BˡBцB&BDKBBBRBxB3}B1zBTBjBMBB֋BTcBNbBoBAB}B;ߎBBBѢwBsB3mBtBԀB}BhBBkBs(BBvB`BčBPMBBB'1yBF6BףB{B㥂BT#BoBBBBq=BBfBR8BBw~BAB?B#BBuӚB BZ$B-BŐB/B BszBmBrB5kBOxBẀBBBB;_BBJBABnBB@B'qB3BVNBDKBոB^BAG=AOA-2A+!AH@!@@'1@($@j,@/'Vf?5vyA ``5^:?$@@AQA#KAC%A9AAsh@- @I33-= H IKVjt?sh?j@m@ff@d;AףA+A@/@@S@"[?ny醿Z??lG@v?ʾ\?w>J ?L7@@`x@@@q=@X@@E@r@shA@sh15^d;T% {?@?@Zd@EATKAx=AA%EA/tAXACAA'1tAx]A+ANbAyAưAxACAZdAAΙAEAuAJ A̬A"AA}?AVAAhA+AףAPAAL7ATAAʔAЏAdA:AVA`AQ A.AjjAyAҔAAAZAAGAADA+AjAn~A$JAp#A^@h@d;@`@lĠµ>j<@R@AX90AVdAtADAAA ׹AEAA"AshAEA|AAL7AAVAԚAףAAgAytAPA-DAGAWAV{AHAmAMA;aAAA QA+A{AlqA/ݕAPARAPAhAffZAkA(HA007 jBff]B3PByBB,;B/B)1B93B\CBEBL7TBshZBףbBAnB WoB'1uB+tBfB\aB'UBLBYLBbCB1LBHaEBIB7 CBFJBmRBYBHaZBmgUB7 [B WSB\BSbBˡmBFyBJ́B%BXB绁B"B&qB(qBPeBDeBxYBVB= JBF6CB#ABshOBZJBZXBV^ByjBshtBN~BvBBքBLBd;yBף{BNnB)tB BXyB}?B9BIBsBzB/lBweBh`B}SBFBH>B'7Bsh:B|IB7 NB'YBXB+_BqlBHqBfB'1oB}Bx|BV}B,nBiBZBhWBzHBVB{dBw^BhB`BcB%VBrKBMB@B;B;2Br%B}?B BA@BF6BB!B.B+B4B6B8B`;B~3B#%B+ BBBo BBBmA)\A/AmAAAuAjA`AAAtA7AL7AˡAPAARAAAASAAwAzAAAAB9 BB$Bj<1B!0,B$BBVBX9BBAAA)\A'1AL7A BB)"BB B{#BP"By%BŠB|BL,B#[,B&BZ1Bb;BFBBw>NB=ZBeB1tBӫBT#BfB ByBXyBuөB=BɠBLwBšBVB*BǜBw~B?uBVΜB՚BBuBoB,BBPB*B`eBFB3sB~B?BwB6B۹BqBFBVBmBH!BB~BpB-mB?5`BvZBWBŠMBRBףNBs\BcBRcB+TB{SBPVBuUBcB.jBHanBX9yBzBhB}?BBiB3B=B-B BwB'qBBhB.BM}BtBVsB|B?5wBݤ|BB5B@B B}?BBB'B7ɅBR8BB@BNbBBBfB3BoBӟBBB`BTcB˒B7BBBB B%BB͌Bw>BwBB%ƌBD B؇B1B%FBVBB5BBPBBnBB{B1B͘BbЕBy)B&BBEB}Bz}BYBBBЏBBlBBwBBqBBBf&BB9tBkB/B吃BӍBB?BBZB۹BBLB}BBmBۖBףB= BZBMB=BݡBbBB BBDB'BUB{yBF6BxyB/BƄBYBBPB5BBBP͞BB;_BBB=JBnB^zBB.B A)A\AO)A AAЎ@ k@Xq@@=?d;5^,;9ffH33H1\>\Z@ @|A?5AX9@K@k@w?(쿓= {|MhLo"KF7B` 5^'1hO1 @K7@U@)\(CZdԴ/q=R X9#D1̿?@Q@= ?CC@w?G?R-QZd?5T|$vXQD>y@ @A@L7@@;-A7A AGIAHLAnAAA-A+A?5A ןAIArxAȇA&A`vA"AjAA AHA1A ATA\AASA-AīA!AEtAd;qA4A;AV@@@| AAAFAtAVqAGoAAAA;߹AoAFAwA7EAA@1L@/? nrm+G#A#9$@K@L7AO1A>A?5zAAAHAAA"ACA!AAAAhA^A%AHjAL7cA6A1LA!&AjAAAG9AgAbPA&qA:Aj(ABA+}AmA-cAnAAȑArA bA}?MA^AIA0033iB#[BPBFB B EB`eSBNSBF]BNbWB(ZBNfBkoBhB\lBzBF{BJtBQhBŠ]B!0OBRBFB`eIBUBTBJ_BtXB(]B`eTBVHB.GB8B1B'1#BB WBBˡAjA;A BrBL7 B+ B!0-BQ2BK6Bmv?X?jt1ܿ*B`O'4Eῇ?&@C@&AE&A` A/.AףA@?X9{+RC79 y IL?@̸@l@Am3Aף(Aj@AIAF@@ {@)@?h?5?A>ףP@K@ux?"=(q@S?33?K@;߇@ff@O@ @^@-b@R@G"#yR2ӿǿ?Q@@/A;'AQA!&A-`A'1HA1AbA+EAkA gAIAArA~AAADA-A~A^Ad;AyAA(AJ AпAAATAArApAAffAPA/jA5^8A"AP@M@E@\@w#A%1Aw_AvAlyAAAhAmAA1XA 4A@@X9<@$v>>n¿xi?ffF1lǿZd˿-@ff@@AAZ8AAEAsATAAAğA ׶Aq=AL7AJ AQ|A\A9(AA2A A7/A'A*AMA)AxGA\bAHASQAAmAA?A\:AA7=AmA$^A}?QA%3A!*A+AA00ZiB]B#[QB+EBף:B-1B2B;_5B7CBhIBXB_BKcBhBiBlBjB%\BaBB`SBMBGB}BBLJB;_ABjAB"4B9B/]@BDB KBFBfJBCBCBMOBVBcB jB,pB+jBq=\BUBbFBSBB 4B~4B7)B33!BŠB-2 B!0Bo"B5 B/B%;B9IBSB1aByikBfwB1pB/xBoBwBRoB)\sBBXB}BuBVxBZkBaB$YBVLBF6KBo=B1By.B)B3B#BB-2DB5NBѢIBѢOBZYBbBѢ]B\hBNbsBqB\rBcBhbBoTByXB}NB+UB%_BXBaBUBNYBB`MB ABtDB946B\6B^*BBBMByA' B BlBqBB#B/]"B ,B=4B1B6B W-BXBCB#[Bd;BB-2BAA-A~AmA!AףA/ݕAjA7A;ߤAA/AAd;ABX9 B.BOAA9AAAAbAB`AAAABף B&BD"B(.Bff'B))B B$BBZdB&APAbAANbA7A7 BBNBuBB@ B B%BBBO*BX9,Bq+B3B?BAB?5MB$TBbBfmBX9B B B=JB!BBN"BoRB吢B9BNB5BɶBBR8B1B&BB;BNBBBj|BB)BԓBaBBrBB-2B'1BB;BtBBoBbB+hB[B XBLB}PBlKBLB5^VBTWB^:fBoBwB/}B.sB!hBbB_BD YB`B^B(bB+dBiBKpBxBTBBBףB-2BښBABB BBBNBX}BpsBzB`sBZpBNpBovBˀBBڋBEBBBBB}B=BABB!BBiB,B-BiB~BEBَB#ۦBâBZBoBBBõB/]B9BB^B`BDBNB!pBBXB1B/ݔBސBkB BbPBH!B3BBB5BVBBӍBɶB BB?5B{ԓBBBhBDBmB7IBB@BLBBbBN"B&BBBBۃBB;B-BlBBVBB`BRxB-B!BBBoB1ȦBqBB%BBBCBm'B%ƩB}BP BBBʉB)܋Bd;BH!BJLBBPMByB֤BbBXBTBB/ݵBڲByBBB/BBB;o?n*@}??r?O ?lĠ~X9,̰o-p%V!$LutrZKn"yJ bJ ¾!@r@"@B`@#@MJ@ ף=(\ 'Bc_IIHNb j+?+@?U@p]?33>Zd[C+?>~RPOyn4ux7S ԔM%Iƛ$p(쿋lgl?Ga+?+>ZQ!4-=@m@ף@F@w@'1Aˡ@FS@t@$@AA= 1ADA+AlAsh]A= EAA4ATA9pAOA33cA}?uAAxAЖA)\ATA9AAq=A%AAGA"qA\BA$,A33@ h@??5^:?nb@@V AwIA]AJ rAٔA$AtAAuA^=AGAP@Nbp@J ?~m{"C팿= ׿X9!z?GA@ff@$@!@G)A"AFAZA {A\AA7AA{AxA ׂAKAP3AJ A1@M@)\@x#ARA(A AA-Am=AA/Ad;@xq@@{ AtA(@@-AA A@A@D@@00jBVaB94TB^:GB;BQ5B7B8BGBKBZB`BfB)\nBBmBtBoBqaBG`BSB33MBlKB$GBPB`eEBFBK:B-:BLBBjBCABhDBDBbRBRB_B!fBm^BRByiOBR8VBBLBBVBESBVBnYBu[BsbB!0mBd;{BshB'qB'B}?BBBL7BL7B{BR8rBIhB!0mB;_fBgB}`B;_gBrBB{BX9BˡBd{BJBBF}B BB^zBFvBˍBB&B`%BuBABUB֟BHBBBF6B;B BJLB;ߎB+BBBBfBBB&BBsBюB)BBB?BْBiBdBBBBBݗB`eBAB5ލBhB'qB94BNB\B΢BkB)ܠBϡB+B9tBBBd;B׌BއBZB|yB/BsBʆB֍B BBVBոBm'BxB#[BwB%ƤBBɶB㥢BZB{TBP BL7BfB1BCB+GB9tBVBȎB2BB&BB BBYBshBKw?PԈ??ˡ#h- `/Ŀ'1S?\>@@= @X9@ˡžyIG`XB`m5^=E@ˡ@ A1An@@.A$AI@d;+A A+MA PAˡuA5^ADAAB`AAjAAq=A|A A~AAd;AuAA/AAAAףA;߲AIA^A}?eAJAA@h@@#@"@OA^!AWAhAIhAA;ߌA&AA?5hAt/AA@Q@g?1,C >j?ף?h?ҍ>6@Zd@%@@l@ AxAM>A!`ATAyAAuAxAA`AA"oANbXAף$AA-!Ao@I$A/A(AAS9AIA_Aw=AIBA A%@l@+ ApA@ACGAj:AI2AAA?5@x@00VB-2LBBBs3B+Bsh!Bd"BZ*B`e9B+BMBBLB)LB{TB`BFeBS]BPfBpBLgB3eBVB/]RBmgDBݤGBu>B1QBTBLB'VBRBs\BTB+HBSBB6BNb0B!%B= By BDBzAA%BBhBVBq=B'B?.BH+BE3BF+BFBHB By B,B5^A{AA|A/AAvAyAAAA= AFAđA-AjAGAA|A$AHA A\AmAVAAAA}?ATACAVB$B! B,B%B!B\BBBPAAA!A5^Aq=AAhB/]BHB!ByiBnBB-BF6BwBP BhB7B#B,B5BB@BkGBUBF6XBXB3B*BaBfBƣBBB^:B_B`%B ׎BmBոBfyBpBhyB!xB B5BϷBBBJBBBƏBَB%B B{BR~B!sBJmBcBhVBs\BpOBףRBGMBd;IB>BDBEBEBMQB^LB= ZBVVB`BrcB/UBRNBNB-2CBKDBNBshOBXBF]BdB=lBVoB5}BѢBoRBVBIBٔBBDBB馁Bݤ|BoB%oBTfB_B[BNYBuiBqBF}B}BBBfB߉BT#B\χBB@B۹BtB=JB'1BBBBBXBxBCBBoBBLwBߏBDKBJBzB}BBX9BBRxB^B+BhBИBVBBuSBABbB B۹B WB1HBBoBBJLBABBffB?uBBBѝB-B"BB=ʙBuӒBLBBBshB1BJBz~BBۄBNjB8BhQBB B BBB+GB^BƪBBBbBmBRxB}B'1BBBBBfBBBpB0BB BBݤB}B+BCBfB= BB1ȩB=ʮB3BjB`%BLB7 B=JBB)\Ensd;"%33%" +L7P;gd;a-Rp=$d;S3J A@b@9AT@F A$@X@;|W\d;Wq=&\:y?/@l@1 A %A"9A"MA(AA@ff$A-Ash@j@̀@ 3@@ʡ?f@{?sx9"CrԸ?@@`@{@)\o@H?C?I= ׽ L79wZDZd?L7@X9@t@/@-@@%@Q@Mj@v@+@@@l@KWAu8A5^@A'12Aw1AZADA oAxkA㥂A~AmACA/A}?A7Aq=AL7A AyAA{A RAK#A@q@ @&9@H>N@P@QARA/pA㥀ACA/ݞA!AΙAZd}AiAJ HA1A@@Nb@=q=:hx^q$> @-@@#AˡAZd)AjAVAEHAOQAiAףvAHhAAzAB36Bl(B#BByB"B'.B5BBBLBNbZBfeB;oBVtB/jBP ^BxUB-LBmgDBXFBR8B#@Bn>BJB5VB]B^BJZB|\BVBTaByfBtB~BB'BB9tBBTvB@nBjBBB` BPBCB-Bd"B$B'10Bj,Bq3Bף0B0B-B#+Bd B-B W BX BBwB33BVBuBAAAhAA9AAAAAhA A)\ B#BX$B'1"B%BBOBAAAA^AASAZdAA BA B7B$B\B{BGBBAArASA?5ABqB3 B#[BB'B!*B^:#BN!BB%BzB Bsh BBBH BCBBף+BP 3B>BZdHB#VB BBBBEBbB{Bj|BB=B7ɐBBBBXBXBhтBw}BoRBłB5އB.BVBďBfBBB+B= BBBV΂ByB@uBhB]B+aB\B1iB]Bl^BVB[B33YBWBwbB`BhBJkB#dB^B;_QB+TBYBoQB{SB{XBs[BMiBnBHzB&BTBBT#BwB)BBBB6BB`B'B`B^:}BoqBfBu^BuZB1fB= iBwB|BBЉB؉ByBNjBdB㥓BB[B;ߜB B-B]BB`eBBBBTBLBBB+BBףBB)ܛBhBNBõBQBJLB?BBBEB馓B#BBBBZdB%B^B.BևB)BRxBAByiBuSBӆBB͌ByB)BBˡBP~BGsBmgvBKiB-oB}?hB$nB}fBP YBNbTB(ZB_B&bBOqBR8{B B8BBBsBB%FB6BmBmB{ԪBoB[BXyBuSBBBX9BCBʄBwzB{rB"wBRvBTBJBBB9BFvBdBęB BLwBMBB-2B0Bq=B\ϟBR8BB&lQA= +#J $m7`QlRjq=OZdvlxQvjB`忮G?q=z@@@?'1Nb"CffL?5@z<8d;X9$?B`%@@@&@#@}?@V@v@@@r@/T@1,=ֿx+gyQ5^@2AN X r0lǿAZ-q=jX9~VQ/v @?{?󽿨kEZ$r@j,@X9$@l@@@E@@@@&)ARARAIATGA+|AZd}AA̓A Ad;AbA(AffAA+LAA@㥋@"? C(?("+@@MANA;߃A ACA{AAAbAMpAQBAPA@7@)\@e@J 2@l@@F@E@)\@ATA#A>AAq=@A"+AJ AA%@n@+>5^?z|@x?ηA ?nB@w=?5?oG K00.B9#BVBH BKBQAGAtB3ByBR8+B{1B >BTGBNBHRBZLB>B/]7Bt2BB'B7 *B"B)Bw%BD(B'!Bw+B4B>BR?B19BRBEJB(RB)\_BzhBpB+rBfB#[eBqWBhPBmAB9B*BJ BHaBBdBZ'By,B;BAB^:NB5WB#aBLlBoBBdB?dBUBUBBHBYDBRByYB`B|]B gB^Br[BZdNBq=JByiBB8Bo+BB&B"B-2B+B}?0B:B7Bj>BKB/OBq=EB}OBbZB%RBEHB;Bmg5B&B?$BVBh%B3B5BoBBy=BIBNbAB'4B,Br BBB{B?5AtAoA AA7BN BxBZdBD BQBjBj<BqBshBAIAhA+A$A)\AffAA5^A}?AA1hA QA+uAIfAGAAԯA9AX9A^A)B3BAA AjAZAjAjAjAAwAMA㥹ATAAAAk BBAAAˡA)\A̰AAAAA^AA BmBBB`BBZAAAApAA;AABd;BNB;_&B#0BA>B-BBZB}BѢB#ۚBB֐BBɶBHBBBBiB|B0BZBBmgBB细BZBBBB#ۅBJLB}BxBF{B#[rBBqB/hBmg\B.^B)\RBfZB$OBTBKBGKBFBjABLBKBHWB+WBP]BѢYBR8LBKFBIB%EB@BlMBOBYBEbBkBX9wBNb|B/]BKB%FBD B,B B㥗BuB-BȇBdBOvBNqBcBB`aBLWB'1VBF6cB)hBmwBq~BڂBB/B,B%ƥB £BBBABByB׊B!BŐBTBoB'BBHB-Bj|BBTB;_BB쑊B3BB0B)BBuSBq}BvḂBB-BzBnpBNtBuBB]BB~B'yBshtB,hB kB!`B'eBl_B}dB;_^B+PBGB?PB&SBYBfBHpB}B5ބBBBZBڗBX9BDBBBΥBwBBbОBw>BdBBB4BL7{BTkBHacBŠmBmBѢ|B!pB^:B2BBBshBBqBߞB7IB&BB1BBBJLBB 1L7IrM+?'1S+ˡ[Zn ^Ɣj{OMjS(= Ehھ ӿ?X9-L7 q=D1rȃHԐ7J rj'1:oI D<)\ L71q+%Vyף+1= x/ DX[9^nx~d qL7s!>B`KJ {J /331D.B`K,4(G;F= +-1̿ˡ(DE>K\"#y@xA@?5@v@B`@@Gq@I@{A@&@"AA(PAMJA^uAL7aA$AOAAtAzAJAA@v~@?I̔"+CG?T@@/(Ap9AViAgAXAshgAZ:AKAˡ@7@$?Yo-JoshѿDL7!-eَ>o?U@E@KO@@@@~AnAtA7AA/;A5^XAm?|%9ף?y鶿1o005,B#[%BףBu B` BVAABT BB!B-,B4BBBVLBUBZB{SB^EB}=B4BTc+BR8-Bo'B7 ,B(B.B)BP 0BG=B}EBDBL@B@B8BqCBHBUB$aBkBvBwB WlBrkBN^B'1YBHaLBCBNb9BZ0B~!BTB(Bw6Bq=;BHBJB+WB]B'fBDpBlwBjBL7hBYB XBNKB^FBTB`e[B/cBF`BkBHfBxbB94UB`OBHBZd?B,1Bsh,BB|#B0BE4BZd=Byi@BHEBRB/SBIB= QB]BTcTB)OB@BD 8B94)B#B-Bh%B2B73B\BB{>BffJBEB(:B@1B&BB)\BoBAmAAA7A= B'BNbB'BBbBBBQBQ BAAAZAAbAA+A1AGA?5APmA/VAq=AA)\AAˡAd;AAXB)B/] BBAB`ATAA%AAAshAJ AA#۰AXAA}?ABVA9A7A= ArAA&AA+AA AABuB!B'1 BP BBCBCBpAX9AxAOAAOABBB((B1B=BBEB7BBڠBy)BěBٗBBUBBqB!B?uBBB5BRBBBj|B#BoBؖBӑByBB]BͅBBB{BB=}BuByB#rBR{B)qBpBB`dB1hBHaBZB#[bB[BgBjdB^hBhB;[B{UBNbWB;WBFSBaBfBqB{B~Bj|B;B5^BBBBB4BϡB=BƖB BBeBRB@zB&wBIlB'jB)\uB5yBBBB?BB'B'1B&B!BBBBVBԤB/BvBJ BөB٦BԨB}B B\BǘBؕB!ByB:BB3B\OB BcBB۹By)BXyB9B BB BBBnBBH!B%ƏB?5Bj|BϷBىBrB5BhyB#[rBP uBClB=xBpByB33yBxBxBq=rB1yBNbmBQsBoBsBpB`BYBbB\B;dBlBqoBBV΃BZ$BBBێB)BBZBfBڟBwB7 BBhB'BuBDˍBWB,Bb|BTcnBfB!qBFoBB/]BBFvBTBBABDBBBTBmBBd{BB͌BZBݩBj*MbQM\33)\ˡL7?&7 _MRQI+kCEq=(o>L7y@@}? @X@#y?VE# m-M)\/wB`cd(6nshQ-*S?!?D@ˡ@@u@`?'@ @1-|sh+V tj o M"EGJ KS ·p+ff tB`T{~x9x)?d@t3@9H>!??5@%@= ;@^@X9@@+ AjAsh[AE>Ash1AHAAף"ADA= %AJ 4AE`Ad;{AБA}?AAA AAuAƱA)\AԍA#_A= 1A| A@@n?1$@9@"A00NB#ABL8B,B!BRBB94BF$BŠ*BP 9B:BEBXKB'OBTOBJBwBq=7BP4B33(B,B}5B= HZ ׯq=)\^}??>p9|5F~Nb7vVj2- Mj;@l>zT?hM@Q>? @ @@@AFAx'AV&A AS@7AH4A`"Ao-ATAwAwAjA+AA A5^AAVA)\AnADfA92A= Ap@q= @\B>x @o?)\@A7'A`ApoAA5^AAAnAAKA 2A/@\@6@2?uX?E?|'@jD@->ˡE>jd@sh@G@PAX9A/EA7;AfA‡A7AAzA~A)\A AʀAB`AbAweA:A-A0AX Ad;;A"3A@A)A^;Ad;'AKGAAQA԰@ P@^@@b@Pw@)\@ZdA!@ʹ@-U@I?%?>00;_EBM>B0B1&BBB{BB$B!B}?.BP 1BBE>Bl4BR8/B&B\BB`eBoB"BB#BV*B7ByCB'LB`ZBcBj[B"[BLBJQB%KB;_NB\[BbB=eBeB+eBZBffTBhEB9BX1B\#BwBB BbBh&Bz-B;Bj9BKEBzOB+SBLBRYBddB}]BNb]B5MB}PBABDB6BEBB`MBNNBXBw>MBpTB;_LBy>BC>Bݤ3B1B&*BDBBuBZdA BBNBBP"BB"Bs%B& B B-2B5^ B-BA+AyA{AAAAHA+AAlAwAshA$AANbAhAXAnAAAA$A?5AAAΧAjAA;߯AxAʸAXA;AMAGBJB!BL,B((B; BBX9 BApA'1A9ACAAAAVAB'BFB~BBP B% BBy BjBBD BJ B)B^:+Bt3BJ ;BFBSBBBB@BuSBBʬB'qB`BCB}?BB쑙BBcB̊B+ByiB`B/ݔB_B5ޗB&BۛBw~B1BoBL7BTcBBxBLBB B#xB}BrBZdwBѢnBjBE\BJ _B3ZByZBwfB!0aBnBpBO{BrB+xB$nB}hBX9cB?\BgBIfB#nBvuB(yBF6B#ۆBbPB.B7BLBBBBxBoRBBBPBõBBzB5vB@{B9BBoRBBBTBƔBB^zB}BB'1BיBw>BhџBjBq=B,BVBB±BHByBj(@D5?G!ˡS1lQZnZdoِˡ-$x'1B{ X۾H"@&Q??J ?d;?rJ I/9X3$"?@nj@A@ff@!@V@7@z@@L7@33%AjBA~xAvAKA|AATAAAAjAbrA-8AK@Q@@#pݿ?̬@@`:Ash]A~A AnAnAA-AlAffLA'1AC@shq@ @Kw?VR>?!R?P?P=ףp@@@$AAz4ACAA*AS?ACQA NAZAp?AVKA\AC)Aj7)u(00ף5B+B\BBBB1BBJBB'B)B3Bu;B&>BCBf>B0BJ )B7 !BVB!BB)B5%BN.B%B)Bˡ5Bb9B#[:BB0B/B!B$B/&Bb0B?BsBBXNBXSBEMBPB5^EBJBB!5B1B'B;_BB BtBqB.B)B(0B:BAGByNBY[B;_cBXBw>\BNBbMBoBB=B;JBnQBZBXBh_BjXB`eTBCFBxB$A/AnAAd;AAlA+A&AAshBGBo B BX9 BˡBBAA|AABB'1Aj BfBB!BN.B8BlBB?BB²BѢBBB7 BBdBoB\BBBBBBBB?Bw>B\ϜBBBoB˛BBBNBoBѢBBsBWB#BBUBm'BոB^:xBxBkBkB'eBjbB^jBmgeBrBpBEyByBjBR`B;eBdB bBNnB'1qB~yBjB=BX9BB94BB1BߡBBHB9B}B7 BB|BBgBBuӀB7|B{B̈́BBmBBےBRxBړBBq=B-BBݤBRBlB BBBBBLBBBBBBDBNbB'BFB)BBBBEBBX9BDBǓBTBȓB͌B(BBMBdBqB1BƗB֙BߏBbB.BBB:BN"B WBBkBBBPB-By)BAB`%BBjBBEBuB}yBmBZdB\υB͊BhB–BBQBƩBBXyBBj-Xzˡ7uħntY%jQhտ(?/$y?P?G?^}?V-B`;m#FM:P'1jZjP{zN|Mg1AAS@J Z@t?w?@%@+A-UA}?yARAAAAAAq=Ad;[A~$AVA+@g@+@p?;?p@~?~?V@z@HAJ >A?5.AZA+AA XAzAAJ AĈA^aA;gA"AxsAALA=AB`A$(AT9A}?#AGOA>AB)\2B0BY:B:B9Byi-B^+BB}BV$BD!B0Bl7BC=B9B6B4BV*Bd;.B7B BBFBBlAyB Byi BLBB%Bf4Bt?B{NBZB QB+[BQBlZBVBw`B1nBˡlBjB`eB(eBHWBKB?B@2Bף'BBp Bj<B BZBV'B.B=Bף>BݤGBNbMB!UB-TByi`BzjBP fBiB1\BucBBWB^BvRBxZBcB[BbBUB[B)\PBhCBpIB@BABBBϷBBZB9tB5ޝB=BRB BB-B_BJBEBBBuB;ߎBݤBbBB;B5^BpBqBDBzBB`BϑBLBBݤBB.BBP͐B˔BkB\ϚBlBBМBbBmBXB|BFB B-BBB\BJB٠B֙BBJ̍BB-B|BB?5BBWBwB/B BB1BעBBBBRxBTcBB?BuBoB?|@ c@@J @/@z?o?Zd;{%}?3EnJ ffEm)\}VL7yP^-?? [! +Uluԕ`Gz'1/ݬbd;QAsh-/ݼRn\'1 oEjlX9p ׏J {G7iK+F%"^S!0KK`FpaVB`Y5^zlZ&~%t ˡ+B`& /MS\ '1@C ?@Zd@\A0AnXA+hAy6Ax A ׯ@d@`@ʭ@ٲ@GA(AhUAPAAΦA&AAFA5^AhAףA]A+9A(AAsh@K@I?!@Ԕ@|@"AH.A`\A`AsANbAQAAAA?5A7AC]AO%AA@r8@VMd;?5^A33?-e@ @#ASUAudA|AhAΪA7AAZA+AAAA= A A#ۢAРAjA}AiADAQAX9$AZdA@@F@\"AA.AtA@&AKWA5A7AwArAhaA.AE@@Nbx@-=00HDB?B3B*B BwB%BshB"B$B/BL1B'18B=B!0;Bu9BL75Bk'B*BB!Bw$Bw%B2B,B"4B+B((Bq=4B/BZ1B%B%&B WBBBm!B/B1B:Bף8Bh1B/BŠ#B%B`eBBAB! BףAA?5AsBBXBB#B0B+;BIBQB HB?OB33HBKBHGBsJB-WB#ZBZBXBTBQBGBŠ8BL+B'1"BRB/Bq= BB%ByB%B3BY3B;@BHBLB;KB XBZaBZBff]B#[OB!QBFB\PBCBxSBB`[BNUBHaXBLBX9TB}?NB94?B@B7B}:B5B!&BY B^:BbBo$BT#B+B7 !B(B9 B*Bk*B!0'BK%B94BJBBABwBRB'BAshAuAX9Ad;AzA+AA33AvAΦA(A1AAZdAOAA5^AȹA̵A/AAƴAˡAAuAZA9A1 BBB'B5B!06Bo*BhBBBVBKA^AAAAAA W B!BB#BPB1BB B!Bw!BJ BB+B/]3B'6Bv@Nb@P Aj>AsA}ApA&AXAAlA(AmAtAAzACAAAA&AΣA גAGAjfAvANA7AX!AA;A@Ad;+ALA A5^(ATA!vA%iAhA33AnAX9ASSA#A@@j@00,TBSLB=B3B(ByiB BB{*BL(Bˡ6B}?;BY@BBBCBPCB>BL1Bu/B%B9)B}+B})B+5BX/B4B)BZ)B4B4B3B/])Bs(B B"B/*BJ *B(9B,=Bq=BBd;>B9B7B!0*B,BfBPBBBAAA;_BsBfB,Bff(B4B?BNBYBNBTBLB`eTBPB(WBD dBqeBVeBr]Br\B)\TB3IBq:B7,Bo#BB BB BB!B(B6B6B WAB|JB OBMBRWBNcBfB&cB\VB ZBLBQB3EBVUB[B UB#\BZdNBTBNbOBB@B\@BŠ7B55BN.B\!BbB!0BBHaBvBXBB$B| Bq(BO-B&Bo'BPB@BA BoBBshAAAvAA+AmAA?5AXAAd;A;ߕAAX9AAAAoAAADAˡAAuAJ AҼA33ARAA)\A{AP BshBu&B1B.B(BѢB;_BuB#A/A|A%ADA33ACAKAP BpBsB}BBB'B1B}B%!B;_&BN(B/Bq:B&;BFBR8FB{UB]BsBoBݮB[B{BjBBBjBَB^B BiBHB BBdB;BBףBңB!BĝBJ̜B-BsBBoBFvB5^B,B֊BBB{TBCB+BmBqBjxBiBrjBaB_BwiBfBrB#uBBPBJ |BtmBlB rBkBuBsqB vB|Bd~BB}B;ߐBVBBBBnByiBfB`eBBBHaBBĔBӔBؚB?5BBNjB?BB?BmBNjBņBDKBmBɶBB.BB%ƗB֙BmBX9B^BjBWBBɶB{B+BFBÇBwB7BBkBBBuBB'Bq}BVBtBbЙBTBĦB=JB)ܦBVΦBmgB绠BBBBףBBBS~BB)BB}B^BB㥦BBPB`B|B%BXB;BBˡBBLBPO@u@= @Al A'1 A@~r@ H@ |X9I//|M҂t{f= 9ffZdjף@'1x@V@O@~@KO@1 :Q~4\A|P^{Xq=*puSc$F?V ?}?5?Q=Դ}?2P ;-O!q=,Nb$t ׃+/݌'19B`X9jX!#*G$Vtr?@S?/ݼVF@ @J :@Z?o@E@bA2AyjASAjAwAbA75Ay A A1PAbJAdA!A#۟APA"A&AVAAAL7A"AAjAʐAmA]A+%A@ @1@@M(A&]AIlAAA33AHAAA}?AHAҸA"AZA"OA-)A@\@m@@?5@Ȫ@Om@J @AD"ArLAlyAA`AAVAxA{AA33AAX9AxA!A)\A|AAwAA?5AJ vAnA/݀ApAdAjdA9bAzAb^AsA$>Ad;3AJ TAAjA`A-AA;߂ARA2AL7An@X9@00bDBw>8B71BJ %B!B`By BwBB#B0B14BS=BxBB#[EBBBx>Bo0B'/B&B=$BѢ)Bo)BB`4Bh2B:B4Bo8B;_EBdFB{DB#[9B5B)B7*B0BH8BEBݤNByiVBYBQBYNBZdABABR4B0B$&B-2BBm BBB?Bx*BS4B)\@BVMBBUB5cB#[hB|\Bb^ByQB@WB#[PBFTB)\_BThB&hBwiB!lBdBM]BNBDB9B +BD BlBBuB3)B7 4BjbBu`BgBP fBAqBnB{bBYBG_BfB+eBqBsB!xBZBVB*BwBʖBDBB BvBB}?BBB33BB BbЇBևBbBPBB+B`BHBBWBBF6BBHB BBĘBT#B BB,B5BgBBB{TBB;B^BBXBsB+GB9tB-rBmgBBBB B֍BvBBBRBB{TBuӅBJBBBBLB BB WB+GB=ʏBlBbPB"wB%sBxB~BqBshBBBfB@BNBBBTcBB7 {BPwBjBw>qBuB`nBmrB!{BB,BBlBBBBBB3BjBdBjB!0BcB BBѢBRBB BFBw>wBZdkBqtBInB{BTBىBVBBBZdBոBBRBۨBBvB!0BEBB)ܬBIB{@5^ ARAJ "Ab(AA}?@sh@@?ĠxTRLPM?5DJ J +~9ȿ|@@p@EAK#A@㥷@#@(+7CQ > _mgB`ne5#o[?@?@}?@@ףX@J><jMh ;GOOҿKף$pnҿ5^LE|{+33ZCj,xi>9?M@"@w@E@(@@Ĕ@j@yAAPAeAІAAZdA גAćAzjA33CAˡUAtAKkAAshA|AAAuAFAFB,BA/AAAHAA\AwMA//A%Au"AF-AV\ApASAȣA㥩AAyAAAX9AshA;A㥫AZAwA)\QAKADA^@S@&a@rH@"S@l@$ArJACyAzAA/AGAA|AAVAAFA(AshAA;ADAA5^AAoAtA1AVAHA;}A)\qA"sAAAЍAPgANbRA!tA/ݒAhAˡA= A;ߧA33AAZAr,AH2AZA00 BPBHAoAAAA'1AOArAtB' BoB#[ B,B-B!BsBrBzBB BB BBB}BjB.B2B-B(BV&BBBŠ&Bq#Bsh2BB.4Bo)B B)BBZdB,B*By6Bm6B(@BR8IB5^NBWBWBHaIB/CBD4B}/B %BjB)B,3BhL7+>Hb6\,hejnZdJ KM$9}?Uݿq=?1@v@@l@?Z$Fn  Q9d\X9h(>$ w?+W@ @@@㥿@@5^@5^@ ?̽5^ڿPRf-oNb+.;Tff8r -$F9[hmVshQvnFtff,oc?L@\@!>9H@'1>ƛ??%@v@5^@%AshWA %A(A'1A5^A AKA%7ArRAQA΋A'1AAjATAA%AA?5AAAA1VA5AAX9@+_@)\@d;@ A-@AkA)\ArA(AˡA^AEAVAnAAA AsA fA /AyA@ˡ@j@@ףAF@!A;AffZAhAq=A/pAAmqA/AX9AAAAԋAuA$Ad;AΒA~~A~A5^bAjA%A|APAAhA{AكAyAGA YAVQAAv@+@#A7 Aff@A$0A@G@H@/?B`>Z 00APATAIAAlAªAADAA/AVBHBB}!B(B(B#B BP BAB'B7 BB BB?Bq%B-+B%B B=BBD B$BP3B7BSGBRBqTBGKBPBHaHBXBB9B~2Bx*BBBq BMB)B(&Bݤ/BP/B9BFABCEBMB%OB,BB/B94$BFBB BJBAA)\ApA33AXBBBT BdBq=BB` BMBX9A&AnAAd;AVAwAA AbAAAAAAyAbACAwARAAAAL7AmA`A B%BIAnA!AAAA\AshAA'1AM~AIAAAwAAAB`AAҦAAAAGAIJA9ADAuA-2BwBABYBEB+AAFA+AIAVA AAA9A}?ArAAAqB BXBǭBB/BaBIB BBbBؙBB>BB\ϝBJ̗BH!BBFByBÓBBJBuӕBmBB%FB1BB`BoҋBFBَBVΈBÃB W}ByiBJ~BB BB?B}B؀BwB(mB)\sB%jB}tBjBoBskB^BsXB[BL7]B{bBd;qBL7yBdBNByB3BJB5^B\OBtBXB/ݪB)ܭBӫBݤB+GBBX9BBBy)BףB%yBsB}B-BwBBBƖB'qB\BẘB'BBZdBB,BuӭBB ByBZBBB˯BBHaBoBwB)BBʗB@BBdB/B9BBBuӐBwBَB~BZdB&BmBB;BٕB;BoҎBB94BBBjBo҅B^B-tBzBsoB|zBsB'1tBPjBnBmiBjt?p-@@K@A6A$hA^3AD:A ANb AMAO?AC5AR@ApA?5A+ApAMA'1AAAHA{AA㥶ApAAuNA!.A?5@^@!R@@z@APA&mAJ AAMAyAAffA AAvAˡA5^rAZdGAu$A+@@r@y@G@^@/@@B`A@A|aAXARzAAAd;AhAAuA+AIAAAA9AtAףARA/A|A sAKAAOAX9^AgA-[AExAOALAshAQ@A"GAV*AzAQ4A%GAA(A @T-@O@?00?B5^AA#AjAAZdADANbAAPB= BX9B%B!0B1Bk&BYBjB!BEBB BDB BDBDBŠB)B/B+B/)B&B B}?)BC*B^7BBBŠOBXBu^BVB= \BQB!LBBBq9B0BF#BsB#B!B.B+Bw9B9BDByiLBKBUB,XBJBdCB~4B0B$BBB'B2B:BtBpBBhBq^B`BYBJcB1[Bl`BR]BPBLBsPB/PB,TBX9bBkB7 uBuSBZBlB3BnBdBT#BBDB'1BqB۹BfB\By)B@BVB{BmgxBBiBndBLmBqB۹B9tBBDˌB߉BGBHB֒B)BVBVBBBޠBw~BXBByiB%B'B!BB'1B3BϐB-BeB%B#[BP9|_ q=~?5@;I{zc;` IjW?z@@ Ab@@up@G=C+9G o5i&}l}?&cG= u٦q=ڿ\?X@= @F;@&i@Q??p=?F3zmNbvZp}?jwz5^+`!1 XI}?^{nS"$-uFjff澉AH@~@A@Z?V~@@?5V@C@\@ˡ@x A?5$AV-AHFAA(hA%_AMDAB`+AMDAX9nA`AX9zAxAAffAMA A+AVA;A'1AA AAAkANAXAz@@@= @@*AHAtAA)\A1AjAA= AQAPAOuAG9A!AH@@o[@?;O@= W@Nb@\?P@(@I@/*APA>AgAF[AE~ATACAAAAAAAvAA1AUAjHAbXAH8AbAPAףDA;AMA;aAuAnNAvFA A@ @t'AA@A$AT;AAvAԼ@@|w@AP@00'1 BBNBHA5^AtA;AA`A+B5^ BsBhB WB/]*B,BGBD B{B( B?BrBrBBB#B$B~'Br7B'8B-23B-B'B}BN)B3%BD 4B8BKCBNBPWBSB[BsUBVByKBfBB7BX+BxB)\!BT/B`8B4B=ABM=BoEBHNBHOBMZBWBIBPBB+4B0B\(BB)B|6Bd>BFByPBMQBOBBBb>B75B3+B7BqB BY BBwB'B-Bd;7BBBf>Bu7BABGBף;BL5B(Bo'BnBOB+ B(#B$*B'(B5B4BCBCBB4B)+B{'B BBX9B} B33BJ AIB\BB#Bs"BBsBBOB Br BףBKA"AxAAB; B#BpB9AANbAL7A7AffAƟAAAATAAHBj<B5^BTcBA/AffAA\AL7ApAAVAףA^A#A1AAwBL7AshASAX9AA7AADAAIA;BBBw B BB7 B}BPAA33AAAmAA AuA?B1BlBhBH B-B/BNBϷBB/ݓB BB~B.BB!pBB}B(B94BuӖB5BB BtBBhB ‘BBsBB(B)\BB߆B‚B练BP}ByBBL~B WB?BB~BVvBq=nBcBqfB\Bb`B!0[BhcBF6\BmgLBjHBBOB`RBWB+eBblBwBFBFBBB.Bm'BdBٜB#B!pB=B1B%BVB;B+B!BD{BshxBVlBoiB#pBqrBZBJ BmB)\un\$6L7O?5@­@33 A$Aٮ@+@"?|TmyX9@33o/~ Q\zq=H\$-^ &1?F@z?H"@ @zD@?/D ד^! R= ff}?E5^";gK{V^q=x"L7myB`e ;]o=r?X9l@5^@Ou@@V@@О@$@pA!@5ApYAxAʖAAZAB`AshkACA MAq=fAmA+AAA$A1AshA}?AAˡAPAA;AA^AAqA/5AbA@|@@AtUA9hA~A-AB`AGA/AIAAzA ױAԓAnAGA!A@%@6@`@@@#@t@O@'1A(HA}?wAuA1ASA+AuAAAAAAA!AyA{AAMA~AshASoA㥇AMnAZA%MA%gA= iAAJ jAX}A(FA5Aq=ZAA1vA^cAAvA-AmAxAAAffA@00&AAZANbAOAwAuA-A%AA5^AHAAB B1 B7AAAA#AAhAABBBoB(BR8'B#[BBqBB@B;_BD"B!0'B%3BF9B^:EBmEBSMB`FBBB?B5B.BR BCBBV(B(Br-B7B2B.8B;B{8B%?B/];Bw,BA#B B? BJBVABPBsB}? B+B0B6Bݤ*Bb*B #BBR8BBuBoABR8 B)\BP B BL,Bk%BBJ$BF%BBBBZ BT BAoAZAyB%BB)\BffB,B'.B$B5BB\B33BGBA+AIA5BFB}BpBVB(B5 BBBhAAףAVA!A= AAnAB/AjA~AARAPAd;AnAAAKAffA AmA)\AwB BwB} BjAB= AjAjAB`A~ANbAA!AкAACASA!AoAIAAQAA5^AVAnA AJ AAV BoBmB5BV BB-AbAPAjAA{AL7AAAA+AAGAxAYBRxBϷBB=B1HBXBBZ$B\BB&BB쑔BlBBB)BBOBqBBB!BB)\BBWB۹BfBõBuB'BցByBxB#ہBõB'1BuBDB}?B'qB~BlrBGsBeBVjBaBNcBhXB\KBNLBWB;_TB_BkBwBƁBBABR8BޒBXBB/BqBf&BWBBBshBNjB^B%ƔBӍBB~B1}BnByeBkBjBQxB!BBuӌB94B'1B@BBB^BõBҟBP BB B9B(B,BZB.BJBhјBB9B{B(B}BYBX9BgBP|BotBiBbBlB;fBtBmBvBxB[B۹BBB5}BqBnBdBbeBZBSXBNBABwHBj>B)\@B#5Bt6B/BT7BP 4Bd;3B=B?7BŠDBDB?KB!0RBCB9B5B6B;_2B8B|9BݤEBBHBTB]B_B?kBŠoB}B"BuBBBRBVBRsBBkB]BYB%PBVJBNCB'@BNBUB"cBhB?5oB(wBYvB)\BPxB1}BB5B܇BBF6BBBʖBBB@H@@+A@&@W@@q=@?5X9#z4d;ECȀX{jF^pw?V@I@d;@HA}?@5^r@v=/y-(WAm{J"$(Nʾz@ʡ?1@ ??XOd;J }?E Pw?5&ף= jPgˡ]w'133'1HҹE{tKǿC+@b@|?@+?nj@y@>@!@@5^@(AjJAPkA5^AXAʆAZd}AIAT3A)\)APEAˡIAnAوA= AhAʵAvAlAB`AAIAAVA ANbAeAWAjAj@/@Zd@@AKQAff\AAGAEA!A'1AAAAhA}?AVAz^A^AA`A@̸@@@Q@ ׇ@В@Q@m@?5@A/QAL7wArxAЕAAZdA AAAA#۹AtA-AxAtAwAȨAshAL7AƄAiA;ߊAwAnrA^AYAaAF}AVOAcAI,AFAZd5AMnA~TA+OAzAshA+A?5ZAG)A/A@̘@00KB1 B5BAAAOAAAnAX9B+Aq= BF B'BB)Bd;BjAA"AB= BBB%Bf'Bb-B,;BS7B,B"BjBrBBBBF6&B,B;BFBsHBOBZHBuFBBB;B8Byi*BBq=Bˡ,Bmg3B.BHa8B2B8B@B'@BLHBEB6B!.B-"BB)BEBfBף)B,B3B>BAB+BB&4B4B1)B5^!BBjBBbBBBS!B`e+B8B'@B6Bu3B5AB@B3B,9B+/B/BI$BH!B/]B9B#'B= BB!"Bo+B2BQ4B^5B= +B= *B!B\BBBs BBAd;A%B BBLBmBB;_BbA;A?5AMA;߿AQAAA ATAA94BB B'1BBPAAB`AAANbA;AffA5^AA"AD BFBhB&B}? B`BshB+A-AAAAL7AB  BB|B94&B1%B W BqBףBoB(AVAffABAL7ABBBD BBdB(BףBw>BBBB9tBŌBB`eB҉BuBBÏBmBwBoB BVBˡBˡBنB=BBVB\OBB94vB-2sB94uBtB(zB/qB^tBB`iBfB#[qBmBxBymBtpBRfByfBP`BTBWBYJB}?RBRBbNBRHB:By9Bw>BCABuFBSB]BiB#[vBոBBݤB?uB3B'qB?5BϷBRBLB ˜Bf&BB7ɈBZdB|BlBEfBZBUB\B\[BiB@uBzBϷB+B.B?B5BB BBJB BuSBB?5BuӘBbB6BNBBBB^:BB;}BjB?Bv;B/EBE@BmEBݤ?B)ABNb@B;B)FBK=BJBIBJBGB8B2Bj6B5^0BT-BI9BZ- MoQFA33mXwSI(HˡOB`?j?H:@d;?X@R!u '16(&JEwOCGF1 P)\?~b33{VMshXq=ITHڿAXkr(-?/U@w=TEb8@Te@v=5?h@{@$AGAmACAAOyA^aA-8A AnA'1*A-1AdAd;AuAFAAAASAAA+A5^AAAAmAXoA$2AAw@?5AA}?IAI|A}?A(A%AmAGAffAuAA!AJ AAԝAbAWA,A!A;߿@@Qx@j@@~@~ARA(~AZdAZdAd;AAAoAףAAMA{A;AB`AAJ ArATA-AA~A/AAA= kAP?AG5ATAlA`nAKA/VAAAiAEAB`A}AʚAAAףrA)\CAAF Aˡ@00A~AAzAshAA+AlAmA)\AAxAuAJ ArAHAZdAMAVANbAA&AVA BJB B$B%B1B.B"#ByBBB BBB1 B BqBBBs$Bp1By6B DBףGBwIBPLBEB?5BB;3BT-B2B%AB?B8By?B{3B0B?58B330B5B,B-2B/BBrA'1APA#ACABB B)BJ1Bs(B#)BhB=B33B'BTc Bj<B#[BBrBuB&B^:+BB!0B#[#BXB9BZdBTBHaBBZ Bu B-2!Br!B#$BC*B{.B,BBBBBshBkB\BSBBBB[BߏBBB-B/݌BB%ƎBŌBBoBBZB5BsB WB@BߏBuSB0BϷBB?BwBHmB/iB/]fBLoBlhBjB cBYB?^BUB[BqOB$OB-AB WEB=BHa9Bd;@B-T?D vHzC˿jjjtPG@Ԥ@tA 'Az`Aף`Ap%AxAο@"@P@@H@QAXA-A33ARA33AVAFAAAAAAyAEZA/YA1AAuA'ABAsAX9A/AAtA`AB`AAABd;BAwAA A/AˡwAE^A#A,AAEAA=A qAףA^AAAAAzAAA\Aq=AAzA{AZAAFAAlA̺AA+AwAA+Ad;A%qA\dAHAZzAVAPcAXAJ AB`AQzA΂AZA~AAZRA-%A@Ю@?0033aA?5fAAyAxA#ۃA&}AZdAAA(A{AnA‹AAAXA5^A AwAAάAVAIA+AAˡA!B B% BAAAshAAAA5^AVAV BB-Bw>%B)B`e(B,B%(B;_*BBBBI#B*BTc B!Bj<BfBmgBshB5BAA"ATA\AˡA}AAvArAMA'1AAAACBBABCBq=AAA(AQAGAAAxABRAAA/A$AAZdAd;Ad;AKAδAlA/AB`AshAL7AH B?BB/BB5^BBV BŠB5^BB%"B3*B$B BNBdBdBAAVA{ARAyAAPA)\BBjB)\#B$%B"BtBB BANBNbAZdBAAFAA94B33B%BmB/ BjBpB5 B B"AAGA+A}?A{A+AOATA\AQAZdAAHAJ AAAB`ABB= Bݤ$BŠB)\)BvBBzBbA;AVA33AKAAtANbAjA$AȪAOAAA+A7ɔBTB!BBbPBhтBHyBVxBH!B}BւBB |B}?rBsB?fB!0`BPZBcB+fBsoB&tBB`}BBBlB3B5^BBuӂBSB"pBiBwZBQBPBPNB%]BcB7`BiB"nBsfB-oBZdgBrBkBmBpfB-WBXBŠ]BP VBBVB\B@aBGpB+tBBmgB/]~BBoBDKBB7IBUBŠBL7BBB=JB/B{BXqB?dBshXBuNB}YBTBZ`BPjBBxB`BFBB馌BBNBy)BABҕBBۖBBwBמBLBBBffBBNjB)BsBUBsB{BۜBfBҘBBBBNBDBB1B-BZ$BB%ƏBmBɇBڀB|BR8tBtBhBzBրB)܀BvyBuB{BˡBrB(oBycB_BSBQBMB}MBjSB=RB]BaB94WBKBFBQOB#JBZB_BHafBqB#[uBBbBjB1BӍB۹B)BL7BRBBِBwBăByB+zBqB1sBkB7 lB#tBBB_BBiBxBB#BHaBB{ԌBZBBeB BBB/ݚBBB!?ҝ@@xAA5^2AA/@\@?ˡ5^/#E?Č@+n@/5@r$9(4L7Aj́q=z+xBq=.9b)%=9^+>gAmC&+%>vVXɿt[ '1V= tˡˡ-b#@L7@O@~2AffA@E@j?n?Ѿj @V@w@y(AtQA/AٚAB`AAuAFAºAxAٌAyfA!^A)\+Az&AA@@nA8AvjAAASA#ەA^A(AnAAxAbB1B-AAbAX9A~AVxAHA\2Am AAvAbRAbzA$AL7AjAA5^AB`AAmAAmAAL7A;ߒANbAKA AjA&AA+AAAAyAjAZAVGAh=Aq=dAGSA?5dAXKAnPAˡA{AcAooAzA ׃AQhAQ4A7 A@?5>@Nb000/?)\w@"@ @Z:A+An4A33YA$8Ap'AANb@A9@33A!AZ@|A@A+'AoaAyAiAAA㥶ApA$A5^AAףA-AAAAAPAȄAAԨA&AAAA}?AA?BBmgBBZdB B&BOAlAAAXAAVmA-LASA?5A@j@c@w@L7@+@SA'18A pAAAA#۵AzA&A7A"AAףA/A!A-AʘA ArnAIbAiAAAX9AvA.An8AEPA7)AGAV]A!XAApyA דARAhA+AApAA%AA|Ad;A-BBB#B7BAB`A/AA5^AAshAJ AshAAAAJ AL7B94BB!BF6 BB W B7 BbBAAQA33AAAAAVANbA ANBrA~AAAlAAAJ A= ATAZAjA¬ASA A+A^A+AMA\AAA\ABBdBBAjASAˡA㥪ApArArAJ A]AJ bAgA -AAAAd;A1@F@>B㥕B}?BL7BBBj|B+BiB!pBD B[ByBBBBmg{BJvBS{B^yB$BNB?5BoB*B=JBَBAB=BBNjBBRBVxB`uBP uBtB؀BNBBP B;ߌBm'BoRByBmBPBƙBBhQBByB}BZBCB׊BNBiBHBmBB$B"BFB^BBBB&BTB`B94B7BBsBZB馅ByBPyBuBXtB|BjBB BB`BwBVByiBߛB!B^:BBZ$BBBbПB[B̢B.B;BݤBB/BtB继BQBBoRBqBẨBעB`eB5B_BUBBBmBBBɶBәBd{BpBB%BBJBP͊B쑈BB{TB=B5B5Bj-rshqd;/4@5^@v@l'APA}AOAVA= AXA9AA\@sh@/ݤ@T@Ԁ@a@Z@@|@?5$A-Ax3AHAz0AVA= mAēAOAAGAFAAAOA\AHxArNA#AE@@}?@@n,A(0AiAgAmAEAA)\ANbAʳAq=AȑA&A+kA cA;ߏArANbA9A~ASA㥗A~A?5xAiAAAQ A@@#ۥ@jAO@33A% A"A^GAZA#9A7WAAyjA~XAff"A@w_@9@ 00MKT?%@@It@T@@@@@@@E@A8AIBAPACAo@33AKA+*AK-A9*AWAh]AA%AA"AAVAA(AҦAEA`AAZAAףAAGAףA#A`BMAˡAAADA9AsB?5A;A33A^AJ A5^A&A1AjArLAO/A@u@bh@C;@d;@Av6AjdAd;A¤Aq=A7AAAAlA(AAxA`vA^eAMȦA-AujACIAZAuHAbA"@xAQ@@z@@  A;@+5A!q=5^R'1E9xn םvu㥕b~-CS#~shTz,)shIRj+{Ζ٫DSNbHPFuX9LxVtAQ~2h{(L7 ׫ˡT{`YP\̑Nb ׅL7pw+r~V}?+ j0O(7vV3u)\7=P/ʥĿ}??h@F@@&y@^1@X9z鿺I,p?^@ Ad;5A`AAA|A#۝A+AfAT;A(AC@!@v@@?Q8GA@X@@AA~>A@ARrA7AAHAMAA AAAHxAEBAIA@+@7@}?5Cl?E^@@shA&CA{A{AAĠA1A|AjARAA?5NA$LAX}A$nAJ A ׃AAAAcADASWA#5AAq=@ƣ@b@@@Ay@h@t%AV7A  A AhKAˡ;AshA@$6@ff|D00l?&@@ґ@X9@^@A1A$A7AAI,A]AoA&AƥAA ׌AcAiAPSAj~AwAd;oANbAOAlAȳA\AA{A"A~ASAA9AA!AZBB!0B BBZBp BY BEA?5BANbADBVBfBDBrBBHaBuA$ANbAףAuAAZA(bA/>AAG A"AXA^AЙAEAFAoA`AA?5AVAA'1ApAHAĠAQAd;AAAAuArrAhA+9AE Aף(AVA}? A5^@@@/AJ :AUA}A)\AoA33ADAArAmA'1AAA33A&A~A?5AQA+A?5AțA|AЂA+hA҆AԕAzAnA-AA7A)\AQAAA A1ARAPAAq=AA+AjA/ArAAAAAvA'1AAAHAףAAXA;)A+KA 1AQVAyDA'1FAף4A%AZd@J @Q@AAu"AWA$AAnAMA'1A?5A!AףAlAoAsh}A9vAj>Aˡ-AuAAm@D@@Ȃ@O@Nbx@{@@t@dBBDBB9tB=JBMBB ׌BB#B+BBT#BBB'BB+BDB^BZBӍBBB/BBB$BB1BcBBBTcBփBmB7IBBĕB.BBTBBP BB94BBB]BB{ԊBB?5B`BoҎB5BB;BVBWBjBљBD B7 BB3sBݙB;ߟBBTBB/BBrBBBB̂B!0B^BhфBB%FB͌B+BB7ɦBB'BBT#BBbBH!BõBݤBT#BvBBuӱBuB?uBBOBlBFBVΫBīBBB'BަBB BB$BoRBBFB;BؤBFBBBYBfB5ގBLB?uBXyB`BZBB吔B}BhBPMB}BB=ʁBɁBuBtBnB%mBtBtBfBB{BRmBd;pBkzBMxBmB؃BsBߏBB}?BB?uB&B/B5ޥBB/BB/]BX9BѕB,BLwB۹BBpB33B;BBoRBB}BB>B94BJBJ̎B֕BBFBB&B5BbBDBB-BB7ah%9G~Bx~"WmlI&q= HEoyPCG= H(D`Nb|+G! )\Zd%!IQFKT-t33l73"kX9ZףR+K++AKQ%V1ƒusZCDFr\wffN+IyZdVn+lPG uC)R1L7 F0|h"[)>m@@FA9AS=A%]AiAyA#uAkAAA4A(@@+AVA0AAFAS)A}?+APAˡA&!A A|@M@ף??@@t@> K%@z@!?~>X@X9@m{= GK7 <Zj00@@q=@v@-@@I@T A@S@v@7@AX9A!8A>AVAH@ף@GASA+8Aq=HAMA+AA'1AuA;AlAףAA+A ׆A7AA1AxAq=AAGAAuBBAIATArAˡAjA AGAAQAAB`AAAMAhAZdAAKA eAM6A0AK@X9@AGAAshATAA̴AA#ۯAIAFA כA/AHrAB`yAAVAFANbA/AjAA&AA#gA+bAwWA[AWA335APAAҍARAjAGAҪAyAB`A9AA AˡANbAq=AZAtA&A33A-AQAffAZAAA33AʓAnA/AB`AxmAGAˡAA A$AyAA?5A|AԼAȨAA~AA;ߧAnA&A1AKA= A1ApAAףAA+A A+A= A1ApAXANbA;߇A5^ATADAA}ATSAv\A`BAQHAEVAuAԙA#ۣA/AAAjArAlAVAtAAA7CAv@A{HA 3AV@M@nA-Au.AA#A;AABôBSBR8BaB+BUBBBBB\ϢBLB%FBBuB]BpBċB94BBޕBDB7BBVΦBBBBΤBB}?B"BёB7ɊBڄB5BEBDB^zB%FBBB'BXBB+BB BBB-2B4B\OB`B쑅BBF6BB BBBF6B'BB*BףBBB3BB6BQBLwB!BB-2BRB33BƇBB吊BFB>BHBw>B^BTcB!BBẨB%B˴BZdBmgBoҸB~B_BZBL7B+BTcB!pBD BWB\BbB8BBwBB۹BBNBBBB3sBºBDBB`@@@AOA1AI A`@@aTȖFwy6Nbp?G!@lG@H@@T AJ R@= @L7AX9AG9A 6A UACWA/UAFA(AT@^@@@+?C@D@R@@AA Aˡ@d;@B`@F@M@B`?O<'ڿL75^?Z?Ȇ+?\/e+=)\k00Fs>?ux@b@5^@©@Nb@Nb A{@@u@/@= @@KAKA ׯ@T@@@;@DAh5A4A+iAjAZdA7AoAAjAnA\AāAMAVA5^AnAZAΧAAjA}?ANbAAAZAxAAlAtABwBL7AA9A&A|A)\AԡAB`AQjAX1AyAV@K@}?-@-?@C@%A#IA33AٗA%AAAΰAEA= AZdAp}A'1lAVtA]A(AbAˡACUAOIAaA|=A AX A AVAףA33A A :AV3A-dAxeA"Aq=AA`ARA-AEAAٶAshA(A|AA1AOAAFApAOAAq=AZA!|A5^AwAVA(AٺAQAAABB~AA/AAA33AAADAuAAA+A-AmANbAhAAAAEAffAĚAxAAAlAA-AQA~A"YA33kAq=XAIlAh{AA33ASAAAףAAA A-A`AFA"Aq=JA+HANA6A"@/ A}?+A@AO@ @|@Σ@'BBBTBޛBBwB?uBd{B5^BBنB#BNB+GBvBuBpBzByB'qB쑆B;ߌBqB)B\OByBj|B%BqBB;߆BZBFqBhBbBHaBmlB|fBFpBuBI~BBDBFBBB5BBshBXyBw>~BՀBy{BzB~BD~B)܄B-rB2B^B`BhBbBCBBBBdBB33BӍBBƎBBBB{}BtBjnBzBxB:BTBoB7BԕBBӚBB#BB{BBUBdBDBBByiBBB{BjBLwB:BP BӍB{ԫBVNBõB۹BóBRxB%BBshBXBXBBٯB绪B3BoRBBݚBٓBbBϷBN"B)ܛB5B BϠBwBFB%BõB}BtB5BwBBXyB+B9tBEBBjB BEB94~BBރBD BbBBB؛B!pBy)Bq}BѮB7IB;BBw~B7 BBhB/]B BڣBqBƜBTBqB>BBB-BÞBBBɠB^:B BۛB^BJ B'1BBB3B٭B1BާB'Bq}BB&WQt&x1! (0^cyKIK$DףcZbF_shIFKOApi^\h|/o'1m) ZPL7shή;ߔp ^R$7;#wȋpB`)\d;mL7jSC Fj-7Hd;\bv.Bw/xt^1ԬCt1y@t-q="$R'1^Nb/݃ԏ kKKAZjԿ ?@sh@shq@j?q=/hjSL7vĘzJ b?t?Ԉ?sh?u?@@pAj,AKgA ׃AA_A-TA)AZd@Q@J ? ӿ/=X9(r(d;??@ @@h ARA*A>A`4A^A;@= @F@R^++6??@X@R@p@EAh@ƣ@}?@jD@Nb>sh^vz\z\{/ݴ??ݿIL$?$ƿ+_- @rh!00F#9?/@Nb@E AˡA)AHAnA'1*Aq=@33@G@+@PA'1 A/@A@9&AJ .A'1JAJA= 5A?5^A]Ad;ANbA˜AQA?5A̍AoA/ݔAbAKAd;A|AAAffAAnA/AXA AXAPAAAABAA/AMAuAZdAMAeA)A-!A @^@n@l@v?nZd?Nb@@%Aff`AX9xAAAEAHA A-A㥙AA{AAJAPcA;QA%?AshAAS@7@Y@ @T@@@B`]@p@@K@T@M@Av$AwWAd;ARdA+ArxA33AAzAAOApAAzAףAJ AAA{AA|_AЁAuA-A"AOA}?AlAjA(BB'B`BBBbBxAPAuBshAHAnATAjAA Bl BVB9B/ B9BBX9AbAEAMAVA!AbA'1A9lAGA&QA^1AiA$vAAAAApA\AѢBBEAMAAPA'1AA`A7wAȀApAVCAS'A +AX9A/@@p@y@nR?ff?L7B#ۇBoBBT#BBX9wB~BոB)vB uBQlBoB{jBmB)aBDWB/TBOZBw]BfBtBuBBf&BBBB*B/BmgBBvBkiBcBXB-\Bw>cB%dBqBb|BB7B!BBABshBmgBѢB BV~B-BXByB)܃BXBB>B3sB'1BֈBLBs(B }B|B-rB}B&|BńB1HBmgBBB^ByB=BX9yBuB%mBnrB'1iBD uBxB#B9tB;B BݕBcB}?Bd;B4BTBPBBTB-BwB^BBDB}?B0BA- A~AC@b(@t?+9uB}?^33팿xvF@j@@yAK/A@u@"@d@/D?$?@n@J @P@lA|@A@9@C?+? {ˡK 7?5PtsD<@Q0@>M@^@#!@@l,?5V900X9P?)\@X@ A@5^A&;A A= !A-@b@jA1 A5^AGyA'1A#۟AXApAZdAA+AEAAGAAVqA㥉A)\yAsAGMA4A(AˡAH@ @w@@^AO@©@ ׫@@% A= A^OA-hAAnAAJ AjzAAVA1AA7ATAjAAAASA(AKAA;aAA#ۘAuAƦA¢AQAZAAd;A&A%AA{AKA5^A1A{AbAATAAAAtA BIBX9B BxB|AA%AMAA#۟A!A)\AA= {A#_AHA 4AAΧ17S$00L7ɿRο?PO@@A'1A4A1@$A@p@@"@X9AEA@Nb$A}? A=A3Au@A@AnA;A$6A+mA5^A/ݍAƊAtA1AAAA"A|A-AAoApAVA"A$AAffAAA&AzAq=A+AAKA= AAtARAjArA-?A=ArA{Aף@@^?QL7 ?NbH@y@v@.ATiA|A~AA1AоAoA\AGA~AxcAO;A^WApEA 9AAE@@?5@!@K7> @ #@u@bx??sh?{?A@z@9A%A"WAdA= AA mAF]AvA#ۀAOAHAL7A&AAhA/AmAAZdA LATWAp;APeAlAQAA לAAAAADAIA ARAvAOA)\A33A?5B1A AA#AASAˡA)BBBBshA?5AKAA%AAxAAd;A\A?AV!AAA$Av@AaAKAA AhAA= AX9ATA A/A㥯A~AGAjzAANAr^Ah?ACAo@ @ף@P@= @D@R&@>^)?;B{B٘BqBd;BBBB|B1BZBBNBmgBcB/|BYwBtBxBRB=B}?BN"BBϷBXB9tB'1B+ǧB̡B!BbBԍBeBkB9}B}|B>B$B͇B΋B'qBBhBBj|BBXB#[BB5^B'B7 BBFB B+ǐBBhB!B#۔B}B`BB}B ‘BNBjBF6BBB;_B_B{ԜBBYBŽBgBBXBB绐B7 BBBBBqBshB%FBϷBNB B)BBmBIBBBBBXBBȶB'BB}BkBVBP Bw>BBs(BBMB#B5BABBNBվBBjBiBTBZdB1HBBjB+BbШBLwBB B7ByBwBB BõB`eB^:BۤBvB[BB{BJLB͌BÚB7ɜBB5B9BZBBRBBBDB=BBBƷB综B94BqBBBB`BRBTBHaB#[Bd{B)BҪB%BŠBXBBB BB/BjB B^B-2BXB`BJ BZB B1B-rBq}BB+BX90Ym m#o @^kMZdn '1x 33}/VM`BNbL9JHPL7QwV^TVԠwh;_w ˜R8wVPK GYash/ݡ&RB`;?5Nb\ƒ‰A+X9Zd'1x/ݵZd~33HVAffcZZdh9;ߒƖIZd33^(5^~Zx!?5S^OQffbsh"y)\Q&-yˡv>>R@y@@I1,~A(#B`S;5^`尿;ڿyJ ҿI̾D@@T@n$AP-Au A/ A-@@|@n)\Rl+?5O= ?n>E>@v@Zd@bAE,A@@D@$@!׿h?Zd@@@r@v@Nb@5@%?վW &7X9 XzDJ R/p??Т>9@=IjB`D ף6e009@@ˡAZd9A%sA|AXA$AbhAmAT9ABAw=A;AףdA"oAzJAbvAVAATAyA|AAAAAįA-A5^ADAAAVAˡA AAvAȤAyAAyAAA-AMA Aq=A-BTcBA BBByiB! BJB1AAA^AAKiAmkA;A6AyAnAK@k@@@A&#A"YAćAIAףAwAAZAwAAAFAxAAOAL7Aw}ASWAjDA1AuA@@ @uAFAx@P AK@@d;%AApQA"QAA= AףA7AZA"AΧAnAA$A}?AAAXAnAZdAXAzAAPA1AAAAA-A}?A@BKBp BFBB"B5^$BQ,B!B'1B% BR8BqB& B5 BA BxBBŠBTB B#"BBB BBAA A9ASA(AʏAqAKmAzAAPA?5AAtA-AbB BvBBBXAffAIAAˡAAA#۴AZdAĐAz|A"AB`aADA=An"A|AB`@@zBDBoRB#ہBsBwBnBbxBuvBP sBshxBpBrzBףqBpyBsBhBqaB dB hBZdmB'zB/BBy)BBjBBfB}BBшB Bs{B!|BuB${B؁By)B_BHB!0BӘBP B7əB{TBӕBBsBBByBBB:BB BBCB}?BBBB+DžBBBq}BףBB'1BwBqB#ۓBBB+BɶBBBnB{B|BdBBB'1B-BZBlB=ʓB;ߚB5BBؙBbBiBoB#BP͕BBHBҠBB:BˡžF?@\@!AX9*A\>A!"AD@u@p=@9H=^F/ bTNtI F9mnB@H@@XAt?AKAOA@-@~@q=r@F@T A!Aˡ AyA?5@b@Mj@??o}1uy~bxȿ1@mk@Vn?= G@?5@!@ @r迶o!<00@OAQ0AGQAnArA AxA33{Ab~AJ VAbbA}?{AmA-AAAhAIAZdoA ׎A#ۍAnA5^A33AFApA'1A-AAAA+A7ADAA7AxAA(A&AA/AZdADB% BMBbBoBRBBB)B--Bw>'B}?BB7 B\A5^AFAAJ A~A A}?A= OAFKAA@9AA4ARhA/݉AzA AwA;AzAAbBAAXAyAAIAZdAЯA"AA9A/APaA>Ar,AXAˡMAbA1AV:A?A@AuA?5pAAOA}?AA9AVAA;AEA7A\A{BABnA/AA^AjA ״AAAIAAtAAAABB-BB'#B*BPB#BDB|"BJ B"B&BB7 BB7BB-2Bsh)B+Bu&B,B-B= $B!BEBH BBDA/ASAFA5^AOAʖAA1A(A AGAJ A!AzA BBmg B!BvBB{BAAMAAGANbAFAAAAAUA-nAGAtMAAABXB^BB@B-2wBd;lBsBq=yBtBE}B@xBq}B^BHBd;xBlBgBGkBmjBpBk|BpBB+NjBuӒB[BؒB˘BR8BB}BhQByBtBqBwBBBBjB'B-rBhѓB5BR8B BB‘ByB,BوB{TBeBB WB+BBnBBUBݗBBLBӊB;BB2BBfBWBBXB?B/ݗBaBD BaBB}yBSBPtBzBj<BB!ByBPBj*sh 6Ed-XI{jm…AK}?jzЂjNb33rFu)¢E!|+{,.¬ JHaVHJ \/?5Z/--) } WB`Dzž = QrX9~y  7 ˡX9q=?5u)\SZ7oƫVҰQyH-|m6GJ ( Iwd;yRJ VH|?@r@l@ ?xiqwm'7~@tEe =9(X9VjLC=#I@;ߟ@@ AT@@y6@GJlzTs/~-I.rNbpff>X9\@"@@E@԰@;/@#@|?#1@RF@x@?@^@}??V?ZĿZLpU#L7 (EH!67u}?&!Ev~h^AףGI+[00]AyAwAvAA1A9AAˡADAȨAVAAAAAЛAZAFA+AL7ADAAZdAAAףAX9AAAˡA!A AOA"BBoAQBAffAˡAuBxB B;BTB%BB`(Byi$BV(Bff6B^:=BM6B&.B}?*BuB,BNB?5AtAmA7A9AbA)\AhAfA+FAFA-fAASAA?5AwA%BjBYBJBDBJB\B\A$ARAAAtAA`AʢAvAA|AuAQAbAAAlA}?AjAPAX9A AAASAAAˡA'Bݤ Bq=ByBC B|B1&B+BBBP BBxAAAQADBFBhBAB BP &B3B=BB>BCBݤ6B?BYBw=B%0B),B7BBB+Bq ByBJ ANbA~A AshAA%B BD BX9Bo)B1B~=B!0?B-22B.B( BB7 B-2BqBHAjA"A1AAHAZdAȴA\AyAwAAYAtBBB|B=|BRnBeB}?kBsByilBpBlBuBnBhpB-jB`B^:ZBV`BcBBeBPrB)zBBBBBBBNB2B{BoҀB-uB^:uBFpBzsBo}B!0BoB?j5^NbB`"}?;AS_7 w>M:'1}?+xrff;߻l'1Hn R.yj{f;ߊ00pAAҜA/AAjApAA)\AAGAAA^AˡA~ArAASAFAȯAAjAApAA{AP B( B BOB}?AHA+A A AAAAuAˡAB BBB?5!BP#Bh.B(Bx/BB%B{(B.B8B8B-B)BB-Bq= BffAwAA(A;ߪAB`A$AQAd;uA= aA uAAQA^AAAAPAu BR8B'1BRBL BNB9B AnA/AAAA ARAA{A%A\A}?AbAB`AA-ACA}?A= A+A+AAdB BB B^:BB5^BF(B0B$=B!:BB9B/B+BXB5BkBB9AAAshAyAA?5A/AuTA/oAAKAFAAAPA{BBBwBL B! B|A+A?5AAX9AL7ACAIAyAbAffA'1A㥓AAARAAAX9AxAbAjAAjAbA%B-AIBB BA BZB9BI)Bq=$B+BHB!B9B33BJ BKA{AOA`A;BtB7 B'B/B'B;_5B!ABˡCBJLB#[@BBB>Bu?B8B6B8Bff,B}?+B$BףB'1"Bף&BM3B%1BK0B :BBBϢB+BnBABʠBBPBBB[BsBMBwBB͌BDKBJBsB!BBYBXyBsB+BjBJ BByBDBBIBLwBjT?@`@A@@q=z@nR@`P=wF+@@X9@O@o@@)\@{?ף ۿQ0(|$9muh+?V= P-zHo00NbZAoiAAOAAףAQAAQAҹA-A١AʬAZAAmAAVA°ArAAAA AAd;ABBVBd BFB B$BBz BByBjATcB#BR8B(B B+Bt(B0BV+BJ2B)\.B 2B)\?B IB>BBxWCe-24(@^cCTmGF&`‰‰+n#ۧGR+n'1( 1++Z.w"ˡD J jȵV+ȪS= H#[w+ ´H/] L!VC`VV-zX/-\%vTҲRZdμn-L75^5^Z:+ LRdrQmZdw~X{(ף7L7ٿn?zD@@½@ff>@C >LVR+%7AHT;sGD$wV&wgףx@T@-@OAAOA@33#@HZP/VQZ̃s->xX #L7>Sc@/ݔ@j@'1@j@!@~?Nbv??5^z@Zd @X9T@㥫?;߿?v^)\'#`u;;$.ZdM)\O=CDhZdNb}?!(ew?500L7QA~rAAvA-A+AuAq=AAq=AyAAA'1AAA1A?5AjAxA`A AXAjAjAd;AFBR BG Bu BPBXB$ATB BAAVAKA33BB{B9$BP,BH)BO4B0BR8B9-B}/Bu9B)DBD =B6B3Bk$B%BBR BB AGAAIA}?AHA{A+uAA+ApAA"ABBBBZBBBBDBtBnAAMAˡAxAAZdAˡAZAAVAffAAzACAvAuADAjAXA"A= AAŠBJBB? BBBYBB!B(Bj*Bl1B W$B(BBB{ BjA9A= AxAoB/AHa BABBJ&Bˡ5B?B5^DBABh4Bj<9B.B4BT1B+B`e/Bq#B)BL"B^&B&B\,B8B>B7B >Bu;B#9B5B5&BnBMBv Bj<B B B`eBCAAEA'1AArAABBBZ!BV-By8By>B1BJ4Bu&B BwBB5^B}?AAVAVARAAнAA ׶Ad;A٢AATA`BBT#BBoBmB'{BhQBBTB/B/]B͎BxB!B=BB)\BBuB*BuӆBBBB܉B BZB BB5BBHBBBLB)\B)BPBףBq=BPBfB]BqBF6BBdBĩBNBCBq=BήB BBţBȡBoҠBB&BjB;ߓBޒBEBBBףB|BBf&BZBڑBBBƄBs}B|BӄBBB;B?uB0BBvB5ByuBshB/dB\B]B!`BKaB'1iBmB|B׃BBpBukB`sB lBw>vB#[qBoBuBqBoyB݃B!pB BbЗB.BؠBTBӍBBBXB{BL7|BR8B"}BlBB3sB7B5BVB33BBBBbB`%B;B9tBH!BǣB#BޜBBqBBBuBfBLwB`BӴBXBB)BBBXBBNbB'BbЗBABLB`BɶB/B{BBiBBHBɶBf&BBBBNB\BBXB B-B%BvBͥBZBBuӜBŕBBH!B-BڑB BBB33BBZB9tBTcBݧB1HB3BBBD BqBBBHBBpBBoBJBB\ϮBB'qBYBZBBśBd{BN"BBBB BqB-BP͜B^BǗBYB۹BPMB@B-B̄BB}?B}?B1B\B\BBuSBB{B7 oBuBTclBnBsBtyBրBB#[B@BJBZB1ȆBÈB؃BHaB!0BZd|BNBRtBwBB;B=B!pBPBB쑔BB;BZBrB~B5}B"BuBw>BݤBRxBĖB-2BBjB+BBBwBMB\BBVNBB΄BB)BBmBw~B33BT7P/LwD'1ˡA/XL7EjODnr`}?'ffˡx #L7/!'1PfjJ ZˡC$K1n̙I`:OrRS8?5dԄK$7j5^9VRē79oy1O}Ԑnl#W9`^;33=sh mVR>()\3.F">@?5@&@L79@XA@F$6Mw߾V@@ A'1DACUAzAʋAˡA|A+AAH`A#+A(A@uh@->)\#IӾ +?e@ @@-ASAASaAAjAAA}?AhA!|AVOAVAO@k@y?(ffE!z!j5^d;?@@q=AB`9A7ASqA|mAVAbA{ApArA(>Aˡ;AmeAnLAPyASWAJ ^A8A=A= +A Az2A7A AV@9@@@ˡ@E@)\G@@@O@@^@@E@o{@@ƋfV00lwAqARAنAAA"AOAshAA{AzA-AtAIA{BABd;AAAIAbAAApAAoA9Bd;BFBd;B\BhBB+BB(BX9#B%1B.B'=B@BNHBTEBLBXOBXDBIB:B/]?B/5B4BP>BJB=GBJJBKB&AB@B!9B@1Bף-BN"BZBq B{A?5AyA1AԲAAAA& B-BM"B- B*B.Bx4B.BD &BBB BVBw>BB%BѢ BB"AA9A(AAA㥵AAshArAwAhAAAAXAHABVB(AAvACA-A\AףAbAJ A= AAhBoBX9A&AlAq=AAd;A`AA~A33AR8BHB;BjB Bw BpAA$AA\BTBFB;BBoB%Bff'BB1B BíBBBPB;_BvB BBBL7BkBBߝB_BkBwB^zB0BfBVBeBћB)ܚBBTcB WBB/݉B΂B3sB;߇B1BBǏBċBB}?B/B~B}sBThBSjBn_BdBdB\iBd;uBwB)\B3BB%|B$xBIzBArBVyB^:vBhrB'1xBvBCBB`BFvBŠB=JBwB)BCB{TBٔBB>BBnBBӁBsBѢB%ƊB BYB!0BR8B#BZBJ B BZ$BBq=BhBBBB%ƘBBB-B8B{fV-^ju&IX= G= M1 CNj2Dj&m7G1+c|o|33ZJ ;33|B`+Z%q=jjr+mSx'EXL71TQ|rMZ|?5}?hVoU<@-q\V#eO3`>jlXMr<s-{M&/΃AHV-q=>ZdK t/ݸ̜}?ſ@`X@Zd@Ap/AjjAzpAAVA"A^wACA A^@@H>MR+(?#a@z@pA+??5@x@~AA1@T%#y``@9@@wµjB`!tK00ZdA|A1A5^AAzA'1AA;AlAAAXA}B BByB/B5B BtBBSA= A?5AABBBPBFB"B+"Bt*BѢ5B3BBB.=B7FB-FBNBmgHBJBLB5^BBEBI:B=Bq1B#-B+8BPCBw>FBRJBMB DBDB33:B3BD+B`e BuBB+ BmAAmA/A= AADAr BbBm!BB`#B/B1B;B\9B.B'1)BBw>BBBt B94BdBAAAQANbAzAҼAԩA%A~AAAnAffAJ AnAA/AˡAAAyAA+AAnA1AZdAAGAKAA;A'1AQAjAAAxAQA-AAGAGAw>By B'B+BAAAAyAIA~BB{B B#B!BV%Bd;0B).B+%Bsh"BݤB/BJ BAA9A/ݢA;߭A\AOAuAAVA7cA/ZA`~AlAAEAVA= AABB%BBj<B B1AyA`AA7AjAhAȂA}A㥆ANbA\AAACAPABBBB}?B{BhчB'qBjB@BXBq=Bw~BBBBvBoB2BBfB߉BƏBzBB}?BB~B#[BXB3sB"B9BBF6BhѐB BBZB_BǝB$B\ϩBD˨BB`B%BBףBuӣBkB_B)B'B}BsBoRB-BlBhBN"BlB馪BRxBB?5BkBBB%FBB2BBj|BB/]BBeBBB׍B B)B-BBuӘBbBBBBB㥧BBBhQB!pB,B"BB!B9tBBBsBBB%FBBBѵBuӱB=JB`BFvBBVΫB^BBqB+BHBBBBB{ԥB}B9BBBNjBABnBףBB`B¡BVBxBWBD B(B}B\BBN"BBsB*BBX9BBBFBˡBaB$BBCB)\BHaB!BB&B6B͜B0B3BD BӮBBCBXB~BBBߏBJB;BoBBϷB君BBB^:BSBBB+ǓB'BH!BBrBzBZ$B33BTB֞BӡB͌BإB|uSff j/ O A&i;ߐjz{SP/O(AzˡMa|- jףIBSmupĔffvzy&`KY"PjHM&IB`n^ApCZdshXNbzvo~d;= q=|X9oJT5J 6Ce{\#yDPX^'1~^{)\~XYF}?'1OO=1-DA}?(jtq@̼@QA:AˡuAcADZAG#A@!@@TeX)G|w/ſX @|@~@vA(A7WATA~AA%AAGA~AeA|?AXA@ق@v?%#X9< C?'1H@G@q=AAAHAA:A WAERAMZAGA&;A#A@vv@`@?5@C@@Լ@+AAA^ AAF%A9A?5@x@~2@(@V@H@b?@bGA?A?p</ݾ)\XlG'1ro00AGAZAAAHAʻA#A+AAhAAA;ApBX9ByB7 BAB AlAnAAAnAB\BuBZB.B#BEBj'B\2BP)BA4B-BB:B9BbGBDBKBMB7 DB)\EB9B8B4B/6BqEB WLBsLB}LBVNB'AB^>BO7B0B}?)BFBBR BIB%AlAApAAAX9AHB)BXB^:B+Bu0B7B)\5Bף(B#BB`eByi BB1BBBATAzATA&AAyAB`AAAACA#ےAVAmAA\A|ABZdAAjAVAARAAAuAAVA AyA&ANbAףAAA{A?5A#[BHAASAnBrBrBffB BHaBBKAABDB BJ BB BB(BѢ'B 3Bף?B"=B/2Bˡ2B/*BBBBABAAAA/AAA&AAăAr|A A㥗AAλAAA B B/B$BBpBPBZBAAKAFAnAIAAAANbAZÂA}?AL7ACAzAB`A BVΟB BhByiB/BBBLBj|BR8B+GBIBBBuӘBy)BjBB7 BuBBBiBBH!BȩBҪBףBBBB/B]BB7BB94BBfBB3sBpB BB7ɮB BẫBbB֝BݞBsBwBB#BPBB`B+BB BBBXB^BB-BBBsBìBw~BBOB9BBZB'B㥝BkB7əB\BB9BB+B!ByB.B'BmgBP BABXB BBR8B;BYB2BFB BBBBӸBfBRxBBuBB-2BAB BiB׫BBsBBw>Bq}B3B-BB+GBj̼wpuˡž+>Vv@w@ A8A KAAAnAZAA㥱A?5AADtALANbA@-u@5^?@?-"@d;7@j@Ash!A5^:AaA~JAq=jAL7mA33A;oAZxAOAB`;AP@sh@GA= A= 1AA&AAo%At7A*AAIAA@A2Av@%@sh@@G@V@I?E>yf@G@Nb??5?y.@#Y@B`H Դm = +J b00 NA@AnpAZdqAғAAA AXAAhA㥱AAAA}?AIAAA-Ad;AGAAAA{ArA^AAAAB BE B BhBBB}B+!BshBu%B*BF68BJ2Buyf/I EB`VffshoEjaSG%oRi" y!@Nmy҃x/ݳTxylx!`&1= -(I4ESV=gVƦ ױZd&ЧzD"Q}?ף)\~Kktxq^3- /1/ 7!4+S+/*5^h#Wn@$ q=/yƿb@J@15^yQؿȶ?@@%#ASOAA̕AADArA^Aף^A#AvAI@jD@}?>-ҿ;Zd?u@T@AA`BA= YA1A םAoAAAAAoA ׇAZAO'AA/@D@@`0?L7?/?&@X9A-Aq=BAqAlA+AAAĖAQAB`Ad;yA;;A+AFA%;A9pAGSA|A!bAMhA|UA~BAMfAˡUA6Aq= A/@9@Am@@/@Zd[@@n@h@shq@@@_@Ȧ?9V n*00@T@t@J @&AA#AZA(RA^aAaAjbAB`A/AbARAFAVAԌAHA ׋AjA#ےAҒAuA A}?AX9AVAPAA\AffAA?5AA1 B, B1B}B%BshB'B$B-2BZBB3 B(BhAVBrB~BŠB(B3BYB BR8 BTBAAAAJ ArAAA)\OAףVA"yAmAAFA&AjAA\BshANBffBAAEAA;AA"AATA1AyAAAhAףrADlA1`A5^PAGAAtAA7QA}A'1A צAAnA"A"AAd;A7AAA+A7AA(AA9AAPA)\AMAҜAoAoAhAshAAAffAOARAAAAoAOAJ ANbAyA٪AlA)\AbA33AAAAOBh BxBA33AxAAASA&A^sAbLA^iA= QAyA^UA_ACA1&Ah A{AA'APAZxAȗAq=ArAAA}?AnASAAPA(AffAjAff\A-DAT9AA@AB`@;A@'A  A"-AHB}BP B)\BNbB#BzBoҜB-BڟBxBBDBJ BuӠBNbBBB'1BZdBd{BNjBšBBsBBCB[B9tB̮BpBBBBX9BffBByBFBX9B^BBmB`B?BCBBBОB%B%BBffBNBB@B\OBBR8B)ܰB'B.B?5BBZ$BӍBuB B}BTB9B쑴B:BְBB1BBB#BfB)BEBAB7IBBoB+BB9B}BN"BEBD BĽBBBlB"BHaB7B?uBfBBdByiBrB BVNB^zBjBB{TB&B&BBףB!BBBB`B ¶BoB\BףBǥB%B֞BB`B*BB;_BvBѪBjBګB@BN"B9BoBѢBXBsBB`B.BHBBךBmgBd{BZ$BhB쑓B;B B B-B?B{TBuB^BصBոBмBTBոBeB BDzBVBBˡBB9BB5ޢBCBZBBwBRByB߮B ¨BڦBBBBBNjBB/B[BhBBF6BBnD6 ƿffvGLd;71F= M 9p+pnJ ^/ݬ mOsP+ tףXI#ۂ^d;3ENb"jj91 V1zd;AԺNb#NbX רFu#)\hff̛h{`KףB{jRiLId;+tSףtZLQX9m}u Vmc>@M@F A+EAhAXA/tAףTA&AA;ߗ@u@>'r0GR=;o@;ߧ@h@xAK/A^A"AٚA£AOAoADAXARAVAIAx@@?w?TSc? @Nb@m@x+A&5AdAuVA}AvrA= ANbxAIVAVAL7/Ay(A}?=A(AAu@C[@M2@%@X@>@m[?F3H2@Đ@?7?{>@/?KǿA`~-y@Qr00\@1@x@m@&@+@)\)AUAoEAsAPgA}?AИAVA= AAAAIAjA33AAA}A!AoyAAAbA-AAhAAABKBw BR8Byi B B|B@B'BoBB1BD BvBvB BBBBB+B B5 BBvAA`A+A33AOA-Aw{AGA9NATA$A`AL7AuAffAAL7A}?A BBTA~ApAADA?5AKAHA= A"AvAHdA7uA EA A-AV@7@?`p?y@M@AQTAjA~AffAtUASAl%Al#A?5ARAA!A(APSA#CARnAkAToA1rAA@A]ApCArA~AI^A)\eA= aA҆AOAzAL7AAuzADA:A$A~8AOAfADA㥃A9A)\A%AA)\AKAPAAQAoAq=A㥋A;cAH6A+A= @j@;ߋ@@/݀@@Zd@9?SC?^>T?-5@(@%AIAAȊAQA"AMA9AȨAAwAff>ACKA-A AO@7@R^@V ?> >~@= ?@"@@@бBBvB BPMB BmBBLBfBBTcBBBŪBmBBBTBj|B`B BsBBӍBBBLwB=BTBVλBshBPͯBBBkBBmgBBhBZdBgBVοBBB7BmgB͌BB}B@BB;BBB-BعBB5By)B#B}BB̲BBF6BkBNBbжBB߼B%FB͌B3BõB`BB%ƳB B!0BrBBBB ׶BӼBLB%BBoB\B BHB(BDB%B\BBB\ByiBBBB'BBSB BBR8BJLB1HB#B BBuB-BB1BBvBqB0BB;BBͭBB?B̯BB B-2BaBBB|BŵBR8BXBZBLBXB5ޙB-2B$BFB,BܟB1HBBYBBB9B!BBkBfBhByBB7 BVBdBwBB;BoҽBaBHB)\B{B}?B`BP BBWBBBq}BB;_BYBJLB7BɶBBjd;?Zdk@@oA{>AiA}?AlAAAAA+A{\A}?#AA@?F?xz?(?ن@@ Ax#AQA/A1>A5^&AA7AmAZd@H@?L1?!?j|@n @sh@Z@t@@(@(AD A@"@d@#?x@/D?5EƋ^K­l#X9J"g/݊00Aj@x@+@7A @"AWA33]A΁AAA;ߐAA/APAAoA-A5^ANbA;ߟAXAAshAjAHARAvAAGAwA'1A/A"A)\BRBR8BBHB94&BQ0B!+B.B;*BJB7 B{ BBAhAoBѢ BBBBByB'BBoB BJ BAVAVAATA^AAAVA^AZdAvBBR8B+BKB/AAAAKAhAAQAAAOA AAҭAZdAA}A1ZA4A AO@VA>A~lAMAuAANbAbA-AmAwYA^AFA2A8AV0A#-A{nAnA(AL7AA+A1tAQAףpAFAEAyArAuAAĒA AL7A7A9A`A}?KAB3sB5BaBɶB5ޯBRBYBPMB= BBd{BFBĥBףBBŠBBZBZBB BhBMB9tBPBsBB1HBԥBBBͦBB/BN"BBbBf&BeBLBʵB;ߴB BhBŠBMB`BB\BBfBBB"B`BBB+BӽB BBѢBBBB BBqB%B+BB'BB̮BjBKByB!BBsBqBRBH!BB`BBnBBgBBNBBVBBB8BfBBB)BBBBBBuBBB%FBD B-rBB/BJLBBhBBxBBB BBغBBfBhBuBCḆBBٸB0BBoBB2B\ϪBd;B;_BRBBPBژB= BN"BVNBDBwBBkB֟BNB BBEB= BmB\ϫBDB\B~BBXBw~BbBnBB%BB"BBB}?B̫BsBdB!0B7IBAB WB˼BѢB!BBwB BwB#BBչB/BBB^:BBZBvBKX9 Ȃ/݉ףFyB`¸ KZ;ߧuX9rCM)\[Q`FԟZ?5E}?q=DTMlNb85;}?{}?ףffz.bVPףuL7Zd1PvCbȍx33HL7VP33rR٩wˡһ;ߦʑq=|jtmAlChsB`[VDrSiu.ףףQ DL@ҭ@/ AZd@9@i@(@1-sh7d33cZ( $mv= ?V@+@ˡ AL7AAX90AX9bA [AFWAL7A(A~AJ @n@J DhMl_!J ?+@ن@+@R@ ק@㥋@Om@;ߛ@ms@v?=|_p|ffNԘ(Nb0?Q\?x>HZ@9@@Nb(@|yR޿x# A.-#u45^ M5^\ċh5^/00lAj@@Nb@X9@ף@I@{2A75AZAB`qAd;AXAٯA+AA A{AAoAlAAMANbAzAGA-AoAJ AQAA~AAףAA5^A%BBKBD#Bw+BF#B)Bh'BByBD B&AASAxA+BD BB WBBNBB BBK BAzA5^A?5ANbAAGA33A-A)\A A\ATBGAB1B AlA?5A`AAAˡAĵAA'1AAjA7AX9A/AAVADA33AjzA[A&AA`BAS]AA%A㥰A AjAκA\A㥒AkAvhACAS%A#AHA&AףZAkAyANbA A|ApsA33AynAA‚A[AGEAq=:A/bAToA҈A/wARA&3AZ@-@Ԑ@%@@T@5^$A;?AtAȊA`A|AA5^A+AԬAAȆAjpA:Am A@J@?5^?`@h5@(@@AA~@#y@I@ C@{?t@D@A6AwYA-AAAAAAuAWAOAvAx@@@@1@•@@ AASCAj4A5^dABRB͌B4BBBBLBBBNB3BHBjBQB!BfBXB}BBT#B'qBBBPBBB5B5BDBKBBB/BoB绖B!BBBeBhQB BBBRBEBmgB{BBshBfBTcBcBD B_BXBTB4BXB3BڭBB1BjB%BDB:BpBBB@BݤBBBB ®BBB'B=JBBcBWBDB`eBhBJ̸BȿByBBgBBFvB)BNB.BBhB`BBB۹BUB7IBlBshBBaBBBBFBB\OBBَB-2BB)BBmgBBBBhBjBBLwB{BBBDBBBB;BnBBBBEBCBHaB=BB BZ$BkBNBJ BBDB Bd;B-B馺BB B!0BB-rB_BˡB%BhB`BBBYBB@BBTBq=BB BBJB+B}B#BhBQB%B B%ƾB\ϼBXBBBoBZB3sBB+BLwBZ$BףBB= d;Ҙc\\MfA97)\+;u{shԓd;{|Ht|C-K&m33{IlP&mlqb Fˡ\npcC#&$t9ȶRS1J %?yr-r5^M/NbhE-y#?J *v@zTS%rR ׽shoNb\L7&'1I}?`Ve5^RZy*)\1-= N9X?+>Ȇ?y$`^nQ,3PQO3G&ff>L7IG}??@/@@;AnA&OAPA)\MAG-A A$A"@S@`@X94/ݾVq=@33S@@-@zA@Am@ @os@Z@H@!;71:U5^ Mb?%?o3@S@^@~@d;@d;=D ~rFK|5&C=WʈˡF`00w=j̿Q>\??@@@O AA+%AL7QA%kAq=AGAğA/A;{AjAy:ArbAFA8AjPA-RA{A;ߔA/ݜA%AAAtAA1AZdAtAnAIBTB|BfB BBpA#AAAA1A33AXATATABIA/A AEAARAףAAAbA>AmAbA+AVdAZxAˡAAQA-AjAAKAEA;߿A`A33AA;߈A$zA΂ApwAAyAKGACA=A~A^@V@@%9@+6!L7|?В@T@33)AMAuvAJ hA!4A^;AJ AX@@@ף@M@$@1 A#AffHA>A?Ah=A}?A,A{A8A#?A/$A AVA!*@sh>jL@{?o;@O>T-q=Zѿף?u@ף@S/A%GAEA+AjAwA%AZ\AffLAA~ Aj@@q="@ˡ@T㥾#+%Y?5^>9x@+=S@%B}BB7B33BBBɶB㥞B+BBBBrB+BTBjBČBHBBõBəBZB BtBFB?B,B2B馰B!BBBNjB쑔B+B= B\OB\ϗB)BBẦBBBB`B.BBB_BBBBbBBnB%BvBɶBBoBBdBBBSBoBݤBBȦBvBFB馫B'BFBBwB`%Bw>BˡBB\BBBXyBBCBbB=JBBBBdBB)\B+BB{B2B{BoBBBBPB'BhBBCBDBT#BB>BB5B)BBvB!BBXB+B¾BB*BBB9BầBߏBĥBܬBB+BBBَBJBɶBD BDBBBEB=B7BϚBsBBẢBĤBBB}BXB!BB@BVΦBBYBBB=BB^zBB*B-B^zBfBˡB-rBtB]BB\ϩB5^BBdBhBNBBuB BBJLB!BǦBoBB1B0B'1B%BVΰB;Bq=BBPBJ %ĕ7Hbbzm5^A ףyj<F…\h-vyE33V̩Իj#Vˡ W hjxh+Nb^B`aB`=D"&yTX9|shvwJ;¦ …B`¢…h w>yZ33AJ VOPE{X}?VP shZd㥷E^ףOFX9 ;߻`xV-}?-@p?J ?1|J ZdCG[jr(FC'ZdPmM¿B`循b@@bA@1AV6AP=AAJ Ab@1T@/?P"m `1O%??&?jS >D( B`GJG#PEL7{ԆH+700q=r@.@T@H@APAף6AaATGA"kA#aAԁAQAA"AlAbAApAAAATAzvAtApsAAffAB`AXAA5^AAVAPBB B-2Bh BB- B BB\B94 B= BAHA(AOA7Ah B BbBB)\Bw> B9A33AA)\AAԤA̛AEAaAff.Aff(y?'1Ⱦ;g/d+^?@V@J 2A1A A= !A AL7@Zd@V@r(@X95^=&@= @@@A^B$B含B1ȦB+ǥB`eBP͚BRBHB9B#ۤB馤BxBBBjBTB؞B;BBПBӥBVBBBNBBӍBغB B= BBةBţBABmBB!BBq}B۹BBB)\BmgBVBɳBT#BPB"BB]BB/BBɶBffBBB-BBB@BBB3B+B#BBnB#BBhBWB94B33BnBCBBB;_BIBˡB(B0BZB'qBBBYB7 BBBB5^BVBBBB+GBZBsBHB7BBَBϷB3BBlBBBwB#BbBHBBǿBB/ݿBDB3BwB)\BجBB¦B#B#BBϧBEBJBfB?BhQBLwBd{BWBwBB쑍BTBD BP BBBB B¡BhQBB#B-2B͕BHBBB9BB$BѡBBBB BXBB3BBةBH!BB1B#BBBTcB吣BlBBLBųBCBB̭B#BfBBJBRxBrBVBˡBBzBB{TBBYBj<¶s -E^pyD&9# ¼t&7 “ w>Xshsh-|ĩ tK)\ݤŠ´Ho33T'1}?j\;u#kbFuNu~X9HrGT#[ ¶ '##'1¼t¼t(R m¶ )\!RO{(xPAˡ(Xº}?Z&+ '1ף5^¸ˡƻٔ̒ff+kZ= #ףףbؾSӿlˡq=4lE}?X9tr|aCzD=K?Zdc@= ?q=@h @Η?jX!`hj= 5T1n.bm6(tT%5^d; 9;}?SZ6RX:a BJ @IShzdOX9PG'1`wR;߱j9y-/5^00`@M?Nb@ ?rP@?@Ah@9A!(AJA9xA?5A$AyAA(AˡA#ۂA+XAloAXAnVAlAwA5^A̢AA"A5^A"Ad;A'1AtA33Aq=BA BBBsB~BB9 Bp BXAAA$AAAAݤBB BBZ BVBXApAףA#AjAjAJ ARfA5A}?KA)\eAA̜AB`AMAjAAq=A A+A)\AyAAuA{AASAFASA?5A"Aq=A9A-AQ\Ad;1A(A@= @ZT@Ђ?@@A`BASmAvAzAA&_AEA{ A A@L7@@J @@Nb,A6A`PAFaAFAVA7'AADAS+AAALA(A#AADAJA+|ArzAbAyDAnAAo@p@G#A'1AMAKAp{A%{AlAˡAq=ANbAGA= A~A&A~AbLAjAR@O@>PG@@D@l@z@@ˡտshҿQ?ƽ@C@@3AJ FA= ATAZdAApA`jAtCA5^AjAt@@J :@'1@?IܿC~")\o?.@~@?5@ @L7BkBB0B?uB͌B9B1ȓBѢBBP͛BBڻBB۹B BBDBwB BRBB1HB^:BԵBBbжB^BsBBJLBոBRBsB!pBhB-2BBkBRBLwBݞBٙBBљBtBBBCB BBX9BLB BBBB\όBuBBkBshB+B2BHBlByiBBBB= B1BEBَBB{BBBBBqBhBBw~BАBۓBNBոBoBCB1ȣBB ¡BB7ɝB-rBfBݜB/]BBsB-B9BBiB BVBuB “ˡJ FS +%nݤ…kž"¨F)ݤ|º¬ˡd;r33VȮF?5^VJ !¶s'ž;…k7Trsh#ۓuT}k}?εl + ^‹lףº./ W&= )!5¼tףo- `tl^1q=h-2–|u -nĜI+ZB`%ҔB`vBBbШBd{B۹BqBBB BȚBB;_BBoBBֲBBnBjBfBfB7IBB B:B}BBBXB%ƶBB-B3BżBsB*BBLBBBZB BmBBBB`BBjB+BB;BBRBZB BB۹BB8Bw>B BBӍBҥBT#BLBŠBSBBBɶBB?5BBݍBFvBBlBB BX9BYB{ԎBB{B쑍B9tB同BbBBBB[BB BoRB=B$BáBBABBBĔBLB+GBB:BB^zB9BnBBB:BBhQBTcB4B#ۖBݖBBܟBbB}BZBB/BX5^PX9/ףd;° ?'\#J.‘m1j<(^:%#}˜nVn{jo)\y1z#-2 %+/.,h#¤pR8 pļ/ݤSu|}7O"``eZ“¸#¢#5+F#¾'QJ !3.1(&-Nh ƒQffMFR9-M \;_ªnwEL7X9&QDZJ ?5 7EpD6bkC Nb10|QVq=/ݵKjtq=V,ffVO nv@?h@(<@L7@j33;7$.EZoAx$zVGy8Zd)\z!;߫~SvL79jDv*GM^G-E+ ףvmr+,F`6ijzyIr%%ff(O{00X9@@@m@Z A@{AVUAj:ArNAKA+[A!ANbAPAιA1AX9A}?AA!A+AAy~AΈA9A)\AAjAA-AAAPAMA^A9A= BBB BF6BoBxB5^BBuBVB=BAA{BdBB,B+B%B BmgB-2BZAAA%A9AAAˡgA0A:ArNAAjASA#AAAAuABB%AAAhA㥹AA~AZAAA-AA"}AyAIXANb:A+/AlA'1A@7Q@(@ff@ArFAAAҋAAA&AvAX9XAIFAoAA9A!PAEA7AoAMjAًAˡAΌAƍAtiA}?AgAMA(AˡAuAAAAZdAvAwAAA{AA+A?5A/ݔAȤAA7ASA-A+A9A+AA{BDBAIAB`Aq=AADA~AףBAA)Aq=AI"AnAAP@|W@B`e@= @@@AL7EAyArA צAAGAJ AףAX9AA'1A}?iA= sAjBA/AL7Az A@@F@>@@@VA@ABBBBB:@m:/6D (¤p¸!9DEd;}?"l= ff BƒºI7 žo%-$#M¢ª¶ ¤h/P D   ° -2 W´w bNb}? ljG|O6Drryn#ۢ )\o^7t33I,HJ@ˡE@>Zz'15^TNbbף}?jzxI/6L7ܿ ??Z@b@(|?M2`m <(jVz}?tX9'1}= IVi? ̜5^/LDvGm+zjlfI,I{yf+wk @= ?t?+>bP -=!BwBf&B{BBVB%BqBXB!pBHBBBBϷB WBBw~BB}B&BsB)BBoBqBٜBWBϷB:BHBy)BBޑB^zBB;BVB=BB`BB BոBVBBBBm'BB{B3sB=ʾBŽBhB`eBӮBBģB^:Bw>BғB5ޙBߏB,BDˣBVΩBshBõBBT#BiBӾB=B.BEBbB.BBBuSBlB BBNB)B BKBBoBtBJBPBӍBXBB9BBnB馿BoB+GBhBgB;_B#[B|BB/B#۩BhQBmBtBXB=JB'BBB֥BոBBWBRBZdBXyB94BpB;BBsBBBBюByB^zBH!BڙBBɶBHaBBdBϰB\ϷB%B#B~B BXB3sBB(BB+BLwBXB`BfB$B\BBhBBBw>B"BBYB;߰BoB˻BqBBBfBB&BYBVBmB-҆33U-b@@mA6ASWAGWAuAC_AFIAAA@$v@{N?Q迤pM= oK7#?Nb8@S@z@5^@#@u Ap AGA}?@`@Nb @~@`@A0@@n2@-@.@xq@%@@d;@H@t@M>MZDx9ISl̀+I1$Vv EMr(|00@A`@@Te@J @|O@(@AףAF#A/,AOAL7AKAlAXAL7AshAAXA\A|A{fA&]AuATAAvAnAA}?AA`AAlA/AOASAJ B BCBB)BBBmg B AAA)\AvA^AlBBNb BA.B)\BX9AHB!AAPAnA7AffA[AoA/A"A+A}?AB`AoA!AXAwAAAoAA אA חA{AΙAffAHAyAA^AXAˡA5^APeANAx?A "A @M@ AAMAOuAbAtA?5A'1ȦAƐAogApATALAKEAA@A-WAVANbAzAjApAA[A_A#?A-^Al[A)A1Aˡ=A+jAwoA&AA33AlA^1A+!A@5^@!@1A&5A}?5AEhA= sA}?A}?A~ArAwA\AX9A A|AxOAL7A$@•@VE@r@S@A@SA1A7@@b@Y@b@\@@ABA= gA(AAAAGAnA}AX9BA^;AvAV@j@@%9@?q=R@3@@m@nA@~AJBHByiB9BոBB1B8BbB#۱BTBFvB馻B,B!0BZBB1BBB\B\BZ$B5BBBUBj|BByB̷BhBBB7IB)BmgB!0BذBYBwBjAK%A/@?5@--@?P#?-@u@)\@t@$$A/CArA~AFAL7AԤASAEADJA/Ar@@o@+O·"@Ev?V5@?FRHBZ&qx?D@Ad;ATASAAҙAA|IA;9AAAD@X@ @#Y@oB+GB7BBdBB/BwB-BB B-2BB/B޼BbPBBBBJBT-bpyR)\))KC5aSj/ݹOʽujn!/mYnVu +GQM~5^NblyVmCo(<J O {VFKZ?@1-F\Lrd;= %xFX9үX1'1tdEHjh|??5"'I6|_L33c5p#=rx]wilVZIh$B(= 5^Zd|QKgq=?r(@= @@*A33=A/zAvAB`wAIFA2AE@@%a?vID< I )\@+@d;A8AshiA33AAA7AjA rA!>AAA@̘@K@,?E?L7!@$@j|@#y@ @mAbAT1A% Ar$Ay@%@AVAZd@m@hu@ff~@Q@sh@@ˡ?7@!Z@@7@?5@u A2AZ@A|AC@-@sh@@q?Ŀ$&9sh)\D+Q6OB`{00G>?C+?zl@-@X9@hAX@= A/An ArFA cAAEAAAAxcADzAJA_AQA.AˡIA@A"qANbAd;AA%AAZdAQA1AAAArAAAA B`eBCB' BbBLBAAAףAOA+AhBB BABAshAVAZdAQAҒAAQLA$Ar@+@F A IARfAnAPA#AKA#AAPAAKAA AAZAfftAAuAB`A+uABA=A=AB`A`@F@~@&I@{Nm31>+?u@@%AMDAshEAb\A*AAff@@1@d;@m@@33@n Aff@/A3A0AZd5AAף"APA'1PAJ VAAAv8AL7A@AR&@B{B2BBBhєBBXBmBBZB/BѢB۹B"B+GBBBjBxBB= B1ȝBF6BRB%BjB吴BDBFBHB!pB3sB>BB= B+BΡB=BbBBBƝB4BB B94BmB^BBB{TB+BB͌BmBfB^:BiBBBoBB^zB7BmB}BuSBxB3BTBB#B/BJLBN"BB͌B!BʳB3BB'BDKBZBB3BPBBGBEB^B5BªBڬBlBVB?BB{BTBBB/Bw~B ףBB}B吧BBmBGBw/݅zzLQ* l=?5?~@@v@$AX9A-A Aff A )A A@@8@7 @ff@`8@ @ףx@@B`@ٺ@I@-@RAA-@?5@?5v@@zD@ #B`EEFh+K-y677V= 7GaMo00p=@7a?;@?%@V^@5^@-#A AnAzJAr"AOCA*AFWA"cA@A0A5^"AOAJAuxAzAffHAB`AADAAA5^@Ap=A^IAAffAAٜAwAA!AwAhAPAAAAjAS7AAĜ@l?k@ p?^!@Z>ƻ?˾&IVvJĐAྨ#@V@nAQFAsh]A!AA^A= AZdAmAhIAMAVA@@~z@lw@!?вnԿ??J @p@@۟BoB˙BhѕBGBBoҊB3BZ$BBj|BZB\BtBDB9BXBB=ʎBPBBהBBʝBBWB}BBpBB5B3BϚBq=B}BBffBwBXBJ̠BB BĩBCBBLBB=ʨBTBFvB۹BBdBNBBNB͡BBףB{B B`eB94BBF6B_BB*BcBBBϷB;߯B(BB:BrBw>BDB BB͌BEB BBBmBsBuBNBCBöBQBfBQBBPMB"B;BvBNBBhBHBõB:BٽBB)\OµshKKR9+`D`/\C"$-vv|U-4*E9shuteKNb\JJ z~L77$y+q=^J *&+ G3;(TОzd;߽U@9@QADL7^FVȮ`NbA+EQ00zd@-2@V@^@\ Ax@'AbAhYAC{AhA ׀AAMAhAwAA1AzAjAARA"ARzA33ArfAA|AyAbAL7AuAAZA#BA#BnA" B5BR8B/]BBB# B/BjBB`BEAA BH BBZdBP B Bq= BbB{AbAnA?5A-AIASA= yABA-GAAXA㥅AjAAARAAlA$A^BQBAZdA;A5^AAA(AbATAA|A-qACUAD`AMAADA~@@EF@J @ff6@ףp@p@AL7IAC]A= kAHvA;=ALA33%A#A,A!A 8AC1A$Ax[A+GAMrAxiAQxAupAFA'1dA ]AA&AjA!AvA?5AKA9AoAУAҥA9AAVAd;AA1AOA"AmAvA33A$AyAwA AAAA-AAAwAEA{ACAZ@K A-@/@p@V?|O@D@@)\@oA+FA^oAAQA33AA5^AbAA7ASA&YAu^A=A-A A@@D\@= ?&?y@@u@nr@K@7BB/B=ʋB#BB~BݤB܆BB/BBB BB}BދB!BBTB馅B݋BhByB/ݖB6BFBB£B-BJ̝BBFvB̎BwBbBȑBR8Bm'BBkBT#Bm'BBuӧBJBX9BBBBBÑBDBRBD˗B\B{B3BB!pBhBB BBBBVΙBfBNBdB;B7 BjBBwB`%BBw>BjB!B)BףBPBnBbЏBRB;BBBҩBBshBhBmB7BHBB BuB9BB`B>BdBjBB= Bf&BBB'1BB BBBHaB#BBjB?uBsB7B BB BhBXBCB#ۗB1B;ByiBոBB#BF6BBFvBB}BBQB(BgBGwB5xB WnBJoBqBuB+~BoBpB!BoRB$B\OBhQBXBDŽB΂BBPBk}B1BjB,BUB3BݤB@BbB?5BBӍBoBMBZBBףB BΎBqB͕B=JBhBBB`%B7ɏBBBSBDBYBRBdB}BB#BBd;B9BSw8 3q=33NbnL7;4?5j-TL7I= 33vtnNV!1 J zL7Vg^lff&SYjLToFȮ%^= 5^Vn$o;WP=B`H:?ף?V?Zd1LԼK OE= SA7R5^X9AZdw}o}?W>33S'P B`1q=4T'1,OOG'.\h'1twaV)M;ߓ팿Nb>DTMBٺ^Qff5^z?h?F@j@Zd3AB`IADAAA!AAAeAp)ASAČ@~@Bu@D,??@ @= Ad;OACeAAĦA5^A"AA¾AzANbA ׁAOiAff.AnA(@{@u@@V@E@+@ *AnTA[AȆArrAEAzAGAAGAXwA9lA;9Au,AHAAHAף6AEAm/AM:AE@A=AjlAiAXYA"A9A@ˡ AJ @~@X@9?L7Q@j@?i?QP@b@tQ *o]00@mc@z@Ĩ@CA@H(A7MAoGAQrAoAAZdANbA AAAbAshAAA?5AAAAAL7mẢA?5ARAGAoAshA7AABBhBB` BB(Bp!BB%B?BBsBBAAq=AA BBoB WB5BjB@BBAAGA/AAJ A^AGA/NAT[ArlAB`AAVAAA`AAB BHBvAA= AAAIAIA9AIAA#wAjA}?yAHA}?A AV@@@ #@)\G@@SAHA$bApAzAz>ADA/A@S@Ԡ@@C@Ԝ@ Ar@M2AK7AuFADRA*AQA'1LARA7AgAX9`A+OAsAMbAAƅAkAK_A/AffA}?A"AZBATgAlAlAEA ACAoA= ADAAZAFAAASAcA&A@}@@`@y@/@L7y@h?/+A?)\?sh@#A1AjAm{AJ AHATAXA/A wA_Al)A BAx'AbAL7@#@X@`P?R>y@#a@;@Ʒ@ABLBڍB\OB@B߁BoBL7BBBB5B\ϐBIB{BBB= B7ɆBBBBB-BABלBB/B+BWBBəB̕BeBbB׏B!0BBBs(BBF6BbBfBB/]BBBB}B`eBBBdBL7BϷB B&BBEBͨB B?uBZBB.BjB=JBABVB=BB{B ¨BBPMB=BL7B;BɎBB͊BRBXyBəB˞B ץB@BB^zBB3B*BNB\B?BBdBBB`BاB7BjBPͪB㥱BBBXB|BHBB`BH!BqBw~BZBșBdBBZ$BB`BBhB^B B{B{ԏBDBDB9BBBB{BeBGB1HB'qB9BBuBxBonB/rB%sB'uBP B-2B`%BrBoҊBˡB7 BBB!BBtBBZd}BBBXBBXBfBBHB1ȚB}BBBlBwBmBDBBBBBB BrBjBTBB-BLBBBB`BˆBB1BBNjB0BBBBoRBjNu-Zd ;#ۑy&shDd;#X9TWGQ|tʘEH;#IٚJ ҽ ףX9D@?T?RpXH//&X9dPgA|u[(! ?X9@@ @j@)\ AA@.@tC`+ףRX㥉ףl+_tףhq=yrq=nK?- R7|t-*P7;ij= 7Or\;+4bt!ֿJ "jG@33g?տ6= WI\@z@)\@ AAQAmAXApA!AνAȳARAԏAJ bA= CAoA@9x@Nb?p?@V@ A8AeAffAAAAAAAAAAAA+A+yACKADA-AD*AFASAKYA(AAIAAAZdAXAANbA`AAmgA-?A1A;AA=Aw7A#SAhOARnA&AuA\AwAwAAshsA&MAu\A *AAn@p@@@5^@|'@?5@`@5^?%} -'00ZdA}?@uA @ףA5^A|KAZpA[AAAA/AL7AA5^AOAxAAA1A9AAVA{AףfAmAAA^AAhA&A$AF BB+BJB++BJ )Bh$BBshBPB\BBA^AA7AxAAˡAB^:B W BBBr B@BAFA9AA\AףA\A$AƚAˡASAPAKAoAIAlA@BBfB1AAAAJ A&A{AshAwAףAmA`^AbvAqAף6AA(Az@!@B`%@t˾{@7@A 0A HAMAGAA= @ {@U@T%@q=*??ʡ|'@q=*@@p@ AT/AlAHJAyLAzAzAcA33EA(A @AAv"A1&A@J @F[@&9@\@@q=AV.AiAlsAA~AA+AAffAAJ Aq=AmAVA"EAAS@H@?K?X9Կ'1jvn@%@`0@r@Fw&Nb{nHT q=%휿Zd@ҍ@@~@l@A|@sh@= @A?5AO@L7@|?; NbshO(NQxq=`CNbȇQ~EA*Md;bݿ}?=;߿`VCZdkX9d;g-RG1(R#۱{V-jQ8ҭh#y=?@@@ףAPAH00G@V@A@`$A*AA\AAblA{A= A AlAbAAA#AAq=A A"AAnAZAjAJ ~A-A ׯA}?AGAjAA-A`A B% BwB BoBmBB%BbB#B-B/]B94B+BnBBbBŠBZB3BBBBBBB)\APApAAjAʥAAzrAhA{|AA`AAAA9AEAZBlBpB~A9A-A;A·AAq=AnAʚAʘA"AaA+nAOGAAA`@@'@#!@a?u0@@MAhCASAq=rAvA'1:Ad;GAףANbAVAKAA!AA@A!A/XAtQAshgAL7oA FAffrAjAVACACAAAAA?5AԕAhAyAĎA+iA"sAuAVAxAFAAAA|AAAtA BBbAAAffAAAAq=xA)\CA\A AI@@v@ @&@"K7??@!@ApMAmoA+AA+AXAAFA|AATAZAtwAX9`ATA$AA A+@v@P?@@/@-A@@\BBJBB)BszBvBڀBBB/BBgBBɶB BUBJ BLBjB܃BBd{BBB۹BBBJBBBdBnBފBBԋBBHBŖBoB'BNjB.BBB^:Bq}BĜBB7IB%FB)BwBȘB'BVNBB?uB\BbBoBBVB B=BB5ސB{ԕB؛B{BBB`eBiBqBZBÕBԑByBwBJ̅B!0BuBB?BBEBB@BޟB"BBB!BʟBB WBB%ƔB1BBB §BB0BѫB8B֢BvByBB-2B?5BBjB]B=JB{B3sBtBBTBB^:B^:BˡB։B#BBBEB$B BuBBB\BsBP gBz]BeB9_B+gBmBsB~BBB BBfB^B BB{Bh~B,xB{rB7sB{oB-sBEBDžBيB{B1BXB1BBوBuӄBSB|B{{ByiB+B3B5B;BZBB94B#BBBLBNBB4B`eBs(B+B?BBB ׎B!B#[BB^)HZdozEm盿s= 9 mWe/xpXVQL5^&?5T?\@j?n?忰rPRJ`nshd;;c/Ilrd;?,@@@j@+@MAI@N@hWn|l39F'1zq+;߁d;#gHpQjQVf3 ?5 `SX9sh&?5yv7TE?57 ٮtho& <둾:@?5n@^??y5^?-@@½@CAm9A$rAmA AOA$AKAB`A!A-AZ|A [A-A33@u@|@"@w@ @%A DAnrArAshAA1A?5AAAA+AAʝApAmAwWA2AGAff AA?A7A(:AtAƉAvAEAГARAq=AffAԝAĜAPA/݃AffXApGAff^A?AAhA= AASkA+iATAZdA%AA\AAmA)\mAq=JA]A2A?5(AQ@Ԥ@$AA@@@@+@ @&Ga 00(AA;ߐAd;AB`A7AlA;A$AQA$A$A}?A BJB\#BshBjB%B/ BmAoAA5^AZdAA AA-AhBBBB$B`2Bl;B7 CBD;BP IBIBHLB$?B5B5B'B+!BTBB'BZB!!B{"BB!B/]-Bj<4BR8,Bs3Bq=*B-B$ByBmBBM BAAADAףA~AA}B;_ BBkB/] B,*B/*B*BBBB B-A'1AZdA+AmA'1AA~A+A}?A)\A5^AȄA|sA6Aw'A| A8ASeAAAIAZAAAРAA\nA= WA$VA331A#AA;5A\&AVUAPAZANbA/AʥAGAAAףAnAzAA&A-AAA!A+AyA+A/|A\~A9ZAZdAA^AB`AAlAABAb BNB#BX9 B+B+AlAnAlAƋAwA-=AIAG#AhAAA}?)A @-@O@X9@ףA&+A^A҆AMAjA;߳AzA|AuA+AQAwAAMAAffAAqA"uA/hAT/A!A(AVANbjAxAAAJLBBvB BB!BBV|BjBˆB+BẌB+Bd{BB/B'1B`BHaBP͐B%BB3BDBBT#BD˙B!pB1BEBJ BTBVNBÔBBnB5ޓB BN"Bm'BBBB8BBBwB5BӍBZdBB%FB?B;BBJLBEB3B BBܧBq=B BdB=ʨBB~BKB8BKBBnBBVB{TBJLBuӡB`BBsB/B-rBBd;BӍBԓBBBBߦB9BffBFBBuӨBKB%FBBҚB ךBhBڤBMBB^BZB"BoҫBD BB(BBH!BEBJBB[BB@B-B\ϘBVBRBdB-B9ByB7Bf&BDKB BjBBZdBBLB5BvBBmsB9iB+]B^B TBF6XBJUBZBXdB$hBvB}BxBokB%dBvmB)gBrnB"kBHafBhBJ cB'gBvBB͆B͌B绑B^zBoҒBB/B,BxB#rB^:kB}?vB1tB|BhB9B+BˡBCBLB%ƍBB\BB|B?BBXB-rBϷBẋBJBWBuBYBBdAN!B`M SoRt~pn!^q(o_ O sh;vX9>#A@S@jd@ˡ?G)X9ljxףshTRοĠ"@Т@K@+@D@A@w@rA9AshA{@\@%@?{.Fc$SSE)\IosAZFjd;{zl.uM~Hd;W-9M"QD%Z^ٿS)\}?Ƌsh H/UXף>ˡE>Cw=r?{@Ο@h@{A AEA/IAxAOA%A5^AAA/݌AcA8Aq=AM@!@&1%!?(@$&@@RAF=AVoA\AAJ AA= A33A`AAAffAœAAmqAZAq=.A{AAApAA7WAETA|AAZAA|AĄA]A[AaA-CAuFAV2AjAI@= @ƻ@EAP@SA@AV8AףJA)\A{A?5AlArArHAVFA!A&@O@㥛?o?Rv@|?^Y=yf?79'1@I!+!Q.00CcA77AMA{*A+AA)A33KADAL7A;ߛAAffA}?AABwB^:BA#AAAAwA-A}?AX9AAtA1AEAtAFB BB!B*B%7B9B{EBbBB@Bh4BR,BO*BBlB B/BBVA{A B/BB-#Bˡ B+)Bq B$BBBqBshBjA AX9AAA{AA AB#B}BL BmBJBˡBB!BbA#AAAd;A$AAwAMAbAIAvAoA(A#ۑAApAGAAh@DA9AhiA΋AASAҮAjAB`AyA?5PA+4AA@J @/@ @:A|5A_A`nA33sAAnAIApA'1A-A AshAwiAAX9vA\AzA!fAQAvAף AO@`AZ(A/IA/AKAʯAA#AXAd;AIAAAAIA-AlAffTAff$A9@C@@E@5^@}?@w@$@I?Z?S#?E@DL@)\@Z A1BAvÃAHA ׶AoADARAnAAERAjAGKA\A@A@z@ʅ@33@EAA[Ad;OAXwAԝBhBBBBR8BVNB'B'B?5BJB)BBBXyBBˏBBRxB܊B㥋B۹BB5ޕB]B|BBd;B#[BѢBL7BiB!B{B+ljBBuB?5B/B)BBBwBXBB94BBBBBBBXBDB BBB后B}BNB.B5B'1Bs(BPͤBXB B BB:BBuB רBBBnB۹BvBBBmBeB}BոBLBH!BBݚBB}B쑥BmgBBHBBCBuBBԡBBfBӍBPͫB+B94BnBBB^:BأBڡBBB君B-BBBB%ƗBBNB9BL7BBLwBBfB\OB-rBmBBBBZdBNBBuSBLBH~BqBthB[B]BPUBRUBv[Bk[BDhB$jB94wBq=yBJqBIbB_BfB|aB}iB+gBhBDpB}oByBq}B`B\OB@B.B=B=JBZBBՌBυBBkyB|B{Bq|BP}B BshBBRBmB B,B)BBFvBBDBbBBt3 X-( &>/@!R?I4@/?l@^q@X@A?5@AQ A&YAoqAtA$Aq=AMA}?A~AX9A\nA)\EAOAD@s@u> 0?'1h@R@G@q=A)\=AFuAA= ArAAzAAZA5^A7A-lAd;cA3AE&A@v@ZA@X9ApAA+NAgA{tAAd;eA#{A]A _A|AlA)\iAYA33=A#+AGAA/A+AFAB` A`*A^3ALAҁA+AwA"gAu`AZJA%UAwA/@5^@)\?VU@@h@'1( ?$@v;߿;ߓ700tiAG?AffJAffAZBBVtBIgB/qB%iBvBB%BBBBB WB}BmBBzBBݤBBţBBmBBBBRB!Bq}B2BTcB,BkBaB/ݣBHBuB7IBZBBBhQB|BkBXBEBAB.BB\B9tBkBB)BgBB)܉BuBBBBBB WwBthB hB[B[B@]BIYB{dBaBkB7nB!`B;_RBXBXbB'1bBoB{oB,qByB{yBBL7BZ$BոBoB1HBZBףBBOBjBWB_BBJ̚B,BʠBH8L7 (Q33+7I5^A#/KR'1vk!VsPm2~$ff~|P׾h?&@x@?5@~?rRT%!E"2h/;ߋ+?I<@@}?@m@'1$AV AmAbAb2A%A@z@P? Hʿm\ hGFE ov\7NboX9x^9p!+b`ZdzliȦ kQ OQ ף;z%PB` tTMq=ʾ7?^A@=S @+G??j@-@= @{@A-A]AˡwAЕAAlAffAAA1AtAQAL7A+@I@-?33@^@-@KANb8A\AAOACAAAvAAAxA7AAAAҀAJ VAX94A%IAFAˡ_AIhAQxATAAhAGAAAAL7AćAQASA5^AˡaAףFAE2A,A}?A1AO]AoACyAA-AAzvA= Ad;]ARhA3AbA'1@d;@|@@-@+@y@(@b8?o?|7Gbh00MATA~"AT@Ar@'12A_AbAAAq=A(AAFAB= AAMAq=A}?AAAHAA!A+AuApAKAAMAA{BBmB$BB.B#,B4BL0BF1Bq(Bd;B`eBNBB}?AA+Az BBMBtBHaBBB-B^BPB{ Bd;AjA ATArACAQA}?AAˡAZdAHaBlBBoBBL7 BGANbA-AAA\AAIAˡAAAQAA)\AZdAjzAyFA&ANb@|@ƻ@AA^7AaA~AzA"Aq=AB`yAP[AlA}?@1@}?@J @K@)\@A/AVBA?AVArfAAHAiA [A'1A?5A/]AUAˡCAgAMLApACkA}?=A/Av@O@@m@33AAAUA\hAAVAAθAAMAwA"A;߳AAZAvVAA&Ax@/@sh?rh@n?I@x?$v@@ӿ)\xɿ/>*?E@@-A KAX9fAAˡAPA«A!A|AZA A75AAA@\@sh@@>??{@%@@5A#A`RAݤB_B+BBF6B BւB细B-B=BuSBDˇBjBBEBBYBL7~BBHBBrBBN"BlBVB㥙BBBm'BBҏBBBߏBօB/B:BXBBB@BDBϷB[B^:BWB;BBHBrBBBw~BHBBXyBϷBbИB ןB'BAB B(B'B`B}B\OBN"B!B9tBVBBBshBTcBBˈBBXB}B7B)܈BB BBǠBBBPMBmBӍB'B-rBJLBB.B9BLBŢBQBHBB B?5BBuSBBBbBDBw>BƣBuBkBBBmBBԦBsBHB绠By)BOBmBj@'1@@7 Ad;@lAm%A7vq=Kq=bK33mrĨxtI\tSB`+b-ĠZd[X9Ĝj^ZdFA1j5^4|I6(= ~-MbFs '1P.Q?w@^@ @(@nA|5A"cAA}?A)\A#۞AA~Av@AA= @33[@"?l'Nb>@Dt@@ffAHAX9jA;߇AȡAAAAAuA7AnA&ASA/lA_A/A;AR AAjPATAJ XA}ADAAXAAwA%AnA9rAcA9RA%7AA@@p@DAT@`.Aw!A&?ATSAXoAA A$AzhA[AS/A$:A)\A&@@ @x@Ȗ@ ?/=w=S{~X9\+4nP00@o@ף@1d@Ю@ ׳@vA'1:At1AeA|uA}?AffAtA#A%A\A;AjASAAApARhAAdAGApeAPAGAIAXArAuAB`AyBTBBB` BlBB"BoBVBGB7 B^:B/A33AHA33A`AnA!0BR8 BBB BHBBAQAL7AnAZAЫAAףA?5AffA-AԧAEAPAˡA-A1APAAA= A AAwArAĘA$A9AƠA)\AutAMlAA_A*AGAT@F@u?'1Om;@%@- AV5A!PAUA-BAAI@w_@+@`нD ,,7? ?@@X@ˡ Ap@AJ A;A4AL7 A+@|@@Zd@@/@}?@?V\sI$\½ff>ף@I@+ApAGQAMtA AAAAwAOeAt)AVA@#@h\}?g^l{^9 lL7ay?@Z@/AAAq=RAHjA7?AbA@@l@b@CK@R??5?>B+u?(L@d;@@1AVB!BJ̄BmBBw>rB/kBuBBL{B}B7 {B7BXyB-BXyB/{BtBxBtB)\vBOBBNjBBqBfB@B+B)ܚB5ޔB#BBB#B B馄BP͈BBoBTBTB)\BmBBѢB+GB.BWBEB=B̛BBOB)ܕByBBB-B(BtBõB7@?s@Q@@u@5^>P׿bX9dq=ڿA ^ ף%̰o3SC??@p@oA^A;QAj|A]Aff*AA@o@;ߟX= O9o;NbZt;g?mΏ-ʈZIXK33ӿP@@GQ@!@-@տn翑\#}?)H4m7 ˡ= 1{FlO?D@?ٖ@K@1Am)A`\AxqAʓAΑA/ݐA;oAu^A"Aq=*A@H@Mb@>~@@m@ AR0AaAtAXA^AB`A= AA$AAVAA'1AʷA$APAvAndA+kAˡoAtA$AGA(AshAvAˡADACA)\AjA{ArPA#=AA?5@S@-@!@A@+@'1A1AV`AgAAAAQAAAL7cA&_AB`)At@M@ff^@X9@|@}?%@$? @V?CI"shG001,@Ġ?T-@u?)\O@?w@wAuA?5?@'1@= ACEA33IAAlAQAq=A5^A9An|ASWA-#A%@{@'1(?P5^Č"nZ$33B`-h"+j<^@ȶ@t@&AHAzFA^A*AK@X9@RV@@o{@?T ףB(BEBӍBL}BPoBZdrB)\mB+rB xBmg|ByBBBhB6BBRBBeBVBswBryB}B8BBj|BBZB?BhQBݤB'BZdBJB+BCB}B!yBςBkBn@33+@Rv@B`=@ˡA4ˡUMr rEq=oJ ?;ߗ@B`@ AAn(ANb A-2A+dAhA!>A+AA"@I?R/IC{pKQZp9vsD6u&1HV>7b?K?@sh? bP$Rƿ"{Gq=-b\v/ݰ[33xٿףPr@ @R@X9@X9@mADAEA-QAA/AEAffAVA)\AA`AJ @AA|@w@z?Z?#۩@t@H@ASUA AXAAAMA A33A"ADA}?AEA"AtAtA@At/AA#A`AiA^uACA~ANbAxAyAAـAlA~AV^AbACKAZd!A\ AOA$@J AE@'1A^%AyJA]AsA+AěAAOAMfA}?MA/cA-A7AE@?@@Ĵ@Zd@  ?{6@ @;߿ ̬-F900D=$^Ie!\ Zm;@RF@-@-@wAMAoAjAd;A1AƌAD`A)\mAP=AL77A AQ@+@@ A-AAff\AXA= A AGAvAAwAA"AyAA BJ BnAAAd;AA\AαAFACAA%AlAAA(AAmA+AAACAġAċA"oA\:Aj Ar&A1A}?kA`AA= A&A= AEAAA/ݾAZdA|AOgA;}AFYADAtAAC+ASAuJAA1 AshAy@C@XI@!rj }?5^R=$@n@@5^@@d@#?h I|٪`;G;ߏ>`?'1@@q=??5@/t@@ @`@bh@}? @Zd@GI@Zd@p}@Q?x>|_= wC6oþ/?`@@;AAOIATWA A5^AAuA(XA'A@ff@?^Q"`/`oJ J(JףDq=yV 08@V~@d;@XAffA9AAd;@m@S?3@o>jxYNb`Il %h^h|(L7?ЕBLwB;ߎBB#ۉBfByBhBNjBxB^:BB;B`B-rBB۹B}?BՂB9BNjBXB=ʉBB^BfBBœB B)BoB1ȐB.BL7BwBŇB5BsB9BӍBBfBBRBBLBjBbАBƌBÅB+ǀBB,BmgBB,BVNBmBBD B!0B|Bw~BPBB^B&BBfBBBq}B?BJLB"B!BڐBBnBBu~BY?(affb2-ff\9N~SlV^v"{-$X9?lw@S@@@m@@־XaU&a#OxKv @@~@A#AXMAJ "Ad;'A;1A`RA5A9Au@H@?5?#Y?(,X9\xT7/ LL73(ZH|~ROA "t˿#ɿD?~*z?{?x??P7?{޿ Cyo?8@>P_#1V M-=oӿsh?h ?~b@u@ @@?j\@;ߓ@nAp AyA=A#KAA+A/ݨA+AATAAVAZdAA}?qAKCAA@#y@;߃@ˡ@@0A|[AAƟAtApApAX9AAKA\A(AA)\AZdAԐAhAKoA5^DA\AaAAJ lAmAAA+A33ACAĩAxAPAAЕAA~ArjA%gAoA @ApgAlOAy^A1bAA+AX9AshAZAX9A-AL7AwAHAZZA1?H*@ףPҩ?5"H I 9Z&'1@/XPĀ?Q?@@`0@1 @t>(??j@!@Z^3333KھO%@q=@@"A(AFA?AdA&AVAff`AZA.A@Ax@T?IA /sh<{ Cpy+u/sID*|}(H?\@ί@RA;@ Aҽ@C;@В?33I%iXףK17'!" hPB#BVΆBRBuSBuB!0rBzBBR8BJ̃BBNJBVB;ߌB+BӄBۀB+B94BBBB=BBbBBoҖBoҝBCBB?BXB;BBΊBBѢBPBB%B]B-BB/ݠBќBJ̛B[BBJ̌BRBBFvB?5BBB B;ߞB{TBϤB ¤BqB;BBcB)\B͌BB`BɶB5BBݡBKB'BBdB۹B}?B-B9tBBUBCBXB%FBBB٢By)BBBJB\BlBBVNB}BBڔBBuB`B9BRBīBBzBB%ơBBByiBdBÒBˡBB_BȞB;BdBB^B)BuSBdB/݇BbЅB}B!0BBoBB+BBBnBBIBrBqgB{kBcBhBkBoiBrB%vB{B5^BֈB^zBzBDBwB~BwBŠsBzqBF6lB!0rBBӍBYB1BUBZBj= /8xi?O?w@@q=AAA| AV@`@k@>N?X9?9Fף\x) #(<@p@Ap9AMAxAMZAB`eA= }A~A|AJAX'AL7@i@m#@R= Nbsh'1 F=^M6j&$d;'xi>'1?Pw@@@G@"@H@@ˡ @Ko@?R@Nb@@d;B`fzlTEon2@?̔@K@t@к@q@\@7@/A(2A5^2AoAz|AIAףAjAQAffAA^AAXAA5^A\nA{>Aff$AX9@t@6A CAzAAvASArA ACBBX9A/] BZBA)\AAA AASAA AIAAƣAEA= A= ARAJ AjAAƼAˡA{ASAAAEATyAףArAq=AGAAnAAA}?AAX9AbAX9AOA"AyAmAAP{ARAH(AL7?A/WA33!AAAD A@@?-=?X)j001,RvlnrNbpjԿ ?/@s@@y@q="AMBA|iAjACAshAlArArAPAAEAZ"AJ @A@!AjBAVAO}A|AmAshAAAAnAATA#A!0BAAAB`A~A|AA-A5^A7A&A\AA`A/A5^A AshAAAyAPAVA`AARPA%AL7@@%@}?;ALAAvAAˡAd;AA1ASAҲAףAyAlAoaABAff6AZAoCAE.Aˡ@d;@AO@@Ȧ?)\߿ #(A / ˡE?\@@G@d;@?@|?GTy~d;My%Y=V??&9@%?v@5^b@+@l@P@Mb@z?m3@@@@shq?Q98Ipsh ף>?̸@w@+%A`AvFANAoAAAL7oAX[Ad;3AF@@?plGJ /7F$0uFQ~Nbnd;G!@Ah@^@KAFA.A@b@!Z@z>= ?X>- )\}D ʥ7/)Q8DBuBwB5ވB9Bu{BwBM~B吅BBBfBy)BBB B7 B)BVBBߏB?uBlB\BB~BsBpBB B%FBEBBˆBŊB1BVNBB+GB@BBTcBNbB#BBBkB-BBBʄBBBnBB_B首BdB מB'BmBŠBBB=B'BeB.BNBKBB B{BĢBB吗BuӐBڊBϷB{BF{B BCBӌBBB BBBɶB^zBBB%ƥB㥟BLBdBXBܗBBΥB3BBդBBB!B7IB3sB;BBɶBەBBBbИBshBuӛBhBRB BB}B ׎BJLBBBPwBRyB4BBKB!BBNBL7BѢ}BrBgBYBY\BRBNbTBYB']BhByikByBVBBOtBkjBmBeBlB{gBqeB!gBףfBnByizBBmBBzBhBT#BL7Bq=BףBVB= vB)\mBvBAuBݤzB5^}ByB+LJBBBZBABBDBwBm{BLB5BB\BB(BBvBaB BB^BB`x)?\Q8Zd1TZd5^>%!;d?G9G^J9Hxi=Mz@33@?5A'1@9@@1?M?bף0Zd3+h+9xq=*}?=@S@L7@\AG#AMAH(A5^4AEAGkAYAG%ArAI@?m?-K;߻}?A o-FM -|y6u둾ף?)\??ף@($@!??Zd-?y>U@ҕ@\"@QXsh>Zd;̘q=J-#ۙ?+@)\W@r@u@T@T@)\@@7@*A3A^#AWAlAQAbAAApAOAPAVA㥷A AVA;WA$$AT Aj@#@AAAIAhA~AMA{AAzAA`AAAVAA㥶ArA`AAZduAPMAaAZApyAzA(AHAʪAAZA'1AX9AҠA+AwA̦A$A/ݓAr|AnA`A]AAshgA|yA(rAB`AA~AIAķAxAAL7A/ݍAAGmAKAoA@GAR.A}?@/ݤ@ @  A@`@>ffF?\00T +}?^vP>!?^@-R@@OA #Aˡ[AbAףrArAף4A|1AAshA?5@@V@S@y@V AbAOAXKA9pA;߃APAjA$A#AAvAAq=AuAIAASAVAffAA ׇAnA33AshAbAzAvAAbAMAAAAXA"cAx?AAV@d;O@t@Z@o AIA(DAXeAmA&AB`AXAq=APAVAZxA GAP9A$Aˡ A`A@$AlA}?@7@@vV@P>J>= G{M 7#.(tӿ?-@E@~B@q=J! `ף~Eff uO5^R;5^zLd;Ͽ9?V?@F[@1@?p?Zd;>7?@1什M'1 ĀQ$&?㥣@H@AA!,A(&A-MAuA= A_AKA(An@P@>w?= +: }?=u$H%ypbK=>d; OJ :-?)\@ٺ@-A7@}?A~@?l?-:𧆿o+ˡ! 5C+D,G{obB'B:BBR8wBhB94iBFoBs|BvBByiB%BX9B1B`B-zB rB5^sBsBrBB~BBy)B׉BB`B%FB ׍B{ԔBBBLBw>B%B}BhB.B́BBBB BAB۹BBuBB}?BBhBõBѢ~BZBщBFBWBBBN"B#BBB'1BBB-rBBVBBBBףB BYB BB%FBpBQB|Bm~B#rBHxBBJ̇B}B֑BbBkB BJ̙BXyB=ʟBBB BBXBPBB-2B BB1B)BXBB,BHB+B'qBsB+B.BB쑃BBωB BDBzB= B͌BB,BَB33BBu{BNmBF6jBLsBF6wBzB`%BvBxBP jBeBVBAKBGABHBH@BEBLBKBF6WB+^BvlBGwBqoB#bBN[B_BuVB-2]BVBTBsUBwSBSYBfBqB@~BB BoҎB-2BoBBByBF6lBSeBH_BXiBRdBD mBkpB{B!~BBBBBwB|BuBMiBJ uB}B~tBsyB;ByBB9BZ$BB33B= zGQ` ?j4?L>--@">= ǿI9E15^$:V\(C%zn R?T?J @@- AAGAz@X9$@'1?|rh?5uJ '1- '1"K?@9@"A)A QA5^@AQAyASAQbA-AjA+@Ը?+6?'1PpD}?!(ף7!N#z*l&+v޿1?η>o3@t@sh@D@F[@6?{?B`>Nbh@@w?@(??"w +p?ˡ}@l_@G@@C@q=@@l@@C7Aj$Z00b?/ݿL7)? Լ$b@r@^@yARAףJA sAA9AA A#۵A\AAeAtWAoA At@|@}?@uA'At]AhkAmAAAAAATABhAq=AZdAd;AyAʴAʶAArAtA5^AAQAJ AAAATArARAHAAҴA+A?5A33AKA A= -A8AEjAbA&AAAA&A$AlAAjAAB`AzrAף|AQAˡ;A$A@+A|3A@q=@H@p@= /@~?%iRw!`q=zS?MB@@9@-IT r:&/lClW+h !L7A="@= ?@-@y@V@D @EI ?9!lǿX9}?I9B`mX9m@@@}?@/A!4A]AuApAQA,AA`@?(Xy%7L7)-Mu>-N`(@|Ggmeˡ-M:-+ K( @G@@P@9@ ?q>t9>O)xZduE ˡ )\?5Xף0?bBj}B$zBqBkB\B WZB]BlkB-fBTpBsB|BP~B)BpBsBskByilBhB/lBwBDxBw>B쑃BB7BbЉBB%BõB9B΂Bq{BB.BUBBBB;_B.B{TB\ϖBbBB:B`B5B){BPuBjBBB\BBB͌BZBBpB+BBBDBhBB}BB`BBw~Bw~B)\B'BB?B=JBFrB!rBTeB33kBwBVBN"B#BoBB㥓B)BBHBAB BFBBuSBBBBەBBB)BCBB쑖B B9By)BՎBuӇBVΈBBfBB+njB1ȏBZdBTBB3BB9Bs|B/]vBpBbB!0bB`elBpB+wBF6~BEvBB`sBNbjBf^BuWB`JB+@B5^CBs7ѿh=ȶ/ )m9Dlvr(\l7@)\@5^ AA7Ab@@+@L7???m9q=sh1ſNb?sh@@7+A7'A^AVAuA{\AˡeAIA)\APAˡeA5^LA`A%@u@?9H~-ˡL7KF+;߷n¿M??ף@L7q@@m@о@w@@(@tC@G?/l@?5~@yN@m;+u5^Ο $+=HڿZ?(? p@j?@y@ףAA-AOGAT?AjAX9zASAAZdAAAzAB`ArA!zAtEAˡAO@33@V@AAQHAcAEAA AAAmA= A~A1AoAAoAȳAbAVAVAA|AهA;ߍA33A9AXAA+AAARAq=AMAL7AANbA#ۇAVgA ?;9Q00&?sh>?+?sh)@n@ @7@!A/(AZdWAxmAIAAATA/ARAZdAw}ApSA^AJ @R@p5@B`}@@u@t!Ad;EAu|AxAyA1AEAA$AA"AAAAVA'1AHA~AloAqAsA`AtAEAzA¼AtAԷAAQAA}AAA|AzpAB`QAm-AuAAA0AA8A?AmaA|A1ADAAA1A"AAzAlAAZ$A@B`@@?5@)\@)\@X@+@ʡ>+T?5/nHo&q!¿ҝh ׃q= wZ2Q&%Av*?jr~VR= GFV-+? @G@@p@9@vu>ȶL7I}+ˡ"َt?T@@= A;=Aj0A9fAPAtAF}AOAoA/LAE(Aף@B`@8@1L/9= V5^DC3PcNTXGQ@$?l@@@@-?OxiJC,?o=njd;ol/"-d;{F"Zo=BBB8BXBKvBrBTzBBBBBB)BBVBoRBFBNbBB`B>BPMBB94B-rBB BBgBUBUBYBXBL7B!BwBBB}B°BʲBfBCBçBBBXBm'BB/BB`BB5^BZBPBAB7BVBsBB`B«BPBBFvBABBB{BBB1B馫BѢBBݟBCBBd{BÏBBoBy)ByBBØB+BB6B͌BƦB}B B%BBDKBӍBByBJBיBVB֝BVB@B)B馚BߗBB0B)B B{B%mBTcfBmBHyBBxBBBLB#ۊBݤBlBBBAwB$pBrBFrBpBjvBoiB(bBUBNOBD @B77B/2BZd;Bm;B`BBNB+VBL7dBZlB#yBB}B(qBgBcBXB&ZB-2NBOBZIBuGBFBRBb]BjBtsBmB{TBݤ|B^:wB9iBeB.YByiWBX9SB^BLaB`BŠgB%tB\}BOBq}BHB\BHBuSBhzBzkBynBC|BuBw>mBPzBbB͌BBڐBmBshBLtE1+\"S||; A&Cu& D&KwX'\l?0%?5@H@ff@-AK@W@bP@>q=>M?qKS'"K@@-A(4A`FA-`AshWAFuAG?AVw>G@@FAIA@VAG Av4AM,AOGAVWAVAAJ AluAvAR`A5AA\@/݈@shQ?Zd#@(@y@p@y@=AXgAtAA`AshAGA`A^A;}ApaA=AGA;AZ&AZdAh A"ADAzA%_ACA-sAlAhsAurA7Aq=>A; A@A @oA@1@{@wW@&@7i@<@@Ę@@Aף4AףrAAAVAAXgAMTAA|@X@u?^i??lgMbU\:`t00L7ishQff??m@@@uA@ף"A .A~JAxuAيA5^rA$AB`sAAxWALA'Ad;@p@33@@$"AA{FA-NAxA”AԮAAhAAZdA%AANbAX9AеAAOA'1ASAЏAtAA9AFAƱAAA~A)\AҡAAJ |APA\A`:A-0A@B`@@s@Q@@"@)\A&AYA1zAAvAAA AAmAq=AMTAZd#AA@P@@E@b?B` @K? 3•M/'1M<Mr1<|>~J?3@վV+oТ+D!VjMB}?J ?d;'@Q?shq@X@H@CA@y@Z@ף@F@@@@I@sh @j@D@^@@7/A1^A?5dAX9ASA/ݗAX9AZdAAffAA?5AjAxOAh)A@Ώ@?-!+ 9w+j '1-޿b?|@r@@X9(A4AB`+A/3AX9A5^@F@ @;߃@r@@\"@nRg! = ½J SNbr8^B BOB= uB33sBPeBzhB%rB)}BFvB؃BsBBBB1BBwBNB BBBV·BoB-B ׋BڎBBBm'BhћBB7ɘBܖBƕBLBffB`%BDBBBѯBZ$BB+BnBɶBBẟB/B+BhQB BB^:B`BhBءBiBߤBB>BT#B-2BB?5BBQBB`BB)BBB BmBBMBB۹BlBИB馑BB BHBKBBBBjBMBBXBRBBPBWB?5_B)\eBpBHazBB`%BZ~BbrBPwBDkBjiB#_BJ ZBOUBL7OBKOBB`^B?fBsB|BBոB BBYyBpBfB]BdZBףYBueBiBqByB#B3B BBBB"i;ߌ)\/ݬ= ;VˡKcp1+8-㥧M2shabˡJ #'Z_Rl bz{J ^;  {F@H>µ?t[@̨@CC@u>&5^// l[/`5^nP\+K~7d;/hE}?9h1Rh{S ;I ?56X5^ D12#I^ sffV7~+Fd;MZ| 7̘nZ$X9/l@Zdc@/@ˡ@Q.AOOAIA|AAOA5AA-@/@t> )\Кd;?B`@Q@n(AE`AIA#ۢAZdAΐAmAףAЌA9dAFKA9LAjA!Aҝ@Pg@'1@0@@Q@= @$A@A?AbVA,AJ DA A"!A,AX!Ad; AM@w@j4@@6@p@zt@@l@;@K@C AQlw=F7x?(F{(75^Hᪿ;?$>@/@9@7A(@K@q=AAo An@E@rh>/7Y~)\5I~tgԇ?5~NbC/AbshK V?5V/5^*9ؿvpzshd;j^`hٖ;J b(H(>"zCbXG9%ѿK@=@ff?;ߧ@r@bAR&A\ApAAzAJ AuAVnA.Ax A9@#@`?($?5V>u=NbX@O@TAEA-xA/AA7A(AJ A רA)\AApqAytA@A*AH A1@v@E@h@shA!AWAkAooAZAuVA\^A'18A+A`ȶ?rȿ= o7I9X9jr E|e001;߳+p;/$F㥛?-?7@V@-AX7AZA7A`6A-@'1 AB`@@@/u@{@'1@@zAd;CA!^APAnzA33A‹A٩AlAlAHA'1AA+Aq=AATAAADAȫAԕAAAAAAyAxAACA?5AҨAvAЇA1\A.A @@b?:@hU@ff@9AABAeAEA Aq=A/AANbA+AjlA>AFAA^AjAK A%@T)AANb@@P@Ap@>;O>XyhX9"wq=9+>NbH@%@V@/ݼ@q=@z?`I,#ۍo'1hP!¿ڿL7? @K@%@Q@%?@w@?j?>Q@@'@Z@@?9? QP^{Nq?v@G@@@u A5ATiAL7AāA&MA16A Aj@zl@Zd>ˡ=jd; q=L7 CIJ+F9w+ٚ^ɿI?oS@v@&AxAp5ArAsh@\*@yfMp Ƌ~9X96%y*H"{r,BIBsBXBB"tB=pBvBB%FBنBVNBَBEBΊBjBBoB-BshzB{zBBŃBDBɋBB}B BBBBB;BBB'1BB;ߋB BBABmBxBmB1BbPBύBBZdBBF~B]BZB!B0BB BB1BJ BB6B5B-2BɶBLB7BVB;ߛBBBB}BBBBBωBJLB9yBO~BsB|B=ʂB㥇BB!B-B7 BcBuBPͣBB ןBB;ߙB3B/BF6B=BoRB3BoB B馠BfBbBŠBɶBB^zBMBZBB"B B-2BwByBBˡBBkBB1ȋBBmB~~BqB\pBŠ|BzB33BBBoB~B3vB~pBfB/][BףMBQB HBEJB}MB9OB)\[BrdBqBxB WpBB`aB[Byi]BzTBP aB]BX9\B'1bBmgbBzhBvB^BJBB+GBB`B^B%B=ʃBJyBpBiBLqBkB(vBX9uB}B-rB-BB)BB\BځB}BksBB`B5B8BRxB合BÊBh5@S@1A:A-^A$AˡmAZdA'1rA]A4AHA@=@-?K7X9>-2;Ͼ`P?F@@@VA/@ A1@@A@@t@!@??5&@d;?vv@S?#Q@V@@ {@@Nb@shAAˡ@@\*@S@F>9Qsh\ "v'1AxMs~/ݚ00L7ٿ+>m#@-U@@TAm@%A'1ACA{XATyAAAAAXAףA㥐A&uA)\cAw9AEAFAI@ ATEAbJAPsA|AjAAAAuA{AAAAAA%AffA= A9AAιAAA-A;AA7AshA1ANbAAnAX9ARAshAٍATAmUAp/A@y@@3AI@AqA#ۂAwAʜAJ A%AA/AA-AAƊAOoAGAy?.^ajtsh 3shN\P>b@U@?M@ ׯ@lAZAA!AS@+@@AAx A¡@}?@@@T@j@; An0AjA)\qA#ۏA AA`AA(A|AffA/AjAgAR8AjAo@F@ %>d;7~ İҕOH& VO?5>#>lw@@o AA#CAIZAFAA33EA!A@x@B@(@h@'1`@}=?ֿL7Ȟ&q?5fffl_ˡ{B\rB1rB5^fB\eB,VBYBdBmBqmBxBvBBL7BBBD~BqxBw>sBkuBrB;}B.{BJLB-rBJLBB33BBPMBBHBBBIBw>BB5ދBBfB5ޙBÙB*BvBdBB'BZB3B3sBBX9BB,BB=JB^zBCBØBaB{BBBBw>BJ̈B=B7B)BBlBBBP͜Bf&B)BFBLwBPBP BVwBVzB)\BBuB1BBҙBeBBD˖B%BڑBBoBuӌBՆBB BuӋBFvBjBJ̕B/BEBNjBBBoBB'BB^B#[{Bk~B-BBd{BBѢBB]BlBzBX{BMwB.qBxaBcBkBrB!{BLwB{B{BwB;_hB^:\BhNBDBsKB'BBݤGBLByVB\BR8fBrBBQBtBB`hBukB_B!cB[BrSBPSBMJB%KBYBѢcBorBvBw>}B{B~B;pBgBcB-2YBDTBP QBm^B$bB\lBbsB B;B^:B`eBBcByBoBmdBXB_BZgB`^BJ^BmB!kBuB xB?uBB5BOf@KVgQJ5^tPyٷ{|= AH~^ma 'L7w$PEpKvjvJ shrH{A_/(pZdZD@b?X9<]оoyLZXVd;&ҳv)\B`F^ST{eC=q=X+3&w 0-ajDdH8*uP db}?/ݒAqDP +/+h `&A~Pw'1>C{@sh@+A/AzjAo[AdA)\'A/ A@2@C33KPv t-}5^jC@㥛@G@b@EAˡ)A+A(@y@O@-@?oþKHL7)Oh}?uFYPi1ƚ00*1zĿOm{V.}??D@@@@GA)AtSAAX9A'1AL7AshuAwAFA;=AL7A}?@Q@ @- ABA`JA?5vACyAّA= ADAjA^AMA7AAAshA?5A`A-AACAzApA1AAAAAJ ArAAףAzA AβAjAxAMxA7aA1A/@5^@33@@o#A $AR`AQzAAA7AMA~AAZAMAMAAp[A-7A/4AmAM6AG+A@V@K@;ߏ@ٞ?5?Zd /SlGM?Q@j@@@MZ@`(@O>MԸ#>(>n@@7@H@R@@+@٦@+@J @@ʱ@@@J @T@A"AAAAq=@Mr@?|@ʍ@ף@$A)A^A]AshA%AIA/AAA|AzAQFA}?A@J 2@=Rnff&sha^K%X9B`)\Vm?d@@A?5DAynAVhAwA^;A|A@T-@B`M@G@w~{yЎXB`~z^= BT|B33uBzmB!kB\]BRBX[BfBfB|oBvpB#~B{B-rB BbqBunBeBiB%hB|uBtB}BXBBNB%FB`%BLB`eBBWB{B#{B3sBshzBRBBTBBɒB-rBB?B̚BBB,B؜BcBB;ߗB B BB3BPMBَBbBzBVNB۹B|BBBDKBXB7B`B`BVΗB WBHBTBDKBӇB6BV{B}}BToBNnB+vB&B=JBщB/ݏB~BmBB$BBBsBBBHB#B%BB%BVBdB4BHaB BBNjBBBBB\ωB|BB-}B;߅BB#[BoB{B-Bq}BB|BD|BLsBR8mB#_B}_BjBmBvBV|BHrBkwB@iBPgBq=[BJSB.HB?5JBH@BBB$:B>BbBBDBuTBD`Bn_B.QBpGB,RBNB"UBdSB!0NB{UBxMBPB._B}kB}?xB3BwBˡB(BBTcxBoB$bB^]BEWBݤ`BѢ\B/fB;fBqBvB‚Bw~BB@~BNzB5pBhBo`B#kBw>tBgBkBzBjzBBsBuSB+BB$X-}?Vh9v= CEwX{B`wIZd[5= AL7Ij4?Y=no3ҽ}?&w :Fc~|}?^GG%D+vMb> p@d;@ZdAArAsh@{@FH: CUЁ\xX9 yv{ףĥvtMn6j&+Aq=&b@~ٿO5|/= b\w,D1 pffB`EL7YԽG @zT/]/`0 +>@h}@+@@AhQA;YAA"A̩AX9AADASANbPA-Ash@F@= '@hM#y`@?5f@h@5^ AO=A;oAA33AshAjAHAATA1A\AVAґApAˡYA AD@7@/@@tA2Am[A!AAGAB`ARA}AyADAAwoA#[A&Ay$A@AD,AL7UA-A= EA+.AEAhWAhWA҃AlwAnA!8AS;A)A>AA~A@z@ˡ@@~B@X?n@B`@/? |tT;00ԬzTlG?C  @@Om@@Ԕ@ @Aq= AyVA= iA@A]Aw)AVAAC+A*A)\AZ@KA@"AANAnA}?AhwAAjA|ANbAIAhAL7AffAApA AjARANbAףAAԸAʶAlA%A1AoA+AlAX9AAAAA}?AuAmYAMBA A@RF@@$F@ff@OAffHAHfApAZdAAαAIA'1A#۫AQA(AhmAVAB`3AKAAff2A=AA7@ʵ@$@5^:@A`>T>33+ZdhXˡſd;??+@@x@X9@shy@v@Χ?? ?U?@d;O@D,@"@s@@M@@`@?5@p@j@33AA!A3AB`A/6Aj"Ad;GAV[AF-A!:A` AˡAo@o-A+A|]AȀAvAPAAKAAxAVAAҾAAAA҈AsA9:A}?A@/ݔ?;@=z?ݿlu((%?j@@3ADTAoAA9AAZd_A3A A$@-@S{@T@G!?o<{S= X9I$ pV޿%DBBB)vByqBR8dBQdB/]mBd;zB7 }BBօB۹B5^Bf&BB%ƐBBpFB{=B;ߏȎGMdMDMy̚y^H& / !P>rx齚y?T]ffNb )vPCla+vףve#}+33mXwB`Mw=!J XIF+;J >I!%r>+ j--X#\oKmm gshѾَ?H@[@1t@B`??@@`@@A@ ADHALA҄AXAEANbAAA?5xADA+An@U@Q?T%u|\?5?@h@I.A[A1~A+A A= ArAقA+iA1AA@f@C;@S>|>/D?q=:@-?v@1@@G@I"A\A AAA:A+NArDAsh?AAB`AQ&A"AAt@Z@@\@tA`A73A2A7?A AA@A@̘@?Dff?D b@Oҍ?}?ſD̿RL700IP sh-?'1@"@@q=@o@o@@@AAq=*A= YAsh7ALA&A;AAV!Ax@X9@j@m@j@A ATA7'A/cAR|AҚA5^AףA/A33AFA'1AA}?AffAƥAAAjA\AhAX9AAAshAA/A9AlAlANb|AIFAZA~.Aw@v@@V&@m=33S:?O@Ev@E@r(A!JA;{A-AxAjAJ AMAffrApSA 'A"@O@ @C@Vu@V?j" VVlj'1|'Q V\ דTe#Y?71@G>u=q=~>= >Y@X9|@y?H@E?S@VV@ȶ@@+?@r@r@v AshAr&AE0AA:AF5AnPANbjA{JA'1`A33;A kA+^AxwA#}ACAAA ׮AB`AvAAAҶAAq=AAvAAA"iAT;Ax Ap@C@O @?5?Sӿ#۵}?hmQ~?X@$ASA}?UA%cAX9A?5AL7{AZdkABsEBbOBzVBo`B,nB}B|B)qBfBeBoYBDXBrOB{GB?5GBu?B|AB@OB{TBaB!fB^kBjqB@eBw]B7UBGRBHBhFBJIBWBTXBD `B/jB5yB}BBoRBH{B;rBjBfBw\BXPB$VB^BsTBNBYB?5]BjBkB$xBwBB+lu2 }?F'1S!d̎B`o~HV)\ʂZRA1X9F!:,A#XZda+ooFq=NbZdK}?kt3KR>G@㥛>D?=X??h '4`rhmt/b(&ΦffVD7wĀRXuJ>w~>p$yBh(^p#E/#%\Jף"M(wϿX9T?y>@ff1 ?F#rףp^@B@RF@7@- A?A|IAPA+AZdApANbAAXcAˡ'A+A@\j@;/?T=Pw--@@VAJ @A?5lAIAB`AA A?5AOAIAmA^;A$A@5^@X9l@&q?#@?e@?n@@NbA2AXA?AcAJ ^AAnA|A{AZA+LAAj&AL7IAX9A6AZ A~*AJ Aff,A "A-A QAlIAAAmAL7A@A~@@6@η?A@m?a\"@@~*?ʁƛ; H000 B`ȮshNb;}?@oc@?~Z@ @vv@B`@S@Av:AQANb0AjAA@K@~@ZdK@p@oS@v@ A)\A"!AAMJA^A$A-AΛAA~AʣA1AAAƛAAKAAA|AJ A%AA AAA"AAAA;߂AxqAu}?=)\oA(j ?51 K@Zd@l AtAGA/`A8A((A\@@+@?\@'1?+?#۹yFRvm9r'lBiBfB5^\B^BQB/]QB!`BoiBnBpxB|BBbBBB!BڅBBV~BvBݤsB{ByBJ B!BBoBB+BB0BB+B!0BBB'BbBכB١B_BBB&B BDBBf&BBTBBBjBBʖBBBB'qBbУB7ɢB+BBdBSBbPB= BËBܐBB#BBBZBd{BBϐBw~BBBzBj{B+ǁBBWB{TB BB\B94BBB香BBϐBɶBBdB94~B!vB B^:BXB3BIBWBB1HBBoҊBߏB)܄BD{BHavBHakBhkBzxBŠBB Bj|B+BhB= B7 ~BtB\vBmBq=_B)]BCdB)\jBpBvBDoB^:iB^B= TBDKB?Bw4B>B:BCB.JB QB]BfBsB7B~BqB)\cBgBK[B;ZB5PB"IBCB= >BHa=B`KBVTBobBhB#lBBvBBlBbcB"WBwUBw>HBIBJBWB\BbaB,jBwB}BB B^zBSB-xBoB94jB?aBuTB([BbBUBDRBaBu_BOjB3lB-zBhQBBM|GX1x|CmpHG\9vMhh-D>u(Q"{XPsb"Q!bd+㥯7?5?Gr>{?X9?NM/8xss+A;ߠ‰ِ^Vҝ1lbO#GL7+Ej2:y/ 5^X9>$ˡ&+L7z4ffB}?\Bsh9o@-/VQ8K?@r0@!r@@q=AtEAYAXAԔAHApApAAVAJ LA/Aף@nr@;?sh j4}?5>j<>5^j@D@\AIAtuAZAԧAtAPA?5A/AAAmSA0A@G@@S @F@w@@@@ AH&AvFA{dAHA'1lA#WArAA-AylA?5hAB`/A33#ACAA+1AEA'10Ah#A0A6A$A-]ARRAUA.Aף&AAA!@R@-%@t\ @b@E?+X)@E@VXZdV:00+V@ff?(@@@5^ A&?AAA AG?A"AHA+KADZAKiAhA^A(ApADA{A;[A0A@~@Q@Nb@-@¡@v@J AYAˡAFA}?ASAˡA"A/ݙAAhyAhACA-RA#9AjNALAshOAAAAȎAuApA A(A|ASGAAAw Ad;@wAnA"Ab A\A@@@@5^Z@Z|@@ @u@)AOAhAȚAX9AAIAGA;sA8A+ A%@XI@%a@y@x @{v~B`>XIIdZd( +!vFjz|X9$zLPw1>)\WOsh1Z$V>/?ף?y@@{A*ANABhB5BNB1HBRxBB6B}BHBOxB?5~BT#BBDBd{Bw~BDBB94BuӖBq}BZBJ BqBYBJ̄B-B*BhB^B1ȎB7ɊBFBBlBbBBxB{rBw>iB_BLTBzdBKkBZwB+BBTBBbPB.B}BnBsBZdkBiBTbBbBdlBxByB~BBZ:BjD$5^rh/@Tˡ{xsX9Inˡpk(X#A!/}pXɿZd?=ˡ-jy~\91 /;~4Mq=X= gZd{= 7?)\/#ۙ= O# ¿@jd@T@@v@,A]AףAZAˡACAAXAACAX9.A#@d;@H@I ?v?~@u@OAK)A OA A|A-A5^AKATAˡAAAB`AjA גA^sA5^zArPA-A @A^1A-IA}?MAhmA A5^A(AEAnAZA!AVAŒAƇAtyAdA1,AA= 3AQA~0AAQJA1JAaA= eA`xAyAٚAACAmA@AKAˡAAsh@"{@1@@V^@G?+g@1d@𧆾&qvlX9700h@j\@ @X@@{AK9A%?AwA)\OARA'1~AX9rAA$AVAAhAAOA;ߊA!fA`4A/@ff@?d;@P@ @ff@VA/4A%iA/ACAq=AwAArA9A33gA#]A)AK!A#@@/@@bAo7AiACKAz$ANAq=BAOApUA-ACAT#A%7A{FAlEAMLAIA$AtAx3Ab A`A@uAj@B`@A;%A(dA(rA#ۅA(^AHAlA`Ao#A9AZd@d;?;@u@?shy&{?HڿIl(XP#G ?5/ݔvff331'1G1j;;/VdB`}Vc339vJ bT?J @@|@5^@Ȫ@?ҍ>7Gy!Q >/ݤVV@;߯@n@&A-ALA A"EAAHA#cAB`[A?5 A5^@X@7 @m@@=/ݤQn(B`#?5RwgE2 "{ף0?p>@CK?m;?n?G>:h-#M!2@33@uP@Тlg>j|?-ݿ|1㥻t ?ƿ+G?ˡFBDBJB3DBPNBVDB-2LB\B]Bn`B{dBCiBmvB|B>BՉBHB94BxByBsnBd;wB'qBmrBwBxBrBoBڋBq=B33BB%BVNBwBBuBwBBZdBVBTBffBQB+GB=JBbBBJBs(BBkBoҝBBB/BBҟBhќBBBēB ŽBVB\B'uBhBnByBuBwBYB3BwBBbPBBVBd;BËBBB-BOBDB/BhBVBBB?uB BzBjtB5^lBgBף_BKRB9HBUB]B= lBmguB;BZ$BF6BHB}B3BptBqBiBneBR8gB'1fB%hBvBtBBmgB/}BQ{B'nBpBhBZrBLrBgBVkBKhBsBB`xB1HBAB΀BѢ|BnBףfBTZBXBaBR8`BtiBBfBwpBvB`BIB= BoҏB%B „BBBzxBynB;_aB%\BSNBB`BBKBGBFVBESBOZB/]XBffKB{CBrABF6EBBB{HBHaRBSaB%nBvBӍB9tBaB}?BDKBBhxBJ jB= fBˡYByiQB)\PBѢSBuEB>B^:FB W@B`eLB@HBXUBNbXBV_B^[K3 M  ҍZSc)\Nb7hW7o?5t+~{B F`1w9(q= >w1 ;߻d;oףXy 1,pO-L*oλ/SP?@V@@@2AuBA,A@/ݬ@!@5^:>ERVQJb|(VQosh"gE$ΖS\ a5^2qM@(@<@q= +nGyA" .y >|rzrbw/ m9pMpҽ?5TX9X5^o?~*@X9@FAK3AvpAAbA]A&A'AT@z@Y@?7?=?@z@/'A%A5^FAdA-AAԟA+AAACAyA A!ArAAd;AFAwAfA/[A&A כANbAoAL7AhA A%AzA&AHAףAbASGA9A@-j@/@@ A A5^BAbZA+~AvAAQAҚA+A+fAAAQAAS@@@}?@@@,@5^?j@j?Q  o9/[003A)\ AAAm Ash7Ah_AV=A4ATAPQAuAZANbtAGSAvA דAAxA^AxAZ:A(AB`@~@-?du><)\OQ0@7@ AH:AI>AsheAQA`6A/A@"@ ;@ 2/=d;'OK?G?V@/]=ƛ(@#۩?V@ˡ-@C?@X?v@o@&@/AS1At%AD@ADJAIAQ@`@-E@z?d;?EV@ c@$@@oArAI8A$ AMANb@m@R@q=ףp?DL?=(4@x??'1(E6FQb& X̴Gq=Vp j0t@GCrJ 33oKY!:ˡM>y@'1@@@T@~J?'1" {.+shNbh33ÿV?z@h@q=@o@@"A@)\@+@Z@\@7a@5^@shq?=+@`?@C?;;wPDnEj jJ jJ fff@A(@R>G?(^a" [+|rX94PW@`@B`@K@Po@!@u@x?@@~@$@̜@!@`HBq=FB"PBLJB5^WBTB_ByijBHgBytBorBA}B'BB`B㥎B쑓B`BwBTB^:BẃB33BRxB{vB{BXtBsB9BTBBB3sBBcBBhBH!B1BuBbPBBBB馩B吩B}BBBB%BrBhB5B֣BNB^BոBLB!BBBBB BZdBBѢ~B7 rB}uB94wB;߂BBq}BBVBsB-B'B9BBB}BB2BB'B7ɅBcBBB-BmwBRtBshyBoBjB W4B0Br1BI=B)\@BRLBL7[BdBrB^vBoBdBمB3BB WtBXmB`BP hBT^B%XBNBshNBq=EB =B5;BX8BDBHIByiTBDNBWBVm\b.@@@j@V@?=(lKtQ (!JJQsh= "h-?V?ҽ?w@?P?׿L`%9+0Ȯr#xGoU/B ehͿJ @<@"@D@oA%5Al-A@@"#@B`=U` == mW9h@ R!J 0}?iJ zwcd;kDr p6p?'1p@A@v@n@q=>hBZdBLB{BFrB+xB$pBPzBpzB94oBhB}\B&UBBSB}?XBfcBjB#[yB\{B3B^BaBoB`B= BPBwBBB؂BEwBnBVbBWBIB{MBTDB}MB!CBTJB1CBsh5B`ewBzBNbB7BBB-BRzB!vBujB,sBP pBgB\B_B[BNbNBMBLB'ZB]BmghBfBZoBm~o3R>?-@-@K@L7A@q= q=?5")=xX9J *;oPWD (DR>^)\)\33Z+PGĤ/l1bp K(RףKξ>@G@33@7?sh?K7Ў$p+-Dˡwo!z{GZZ\A"eAOuA= UAB`SAFaArhAPAyTAlA= MAuAX9AApAyvA33kAR2A= A@~@%?-?5v'1z?(@-@@@AVAEA!@33@?+6ffB`&1{5D\vHlA{|V v+?T=n?@@'1A*Aף&ANbZAcA/*A+ A/ݠ@= W@9H?w߾'>d;_= ?MB?Nb@Q?Ԕ@D@ @V@j@X9?jTM-?D$@A?@Ā@#y@:@ףX@C@Nb@C˿B`%(DZdq= sh(SF ;rFj>^)ERn!2?@@x@@{@@R\zQ/Q^%aη$sh@?ף@1@@ @Ɠ@x @B`?`@m绿#Yq=В?P(l@ffv@V?/?J ҿ`Tտh?S?-@T@sh@@M?Ck?5wn|1™ȿS?9@j@@m@@(Ax AF@\AG@ˡ AHANbAAfB#B'BBB7BŋB B@B=ʘBB3BBD BBHBTB^B^BB4BjBZBΖBBpBBBbPBXB%BB"BJ̳BoRBwByBBtBBoRBB#BVBB BrByBbB/B?BVB;BB`B!BdBdBj|BNbB)BBBئB7 B;BBBB+BƕByBBB)\BBJLBzBBdBbBTBBzB7B㥡BBBBOBoRBŠB%BܑBŏB{BshB~ByB)\nBjBdBw>nB?xBBHBBLBNBjBȃBdyBwrB#[sB}gBiBfBsaB!oBpBX9BBuBlBnBBB/BB!BŒBϷBոBBB%B#BZdBdtBLhB~hBwpB~BB/BfBmBXB5BƟBB`B2B5B"B,BǐBNjBB{BwB)jBTmBshcBQlBbBjDʭԌI&ffjC?5@\{\x a= ish1l7D^D4~!j -:m^yw0Fv~ףFDPff.V- e|TƌSs/WX9b'1h?-?@{?Vx/Qo7Rh}?WuXZd?5ٶV-:к- Mj xL7W"b>r?K@@QAףBAxATYAHAAyA@}?@Rn@"?F3@ ?q=B@@; Ah7A%9AXAd;cAo{AEAJ AKAAjAAA%AA)\AAVAA/ݽA9AA㥪AAAIAKAxAshAAARAAAfAshAARA!@.@"@V@33AmAVAkAA AˡAAQAAdA-AHA-AAp@@@CAAff@r@%@v@T?7Yj7G00sh=A4A($A}?A@K/AGIATA?5A~"AoAo;AAx;A'1 AATAGQAV`A8A5^*A@ ׷@Q@33s?p-ffjsh|t?S@x@/@vN@S{@!R@ +?JˡSj(TK'1M/TM¿TP90VT㵿R^?sh9@#ۅ@@T?x!+Nbuȿ15^Zj? ?`0@lg?}???9 @CCff/lʕˡ% T-+t<5^" NbZPSc-F?'1%AJ "#@*@ @b@Te@l>O QVJ T-K D ??"@@|@@!@t@"{@= ?~j?xa@@9?@b>j>/%@q=?@^9@ /t5^XM/=#۹m? @he@+V@th>CjZuU%?Nb@ٶ@\J@@@@~@V@O@@7@@&@xB}mBvBqB||B}B`%BBwBaB\BfBΙBZB)BB-rBBBEB`eBB=BGBB%ƅBJLBB B-2B BNB!BB BBffB"B3sBϷBöB+BBBGBBBpBNjBbByiBبBBB?uBvBBB;BFvBB`BB1țBBB,Bd{B0B;_B!B+B×B=JB۹BB\ϩBHBYBAA}?@5^A{@Zd@X@5^R@(@7@b?@s@?o{}?LRz00hA{AeAsh]Ax=AxcA/xAPEA>AGA`VAzlA5AHPAQAˡ3A$lAaAף^ARA-BAtA@@#A@w??yvF"~J ¾Q@3@&?-@M"@B@?";ߟT !sh'K'1,JC+:jhˡQ)\+1&Z(^= /q>#@/@w@K'AX9*A7_A`A2AAA$@*@ +׿!:7R%?F@y@@j\@|>Nb޿@X9L@Zd?yv@@M@;߫@y@w@@j@??Nb!#۱(D9MTV33?CO(8-9{/݄$?w@@/|@7@L7@d;?鿢E%ףGGL7+$NbԨshIB`X(@}?@@@ףH@+@S㽬> @bx/,8%>B`jD@>@">ʡ X9ĿJ L@1,@I@ˡ@!@bx@j?shB` ׯu|FD= V>d;O@@SAff@n@C%A5^A@QA ANbAGA A(AHoBlBzB;_uBfBWBB BF6B/BFBlBΘBTBBԨB/BBBXBBBBBkBBBBB+ǕB#BBB7BɶB5^BܴBBBwBَBBZB-2BBBBbПBBB|BBBKBBLBmBRBKBJLB\BB+BBPB!BxBѢBBXBBBBJLBXBBȨB,BkBFBB'B3sBBlB+BZBBB@BځBmB\B5^{BwBfjBףkB^BrZBŠTBYBTcfB!jBףzBEyBM}BBCwBwBkB;dBxgB%^B@eBR8fB^BykBgBuBoxB}B}Bd|BWBMBhB BČBjB}BZBsBB*BZBiB}?BTBB?BuBBÔBPMBẛBIB7IBZBB33BHB1BBB\OBEB}?BȂB|BQnB33qBZcBL7fBmWBy]BRBNIB33OB)\UBaBDfBvB`%B(B-Bq=BBBNbB+GBߍBxBޅBQBFB!pBMBwBuBBsBPhBDaB!0`BkBblBXtB#iB)\qBX9Pˡ5GоIΧ&\G)X_~z}?ˡwxTK0> ?5--@_@C@ˡ@@PAS!AC]AMlA%AffAKAAAAAshqA+;A A@-:@n@A~&A-A`AVFARbAaAvhA/kA= [AT1AZdAb@D@j?z?x?w@$@l AIA(AAףA&AEAz@pM@Zd>S%?x ףL75^V@ @ƿ7m?Ck1|DJyvJ 0033AshAshiAlATAEAzASAzRA{pAjAAAףhA-wASAqAA5^AvA-sAQrA:AEA= Ay@@xZ`0"#@$>@5^@x@@j&A| A| A@n@i?Nbp'1I33L7J r{L7X^&L7 @+6?;w@ˡ@Ay0Av`AYAA^AZAIA Ah@HJ@?P@-?XI@n@fff@Tm@@V@q=@L7@A@6@Z?1?!@+@^a@@ A/@/@x@{@@@W@ts@X9?F?q=>D4{~RoYd;vJ Itl9j$|ffr@>B`@پ@}?@#y@^@{@= ?B`so #FS+Fffƿm*@@%@^y@\@Zd[@V?6F>?F33Z$`倿|?I?r@shy@b?P? K--2#ۉ-]?i@R@ҝ@㥯@@@ˡ@-r?Pb{(E1!ҿt?w@u@ A= @'1@S3AzA/@A Av A,A'AR8AP9AzBrtBFBo|BJ̃BT#BBuBBBBNbBTcBОBSB"B!B BBŠBuӜB\BBoBB ׆BB^BHBZ$BϚB{TB/BYB`eB^B^:BBBZB BB{B;BLBBBhBRB#B33B-2B9B)BsBڮBB%ƪB\B BBgBmBBBxBB^zBjB1HBBBBBFBB)\yF(\uK/&mx%AshΞʓMxLX9Zff:TK@QD2$NVʌ!ʁ qB`X9mmĹG{l?Zd}??5:shW5^(y33+ή1= {~%Aٟ(Nbz9D0Ro}?Sh]#ۆK}?̧ZJ O%lQffP%1PS}vt-VjGQB&-J v?x@Nb@x@@ˡ?d;‰AhhIZCww?5ο$?h?jL@@@ApAIRA5^dAAAA$AyAAbPAZ&A@Sc@Z?33>p=@M@u@/A$ A!PA#KA(NA#QAJ FARAq=@33@z?+Ve/dH:OE@{@Zd@@ A{@R@RA;@ ׯ@O@XY)\A1r #Z?)\/?}?=ܿ$>Nb@v)Uo00jAAףAVASyA’A AEnArA9rA?5A|ATKAHAAף*AeA1hAA-gA$lA)\7A*A\ A33@_@z?9?Hʿ!??5@}?@u@Ԭ@M@pE@Q@Mb>ffʹw~Zd~ q=bU^ɿIxDt!KgJ ΛmIz z?҉@@"A0A%cAF]A$AAb@/?7%!q=*+?5^?XY@̐@x@(A@!@9@H@>d;߿?@33@XQ@@\@ZdAy@Av"A9*A-@@shy@= O@1?\X)4O=п>뱿/ZdG¡iu>@٢@PA@@A@X@ ?-}q=m3?u?*@9@!Z@{@"@@'1@@?5^<'1?NbPj<=F?-"@@@d;AA@;@@@(@@@AZ A/+A?52AX9"ARA5^@ux@X9=F# 7a ףhڿm?|@@ˡ9A"OA/A3A!tA-pAVGA%sAQJAw_ACA\A1HA}BBPB;BBBBd;BB B^BB#۩BZBBͺBBqBBB{TB-2B{ԡB9B%FBs(B5BRxB#[BDBB?BBF6BABw~BLBBLBBBy)B9B}?B˵BqBŠBBD˪B`BHaBYB%FB!0BB/BXB\OB%B BBB}B«BoB=JBўB BBDKBӍBkB#[BˬB}BB^:B׼BݽBbB9BB{TBBģBB;ߙBw~BoB%B^zBdBB^zBwBՇBB}BxB/oBJxBBMB܌B5Bs(BB9BGB+{BvBD vBmB+wB94rBhBvBjrBBJBX9BBΉB=BB㥛BB יBw>B֑B`BBd{BĎB/BˡBEBuBBBB/]B_BŠB՟BإBNjBΫBXB@BӍB7ɰB!pBB}BJ̛BXBZ$B BBBZBrBruBsB-kBtBzjB`BNbhBBiB)wB@}B۹B= BqB>B WB{B%BBBeBBB`B%ƌB,BBĎBYB BlB}BBrB^:BB/BBŒB1/Ђ S/,y ^vR#wt#۪OPA)\Tٽ;ߢ;ߒG/݊-ejnH ]-yʏ}?ċˡ ׹NbXA%G+ZjXm%o C}? yB(vAG)\n'19u= mlVXmˡbZl{XOpMR(QByzff ||q=~R1+|΄/݉^Y}Cˡ(t Zdy`h4q=?둾@@g@ @ff.$)\u9"b.92-#!/tw~m{>??ҩ@@!AjATA|mAxA;iAunAwKAjAA`@]@> \?Ko@Nb@{Az@A AA A?5Ap@o@?77Vuj)\/@xY@¡@h@@J @@ @IlF{|owv#ۭSh5B`|u%@Vr)\V00ZdAshAZAAvAAvAAЧAAjAbAXAAtAZrAMA"ATA%AA%sA&iAhUA!$A @~@&@S?ff@+@&@)\A`A7@"AAAƿ@98@{NTnuHIrXX9ڿˡuB`eB`e9OH?b?{@!@/ A@AjtAA"A'1A-AVA?5,AAr@Zd#@|@E@@h@K@t@D@bAV)ANbAP#AF@D@c@R@AA@/AILAA>A%MA=AEAAZA/QAj@7A@@ @K?->Z<@ @@~*?:@%@;'@?h-VnԿ!\X?y^@I@d;@5^0A,APAFAA33@̄@?XĿztp@b(@/ݤ@v@m@-@@ί@= @@!@}?E@V ?;h&?|-G? @z@@w)AI@AףAAR@@n@r@#A5^DA1FAshOAvVAIPA5A~A@F@tj~Tmj/ݔ?7@A'A}?cApAZA)\uAGA#ۘA㥉A A~Aq=ArAA'1ABъB`eBB+BMB}BBbНB\B֢B BvBَBH!BTcBLwBBNBNBBNBPMBB1ȝBB>BZB|B9B\ϨBZBuBB BB?BZdBJBHBB^:BJ BmB=ʳBBCB:BBBXBBf&BB+BBBҵBXyBB含Bj|B5ެB쑬BvB]BB^zBuӝBB5BB!BfBB^B/BмB94BB!pBFBBNBգB#[BBʛB5ޛBuB BBxBqB{BBTB!BBfB sB{B%ƁBlBBTB BBNBHBBwB BفB-Bj|B)BڃB$BB~BǏBB#BBoBBՠB-BwBBiBIB;BVBBBUBs(BBBBBѢBBBBڵBBݯBq}ByBB B5޳B-rBߏBͨB3B}BmBȕBɒB8BXBTBgByyBqBݤ|B̀BBBBٛBjX鿚E= ZdL7Tff;߫K6V-9yh00AAAd;AA)\AAGAףAA+A33A}?AApA-]A A9~AʔA#ۍApAЄA(AЅA&YAzDAXA#@%@)\@B`@@AA?5@M@+@`@u@q= VfNb?5fV<+@33?oy™ ˡnwO ?>@@ACA(lAA|ANbAARAshA`nAE6AhAd;@9@vN@b@@^@~@zA'A.A/ף㥛>Hzv?@K@I@ Ax[A7AvpAAB`wAA1AҗAAyAOAIAGAQAB`gAu0AX@Z@?ܿK?I >|o@@ATA?5RApAzA1AXA7Aq=AwA{AL7A(A?5AAd;AVBfBB^zBƝBB BhQBwB֪B-B/ݰBBmB}B/BRBBZdBBByiB]B#B_ByiBMBPBB+BuBuBhB;B= BuBXB/BBy)BBuӲB\OB#BRBHaBBB BbBuSBBѣBBBYB~B`B`eB'1BBJBnB B㥭BuBZBBJLB/B'qBP͢BB{TBSB5BB^BB-BBNBHB+GBwBգB͞BŠBB^zB{ԘB7B_BxB)ܐB B\BBBB{BNB;B9B;BB BBsBffBsB!|BpBquB}nBuB#[jBD^B1aB'dB'nBBwB(B+B(B B`B+BB1BB\BÒBmB= B]BݤB({B΀B-|B˄BwB!0BۗBFBMB BJLBBBbBbBTBĤB7B0B̗BBVB3B3BՋBBZdB9tB%|B}BqBloBV}BI~B\BB5ޏBBBݤBB-BBOBwBDKBXBZ$B BhіBBVNBBB7BBVΊB+BBB+BJLBϷB?5lI;)jm'Zy/ݞ #Xhttu q=&҈s+KC(X9v!ף;J +Vҝ/݊L7WuHVף;UZnOj! = mgFˡD$Ѓ@œ-t-b^{PkC/ݘİy;ZdL7L7ZdHƩZdYpPsh9\F]@ZdC|d;>j4@T?J B`sh2B`7NbA&AL7WA`FAYATAv@Ah)A2A@AX9@A(APAIA5AffRA A`A?5.ASAA&@#ۭ@@Ԉ?EN@@Nb@j@q=@X@`@x@?+@33??#y>{>5^RN/ݔ:L7ɾ?@= A;AkA+cA!A lAAAĢAtAyAxA1AvA {AEAA#۹@PW@J ¾~!?5ο@@+@= 9Au>AffpA= {A5^AĐA!ADAX9ADAq=AٴAARAA2BȐB`%BoBÒBjZB%iBuBV{BB쑋BBVBBRB3BuӁBouB}mBhB^B3aBudBŠeBrBd~BrBNBB\BfBfB֖B*BBBGB1B/]BEBBBP BXyB;_BB`esBTnB-hBBaBufBD ]Bk[BwiBIjB;_wB'|B B(B%BvB{Bo|B`evB&~Bw>yBxB!0vBTcB'1BBBBB-BBẅB3B;B7BBEB_BbBZdP̋mSV|rVD }…k¼Zdh~ff7/zj)\#VE$-¶'ž*'YoTH٫VA$+M ®G-!ƒ@)T!w yi œD)w!%)ZI}??5A%ww{Lƒ;² hP F/HrX NbLx'1&qz- GVSy̓- זd;L7mzHX9Zd Ġ +EV??Q@@q=@sh@m@DD@1>ѿZd- 'ףT)\EE{M;:^It<?@?hVe= - HmY5^&#xyf~33%7q\|n\_RTJ ROA/&V\"Qz,ZVy$wz00hByA-AAA/AAAAˡAA ׸AGASApA"AtAyA~A-AˡAA}?ACAB`A!AtKA5ANbAˡA)AAM,AAZ@uA@ AV@I@M @?J Fſ5^>>z@A@x)?d;SP?z4?X9@J b@Q@@p1AZdSAćA~AlA{A33ApAHA-ATA APAA"A@Nb@x@@IAAGALA?5^A}AaAq=`AAJApyA|A$AmAAAпAbAA5^AEAA+AjAAADjArNACAJ zAmAA{jA|A+aAGA#A{"A@AbA33'A9A'1XAƉAA"A A"iA$AdAZAu ACAƷ@S@G@`P@@`@oAI@v@}?@{@w@ʱ@5^@+@@z@Y>A?l'@}??@ن@Zd@tA\j4u2 %yiX9 Tc+Mb~)\ u+Ha&,¾8q=>O4Y8)s#RYZ …k%B`-,J5-(Jœ-Zd1tAx\5^?5 ´jdª"94 °y!R !NbN“ shot?5rj/W%-xh'MVtuvKjºhfj^}?IL'1;&a~ ף?~*@ˡU@⾉AQ\$ˡWjw1RrB`uHVJ X9wsh/\&($rffTmEwXlbT"H&&j5^`#'RˡҝQ(L7cfe++ffq=d;ˡbio3d/inst/examples/aspirin.mol20000644000176200001440000000400714046015221016301 0ustar liggesusers@MOLECULE ZINC00000053 20 20 0 0 0 SMALL USER_CHARGES @ATOM 1 C1 -1.4238 1.4221 1.2577 C.3 1 <0> -0.1370 2 C2 -1.3441 -0.0813 1.1904 C.2 1 <0> 0.4790 3 O1 -1.4532 -0.7378 2.1988 O.2 1 <0> -0.5137 4 O2 -1.1519 -0.6914 0.0093 O.3 1 <0> -0.2785 5 C3 -0.9822 -2.0375 0.0080 C.ar 1 <0> 0.1140 6 C4 0.2935 -2.5790 0.0577 C.ar 1 <0> -0.1438 7 C5 0.4647 -3.9491 0.0557 C.ar 1 <0> -0.1168 8 C6 -0.6330 -4.7933 0.0047 C.ar 1 <0> -0.1375 9 C7 -1.9078 -4.2739 -0.0447 C.ar 1 <0> -0.0755 10 C8 -2.0966 -2.8882 -0.0379 C.ar 1 <0> -0.1363 11 C9 -3.4564 -2.3257 -0.0844 C.2 1 <0> 0.5228 12 O3 -4.4256 -3.0711 -0.1243 O.co2 1 <0> -0.6853 13 O4 -3.6170 -1.1130 -0.0830 O.co2 1 <0> -0.6764 14 H1 -1.5815 1.7317 2.2908 H 1 <0> 0.0951 15 H2 -0.4932 1.8522 0.8875 H 1 <0> 0.0914 16 H3 -2.2544 1.7698 0.6434 H 1 <0> 0.1039 17 H4 1.1543 -1.9280 0.0976 H 1 <0> 0.1207 18 H5 1.4605 -4.3654 0.0938 H 1 <0> 0.1210 19 H6 -0.4882 -5.8635 0.0032 H 1 <0> 0.1200 20 H7 -2.7604 -4.9357 -0.0844 H 1 <0> 0.1328 @BOND 1 1 2 1 2 1 14 1 3 1 15 1 4 1 16 1 5 2 3 2 6 2 4 1 7 4 5 1 8 5 10 ar 9 5 6 ar 10 6 7 ar 11 6 17 1 12 7 8 ar 13 7 18 1 14 8 9 ar 15 8 19 1 16 9 10 ar 17 9 20 1 18 10 11 1 19 11 12 2 20 11 13 1 bio3d/inst/examples/hivp.pdb0000644000176200001440000004043414046015221015502 0ustar liggesusersHELIX 1 1 GLY A 86 THR A 91 1 6 HELIX 2 2 GLN A 92 GLY A 94 5 3 HELIX 3 3 GLY B 86 THR B 91 1 6 HELIX 4 4 GLN B 92 GLY B 94 5 3 SHEET 1 1 3 THR B 96 ASN B 98 0 SHEET 2 1 3 THR A 96 ASN A 98 -1 N THR A 96 O ASN B 98 SHEET 3 1 3 GLN B 2 THR B 4 -1 N ILE B 3 O LEU A 97 SHEET 1 5 7 GLY A 52 ILE A 66 0 SHEET 2 5 7 LEU A 10 ILE A 15 -1 O LYS A 14 N GLU A 65 SHEET 3 5 7 GLN A 18 LEU A 24 -1 O GLN A 18 N ILE A 15 SHEET 4 5 7 ILE A 84 ILE A 85 1 N ILE A 85 O LEU A 23 SHEET 5 5 7 VAL A 32 LEU A 33 -1 O VAL A 32 N ILE A 84 SHEET 6 5 7 HIS A 69 VAL A 77 1 O LEU A 76 N LEU A 33 SHEET 7 5 7 GLY A 52 ILE A 66 -1 N ARG A 57 O VAL A 77 SHEET 1 14 7 GLY B 52 ILE B 66 0 SHEET 2 14 7 LEU B 10 ILE B 15 -1 O LYS B 14 N GLU B 65 SHEET 3 14 7 GLN B 18 LEU B 24 -1 O GLN B 18 N ILE B 15 SHEET 4 14 7 ILE B 84 ILE B 85 1 N ILE B 85 O LEU B 23 SHEET 5 14 7 VAL B 32 LEU B 33 -1 O VAL B 32 N ILE B 84 SHEET 6 14 7 HIS B 69 VAL B 77 1 O LEU B 76 N LEU B 33 SHEET 7 14 7 GLY B 52 ILE B 66 -1 N ARG B 57 O VAL B 77 ATOM 1 CA PRO A 1 51.842 59.784 -6.815 1.00 0.00 ATOM 2 CA GLN A 2 51.577 59.564 -2.997 1.00 0.00 ATOM 3 CA ILE A 3 48.107 57.932 -2.171 1.00 0.00 ATOM 4 CA THR A 4 46.701 58.033 1.344 1.00 0.00 ATOM 5 CA LEU A 5 44.183 55.442 2.514 1.00 0.00 ATOM 6 CA TRP A 6 41.544 57.701 4.088 1.00 0.00 ATOM 7 CA GLN A 7 39.388 56.510 1.115 1.00 0.00 ATOM 8 CA ARG A 8 39.662 53.213 -0.904 1.00 0.00 ATOM 9 CA PRO A 9 42.708 53.768 -3.078 1.00 0.00 ATOM 10 CA LEU A 10 40.903 53.618 -6.532 1.00 0.00 ATOM 11 CA VAL A 11 42.884 54.589 -9.625 1.00 0.00 ATOM 12 CA THR A 12 42.251 54.709 -13.425 1.00 0.00 ATOM 13 CA ILE A 13 43.809 51.981 -15.445 1.00 0.00 ATOM 14 CA LYS A 14 43.975 51.774 -19.198 1.00 0.00 ATOM 15 CA ILE A 15 43.797 48.245 -20.632 1.00 0.00 ATOM 16 CA GLY A 16 42.521 47.316 -24.076 1.00 0.00 ATOM 17 CA GLY A 17 41.869 50.971 -25.072 1.00 0.00 ATOM 18 CA GLN A 18 39.188 50.443 -22.473 1.00 0.00 ATOM 19 CA LEU A 19 39.687 52.728 -19.521 1.00 0.00 ATOM 20 CA LYS A 20 38.532 51.307 -16.096 1.00 0.00 ATOM 21 CA GLU A 21 39.141 52.167 -12.417 1.00 0.00 ATOM 22 CA ALA A 22 40.640 49.603 -10.016 1.00 0.00 ATOM 23 CA LEU A 23 41.703 49.173 -6.386 1.00 0.00 ATOM 24 CA LEU A 24 45.477 49.089 -5.522 1.00 0.00 ATOM 25 CA ASP A 25 45.318 46.159 -3.128 1.00 0.00 ATOM 26 CA THR A 26 48.582 45.179 -1.430 1.00 0.00 ATOM 27 CA GLY A 27 46.733 42.224 -0.031 1.00 0.00 ATOM 28 CA ALA A 28 45.775 40.761 -3.455 1.00 0.00 ATOM 29 CA ASP A 29 48.501 38.562 -4.998 1.00 0.00 ATOM 30 CA ASP A 30 46.716 38.676 -8.410 1.00 0.00 ATOM 31 CA THR A 31 44.915 41.225 -10.624 1.00 0.00 ATOM 32 CA VAL A 32 41.270 40.373 -11.334 1.00 0.00 ATOM 33 CA LEU A 33 39.440 42.554 -13.719 1.00 0.00 ATOM 34 CA GLU A 34 35.920 42.747 -14.872 1.00 0.00 ATOM 35 CA GLU A 35 34.897 40.976 -18.035 1.00 0.00 ATOM 36 CA MET A 36 36.229 42.597 -21.125 1.00 0.00 ATOM 37 CA SER A 37 37.638 41.297 -24.332 1.00 0.00 ATOM 38 CA LEU A 38 41.219 41.024 -24.431 1.00 0.00 ATOM 39 CA PRO A 39 42.734 39.737 -27.687 1.00 0.00 ATOM 40 CA GLY A 40 44.704 36.743 -26.500 1.00 0.00 ATOM 41 CA ARG A 41 45.060 33.095 -25.730 1.00 0.00 ATOM 42 CA TRP A 42 43.813 32.352 -22.311 1.00 0.00 ATOM 43 CA LYS A 43 44.000 29.437 -19.900 1.00 0.00 ATOM 44 CA PRO A 44 41.164 28.670 -17.317 1.00 0.00 ATOM 45 CA LYS A 45 41.624 29.507 -13.608 1.00 0.00 ATOM 46 CA MET A 46 39.283 29.172 -10.580 1.00 0.00 ATOM 47 CA ILE A 47 39.491 31.925 -7.918 1.00 0.00 ATOM 48 CA GLY A 48 37.788 32.073 -4.568 1.00 0.00 ATOM 49 CA GLY A 49 35.043 34.442 -3.513 1.00 0.00 ATOM 50 CA ILE A 50 32.347 35.074 -0.949 1.00 0.00 ATOM 51 CA GLY A 51 29.854 32.271 -1.556 1.00 0.00 ATOM 52 CA GLY A 52 32.385 30.105 -3.553 1.00 0.00 ATOM 53 CA PHE A 53 34.898 29.701 -6.356 1.00 0.00 ATOM 54 CA ILE A 54 34.222 31.428 -9.650 1.00 0.00 ATOM 55 CA LYS A 55 36.012 30.468 -12.945 1.00 0.00 ATOM 56 CA VAL A 56 37.951 33.331 -14.627 1.00 0.00 ATOM 57 CA ARG A 57 40.195 33.474 -17.711 1.00 0.00 ATOM 58 CA GLN A 58 43.958 34.040 -17.315 1.00 0.00 ATOM 59 CA TYR A 59 45.679 36.355 -19.847 1.00 0.00 ATOM 60 CA ASP A 60 49.549 36.399 -19.405 1.00 0.00 ATOM 61 CA GLN A 61 51.715 39.205 -20.715 1.00 0.00 ATOM 62 CA ILE A 62 48.974 41.895 -20.905 1.00 0.00 ATOM 63 CA LEU A 63 50.169 45.531 -20.985 1.00 0.00 ATOM 64 CA ILE A 64 48.156 47.683 -18.627 1.00 0.00 ATOM 65 CA GLU A 65 48.817 51.312 -17.679 1.00 0.00 ATOM 66 CA ILE A 66 48.259 52.150 -13.988 1.00 0.00 ATOM 67 CA CYS A 67 48.343 55.819 -13.081 1.00 0.00 ATOM 68 CA GLY A 68 50.240 56.475 -16.154 1.00 0.00 ATOM 69 CA HIS A 69 52.828 53.643 -15.720 1.00 0.00 ATOM 70 CA LYS A 70 53.041 50.890 -18.295 1.00 0.00 ATOM 71 CA ALA A 71 53.222 47.514 -16.704 1.00 0.00 ATOM 72 CA ILE A 72 53.255 44.000 -18.230 1.00 0.00 ATOM 73 CA GLY A 73 51.697 41.280 -16.224 1.00 0.00 ATOM 74 CA THR A 74 49.054 38.652 -16.082 1.00 0.00 ATOM 75 CA VAL A 75 45.485 39.767 -15.462 1.00 0.00 ATOM 76 CA LEU A 76 42.659 37.379 -14.574 1.00 0.00 ATOM 77 CA VAL A 77 39.347 38.530 -16.381 1.00 0.00 ATOM 78 CA GLY A 78 36.102 37.372 -14.768 1.00 0.00 ATOM 79 CA PRO A 79 32.810 38.262 -12.975 1.00 0.00 ATOM 80 CA THR A 80 34.467 40.006 -10.125 1.00 0.00 ATOM 81 CA PRO A 81 32.448 42.646 -8.163 1.00 0.00 ATOM 82 CA VAL A 82 35.612 44.765 -8.065 1.00 0.00 ATOM 83 CA ASN A 83 38.639 45.443 -10.272 1.00 0.00 ATOM 84 CA ILE A 84 41.739 44.698 -8.177 1.00 0.00 ATOM 85 CA ILE A 85 45.407 45.630 -9.031 1.00 0.00 ATOM 86 CA GLY A 86 47.282 43.168 -6.872 1.00 0.00 ATOM 87 CA ARG A 87 50.954 42.682 -6.044 1.00 0.00 ATOM 88 CA ASN A 88 51.888 40.981 -9.300 1.00 0.00 ATOM 89 CA LEU A 89 51.485 44.433 -11.016 1.00 0.00 ATOM 90 CA LEU A 90 52.110 46.793 -8.029 1.00 0.00 ATOM 91 CA THR A 91 55.719 45.544 -8.243 1.00 0.00 ATOM 92 CA GLN A 92 56.232 46.651 -11.858 1.00 0.00 ATOM 93 CA ILE A 93 55.001 50.180 -11.313 1.00 0.00 ATOM 94 CA GLY A 94 57.347 50.391 -8.267 1.00 0.00 ATOM 95 CA CYS A 95 54.716 50.613 -5.473 1.00 0.00 ATOM 96 CA THR A 96 55.903 50.713 -1.945 1.00 0.00 ATOM 97 CA LEU A 97 54.052 51.039 1.392 1.00 0.00 ATOM 98 CA ASN A 98 55.612 53.860 3.315 1.00 0.00 ATOM 99 CA PHE A 99 55.232 55.089 6.899 1.00 0.00 ATOM 100 CA PRO B 1 59.784 51.842 6.815 1.00 0.00 ATOM 101 CA GLN B 2 59.564 51.577 2.997 1.00 0.00 ATOM 102 CA ILE B 3 57.932 48.107 2.171 1.00 0.00 ATOM 103 CA THR B 4 58.033 46.701 -1.344 1.00 0.00 ATOM 104 CA LEU B 5 55.442 44.183 -2.514 1.00 0.00 ATOM 105 CA TRP B 6 57.701 41.544 -4.088 1.00 0.00 ATOM 106 CA GLN B 7 56.510 39.388 -1.115 1.00 0.00 ATOM 107 CA ARG B 8 53.213 39.662 0.904 1.00 0.00 ATOM 108 CA PRO B 9 53.768 42.708 3.078 1.00 0.00 ATOM 109 CA LEU B 10 53.618 40.903 6.532 1.00 0.00 ATOM 110 CA VAL B 11 54.589 42.884 9.625 1.00 0.00 ATOM 111 CA THR B 12 54.709 42.251 13.425 1.00 0.00 ATOM 112 CA ILE B 13 51.981 43.809 15.445 1.00 0.00 ATOM 113 CA LYS B 14 51.774 43.975 19.198 1.00 0.00 ATOM 114 CA ILE B 15 48.245 43.797 20.632 1.00 0.00 ATOM 115 CA GLY B 16 47.316 42.521 24.076 1.00 0.00 ATOM 116 CA GLY B 17 50.971 41.869 25.072 1.00 0.00 ATOM 117 CA GLN B 18 50.443 39.188 22.473 1.00 0.00 ATOM 118 CA LEU B 19 52.728 39.687 19.521 1.00 0.00 ATOM 119 CA LYS B 20 51.307 38.532 16.096 1.00 0.00 ATOM 120 CA GLU B 21 52.167 39.141 12.417 1.00 0.00 ATOM 121 CA ALA B 22 49.603 40.640 10.016 1.00 0.00 ATOM 122 CA LEU B 23 49.173 41.703 6.386 1.00 0.00 ATOM 123 CA LEU B 24 49.089 45.477 5.522 1.00 0.00 ATOM 124 CA ASP B 25 46.159 45.318 3.128 1.00 0.00 ATOM 125 CA THR B 26 45.179 48.582 1.430 1.00 0.00 ATOM 126 CA GLY B 27 42.224 46.733 0.031 1.00 0.00 ATOM 127 CA ALA B 28 40.761 45.775 3.455 1.00 0.00 ATOM 128 CA ASP B 29 38.562 48.501 4.998 1.00 0.00 ATOM 129 CA ASP B 30 38.676 46.716 8.410 1.00 0.00 ATOM 130 CA THR B 31 41.225 44.915 10.624 1.00 0.00 ATOM 131 CA VAL B 32 40.373 41.270 11.334 1.00 0.00 ATOM 132 CA LEU B 33 42.554 39.440 13.719 1.00 0.00 ATOM 133 CA GLU B 34 42.747 35.920 14.872 1.00 0.00 ATOM 134 CA GLU B 35 40.976 34.897 18.035 1.00 0.00 ATOM 135 CA MET B 36 42.597 36.229 21.125 1.00 0.00 ATOM 136 CA SER B 37 41.297 37.638 24.332 1.00 0.00 ATOM 137 CA LEU B 38 41.024 41.219 24.431 1.00 0.00 ATOM 138 CA PRO B 39 39.737 42.734 27.687 1.00 0.00 ATOM 139 CA GLY B 40 36.743 44.704 26.500 1.00 0.00 ATOM 140 CA ARG B 41 33.095 45.060 25.730 1.00 0.00 ATOM 141 CA TRP B 42 32.352 43.813 22.311 1.00 0.00 ATOM 142 CA LYS B 43 29.437 44.000 19.900 1.00 0.00 ATOM 143 CA PRO B 44 28.670 41.164 17.317 1.00 0.00 ATOM 144 CA LYS B 45 29.507 41.624 13.608 1.00 0.00 ATOM 145 CA MET B 46 29.172 39.283 10.580 1.00 0.00 ATOM 146 CA ILE B 47 31.925 39.491 7.918 1.00 0.00 ATOM 147 CA GLY B 48 32.073 37.788 4.568 1.00 0.00 ATOM 148 CA GLY B 49 34.442 35.043 3.513 1.00 0.00 ATOM 149 CA ILE B 50 35.074 32.347 0.949 1.00 0.00 ATOM 150 CA GLY B 51 32.271 29.854 1.556 1.00 0.00 ATOM 151 CA GLY B 52 30.105 32.385 3.553 1.00 0.00 ATOM 152 CA PHE B 53 29.701 34.898 6.356 1.00 0.00 ATOM 153 CA ILE B 54 31.428 34.222 9.650 1.00 0.00 ATOM 154 CA LYS B 55 30.468 36.012 12.945 1.00 0.00 ATOM 155 CA VAL B 56 33.331 37.951 14.627 1.00 0.00 ATOM 156 CA ARG B 57 33.474 40.195 17.711 1.00 0.00 ATOM 157 CA GLN B 58 34.040 43.958 17.315 1.00 0.00 ATOM 158 CA TYR B 59 36.355 45.679 19.847 1.00 0.00 ATOM 159 CA ASP B 60 36.399 49.549 19.405 1.00 0.00 ATOM 160 CA GLN B 61 39.205 51.715 20.715 1.00 0.00 ATOM 161 CA ILE B 62 41.895 48.974 20.905 1.00 0.00 ATOM 162 CA LEU B 63 45.531 50.169 20.985 1.00 0.00 ATOM 163 CA ILE B 64 47.683 48.156 18.627 1.00 0.00 ATOM 164 CA GLU B 65 51.312 48.817 17.679 1.00 0.00 ATOM 165 CA ILE B 66 52.150 48.259 13.988 1.00 0.00 ATOM 166 CA CYS B 67 55.819 48.343 13.081 1.00 0.00 ATOM 167 CA GLY B 68 56.475 50.240 16.154 1.00 0.00 ATOM 168 CA HIS B 69 53.643 52.828 15.720 1.00 0.00 ATOM 169 CA LYS B 70 50.890 53.041 18.295 1.00 0.00 ATOM 170 CA ALA B 71 47.514 53.222 16.704 1.00 0.00 ATOM 171 CA ILE B 72 44.000 53.255 18.230 1.00 0.00 ATOM 172 CA GLY B 73 41.280 51.697 16.224 1.00 0.00 ATOM 173 CA THR B 74 38.652 49.054 16.082 1.00 0.00 ATOM 174 CA VAL B 75 39.767 45.485 15.462 1.00 0.00 ATOM 175 CA LEU B 76 37.379 42.659 14.574 1.00 0.00 ATOM 176 CA VAL B 77 38.530 39.347 16.381 1.00 0.00 ATOM 177 CA GLY B 78 37.372 36.102 14.768 1.00 0.00 ATOM 178 CA PRO B 79 38.262 32.810 12.975 1.00 0.00 ATOM 179 CA THR B 80 40.006 34.467 10.125 1.00 0.00 ATOM 180 CA PRO B 81 42.646 32.448 8.163 1.00 0.00 ATOM 181 CA VAL B 82 44.765 35.612 8.065 1.00 0.00 ATOM 182 CA ASN B 83 45.443 38.639 10.272 1.00 0.00 ATOM 183 CA ILE B 84 44.698 41.739 8.177 1.00 0.00 ATOM 184 CA ILE B 85 45.630 45.407 9.031 1.00 0.00 ATOM 185 CA GLY B 86 43.168 47.282 6.872 1.00 0.00 ATOM 186 CA ARG B 87 42.682 50.954 6.044 1.00 0.00 ATOM 187 CA ASN B 88 40.981 51.888 9.300 1.00 0.00 ATOM 188 CA LEU B 89 44.433 51.485 11.016 1.00 0.00 ATOM 189 CA LEU B 90 46.793 52.110 8.029 1.00 0.00 ATOM 190 CA THR B 91 45.544 55.719 8.243 1.00 0.00 ATOM 191 CA GLN B 92 46.651 56.232 11.858 1.00 0.00 ATOM 192 CA ILE B 93 50.180 55.001 11.313 1.00 0.00 ATOM 193 CA GLY B 94 50.391 57.347 8.267 1.00 0.00 ATOM 194 CA CYS B 95 50.613 54.716 5.473 1.00 0.00 ATOM 195 CA THR B 96 50.713 55.903 1.945 1.00 0.00 ATOM 196 CA LEU B 97 51.039 54.052 -1.392 1.00 0.00 ATOM 197 CA ASN B 98 53.860 55.612 -3.315 1.00 0.00 ATOM 198 CA PHE B 99 55.089 55.232 -6.899 1.00 0.00 TER END bio3d/inst/examples/kif1a.fa0000644000176200001440000000303014046015221015337 0ustar liggesusers>http://www.rcsb.org/pdb/files/1bg2.pdb NIKVMCRFRPLNESEVNRGDKYIAKFQGEDTV----VIASK-------PYAFDRVFQSS- -------TSQEQVYNDCAKKIVKDVLEGYNGTIFAYGQTSSGKTHTMEGKLHDPEGMGII PRIVQDIFNYIYSMDENL-EFHIKVSYFEIYLDKIRDLL-DVSKT-NLSVHEDKNRVPYV KGCTERFVCSPDEVMDTIDEGKSNRHVAVTNMNEHSSRSHSIFLINVKQENTQT----EQ KLSGKLYLVDLAGSEKVSKTGAEGAVLDEAKNINKSLSALGNVISALAEGSTYVPYRDSK MTRILQDSLGGNCRTTIVICCSPSSYNESETKSTLLFGQRAKTI >http://www.rcsb.org/pdb/files/1i6i.pdb SVKVAVRVRPFNSREMSRDSKCIIQMSGSTTT----IVNPKQPKETPKSFSFDYSYWSHT SPEDINYASQKQVYRDIGEEMLQHAFEGYNVCIFAYGQTGAGKSYTMMGKQEK-DQQGII PQLCEDLFSRINDTTNDNMSYSVEVSYMEIYCERVRDLL-NPKNKGNLRVREHPLLGPYV EDLSKLAVTSYNDIQDLMDSGNKARTVAATNMNETSSRSHAVFNIIFTQKRHDAETNITT EKVSKISLVDLAGSE---------------ANINKSLTTLGKVISALAEMD-FIPYRDSV LTWLLRENLGGNSRTAMVAALSPADINYDETLSTLRYADRAKQI >http://www.rcsb.org/pdb/files/1i5s.pdb SVKVAVRVRPFNSREMSRDSKCIIQMSGSTTT----IVNPKQPKETPKSFSFDYSYWSHT SPEDINYASQKQVYRDIGEEMLQHAFEGYNVCIFAYGQTGAGKSYTMMGKQEK-DQQGII PQLCEDLFSRINDTTNDNMSYSVEVSYMEIYCERVRDLL-NPKNKGNLRVREHPLLGPYV EDLSKLAVTSYNDIQDLMDSGNKARTVAATNMNETSSRSHAVFNIIFTQKRHDAETNITT EKVSKISLVDLAGSER-----AKGTRLKEGANINKSLTTLGKVISALAEMD--IPYRDSV LTWLLRENLGGNSRTAMVAALSPADINYDETLSTLRYADRAK-- >http://www.rcsb.org/pdb/files/2ncd.pdb NIRVFCRIRPPLESEENRMC-CTWTYHDESTVELQSIDAQAKSKMGQQIFSFDQVFHPL- -------SSQSDIF-EMVSPLIQSALDGYNICIFAYGQTGSGKTYTMDGV---PESVGVI PRTVDLLFDSIRGYRNLGWEYEIKATFLEIYNEVLYDLLSNEQKDMEIRMAKNNKNDIYV SNITEETVLDPNHLRHLMHTAKMNRATASTAGNERSSRSHAVTKLELIGRHAEK----QE ISVGSINLVDLAGSES--------------PNINRSLSELTNVILALLQKQDHIPYRNSK LTHLLMPSLGGNSKTLMFINVSPFQDCFQESVKSLRFAASVNSC bio3d/inst/examples/crambin.prmtop0000644000176200001440000113172014046015221016723 0ustar liggesusers%VERSION VERSION_STAMP = V0001.000 DATE = 08/31/16 13:14:17 %FLAG TITLE %FORMAT(20a4) default_name %FLAG POINTERS %FORMAT(10I8) 639 12 313 335 710 462 1487 1528 0 0 3545 46 335 462 1528 45 107 147 21 0 0 0 0 0 0 0 0 0 24 0 0 %FLAG ATOM_NAME %FORMAT(20a4) N H1 H2 H3 CA HA CB HB CG2 HG21HG22HG23OG1 HG1 C O N H CA HA CB HB CG2 HG21HG22HG23OG1 HG1 C O N H CA HA CB HB2 HB3 SG C O N H CA HA CB HB2 HB3 SG C O N CD HD2 HD3 CG HG2 HG3 CB HB2 HB3 CA HA C O N H CA HA CB HB2 HB3 OG HG C O N H CA HA CB HB CG2 HG21HG22HG23CG1 HG12HG13CD1 HD11HD12HD13C O N H CA HA CB HB CG1 HG11HG12HG13CG2 HG21HG22HG23C O N H CA HA CB HB1 HB2 HB3 C O N H CA HA CB HB2 HB3 CG HG2 HG3 CD HD2 HD3 NE HE CZ NH1 HH11HH12NH2 HH21HH22C O N H CA HA CB HB2 HB3 OG HG C O N H CA HA CB HB2 HB3 CG OD1 ND2 HD21HD22C O N H CA HA CB HB2 HB3 CG CD1 HD1 CE1 HE1 CZ HZ CE2 HE2 CD2 HD2 C O N H CA HA CB HB2 HB3 CG OD1 ND2 HD21 HD22C O N H CA HA CB HB CG1 HG11HG12HG13CG2 HG21HG22HG23C O N H CA HA CB HB2 HB3 SG C O N H CA HA CB HB2 HB3 CG HG2 HG3 CD HD2 HD3 NE HE CZ NH1 HH11HH12NH2 HH21HH22C O N H CA HA CB HB2 HB3 CG HG CD1 HD11HD12HD13CD2 HD21HD22HD23C O N CD HD2 HD3 CG HG2 HG3 CB HB2 HB3 CA HA C O N H CA HA2 HA3 C O N H CA HA CB HB CG2 HG21HG22HG23OG1 HG1 C O N H CA HA CB HB2 HB3 OG HG C O N H CA HA CB HB2 HB3 CG HG2 HG3 CD OE1 OE2 C O N H CA HA CB HB1 HB2 HB3 C O N H CA HA CB HB CG2 HG21HG22HG23CG1 HG12HG13CD1 HD11HD12HD13 C O N H CA HA CB HB2 HB3 SG C O N H CA HA CB HB1 HB2 HB3 C O N H CA HA CB HB CG2 HG21HG22HG23OG1 HG1 C O N H CA HA CB HB2 HB3 CG CD1 HD1 CE1 HE1 CZ OH HH CE2 HE2 CD2 HD2 C O N H CA HA CB HB CG2 HG21HG22HG23OG1 HG1 C O N H CA HA2 HA3 C O N H CA HA CB HB2 HB3 SG C O N H CA HA CB HB CG2 HG21HG22HG23CG1 HG12 HG13CD1 HD11HD12HD13C O N H CA HA CB HB CG2 HG21HG22HG23CG1 HG12HG13 CD1 HD11HD12HD13C O N H CA HA CB HB CG2 HG21HG22HG23CG1 HG12HG13CD1 HD11HD12HD13C O N CD HD2 HD3 CG HG2 HG3 CB HB2 HB3 CA HA C O N H CA HA2 HA3 C O N H CA HA CB HB1 HB2 HB3 C O N H CA HA CB HB CG2 HG21HG22HG23OG1 HG1 C O N H CA HA CB HB2 HB3 SG C O N CD HD2 HD3 CG HG2 HG3 CB HB2 HB3 CA HA C O N H CA HA2 HA3 C O N H CA HA CB HB2 HB3 CG OD1 OD2 C O N H CA HA CB HB2 HB3 CG CD1 HD1 CE1 HE1 CZ OH HH CE2 HE2 CD2 HD2 C O N H CA HA CB HB1 HB2 HB3 C O N H CA HA CB HB2 HB3 CG OD1 ND2 HD21HD22C O OXT %FLAG CHARGE %FORMAT(5E16.8) 3.30188076E+00 3.52419282E+00 3.52419282E+00 3.52419282E+00 6.19558200E-02 1.98076401E+00 8.22554622E+00 -5.88580290E-01 -4.65397542E+00 1.14253821E+00 1.14253821E+00 1.14253821E+00 -1.23255637E+01 7.41647610E+00 1.12304035E+01 -1.04268001E+01 -7.57501011E+00 4.95464337E+00 -7.08847470E-01 1.83498561E+00 6.65842842E+00 7.83558900E-02 -4.44259674E+00 1.16987166E+00 1.16987166E+00 1.16987166E+00 -1.23200970E+01 7.47478746E+00 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 7.81736670E-01 1.39582818E+00 -1.43956170E+00 1.65822930E+00 1.65822930E+00 -1.96983063E+00 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 7.81736670E-01 1.39582818E+00 -1.43956170E+00 1.65822930E+00 1.65822930E+00 -1.96983063E+00 1.08841798E+01 -1.03484442E+01 -4.64304204E+00 3.49868160E-01 7.12491930E-01 7.12491930E-01 3.44401470E-01 3.88134990E-01 3.88134990E-01 -1.27556100E-01 4.61024190E-01 4.61024190E-01 -4.84713180E-01 1.16804943E+00 1.07438681E+01 -1.04741780E+01 -7.57501011E+00 4.95464337E+00 -4.53735270E-01 1.53613989E+00 3.85766091E+00 6.41424960E-01 6.41424960E-01 -1.19283176E+01 7.79003325E+00 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 -1.08787131E+00 1.58351787E+00 2.37436569E+00 3.40757010E-01 -5.83842492E+00 1.60720686E+00 1.60720686E+00 1.60720686E+00 -7.83558900E-01 4.30046280E-01 4.30046280E-01 -1.20267180E+00 3.38934780E-01 3.38934780E-01 3.38934780E-01 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 -1.59445125E+00 1.76574087E+00 5.43935655E+00 -5.41202310E-01 -5.81655816E+00 1.44138393E+00 1.44138393E+00 1.44138393E+00 -5.81655816E+00 1.44138393E+00 1.44138393E+00 1.44138393E+00 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 6.14091510E-01 1.49969529E+00 -3.32556975E+00 1.09880469E+00 1.09880469E+00 1.09880469E+00 1.08841798E+01 -1.03484442E+01 -6.33953817E+00 5.00566581E+00 -4.80522051E+00 2.84267880E+00 -1.27556100E-02 5.95869210E-01 5.95869210E-01 7.10669700E-01 5.19335550E-01 5.19335550E-01 8.85603780E-01 1.25187201E+00 1.25187201E+00 -9.64870785E+00 6.29762688E+00 1.47163295E+01 -1.57203782E+01 8.15994594E+00 8.15994594E+00 -1.57203782E+01 8.15994594E+00 8.15994594E+00 1.33769904E+01 -1.07402236E+01 -7.57501011E+00 4.95464337E+00 -4.53735270E-01 1.53613989E+00 3.85766091E+00 6.41424960E-01 6.41424960E-01 -1.19283176E+01 7.79003325E+00 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 2.60578890E-01 1.90969704E+00 -3.71917143E+00 1.45231731E+00 1.45231731E+00 1.29924999E+01 -1.08076461E+01 -1.67481159E+01 7.64607708E+00 7.64607708E+00 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 -4.37335200E-02 1.78214094E+00 -6.25024890E-01 5.37557850E-01 5.37557850E-01 2.15023140E-01 -2.28872088E+00 2.42356590E+00 -3.10507992E+00 2.60578890E+00 -1.95343056E+00 2.36343231E+00 -3.10507992E+00 2.60578890E+00 -2.28872088E+00 2.42356590E+00 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 2.60578890E-01 1.90969704E+00 -3.71917143E+00 1.45231731E+00 1.45231731E+00 1.29924999E+01 -1.08076461E+01 -1.67481159E+01 7.64607708E+00 7.64607708E+00 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 -1.59445125E+00 1.76574087E+00 5.43935655E+00 -5.41202310E-01 -5.81655816E+00 1.44138393E+00 1.44138393E+00 1.44138393E+00 -5.81655816E+00 1.44138393E+00 1.44138393E+00 1.44138393E+00 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 7.81736670E-01 1.39582818E+00 -1.43956170E+00 1.65822930E+00 1.65822930E+00 -1.96983063E+00 1.08841798E+01 -1.03484442E+01 -6.33953817E+00 5.00566581E+00 -4.80522051E+00 2.84267880E+00 -1.27556100E-02 5.95869210E-01 5.95869210E-01 7.10669700E-01 5.19335550E-01 5.19335550E-01 8.85603780E-01 1.25187201E+00 1.25187201E+00 -9.64870785E+00 6.29762688E+00 1.47163295E+01 -1.57203782E+01 8.15994594E+00 8.15994594E+00 -1.57203782E+01 8.15994594E+00 8.15994594E+00 1.33769904E+01 -1.07402236E+01 -7.57501011E+00 4.95464337E+00 -9.43915140E-01 1.68009606E+00 -2.00809746E+00 8.32759110E-01 8.32759110E-01 6.43429413E+00 -6.57825030E-01 -7.50940983E+00 1.82223000E+00 1.82223000E+00 1.82223000E+00 -7.50940983E+00 1.82223000E+00 1.82223000E+00 1.82223000E+00 1.08841798E+01 -1.03484442E+01 -4.64304204E+00 3.49868160E-01 7.12491930E-01 7.12491930E-01 3.44401470E-01 3.88134990E-01 3.88134990E-01 -1.27556100E-01 4.61024190E-01 4.61024190E-01 -4.84713180E-01 1.16804943E+00 1.07438681E+01 -1.04741780E+01 -7.57501011E+00 4.95464337E+00 -4.59201960E-01 1.27191654E+00 1.27191654E+00 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 -7.08847470E-01 1.83498561E+00 6.65842842E+00 7.83558900E-02 -4.44259674E+00 1.16987166E+00 1.16987166E+00 1.16987166E+00 -1.23200970E+01 7.47478746E+00 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 -4.53735270E-01 1.53613989E+00 3.85766091E+00 6.41424960E-01 6.41424960E-01 -1.19283176E+01 7.79003325E+00 1.08841798E+01 -1.03484442E+01 -9.40817349E+00 5.35006728E+00 7.23425310E-01 2.01356415E+00 1.02044880E+00 -3.15245790E-01 -3.15245790E-01 2.47823280E-01 -7.74447750E-01 -7.74447750E-01 1.46762404E+01 -1.49204192E+01 -1.49204192E+01 9.77808618E+00 -1.06035564E+01 -7.57501011E+00 4.95464337E+00 6.14091510E-01 1.49969529E+00 -3.32556975E+00 1.09880469E+00 1.09880469E+00 1.09880469E+00 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 -1.08787131E+00 1.58351787E+00 2.37436569E+00 3.40757010E-01 -5.83842492E+00 1.60720686E+00 1.60720686E+00 1.60720686E+00 -7.83558900E-01 4.30046280E-01 4.30046280E-01 -1.20267180E+00 3.38934780E-01 3.38934780E-01 3.38934780E-01 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 7.81736670E-01 1.39582818E+00 -1.43956170E+00 1.65822930E+00 1.65822930E+00 -1.96983063E+00 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 6.14091510E-01 1.49969529E+00 -3.32556975E+00 1.09880469E+00 1.09880469E+00 1.09880469E+00 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 -7.08847470E-01 1.83498561E+00 6.65842842E+00 7.83558900E-02 -4.44259674E+00 1.16987166E+00 1.16987166E+00 1.16987166E+00 -1.23200970E+01 7.47478746E+00 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 -2.55112200E-02 1.59627348E+00 -2.76978960E-01 5.37557850E-01 5.37557850E-01 -2.00445300E-02 -3.47317038E+00 3.09596877E+00 -4.26584043E+00 3.01761288E+00 5.87851398E+00 -1.01662212E+01 7.27434216E+00 -4.26584043E+00 3.01761288E+00 -3.47317038E+00 3.09596877E+00 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 -7.08847470E-01 1.83498561E+00 6.65842842E+00 7.83558900E-02 -4.44259674E+00 1.16987166E+00 1.16987166E+00 1.16987166E+00 -1.23200970E+01 7.47478746E+00 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 -4.59201960E-01 1.27191654E+00 1.27191654E+00 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 7.81736670E-01 1.39582818E+00 -1.43956170E+00 1.65822930E+00 1.65822930E+00 -1.96983063E+00 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 -1.08787131E+00 1.58351787E+00 2.37436569E+00 3.40757010E-01 -5.83842492E+00 1.60720686E+00 1.60720686E+00 1.60720686E+00 -7.83558900E-01 4.30046280E-01 4.30046280E-01 -1.20267180E+00 3.38934780E-01 3.38934780E-01 3.38934780E-01 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 -1.08787131E+00 1.58351787E+00 2.37436569E+00 3.40757010E-01 -5.83842492E+00 1.60720686E+00 1.60720686E+00 1.60720686E+00 -7.83558900E-01 4.30046280E-01 4.30046280E-01 -1.20267180E+00 3.38934780E-01 3.38934780E-01 3.38934780E-01 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 -1.08787131E+00 1.58351787E+00 2.37436569E+00 3.40757010E-01 -5.83842492E+00 1.60720686E+00 1.60720686E+00 1.60720686E+00 -7.83558900E-01 4.30046280E-01 4.30046280E-01 -1.20267180E+00 3.38934780E-01 3.38934780E-01 3.38934780E-01 1.08841798E+01 -1.03484442E+01 -4.64304204E+00 3.49868160E-01 7.12491930E-01 7.12491930E-01 3.44401470E-01 3.88134990E-01 3.88134990E-01 -1.27556100E-01 4.61024190E-01 4.61024190E-01 -4.84713180E-01 1.16804943E+00 1.07438681E+01 -1.04741780E+01 -7.57501011E+00 4.95464337E+00 -4.59201960E-01 1.27191654E+00 1.27191654E+00 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 6.14091510E-01 1.49969529E+00 -3.32556975E+00 1.09880469E+00 1.09880469E+00 1.09880469E+00 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 -7.08847470E-01 1.83498561E+00 6.65842842E+00 7.83558900E-02 -4.44259674E+00 1.16987166E+00 1.16987166E+00 1.16987166E+00 -1.23200970E+01 7.47478746E+00 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 7.81736670E-01 1.39582818E+00 -1.43956170E+00 1.65822930E+00 1.65822930E+00 -1.96983063E+00 1.08841798E+01 -1.03484442E+01 -4.64304204E+00 3.49868160E-01 7.12491930E-01 7.12491930E-01 3.44401470E-01 3.88134990E-01 3.88134990E-01 -1.27556100E-01 4.61024190E-01 4.61024190E-01 -4.84713180E-01 1.16804943E+00 1.07438681E+01 -1.04741780E+01 -7.57501011E+00 4.95464337E+00 -4.59201960E-01 1.27191654E+00 1.27191654E+00 1.08841798E+01 -1.03484442E+01 -9.40817349E+00 5.35006728E+00 6.94269630E-01 1.60356240E+00 -5.52135690E-01 -2.22312060E-01 -2.22312060E-01 1.45669066E+01 -1.46033512E+01 -1.46033512E+01 9.77808618E+00 -1.06035564E+01 -7.57501011E+00 4.95464337E+00 -2.55112200E-02 1.59627348E+00 -2.76978960E-01 5.37557850E-01 5.37557850E-01 -2.00445300E-02 -3.47317038E+00 3.09596877E+00 -4.26584043E+00 3.01761288E+00 5.87851398E+00 -1.01662212E+01 7.27434216E+00 -4.26584043E+00 3.01761288E+00 -3.47317038E+00 3.09596877E+00 1.08841798E+01 -1.03484442E+01 -7.57501011E+00 4.95464337E+00 6.14091510E-01 1.49969529E+00 -3.32556975E+00 1.09880469E+00 1.09880469E+00 1.09880469E+00 1.08841798E+01 -1.03484442E+01 -6.96274083E+00 4.88539863E+00 -3.79023840E+00 2.47458834E+00 -4.18930677E+00 1.86414129E+00 1.86414129E+00 1.30344112E+01 -1.09516023E+01 -1.65531373E+01 7.56225450E+00 7.56225450E+00 1.46689515E+01 -1.48457078E+01 -1.48457078E+01 %FLAG ATOMIC_NUMBER %FORMAT(10I8) 7 1 1 1 6 1 6 1 6 1 1 1 8 1 6 8 7 1 6 1 6 1 6 1 1 1 8 1 6 8 7 1 6 1 6 1 1 16 6 8 7 1 6 1 6 1 1 16 6 8 7 6 1 1 6 1 1 6 1 1 6 1 6 8 7 1 6 1 6 1 1 8 1 6 8 7 1 6 1 6 1 6 1 1 1 6 1 1 6 1 1 1 6 8 7 1 6 1 6 1 6 1 1 1 6 1 1 1 6 8 7 1 6 1 6 1 1 1 6 8 7 1 6 1 6 1 1 6 1 1 6 1 1 7 1 6 7 1 1 7 1 1 6 8 7 1 6 1 6 1 1 8 1 6 8 7 1 6 1 6 1 1 6 8 7 1 1 6 8 7 1 6 1 6 1 1 6 6 1 6 1 6 1 6 1 6 1 6 8 7 1 6 1 6 1 1 6 8 7 1 1 6 8 7 1 6 1 6 1 6 1 1 1 6 1 1 1 6 8 7 1 6 1 6 1 1 16 6 8 7 1 6 1 6 1 1 6 1 1 6 1 1 7 1 6 7 1 1 7 1 1 6 8 7 1 6 1 6 1 1 6 1 6 1 1 1 6 1 1 1 6 8 7 6 1 1 6 1 1 6 1 1 6 1 6 8 7 1 6 1 1 6 8 7 1 6 1 6 1 6 1 1 1 8 1 6 8 7 1 6 1 6 1 1 8 1 6 8 7 1 6 1 6 1 1 6 1 1 6 8 8 6 8 7 1 6 1 6 1 1 1 6 8 7 1 6 1 6 1 6 1 1 1 6 1 1 6 1 1 1 6 8 7 1 6 1 6 1 1 16 6 8 7 1 6 1 6 1 1 1 6 8 7 1 6 1 6 1 6 1 1 1 8 1 6 8 7 1 6 1 6 1 1 6 6 1 6 1 6 8 1 6 1 6 1 6 8 7 1 6 1 6 1 6 1 1 1 8 1 6 8 7 1 6 1 1 6 8 7 1 6 1 6 1 1 16 6 8 7 1 6 1 6 1 6 1 1 1 6 1 1 6 1 1 1 6 8 7 1 6 1 6 1 6 1 1 1 6 1 1 6 1 1 1 6 8 7 1 6 1 6 1 6 1 1 1 6 1 1 6 1 1 1 6 8 7 6 1 1 6 1 1 6 1 1 6 1 6 8 7 1 6 1 1 6 8 7 1 6 1 6 1 1 1 6 8 7 1 6 1 6 1 6 1 1 1 8 1 6 8 7 1 6 1 6 1 1 16 6 8 7 6 1 1 6 1 1 6 1 1 6 1 6 8 7 1 6 1 1 6 8 7 1 6 1 6 1 1 6 8 8 6 8 7 1 6 1 6 1 1 6 6 1 6 1 6 8 1 6 1 6 1 6 8 7 1 6 1 6 1 1 1 6 8 7 1 6 1 6 1 1 6 8 7 1 1 6 8 8 %FLAG MASS %FORMAT(5E16.8) 1.40100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.60000000E+01 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.60000000E+01 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 3.20600000E+01 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 3.20600000E+01 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.60000000E+01 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.40100000E+01 1.00800000E+00 1.00800000E+00 1.40100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.60000000E+01 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 3.20600000E+01 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.40100000E+01 1.00800000E+00 1.00800000E+00 1.40100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.60000000E+01 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.60000000E+01 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.60000000E+01 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 3.20600000E+01 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.60000000E+01 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.60000000E+01 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 3.20600000E+01 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.60000000E+01 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 3.20600000E+01 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.60000000E+01 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.40100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.60000000E+01 %FLAG ATOM_TYPE_INDEX %FORMAT(10I8) 1 2 2 2 3 4 3 5 3 6 6 6 7 8 9 10 1 2 3 5 3 5 3 6 6 6 7 8 9 10 1 2 3 5 3 5 5 11 9 10 1 2 3 5 3 5 5 11 9 10 1 3 5 5 3 6 6 3 6 6 3 5 9 10 1 2 3 5 3 5 5 7 8 9 10 1 2 3 5 3 6 3 6 6 6 3 6 6 3 6 6 6 9 10 1 2 3 5 3 6 3 6 6 6 3 6 6 6 9 10 1 2 3 5 3 6 6 6 9 10 1 2 3 5 3 6 6 3 6 6 3 5 5 1 2 9 1 2 2 1 2 2 9 10 1 2 3 5 3 5 5 7 8 9 10 1 2 3 5 3 6 6 9 10 1 2 2 9 10 1 2 3 5 3 6 6 9 9 12 9 12 9 12 9 12 9 12 9 10 1 2 3 5 3 6 6 9 10 1 2 2 9 10 1 2 3 5 3 6 3 6 6 6 3 6 6 6 9 10 1 2 3 5 3 5 5 11 9 10 1 2 3 5 3 6 6 3 6 6 3 5 5 1 2 9 1 2 2 1 2 2 9 10 1 2 3 5 3 6 6 3 6 3 6 6 6 3 6 6 6 9 10 1 3 5 5 3 6 6 3 6 6 3 5 9 10 1 2 3 5 5 9 10 1 2 3 5 3 5 3 6 6 6 7 8 9 10 1 2 3 5 3 5 5 7 8 9 10 1 2 3 5 3 6 6 3 6 6 9 10 10 9 10 1 2 3 5 3 6 6 6 9 10 1 2 3 5 3 6 3 6 6 6 3 6 6 3 6 6 6 9 10 1 2 3 5 3 5 5 11 9 10 1 2 3 5 3 6 6 6 9 10 1 2 3 5 3 5 3 6 6 6 7 8 9 10 1 2 3 5 3 6 6 9 9 12 9 12 9 7 8 9 12 9 12 9 10 1 2 3 5 3 5 3 6 6 6 7 8 9 10 1 2 3 5 5 9 10 1 2 3 5 3 5 5 11 9 10 1 2 3 5 3 6 3 6 6 6 3 6 6 3 6 6 6 9 10 1 2 3 5 3 6 3 6 6 6 3 6 6 3 6 6 6 9 10 1 2 3 5 3 6 3 6 6 6 3 6 6 3 6 6 6 9 10 1 3 5 5 3 6 6 3 6 6 3 5 9 10 1 2 3 5 5 9 10 1 2 3 5 3 6 6 6 9 10 1 2 3 5 3 5 3 6 6 6 7 8 9 10 1 2 3 5 3 5 5 11 9 10 1 3 5 5 3 6 6 3 6 6 3 5 9 10 1 2 3 5 5 9 10 1 2 3 5 3 6 6 9 10 10 9 10 1 2 3 5 3 6 6 9 9 12 9 12 9 7 8 9 12 9 12 9 10 1 2 3 5 3 6 6 6 9 10 1 2 3 5 3 6 6 9 10 1 2 2 9 10 10 %FLAG NUMBER_EXCLUDED_ATOMS %FORMAT(10I8) 12 6 5 4 14 7 10 7 6 3 2 1 2 1 7 3 10 4 14 7 10 7 6 3 2 1 2 1 7 3 10 4 11 7 8 4 3 6 7 3 10 4 11 7 8 4 3 6 10 3 14 11 6 5 8 5 4 7 4 3 6 3 7 3 10 4 11 7 7 4 3 2 1 7 3 10 4 16 7 15 9 8 3 2 1 7 5 4 3 2 1 1 7 3 10 4 16 7 12 9 8 3 2 1 4 2 1 1 7 3 10 4 10 7 6 3 2 1 7 3 10 4 13 7 12 6 5 9 5 4 7 4 3 8 3 6 5 2 1 2 1 1 7 3 10 4 11 7 7 4 3 2 1 7 3 10 4 12 7 10 5 4 5 3 2 1 1 7 3 10 4 12 7 12 5 4 10 8 4 6 3 5 3 3 2 1 1 7 3 10 4 12 7 10 5 4 5 3 2 1 1 7 3 10 4 16 7 12 9 8 3 2 1 4 2 1 1 7 3 10 4 11 7 8 4 3 6 7 3 10 4 13 7 12 6 5 9 5 4 7 4 3 8 3 6 5 2 1 2 1 1 7 3 10 4 13 7 15 6 5 10 8 7 3 2 1 3 2 1 1 10 3 14 11 6 5 8 5 4 7 4 3 6 3 7 3 7 4 7 4 3 7 3 10 4 14 7 10 7 6 3 2 1 2 1 7 3 10 4 11 7 7 4 3 2 1 7 3 10 4 13 7 11 6 5 6 4 3 2 1 1 7 3 10 4 10 7 6 3 2 1 7 3 10 4 16 7 15 9 8 3 2 1 7 5 4 3 2 1 1 7 3 10 4 10 7 6 3 2 1 7 3 10 4 10 7 6 3 2 1 7 3 10 4 14 7 10 7 6 3 2 1 2 1 7 3 10 4 12 7 12 5 4 10 8 4 7 3 6 4 1 3 2 1 1 7 3 10 4 14 7 10 7 6 3 2 1 2 1 7 3 7 4 7 4 3 7 3 10 4 10 7 6 3 2 1 7 3 10 4 16 7 15 9 8 3 2 1 7 5 4 3 2 1 1 7 3 10 4 16 7 15 9 8 3 2 1 7 5 4 3 2 1 1 7 3 10 4 16 7 15 9 8 3 2 1 7 5 4 3 2 1 1 10 3 14 11 6 5 8 5 4 7 4 3 6 3 7 3 7 4 7 4 3 7 3 10 4 10 7 6 3 2 1 7 3 10 4 14 7 10 7 6 3 2 1 2 1 7 3 10 4 10 7 6 3 2 1 10 3 14 11 6 5 8 5 4 7 4 3 6 3 7 3 7 4 7 4 3 7 3 10 4 12 7 8 5 4 3 1 1 7 3 10 4 12 7 12 5 4 10 8 4 7 3 6 4 1 3 2 1 1 7 3 10 4 10 7 6 3 2 1 7 3 10 4 10 7 10 5 4 5 3 2 1 1 2 1 1 %FLAG NONBONDED_PARM_INDEX %FORMAT(10I8) 1 2 4 7 11 16 22 29 37 46 56 67 2 3 5 8 12 17 23 30 38 47 57 68 4 5 6 9 13 18 24 31 39 48 58 69 7 8 9 10 14 19 25 32 40 49 59 70 11 12 13 14 15 20 26 33 41 50 60 71 16 17 18 19 20 21 27 34 42 51 61 72 22 23 24 25 26 27 28 35 43 52 62 73 29 30 31 32 33 34 35 36 44 53 63 74 37 38 39 40 41 42 43 44 45 54 64 75 46 47 48 49 50 51 52 53 54 55 65 76 56 57 58 59 60 61 62 63 64 65 66 77 67 68 69 70 71 72 73 74 75 76 77 78 %FLAG RESIDUE_LABEL %FORMAT(20a4) THR THR CYX CYX PRO SER ILE VAL ALA ARG SER ASN PHE ASN VAL CYX ARG LEU PRO GLY THR SER GLU ALA ILE CYX ALA THR TYR THR GLY CYX ILE ILE ILE PRO GLY ALA THR CYX PRO GLY ASP TYR ALA ASN %FLAG RESIDUE_POINTER %FORMAT(10I8) 1 17 31 41 51 65 76 95 111 121 145 156 170 190 204 220 230 254 273 287 294 308 319 334 344 363 373 383 397 418 432 439 449 468 487 506 520 527 537 551 561 575 582 594 615 625 %FLAG BOND_FORCE_CONSTANT %FORMAT(5E16.8) 5.70000000E+02 4.90000000E+02 5.53000000E+02 3.40000000E+02 3.40000000E+02 3.10000000E+02 3.20000000E+02 3.40000000E+02 3.10000000E+02 3.17000000E+02 4.34000000E+02 3.67000000E+02 3.40000000E+02 4.34000000E+02 3.37000000E+02 1.66000000E+02 3.40000000E+02 2.27000000E+02 3.10000000E+02 3.10000000E+02 3.10000000E+02 3.40000000E+02 3.37000000E+02 3.20000000E+02 3.40000000E+02 3.10000000E+02 3.40000000E+02 3.10000000E+02 4.34000000E+02 4.81000000E+02 3.40000000E+02 3.37000000E+02 3.40000000E+02 3.10000000E+02 3.10000000E+02 3.17000000E+02 3.67000000E+02 4.69000000E+02 3.17000000E+02 6.56000000E+02 3.17000000E+02 3.10000000E+02 4.50000000E+02 4.69000000E+02 6.56000000E+02 %FLAG BOND_EQUIL_VALUE %FORMAT(5E16.8) 1.22900000E+00 1.33500000E+00 9.60000000E-01 1.09000000E+00 1.09000000E+00 1.52600000E+00 1.41000000E+00 1.09000000E+00 1.52600000E+00 1.52200000E+00 1.01000000E+00 1.47100000E+00 1.09000000E+00 1.01000000E+00 1.44900000E+00 2.03800000E+00 1.09000000E+00 1.81000000E+00 1.52600000E+00 1.52600000E+00 1.52600000E+00 1.09000000E+00 1.44900000E+00 1.41000000E+00 1.09000000E+00 1.52600000E+00 1.09000000E+00 1.52600000E+00 1.01000000E+00 1.34000000E+00 1.09000000E+00 1.46300000E+00 1.09000000E+00 1.52600000E+00 1.52600000E+00 1.52200000E+00 1.08000000E+00 1.40000000E+00 1.51000000E+00 1.25000000E+00 1.52200000E+00 1.52600000E+00 1.36400000E+00 1.40900000E+00 1.25000000E+00 %FLAG ANGLE_FORCE_CONSTANT %FORMAT(5E16.8) 8.00000000E+01 5.00000000E+01 5.00000000E+01 3.50000000E+01 5.00000000E+01 5.00000000E+01 5.00000000E+01 6.30000000E+01 5.00000000E+01 5.50000000E+01 5.00000000E+01 5.00000000E+01 5.00000000E+01 4.00000000E+01 5.00000000E+01 8.00000000E+01 7.00000000E+01 5.00000000E+01 3.50000000E+01 5.00000000E+01 8.00000000E+01 8.00000000E+01 5.00000000E+01 5.00000000E+01 5.00000000E+01 5.00000000E+01 8.00000000E+01 6.30000000E+01 6.80000000E+01 5.00000000E+01 3.50000000E+01 6.30000000E+01 5.00000000E+01 5.00000000E+01 5.00000000E+01 8.00000000E+01 5.00000000E+01 5.00000000E+01 5.00000000E+01 6.30000000E+01 5.00000000E+01 4.00000000E+01 5.00000000E+01 3.50000000E+01 5.00000000E+01 4.00000000E+01 5.00000000E+01 8.00000000E+01 8.00000000E+01 5.00000000E+01 5.50000000E+01 5.00000000E+01 5.00000000E+01 3.50000000E+01 5.00000000E+01 4.00000000E+01 5.00000000E+01 5.00000000E+01 5.00000000E+01 4.00000000E+01 5.00000000E+01 4.00000000E+01 4.00000000E+01 3.50000000E+01 7.00000000E+01 5.00000000E+01 5.00000000E+01 3.50000000E+01 5.00000000E+01 5.00000000E+01 5.00000000E+01 3.50000000E+01 5.00000000E+01 8.00000000E+01 6.30000000E+01 4.00000000E+01 5.00000000E+01 5.00000000E+01 4.00000000E+01 8.00000000E+01 3.50000000E+01 5.00000000E+01 8.00000000E+01 7.00000000E+01 5.00000000E+01 6.30000000E+01 5.00000000E+01 6.30000000E+01 5.00000000E+01 7.00000000E+01 6.30000000E+01 4.00000000E+01 3.50000000E+01 8.00000000E+01 5.00000000E+01 7.00000000E+01 5.00000000E+01 6.30000000E+01 4.00000000E+01 7.00000000E+01 5.00000000E+01 5.00000000E+01 6.30000000E+01 6.30000000E+01 6.30000000E+01 8.00000000E+01 7.00000000E+01 %FLAG ANGLE_EQUIL_VALUE %FORMAT(5E16.8) 2.14501057E+00 2.09439600E+00 2.12755727E+00 1.91113635E+00 1.91113635E+00 1.91113635E+00 1.91113635E+00 1.93906163E+00 1.91113635E+00 1.89368305E+00 1.91113635E+00 1.91113635E+00 1.91113635E+00 1.91113635E+00 1.91113635E+00 2.10137732E+00 2.03505478E+00 1.91113635E+00 1.91113635E+00 1.91113635E+00 1.94080696E+00 1.94080696E+00 1.91113635E+00 1.91113635E+00 2.06018753E+00 1.91113635E+00 1.91462701E+00 1.92160833E+00 1.80990721E+00 1.91113635E+00 1.91113635E+00 1.93906163E+00 1.91113635E+00 1.91113635E+00 2.00189351E+00 1.91462701E+00 2.12755727E+00 1.91113635E+00 1.91113635E+00 1.93906163E+00 1.91113635E+00 1.91113635E+00 1.91113635E+00 1.91113635E+00 2.05948940E+00 1.91113635E+00 1.91113635E+00 1.91462701E+00 1.91462701E+00 1.91113635E+00 1.89368305E+00 1.91113635E+00 1.91113635E+00 1.91113635E+00 1.91113635E+00 1.91113635E+00 1.91113635E+00 1.91113635E+00 1.91113635E+00 1.91113635E+00 1.91113635E+00 1.91113635E+00 1.91113635E+00 2.09439600E+00 2.09439600E+00 2.09439600E+00 1.91113635E+00 1.91113635E+00 2.06647072E+00 2.15024656E+00 1.91113635E+00 1.91113635E+00 1.91113635E+00 1.94080696E+00 1.93906163E+00 1.91113635E+00 1.91113635E+00 1.91113635E+00 1.91113635E+00 1.91462701E+00 2.09439600E+00 1.91113635E+00 2.10137732E+00 2.03505478E+00 1.91113635E+00 1.93906163E+00 2.09439600E+00 2.09439600E+00 1.91113635E+00 2.09439600E+00 1.98967620E+00 1.91113635E+00 1.91113635E+00 2.19911580E+00 1.91113635E+00 2.04203610E+00 1.91113635E+00 1.93906163E+00 1.91113635E+00 2.09439600E+00 1.97222290E+00 2.09439600E+00 2.09439600E+00 2.09439600E+00 1.93906163E+00 2.19911580E+00 2.04203610E+00 %FLAG DIHEDRAL_FORCE_CONSTANT %FORMAT(5E16.8) 2.00000000E+00 2.50000000E+00 0.00000000E+00 1.80000000E+00 8.00000000E-01 0.00000000E+00 0.00000000E+00 2.70000000E-01 4.20000000E-01 6.97000000E-01 1.19000000E-01 3.15000000E-01 1.56000000E-01 2.50000000E-01 0.00000000E+00 4.06000000E-01 2.89000000E-01 1.48000000E-01 1.12000000E-01 6.43000000E-01 7.90000000E-02 2.36000000E-01 4.80000000E-02 1.55555556E-01 1.66666667E-01 2.00000000E-01 2.00000000E-01 4.00000000E-01 1.60000000E-01 6.00000000E-03 2.51000000E-01 1.30000000E-02 3.37000000E-01 2.16000000E-01 1.00000000E-03 6.74000000E-01 6.00000000E-03 9.50000000E-02 8.00000000E-01 8.00000000E-02 4.50000000E-01 1.58000000E+00 5.50000000E-01 6.02000000E-01 3.94000000E-01 3.23000000E-01 2.78000000E-01 5.60000000E-02 6.66000000E-01 3.02000000E-01 1.35000000E-01 3.33333333E-01 4.20000000E-01 4.48000000E+00 6.82000000E-01 3.79000000E-01 4.69000000E-01 2.10000000E-02 6.40000000E-02 2.00000000E+00 1.50000000E-01 2.00000000E-01 2.50000000E-01 1.80000000E-01 6.61000000E-01 2.18000000E-01 4.01000000E-01 1.29000000E-01 2.11000000E-01 4.44000000E-01 2.67000000E-01 7.00000000E-03 6.66000000E-01 2.46000000E-01 1.60000000E-01 1.62000000E-01 7.35000000E-01 1.13000000E-01 1.15000000E-01 2.02000000E-01 7.70000000E-02 1.07000000E-01 2.24000000E-01 4.47000000E-01 5.30000000E-02 2.30000000E-01 3.10000000E-01 1.44000000E-01 9.70000000E-02 2.40000000E+00 1.04600000E+00 3.03000000E-01 3.30000000E-02 1.07000000E-01 8.28000000E-01 4.85000000E-01 3.01000000E-01 8.00000000E-03 6.88000000E-01 2.97000000E-01 5.90000000E-02 3.62500000E+00 5.50000000E-02 4.69000000E-01 1.92000000E-01 1.20000000E-02 6.90000000E-02 4.80000000E-02 1.20000000E-02 2.90000000E-01 7.00000000E-03 7.06000000E-01 6.20000000E-01 1.44000000E-01 1.90000000E-01 3.79000000E-01 2.70000000E-02 1.42000000E-01 1.79000000E-01 9.80000000E-02 2.59000000E-01 7.30000000E-02 4.21000000E-01 3.93000000E-01 1.45000000E-01 3.90000000E-01 1.36700000E+00 2.22000000E-01 6.08000000E-01 5.60000000E-02 1.00000000E-01 1.84000000E-01 7.80000000E-02 8.83000000E-01 6.50000000E-02 4.24000000E-01 4.59000000E-01 5.80000000E-02 1.54000000E-01 7.69000000E-01 3.10000000E-02 2.15400000E+00 6.47000000E-01 8.90000000E-02 1.05000000E+01 1.10000000E+00 1.00000000E+00 %FLAG DIHEDRAL_PERIODICITY %FORMAT(5E16.8) 1.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 3.00000000E+00 4.00000000E+00 1.00000000E+00 2.00000000E+00 3.00000000E+00 1.00000000E+00 2.00000000E+00 3.00000000E+00 4.00000000E+00 1.00000000E+00 3.00000000E+00 1.00000000E+00 2.00000000E+00 3.00000000E+00 4.00000000E+00 1.00000000E+00 2.00000000E+00 3.00000000E+00 4.00000000E+00 3.00000000E+00 3.00000000E+00 1.00000000E+00 2.00000000E+00 3.00000000E+00 3.00000000E+00 1.00000000E+00 2.00000000E+00 4.00000000E+00 1.00000000E+00 2.00000000E+00 4.00000000E+00 1.00000000E+00 2.00000000E+00 4.00000000E+00 1.00000000E+00 3.00000000E+00 1.00000000E+00 2.00000000E+00 3.00000000E+00 1.00000000E+00 2.00000000E+00 3.00000000E+00 4.00000000E+00 1.00000000E+00 2.00000000E+00 3.00000000E+00 4.00000000E+00 3.00000000E+00 1.00000000E+00 2.00000000E+00 3.00000000E+00 4.00000000E+00 1.00000000E+00 2.00000000E+00 4.00000000E+00 2.00000000E+00 3.00000000E+00 1.00000000E+00 2.00000000E+00 3.00000000E+00 1.00000000E+00 2.00000000E+00 3.00000000E+00 4.00000000E+00 1.00000000E+00 2.00000000E+00 3.00000000E+00 4.00000000E+00 1.00000000E+00 2.00000000E+00 4.00000000E+00 1.00000000E+00 2.00000000E+00 3.00000000E+00 4.00000000E+00 1.00000000E+00 2.00000000E+00 3.00000000E+00 4.00000000E+00 1.00000000E+00 2.00000000E+00 4.00000000E+00 1.00000000E+00 2.00000000E+00 4.00000000E+00 2.00000000E+00 1.00000000E+00 2.00000000E+00 3.00000000E+00 4.00000000E+00 1.00000000E+00 2.00000000E+00 3.00000000E+00 4.00000000E+00 1.00000000E+00 2.00000000E+00 4.00000000E+00 2.00000000E+00 1.00000000E+00 2.00000000E+00 3.00000000E+00 4.00000000E+00 2.00000000E+00 4.00000000E+00 1.00000000E+00 2.00000000E+00 4.00000000E+00 1.00000000E+00 2.00000000E+00 3.00000000E+00 4.00000000E+00 1.00000000E+00 2.00000000E+00 3.00000000E+00 4.00000000E+00 1.00000000E+00 2.00000000E+00 4.00000000E+00 1.00000000E+00 2.00000000E+00 4.00000000E+00 2.00000000E+00 1.00000000E+00 2.00000000E+00 3.00000000E+00 4.00000000E+00 1.00000000E+00 2.00000000E+00 4.00000000E+00 2.00000000E+00 4.00000000E+00 1.00000000E+00 2.00000000E+00 3.00000000E+00 4.00000000E+00 2.00000000E+00 4.00000000E+00 1.00000000E+00 2.00000000E+00 4.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 %FLAG DIHEDRAL_PHASE %FORMAT(5E16.8) 0.00000000E+00 3.14159400E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.14159400E+00 3.14159400E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.14159400E+00 3.14159400E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.14159400E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.14159400E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.14159400E+00 3.14159400E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.14159400E+00 3.14159400E+00 3.14159400E+00 3.14159400E+00 0.00000000E+00 3.14159400E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.14159400E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.14159400E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.14159400E+00 3.14159400E+00 0.00000000E+00 3.14159400E+00 3.14159400E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.14159400E+00 0.00000000E+00 0.00000000E+00 3.14159400E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.14159400E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.14159400E+00 3.14159400E+00 3.14159400E+00 0.00000000E+00 3.14159400E+00 0.00000000E+00 0.00000000E+00 3.14159400E+00 3.14159400E+00 3.14159400E+00 0.00000000E+00 3.14159400E+00 3.14159400E+00 0.00000000E+00 3.14159400E+00 0.00000000E+00 3.14159400E+00 0.00000000E+00 3.14159400E+00 3.14159400E+00 3.14159400E+00 3.14159400E+00 3.14159400E+00 3.14159400E+00 0.00000000E+00 3.14159400E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.14159400E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.14159400E+00 0.00000000E+00 3.14159400E+00 3.14159400E+00 0.00000000E+00 3.14159400E+00 3.14159400E+00 3.14159400E+00 3.14159400E+00 3.14159400E+00 3.14159400E+00 3.14159400E+00 0.00000000E+00 3.14159400E+00 0.00000000E+00 0.00000000E+00 3.14159400E+00 0.00000000E+00 0.00000000E+00 3.14159400E+00 3.14159400E+00 3.14159400E+00 3.14159400E+00 0.00000000E+00 3.14159400E+00 3.14159400E+00 3.14159400E+00 %FLAG SCEE_SCALE_FACTOR %FORMAT(5E16.8) 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 %FLAG SCNB_SCALE_FACTOR %FORMAT(5E16.8) 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 %FLAG SOLTY %FORMAT(5E16.8) 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 %FLAG LENNARD_JONES_ACOEF %FORMAT(5E16.8) 9.44293233E+05 2.12601181E+03 1.39982777E-01 9.95480466E+05 2.56678134E+03 1.04308023E+06 2.01791425E+04 9.14716912E+00 2.27401052E+04 2.01823541E+02 6.20665997E+04 5.94667300E+01 6.78771368E+04 8.79040886E+02 3.25969625E+03 8.96776989E+04 1.07193646E+02 9.71708117E+04 1.41077189E+03 4.98586848E+03 7.51607703E+03 7.44975864E+05 1.40467023E+03 7.91544157E+05 1.45985502E+04 4.66922514E+04 6.82786631E+04 5.81803229E+05 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 8.82619071E+05 2.27577561E+03 9.24822270E+05 2.01619733E+04 6.01816484E+04 8.61541883E+04 7.01803794E+05 0.00000000E+00 8.19971662E+05 6.06829342E+05 1.02595236E+03 6.47841731E+05 1.12780457E+04 3.69471530E+04 5.44261042E+04 4.71003287E+05 0.00000000E+00 5.74393458E+05 3.79876399E+05 2.01562190E+06 5.97860700E+03 2.09861767E+06 4.93469320E+04 1.42791446E+05 2.02461849E+05 1.61587928E+06 0.00000000E+00 1.86068943E+06 1.32911052E+06 4.19430400E+06 7.91627154E+04 8.90987508E+01 8.59947003E+04 1.21014911E+03 4.33325458E+03 6.55825601E+03 6.00750218E+04 0.00000000E+00 7.62451550E+04 4.77908183E+04 1.79647996E+05 5.71629601E+03 %FLAG LENNARD_JONES_BCOEF %FORMAT(5E16.8) 8.01323529E+02 2.09604198E+01 9.37598976E-02 7.36907417E+02 2.06278363E+01 6.75612247E+02 6.45756063E+01 7.57919667E-01 6.13981767E+01 3.56012899E+00 1.13252061E+02 1.93248820E+00 1.06076943E+02 7.42992380E+00 1.43076527E+01 1.36131731E+02 2.59456373E+00 1.26919150E+02 9.41257003E+00 1.76949863E+01 2.17257828E+01 7.50714425E+02 1.79702257E+01 6.93079947E+02 5.79323581E+01 1.03606917E+02 1.25287818E+02 6.99746810E+02 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 6.53361429E+02 1.82891803E+01 5.99015525E+02 5.44372326E+01 9.40505980E+01 1.12529845E+02 6.14502845E+02 0.00000000E+00 5.31102864E+02 6.77220874E+02 1.53505284E+01 6.26720080E+02 5.08951803E+01 9.21192136E+01 1.11805549E+02 6.29300710E+02 0.00000000E+00 5.55666448E+02 5.64885984E+02 1.28923404E+03 3.87070358E+01 1.17824605E+03 1.11203892E+02 1.89165096E+02 2.25248294E+02 1.21753341E+03 0.00000000E+00 1.04466382E+03 1.10369829E+03 2.04800000E+03 1.26451907E+02 2.33864085E+00 1.18043746E+02 8.61880722E+00 1.63092814E+01 2.00642027E+01 1.16187983E+02 0.00000000E+00 1.04660679E+02 1.03580945E+02 2.09772716E+02 1.85196588E+01 %FLAG BONDS_INC_HYDROGEN %FORMAT(10I8) 36 39 3 24 27 4 24 30 4 24 33 4 18 21 5 12 15 8 0 3 11 0 6 11 0 9 11 78 81 3 66 69 4 66 72 4 66 75 4 60 63 5 54 57 13 48 51 14 102 105 17 102 108 17 96 99 13 90 93 14 132 135 17 132 138 17 126 129 13 120 123 14 180 183 13 171 174 4 171 177 4 162 165 4 162 168 4 153 156 22 153 159 22 213 216 3 204 207 17 204 210 17 198 201 13 192 195 14 264 267 4 264 270 4 264 273 4 255 258 25 255 261 25 243 246 4 243 249 4 243 252 4 237 240 27 231 234 13 225 228 14 312 315 4 312 318 4 312 321 4 300 303 4 300 306 4 300 309 4 294 297 27 288 291 13 282 285 14 342 345 4 342 348 4 342 351 4 336 339 13 330 333 14 417 420 29 417 423 29 408 411 29 408 414 29 399 402 29 390 393 31 390 396 31 381 384 33 381 387 33 372 375 33 372 378 33 366 369 13 360 363 14 453 456 3 444 447 17 444 450 17 438 441 13 432 435 14 492 495 14 492 498 14 477 480 25 477 483 25 471 474 13 465 468 14 555 558 37 549 552 37 543 546 37 537 540 37 531 534 37 519 522 4 519 525 4 513 516 13 507 510 14 594 597 14 594 600 14 579 582 25 579 585 25 573 576 13 567 570 14 639 642 4 639 645 4 639 648 4 627 630 4 627 633 4 627 636 4 621 624 27 615 618 13 609 612 14 669 672 17 669 675 17 663 666 13 657 660 14 744 747 29 744 750 29 735 738 29 735 741 29 726 729 29 717 720 31 717 723 31 708 711 33 708 714 33 699 702 33 699 705 33 693 696 13 687 690 14 798 801 4 798 804 4 798 807 4 786 789 4 786 792 4 786 795 4 780 783 27 771 774 25 771 777 25 765 768 13 759 762 14 846 849 13 837 840 4 837 843 4 828 831 4 828 834 4 819 822 22 819 825 22 864 867 13 864 870 13 858 861 14 909 912 3 897 900 4 897 903 4 897 906 4 891 894 5 885 888 13 879 882 14 942 945 3 933 936 17 933 939 17 927 930 13 921 924 14 975 978 25 975 981 25 966 969 25 966 972 25 960 963 13 954 957 14 1011 1014 4 1011 1017 4 1011 1020 4 1005 1008 13 999 1002 14 1068 1071 4 1068 1074 4 1068 1077 4 1059 1062 25 1059 1065 25 1047 1050 4 1047 1053 4 1047 1056 4 1041 1044 27 1035 1038 13 1029 1032 14 1098 1101 17 1098 1104 17 1092 1095 13 1086 1089 14 1128 1131 4 1128 1134 4 1128 1137 4 1122 1125 13 1116 1119 14 1176 1179 3 1164 1167 4 1164 1170 4 1164 1173 4 1158 1161 5 1152 1155 13 1146 1149 14 1239 1242 37 1233 1236 37 1227 1230 3 1218 1221 37 1212 1215 37 1200 1203 4 1200 1206 4 1194 1197 13 1188 1191 14 1281 1284 3 1269 1272 4 1269 1275 4 1269 1278 4 1263 1266 5 1257 1260 13 1251 1254 14 1299 1302 13 1299 1305 13 1293 1296 14 1326 1329 17 1326 1332 17 1320 1323 13 1314 1317 14 1383 1386 4 1383 1389 4 1383 1392 4 1374 1377 25 1374 1380 25 1362 1365 4 1362 1368 4 1362 1371 4 1356 1359 27 1350 1353 13 1344 1347 14 1440 1443 4 1440 1446 4 1440 1449 4 1431 1434 25 1431 1437 25 1419 1422 4 1419 1425 4 1419 1428 4 1413 1416 27 1407 1410 13 1401 1404 14 1497 1500 4 1497 1503 4 1497 1506 4 1488 1491 25 1488 1494 25 1476 1479 4 1476 1482 4 1476 1485 4 1470 1473 27 1464 1467 13 1458 1461 14 1545 1548 13 1536 1539 4 1536 1542 4 1527 1530 4 1527 1533 4 1518 1521 22 1518 1524 22 1563 1566 13 1563 1569 13 1557 1560 14 1590 1593 4 1590 1596 4 1590 1599 4 1584 1587 13 1578 1581 14 1638 1641 3 1626 1629 4 1626 1632 4 1626 1635 4 1620 1623 5 1614 1617 13 1608 1611 14 1662 1665 17 1662 1668 17 1656 1659 13 1650 1653 14 1710 1713 13 1701 1704 4 1701 1707 4 1692 1695 4 1692 1698 4 1683 1686 22 1683 1689 22 1728 1731 13 1728 1734 13 1722 1725 14 1755 1758 25 1755 1761 25 1749 1752 13 1743 1746 14 1830 1833 37 1824 1827 37 1818 1821 3 1809 1812 37 1803 1806 37 1791 1794 4 1791 1797 4 1785 1788 13 1779 1782 14 1854 1857 4 1854 1860 4 1854 1863 4 1848 1851 13 1842 1845 14 1899 1902 14 1899 1905 14 1884 1887 25 1884 1890 25 1878 1881 13 1872 1875 14 %FLAG BONDS_WITHOUT_HYDROGEN %FORMAT(10I8) 42 45 1 42 48 2 18 24 6 18 36 7 12 18 9 12 42 10 0 12 12 84 87 1 84 90 2 60 66 6 60 78 7 54 60 9 54 84 10 48 54 15 114 117 1 114 120 2 111 1671 16 102 111 18 96 102 19 96 114 10 90 96 15 144 147 1 144 150 2 141 1335 16 132 141 18 126 132 19 126 144 10 120 126 15 186 189 1 186 192 2 180 186 10 171 180 20 162 171 21 153 162 21 150 153 23 150 180 15 219 222 1 219 225 2 204 213 24 198 204 19 198 219 10 192 198 15 276 279 1 276 282 2 255 264 26 237 243 6 237 255 28 231 237 9 231 276 10 225 231 15 324 327 1 324 330 2 294 300 6 294 312 6 288 294 9 288 324 10 282 288 15 354 357 1 354 360 2 336 342 20 336 354 10 330 336 15 426 429 1 426 432 2 405 408 30 405 417 30 399 405 30 390 399 32 381 390 34 372 381 34 366 372 35 366 426 10 360 366 15 459 462 1 459 465 2 444 453 24 438 444 19 438 459 10 432 438 15 501 504 1 501 507 2 486 489 1 486 492 2 477 486 36 471 477 19 471 501 10 465 471 15 561 564 1 561 567 2 549 555 38 543 549 38 537 543 38 531 537 38 528 531 38 528 555 38 519 528 39 513 519 20 513 561 10 507 513 15 603 606 1 603 609 2 588 591 1 588 594 2 579 588 36 573 579 19 573 603 10 567 573 15 651 654 1 651 657 2 621 627 6 621 639 6 615 621 9 615 651 10 609 615 15 681 684 1 681 687 2 678 1107 16 669 678 18 663 669 19 663 681 10 657 663 15 753 756 1 753 759 2 732 735 30 732 744 30 726 732 30 717 726 32 708 717 34 699 708 34 693 699 35 693 753 10 687 693 15 810 813 1 810 816 2 780 786 6 780 798 6 771 780 28 765 771 19 765 810 10 759 765 15 852 855 1 852 858 2 846 852 10 837 846 20 828 837 21 819 828 21 816 819 23 816 846 15 873 876 1 873 879 2 864 873 10 858 864 15 915 918 1 915 921 2 891 897 6 891 909 7 885 891 9 885 915 10 879 885 15 948 951 1 948 954 2 933 942 24 927 933 19 927 948 10 921 927 15 993 996 1 993 999 2 984 987 40 984 990 40 975 984 41 966 975 42 960 966 19 960 993 10 954 960 15 1023 1026 1 1023 1029 2 1005 1011 20 1005 1023 10 999 1005 15 1080 1083 1 1080 1086 2 1059 1068 26 1041 1047 6 1041 1059 28 1035 1041 9 1035 1080 10 1029 1035 15 1110 1113 1 1110 1116 2 1098 1107 18 1092 1098 19 1092 1110 10 1086 1092 15 1140 1143 1 1140 1146 2 1122 1128 20 1122 1140 10 1116 1122 15 1182 1185 1 1182 1188 2 1158 1164 6 1158 1176 7 1152 1158 9 1152 1182 10 1146 1152 15 1245 1248 1 1245 1251 2 1233 1239 38 1224 1227 43 1224 1233 44 1218 1224 44 1212 1218 38 1209 1212 38 1209 1239 38 1200 1209 39 1194 1200 20 1194 1245 10 1188 1194 15 1287 1290 1 1287 1293 2 1263 1269 6 1263 1281 7 1257 1263 9 1257 1287 10 1251 1257 15 1308 1311 1 1308 1314 2 1299 1308 10 1293 1299 15 1338 1341 1 1338 1344 2 1326 1335 18 1320 1326 19 1320 1338 10 1314 1320 15 1395 1398 1 1395 1401 2 1374 1383 26 1356 1362 6 1356 1374 28 1350 1356 9 1350 1395 10 1344 1350 15 1452 1455 1 1452 1458 2 1431 1440 26 1413 1419 6 1413 1431 28 1407 1413 9 1407 1452 10 1401 1407 15 1509 1512 1 1509 1515 2 1488 1497 26 1470 1476 6 1470 1488 28 1464 1470 9 1464 1509 10 1458 1464 15 1551 1554 1 1551 1557 2 1545 1551 10 1536 1545 20 1527 1536 21 1518 1527 21 1515 1518 23 1515 1545 15 1572 1575 1 1572 1578 2 1563 1572 10 1557 1563 15 1602 1605 1 1602 1608 2 1584 1590 20 1584 1602 10 1578 1584 15 1644 1647 1 1644 1650 2 1620 1626 6 1620 1638 7 1614 1620 9 1614 1644 10 1608 1614 15 1674 1677 1 1674 1680 2 1662 1671 18 1656 1662 19 1656 1674 10 1650 1656 15 1716 1719 1 1716 1722 2 1710 1716 10 1701 1710 20 1692 1701 21 1683 1692 21 1680 1683 23 1680 1710 15 1737 1740 1 1737 1743 2 1728 1737 10 1722 1728 15 1773 1776 1 1773 1779 2 1764 1767 40 1764 1770 40 1755 1764 41 1749 1755 19 1749 1773 10 1743 1749 15 1836 1839 1 1836 1842 2 1824 1830 38 1815 1818 43 1815 1824 44 1809 1815 44 1803 1809 38 1800 1803 38 1800 1830 38 1791 1800 39 1785 1791 20 1785 1836 10 1779 1785 15 1866 1869 1 1866 1872 2 1848 1854 20 1848 1866 10 1842 1848 15 1908 1911 45 1908 1914 45 1893 1896 1 1893 1899 2 1884 1893 36 1878 1884 19 1878 1908 10 1872 1878 15 %FLAG ANGLES_INC_HYDROGEN %FORMAT(10I8) 42 48 51 2 30 24 33 4 27 24 30 4 27 24 33 4 21 18 24 6 21 18 36 7 18 24 27 9 18 24 30 9 18 24 33 9 18 36 39 10 15 12 18 11 15 12 42 12 12 18 21 13 9 0 12 18 6 0 9 19 6 0 12 18 3 0 6 19 3 0 9 19 3 0 12 18 0 12 15 20 84 90 93 2 72 66 75 4 69 66 72 4 69 66 75 4 63 60 66 6 63 60 78 7 60 66 69 9 60 66 72 9 60 66 75 9 60 78 81 10 57 54 60 23 57 54 84 24 54 60 63 13 51 48 54 25 48 54 57 26 114 120 123 2 108 102 111 30 105 102 108 31 105 102 111 30 99 96 102 33 99 96 114 24 96 102 105 34 96 102 108 34 93 90 96 25 90 96 99 26 138 132 141 30 135 132 138 31 135 132 141 30 129 126 132 33 129 126 144 24 126 132 135 34 126 132 138 34 123 120 126 25 120 126 129 26 186 192 195 2 183 180 186 24 177 171 180 38 174 171 177 4 174 171 180 38 171 180 183 39 168 162 171 41 165 162 168 4 165 162 171 41 162 171 174 41 162 171 177 41 159 153 162 43 156 153 159 44 156 153 162 43 153 162 165 41 153 162 168 41 150 153 156 47 150 153 159 47 150 180 183 26 219 225 228 2 210 204 213 50 207 204 210 31 207 204 213 50 204 213 216 51 201 198 204 33 201 198 219 24 198 204 207 34 198 204 210 34 195 192 198 25 192 198 201 26 276 282 285 2 270 264 273 4 267 264 270 4 267 264 273 4 261 255 264 53 258 255 261 54 258 255 264 53 255 264 267 55 255 264 270 55 255 264 273 55 249 243 252 4 246 243 249 4 246 243 252 4 240 237 243 57 240 237 255 58 237 243 246 9 237 243 249 9 237 243 252 9 237 255 258 59 237 255 261 59 234 231 237 23 234 231 276 24 231 237 240 61 228 225 231 25 225 231 234 26 324 330 333 2 318 312 321 4 315 312 318 4 315 312 321 4 306 300 309 4 303 300 306 4 303 300 309 4 297 294 300 57 297 294 312 57 294 300 303 9 294 300 306 9 294 300 309 9 294 312 315 9 294 312 318 9 294 312 321 9 291 288 294 23 291 288 324 24 288 294 297 61 285 282 288 25 282 288 291 26 354 360 363 2 348 342 351 4 345 342 348 4 345 342 351 4 339 336 342 39 339 336 354 24 336 342 345 38 336 342 348 38 336 342 351 38 333 330 336 25 330 336 339 26 426 432 435 2 420 417 423 64 411 408 414 64 405 408 411 66 405 408 414 66 405 417 420 66 405 417 423 66 402 399 405 66 396 390 399 67 393 390 396 68 393 390 399 67 390 399 402 69 387 381 390 71 384 381 387 72 384 381 390 71 381 390 393 73 381 390 396 73 378 372 381 71 375 372 378 72 375 372 381 71 372 381 384 71 372 381 387 71 369 366 372 77 369 366 426 24 366 372 375 78 366 372 378 78 363 360 366 25 360 366 369 26 459 465 468 2 450 444 453 50 447 444 450 31 447 444 453 50 444 453 456 51 441 438 444 33 441 438 459 24 438 444 447 34 438 444 450 34 435 432 438 25 432 438 441 26 501 507 510 2 495 492 498 81 486 492 495 2 486 492 498 2 483 477 486 82 480 477 483 54 480 477 486 82 474 471 477 33 474 471 501 24 471 477 480 85 471 477 483 85 468 465 471 25 465 471 474 26 561 567 570 2 552 549 555 87 549 555 558 87 546 543 549 87 543 549 552 87 540 537 543 87 537 543 546 87 534 531 537 87 531 537 540 87 528 531 534 87 528 555 558 87 525 519 528 89 522 519 525 4 522 519 528 89 516 513 519 39 516 513 561 24 513 519 522 38 513 519 525 38 510 507 513 25 507 513 516 26 603 609 612 2 597 594 600 81 588 594 597 2 588 594 600 2 585 579 588 82 582 579 585 54 582 579 588 82 576 573 579 33 576 573 603 24 573 579 582 85 573 579 585 85 570 567 573 25 567 573 576 26 651 657 660 2 645 639 648 4 642 639 645 4 642 639 648 4 633 627 636 4 630 627 633 4 630 627 636 4 624 621 627 57 624 621 639 57 621 627 630 9 621 627 633 9 621 627 636 9 621 639 642 9 621 639 645 9 621 639 648 9 618 615 621 23 618 615 651 24 615 621 624 61 612 609 615 25 609 615 618 26 681 687 690 2 675 669 678 30 672 669 675 31 672 669 678 30 666 663 669 33 666 663 681 24 663 669 672 34 663 669 675 34 660 657 663 25 657 663 666 26 753 759 762 2 747 744 750 64 738 735 741 64 732 735 738 66 732 735 741 66 732 744 747 66 732 744 750 66 729 726 732 66 723 717 726 67 720 717 723 68 720 717 726 67 717 726 729 69 714 708 717 71 711 708 714 72 711 708 717 71 708 717 720 73 708 717 723 73 705 699 708 71 702 699 705 72 702 699 708 71 699 708 711 71 699 708 714 71 696 693 699 77 696 693 753 24 693 699 702 78 693 699 705 78 690 687 693 25 687 693 696 26 804 798 807 4 801 798 804 4 801 798 807 4 792 786 795 4 789 786 792 4 789 786 795 4 783 780 786 57 783 780 798 57 780 786 789 9 780 786 792 9 780 786 795 9 780 798 801 9 780 798 804 9 780 798 807 9 777 771 780 59 774 771 777 54 774 771 780 59 771 780 783 58 768 765 771 33 768 765 810 24 765 771 774 85 765 771 777 85 762 759 765 25 759 765 768 26 852 858 861 2 849 846 852 24 843 837 846 38 840 837 843 4 840 837 846 38 837 846 849 39 834 828 837 41 831 828 834 4 831 828 837 41 828 837 840 41 828 837 843 41 825 819 828 43 822 819 825 44 822 819 828 43 819 828 831 41 819 828 834 41 816 819 822 47 816 819 825 47 816 846 849 26 873 879 882 2 870 864 873 24 867 864 870 93 867 864 873 24 861 858 864 25 858 864 867 26 858 864 870 26 915 921 924 2 903 897 906 4 900 897 903 4 900 897 906 4 894 891 897 6 894 891 909 7 891 897 900 9 891 897 903 9 891 897 906 9 891 909 912 10 888 885 891 23 888 885 915 24 885 891 894 13 882 879 885 25 879 885 888 26 948 954 957 2 939 933 942 50 936 933 939 31 936 933 942 50 933 942 945 51 930 927 933 33 930 927 948 24 927 933 936 34 927 933 939 34 924 921 927 25 921 927 930 26 993 999 1002 2 981 975 984 95 978 975 981 54 978 975 984 95 972 966 975 97 969 966 972 54 969 966 975 97 966 975 978 97 966 975 981 97 963 960 966 33 963 960 993 24 960 966 969 85 960 966 972 85 957 954 960 25 954 960 963 26 1023 1029 1032 2 1017 1011 1020 4 1014 1011 1017 4 1014 1011 1020 4 1008 1005 1011 39 1008 1005 1023 24 1005 1011 1014 38 1005 1011 1017 38 1005 1011 1020 38 1002 999 1005 25 999 1005 1008 26 1080 1086 1089 2 1074 1068 1077 4 1071 1068 1074 4 1071 1068 1077 4 1065 1059 1068 53 1062 1059 1065 54 1062 1059 1068 53 1059 1068 1071 55 1059 1068 1074 55 1059 1068 1077 55 1053 1047 1056 4 1050 1047 1053 4 1050 1047 1056 4 1044 1041 1047 57 1044 1041 1059 58 1041 1047 1050 9 1041 1047 1053 9 1041 1047 1056 9 1041 1059 1062 59 1041 1059 1065 59 1038 1035 1041 23 1038 1035 1080 24 1035 1041 1044 61 1032 1029 1035 25 1029 1035 1038 26 1110 1116 1119 2 1104 1098 1107 30 1101 1098 1104 31 1101 1098 1107 30 1095 1092 1098 33 1095 1092 1110 24 1092 1098 1101 34 1092 1098 1104 34 1089 1086 1092 25 1086 1092 1095 26 1140 1146 1149 2 1134 1128 1137 4 1131 1128 1134 4 1131 1128 1137 4 1125 1122 1128 39 1125 1122 1140 24 1122 1128 1131 38 1122 1128 1134 38 1122 1128 1137 38 1119 1116 1122 25 1116 1122 1125 26 1182 1188 1191 2 1170 1164 1173 4 1167 1164 1170 4 1167 1164 1173 4 1161 1158 1164 6 1161 1158 1176 7 1158 1164 1167 9 1158 1164 1170 9 1158 1164 1173 9 1158 1176 1179 10 1155 1152 1158 23 1155 1152 1182 24 1152 1158 1161 13 1149 1146 1152 25 1146 1152 1155 26 1245 1251 1254 2 1236 1233 1239 87 1233 1239 1242 87 1224 1227 1230 101 1224 1233 1236 102 1221 1218 1224 102 1215 1212 1218 87 1212 1218 1221 87 1209 1212 1215 87 1209 1239 1242 87 1206 1200 1209 89 1203 1200 1206 4 1203 1200 1209 89 1197 1194 1200 39 1197 1194 1245 24 1194 1200 1203 38 1194 1200 1206 38 1191 1188 1194 25 1188 1194 1197 26 1287 1293 1296 2 1275 1269 1278 4 1272 1269 1275 4 1272 1269 1278 4 1266 1263 1269 6 1266 1263 1281 7 1263 1269 1272 9 1263 1269 1275 9 1263 1269 1278 9 1263 1281 1284 10 1260 1257 1263 23 1260 1257 1287 24 1257 1263 1266 13 1254 1251 1257 25 1251 1257 1260 26 1308 1314 1317 2 1305 1299 1308 24 1302 1299 1305 93 1302 1299 1308 24 1296 1293 1299 25 1293 1299 1302 26 1293 1299 1305 26 1338 1344 1347 2 1332 1326 1335 30 1329 1326 1332 31 1329 1326 1335 30 1323 1320 1326 33 1323 1320 1338 24 1320 1326 1329 34 1320 1326 1332 34 1317 1314 1320 25 1314 1320 1323 26 1395 1401 1404 2 1389 1383 1392 4 1386 1383 1389 4 1386 1383 1392 4 1380 1374 1383 53 1377 1374 1380 54 1377 1374 1383 53 1374 1383 1386 55 1374 1383 1389 55 1374 1383 1392 55 1368 1362 1371 4 1365 1362 1368 4 1365 1362 1371 4 1359 1356 1362 57 1359 1356 1374 58 1356 1362 1365 9 1356 1362 1368 9 1356 1362 1371 9 1356 1374 1377 59 1356 1374 1380 59 1353 1350 1356 23 1353 1350 1395 24 1350 1356 1359 61 1347 1344 1350 25 1344 1350 1353 26 1452 1458 1461 2 1446 1440 1449 4 1443 1440 1446 4 1443 1440 1449 4 1437 1431 1440 53 1434 1431 1437 54 1434 1431 1440 53 1431 1440 1443 55 1431 1440 1446 55 1431 1440 1449 55 1425 1419 1428 4 1422 1419 1425 4 1422 1419 1428 4 1416 1413 1419 57 1416 1413 1431 58 1413 1419 1422 9 1413 1419 1425 9 1413 1419 1428 9 1413 1431 1434 59 1413 1431 1437 59 1410 1407 1413 23 1410 1407 1452 24 1407 1413 1416 61 1404 1401 1407 25 1401 1407 1410 26 1503 1497 1506 4 1500 1497 1503 4 1500 1497 1506 4 1494 1488 1497 53 1491 1488 1494 54 1491 1488 1497 53 1488 1497 1500 55 1488 1497 1503 55 1488 1497 1506 55 1482 1476 1485 4 1479 1476 1482 4 1479 1476 1485 4 1473 1470 1476 57 1473 1470 1488 58 1470 1476 1479 9 1470 1476 1482 9 1470 1476 1485 9 1470 1488 1491 59 1470 1488 1494 59 1467 1464 1470 23 1467 1464 1509 24 1464 1470 1473 61 1461 1458 1464 25 1458 1464 1467 26 1551 1557 1560 2 1548 1545 1551 24 1542 1536 1545 38 1539 1536 1542 4 1539 1536 1545 38 1536 1545 1548 39 1533 1527 1536 41 1530 1527 1533 4 1530 1527 1536 41 1527 1536 1539 41 1527 1536 1542 41 1524 1518 1527 43 1521 1518 1524 44 1521 1518 1527 43 1518 1527 1530 41 1518 1527 1533 41 1515 1518 1521 47 1515 1518 1524 47 1515 1545 1548 26 1572 1578 1581 2 1569 1563 1572 24 1566 1563 1569 93 1566 1563 1572 24 1560 1557 1563 25 1557 1563 1566 26 1557 1563 1569 26 1602 1608 1611 2 1596 1590 1599 4 1593 1590 1596 4 1593 1590 1599 4 1587 1584 1590 39 1587 1584 1602 24 1584 1590 1593 38 1584 1590 1596 38 1584 1590 1599 38 1581 1578 1584 25 1578 1584 1587 26 1644 1650 1653 2 1632 1626 1635 4 1629 1626 1632 4 1629 1626 1635 4 1623 1620 1626 6 1623 1620 1638 7 1620 1626 1629 9 1620 1626 1632 9 1620 1626 1635 9 1620 1638 1641 10 1617 1614 1620 23 1617 1614 1644 24 1614 1620 1623 13 1611 1608 1614 25 1608 1614 1617 26 1668 1662 1671 30 1665 1662 1668 31 1665 1662 1671 30 1659 1656 1662 33 1659 1656 1674 24 1656 1662 1665 34 1656 1662 1668 34 1653 1650 1656 25 1650 1656 1659 26 1716 1722 1725 2 1713 1710 1716 24 1707 1701 1710 38 1704 1701 1707 4 1704 1701 1710 38 1701 1710 1713 39 1698 1692 1701 41 1695 1692 1698 4 1695 1692 1701 41 1692 1701 1704 41 1692 1701 1707 41 1689 1683 1692 43 1686 1683 1689 44 1686 1683 1692 43 1683 1692 1695 41 1683 1692 1698 41 1680 1683 1686 47 1680 1683 1689 47 1680 1710 1713 26 1737 1743 1746 2 1734 1728 1737 24 1731 1728 1734 93 1731 1728 1737 24 1725 1722 1728 25 1722 1728 1731 26 1722 1728 1734 26 1773 1779 1782 2 1761 1755 1764 95 1758 1755 1761 54 1758 1755 1764 95 1752 1749 1755 33 1752 1749 1773 24 1749 1755 1758 85 1749 1755 1761 85 1746 1743 1749 25 1743 1749 1752 26 1836 1842 1845 2 1827 1824 1830 87 1824 1830 1833 87 1815 1818 1821 101 1815 1824 1827 102 1812 1809 1815 102 1806 1803 1809 87 1803 1809 1812 87 1800 1803 1806 87 1800 1830 1833 87 1797 1791 1800 89 1794 1791 1797 4 1794 1791 1800 89 1788 1785 1791 39 1788 1785 1836 24 1785 1791 1794 38 1785 1791 1797 38 1782 1779 1785 25 1779 1785 1788 26 1866 1872 1875 2 1860 1854 1863 4 1857 1854 1860 4 1857 1854 1863 4 1851 1848 1854 39 1851 1848 1866 24 1848 1854 1857 38 1848 1854 1860 38 1848 1854 1863 38 1845 1842 1848 25 1842 1848 1851 26 1902 1899 1905 81 1893 1899 1902 2 1893 1899 1905 2 1890 1884 1893 82 1887 1884 1890 54 1887 1884 1893 82 1881 1878 1884 33 1881 1878 1908 24 1878 1884 1887 85 1878 1884 1890 85 1875 1872 1878 25 1872 1878 1881 26 %FLAG ANGLES_WITHOUT_HYDROGEN %FORMAT(10I8) 45 42 48 1 42 48 54 3 24 18 36 5 18 12 42 8 12 18 24 14 12 18 36 15 12 42 45 16 12 42 48 17 0 12 18 21 0 12 42 22 87 84 90 1 84 90 96 3 66 60 78 5 60 54 84 8 54 60 66 14 54 60 78 15 54 84 87 16 54 84 90 17 48 54 60 27 48 54 84 28 117 114 120 1 114 120 126 3 111 1671 1662 29 102 96 114 32 102 111 1671 29 96 102 111 35 96 114 117 16 96 114 120 17 90 96 102 36 90 96 114 28 147 144 150 1 144 150 153 37 144 150 180 3 141 1335 1326 29 132 126 144 32 132 141 1335 29 126 132 141 35 126 144 147 16 126 144 150 17 120 126 132 36 120 126 144 28 189 186 192 1 186 192 198 3 180 186 189 16 180 186 192 17 171 180 186 40 162 171 180 42 153 150 180 45 153 162 171 46 150 153 162 48 150 180 171 49 150 180 186 28 222 219 225 1 219 225 231 3 204 198 219 32 198 204 213 52 198 219 222 16 198 219 225 17 192 198 204 36 192 198 219 28 279 276 282 1 276 282 288 3 243 237 255 56 237 231 276 8 237 255 264 60 231 237 243 14 231 237 255 62 231 276 279 16 231 276 282 17 225 231 237 27 225 231 276 28 327 324 330 1 324 330 336 3 300 294 312 63 294 288 324 8 288 294 300 14 288 294 312 14 288 324 327 16 288 324 330 17 282 288 294 27 282 288 324 28 357 354 360 1 354 360 366 3 342 336 354 40 336 354 357 16 336 354 360 17 330 336 342 49 330 336 354 28 429 426 432 1 426 432 438 3 408 405 417 65 399 405 408 65 399 405 417 65 390 399 405 70 381 390 399 74 372 366 426 75 372 381 390 76 366 372 381 79 366 426 429 16 366 426 432 17 360 366 372 80 360 366 426 28 462 459 465 1 459 465 471 3 444 438 459 32 438 444 453 52 438 459 462 16 438 459 465 17 432 438 444 36 432 438 459 28 504 501 507 1 501 507 513 3 489 486 492 1 477 471 501 32 477 486 489 83 477 486 492 84 471 477 486 86 471 501 504 16 471 501 507 17 465 471 477 36 465 471 501 28 564 561 567 1 561 567 573 3 543 549 555 88 537 543 549 88 531 528 555 88 531 537 543 88 528 531 537 88 528 555 549 88 519 513 561 40 519 528 531 90 519 528 555 90 513 519 528 91 513 561 564 16 513 561 567 17 507 513 519 49 507 513 561 28 606 603 609 1 603 609 615 3 591 588 594 1 579 573 603 32 579 588 591 83 579 588 594 84 573 579 588 86 573 603 606 16 573 603 609 17 567 573 579 36 567 573 603 28 654 651 657 1 651 657 663 3 627 621 639 63 621 615 651 8 615 621 627 14 615 621 639 14 615 651 654 16 615 651 657 17 609 615 621 27 609 615 651 28 684 681 687 1 681 687 693 3 678 1107 1098 29 669 663 681 32 669 678 1107 29 663 669 678 35 663 681 684 16 663 681 687 17 657 663 669 36 657 663 681 28 756 753 759 1 753 759 765 3 735 732 744 65 726 732 735 65 726 732 744 65 717 726 732 70 708 717 726 74 699 693 753 75 699 708 717 76 693 699 708 79 693 753 756 16 693 753 759 17 687 693 699 80 687 693 753 28 813 810 816 1 810 816 819 37 810 816 846 3 786 780 798 63 771 765 810 32 771 780 786 56 771 780 798 56 765 771 780 92 765 810 813 16 765 810 816 17 759 765 771 36 759 765 810 28 855 852 858 1 852 858 864 3 846 852 855 16 846 852 858 17 837 846 852 40 828 837 846 42 819 816 846 45 819 828 837 46 816 819 828 48 816 846 837 49 816 846 852 28 876 873 879 1 873 879 885 3 864 873 876 16 864 873 879 17 858 864 873 28 918 915 921 1 915 921 927 3 897 891 909 5 891 885 915 8 885 891 897 14 885 891 909 15 885 915 918 16 885 915 921 17 879 885 891 27 879 885 915 28 951 948 954 1 948 954 960 3 933 927 948 32 927 933 942 52 927 948 951 16 927 948 954 17 921 927 933 36 921 927 948 28 996 993 999 1 993 999 1005 3 987 984 990 94 975 984 987 96 975 984 990 96 966 960 993 32 966 975 984 98 960 966 975 99 960 993 996 16 960 993 999 17 954 960 966 36 954 960 993 28 1026 1023 1029 1 1023 1029 1035 3 1011 1005 1023 40 1005 1023 1026 16 1005 1023 1029 17 999 1005 1011 49 999 1005 1023 28 1083 1080 1086 1 1080 1086 1092 3 1047 1041 1059 56 1041 1035 1080 8 1041 1059 1068 60 1035 1041 1047 14 1035 1041 1059 62 1035 1080 1083 16 1035 1080 1086 17 1029 1035 1041 27 1029 1035 1080 28 1113 1110 1116 1 1110 1116 1122 3 1098 1092 1110 32 1092 1098 1107 35 1092 1110 1113 16 1092 1110 1116 17 1086 1092 1098 36 1086 1092 1110 28 1143 1140 1146 1 1140 1146 1152 3 1128 1122 1140 40 1122 1140 1143 16 1122 1140 1146 17 1116 1122 1128 49 1116 1122 1140 28 1185 1182 1188 1 1182 1188 1194 3 1164 1158 1176 5 1158 1152 1182 8 1152 1158 1164 14 1152 1158 1176 15 1152 1182 1185 16 1152 1182 1188 17 1146 1152 1158 27 1146 1152 1182 28 1248 1245 1251 1 1245 1251 1257 3 1227 1224 1233 100 1224 1233 1239 103 1218 1224 1227 100 1218 1224 1233 104 1212 1209 1239 88 1212 1218 1224 103 1209 1212 1218 88 1209 1239 1233 88 1200 1194 1245 40 1200 1209 1212 90 1200 1209 1239 90 1194 1200 1209 91 1194 1245 1248 16 1194 1245 1251 17 1188 1194 1200 49 1188 1194 1245 28 1290 1287 1293 1 1287 1293 1299 3 1269 1263 1281 5 1263 1257 1287 8 1257 1263 1269 14 1257 1263 1281 15 1257 1287 1290 16 1257 1287 1293 17 1251 1257 1263 27 1251 1257 1287 28 1311 1308 1314 1 1308 1314 1320 3 1299 1308 1311 16 1299 1308 1314 17 1293 1299 1308 28 1341 1338 1344 1 1338 1344 1350 3 1326 1320 1338 32 1320 1326 1335 35 1320 1338 1341 16 1320 1338 1344 17 1314 1320 1326 36 1314 1320 1338 28 1398 1395 1401 1 1395 1401 1407 3 1362 1356 1374 56 1356 1350 1395 8 1356 1374 1383 60 1350 1356 1362 14 1350 1356 1374 62 1350 1395 1398 16 1350 1395 1401 17 1344 1350 1356 27 1344 1350 1395 28 1455 1452 1458 1 1452 1458 1464 3 1419 1413 1431 56 1413 1407 1452 8 1413 1431 1440 60 1407 1413 1419 14 1407 1413 1431 62 1407 1452 1455 16 1407 1452 1458 17 1401 1407 1413 27 1401 1407 1452 28 1512 1509 1515 1 1509 1515 1518 37 1509 1515 1545 3 1476 1470 1488 56 1470 1464 1509 8 1470 1488 1497 60 1464 1470 1476 14 1464 1470 1488 62 1464 1509 1512 16 1464 1509 1515 17 1458 1464 1470 27 1458 1464 1509 28 1554 1551 1557 1 1551 1557 1563 3 1545 1551 1554 16 1545 1551 1557 17 1536 1545 1551 40 1527 1536 1545 42 1518 1515 1545 45 1518 1527 1536 46 1515 1518 1527 48 1515 1545 1536 49 1515 1545 1551 28 1575 1572 1578 1 1572 1578 1584 3 1563 1572 1575 16 1563 1572 1578 17 1557 1563 1572 28 1605 1602 1608 1 1602 1608 1614 3 1590 1584 1602 40 1584 1602 1605 16 1584 1602 1608 17 1578 1584 1590 49 1578 1584 1602 28 1647 1644 1650 1 1644 1650 1656 3 1626 1620 1638 5 1620 1614 1644 8 1614 1620 1626 14 1614 1620 1638 15 1614 1644 1647 16 1614 1644 1650 17 1608 1614 1620 27 1608 1614 1644 28 1677 1674 1680 1 1674 1680 1683 37 1674 1680 1710 3 1662 1656 1674 32 1656 1662 1671 35 1656 1674 1677 16 1656 1674 1680 17 1650 1656 1662 36 1650 1656 1674 28 1719 1716 1722 1 1716 1722 1728 3 1710 1716 1719 16 1710 1716 1722 17 1701 1710 1716 40 1692 1701 1710 42 1683 1680 1710 45 1683 1692 1701 46 1680 1683 1692 48 1680 1710 1701 49 1680 1710 1716 28 1740 1737 1743 1 1737 1743 1749 3 1728 1737 1740 16 1728 1737 1743 17 1722 1728 1737 28 1776 1773 1779 1 1773 1779 1785 3 1767 1764 1770 94 1755 1749 1773 32 1755 1764 1767 96 1755 1764 1770 96 1749 1755 1764 105 1749 1773 1776 16 1749 1773 1779 17 1743 1749 1755 36 1743 1749 1773 28 1839 1836 1842 1 1836 1842 1848 3 1818 1815 1824 100 1815 1824 1830 103 1809 1815 1818 100 1809 1815 1824 104 1803 1800 1830 88 1803 1809 1815 103 1800 1803 1809 88 1800 1830 1824 88 1791 1785 1836 40 1791 1800 1803 90 1791 1800 1830 90 1785 1791 1800 91 1785 1836 1839 16 1785 1836 1842 17 1779 1785 1791 49 1779 1785 1836 28 1869 1866 1872 1 1866 1872 1878 3 1854 1848 1866 40 1848 1866 1869 16 1848 1866 1872 17 1842 1848 1854 49 1842 1848 1866 28 1911 1908 1914 106 1896 1893 1899 1 1884 1878 1908 32 1884 1893 1896 83 1884 1893 1899 84 1878 1884 1893 86 1878 1908 1911 107 1878 1908 1914 107 1872 1878 1884 36 1872 1878 1908 28 %FLAG DIHEDRALS_INC_HYDROGEN %FORMAT(10I8) 45 42 48 51 1 45 42 -48 51 2 42 48 54 57 3 33 24 18 36 14 33 24 -18 36 15 30 24 18 36 14 30 24 -18 36 15 27 24 18 36 14 27 24 -18 36 15 24 18 36 39 20 24 18 -36 39 21 24 18 -36 39 22 24 18 -36 39 23 21 18 12 42 24 21 18 24 27 24 21 18 24 30 24 21 18 24 33 24 21 18 36 39 25 15 12 18 21 24 15 12 18 24 24 15 12 18 36 24 15 12 42 45 3 15 12 42 48 3 12 18 24 27 29 12 18 24 30 29 12 18 24 33 29 12 18 36 39 30 12 18 -36 39 31 12 18 -36 39 22 12 18 -36 39 32 12 42 48 51 2 9 0 12 15 24 9 0 12 18 24 9 0 12 42 24 6 0 12 15 24 6 0 12 18 24 6 0 12 42 24 3 0 12 15 24 3 0 12 18 24 3 0 12 42 24 0 12 18 21 24 87 84 90 93 1 87 84 -90 93 2 84 90 96 99 3 75 66 60 78 14 75 66 -60 78 15 72 66 60 78 14 72 66 -60 78 15 69 66 60 78 14 69 66 -60 78 15 66 60 78 81 20 66 60 -78 81 21 66 60 -78 81 22 66 60 -78 81 23 63 60 54 84 24 63 60 66 69 24 63 60 66 72 24 63 60 66 75 24 63 60 78 81 25 57 54 60 63 24 57 54 60 66 24 57 54 60 78 14 57 54 -60 78 15 57 54 84 87 39 57 54 -84 87 3 57 54 -84 87 40 57 54 84 90 3 54 60 66 69 29 54 60 66 72 29 54 60 66 75 29 54 60 78 81 30 54 60 -78 81 31 54 60 -78 81 22 54 60 -78 81 32 54 84 90 93 2 51 48 54 57 3 51 48 54 60 3 51 48 54 84 3 48 54 60 63 24 117 114 120 123 1 117 114 -120 123 2 114 120 126 129 3 111 1671 1662 1665 52 111 1671 1662 1668 52 108 102 96 114 24 108 102 111 1671 52 105 102 96 114 24 105 102 111 1671 52 99 96 102 105 24 99 96 102 108 24 99 96 102 111 24 99 96 114 117 39 99 96 -114 117 3 99 96 -114 117 40 99 96 114 120 3 96 114 120 123 2 93 90 96 99 3 93 90 96 102 3 93 90 96 114 3 90 96 102 105 24 90 96 102 108 24 144 150 153 156 3 144 150 153 159 3 144 150 180 183 3 141 1335 1326 1329 52 141 1335 1326 1332 52 138 132 126 144 24 138 132 141 1335 52 135 132 126 144 24 135 132 141 1335 52 129 126 132 135 24 129 126 132 138 24 129 126 132 141 24 129 126 144 147 39 129 126 -144 147 3 129 126 -144 147 40 129 126 144 150 3 123 120 126 129 3 123 120 126 132 3 123 120 126 144 3 120 126 132 135 24 120 126 132 138 24 189 186 192 195 1 189 186 -192 195 2 186 192 198 201 3 183 180 186 189 39 183 180 -186 189 3 183 180 -186 189 40 183 180 186 192 3 180 186 192 195 2 177 171 180 183 24 177 171 180 186 24 174 171 180 183 24 174 171 180 186 24 168 162 171 174 61 168 162 171 177 61 168 162 171 180 29 165 162 171 174 61 165 162 171 177 61 165 162 171 180 29 162 171 180 183 24 159 153 150 180 3 159 153 162 165 24 159 153 162 168 24 159 153 162 171 24 156 153 150 180 3 156 153 162 165 24 156 153 162 168 24 156 153 162 171 24 153 150 180 183 3 153 162 171 174 29 153 162 171 177 29 150 153 162 165 24 150 153 162 168 24 150 180 171 174 24 150 180 171 177 24 222 219 225 228 1 222 219 -225 228 2 219 225 231 234 3 210 204 198 219 24 210 204 213 216 25 207 204 198 219 24 207 204 213 216 25 201 198 204 207 24 201 198 204 210 24 201 198 204 213 14 201 198 -204 213 15 201 198 219 222 39 201 198 -219 222 3 201 198 -219 222 40 201 198 219 225 3 198 204 213 216 69 198 204 -213 216 70 198 204 -213 216 71 198 204 -213 216 72 198 219 225 228 2 195 192 198 201 3 195 192 198 204 3 195 192 198 219 3 192 198 204 207 24 192 198 204 210 24 279 276 282 285 1 279 276 -282 285 2 276 282 288 291 3 261 255 264 267 61 261 255 264 270 61 261 255 264 273 61 258 255 264 267 61 258 255 264 270 61 258 255 264 273 61 252 243 237 255 29 249 243 237 255 29 246 243 237 255 29 243 237 255 258 29 243 237 255 261 29 240 237 231 276 24 240 237 243 246 61 240 237 243 249 61 240 237 243 252 61 240 237 255 258 61 240 237 255 261 61 240 237 255 264 29 237 255 264 267 29 237 255 264 270 29 237 255 264 273 29 234 231 237 240 24 234 231 237 243 24 234 231 237 255 24 234 231 276 279 39 234 231 -276 279 3 234 231 -276 279 40 234 231 276 282 3 231 237 243 246 29 231 237 243 249 29 231 237 243 252 29 231 237 255 258 29 231 237 255 261 29 231 276 282 285 2 228 225 231 234 3 228 225 231 237 3 228 225 231 276 3 225 231 237 240 24 327 324 330 333 1 327 324 -330 333 2 324 330 336 339 3 309 300 294 312 29 306 300 294 312 29 303 300 294 312 29 300 294 312 315 29 300 294 312 318 29 300 294 312 321 29 297 294 288 324 24 297 294 300 303 61 297 294 300 306 61 297 294 300 309 61 297 294 312 315 61 297 294 312 318 61 297 294 312 321 61 291 288 294 297 24 291 288 294 300 24 291 288 294 312 24 291 288 324 327 39 291 288 -324 327 3 291 288 -324 327 40 291 288 324 330 3 288 294 300 303 29 288 294 300 306 29 288 294 300 309 29 288 294 312 315 29 288 294 312 318 29 288 294 312 321 29 288 324 330 333 2 285 282 288 291 3 285 282 288 294 3 285 282 288 324 3 282 288 294 297 24 357 354 360 363 1 357 354 -360 363 2 354 360 366 369 3 351 342 336 354 24 348 342 336 354 24 345 342 336 354 24 339 336 342 345 24 339 336 342 348 24 339 336 342 351 24 339 336 354 357 39 339 336 -354 357 3 339 336 -354 357 40 339 336 354 360 3 336 354 360 363 2 333 330 336 339 3 333 330 336 342 3 333 330 336 354 3 330 336 342 345 24 330 336 342 348 24 330 336 342 351 24 429 426 432 435 1 429 426 -432 435 2 426 432 438 441 3 414 408 405 417 90 414 408 -405 417 6 411 408 405 417 90 411 408 -405 417 6 408 405 417 420 90 408 405 -417 420 6 408 405 417 423 90 408 405 -417 423 6 402 399 405 408 90 402 399 -405 408 6 402 399 405 417 90 402 399 -405 417 6 399 405 408 411 90 399 405 -408 411 6 399 405 408 414 90 399 405 -408 414 6 399 405 417 420 90 399 405 -417 420 6 399 405 417 423 90 399 405 -417 423 6 396 390 399 402 15 396 390 399 405 15 393 390 399 402 15 393 390 399 405 15 387 381 390 393 24 387 381 390 396 24 387 381 390 399 24 384 381 390 393 24 384 381 390 396 24 384 381 390 399 24 381 390 399 402 15 378 372 366 426 24 378 372 381 384 61 378 372 381 387 61 378 372 381 390 29 375 372 366 426 24 375 372 381 384 61 375 372 381 387 61 375 372 381 390 29 372 381 390 393 24 372 381 390 396 24 369 366 372 375 24 369 366 372 378 24 369 366 372 381 24 369 366 426 429 39 369 366 -426 429 3 369 366 -426 429 40 369 366 426 432 3 366 372 381 384 29 366 372 381 387 29 366 426 432 435 2 363 360 366 369 3 363 360 366 372 3 363 360 366 426 3 360 366 372 375 24 360 366 372 378 24 462 459 465 468 1 462 459 -465 468 2 459 465 471 474 3 450 444 438 459 24 450 444 453 456 25 447 444 438 459 24 447 444 453 456 25 441 438 444 447 24 441 438 444 450 24 441 438 444 453 14 441 438 -444 453 15 441 438 459 462 39 441 438 -459 462 3 441 438 -459 462 40 441 438 459 465 3 438 444 453 456 69 438 444 -453 456 70 438 444 -453 456 71 438 444 -453 456 72 438 459 465 468 2 435 432 438 441 3 435 432 438 444 3 435 432 438 459 3 432 438 444 447 24 432 438 444 450 24 504 501 507 510 1 504 501 -507 510 2 501 507 513 516 3 489 486 492 495 1 489 486 -492 495 2 489 486 492 498 1 489 486 -492 498 2 483 477 471 501 24 483 477 486 489 39 483 477 -486 489 3 483 477 -486 489 40 483 477 486 492 3 480 477 471 501 24 480 477 486 489 39 480 477 -486 489 3 480 477 -486 489 40 480 477 486 492 3 477 486 492 495 2 477 486 492 498 2 474 471 477 480 24 474 471 477 483 24 474 471 477 486 24 474 471 501 504 39 474 471 -501 504 3 474 471 -501 504 40 474 471 501 507 3 471 501 507 510 2 468 465 471 474 3 468 465 471 477 3 468 465 471 501 3 465 471 477 480 24 465 471 477 483 24 564 561 567 570 1 564 561 -567 570 2 561 567 573 576 3 552 549 555 558 102 546 543 549 552 102 546 543 549 555 102 543 549 555 558 102 540 537 543 546 102 540 537 543 549 102 537 543 549 552 102 534 531 528 555 102 534 531 537 540 102 534 531 537 543 102 531 528 555 558 102 531 537 543 546 102 528 531 537 540 102 528 555 549 552 102 525 519 513 561 24 525 519 528 531 3 525 519 528 555 3 522 519 513 561 24 522 519 528 531 3 522 519 528 555 3 519 528 531 534 102 519 528 555 558 102 516 513 519 522 24 516 513 519 525 24 516 513 519 528 24 516 513 561 564 39 516 513 -561 564 3 516 513 -561 564 40 516 513 561 567 3 513 561 567 570 2 510 507 513 516 3 510 507 513 519 3 510 507 513 561 3 507 513 519 522 24 507 513 519 525 24 606 603 609 612 1 606 603 -609 612 2 603 609 615 618 3 591 588 594 597 1 591 588 -594 597 2 591 588 594 600 1 591 588 -594 600 2 585 579 573 603 24 585 579 588 591 39 585 579 -588 591 3 585 579 -588 591 40 585 579 588 594 3 582 579 573 603 24 582 579 588 591 39 582 579 -588 591 3 582 579 -588 591 40 582 579 588 594 3 579 588 594 597 2 579 588 594 600 2 576 573 579 582 24 576 573 579 585 24 576 573 579 588 24 576 573 603 606 39 576 573 -603 606 3 576 573 -603 606 40 576 573 603 609 3 573 603 609 612 2 570 567 573 576 3 570 567 573 579 3 570 567 573 603 3 567 573 579 582 24 567 573 579 585 24 654 651 657 660 1 654 651 -657 660 2 651 657 663 666 3 636 627 621 639 29 633 627 621 639 29 630 627 621 639 29 627 621 639 642 29 627 621 639 645 29 627 621 639 648 29 624 621 615 651 24 624 621 627 630 61 624 621 627 633 61 624 621 627 636 61 624 621 639 642 61 624 621 639 645 61 624 621 639 648 61 618 615 621 624 24 618 615 621 627 24 618 615 621 639 24 618 615 651 654 39 618 615 -651 654 3 618 615 -651 654 40 618 615 651 657 3 615 621 627 630 29 615 621 627 633 29 615 621 627 636 29 615 621 639 642 29 615 621 639 645 29 615 621 639 648 29 615 651 657 660 2 612 609 615 618 3 612 609 615 621 3 612 609 615 651 3 609 615 621 624 24 684 681 687 690 1 684 681 -687 690 2 681 687 693 696 3 678 1107 1098 1101 52 678 1107 1098 1104 52 675 669 663 681 24 675 669 678 1107 52 672 669 663 681 24 672 669 678 1107 52 666 663 669 672 24 666 663 669 675 24 666 663 669 678 24 666 663 681 684 39 666 663 -681 684 3 666 663 -681 684 40 666 663 681 687 3 663 681 687 690 2 660 657 663 666 3 660 657 663 669 3 660 657 663 681 3 657 663 669 672 24 657 663 669 675 24 756 753 759 762 1 756 753 -759 762 2 753 759 765 768 3 741 735 732 744 90 741 735 -732 744 6 738 735 732 744 90 738 735 -732 744 6 735 732 744 747 90 735 732 -744 747 6 735 732 744 750 90 735 732 -744 750 6 729 726 732 735 90 729 726 -732 735 6 729 726 732 744 90 729 726 -732 744 6 726 732 735 738 90 726 732 -735 738 6 726 732 735 741 90 726 732 -735 741 6 726 732 744 747 90 726 732 -744 747 6 726 732 744 750 90 726 732 -744 750 6 723 717 726 729 15 723 717 726 732 15 720 717 726 729 15 720 717 726 732 15 714 708 717 720 24 714 708 717 723 24 714 708 717 726 24 711 708 717 720 24 711 708 717 723 24 711 708 717 726 24 708 717 726 729 15 705 699 693 753 24 705 699 708 711 61 705 699 708 714 61 705 699 708 717 29 702 699 693 753 24 702 699 708 711 61 702 699 708 714 61 702 699 708 717 29 699 708 717 720 24 699 708 717 723 24 696 693 699 702 24 696 693 699 705 24 696 693 699 708 24 696 693 753 756 39 696 693 -753 756 3 696 693 -753 756 40 696 693 753 759 3 693 699 708 711 29 693 699 708 714 29 693 753 759 762 2 690 687 693 696 3 690 687 693 699 3 690 687 693 753 3 687 693 699 702 24 687 693 699 705 24 810 816 819 822 3 810 816 819 825 3 810 816 846 849 3 795 786 780 798 29 792 786 780 798 29 789 786 780 798 29 786 780 798 801 29 786 780 798 804 29 786 780 798 807 29 783 780 786 789 61 783 780 786 792 61 783 780 786 795 61 783 780 798 801 61 783 780 798 804 61 783 780 798 807 61 777 771 765 810 24 777 771 780 783 61 777 771 780 786 29 777 771 780 798 29 774 771 765 810 24 774 771 780 783 61 774 771 780 786 29 774 771 780 798 29 771 780 786 789 29 771 780 786 792 29 771 780 786 795 29 771 780 798 801 29 771 780 798 804 29 771 780 798 807 29 768 765 771 774 24 768 765 771 777 24 768 765 771 780 24 768 765 810 813 39 768 765 -810 813 3 768 765 -810 813 40 768 765 810 816 3 765 771 780 783 29 762 759 765 768 3 762 759 765 771 3 762 759 765 810 3 759 765 771 774 24 759 765 771 777 24 855 852 858 861 1 855 852 -858 861 2 852 858 864 867 3 852 858 864 870 3 849 846 852 855 39 849 846 -852 855 3 849 846 -852 855 40 849 846 852 858 3 846 852 858 861 2 843 837 846 849 24 843 837 846 852 24 840 837 846 849 24 840 837 846 852 24 834 828 837 840 61 834 828 837 843 61 834 828 837 846 29 831 828 837 840 61 831 828 837 843 61 831 828 837 846 29 828 837 846 849 24 825 819 816 846 3 825 819 828 831 24 825 819 828 834 24 825 819 828 837 24 822 819 816 846 3 822 819 828 831 24 822 819 828 834 24 822 819 828 837 24 819 816 846 849 3 819 828 837 840 29 819 828 837 843 29 816 819 828 831 24 816 819 828 834 24 816 846 837 840 24 816 846 837 843 24 876 873 879 882 1 876 873 -879 882 2 873 879 885 888 3 870 864 873 876 39 870 864 -873 876 3 870 864 -873 876 40 870 864 873 879 3 867 864 873 876 39 867 864 -873 876 3 867 864 -873 876 40 867 864 873 879 3 864 873 879 882 2 861 858 864 867 3 861 858 864 870 3 861 858 864 873 3 918 915 921 924 1 918 915 -921 924 2 915 921 927 930 3 906 897 891 909 14 906 897 -891 909 15 903 897 891 909 14 903 897 -891 909 15 900 897 891 909 14 900 897 -891 909 15 897 891 909 912 20 897 891 -909 912 21 897 891 -909 912 22 897 891 -909 912 23 894 891 885 915 24 894 891 897 900 24 894 891 897 903 24 894 891 897 906 24 894 891 909 912 25 888 885 891 894 24 888 885 891 897 24 888 885 891 909 14 888 885 -891 909 15 888 885 915 918 39 888 885 -915 918 3 888 885 -915 918 40 888 885 915 921 3 885 891 897 900 29 885 891 897 903 29 885 891 897 906 29 885 891 909 912 30 885 891 -909 912 31 885 891 -909 912 22 885 891 -909 912 32 885 915 921 924 2 882 879 885 888 3 882 879 885 891 3 882 879 885 915 3 879 885 891 894 24 951 948 954 957 1 951 948 -954 957 2 948 954 960 963 3 939 933 927 948 24 939 933 942 945 25 936 933 927 948 24 936 933 942 945 25 930 927 933 936 24 930 927 933 939 24 930 927 933 942 14 930 927 -933 942 15 930 927 948 951 39 930 927 -948 951 3 930 927 -948 951 40 930 927 948 954 3 927 933 942 945 69 927 933 -942 945 70 927 933 -942 945 71 927 933 -942 945 72 927 948 954 957 2 924 921 927 930 3 924 921 927 933 3 924 921 927 948 3 921 927 933 936 24 921 927 933 939 24 996 993 999 1002 1 996 993 -999 1002 2 993 999 1005 1008 3 981 975 984 987 3 981 975 984 990 3 978 975 984 987 3 978 975 984 990 3 972 966 960 993 24 972 966 975 978 61 972 966 975 981 61 972 966 975 984 24 969 966 960 993 24 969 966 975 978 61 969 966 975 981 61 969 966 975 984 24 963 960 966 969 24 963 960 966 972 24 963 960 966 975 24 963 960 993 996 39 963 960 -993 996 3 963 960 -993 996 40 963 960 993 999 3 960 966 975 978 29 960 966 975 981 29 960 993 999 1002 2 957 954 960 963 3 957 954 960 966 3 957 954 960 993 3 954 960 966 969 24 954 960 966 972 24 1026 1023 1029 1032 1 1026 1023 -1029 1032 2 1023 1029 1035 1038 3 1020 1011 1005 1023 24 1017 1011 1005 1023 24 1014 1011 1005 1023 24 1008 1005 1011 1014 24 1008 1005 1011 1017 24 1008 1005 1011 1020 24 1008 1005 1023 1026 39 1008 1005 -1023 1026 3 1008 1005 -1023 1026 40 1008 1005 1023 1029 3 1005 1023 1029 1032 2 1002 999 1005 1008 3 1002 999 1005 1011 3 1002 999 1005 1023 3 999 1005 1011 1014 24 999 1005 1011 1017 24 999 1005 1011 1020 24 1083 1080 1086 1089 1 1083 1080 -1086 1089 2 1080 1086 1092 1095 3 1065 1059 1068 1071 61 1065 1059 1068 1074 61 1065 1059 1068 1077 61 1062 1059 1068 1071 61 1062 1059 1068 1074 61 1062 1059 1068 1077 61 1056 1047 1041 1059 29 1053 1047 1041 1059 29 1050 1047 1041 1059 29 1047 1041 1059 1062 29 1047 1041 1059 1065 29 1044 1041 1035 1080 24 1044 1041 1047 1050 61 1044 1041 1047 1053 61 1044 1041 1047 1056 61 1044 1041 1059 1062 61 1044 1041 1059 1065 61 1044 1041 1059 1068 29 1041 1059 1068 1071 29 1041 1059 1068 1074 29 1041 1059 1068 1077 29 1038 1035 1041 1044 24 1038 1035 1041 1047 24 1038 1035 1041 1059 24 1038 1035 1080 1083 39 1038 1035 -1080 1083 3 1038 1035 -1080 1083 40 1038 1035 1080 1086 3 1035 1041 1047 1050 29 1035 1041 1047 1053 29 1035 1041 1047 1056 29 1035 1041 1059 1062 29 1035 1041 1059 1065 29 1035 1080 1086 1089 2 1032 1029 1035 1038 3 1032 1029 1035 1041 3 1032 1029 1035 1080 3 1029 1035 1041 1044 24 1113 1110 1116 1119 1 1113 1110 -1116 1119 2 1110 1116 1122 1125 3 1104 1098 1092 1110 24 1101 1098 1092 1110 24 1095 1092 1098 1101 24 1095 1092 1098 1104 24 1095 1092 1098 1107 24 1095 1092 1110 1113 39 1095 1092 -1110 1113 3 1095 1092 -1110 1113 40 1095 1092 1110 1116 3 1092 1110 1116 1119 2 1089 1086 1092 1095 3 1089 1086 1092 1098 3 1089 1086 1092 1110 3 1086 1092 1098 1101 24 1086 1092 1098 1104 24 1143 1140 1146 1149 1 1143 1140 -1146 1149 2 1140 1146 1152 1155 3 1137 1128 1122 1140 24 1134 1128 1122 1140 24 1131 1128 1122 1140 24 1125 1122 1128 1131 24 1125 1122 1128 1134 24 1125 1122 1128 1137 24 1125 1122 1140 1143 39 1125 1122 -1140 1143 3 1125 1122 -1140 1143 40 1125 1122 1140 1146 3 1122 1140 1146 1149 2 1119 1116 1122 1125 3 1119 1116 1122 1128 3 1119 1116 1122 1140 3 1116 1122 1128 1131 24 1116 1122 1128 1134 24 1116 1122 1128 1137 24 1185 1182 1188 1191 1 1185 1182 -1188 1191 2 1182 1188 1194 1197 3 1173 1164 1158 1176 14 1173 1164 -1158 1176 15 1170 1164 1158 1176 14 1170 1164 -1158 1176 15 1167 1164 1158 1176 14 1167 1164 -1158 1176 15 1164 1158 1176 1179 20 1164 1158 -1176 1179 21 1164 1158 -1176 1179 22 1164 1158 -1176 1179 23 1161 1158 1152 1182 24 1161 1158 1164 1167 24 1161 1158 1164 1170 24 1161 1158 1164 1173 24 1161 1158 1176 1179 25 1155 1152 1158 1161 24 1155 1152 1158 1164 24 1155 1152 1158 1176 14 1155 1152 -1158 1176 15 1155 1152 1182 1185 39 1155 1152 -1182 1185 3 1155 1152 -1182 1185 40 1155 1152 1182 1188 3 1152 1158 1164 1167 29 1152 1158 1164 1170 29 1152 1158 1164 1173 29 1152 1158 1176 1179 30 1152 1158 -1176 1179 31 1152 1158 -1176 1179 22 1152 1158 -1176 1179 32 1152 1182 1188 1191 2 1149 1146 1152 1155 3 1149 1146 1152 1158 3 1149 1146 1152 1182 3 1146 1152 1158 1161 24 1248 1245 1251 1254 1 1248 1245 -1251 1254 2 1245 1251 1257 1260 3 1236 1233 1239 1242 102 1230 1227 1224 1233 7 1230 1227 -1224 1233 134 1230 1227 -1224 1233 15 1230 1227 -1224 1233 135 1227 1224 1233 1236 102 1224 1233 1239 1242 102 1221 1218 1224 1227 102 1221 1218 1224 1233 102 1218 1224 1227 1230 7 1218 1224 -1227 1230 134 1218 1224 -1227 1230 15 1218 1224 -1227 1230 135 1218 1224 1233 1236 102 1215 1212 1209 1239 102 1215 1212 1218 1221 102 1215 1212 1218 1224 102 1212 1209 1239 1242 102 1209 1212 1218 1221 102 1209 1239 1233 1236 102 1206 1200 1194 1245 24 1206 1200 1209 1212 3 1206 1200 1209 1239 3 1203 1200 1194 1245 24 1203 1200 1209 1212 3 1203 1200 1209 1239 3 1200 1209 1212 1215 102 1200 1209 1239 1242 102 1197 1194 1200 1203 24 1197 1194 1200 1206 24 1197 1194 1200 1209 24 1197 1194 1245 1248 39 1197 1194 -1245 1248 3 1197 1194 -1245 1248 40 1197 1194 1245 1251 3 1194 1245 1251 1254 2 1191 1188 1194 1197 3 1191 1188 1194 1200 3 1191 1188 1194 1245 3 1188 1194 1200 1203 24 1188 1194 1200 1206 24 1290 1287 1293 1296 1 1290 1287 -1293 1296 2 1287 1293 1299 1302 3 1287 1293 1299 1305 3 1278 1269 1263 1281 14 1278 1269 -1263 1281 15 1275 1269 1263 1281 14 1275 1269 -1263 1281 15 1272 1269 1263 1281 14 1272 1269 -1263 1281 15 1269 1263 1281 1284 20 1269 1263 -1281 1284 21 1269 1263 -1281 1284 22 1269 1263 -1281 1284 23 1266 1263 1257 1287 24 1266 1263 1269 1272 24 1266 1263 1269 1275 24 1266 1263 1269 1278 24 1266 1263 1281 1284 25 1260 1257 1263 1266 24 1260 1257 1263 1269 24 1260 1257 1263 1281 14 1260 1257 -1263 1281 15 1260 1257 1287 1290 39 1260 1257 -1287 1290 3 1260 1257 -1287 1290 40 1260 1257 1287 1293 3 1257 1263 1269 1272 29 1257 1263 1269 1275 29 1257 1263 1269 1278 29 1257 1263 1281 1284 30 1257 1263 -1281 1284 31 1257 1263 -1281 1284 22 1257 1263 -1281 1284 32 1257 1287 1293 1296 2 1254 1251 1257 1260 3 1254 1251 1257 1263 3 1254 1251 1257 1287 3 1251 1257 1263 1266 24 1311 1308 1314 1317 1 1311 1308 -1314 1317 2 1308 1314 1320 1323 3 1305 1299 1308 1311 39 1305 1299 -1308 1311 3 1305 1299 -1308 1311 40 1305 1299 1308 1314 3 1302 1299 1308 1311 39 1302 1299 -1308 1311 3 1302 1299 -1308 1311 40 1302 1299 1308 1314 3 1299 1308 1314 1317 2 1296 1293 1299 1302 3 1296 1293 1299 1305 3 1296 1293 1299 1308 3 1341 1338 1344 1347 1 1341 1338 -1344 1347 2 1338 1344 1350 1353 3 1332 1326 1320 1338 24 1329 1326 1320 1338 24 1323 1320 1326 1329 24 1323 1320 1326 1332 24 1323 1320 1326 1335 24 1323 1320 1338 1341 39 1323 1320 -1338 1341 3 1323 1320 -1338 1341 40 1323 1320 1338 1344 3 1320 1338 1344 1347 2 1317 1314 1320 1323 3 1317 1314 1320 1326 3 1317 1314 1320 1338 3 1314 1320 1326 1329 24 1314 1320 1326 1332 24 1398 1395 1401 1404 1 1398 1395 -1401 1404 2 1395 1401 1407 1410 3 1380 1374 1383 1386 61 1380 1374 1383 1389 61 1380 1374 1383 1392 61 1377 1374 1383 1386 61 1377 1374 1383 1389 61 1377 1374 1383 1392 61 1371 1362 1356 1374 29 1368 1362 1356 1374 29 1365 1362 1356 1374 29 1362 1356 1374 1377 29 1362 1356 1374 1380 29 1359 1356 1350 1395 24 1359 1356 1362 1365 61 1359 1356 1362 1368 61 1359 1356 1362 1371 61 1359 1356 1374 1377 61 1359 1356 1374 1380 61 1359 1356 1374 1383 29 1356 1374 1383 1386 29 1356 1374 1383 1389 29 1356 1374 1383 1392 29 1353 1350 1356 1359 24 1353 1350 1356 1362 24 1353 1350 1356 1374 24 1353 1350 1395 1398 39 1353 1350 -1395 1398 3 1353 1350 -1395 1398 40 1353 1350 1395 1401 3 1350 1356 1362 1365 29 1350 1356 1362 1368 29 1350 1356 1362 1371 29 1350 1356 1374 1377 29 1350 1356 1374 1380 29 1350 1395 1401 1404 2 1347 1344 1350 1353 3 1347 1344 1350 1356 3 1347 1344 1350 1395 3 1344 1350 1356 1359 24 1455 1452 1458 1461 1 1455 1452 -1458 1461 2 1452 1458 1464 1467 3 1437 1431 1440 1443 61 1437 1431 1440 1446 61 1437 1431 1440 1449 61 1434 1431 1440 1443 61 1434 1431 1440 1446 61 1434 1431 1440 1449 61 1428 1419 1413 1431 29 1425 1419 1413 1431 29 1422 1419 1413 1431 29 1419 1413 1431 1434 29 1419 1413 1431 1437 29 1416 1413 1407 1452 24 1416 1413 1419 1422 61 1416 1413 1419 1425 61 1416 1413 1419 1428 61 1416 1413 1431 1434 61 1416 1413 1431 1437 61 1416 1413 1431 1440 29 1413 1431 1440 1443 29 1413 1431 1440 1446 29 1413 1431 1440 1449 29 1410 1407 1413 1416 24 1410 1407 1413 1419 24 1410 1407 1413 1431 24 1410 1407 1452 1455 39 1410 1407 -1452 1455 3 1410 1407 -1452 1455 40 1410 1407 1452 1458 3 1407 1413 1419 1422 29 1407 1413 1419 1425 29 1407 1413 1419 1428 29 1407 1413 1431 1434 29 1407 1413 1431 1437 29 1407 1452 1458 1461 2 1404 1401 1407 1410 3 1404 1401 1407 1413 3 1404 1401 1407 1452 3 1401 1407 1413 1416 24 1509 1515 1518 1521 3 1509 1515 1518 1524 3 1509 1515 1545 1548 3 1494 1488 1497 1500 61 1494 1488 1497 1503 61 1494 1488 1497 1506 61 1491 1488 1497 1500 61 1491 1488 1497 1503 61 1491 1488 1497 1506 61 1485 1476 1470 1488 29 1482 1476 1470 1488 29 1479 1476 1470 1488 29 1476 1470 1488 1491 29 1476 1470 1488 1494 29 1473 1470 1464 1509 24 1473 1470 1476 1479 61 1473 1470 1476 1482 61 1473 1470 1476 1485 61 1473 1470 1488 1491 61 1473 1470 1488 1494 61 1473 1470 1488 1497 29 1470 1488 1497 1500 29 1470 1488 1497 1503 29 1470 1488 1497 1506 29 1467 1464 1470 1473 24 1467 1464 1470 1476 24 1467 1464 1470 1488 24 1467 1464 1509 1512 39 1467 1464 -1509 1512 3 1467 1464 -1509 1512 40 1467 1464 1509 1515 3 1464 1470 1476 1479 29 1464 1470 1476 1482 29 1464 1470 1476 1485 29 1464 1470 1488 1491 29 1464 1470 1488 1494 29 1461 1458 1464 1467 3 1461 1458 1464 1470 3 1461 1458 1464 1509 3 1458 1464 1470 1473 24 1554 1551 1557 1560 1 1554 1551 -1557 1560 2 1551 1557 1563 1566 3 1551 1557 1563 1569 3 1548 1545 1551 1554 39 1548 1545 -1551 1554 3 1548 1545 -1551 1554 40 1548 1545 1551 1557 3 1545 1551 1557 1560 2 1542 1536 1545 1548 24 1542 1536 1545 1551 24 1539 1536 1545 1548 24 1539 1536 1545 1551 24 1533 1527 1536 1539 61 1533 1527 1536 1542 61 1533 1527 1536 1545 29 1530 1527 1536 1539 61 1530 1527 1536 1542 61 1530 1527 1536 1545 29 1527 1536 1545 1548 24 1524 1518 1515 1545 3 1524 1518 1527 1530 24 1524 1518 1527 1533 24 1524 1518 1527 1536 24 1521 1518 1515 1545 3 1521 1518 1527 1530 24 1521 1518 1527 1533 24 1521 1518 1527 1536 24 1518 1515 1545 1548 3 1518 1527 1536 1539 29 1518 1527 1536 1542 29 1515 1518 1527 1530 24 1515 1518 1527 1533 24 1515 1545 1536 1539 24 1515 1545 1536 1542 24 1575 1572 1578 1581 1 1575 1572 -1578 1581 2 1572 1578 1584 1587 3 1569 1563 1572 1575 39 1569 1563 -1572 1575 3 1569 1563 -1572 1575 40 1569 1563 1572 1578 3 1566 1563 1572 1575 39 1566 1563 -1572 1575 3 1566 1563 -1572 1575 40 1566 1563 1572 1578 3 1563 1572 1578 1581 2 1560 1557 1563 1566 3 1560 1557 1563 1569 3 1560 1557 1563 1572 3 1605 1602 1608 1611 1 1605 1602 -1608 1611 2 1602 1608 1614 1617 3 1599 1590 1584 1602 24 1596 1590 1584 1602 24 1593 1590 1584 1602 24 1587 1584 1590 1593 24 1587 1584 1590 1596 24 1587 1584 1590 1599 24 1587 1584 1602 1605 39 1587 1584 -1602 1605 3 1587 1584 -1602 1605 40 1587 1584 1602 1608 3 1584 1602 1608 1611 2 1581 1578 1584 1587 3 1581 1578 1584 1590 3 1581 1578 1584 1602 3 1578 1584 1590 1593 24 1578 1584 1590 1596 24 1578 1584 1590 1599 24 1647 1644 1650 1653 1 1647 1644 -1650 1653 2 1644 1650 1656 1659 3 1635 1626 1620 1638 14 1635 1626 -1620 1638 15 1632 1626 1620 1638 14 1632 1626 -1620 1638 15 1629 1626 1620 1638 14 1629 1626 -1620 1638 15 1626 1620 1638 1641 20 1626 1620 -1638 1641 21 1626 1620 -1638 1641 22 1626 1620 -1638 1641 23 1623 1620 1614 1644 24 1623 1620 1626 1629 24 1623 1620 1626 1632 24 1623 1620 1626 1635 24 1623 1620 1638 1641 25 1617 1614 1620 1623 24 1617 1614 1620 1626 24 1617 1614 1620 1638 14 1617 1614 -1620 1638 15 1617 1614 1644 1647 39 1617 1614 -1644 1647 3 1617 1614 -1644 1647 40 1617 1614 1644 1650 3 1614 1620 1626 1629 29 1614 1620 1626 1632 29 1614 1620 1626 1635 29 1614 1620 1638 1641 30 1614 1620 -1638 1641 31 1614 1620 -1638 1641 22 1614 1620 -1638 1641 32 1614 1644 1650 1653 2 1611 1608 1614 1617 3 1611 1608 1614 1620 3 1611 1608 1614 1644 3 1608 1614 1620 1623 24 1674 1680 1683 1686 3 1674 1680 1683 1689 3 1674 1680 1710 1713 3 1668 1662 1656 1674 24 1665 1662 1656 1674 24 1659 1656 1662 1665 24 1659 1656 1662 1668 24 1659 1656 1662 1671 24 1659 1656 1674 1677 39 1659 1656 -1674 1677 3 1659 1656 -1674 1677 40 1659 1656 1674 1680 3 1653 1650 1656 1659 3 1653 1650 1656 1662 3 1653 1650 1656 1674 3 1650 1656 1662 1665 24 1650 1656 1662 1668 24 1719 1716 1722 1725 1 1719 1716 -1722 1725 2 1716 1722 1728 1731 3 1716 1722 1728 1734 3 1713 1710 1716 1719 39 1713 1710 -1716 1719 3 1713 1710 -1716 1719 40 1713 1710 1716 1722 3 1710 1716 1722 1725 2 1707 1701 1710 1713 24 1707 1701 1710 1716 24 1704 1701 1710 1713 24 1704 1701 1710 1716 24 1698 1692 1701 1704 61 1698 1692 1701 1707 61 1698 1692 1701 1710 29 1695 1692 1701 1704 61 1695 1692 1701 1707 61 1695 1692 1701 1710 29 1692 1701 1710 1713 24 1689 1683 1680 1710 3 1689 1683 1692 1695 24 1689 1683 1692 1698 24 1689 1683 1692 1701 24 1686 1683 1680 1710 3 1686 1683 1692 1695 24 1686 1683 1692 1698 24 1686 1683 1692 1701 24 1683 1680 1710 1713 3 1683 1692 1701 1704 29 1683 1692 1701 1707 29 1680 1683 1692 1695 24 1680 1683 1692 1698 24 1680 1710 1701 1704 24 1680 1710 1701 1707 24 1740 1737 1743 1746 1 1740 1737 -1743 1746 2 1737 1743 1749 1752 3 1734 1728 1737 1740 39 1734 1728 -1737 1740 3 1734 1728 -1737 1740 40 1734 1728 1737 1743 3 1731 1728 1737 1740 39 1731 1728 -1737 1740 3 1731 1728 -1737 1740 40 1731 1728 1737 1743 3 1728 1737 1743 1746 2 1725 1722 1728 1731 3 1725 1722 1728 1734 3 1725 1722 1728 1737 3 1776 1773 1779 1782 1 1776 1773 -1779 1782 2 1773 1779 1785 1788 3 1761 1755 1749 1773 24 1761 1755 1764 1767 3 1761 1755 1764 1770 3 1758 1755 1749 1773 24 1758 1755 1764 1767 3 1758 1755 1764 1770 3 1752 1749 1755 1758 24 1752 1749 1755 1761 24 1752 1749 1755 1764 24 1752 1749 1773 1776 39 1752 1749 -1773 1776 3 1752 1749 -1773 1776 40 1752 1749 1773 1779 3 1749 1773 1779 1782 2 1746 1743 1749 1752 3 1746 1743 1749 1755 3 1746 1743 1749 1773 3 1743 1749 1755 1758 24 1743 1749 1755 1761 24 1839 1836 1842 1845 1 1839 1836 -1842 1845 2 1836 1842 1848 1851 3 1827 1824 1830 1833 102 1821 1818 1815 1824 7 1821 1818 -1815 1824 134 1821 1818 -1815 1824 15 1821 1818 -1815 1824 135 1818 1815 1824 1827 102 1815 1824 1830 1833 102 1812 1809 1815 1818 102 1812 1809 1815 1824 102 1809 1815 1818 1821 7 1809 1815 -1818 1821 134 1809 1815 -1818 1821 15 1809 1815 -1818 1821 135 1809 1815 1824 1827 102 1806 1803 1800 1830 102 1806 1803 1809 1812 102 1806 1803 1809 1815 102 1803 1800 1830 1833 102 1800 1803 1809 1812 102 1800 1830 1824 1827 102 1797 1791 1785 1836 24 1797 1791 1800 1803 3 1797 1791 1800 1830 3 1794 1791 1785 1836 24 1794 1791 1800 1803 3 1794 1791 1800 1830 3 1791 1800 1803 1806 102 1791 1800 1830 1833 102 1788 1785 1791 1794 24 1788 1785 1791 1797 24 1788 1785 1791 1800 24 1788 1785 1836 1839 39 1788 1785 -1836 1839 3 1788 1785 -1836 1839 40 1788 1785 1836 1842 3 1785 1836 1842 1845 2 1782 1779 1785 1788 3 1782 1779 1785 1791 3 1782 1779 1785 1836 3 1779 1785 1791 1794 24 1779 1785 1791 1797 24 1869 1866 1872 1875 1 1869 1866 -1872 1875 2 1866 1872 1878 1881 3 1863 1854 1848 1866 24 1860 1854 1848 1866 24 1857 1854 1848 1866 24 1851 1848 1854 1857 24 1851 1848 1854 1860 24 1851 1848 1854 1863 24 1851 1848 1866 1869 39 1851 1848 -1866 1869 3 1851 1848 -1866 1869 40 1851 1848 1866 1872 3 1848 1866 1872 1875 2 1845 1842 1848 1851 3 1845 1842 1848 1854 3 1845 1842 1848 1866 3 1842 1848 1854 1857 24 1842 1848 1854 1860 24 1842 1848 1854 1863 24 1896 1893 1899 1902 1 1896 1893 -1899 1902 2 1896 1893 1899 1905 1 1896 1893 -1899 1905 2 1890 1884 1878 1908 24 1890 1884 1893 1896 39 1890 1884 -1893 1896 3 1890 1884 -1893 1896 40 1890 1884 1893 1899 3 1887 1884 1878 1908 24 1887 1884 1893 1896 39 1887 1884 -1893 1896 3 1887 1884 -1893 1896 40 1887 1884 1893 1899 3 1884 1893 1899 1902 2 1884 1893 1899 1905 2 1881 1878 1884 1887 24 1881 1878 1884 1890 24 1881 1878 1884 1893 24 1881 1878 1908 1911 3 1881 1878 1908 1914 3 1875 1872 1878 1881 3 1875 1872 1878 1884 3 1875 1872 1878 1908 3 1872 1878 1884 1887 24 1872 1878 1884 1890 24 42 54 -48 -51 146 84 96 -90 -93 146 114 126 -120 -123 146 186 198 -192 -195 146 219 231 -225 -228 146 276 288 -282 -285 146 324 336 -330 -333 146 405 420 -417 -423 147 405 411 -408 -414 147 390 405 -399 -402 147 354 366 -360 -363 146 426 438 -432 -435 146 486 495 -492 -498 147 459 471 -465 -468 146 528 549 -555 -558 146 543 555 -549 -552 146 537 549 -543 -546 146 531 543 -537 -540 146 528 537 -531 -534 146 501 513 -507 -510 146 588 597 -594 -600 147 561 573 -567 -570 146 603 615 -609 -612 146 651 663 -657 -660 146 732 747 -744 -750 147 732 738 -735 -741 147 717 732 -726 -729 147 681 693 -687 -690 146 753 765 -759 -762 146 852 864 -858 -861 146 873 885 -879 -882 146 915 927 -921 -924 146 948 960 -954 -957 146 993 1005 -999 -1002 146 1023 1035 -1029 -1032 146 1080 1092 -1086 -1089 146 1110 1122 -1116 -1119 146 1140 1152 -1146 -1149 146 1209 1233 -1239 -1242 146 1224 1239 -1233 -1236 146 1212 1224 -1218 -1221 146 1209 1218 -1212 -1215 146 1182 1194 -1188 -1191 146 1245 1257 -1251 -1254 146 1287 1299 -1293 -1296 146 1308 1320 -1314 -1317 146 1338 1350 -1344 -1347 146 1395 1407 -1401 -1404 146 1452 1464 -1458 -1461 146 1551 1563 -1557 -1560 146 1572 1584 -1578 -1581 146 1602 1614 -1608 -1611 146 1644 1656 -1650 -1653 146 1716 1728 -1722 -1725 146 1737 1749 -1743 -1746 146 1800 1824 -1830 -1833 146 1815 1830 -1824 -1827 146 1803 1815 -1809 -1812 146 1800 1809 -1803 -1806 146 1773 1785 -1779 -1782 146 1836 1848 -1842 -1845 146 1893 1902 -1899 -1905 147 1866 1878 -1872 -1875 146 %FLAG DIHEDRALS_WITHOUT_HYDROGEN %FORMAT(10I8) 45 42 48 54 2 42 48 54 60 1 42 48 -54 60 4 42 48 -54 60 5 42 48 -54 60 6 42 48 54 84 7 42 48 -54 84 8 42 48 -54 84 9 42 48 -54 84 6 36 18 12 42 10 36 18 -12 42 11 36 18 -12 42 12 36 18 -12 42 13 24 18 12 42 16 24 18 -12 42 17 24 18 -12 42 18 24 18 -12 42 19 18 12 42 45 3 18 12 42 48 26 18 12 -42 48 27 18 12 -42 48 28 18 12 -42 48 6 12 42 48 54 2 0 12 18 24 33 0 12 -18 24 34 0 12 -18 24 18 0 12 -18 24 35 0 12 18 36 36 0 12 -18 36 37 0 12 -18 36 12 0 12 -18 36 38 0 12 42 45 3 0 12 42 48 3 87 84 90 96 2 84 90 96 102 1 84 90 -96 102 4 84 90 -96 102 5 84 90 -96 102 6 84 90 96 114 7 84 90 -96 114 8 84 90 -96 114 9 84 90 -96 114 6 78 60 54 84 10 78 60 -54 84 11 78 60 -54 84 12 78 60 -54 84 13 66 60 54 84 16 66 60 -54 84 17 66 60 -54 84 18 66 60 -54 84 19 60 54 84 87 3 60 54 84 90 26 60 54 -84 90 27 60 54 -84 90 28 60 54 -84 90 6 54 84 90 96 2 48 54 60 66 33 48 54 -60 66 34 48 54 -60 66 18 48 54 -60 66 35 48 54 60 78 36 48 54 -60 78 37 48 54 -60 78 12 48 54 -60 78 38 48 54 84 87 3 48 54 84 90 41 48 54 -84 90 42 48 54 -84 90 43 48 54 -84 90 6 117 114 120 126 2 114 120 126 132 1 114 120 -126 132 4 114 120 -126 132 5 114 120 -126 132 6 114 120 126 144 7 114 120 -126 144 8 114 120 -126 144 9 114 120 -126 144 6 111 102 96 114 44 111 102 -96 114 45 111 102 -96 114 46 111 102 -96 114 47 111 1671 1662 1656 48 111 1671 -1662 1656 49 111 1671 -1662 1656 50 111 1671 -1662 1656 51 102 96 114 117 3 102 96 114 120 26 102 96 -114 120 27 102 96 -114 120 28 102 96 -114 120 6 102 111 1671 1662 53 102 111 -1671 1662 54 102 111 -1671 1662 55 102 111 -1671 1662 56 96 102 111 1671 48 96 102 -111 1671 49 96 102 -111 1671 50 96 102 -111 1671 51 96 114 120 126 2 90 96 102 111 57 90 96 -102 111 58 90 96 -102 111 46 90 96 -102 111 59 90 96 114 117 3 90 96 114 120 41 90 96 -114 120 42 90 96 -114 120 43 90 96 -114 120 6 147 144 150 153 2 147 144 150 180 2 144 150 153 162 1 144 150 -153 162 60 144 150 -153 162 28 144 150 -153 162 6 144 150 180 171 1 144 150 -180 171 4 144 150 -180 171 5 144 150 -180 171 6 144 150 180 186 7 144 150 -180 186 8 144 150 -180 186 9 144 150 -180 186 6 141 132 126 144 44 141 132 -126 144 45 141 132 -126 144 46 141 132 -126 144 47 141 1335 1326 1320 48 141 1335 -1326 1320 49 141 1335 -1326 1320 50 141 1335 -1326 1320 51 132 126 144 147 3 132 126 144 150 26 132 126 -144 150 27 132 126 -144 150 28 132 126 -144 150 6 132 141 1335 1326 53 132 141 -1335 1326 54 132 141 -1335 1326 55 132 141 -1335 1326 56 126 132 141 1335 48 126 132 -141 1335 49 126 132 -141 1335 50 126 132 -141 1335 51 126 144 150 153 2 126 144 150 180 2 120 126 132 141 57 120 126 -132 141 58 120 126 -132 141 46 120 126 -132 141 59 120 126 144 147 3 120 126 144 150 41 120 126 -144 150 42 120 126 -144 150 43 120 126 -144 150 6 189 186 192 198 2 186 192 198 204 1 186 192 -198 204 4 186 192 -198 204 5 186 192 -198 204 6 186 192 198 219 7 186 192 -198 219 8 186 192 -198 219 9 186 192 -198 219 6 180 186 192 198 2 171 180 186 189 3 171 180 186 192 26 171 180 -186 192 27 171 180 -186 192 28 171 180 -186 192 6 162 153 -150 180 3 162 171 180 186 24 153 150 -180 171 3 153 150 180 186 3 153 162 -171 180 62 153 162 -171 180 63 153 162 -171 180 64 150 153 -162 171 24 150 180 -171 162 24 150 180 186 189 3 150 180 186 192 41 150 180 -186 192 42 150 180 -186 192 43 150 180 -186 192 6 222 219 225 231 2 219 225 231 237 1 219 225 -231 237 4 219 225 -231 237 5 219 225 -231 237 6 219 225 231 276 7 219 225 -231 276 8 219 225 -231 276 9 219 225 -231 276 6 213 204 198 219 65 213 204 -198 219 66 213 204 -198 219 67 213 204 -198 219 68 204 198 219 222 3 204 198 219 225 26 204 198 -219 225 27 204 198 -219 225 28 204 198 -219 225 6 198 219 225 231 2 192 198 204 213 73 192 198 -204 213 74 192 198 -204 213 67 192 198 -204 213 75 192 198 219 222 3 192 198 219 225 41 192 198 -219 225 42 192 198 -219 225 43 192 198 -219 225 6 279 276 282 288 2 276 282 288 294 1 276 282 -288 294 4 276 282 -288 294 5 276 282 -288 294 6 276 282 288 324 7 276 282 -288 324 8 276 282 -288 324 9 276 282 -288 324 6 255 237 231 276 76 255 237 -231 276 77 255 237 -231 276 78 255 237 -231 276 79 243 237 231 276 16 243 237 -231 276 17 243 237 -231 276 18 243 237 -231 276 19 243 237 255 264 80 243 237 -255 264 81 243 237 -255 264 82 243 237 -255 264 83 237 231 276 279 3 237 231 276 282 26 237 231 -276 282 27 237 231 -276 282 28 237 231 -276 282 6 231 237 255 264 84 231 237 -255 264 85 231 237 -255 264 82 231 237 -255 264 86 231 276 282 288 2 225 231 237 243 33 225 231 -237 243 34 225 231 -237 243 18 225 231 -237 243 35 225 231 237 255 87 225 231 -237 255 88 225 231 -237 255 78 225 231 -237 255 89 225 231 276 279 3 225 231 276 282 41 225 231 -276 282 42 225 231 -276 282 43 225 231 -276 282 6 327 324 330 336 2 324 330 336 342 1 324 330 -336 342 4 324 330 -336 342 5 324 330 -336 342 6 324 330 336 354 7 324 330 -336 354 8 324 330 -336 354 9 324 330 -336 354 6 312 294 288 324 16 312 294 -288 324 17 312 294 -288 324 18 312 294 -288 324 19 300 294 288 324 16 300 294 -288 324 17 300 294 -288 324 18 300 294 -288 324 19 294 288 324 327 3 294 288 324 330 26 294 288 -324 330 27 294 288 -324 330 28 294 288 -324 330 6 288 324 330 336 2 282 288 294 300 33 282 288 -294 300 34 282 288 -294 300 18 282 288 -294 300 35 282 288 294 312 33 282 288 -294 312 34 282 288 -294 312 18 282 288 -294 312 35 282 288 324 327 3 282 288 324 330 41 282 288 -324 330 42 282 288 -324 330 43 282 288 -324 330 6 357 354 360 366 2 354 360 366 372 1 354 360 -366 372 4 354 360 -366 372 5 354 360 -366 372 6 354 360 366 426 7 354 360 -366 426 8 354 360 -366 426 9 354 360 -366 426 6 342 336 354 357 3 342 336 354 360 26 342 336 -354 360 27 342 336 -354 360 28 342 336 -354 360 6 336 354 360 366 2 330 336 354 357 3 330 336 354 360 41 330 336 -354 360 42 330 336 -354 360 43 330 336 -354 360 6 429 426 432 438 2 426 432 438 444 1 426 432 -438 444 4 426 432 -438 444 5 426 432 -438 444 6 426 432 438 459 7 426 432 -438 459 8 426 432 -438 459 9 426 432 -438 459 6 390 399 405 408 90 390 399 -405 408 6 390 399 405 417 90 390 399 -405 417 6 381 372 366 426 24 381 390 399 405 7 372 366 426 429 3 372 366 426 432 26 372 366 -426 432 27 372 366 -426 432 28 372 366 -426 432 6 372 381 390 399 24 366 372 381 390 62 366 372 -381 390 63 366 372 -381 390 64 366 426 432 438 2 360 366 372 381 24 360 366 426 429 3 360 366 426 432 41 360 366 -426 432 42 360 366 -426 432 43 360 366 -426 432 6 462 459 465 471 2 459 465 471 477 1 459 465 -471 477 4 459 465 -471 477 5 459 465 -471 477 6 459 465 471 501 7 459 465 -471 501 8 459 465 -471 501 9 459 465 -471 501 6 453 444 438 459 65 453 444 -438 459 66 453 444 -438 459 67 453 444 -438 459 68 444 438 459 462 3 444 438 459 465 26 444 438 -459 465 27 444 438 -459 465 28 444 438 -459 465 6 438 459 465 471 2 432 438 444 453 73 432 438 -444 453 74 432 438 -444 453 67 432 438 -444 453 75 432 438 459 462 3 432 438 459 465 41 432 438 -459 465 42 432 438 -459 465 43 432 438 -459 465 6 504 501 507 513 2 501 507 513 519 1 501 507 -513 519 4 501 507 -513 519 5 501 507 -513 519 6 501 507 513 561 7 501 507 -513 561 8 501 507 -513 561 9 501 507 -513 561 6 486 477 471 501 91 486 477 -471 501 92 486 477 -471 501 93 486 477 -471 501 94 477 471 501 504 3 477 471 501 507 26 477 471 -501 507 27 477 471 -501 507 28 477 471 -501 507 6 471 477 486 489 7 471 477 486 492 95 471 477 -486 492 96 471 477 -486 492 97 471 477 -486 492 98 471 501 507 513 2 465 471 477 486 99 465 471 -477 486 100 465 471 -477 486 93 465 471 -477 486 101 465 471 501 504 3 465 471 501 507 41 465 471 -501 507 42 465 471 -501 507 43 465 471 -501 507 6 564 561 567 573 2 561 567 573 579 1 561 567 -573 579 4 561 567 -573 579 5 561 567 -573 579 6 561 567 573 603 7 561 567 -573 603 8 561 567 -573 603 9 561 567 -573 603 6 537 531 528 555 102 537 543 -549 555 102 531 528 555 549 102 531 537 -543 549 102 528 519 513 561 103 528 519 -513 561 104 528 519 -513 561 105 528 519 -513 561 106 528 531 537 543 102 528 555 -549 543 102 519 513 561 564 3 519 513 561 567 26 519 513 -561 567 27 519 513 -561 567 28 519 513 -561 567 6 519 528 531 537 102 519 528 555 549 102 513 519 528 531 7 513 519 -528 531 107 513 519 -528 531 15 513 519 -528 531 108 513 519 528 555 7 513 519 -528 555 107 513 519 -528 555 15 513 519 -528 555 108 513 561 567 573 2 507 513 519 528 109 507 513 -519 528 110 507 513 -519 528 105 507 513 -519 528 111 507 513 561 564 3 507 513 561 567 41 507 513 -561 567 42 507 513 -561 567 43 507 513 -561 567 6 606 603 609 615 2 603 609 615 621 1 603 609 -615 621 4 603 609 -615 621 5 603 609 -615 621 6 603 609 615 651 7 603 609 -615 651 8 603 609 -615 651 9 603 609 -615 651 6 588 579 573 603 91 588 579 -573 603 92 588 579 -573 603 93 588 579 -573 603 94 579 573 603 606 3 579 573 603 609 26 579 573 -603 609 27 579 573 -603 609 28 579 573 -603 609 6 573 579 588 591 7 573 579 588 594 95 573 579 -588 594 96 573 579 -588 594 97 573 579 -588 594 98 573 603 609 615 2 567 573 579 588 99 567 573 -579 588 100 567 573 -579 588 93 567 573 -579 588 101 567 573 603 606 3 567 573 603 609 41 567 573 -603 609 42 567 573 -603 609 43 567 573 -603 609 6 654 651 657 663 2 651 657 663 669 1 651 657 -663 669 4 651 657 -663 669 5 651 657 -663 669 6 651 657 663 681 7 651 657 -663 681 8 651 657 -663 681 9 651 657 -663 681 6 639 621 615 651 16 639 621 -615 651 17 639 621 -615 651 18 639 621 -615 651 19 627 621 615 651 16 627 621 -615 651 17 627 621 -615 651 18 627 621 -615 651 19 621 615 651 654 3 621 615 651 657 26 621 615 -651 657 27 621 615 -651 657 28 621 615 -651 657 6 615 651 657 663 2 609 615 621 627 33 609 615 -621 627 34 609 615 -621 627 18 609 615 -621 627 35 609 615 621 639 33 609 615 -621 639 34 609 615 -621 639 18 609 615 -621 639 35 609 615 651 654 3 609 615 651 657 41 609 615 -651 657 42 609 615 -651 657 43 609 615 -651 657 6 684 681 687 693 2 681 687 693 699 1 681 687 -693 699 4 681 687 -693 699 5 681 687 -693 699 6 681 687 693 753 7 681 687 -693 753 8 681 687 -693 753 9 681 687 -693 753 6 678 669 663 681 44 678 669 -663 681 45 678 669 -663 681 46 678 669 -663 681 47 678 1107 1098 1092 48 678 1107 -1098 1092 49 678 1107 -1098 1092 50 678 1107 -1098 1092 51 669 663 681 684 3 669 663 681 687 26 669 663 -681 687 27 669 663 -681 687 28 669 663 -681 687 6 669 678 1107 1098 53 669 678 -1107 1098 54 669 678 -1107 1098 55 669 678 -1107 1098 56 663 669 678 1107 48 663 669 -678 1107 49 663 669 -678 1107 50 663 669 -678 1107 51 663 681 687 693 2 657 663 669 678 57 657 663 -669 678 58 657 663 -669 678 46 657 663 -669 678 59 657 663 681 684 3 657 663 681 687 41 657 663 -681 687 42 657 663 -681 687 43 657 663 -681 687 6 756 753 759 765 2 753 759 765 771 1 753 759 -765 771 4 753 759 -765 771 5 753 759 -765 771 6 753 759 765 810 7 753 759 -765 810 8 753 759 -765 810 9 753 759 -765 810 6 717 726 732 735 90 717 726 -732 735 6 717 726 732 744 90 717 726 -732 744 6 708 699 693 753 24 708 717 726 732 7 699 693 753 756 3 699 693 753 759 26 699 693 -753 759 27 699 693 -753 759 28 699 693 -753 759 6 699 708 717 726 24 693 699 708 717 62 693 699 -708 717 63 693 699 -708 717 64 693 753 759 765 2 687 693 699 708 24 687 693 753 756 3 687 693 753 759 41 687 693 -753 759 42 687 693 -753 759 43 687 693 -753 759 6 813 810 816 819 2 813 810 816 846 2 810 816 819 828 1 810 816 -819 828 60 810 816 -819 828 28 810 816 -819 828 6 810 816 846 837 1 810 816 -846 837 4 810 816 -846 837 5 810 816 -846 837 6 810 816 846 852 7 810 816 -846 852 8 810 816 -846 852 9 810 816 -846 852 6 780 771 765 810 112 780 771 -765 810 113 780 771 -765 810 114 780 771 -765 810 115 771 765 810 813 3 771 765 810 816 26 771 765 -810 816 27 771 765 -810 816 28 771 765 -810 816 6 765 771 780 786 116 765 771 -780 786 117 765 771 -780 786 118 765 771 -780 786 119 765 771 780 798 116 765 771 -780 798 117 765 771 -780 798 118 765 771 -780 798 119 765 810 816 819 2 765 810 816 846 2 759 765 771 780 120 759 765 -771 780 121 759 765 -771 780 114 759 765 -771 780 122 759 765 810 813 3 759 765 810 816 41 759 765 -810 816 42 759 765 -810 816 43 759 765 -810 816 6 855 852 858 864 2 852 858 864 873 7 852 858 -864 873 8 852 858 -864 873 9 852 858 -864 873 6 846 852 858 864 2 837 846 852 855 3 837 846 852 858 26 837 846 -852 858 27 837 846 -852 858 28 837 846 -852 858 6 828 819 -816 846 3 828 837 846 852 24 819 816 -846 837 3 819 816 846 852 3 819 828 -837 846 62 819 828 -837 846 63 819 828 -837 846 64 816 819 -828 837 24 816 846 -837 828 24 816 846 852 855 3 816 846 852 858 41 816 846 -852 858 42 816 846 -852 858 43 816 846 -852 858 6 876 873 879 885 2 873 879 885 891 1 873 879 -885 891 4 873 879 -885 891 5 873 879 -885 891 6 873 879 885 915 7 873 879 -885 915 8 873 879 -885 915 9 873 879 -885 915 6 864 873 879 885 2 858 864 873 876 3 858 864 873 879 41 858 864 -873 879 42 858 864 -873 879 43 858 864 -873 879 6 918 915 921 927 2 915 921 927 933 1 915 921 -927 933 4 915 921 -927 933 5 915 921 -927 933 6 915 921 927 948 7 915 921 -927 948 8 915 921 -927 948 9 915 921 -927 948 6 909 891 885 915 10 909 891 -885 915 11 909 891 -885 915 12 909 891 -885 915 13 897 891 885 915 16 897 891 -885 915 17 897 891 -885 915 18 897 891 -885 915 19 891 885 915 918 3 891 885 915 921 26 891 885 -915 921 27 891 885 -915 921 28 891 885 -915 921 6 885 915 921 927 2 879 885 891 897 33 879 885 -891 897 34 879 885 -891 897 18 879 885 -891 897 35 879 885 891 909 36 879 885 -891 909 37 879 885 -891 909 12 879 885 -891 909 38 879 885 915 918 3 879 885 915 921 41 879 885 -915 921 42 879 885 -915 921 43 879 885 -915 921 6 951 948 954 960 2 948 954 960 966 1 948 954 -960 966 4 948 954 -960 966 5 948 954 -960 966 6 948 954 960 993 7 948 954 -960 993 8 948 954 -960 993 9 948 954 -960 993 6 942 933 927 948 65 942 933 -927 948 66 942 933 -927 948 67 942 933 -927 948 68 933 927 948 951 3 933 927 948 954 26 933 927 -948 954 27 933 927 -948 954 28 933 927 -948 954 6 927 948 954 960 2 921 927 933 942 73 921 927 -933 942 74 921 927 -933 942 67 921 927 -933 942 75 921 927 948 951 3 921 927 948 954 41 921 927 -948 954 42 921 927 -948 954 43 921 927 -948 954 6 996 993 999 1005 2 993 999 1005 1011 1 993 999 -1005 1011 4 993 999 -1005 1011 5 993 999 -1005 1011 6 993 999 1005 1023 7 993 999 -1005 1023 8 993 999 -1005 1023 9 993 999 -1005 1023 6 975 966 960 993 123 975 966 -960 993 124 975 966 -960 993 114 975 966 -960 993 125 966 960 993 996 3 966 960 993 999 26 966 960 -993 999 27 966 960 -993 999 28 966 960 -993 999 6 966 975 984 987 126 966 975 -984 987 59 966 975 984 990 126 966 975 -984 990 59 960 966 975 984 127 960 966 -975 984 128 960 966 -975 984 129 960 966 -975 984 130 960 993 999 1005 2 954 960 966 975 131 954 960 -966 975 132 954 960 -966 975 114 954 960 -966 975 133 954 960 993 996 3 954 960 993 999 41 954 960 -993 999 42 954 960 -993 999 43 954 960 -993 999 6 1026 1023 1029 1035 2 1023 1029 1035 1041 1 1023 1029 -1035 1041 4 1023 1029 -1035 1041 5 1023 1029 -1035 1041 6 1023 1029 1035 1080 7 1023 1029 -1035 1080 8 1023 1029 -1035 1080 9 1023 1029 -1035 1080 6 1011 1005 1023 1026 3 1011 1005 1023 1029 26 1011 1005 -1023 1029 27 1011 1005 -1023 1029 28 1011 1005 -1023 1029 6 1005 1023 1029 1035 2 999 1005 1023 1026 3 999 1005 1023 1029 41 999 1005 -1023 1029 42 999 1005 -1023 1029 43 999 1005 -1023 1029 6 1083 1080 1086 1092 2 1080 1086 1092 1098 1 1080 1086 -1092 1098 4 1080 1086 -1092 1098 5 1080 1086 -1092 1098 6 1080 1086 1092 1110 7 1080 1086 -1092 1110 8 1080 1086 -1092 1110 9 1080 1086 -1092 1110 6 1059 1041 1035 1080 76 1059 1041 -1035 1080 77 1059 1041 -1035 1080 78 1059 1041 -1035 1080 79 1047 1041 1035 1080 16 1047 1041 -1035 1080 17 1047 1041 -1035 1080 18 1047 1041 -1035 1080 19 1047 1041 1059 1068 80 1047 1041 -1059 1068 81 1047 1041 -1059 1068 82 1047 1041 -1059 1068 83 1041 1035 1080 1083 3 1041 1035 1080 1086 26 1041 1035 -1080 1086 27 1041 1035 -1080 1086 28 1041 1035 -1080 1086 6 1035 1041 1059 1068 84 1035 1041 -1059 1068 85 1035 1041 -1059 1068 82 1035 1041 -1059 1068 86 1035 1080 1086 1092 2 1029 1035 1041 1047 33 1029 1035 -1041 1047 34 1029 1035 -1041 1047 18 1029 1035 -1041 1047 35 1029 1035 1041 1059 87 1029 1035 -1041 1059 88 1029 1035 -1041 1059 78 1029 1035 -1041 1059 89 1029 1035 1080 1083 3 1029 1035 1080 1086 41 1029 1035 -1080 1086 42 1029 1035 -1080 1086 43 1029 1035 -1080 1086 6 1113 1110 1116 1122 2 1110 1116 1122 1128 1 1110 1116 -1122 1128 4 1110 1116 -1122 1128 5 1110 1116 -1122 1128 6 1110 1116 1122 1140 7 1110 1116 -1122 1140 8 1110 1116 -1122 1140 9 1110 1116 -1122 1140 6 1107 1098 1092 1110 44 1107 1098 -1092 1110 45 1107 1098 -1092 1110 46 1107 1098 -1092 1110 47 1098 1092 1110 1113 3 1098 1092 1110 1116 26 1098 1092 -1110 1116 27 1098 1092 -1110 1116 28 1098 1092 -1110 1116 6 1092 1110 1116 1122 2 1086 1092 1098 1107 57 1086 1092 -1098 1107 58 1086 1092 -1098 1107 46 1086 1092 -1098 1107 59 1086 1092 1110 1113 3 1086 1092 1110 1116 41 1086 1092 -1110 1116 42 1086 1092 -1110 1116 43 1086 1092 -1110 1116 6 1143 1140 1146 1152 2 1140 1146 1152 1158 1 1140 1146 -1152 1158 4 1140 1146 -1152 1158 5 1140 1146 -1152 1158 6 1140 1146 1152 1182 7 1140 1146 -1152 1182 8 1140 1146 -1152 1182 9 1140 1146 -1152 1182 6 1128 1122 1140 1143 3 1128 1122 1140 1146 26 1128 1122 -1140 1146 27 1128 1122 -1140 1146 28 1128 1122 -1140 1146 6 1122 1140 1146 1152 2 1116 1122 1140 1143 3 1116 1122 1140 1146 41 1116 1122 -1140 1146 42 1116 1122 -1140 1146 43 1116 1122 -1140 1146 6 1185 1182 1188 1194 2 1182 1188 1194 1200 1 1182 1188 -1194 1200 4 1182 1188 -1194 1200 5 1182 1188 -1194 1200 6 1182 1188 1194 1245 7 1182 1188 -1194 1245 8 1182 1188 -1194 1245 9 1182 1188 -1194 1245 6 1176 1158 1152 1182 10 1176 1158 -1152 1182 11 1176 1158 -1152 1182 12 1176 1158 -1152 1182 13 1164 1158 1152 1182 16 1164 1158 -1152 1182 17 1164 1158 -1152 1182 18 1164 1158 -1152 1182 19 1158 1152 1182 1185 3 1158 1152 1182 1188 26 1158 1152 -1182 1188 27 1158 1152 -1182 1188 28 1158 1152 -1182 1188 6 1152 1182 1188 1194 2 1146 1152 1158 1164 33 1146 1152 -1158 1164 34 1146 1152 -1158 1164 18 1146 1152 -1158 1164 35 1146 1152 1158 1176 36 1146 1152 -1158 1176 37 1146 1152 -1158 1176 12 1146 1152 -1158 1176 38 1146 1152 1182 1185 3 1146 1152 1182 1188 41 1146 1152 -1182 1188 42 1146 1152 -1182 1188 43 1146 1152 -1182 1188 6 1248 1245 1251 1257 2 1245 1251 1257 1263 1 1245 1251 -1257 1263 4 1245 1251 -1257 1263 5 1245 1251 -1257 1263 6 1245 1251 1257 1287 7 1245 1251 -1257 1287 8 1245 1251 -1257 1287 9 1245 1251 -1257 1287 6 1227 1224 1233 1239 102 1218 1212 1209 1239 102 1218 1224 -1233 1239 102 1212 1209 1239 1233 102 1212 1218 1224 1227 102 1212 1218 -1224 1233 102 1209 1200 1194 1245 103 1209 1200 -1194 1245 104 1209 1200 -1194 1245 105 1209 1200 -1194 1245 106 1209 1212 1218 1224 102 1209 1239 -1233 1224 102 1200 1194 1245 1248 3 1200 1194 1245 1251 26 1200 1194 -1245 1251 27 1200 1194 -1245 1251 28 1200 1194 -1245 1251 6 1200 1209 1212 1218 102 1200 1209 1239 1233 102 1194 1200 1209 1212 7 1194 1200 -1209 1212 107 1194 1200 -1209 1212 15 1194 1200 -1209 1212 108 1194 1200 1209 1239 7 1194 1200 -1209 1239 107 1194 1200 -1209 1239 15 1194 1200 -1209 1239 108 1194 1245 1251 1257 2 1188 1194 1200 1209 109 1188 1194 -1200 1209 110 1188 1194 -1200 1209 105 1188 1194 -1200 1209 111 1188 1194 1245 1248 3 1188 1194 1245 1251 41 1188 1194 -1245 1251 42 1188 1194 -1245 1251 43 1188 1194 -1245 1251 6 1290 1287 1293 1299 2 1287 1293 1299 1308 7 1287 1293 -1299 1308 8 1287 1293 -1299 1308 9 1287 1293 -1299 1308 6 1281 1263 1257 1287 10 1281 1263 -1257 1287 11 1281 1263 -1257 1287 12 1281 1263 -1257 1287 13 1269 1263 1257 1287 16 1269 1263 -1257 1287 17 1269 1263 -1257 1287 18 1269 1263 -1257 1287 19 1263 1257 1287 1290 3 1263 1257 1287 1293 26 1263 1257 -1287 1293 27 1263 1257 -1287 1293 28 1263 1257 -1287 1293 6 1257 1287 1293 1299 2 1251 1257 1263 1269 33 1251 1257 -1263 1269 34 1251 1257 -1263 1269 18 1251 1257 -1263 1269 35 1251 1257 1263 1281 36 1251 1257 -1263 1281 37 1251 1257 -1263 1281 12 1251 1257 -1263 1281 38 1251 1257 1287 1290 3 1251 1257 1287 1293 41 1251 1257 -1287 1293 42 1251 1257 -1287 1293 43 1251 1257 -1287 1293 6 1311 1308 1314 1320 2 1308 1314 1320 1326 1 1308 1314 -1320 1326 4 1308 1314 -1320 1326 5 1308 1314 -1320 1326 6 1308 1314 1320 1338 7 1308 1314 -1320 1338 8 1308 1314 -1320 1338 9 1308 1314 -1320 1338 6 1299 1308 1314 1320 2 1293 1299 1308 1311 3 1293 1299 1308 1314 41 1293 1299 -1308 1314 42 1293 1299 -1308 1314 43 1293 1299 -1308 1314 6 1341 1338 1344 1350 2 1338 1344 1350 1356 1 1338 1344 -1350 1356 4 1338 1344 -1350 1356 5 1338 1344 -1350 1356 6 1338 1344 1350 1395 7 1338 1344 -1350 1395 8 1338 1344 -1350 1395 9 1338 1344 -1350 1395 6 1335 1326 1320 1338 44 1335 1326 -1320 1338 45 1335 1326 -1320 1338 46 1335 1326 -1320 1338 47 1326 1320 1338 1341 3 1326 1320 1338 1344 26 1326 1320 -1338 1344 27 1326 1320 -1338 1344 28 1326 1320 -1338 1344 6 1320 1338 1344 1350 2 1314 1320 1326 1335 57 1314 1320 -1326 1335 58 1314 1320 -1326 1335 46 1314 1320 -1326 1335 59 1314 1320 1338 1341 3 1314 1320 1338 1344 41 1314 1320 -1338 1344 42 1314 1320 -1338 1344 43 1314 1320 -1338 1344 6 1398 1395 1401 1407 2 1395 1401 1407 1413 1 1395 1401 -1407 1413 4 1395 1401 -1407 1413 5 1395 1401 -1407 1413 6 1395 1401 1407 1452 7 1395 1401 -1407 1452 8 1395 1401 -1407 1452 9 1395 1401 -1407 1452 6 1374 1356 1350 1395 76 1374 1356 -1350 1395 77 1374 1356 -1350 1395 78 1374 1356 -1350 1395 79 1362 1356 1350 1395 16 1362 1356 -1350 1395 17 1362 1356 -1350 1395 18 1362 1356 -1350 1395 19 1362 1356 1374 1383 80 1362 1356 -1374 1383 81 1362 1356 -1374 1383 82 1362 1356 -1374 1383 83 1356 1350 1395 1398 3 1356 1350 1395 1401 26 1356 1350 -1395 1401 27 1356 1350 -1395 1401 28 1356 1350 -1395 1401 6 1350 1356 1374 1383 84 1350 1356 -1374 1383 85 1350 1356 -1374 1383 82 1350 1356 -1374 1383 86 1350 1395 1401 1407 2 1344 1350 1356 1362 33 1344 1350 -1356 1362 34 1344 1350 -1356 1362 18 1344 1350 -1356 1362 35 1344 1350 1356 1374 87 1344 1350 -1356 1374 88 1344 1350 -1356 1374 78 1344 1350 -1356 1374 89 1344 1350 1395 1398 3 1344 1350 1395 1401 41 1344 1350 -1395 1401 42 1344 1350 -1395 1401 43 1344 1350 -1395 1401 6 1455 1452 1458 1464 2 1452 1458 1464 1470 1 1452 1458 -1464 1470 4 1452 1458 -1464 1470 5 1452 1458 -1464 1470 6 1452 1458 1464 1509 7 1452 1458 -1464 1509 8 1452 1458 -1464 1509 9 1452 1458 -1464 1509 6 1431 1413 1407 1452 76 1431 1413 -1407 1452 77 1431 1413 -1407 1452 78 1431 1413 -1407 1452 79 1419 1413 1407 1452 16 1419 1413 -1407 1452 17 1419 1413 -1407 1452 18 1419 1413 -1407 1452 19 1419 1413 1431 1440 80 1419 1413 -1431 1440 81 1419 1413 -1431 1440 82 1419 1413 -1431 1440 83 1413 1407 1452 1455 3 1413 1407 1452 1458 26 1413 1407 -1452 1458 27 1413 1407 -1452 1458 28 1413 1407 -1452 1458 6 1407 1413 1431 1440 84 1407 1413 -1431 1440 85 1407 1413 -1431 1440 82 1407 1413 -1431 1440 86 1407 1452 1458 1464 2 1401 1407 1413 1419 33 1401 1407 -1413 1419 34 1401 1407 -1413 1419 18 1401 1407 -1413 1419 35 1401 1407 1413 1431 87 1401 1407 -1413 1431 88 1401 1407 -1413 1431 78 1401 1407 -1413 1431 89 1401 1407 1452 1455 3 1401 1407 1452 1458 41 1401 1407 -1452 1458 42 1401 1407 -1452 1458 43 1401 1407 -1452 1458 6 1512 1509 1515 1518 2 1512 1509 1515 1545 2 1509 1515 1518 1527 1 1509 1515 -1518 1527 60 1509 1515 -1518 1527 28 1509 1515 -1518 1527 6 1509 1515 1545 1536 1 1509 1515 -1545 1536 4 1509 1515 -1545 1536 5 1509 1515 -1545 1536 6 1509 1515 1545 1551 7 1509 1515 -1545 1551 8 1509 1515 -1545 1551 9 1509 1515 -1545 1551 6 1488 1470 1464 1509 76 1488 1470 -1464 1509 77 1488 1470 -1464 1509 78 1488 1470 -1464 1509 79 1476 1470 1464 1509 16 1476 1470 -1464 1509 17 1476 1470 -1464 1509 18 1476 1470 -1464 1509 19 1476 1470 1488 1497 80 1476 1470 -1488 1497 81 1476 1470 -1488 1497 82 1476 1470 -1488 1497 83 1470 1464 1509 1512 3 1470 1464 1509 1515 26 1470 1464 -1509 1515 27 1470 1464 -1509 1515 28 1470 1464 -1509 1515 6 1464 1470 1488 1497 84 1464 1470 -1488 1497 85 1464 1470 -1488 1497 82 1464 1470 -1488 1497 86 1464 1509 1515 1518 2 1464 1509 1515 1545 2 1458 1464 1470 1476 33 1458 1464 -1470 1476 34 1458 1464 -1470 1476 18 1458 1464 -1470 1476 35 1458 1464 1470 1488 87 1458 1464 -1470 1488 88 1458 1464 -1470 1488 78 1458 1464 -1470 1488 89 1458 1464 1509 1512 3 1458 1464 1509 1515 41 1458 1464 -1509 1515 42 1458 1464 -1509 1515 43 1458 1464 -1509 1515 6 1554 1551 1557 1563 2 1551 1557 1563 1572 7 1551 1557 -1563 1572 8 1551 1557 -1563 1572 9 1551 1557 -1563 1572 6 1545 1551 1557 1563 2 1536 1545 1551 1554 3 1536 1545 1551 1557 26 1536 1545 -1551 1557 27 1536 1545 -1551 1557 28 1536 1545 -1551 1557 6 1527 1518 -1515 1545 3 1527 1536 1545 1551 24 1518 1515 -1545 1536 3 1518 1515 1545 1551 3 1518 1527 -1536 1545 62 1518 1527 -1536 1545 63 1518 1527 -1536 1545 64 1515 1518 -1527 1536 24 1515 1545 -1536 1527 24 1515 1545 1551 1554 3 1515 1545 1551 1557 41 1515 1545 -1551 1557 42 1515 1545 -1551 1557 43 1515 1545 -1551 1557 6 1575 1572 1578 1584 2 1572 1578 1584 1590 1 1572 1578 -1584 1590 4 1572 1578 -1584 1590 5 1572 1578 -1584 1590 6 1572 1578 1584 1602 7 1572 1578 -1584 1602 8 1572 1578 -1584 1602 9 1572 1578 -1584 1602 6 1563 1572 1578 1584 2 1557 1563 1572 1575 3 1557 1563 1572 1578 41 1557 1563 -1572 1578 42 1557 1563 -1572 1578 43 1557 1563 -1572 1578 6 1605 1602 1608 1614 2 1602 1608 1614 1620 1 1602 1608 -1614 1620 4 1602 1608 -1614 1620 5 1602 1608 -1614 1620 6 1602 1608 1614 1644 7 1602 1608 -1614 1644 8 1602 1608 -1614 1644 9 1602 1608 -1614 1644 6 1590 1584 1602 1605 3 1590 1584 1602 1608 26 1590 1584 -1602 1608 27 1590 1584 -1602 1608 28 1590 1584 -1602 1608 6 1584 1602 1608 1614 2 1578 1584 1602 1605 3 1578 1584 1602 1608 41 1578 1584 -1602 1608 42 1578 1584 -1602 1608 43 1578 1584 -1602 1608 6 1647 1644 1650 1656 2 1644 1650 1656 1662 1 1644 1650 -1656 1662 4 1644 1650 -1656 1662 5 1644 1650 -1656 1662 6 1644 1650 1656 1674 7 1644 1650 -1656 1674 8 1644 1650 -1656 1674 9 1644 1650 -1656 1674 6 1638 1620 1614 1644 10 1638 1620 -1614 1644 11 1638 1620 -1614 1644 12 1638 1620 -1614 1644 13 1626 1620 1614 1644 16 1626 1620 -1614 1644 17 1626 1620 -1614 1644 18 1626 1620 -1614 1644 19 1620 1614 1644 1647 3 1620 1614 1644 1650 26 1620 1614 -1644 1650 27 1620 1614 -1644 1650 28 1620 1614 -1644 1650 6 1614 1644 1650 1656 2 1608 1614 1620 1626 33 1608 1614 -1620 1626 34 1608 1614 -1620 1626 18 1608 1614 -1620 1626 35 1608 1614 1620 1638 36 1608 1614 -1620 1638 37 1608 1614 -1620 1638 12 1608 1614 -1620 1638 38 1608 1614 1644 1647 3 1608 1614 1644 1650 41 1608 1614 -1644 1650 42 1608 1614 -1644 1650 43 1608 1614 -1644 1650 6 1677 1674 1680 1683 2 1677 1674 1680 1710 2 1674 1680 1683 1692 1 1674 1680 -1683 1692 60 1674 1680 -1683 1692 28 1674 1680 -1683 1692 6 1674 1680 1710 1701 1 1674 1680 -1710 1701 4 1674 1680 -1710 1701 5 1674 1680 -1710 1701 6 1674 1680 1710 1716 7 1674 1680 -1710 1716 8 1674 1680 -1710 1716 9 1674 1680 -1710 1716 6 1671 1662 1656 1674 44 1671 1662 -1656 1674 45 1671 1662 -1656 1674 46 1671 1662 -1656 1674 47 1662 1656 1674 1677 3 1662 1656 1674 1680 26 1662 1656 -1674 1680 27 1662 1656 -1674 1680 28 1662 1656 -1674 1680 6 1656 1674 1680 1683 2 1656 1674 1680 1710 2 1650 1656 1662 1671 57 1650 1656 -1662 1671 58 1650 1656 -1662 1671 46 1650 1656 -1662 1671 59 1650 1656 1674 1677 3 1650 1656 1674 1680 41 1650 1656 -1674 1680 42 1650 1656 -1674 1680 43 1650 1656 -1674 1680 6 1719 1716 1722 1728 2 1716 1722 1728 1737 7 1716 1722 -1728 1737 8 1716 1722 -1728 1737 9 1716 1722 -1728 1737 6 1710 1716 1722 1728 2 1701 1710 1716 1719 3 1701 1710 1716 1722 26 1701 1710 -1716 1722 27 1701 1710 -1716 1722 28 1701 1710 -1716 1722 6 1692 1683 -1680 1710 3 1692 1701 1710 1716 24 1683 1680 -1710 1701 3 1683 1680 1710 1716 3 1683 1692 -1701 1710 62 1683 1692 -1701 1710 63 1683 1692 -1701 1710 64 1680 1683 -1692 1701 24 1680 1710 -1701 1692 24 1680 1710 1716 1719 3 1680 1710 1716 1722 41 1680 1710 -1716 1722 42 1680 1710 -1716 1722 43 1680 1710 -1716 1722 6 1740 1737 1743 1749 2 1737 1743 1749 1755 1 1737 1743 -1749 1755 4 1737 1743 -1749 1755 5 1737 1743 -1749 1755 6 1737 1743 1749 1773 7 1737 1743 -1749 1773 8 1737 1743 -1749 1773 9 1737 1743 -1749 1773 6 1728 1737 1743 1749 2 1722 1728 1737 1740 3 1722 1728 1737 1743 41 1722 1728 -1737 1743 42 1722 1728 -1737 1743 43 1722 1728 -1737 1743 6 1776 1773 1779 1785 2 1773 1779 1785 1791 1 1773 1779 -1785 1791 4 1773 1779 -1785 1791 5 1773 1779 -1785 1791 6 1773 1779 1785 1836 7 1773 1779 -1785 1836 8 1773 1779 -1785 1836 9 1773 1779 -1785 1836 6 1764 1755 1749 1773 136 1764 1755 -1749 1773 137 1764 1755 -1749 1773 138 1764 1755 -1749 1773 139 1755 1749 1773 1776 3 1755 1749 1773 1779 26 1755 1749 -1773 1779 27 1755 1749 -1773 1779 28 1755 1749 -1773 1779 6 1749 1755 1764 1767 7 1749 1755 -1764 1767 140 1749 1755 -1764 1767 15 1749 1755 -1764 1767 141 1749 1755 1764 1770 7 1749 1755 -1764 1770 140 1749 1755 -1764 1770 15 1749 1755 -1764 1770 141 1749 1773 1779 1785 2 1743 1749 1755 1764 142 1743 1749 -1755 1764 143 1743 1749 -1755 1764 138 1743 1749 -1755 1764 144 1743 1749 1773 1776 3 1743 1749 1773 1779 41 1743 1749 -1773 1779 42 1743 1749 -1773 1779 43 1743 1749 -1773 1779 6 1839 1836 1842 1848 2 1836 1842 1848 1854 1 1836 1842 -1848 1854 4 1836 1842 -1848 1854 5 1836 1842 -1848 1854 6 1836 1842 1848 1866 7 1836 1842 -1848 1866 8 1836 1842 -1848 1866 9 1836 1842 -1848 1866 6 1818 1815 1824 1830 102 1809 1803 1800 1830 102 1809 1815 -1824 1830 102 1803 1800 1830 1824 102 1803 1809 1815 1818 102 1803 1809 -1815 1824 102 1800 1791 1785 1836 103 1800 1791 -1785 1836 104 1800 1791 -1785 1836 105 1800 1791 -1785 1836 106 1800 1803 1809 1815 102 1800 1830 -1824 1815 102 1791 1785 1836 1839 3 1791 1785 1836 1842 26 1791 1785 -1836 1842 27 1791 1785 -1836 1842 28 1791 1785 -1836 1842 6 1791 1800 1803 1809 102 1791 1800 1830 1824 102 1785 1791 1800 1803 7 1785 1791 -1800 1803 107 1785 1791 -1800 1803 15 1785 1791 -1800 1803 108 1785 1791 1800 1830 7 1785 1791 -1800 1830 107 1785 1791 -1800 1830 15 1785 1791 -1800 1830 108 1785 1836 1842 1848 2 1779 1785 1791 1800 109 1779 1785 -1791 1800 110 1779 1785 -1791 1800 105 1779 1785 -1791 1800 111 1779 1785 1836 1839 3 1779 1785 1836 1842 41 1779 1785 -1836 1842 42 1779 1785 -1836 1842 43 1779 1785 -1836 1842 6 1869 1866 1872 1878 2 1866 1872 1878 1884 1 1866 1872 -1878 1884 4 1866 1872 -1878 1884 5 1866 1872 -1878 1884 6 1866 1872 1878 1908 7 1866 1872 -1878 1908 8 1866 1872 -1878 1908 9 1866 1872 -1878 1908 6 1854 1848 1866 1869 3 1854 1848 1866 1872 26 1854 1848 -1866 1872 27 1854 1848 -1866 1872 28 1854 1848 -1866 1872 6 1848 1866 1872 1878 2 1842 1848 1866 1869 3 1842 1848 1866 1872 41 1842 1848 -1866 1872 42 1842 1848 -1866 1872 43 1842 1848 -1866 1872 6 1893 1884 1878 1908 91 1893 1884 -1878 1908 92 1893 1884 -1878 1908 93 1893 1884 -1878 1908 94 1884 1878 1908 1911 3 1884 1878 1908 1914 3 1878 1884 1893 1896 7 1878 1884 1893 1899 95 1878 1884 -1893 1899 96 1878 1884 -1893 1899 97 1878 1884 -1893 1899 98 1872 1878 1884 1893 99 1872 1878 -1884 1893 100 1872 1878 -1884 1893 93 1872 1878 -1884 1893 101 1872 1878 1908 1911 3 1872 1878 1908 1914 3 12 48 -42 -45 145 54 90 -84 -87 145 96 120 -114 -117 145 126 150 -144 -147 145 180 192 -186 -189 145 144 153 -150 -180 147 198 225 -219 -222 145 231 282 -276 -279 145 288 330 -324 -327 145 336 360 -354 -357 145 366 432 -426 -429 145 399 408 -405 -417 145 438 465 -459 -462 145 471 507 -501 -504 145 477 492 -486 -489 145 513 567 -561 -564 145 531 555 -528 -519 146 573 609 -603 -606 145 579 594 -588 -591 145 615 657 -651 -654 145 663 687 -681 -684 145 693 759 -753 -756 145 726 735 -732 -744 145 765 816 -810 -813 145 846 858 -852 -855 145 810 819 -816 -846 147 864 879 -873 -876 145 885 921 -915 -918 145 927 954 -948 -951 145 960 999 -993 -996 145 975 987 -984 -990 145 1005 1029 -1023 -1026 145 1035 1086 -1080 -1083 145 1092 1116 -1110 -1113 145 1122 1146 -1140 -1143 145 1152 1188 -1182 -1185 145 1194 1251 -1245 -1248 145 1218 1233 -1224 -1227 146 1212 1239 -1209 -1200 146 1257 1293 -1287 -1290 145 1299 1314 -1308 -1311 145 1320 1344 -1338 -1341 145 1350 1401 -1395 -1398 145 1407 1458 -1452 -1455 145 1464 1515 -1509 -1512 145 1545 1557 -1551 -1554 145 1509 1518 -1515 -1545 147 1563 1578 -1572 -1575 145 1584 1608 -1602 -1605 145 1614 1650 -1644 -1647 145 1656 1680 -1674 -1677 145 1710 1722 -1716 -1719 145 1674 1683 -1680 -1710 147 1728 1743 -1737 -1740 145 1749 1779 -1773 -1776 145 1755 1767 -1764 -1770 145 1785 1842 -1836 -1839 145 1809 1824 -1815 -1818 146 1803 1830 -1800 -1791 146 1848 1872 -1866 -1869 145 1878 1911 -1908 -1914 145 1884 1899 -1893 -1896 145 %FLAG EXCLUDED_ATOMS_LIST %FORMAT(10I8) 2 3 4 5 6 7 8 9 13 15 16 17 3 4 5 6 7 15 4 5 6 7 15 5 6 7 15 6 7 8 9 10 11 12 13 14 15 16 17 18 19 7 8 9 13 15 16 17 8 9 10 11 12 13 14 15 16 17 9 10 11 12 13 14 15 10 11 12 13 14 15 11 12 13 12 13 13 14 15 0 16 17 18 19 20 21 29 17 18 19 18 19 20 21 22 23 27 29 30 31 19 20 21 29 20 21 22 23 24 25 26 27 28 29 30 31 32 33 21 22 23 27 29 30 31 22 23 24 25 26 27 28 29 30 31 23 24 25 26 27 28 29 24 25 26 27 28 29 25 26 27 26 27 27 28 29 0 30 31 32 33 34 35 39 31 32 33 32 33 34 35 36 37 38 39 40 41 33 34 35 39 34 35 36 37 38 39 40 41 42 43 558 35 36 37 38 39 40 41 36 37 38 39 40 41 555 558 37 38 39 558 38 39 558 39 553 555 556 557 558 40 41 42 43 44 45 49 41 42 43 42 43 44 45 46 47 48 49 50 51 43 44 45 49 44 45 46 47 48 49 50 51 52 61 446 45 46 47 48 49 50 51 46 47 48 49 50 51 443 446 47 48 49 446 48 49 446 49 441 443 444 445 446 50 51 52 53 54 55 58 61 62 63 51 52 61 52 53 54 55 56 57 58 59 60 61 62 63 64 65 53 54 55 56 57 58 59 60 61 62 63 54 55 56 57 58 61 55 56 57 58 61 56 57 58 59 60 61 62 63 57 58 59 60 61 58 59 60 61 59 60 61 62 63 64 65 60 61 62 63 61 62 63 62 63 64 65 66 67 63 64 65 64 65 66 67 68 69 74 65 66 67 66 67 68 69 70 71 72 74 75 76 67 68 69 74 68 69 70 71 72 73 74 75 76 77 78 69 70 71 72 74 75 76 70 71 72 73 74 75 76 71 72 73 74 72 73 74 73 74 0 75 76 77 78 79 80 93 76 77 78 77 78 79 80 81 82 86 93 94 95 78 79 80 93 79 80 81 82 83 84 85 86 87 88 89 93 94 95 96 97 80 81 82 86 93 94 95 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 82 83 84 85 86 87 88 89 93 83 84 85 86 87 88 89 93 84 85 86 85 86 86 87 88 89 90 91 92 93 88 89 90 91 92 89 90 91 92 90 91 92 91 92 92 0 94 95 96 97 98 99 109 95 96 97 96 97 98 99 100 101 105 109 110 111 97 98 99 109 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 99 100 101 105 109 110 111 100 101 102 103 104 105 106 107 108 109 110 111 101 102 103 104 105 106 107 108 109 102 103 104 105 106 107 108 109 103 104 105 104 105 105 106 107 108 109 107 108 108 0 110 111 112 113 114 115 119 111 112 113 112 113 114 115 116 117 118 119 120 121 113 114 115 119 114 115 116 117 118 119 120 121 122 123 115 116 117 118 119 120 121 116 117 118 119 120 121 117 118 119 118 119 119 120 121 122 123 124 125 143 121 122 123 122 123 124 125 126 127 128 143 144 145 123 124 125 143 124 125 126 127 128 129 130 131 143 144 145 146 147 125 126 127 128 143 144 145 126 127 128 129 130 131 132 133 134 143 144 145 127 128 129 130 131 143 128 129 130 131 143 129 130 131 132 133 134 135 136 143 130 131 132 133 134 131 132 133 134 132 133 134 135 136 137 140 133 134 135 136 134 135 136 135 136 137 138 139 140 141 142 136 137 140 137 138 139 140 141 142 138 139 140 141 142 139 140 140 141 142 142 0 144 145 146 147 148 149 154 145 146 147 146 147 148 149 150 151 152 154 155 156 147 148 149 154 148 149 150 151 152 153 154 155 156 157 158 149 150 151 152 154 155 156 150 151 152 153 154 155 156 151 152 153 154 152 153 154 153 154 0 155 156 157 158 159 160 168 156 157 158 157 158 159 160 161 162 163 168 169 170 158 159 160 168 159 160 161 162 163 164 165 168 169 170 171 172 160 161 162 163 168 169 170 161 162 163 164 165 166 167 168 169 170 162 163 164 165 168 163 164 165 168 164 165 166 167 168 165 166 167 166 167 167 0 169 170 171 172 173 174 188 170 171 172 171 172 173 174 175 176 177 188 189 190 172 173 174 188 173 174 175 176 177 178 186 188 189 190 191 192 174 175 176 177 188 189 190 175 176 177 178 179 180 184 186 187 188 189 190 176 177 178 186 188 177 178 186 188 178 179 180 181 182 184 185 186 187 188 179 180 181 182 183 184 186 187 180 181 182 186 181 182 183 184 185 186 182 183 184 183 184 185 186 187 184 185 186 185 186 187 186 187 187 0 189 190 191 192 193 194 202 190 191 192 191 192 193 194 195 196 197 202 203 204 192 193 194 202 193 194 195 196 197 198 199 202 203 204 205 206 194 195 196 197 202 203 204 195 196 197 198 199 200 201 202 203 204 196 197 198 199 202 197 198 199 202 198 199 200 201 202 199 200 201 200 201 201 0 203 204 205 206 207 208 218 204 205 206 205 206 207 208 209 210 214 218 219 220 206 207 208 218 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 208 209 210 214 218 219 220 209 210 211 212 213 214 215 216 217 218 219 220 210 211 212 213 214 215 216 217 218 211 212 213 214 215 216 217 218 212 213 214 213 214 214 215 216 217 218 216 217 217 0 219 220 221 222 223 224 228 220 221 222 221 222 223 224 225 226 227 228 229 230 222 223 224 228 223 224 225 226 227 228 229 230 231 232 370 224 225 226 227 228 229 230 225 226 227 228 229 230 367 370 226 227 228 370 227 228 370 228 365 367 368 369 370 229 230 231 232 233 234 252 230 231 232 231 232 233 234 235 236 237 252 253 254 232 233 234 252 233 234 235 236 237 238 239 240 252 253 254 255 256 234 235 236 237 252 253 254 235 236 237 238 239 240 241 242 243 252 253 254 236 237 238 239 240 252 237 238 239 240 252 238 239 240 241 242 243 244 245 252 239 240 241 242 243 240 241 242 243 241 242 243 244 245 246 249 242 243 244 245 243 244 245 244 245 246 247 248 249 250 251 245 246 249 246 247 248 249 250 251 247 248 249 250 251 248 249 249 250 251 251 0 253 254 255 256 257 258 271 254 255 256 255 256 257 258 259 260 261 271 272 273 256 257 258 271 257 258 259 260 261 262 263 267 271 272 273 274 283 258 259 260 261 271 272 273 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 260 261 262 263 267 271 261 262 263 267 271 262 263 264 265 266 267 268 269 270 271 263 264 265 266 267 268 269 270 264 265 266 267 268 269 270 265 266 267 266 267 267 268 269 270 269 270 270 0 272 273 274 275 276 277 280 283 284 285 273 274 283 274 275 276 277 278 279 280 281 282 283 284 285 286 287 275 276 277 278 279 280 281 282 283 284 285 276 277 278 279 280 283 277 278 279 280 283 278 279 280 281 282 283 284 285 279 280 281 282 283 280 281 282 283 281 282 283 284 285 286 287 282 283 284 285 283 284 285 284 285 286 287 288 289 285 286 287 286 287 288 289 290 291 292 287 288 289 288 289 290 291 292 293 294 289 290 291 292 290 291 292 293 294 295 296 291 292 293 294 292 293 294 293 294 295 296 297 298 306 294 295 296 295 296 297 298 299 300 304 306 307 308 296 297 298 306 297 298 299 300 301 302 303 304 305 306 307 308 309 310 298 299 300 304 306 307 308 299 300 301 302 303 304 305 306 307 308 300 301 302 303 304 305 306 301 302 303 304 305 306 302 303 304 303 304 304 305 306 0 307 308 309 310 311 312 317 308 309 310 309 310 311 312 313 314 315 317 318 319 310 311 312 317 311 312 313 314 315 316 317 318 319 320 321 312 313 314 315 317 318 319 313 314 315 316 317 318 319 314 315 316 317 315 316 317 316 317 0 318 319 320 321 322 323 332 319 320 321 320 321 322 323 324 325 326 332 333 334 321 322 323 332 322 323 324 325 326 327 328 329 332 333 334 335 336 323 324 325 326 332 333 334 324 325 326 327 328 329 330 331 332 333 334 325 326 327 328 329 332 326 327 328 329 332 327 328 329 330 331 332 328 329 330 331 329 330 331 330 331 331 0 333 334 335 336 337 338 342 334 335 336 335 336 337 338 339 340 341 342 343 344 336 337 338 342 337 338 339 340 341 342 343 344 345 346 338 339 340 341 342 343 344 339 340 341 342 343 344 340 341 342 341 342 342 343 344 345 346 347 348 361 344 345 346 345 346 347 348 349 350 354 361 362 363 346 347 348 361 347 348 349 350 351 352 353 354 355 356 357 361 362 363 364 365 348 349 350 354 361 362 363 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 350 351 352 353 354 355 356 357 361 351 352 353 354 355 356 357 361 352 353 354 353 354 354 355 356 357 358 359 360 361 356 357 358 359 360 357 358 359 360 358 359 360 359 360 360 0 362 363 364 365 366 367 371 363 364 365 364 365 366 367 368 369 370 371 372 373 365 366 367 371 366 367 368 369 370 371 372 373 374 375 367 368 369 370 371 372 373 368 369 370 371 372 373 369 370 371 370 371 371 372 373 374 375 376 377 381 373 374 375 374 375 376 377 378 379 380 381 382 383 375 376 377 381 376 377 378 379 380 381 382 383 384 385 377 378 379 380 381 382 383 378 379 380 381 382 383 379 380 381 380 381 381 382 383 384 385 386 387 395 383 384 385 384 385 386 387 388 389 393 395 396 397 385 386 387 395 386 387 388 389 390 391 392 393 394 395 396 397 398 399 387 388 389 393 395 396 397 388 389 390 391 392 393 394 395 396 397 389 390 391 392 393 394 395 390 391 392 393 394 395 391 392 393 392 393 393 394 395 0 396 397 398 399 400 401 416 397 398 399 398 399 400 401 402 403 404 416 417 418 399 400 401 416 400 401 402 403 404 405 414 416 417 418 419 420 401 402 403 404 416 417 418 402 403 404 405 406 407 412 414 415 416 417 418 403 404 405 414 416 404 405 414 416 405 406 407 408 409 412 413 414 415 416 406 407 408 409 410 412 414 415 407 408 409 414 408 409 410 411 412 413 414 409 410 412 410 411 412 413 414 415 411 412 413 414 412 413 414 415 414 415 415 0 417 418 419 420 421 422 430 418 419 420 419 420 421 422 423 424 428 430 431 432 420 421 422 430 421 422 423 424 425 426 427 428 429 430 431 432 433 434 422 423 424 428 430 431 432 423 424 425 426 427 428 429 430 431 432 424 425 426 427 428 429 430 425 426 427 428 429 430 426 427 428 427 428 428 429 430 0 431 432 433 434 435 436 437 432 433 434 433 434 435 436 437 438 439 434 435 436 437 435 436 437 438 439 440 441 436 437 438 439 437 438 439 438 439 440 441 442 443 447 439 440 441 440 441 442 443 444 445 446 447 448 449 441 442 443 447 442 443 444 445 446 447 448 449 450 451 443 444 445 446 447 448 449 444 445 446 447 448 449 445 446 447 446 447 447 448 449 450 451 452 453 466 449 450 451 450 451 452 453 454 455 459 466 467 468 451 452 453 466 452 453 454 455 456 457 458 459 460 461 462 466 467 468 469 470 453 454 455 459 466 467 468 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 455 456 457 458 459 460 461 462 466 456 457 458 459 460 461 462 466 457 458 459 458 459 459 460 461 462 463 464 465 466 461 462 463 464 465 462 463 464 465 463 464 465 464 465 465 0 467 468 469 470 471 472 485 468 469 470 469 470 471 472 473 474 478 485 486 487 470 471 472 485 471 472 473 474 475 476 477 478 479 480 481 485 486 487 488 489 472 473 474 478 485 486 487 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 474 475 476 477 478 479 480 481 485 475 476 477 478 479 480 481 485 476 477 478 477 478 478 479 480 481 482 483 484 485 480 481 482 483 484 481 482 483 484 482 483 484 483 484 484 0 486 487 488 489 490 491 504 487 488 489 488 489 490 491 492 493 497 504 505 506 489 490 491 504 490 491 492 493 494 495 496 497 498 499 500 504 505 506 507 516 491 492 493 497 504 505 506 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 493 494 495 496 497 498 499 500 504 494 495 496 497 498 499 500 504 495 496 497 496 497 497 498 499 500 501 502 503 504 499 500 501 502 503 500 501 502 503 501 502 503 502 503 503 0 505 506 507 508 509 510 513 516 517 518 506 507 516 507 508 509 510 511 512 513 514 515 516 517 518 519 520 508 509 510 511 512 513 514 515 516 517 518 509 510 511 512 513 516 510 511 512 513 516 511 512 513 514 515 516 517 518 512 513 514 515 516 513 514 515 516 514 515 516 517 518 519 520 515 516 517 518 516 517 518 517 518 519 520 521 522 518 519 520 519 520 521 522 523 524 525 520 521 522 521 522 523 524 525 526 527 522 523 524 525 523 524 525 526 527 528 529 524 525 526 527 525 526 527 526 527 528 529 530 531 535 527 528 529 528 529 530 531 532 533 534 535 536 537 529 530 531 535 530 531 532 533 534 535 536 537 538 539 531 532 533 534 535 536 537 532 533 534 535 536 537 533 534 535 534 535 535 536 537 538 539 540 541 549 537 538 539 538 539 540 541 542 543 547 549 550 551 539 540 541 549 540 541 542 543 544 545 546 547 548 549 550 551 552 553 541 542 543 547 549 550 551 542 543 544 545 546 547 548 549 550 551 543 544 545 546 547 548 549 544 545 546 547 548 549 545 546 547 546 547 547 548 549 0 550 551 552 553 554 555 559 551 552 553 552 553 554 555 556 557 558 559 560 561 553 554 555 559 554 555 556 557 558 559 560 561 562 571 555 556 557 558 559 560 561 556 557 558 559 560 561 557 558 559 558 559 559 560 561 562 563 564 565 568 571 572 573 561 562 571 562 563 564 565 566 567 568 569 570 571 572 573 574 575 563 564 565 566 567 568 569 570 571 572 573 564 565 566 567 568 571 565 566 567 568 571 566 567 568 569 570 571 572 573 567 568 569 570 571 568 569 570 571 569 570 571 572 573 574 575 570 571 572 573 571 572 573 572 573 574 575 576 577 573 574 575 574 575 576 577 578 579 580 575 576 577 576 577 578 579 580 581 582 577 578 579 580 578 579 580 581 582 583 584 579 580 581 582 580 581 582 581 582 583 584 585 586 592 582 583 584 583 584 585 586 587 588 589 592 593 594 584 585 586 592 585 586 587 588 589 590 591 592 593 594 595 596 586 587 588 589 592 593 594 587 588 589 590 591 592 593 594 588 589 590 591 592 589 590 591 592 590 591 592 591 0 593 594 595 596 597 598 613 594 595 596 595 596 597 598 599 600 601 613 614 615 596 597 598 613 597 598 599 600 601 602 611 613 614 615 616 617 598 599 600 601 613 614 615 599 600 601 602 603 604 609 611 612 613 614 615 600 601 602 611 613 601 602 611 613 602 603 604 605 606 609 610 611 612 613 603 604 605 606 607 609 611 612 604 605 606 611 605 606 607 608 609 610 611 606 607 609 607 608 609 610 611 612 608 609 610 611 609 610 611 612 611 612 612 0 614 615 616 617 618 619 623 615 616 617 616 617 618 619 620 621 622 623 624 625 617 618 619 623 618 619 620 621 622 623 624 625 626 627 619 620 621 622 623 624 625 620 621 622 623 624 625 621 622 623 622 623 623 624 625 626 627 628 629 637 625 626 627 626 627 628 629 630 631 632 637 638 639 627 628 629 637 628 629 630 631 632 633 634 637 638 639 629 630 631 632 637 638 639 630 631 632 633 634 635 636 637 638 639 631 632 633 634 637 632 633 634 637 633 634 635 636 637 634 635 636 635 636 636 0 638 639 639 0 %FLAG HBOND_ACOEF %FORMAT(5E16.8) %FLAG HBOND_BCOEF %FORMAT(5E16.8) %FLAG HBCUT %FORMAT(5E16.8) %FLAG AMBER_ATOM_TYPE %FORMAT(20a4) N3 H H H CX HP 3C H1 CT HC HC HC OH HO C O N H CX H1 3C H1 CT HC HC HC OH HO C O N H CX H1 2C H1 H1 S C O N H CX H1 2C H1 H1 S C O N CT H1 H1 CT HC HC CT HC HC CX H1 C O N H CX H1 2C H1 H1 OH HO C O N H CX H1 3C HC CT HC HC HC 2C HC HC CT HC HC HC C O N H CX H1 3C HC CT HC HC HC CT HC HC HC C O N H CX H1 CT HC HC HC C O N H CX H1 C8 HC HC C8 HC HC C8 H1 H1 N2 H CA N2 H H N2 H H C O N H CX H1 2C H1 H1 OH HO C O N H CX H1 2C HC HC C O N H H C O N H CX H1 CT HC HC CA CA HA CA HA CA HA CA HA CA HA C O N H CX H1 2C HC HC C O N H H C O N H CX H1 3C HC CT HC HC HC CT HC HC HC C O N H CX H1 2C H1 H1 S C O N H CX H1 C8 HC HC C8 HC HC C8 H1 H1 N2 H CA N2 H H N2 H H C O N H CX H1 2C HC HC 3C HC CT HC HC HC CT HC HC HC C O N CT H1 H1 CT HC HC CT HC HC CX H1 C O N H CX H1 H1 C O N H CX H1 3C H1 CT HC HC HC OH HO C O N H CX H1 2C H1 H1 OH HO C O N H CX H1 2C HC HC 2C HC HC CO O2 O2 C O N H CX H1 CT HC HC HC C O N H CX H1 3C HC CT HC HC HC 2C HC HC CT HC HC HC C O N H CX H1 2C H1 H1 S C O N H CX H1 CT HC HC HC C O N H CX H1 3C H1 CT HC HC HC OH HO C O N H CX H1 CT HC HC CA CA HA CA HA C OH HO CA HA CA HA C O N H CX H1 3C H1 CT HC HC HC OH HO C O N H CX H1 H1 C O N H CX H1 2C H1 H1 S C O N H CX H1 3C HC CT HC HC HC 2C HC HC CT HC HC HC C O N H CX H1 3C HC CT HC HC HC 2C HC HC CT HC HC HC C O N H CX H1 3C HC CT HC HC HC 2C HC HC CT HC HC HC C O N CT H1 H1 CT HC HC CT HC HC CX H1 C O N H CX H1 H1 C O N H CX H1 CT HC HC HC C O N H CX H1 3C H1 CT HC HC HC OH HO C O N H CX H1 2C H1 H1 S C O N CT H1 H1 CT HC HC CT HC HC CX H1 C O N H CX H1 H1 C O N H CX H1 2C HC HC CO O2 O2 C O N H CX H1 CT HC HC CA CA HA CA HA C OH HO CA HA CA HA C O N H CX H1 CT HC HC HC C O N H CX H1 2C HC HC C O N H H C O2 O2 %FLAG TREE_CHAIN_CLASSIFICATION %FORMAT(20a4) BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA M E M E 3 E 3 E E E S E M E M E M E 3 E E E M E M E M E 3 E E E M E M 3 E E 3 E E B E E M E M E M E M E 3 E E S E M E M E M E 3 E 3 E E E 3 E E 3 E E E M E M E M E 3 E 3 E E E 3 E E E M E M E M E 3 E E E M E M E M E 3 E E 3 E E 3 E E B E B B E E B E E M E M E M E 3 E E S E M E M E M E 3 E E B E B E E M E M E M E 3 E E B B E B E B E S E S E M E M E M E 3 E E B E B E E M E M E M E 3 E 3 E E E 3 E E E M E M E M E 3 E E E M E M E M E 3 E E 3 E E 3 E E B E B B E E B E E M E M E M E 3 E E 3 E 3 E E E 3 E E E M E M 3 E E 3 E E B E E M E M E M E M E E M E M E M E 3 E 3 E E E S E M E M E M E 3 E E S E M E M E M E 3 E E 3 E E B E E M E M E M E 3 E E E M E M E M E 3 E 3 E E E 3 E E 3 E E E M E M E M E 3 E E E M E M E M E 3 E E E M E M E M E 3 E 3 E E E S E M E M E M E 3 E E B B E B E B S E S E S E M E M E M E 3 E 3 E E E S E M E M E M E E M E M E M E 3 E E E M E M E M E 3 E 3 E E E 3 E E 3 E E E M E M E M E 3 E 3 E E E 3 E E 3 E E E M E M E M E 3 E 3 E E E 3 E E 3 E E E M E M 3 E E 3 E E B E E M E M E M E M E E M E M E M E 3 E E E M E M E M E 3 E 3 E E E S E M E M E M E 3 E E E M E M 3 E E 3 E E B E E M E M E M E M E E M E M E M E 3 E E B E E M E M E M E 3 E E B B E B E B S E S E S E M E M E M E 3 E E E M E BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA %FLAG JOIN_ARRAY %FORMAT(10I8) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 %FLAG IROTAT %FORMAT(10I8) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 %FLAG RADIUS_SET %FORMAT(1a80) modified Bondi radii (mbondi) %FLAG RADII %FORMAT(5E16.8) 1.55000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.50000000E+00 8.00000000E-01 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.50000000E+00 8.00000000E-01 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.20000000E+00 1.80000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.20000000E+00 1.80000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.20000000E+00 1.50000000E+00 8.00000000E-01 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.20000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.55000000E+00 1.30000000E+00 1.30000000E+00 1.55000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.20000000E+00 1.50000000E+00 8.00000000E-01 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.20000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.20000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.20000000E+00 1.80000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.55000000E+00 1.30000000E+00 1.30000000E+00 1.55000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.20000000E+00 1.70000000E+00 1.20000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.50000000E+00 8.00000000E-01 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.20000000E+00 1.50000000E+00 8.00000000E-01 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.20000000E+00 1.70000000E+00 1.20000000E+00 1.20000000E+00 1.70000000E+00 1.50000000E+00 1.50000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.20000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.20000000E+00 1.80000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.50000000E+00 8.00000000E-01 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 8.00000000E-01 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.50000000E+00 8.00000000E-01 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.20000000E+00 1.80000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.20000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.20000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.20000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.50000000E+00 8.00000000E-01 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.20000000E+00 1.80000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.20000000E+00 1.70000000E+00 1.50000000E+00 1.50000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 8.00000000E-01 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.70000000E+00 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.20000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00 1.50000000E+00 1.50000000E+00 %FLAG SCREEN %FORMAT(5E16.8) 7.90000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 9.60000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 9.60000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 7.90000000E-01 8.50000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 9.60000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 7.90000000E-01 8.50000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 9.60000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 9.60000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 9.60000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 %FLAG IPOL %FORMAT(1I8) 0 bio3d/inst/examples/1hel.pdb0000644000176200001440000032627314046015221015375 0ustar liggesusersHEADER HYDROLASE(O-GLYCOSYL) 10-JAN-92 1HEL TITLE STRUCTURAL AND THERMODYNAMIC ANALYSIS OF COMPENSATING MUTATIONS WITHIN TITLE 2 THE CORE OF CHICKEN EGG WHITE LYSOZYME COMPND MOL_ID: 1; COMPND 2 MOLECULE: HEN EGG WHITE LYSOZYME; COMPND 3 CHAIN: A; COMPND 4 EC: 3.2.1.17; COMPND 5 ENGINEERED: YES SOURCE MOL_ID: 1; SOURCE 2 ORGANISM_SCIENTIFIC: GALLUS GALLUS; SOURCE 3 ORGANISM_COMMON: CHICKEN; SOURCE 4 ORGANISM_TAXID: 9031; SOURCE 5 ORGAN: EGG KEYWDS HYDROLASE(O-GLYCOSYL) EXPDTA X-RAY DIFFRACTION AUTHOR K.P.WILSON,B.A.MALCOLM,B.W.MATTHEWS REVDAT 3 16-NOV-11 1HEL 1 VERSN HETATM REVDAT 2 24-FEB-09 1HEL 1 VERSN REVDAT 1 31-OCT-93 1HEL 0 JRNL AUTH K.P.WILSON,B.A.MALCOLM,B.W.MATTHEWS JRNL TITL STRUCTURAL AND THERMODYNAMIC ANALYSIS OF COMPENSATING JRNL TITL 2 MUTATIONS WITHIN THE CORE OF CHICKEN EGG WHITE LYSOZYME. JRNL REF J.BIOL.CHEM. V. 267 10842 1992 JRNL REFN ISSN 0021-9258 JRNL PMID 1587860 REMARK 1 REMARK 1 REFERENCE 1 REMARK 1 AUTH B.A.MALCOLM,K.P.WILSON,B.W.MATTHEWS,J.F.KIRSCH,A.C.WILSON REMARK 1 TITL ANCESTRAL LYSOZYMES RECONSTRUCTED, NEUTRALITY TESTED, AND REMARK 1 TITL 2 THERMOSTABILITY LINKED TO HYDROCARBON PACKING REMARK 1 REF NATURE V. 344 86 1990 REMARK 1 REFN ISSN 0028-0836 REMARK 2 REMARK 2 RESOLUTION. 1.70 ANGSTROMS. REMARK 3 REMARK 3 REFINEMENT. REMARK 3 PROGRAM : TNT REMARK 3 AUTHORS : TRONRUD,TEN EYCK,MATTHEWS REMARK 3 REMARK 3 DATA USED IN REFINEMENT. REMARK 3 RESOLUTION RANGE HIGH (ANGSTROMS) : 1.70 REMARK 3 RESOLUTION RANGE LOW (ANGSTROMS) : NULL REMARK 3 DATA CUTOFF (SIGMA(F)) : NULL REMARK 3 COMPLETENESS FOR RANGE (%) : NULL REMARK 3 NUMBER OF REFLECTIONS : NULL REMARK 3 REMARK 3 USING DATA ABOVE SIGMA CUTOFF. REMARK 3 CROSS-VALIDATION METHOD : NULL REMARK 3 FREE R VALUE TEST SET SELECTION : NULL REMARK 3 R VALUE (WORKING + TEST SET) : 0.152 REMARK 3 R VALUE (WORKING SET) : NULL REMARK 3 FREE R VALUE : NULL REMARK 3 FREE R VALUE TEST SET SIZE (%) : NULL REMARK 3 FREE R VALUE TEST SET COUNT : NULL REMARK 3 REMARK 3 USING ALL DATA, NO SIGMA CUTOFF. REMARK 3 R VALUE (WORKING + TEST SET, NO CUTOFF) : NULL REMARK 3 R VALUE (WORKING SET, NO CUTOFF) : NULL REMARK 3 FREE R VALUE (NO CUTOFF) : NULL REMARK 3 FREE R VALUE TEST SET SIZE (%, NO CUTOFF) : NULL REMARK 3 FREE R VALUE TEST SET COUNT (NO CUTOFF) : NULL REMARK 3 TOTAL NUMBER OF REFLECTIONS (NO CUTOFF) : NULL REMARK 3 REMARK 3 NUMBER OF NON-HYDROGEN ATOMS USED IN REFINEMENT. REMARK 3 PROTEIN ATOMS : 1001 REMARK 3 NUCLEIC ACID ATOMS : 0 REMARK 3 HETEROGEN ATOMS : 0 REMARK 3 SOLVENT ATOMS : 185 REMARK 3 REMARK 3 WILSON B VALUE (FROM FCALC, A**2) : NULL REMARK 3 REMARK 3 RMS DEVIATIONS FROM IDEAL VALUES. RMS WEIGHT COUNT REMARK 3 BOND LENGTHS (A) : 0.019 ; NULL ; NULL REMARK 3 BOND ANGLES (DEGREES) : 2.400 ; NULL ; NULL REMARK 3 TORSION ANGLES (DEGREES) : NULL ; NULL ; NULL REMARK 3 PSEUDOROTATION ANGLES (DEGREES) : NULL ; NULL ; NULL REMARK 3 TRIGONAL CARBON PLANES (A) : NULL ; NULL ; NULL REMARK 3 GENERAL PLANES (A) : NULL ; NULL ; NULL REMARK 3 ISOTROPIC THERMAL FACTORS (A**2) : NULL ; NULL ; NULL REMARK 3 NON-BONDED CONTACTS (A) : NULL ; NULL ; NULL REMARK 3 REMARK 3 INCORRECT CHIRAL-CENTERS (COUNT) : NULL REMARK 3 REMARK 3 BULK SOLVENT MODELING. REMARK 3 METHOD USED : NULL REMARK 3 KSOL : NULL REMARK 3 BSOL : NULL REMARK 3 REMARK 3 RESTRAINT LIBRARIES. REMARK 3 STEREOCHEMISTRY : NULL REMARK 3 ISOTROPIC THERMAL FACTOR RESTRAINTS : NULL REMARK 3 REMARK 3 OTHER REFINEMENT REMARKS: NULL REMARK 4 REMARK 4 1HEL COMPLIES WITH FORMAT V. 3.15, 01-DEC-08 REMARK 100 REMARK 100 THIS ENTRY HAS BEEN PROCESSED BY BNL. REMARK 200 REMARK 200 EXPERIMENTAL DETAILS REMARK 200 EXPERIMENT TYPE : X-RAY DIFFRACTION REMARK 200 DATE OF DATA COLLECTION : NULL REMARK 200 TEMPERATURE (KELVIN) : NULL REMARK 200 PH : NULL REMARK 200 NUMBER OF CRYSTALS USED : NULL REMARK 200 REMARK 200 SYNCHROTRON (Y/N) : NULL REMARK 200 RADIATION SOURCE : NULL REMARK 200 BEAMLINE : NULL REMARK 200 X-RAY GENERATOR MODEL : NULL REMARK 200 MONOCHROMATIC OR LAUE (M/L) : NULL REMARK 200 WAVELENGTH OR RANGE (A) : NULL REMARK 200 MONOCHROMATOR : NULL REMARK 200 OPTICS : NULL REMARK 200 REMARK 200 DETECTOR TYPE : NULL REMARK 200 DETECTOR MANUFACTURER : NULL REMARK 200 INTENSITY-INTEGRATION SOFTWARE : NULL REMARK 200 DATA SCALING SOFTWARE : NULL REMARK 200 REMARK 200 NUMBER OF UNIQUE REFLECTIONS : NULL REMARK 200 RESOLUTION RANGE HIGH (A) : NULL REMARK 200 RESOLUTION RANGE LOW (A) : NULL REMARK 200 REJECTION CRITERIA (SIGMA(I)) : NULL REMARK 200 REMARK 200 OVERALL. REMARK 200 COMPLETENESS FOR RANGE (%) : NULL REMARK 200 DATA REDUNDANCY : NULL REMARK 200 R MERGE (I) : NULL REMARK 200 R SYM (I) : NULL REMARK 200 FOR THE DATA SET : NULL REMARK 200 REMARK 200 IN THE HIGHEST RESOLUTION SHELL. REMARK 200 HIGHEST RESOLUTION SHELL, RANGE HIGH (A) : NULL REMARK 200 HIGHEST RESOLUTION SHELL, RANGE LOW (A) : NULL REMARK 200 COMPLETENESS FOR SHELL (%) : NULL REMARK 200 DATA REDUNDANCY IN SHELL : NULL REMARK 200 R MERGE FOR SHELL (I) : NULL REMARK 200 R SYM FOR SHELL (I) : NULL REMARK 200 FOR SHELL : NULL REMARK 200 REMARK 200 DIFFRACTION PROTOCOL: NULL REMARK 200 METHOD USED TO DETERMINE THE STRUCTURE: NULL REMARK 200 SOFTWARE USED: NULL REMARK 200 STARTING MODEL: NULL REMARK 200 REMARK 200 REMARK: NULL REMARK 280 REMARK 280 CRYSTAL REMARK 280 SOLVENT CONTENT, VS (%): 40.52 REMARK 280 MATTHEWS COEFFICIENT, VM (ANGSTROMS**3/DA): 2.07 REMARK 280 REMARK 280 CRYSTALLIZATION CONDITIONS: NULL REMARK 290 REMARK 290 CRYSTALLOGRAPHIC SYMMETRY REMARK 290 SYMMETRY OPERATORS FOR SPACE GROUP: P 43 21 2 REMARK 290 REMARK 290 SYMOP SYMMETRY REMARK 290 NNNMMM OPERATOR REMARK 290 1555 X,Y,Z REMARK 290 2555 -X,-Y,Z+1/2 REMARK 290 3555 -Y+1/2,X+1/2,Z+3/4 REMARK 290 4555 Y+1/2,-X+1/2,Z+1/4 REMARK 290 5555 -X+1/2,Y+1/2,-Z+3/4 REMARK 290 6555 X+1/2,-Y+1/2,-Z+1/4 REMARK 290 7555 Y,X,-Z REMARK 290 8555 -Y,-X,-Z+1/2 REMARK 290 REMARK 290 WHERE NNN -> OPERATOR NUMBER REMARK 290 MMM -> TRANSLATION VECTOR REMARK 290 REMARK 290 CRYSTALLOGRAPHIC SYMMETRY TRANSFORMATIONS REMARK 290 THE FOLLOWING TRANSFORMATIONS OPERATE ON THE ATOM/HETATM REMARK 290 RECORDS IN THIS ENTRY TO PRODUCE CRYSTALLOGRAPHICALLY REMARK 290 RELATED MOLECULES. REMARK 290 SMTRY1 1 1.000000 0.000000 0.000000 0.00000 REMARK 290 SMTRY2 1 0.000000 1.000000 0.000000 0.00000 REMARK 290 SMTRY3 1 0.000000 0.000000 1.000000 0.00000 REMARK 290 SMTRY1 2 -1.000000 0.000000 0.000000 0.00000 REMARK 290 SMTRY2 2 0.000000 -1.000000 0.000000 0.00000 REMARK 290 SMTRY3 2 0.000000 0.000000 1.000000 18.95000 REMARK 290 SMTRY1 3 0.000000 -1.000000 0.000000 39.55000 REMARK 290 SMTRY2 3 1.000000 0.000000 0.000000 39.55000 REMARK 290 SMTRY3 3 0.000000 0.000000 1.000000 28.42500 REMARK 290 SMTRY1 4 0.000000 1.000000 0.000000 39.55000 REMARK 290 SMTRY2 4 -1.000000 0.000000 0.000000 39.55000 REMARK 290 SMTRY3 4 0.000000 0.000000 1.000000 9.47500 REMARK 290 SMTRY1 5 -1.000000 0.000000 0.000000 39.55000 REMARK 290 SMTRY2 5 0.000000 1.000000 0.000000 39.55000 REMARK 290 SMTRY3 5 0.000000 0.000000 -1.000000 28.42500 REMARK 290 SMTRY1 6 1.000000 0.000000 0.000000 39.55000 REMARK 290 SMTRY2 6 0.000000 -1.000000 0.000000 39.55000 REMARK 290 SMTRY3 6 0.000000 0.000000 -1.000000 9.47500 REMARK 290 SMTRY1 7 0.000000 1.000000 0.000000 0.00000 REMARK 290 SMTRY2 7 1.000000 0.000000 0.000000 0.00000 REMARK 290 SMTRY3 7 0.000000 0.000000 -1.000000 0.00000 REMARK 290 SMTRY1 8 0.000000 -1.000000 0.000000 0.00000 REMARK 290 SMTRY2 8 -1.000000 0.000000 0.000000 0.00000 REMARK 290 SMTRY3 8 0.000000 0.000000 -1.000000 18.95000 REMARK 290 REMARK 290 REMARK: NULL REMARK 300 REMARK 300 BIOMOLECULE: 1 REMARK 300 SEE REMARK 350 FOR THE AUTHOR PROVIDED AND/OR PROGRAM REMARK 300 GENERATED ASSEMBLY INFORMATION FOR THE STRUCTURE IN REMARK 300 THIS ENTRY. THE REMARK MAY ALSO PROVIDE INFORMATION ON REMARK 300 BURIED SURFACE AREA. REMARK 350 REMARK 350 COORDINATES FOR A COMPLETE MULTIMER REPRESENTING THE KNOWN REMARK 350 BIOLOGICALLY SIGNIFICANT OLIGOMERIZATION STATE OF THE REMARK 350 MOLECULE CAN BE GENERATED BY APPLYING BIOMT TRANSFORMATIONS REMARK 350 GIVEN BELOW. BOTH NON-CRYSTALLOGRAPHIC AND REMARK 350 CRYSTALLOGRAPHIC OPERATIONS ARE GIVEN. REMARK 350 REMARK 350 BIOMOLECULE: 1 REMARK 350 AUTHOR DETERMINED BIOLOGICAL UNIT: MONOMERIC REMARK 350 APPLY THE FOLLOWING TO CHAINS: A REMARK 350 BIOMT1 1 1.000000 0.000000 0.000000 0.00000 REMARK 350 BIOMT2 1 0.000000 1.000000 0.000000 0.00000 REMARK 350 BIOMT3 1 0.000000 0.000000 1.000000 0.00000 REMARK 375 REMARK 375 SPECIAL POSITION REMARK 375 THE FOLLOWING ATOMS ARE FOUND TO BE WITHIN 0.15 ANGSTROMS REMARK 375 OF A SYMMETRY RELATED ATOM AND ARE ASSUMED TO BE ON SPECIAL REMARK 375 POSITIONS. REMARK 375 REMARK 375 ATOM RES CSSEQI REMARK 375 HOH A 318 LIES ON A SPECIAL POSITION. REMARK 500 REMARK 500 GEOMETRY AND STEREOCHEMISTRY REMARK 500 SUBTOPIC: CLOSE CONTACTS REMARK 500 REMARK 500 THE FOLLOWING ATOMS THAT ARE RELATED BY CRYSTALLOGRAPHIC REMARK 500 SYMMETRY ARE IN CLOSE CONTACT. AN ATOM LOCATED WITHIN 0.15 REMARK 500 ANGSTROMS OF A SYMMETRY RELATED ATOM IS ASSUMED TO BE ON A REMARK 500 SPECIAL POSITION AND IS, THEREFORE, LISTED IN REMARK 375 REMARK 500 INSTEAD OF REMARK 500. ATOMS WITH NON-BLANK ALTERNATE REMARK 500 LOCATION INDICATORS ARE NOT INCLUDED IN THE CALCULATIONS. REMARK 500 REMARK 500 DISTANCE CUTOFF: REMARK 500 2.2 ANGSTROMS FOR CONTACTS NOT INVOLVING HYDROGEN ATOMS REMARK 500 1.6 ANGSTROMS FOR CONTACTS INVOLVING HYDROGEN ATOMS REMARK 500 REMARK 500 ATM1 RES C SSEQI ATM2 RES C SSEQI SSYMOP DISTANCE REMARK 500 O HOH A 275 O HOH A 275 8555 0.35 REMARK 500 O HOH A 203 O HOH A 203 7556 1.38 REMARK 500 REMARK 500 REMARK: NULL REMARK 500 REMARK 500 GEOMETRY AND STEREOCHEMISTRY REMARK 500 SUBTOPIC: COVALENT BOND ANGLES REMARK 500 REMARK 500 THE STEREOCHEMICAL PARAMETERS OF THE FOLLOWING RESIDUES REMARK 500 HAVE VALUES WHICH DEVIATE FROM EXPECTED VALUES BY MORE REMARK 500 THAN 6*RMSD (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN REMARK 500 IDENTIFIER; SSEQ=SEQUENCE NUMBER; I=INSERTION CODE). REMARK 500 REMARK 500 STANDARD TABLE: REMARK 500 FORMAT: (10X,I3,1X,A3,1X,A1,I4,A1,3(1X,A4,2X),12X,F5.1) REMARK 500 REMARK 500 EXPECTED VALUES PROTEIN: ENGH AND HUBER, 1999 REMARK 500 EXPECTED VALUES NUCLEIC ACID: CLOWNEY ET AL 1996 REMARK 500 REMARK 500 M RES CSSEQI ATM1 ATM2 ATM3 REMARK 500 ARG A 5 NE - CZ - NH1 ANGL. DEV. = 4.8 DEGREES REMARK 500 ARG A 14 NE - CZ - NH1 ANGL. DEV. = 3.3 DEGREES REMARK 500 ASP A 18 CB - CG - OD1 ANGL. DEV. = 8.7 DEGREES REMARK 500 ASP A 18 CB - CG - OD2 ANGL. DEV. = -8.1 DEGREES REMARK 500 ARG A 45 NE - CZ - NH1 ANGL. DEV. = 3.3 DEGREES REMARK 500 ASP A 52 CB - CG - OD1 ANGL. DEV. = 5.5 DEGREES REMARK 500 ARG A 61 NE - CZ - NH1 ANGL. DEV. = 3.6 DEGREES REMARK 500 ARG A 73 NE - CZ - NH1 ANGL. DEV. = 3.3 DEGREES REMARK 500 ASP A 87 CB - CG - OD1 ANGL. DEV. = 5.6 DEGREES REMARK 500 ASP A 119 CB - CG - OD2 ANGL. DEV. = -5.6 DEGREES REMARK 500 ARG A 128 NE - CZ - NH1 ANGL. DEV. = 3.7 DEGREES REMARK 500 REMARK 500 REMARK: NULL REMARK 500 REMARK 500 GEOMETRY AND STEREOCHEMISTRY REMARK 500 SUBTOPIC: TORSION ANGLES REMARK 500 REMARK 500 TORSION ANGLES OUTSIDE THE EXPECTED RAMACHANDRAN REGIONS: REMARK 500 (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN IDENTIFIER; REMARK 500 SSEQ=SEQUENCE NUMBER; I=INSERTION CODE). REMARK 500 REMARK 500 STANDARD TABLE: REMARK 500 FORMAT:(10X,I3,1X,A3,1X,A1,I4,A1,4X,F7.2,3X,F7.2) REMARK 500 REMARK 500 EXPECTED VALUES: GJ KLEYWEGT AND TA JONES (1996). PHI/PSI- REMARK 500 CHOLOGY: RAMACHANDRAN REVISITED. STRUCTURE 4, 1395 - 1400 REMARK 500 REMARK 500 M RES CSSEQI PSI PHI REMARK 500 ARG A 68 19.50 -141.12 REMARK 500 REMARK 500 REMARK: NULL REMARK 525 REMARK 525 SOLVENT REMARK 525 REMARK 525 THE SOLVENT MOLECULES HAVE CHAIN IDENTIFIERS THAT REMARK 525 INDICATE THE POLYMER CHAIN WITH WHICH THEY ARE MOST REMARK 525 CLOSELY ASSOCIATED. THE REMARK LISTS ALL THE SOLVENT REMARK 525 MOLECULES WHICH ARE MORE THAN 5A AWAY FROM THE REMARK 525 NEAREST POLYMER CHAIN (M = MODEL NUMBER; REMARK 525 RES=RESIDUE NAME; C=CHAIN IDENTIFIER; SSEQ=SEQUENCE REMARK 525 NUMBER; I=INSERTION CODE): REMARK 525 REMARK 525 M RES CSSEQI REMARK 525 HOH A 188 DISTANCE = 6.89 ANGSTROMS REMARK 525 HOH A 189 DISTANCE = 6.32 ANGSTROMS REMARK 525 HOH A 190 DISTANCE = 5.68 ANGSTROMS REMARK 525 HOH A 228 DISTANCE = 6.51 ANGSTROMS REMARK 525 HOH A 230 DISTANCE = 5.30 ANGSTROMS REMARK 525 HOH A 243 DISTANCE = 5.19 ANGSTROMS REMARK 525 HOH A 249 DISTANCE = 6.99 ANGSTROMS REMARK 525 HOH A 258 DISTANCE = 6.92 ANGSTROMS REMARK 525 HOH A 268 DISTANCE = 8.36 ANGSTROMS REMARK 525 HOH A 278 DISTANCE = 6.81 ANGSTROMS REMARK 525 HOH A 304 DISTANCE = 7.48 ANGSTROMS REMARK 525 HOH A 305 DISTANCE = 6.21 ANGSTROMS REMARK 525 HOH A 308 DISTANCE = 19.71 ANGSTROMS DBREF 1HEL A 1 129 UNP P00698 LYSC_CHICK 19 147 SEQRES 1 A 129 LYS VAL PHE GLY ARG CYS GLU LEU ALA ALA ALA MET LYS SEQRES 2 A 129 ARG HIS GLY LEU ASP ASN TYR ARG GLY TYR SER LEU GLY SEQRES 3 A 129 ASN TRP VAL CYS ALA ALA LYS PHE GLU SER ASN PHE ASN SEQRES 4 A 129 THR GLN ALA THR ASN ARG ASN THR ASP GLY SER THR ASP SEQRES 5 A 129 TYR GLY ILE LEU GLN ILE ASN SER ARG TRP TRP CYS ASN SEQRES 6 A 129 ASP GLY ARG THR PRO GLY SER ARG ASN LEU CYS ASN ILE SEQRES 7 A 129 PRO CYS SER ALA LEU LEU SER SER ASP ILE THR ALA SER SEQRES 8 A 129 VAL ASN CYS ALA LYS LYS ILE VAL SER ASP GLY ASN GLY SEQRES 9 A 129 MET ASN ALA TRP VAL ALA TRP ARG ASN ARG CYS LYS GLY SEQRES 10 A 129 THR ASP VAL GLN ALA TRP ILE ARG GLY CYS ARG LEU FORMUL 2 HOH *185(H2 O) HELIX 1 H1 GLY A 4 GLY A 16 1 13 HELIX 2 H2 LEU A 25 PHE A 34 1 10 HELIX 3 H3 PRO A 79 LEU A 84 5 6 HELIX 4 H4 ILE A 88 SER A 100 1 13 HELIX 5 H5 GLY A 104 TRP A 108 5 5 HELIX 6 H6 VAL A 109 ARG A 114 1 6 HELIX 7 H7 VAL A 120 ILE A 124 5 5 SHEET 1 S1 3 ALA A 42 ASN A 46 0 SHEET 2 S1 3 GLY A 49 GLY A 54 -1 O SER A 50 N ASN A 46 SHEET 3 S1 3 LEU A 56 SER A 60 -1 O SER A 60 N THR A 51 SSBOND 1 CYS A 6 CYS A 127 1555 1555 1.99 SSBOND 2 CYS A 30 CYS A 115 1555 1555 2.11 SSBOND 3 CYS A 64 CYS A 80 1555 1555 2.00 SSBOND 4 CYS A 76 CYS A 94 1555 1555 2.10 CRYST1 79.100 79.100 37.900 90.00 90.00 90.00 P 43 21 2 8 ORIGX1 1.000000 0.000000 0.000000 0.00000 ORIGX2 0.000000 1.000000 0.000000 0.00000 ORIGX3 0.000000 0.000000 1.000000 0.00000 SCALE1 0.012642 0.000000 0.000000 0.00000 SCALE2 0.000000 0.012642 0.000000 0.00000 SCALE3 0.000000 0.000000 0.026385 0.00000 ATOM 1 N LYS A 1 3.294 10.164 10.266 1.00 11.18 N ATOM 2 CA LYS A 1 2.388 10.533 9.168 1.00 9.68 C ATOM 3 C LYS A 1 2.438 12.049 8.889 1.00 14.00 C ATOM 4 O LYS A 1 2.406 12.898 9.815 1.00 14.00 O ATOM 5 CB LYS A 1 0.949 10.101 9.559 1.00 13.29 C ATOM 6 CG LYS A 1 -0.050 10.621 8.573 1.00 13.52 C ATOM 7 CD LYS A 1 -1.425 10.081 8.720 1.00 22.15 C ATOM 8 CE LYS A 1 -2.370 10.773 7.722 1.00 20.23 C ATOM 9 NZ LYS A 1 -3.776 10.439 7.933 1.00 68.72 N ATOM 10 N VAL A 2 2.552 12.428 7.626 1.00 10.17 N ATOM 11 CA VAL A 2 2.524 13.840 7.282 1.00 10.02 C ATOM 12 C VAL A 2 1.120 14.180 6.770 1.00 27.84 C ATOM 13 O VAL A 2 0.737 13.798 5.675 1.00 22.87 O ATOM 14 CB VAL A 2 3.529 14.264 6.240 1.00 9.00 C ATOM 15 CG1 VAL A 2 3.313 15.765 5.983 1.00 11.37 C ATOM 16 CG2 VAL A 2 4.928 14.016 6.810 1.00 10.57 C ATOM 17 N PHE A 3 0.333 14.851 7.573 1.00 16.35 N ATOM 18 CA PHE A 3 -1.021 15.173 7.169 1.00 15.34 C ATOM 19 C PHE A 3 -1.097 16.285 6.126 1.00 14.79 C ATOM 20 O PHE A 3 -0.261 17.203 6.054 1.00 14.99 O ATOM 21 CB PHE A 3 -1.867 15.710 8.361 1.00 14.03 C ATOM 22 CG PHE A 3 -2.412 14.638 9.295 1.00 16.41 C ATOM 23 CD1 PHE A 3 -1.575 14.049 10.240 1.00 14.44 C ATOM 24 CD2 PHE A 3 -3.757 14.285 9.274 1.00 18.12 C ATOM 25 CE1 PHE A 3 -2.065 13.116 11.135 1.00 11.11 C ATOM 26 CE2 PHE A 3 -4.263 13.332 10.178 1.00 32.24 C ATOM 27 CZ PHE A 3 -3.413 12.758 11.132 1.00 14.31 C ATOM 28 N GLY A 4 -2.229 16.228 5.393 1.00 15.47 N ATOM 29 CA GLY A 4 -2.645 17.273 4.511 1.00 13.97 C ATOM 30 C GLY A 4 -3.456 18.261 5.350 1.00 10.95 C ATOM 31 O GLY A 4 -4.070 17.876 6.282 1.00 16.45 O ATOM 32 N ARG A 5 -3.414 19.518 5.009 1.00 14.28 N ATOM 33 CA ARG A 5 -4.106 20.560 5.674 1.00 11.63 C ATOM 34 C ARG A 5 -5.540 20.226 5.992 1.00 21.37 C ATOM 35 O ARG A 5 -5.963 20.258 7.138 1.00 9.74 O ATOM 36 CB ARG A 5 -3.952 21.857 4.900 1.00 13.31 C ATOM 37 CG ARG A 5 -4.508 23.053 5.610 1.00 13.02 C ATOM 38 CD ARG A 5 -4.414 24.335 4.775 1.00 19.72 C ATOM 39 NE ARG A 5 -5.013 24.223 3.447 1.00 23.52 N ATOM 40 CZ ARG A 5 -6.287 24.522 3.048 1.00 40.17 C ATOM 41 NH1 ARG A 5 -7.248 25.009 3.841 1.00 17.54 N ATOM 42 NH2 ARG A 5 -6.619 24.303 1.767 1.00 33.21 N ATOM 43 N CYS A 6 -6.327 19.866 4.967 1.00 15.04 N ATOM 44 CA CYS A 6 -7.767 19.572 5.189 1.00 12.93 C ATOM 45 C CYS A 6 -7.997 18.269 5.916 1.00 5.10 C ATOM 46 O CYS A 6 -8.992 18.125 6.630 1.00 13.60 O ATOM 47 CB CYS A 6 -8.607 19.637 3.859 1.00 16.72 C ATOM 48 SG CYS A 6 -8.669 21.273 3.104 1.00 16.68 S ATOM 49 N GLU A 7 -7.142 17.274 5.653 1.00 7.34 N ATOM 50 CA GLU A 7 -7.309 15.981 6.323 1.00 10.86 C ATOM 51 C GLU A 7 -7.129 16.181 7.848 1.00 17.71 C ATOM 52 O GLU A 7 -7.835 15.638 8.657 1.00 14.19 O ATOM 53 CB GLU A 7 -6.187 15.048 5.880 1.00 16.19 C ATOM 54 CG GLU A 7 -6.206 13.614 6.496 1.00 16.67 C ATOM 55 CD GLU A 7 -4.952 12.864 6.030 1.00 32.91 C ATOM 56 OE1 GLU A 7 -4.003 13.411 5.480 1.00 18.18 O ATOM 57 OE2 GLU A 7 -4.992 11.578 6.219 1.00 28.07 O ATOM 58 N LEU A 8 -6.148 16.987 8.221 1.00 14.04 N ATOM 59 CA LEU A 8 -5.919 17.285 9.637 1.00 8.65 C ATOM 60 C LEU A 8 -7.068 18.103 10.254 1.00 10.08 C ATOM 61 O LEU A 8 -7.500 17.827 11.353 1.00 15.66 O ATOM 62 CB LEU A 8 -4.607 18.084 9.809 1.00 14.88 C ATOM 63 CG LEU A 8 -4.384 18.432 11.299 1.00 12.61 C ATOM 64 CD1 LEU A 8 -4.110 17.104 12.053 1.00 12.51 C ATOM 65 CD2 LEU A 8 -3.147 19.299 11.372 1.00 13.98 C ATOM 66 N ALA A 9 -7.524 19.122 9.561 1.00 11.92 N ATOM 67 CA ALA A 9 -8.664 19.896 9.982 1.00 10.97 C ATOM 68 C ALA A 9 -9.841 18.971 10.304 1.00 15.73 C ATOM 69 O ALA A 9 -10.469 19.046 11.359 1.00 13.41 O ATOM 70 CB ALA A 9 -9.039 21.012 8.954 1.00 8.88 C ATOM 71 N ALA A 10 -10.124 18.049 9.425 1.00 12.11 N ATOM 72 CA ALA A 10 -11.262 17.129 9.595 1.00 12.19 C ATOM 73 C ALA A 10 -11.034 16.206 10.780 1.00 18.02 C ATOM 74 O ALA A 10 -11.932 15.902 11.522 1.00 17.70 O ATOM 75 CB ALA A 10 -11.457 16.297 8.313 1.00 14.75 C ATOM 76 N ALA A 11 -9.815 15.771 10.988 1.00 14.94 N ATOM 77 CA ALA A 11 -9.544 14.908 12.136 1.00 12.19 C ATOM 78 C ALA A 11 -9.651 15.641 13.494 1.00 7.51 C ATOM 79 O ALA A 11 -10.088 15.066 14.457 1.00 12.99 O ATOM 80 CB ALA A 11 -8.153 14.250 12.041 1.00 15.76 C ATOM 81 N MET A 12 -9.107 16.884 13.529 1.00 10.71 N ATOM 82 CA MET A 12 -9.160 17.683 14.710 1.00 12.27 C ATOM 83 C MET A 12 -10.599 17.988 15.028 1.00 16.76 C ATOM 84 O MET A 12 -10.964 17.966 16.195 1.00 17.43 O ATOM 85 CB MET A 12 -8.385 18.996 14.563 1.00 6.96 C ATOM 86 CG MET A 12 -6.872 18.717 14.593 1.00 7.53 C ATOM 87 SD MET A 12 -5.971 20.286 14.351 1.00 16.25 S ATOM 88 CE MET A 12 -4.392 19.972 15.137 1.00 11.48 C ATOM 89 N LYS A 13 -11.421 18.239 13.985 1.00 11.66 N ATOM 90 CA LYS A 13 -12.844 18.554 14.146 1.00 12.77 C ATOM 91 C LYS A 13 -13.552 17.402 14.762 1.00 17.21 C ATOM 92 O LYS A 13 -14.278 17.533 15.704 1.00 15.75 O ATOM 93 CB LYS A 13 -13.505 18.908 12.852 1.00 14.38 C ATOM 94 CG LYS A 13 -14.874 19.457 13.096 1.00 16.88 C ATOM 95 CD LYS A 13 -15.519 20.062 11.867 1.00 19.73 C ATOM 96 CE LYS A 13 -17.062 20.060 11.971 1.00 41.06 C ATOM 97 NZ LYS A 13 -17.725 20.836 10.899 1.00 61.80 N ATOM 98 N ARG A 14 -13.273 16.240 14.220 1.00 21.68 N ATOM 99 CA ARG A 14 -13.878 15.021 14.667 1.00 17.17 C ATOM 100 C ARG A 14 -13.480 14.746 16.099 1.00 27.88 C ATOM 101 O ARG A 14 -14.217 14.129 16.823 1.00 17.70 O ATOM 102 CB ARG A 14 -13.448 13.876 13.756 1.00 23.48 C ATOM 103 CG ARG A 14 -14.102 12.553 14.162 1.00 51.76 C ATOM 104 CD ARG A 14 -13.875 11.424 13.160 1.00 52.15 C ATOM 105 NE ARG A 14 -12.616 10.730 13.354 1.00 61.79 N ATOM 106 CZ ARG A 14 -12.406 9.681 14.156 1.00 47.00 C ATOM 107 NH1 ARG A 14 -13.357 9.121 14.898 1.00 35.04 N ATOM 108 NH2 ARG A 14 -11.177 9.169 14.196 1.00 55.70 N ATOM 109 N HIS A 15 -12.300 15.219 16.498 1.00 20.13 N ATOM 110 CA HIS A 15 -11.791 15.016 17.846 1.00 14.58 C ATOM 111 C HIS A 15 -12.221 16.074 18.888 1.00 18.83 C ATOM 112 O HIS A 15 -11.689 16.060 19.970 1.00 22.76 O ATOM 113 CB HIS A 15 -10.268 14.799 17.851 1.00 23.09 C ATOM 114 CG HIS A 15 -9.906 13.364 17.563 1.00 21.53 C ATOM 115 ND1 HIS A 15 -9.721 12.896 16.256 1.00 28.28 N ATOM 116 CD2 HIS A 15 -9.723 12.308 18.413 1.00 30.99 C ATOM 117 CE1 HIS A 15 -9.422 11.580 16.350 1.00 20.50 C ATOM 118 NE2 HIS A 15 -9.412 11.213 17.627 1.00 42.34 N ATOM 119 N GLY A 16 -13.146 16.952 18.551 1.00 14.90 N ATOM 120 CA GLY A 16 -13.687 17.956 19.401 1.00 16.84 C ATOM 121 C GLY A 16 -12.871 19.227 19.554 1.00 23.06 C ATOM 122 O GLY A 16 -13.121 20.016 20.460 1.00 19.24 O ATOM 123 N LEU A 17 -11.922 19.491 18.685 1.00 14.25 N ATOM 124 CA LEU A 17 -11.134 20.695 18.826 1.00 10.83 C ATOM 125 C LEU A 17 -11.728 21.961 18.295 1.00 16.61 C ATOM 126 O LEU A 17 -11.276 23.016 18.657 1.00 18.63 O ATOM 127 CB LEU A 17 -9.749 20.538 18.218 1.00 14.80 C ATOM 128 CG LEU A 17 -8.792 19.745 19.031 1.00 19.84 C ATOM 129 CD1 LEU A 17 -7.483 19.876 18.293 1.00 22.16 C ATOM 130 CD2 LEU A 17 -8.675 20.282 20.474 1.00 15.82 C ATOM 131 N ASP A 18 -12.704 21.930 17.405 1.00 18.32 N ATOM 132 CA ASP A 18 -13.261 23.178 16.884 1.00 18.68 C ATOM 133 C ASP A 18 -13.986 23.912 17.979 1.00 19.05 C ATOM 134 O ASP A 18 -14.952 23.375 18.512 1.00 21.74 O ATOM 135 CB ASP A 18 -14.275 23.002 15.717 1.00 25.90 C ATOM 136 CG ASP A 18 -14.712 24.288 15.010 1.00 37.66 C ATOM 137 OD1 ASP A 18 -14.134 25.393 15.038 1.00 26.98 O ATOM 138 OD2 ASP A 18 -15.751 24.055 14.248 1.00 63.41 O ATOM 139 N ASN A 19 -13.542 25.130 18.229 1.00 12.22 N ATOM 140 CA ASN A 19 -14.046 26.010 19.253 1.00 9.99 C ATOM 141 C ASN A 19 -13.851 25.507 20.671 1.00 15.97 C ATOM 142 O ASN A 19 -14.534 25.975 21.595 1.00 18.10 O ATOM 143 CB ASN A 19 -15.518 26.259 19.032 1.00 20.32 C ATOM 144 CG ASN A 19 -15.706 27.052 17.774 1.00 40.03 C ATOM 145 OD1 ASN A 19 -15.227 28.183 17.693 1.00 57.25 O ATOM 146 ND2 ASN A 19 -16.402 26.456 16.811 1.00 40.09 N ATOM 147 N TYR A 20 -12.956 24.552 20.827 1.00 12.49 N ATOM 148 CA TYR A 20 -12.652 24.027 22.106 1.00 8.91 C ATOM 149 C TYR A 20 -12.037 25.159 22.929 1.00 19.06 C ATOM 150 O TYR A 20 -10.978 25.687 22.602 1.00 16.99 O ATOM 151 CB TYR A 20 -11.717 22.810 22.005 1.00 17.23 C ATOM 152 CG TYR A 20 -11.532 22.151 23.355 1.00 13.76 C ATOM 153 CD1 TYR A 20 -12.444 21.206 23.832 1.00 17.40 C ATOM 154 CD2 TYR A 20 -10.475 22.556 24.184 1.00 24.53 C ATOM 155 CE1 TYR A 20 -12.311 20.657 25.111 1.00 20.84 C ATOM 156 CE2 TYR A 20 -10.331 22.023 25.461 1.00 16.26 C ATOM 157 CZ TYR A 20 -11.259 21.078 25.922 1.00 35.41 C ATOM 158 OH TYR A 20 -11.104 20.560 27.183 1.00 29.68 O ATOM 159 N ARG A 21 -12.721 25.593 23.977 1.00 19.00 N ATOM 160 CA ARG A 21 -12.250 26.715 24.791 1.00 15.05 C ATOM 161 C ARG A 21 -12.264 27.987 24.017 1.00 8.63 C ATOM 162 O ARG A 21 -11.450 28.877 24.295 1.00 13.69 O ATOM 163 CB ARG A 21 -10.847 26.601 25.387 1.00 18.33 C ATOM 164 CG ARG A 21 -10.694 25.514 26.442 1.00 27.37 C ATOM 165 CD ARG A 21 -11.577 25.864 27.598 1.00 40.81 C ATOM 166 NE ARG A 21 -11.597 24.902 28.676 1.00 57.85 N ATOM 167 CZ ARG A 21 -11.253 25.330 29.884 1.00 97.15 C ATOM 168 NH1 ARG A 21 -10.859 26.593 30.049 1.00 63.15 N ATOM 169 NH2 ARG A 21 -11.283 24.508 30.937 1.00 68.08 N ATOM 170 N GLY A 22 -13.173 28.076 23.045 1.00 11.97 N ATOM 171 CA GLY A 22 -13.290 29.312 22.253 1.00 13.56 C ATOM 172 C GLY A 22 -12.276 29.499 21.125 1.00 15.57 C ATOM 173 O GLY A 22 -12.274 30.537 20.508 1.00 15.13 O ATOM 174 N TYR A 23 -11.414 28.511 20.863 1.00 17.25 N ATOM 175 CA TYR A 23 -10.419 28.584 19.787 1.00 12.17 C ATOM 176 C TYR A 23 -10.964 27.832 18.564 1.00 7.69 C ATOM 177 O TYR A 23 -11.097 26.573 18.581 1.00 8.57 O ATOM 178 CB TYR A 23 -9.059 27.910 20.217 1.00 11.16 C ATOM 179 CG TYR A 23 -8.358 28.702 21.299 1.00 14.01 C ATOM 180 CD1 TYR A 23 -7.560 29.766 20.910 1.00 10.23 C ATOM 181 CD2 TYR A 23 -8.534 28.427 22.652 1.00 6.77 C ATOM 182 CE1 TYR A 23 -6.879 30.557 21.846 1.00 9.23 C ATOM 183 CE2 TYR A 23 -7.907 29.219 23.612 1.00 10.96 C ATOM 184 CZ TYR A 23 -7.061 30.276 23.207 1.00 12.99 C ATOM 185 OH TYR A 23 -6.411 31.069 24.111 1.00 13.78 O ATOM 186 N SER A 24 -11.219 28.590 17.517 1.00 12.88 N ATOM 187 CA SER A 24 -11.730 28.032 16.253 1.00 14.99 C ATOM 188 C SER A 24 -10.726 27.075 15.616 1.00 20.42 C ATOM 189 O SER A 24 -9.487 27.191 15.841 1.00 9.73 O ATOM 190 CB SER A 24 -12.060 29.179 15.305 1.00 9.90 C ATOM 191 OG SER A 24 -10.830 29.750 14.853 1.00 17.68 O ATOM 192 N LEU A 25 -11.267 26.110 14.822 1.00 16.10 N ATOM 193 CA LEU A 25 -10.460 25.111 14.092 1.00 11.40 C ATOM 194 C LEU A 25 -9.205 25.683 13.438 1.00 11.44 C ATOM 195 O LEU A 25 -8.145 25.073 13.536 1.00 10.56 O ATOM 196 CB LEU A 25 -11.293 24.412 12.993 1.00 13.62 C ATOM 197 CG LEU A 25 -10.826 23.089 12.491 1.00 16.00 C ATOM 198 CD1 LEU A 25 -10.359 22.212 13.644 1.00 15.17 C ATOM 199 CD2 LEU A 25 -12.018 22.437 11.805 1.00 15.75 C ATOM 200 N GLY A 26 -9.311 26.836 12.758 1.00 10.18 N ATOM 201 CA GLY A 26 -8.169 27.388 12.084 1.00 7.13 C ATOM 202 C GLY A 26 -6.984 27.643 12.997 1.00 9.12 C ATOM 203 O GLY A 26 -5.854 27.610 12.555 1.00 12.61 O ATOM 204 N ASN A 27 -7.232 27.928 14.280 1.00 10.01 N ATOM 205 CA ASN A 27 -6.132 28.159 15.255 1.00 10.13 C ATOM 206 C ASN A 27 -5.317 26.889 15.464 1.00 2.57 C ATOM 207 O ASN A 27 -4.057 26.899 15.477 1.00 7.08 O ATOM 208 CB ASN A 27 -6.688 28.636 16.631 1.00 9.13 C ATOM 209 CG ASN A 27 -7.131 30.092 16.624 1.00 4.84 C ATOM 210 OD1 ASN A 27 -6.292 30.979 16.582 1.00 9.37 O ATOM 211 ND2 ASN A 27 -8.466 30.324 16.587 1.00 8.00 N ATOM 212 N TRP A 28 -6.033 25.791 15.639 1.00 5.40 N ATOM 213 CA TRP A 28 -5.402 24.497 15.879 1.00 5.45 C ATOM 214 C TRP A 28 -4.584 24.047 14.657 1.00 6.38 C ATOM 215 O TRP A 28 -3.510 23.501 14.767 1.00 7.31 O ATOM 216 CB TRP A 28 -6.482 23.490 16.237 1.00 7.31 C ATOM 217 CG TRP A 28 -7.149 23.849 17.539 1.00 7.66 C ATOM 218 CD1 TRP A 28 -8.351 24.415 17.748 1.00 11.80 C ATOM 219 CD2 TRP A 28 -6.540 23.691 18.841 1.00 9.47 C ATOM 220 NE1 TRP A 28 -8.575 24.567 19.117 1.00 11.48 N ATOM 221 CE2 TRP A 28 -7.475 24.139 19.807 1.00 9.56 C ATOM 222 CE3 TRP A 28 -5.321 23.121 19.249 1.00 10.24 C ATOM 223 CZ2 TRP A 28 -7.187 24.066 21.210 1.00 11.03 C ATOM 224 CZ3 TRP A 28 -5.059 23.060 20.609 1.00 20.66 C ATOM 225 CH2 TRP A 28 -5.985 23.551 21.560 1.00 9.06 C ATOM 226 N VAL A 29 -5.166 24.262 13.469 1.00 3.89 N ATOM 227 CA VAL A 29 -4.458 23.870 12.217 1.00 5.65 C ATOM 228 C VAL A 29 -3.242 24.746 11.972 1.00 2.99 C ATOM 229 O VAL A 29 -2.170 24.273 11.571 1.00 7.90 O ATOM 230 CB VAL A 29 -5.456 23.881 11.020 1.00 7.66 C ATOM 231 CG1 VAL A 29 -4.630 23.646 9.743 1.00 13.23 C ATOM 232 CG2 VAL A 29 -6.516 22.751 11.149 1.00 6.73 C ATOM 233 N CYS A 30 -3.372 26.060 12.262 1.00 2.63 N ATOM 234 CA CYS A 30 -2.281 26.976 12.125 1.00 7.05 C ATOM 235 C CYS A 30 -1.151 26.582 13.072 1.00 10.47 C ATOM 236 O CYS A 30 0.054 26.552 12.766 1.00 4.93 O ATOM 237 CB CYS A 30 -2.756 28.428 12.303 1.00 2.61 C ATOM 238 SG CYS A 30 -1.467 29.667 12.134 1.00 10.20 S ATOM 239 N ALA A 31 -1.521 26.283 14.306 1.00 9.82 N ATOM 240 CA ALA A 31 -0.491 25.884 15.276 1.00 15.61 C ATOM 241 C ALA A 31 0.235 24.607 14.849 1.00 5.07 C ATOM 242 O ALA A 31 1.464 24.554 14.987 1.00 9.27 O ATOM 243 CB ALA A 31 -1.089 25.781 16.704 1.00 7.85 C ATOM 244 N ALA A 32 -0.483 23.609 14.315 1.00 7.79 N ATOM 245 CA ALA A 32 0.162 22.357 13.855 1.00 8.61 C ATOM 246 C ALA A 32 1.085 22.594 12.673 1.00 7.90 C ATOM 247 O ALA A 32 2.197 22.050 12.585 1.00 9.35 O ATOM 248 CB ALA A 32 -0.823 21.268 13.540 1.00 10.83 C ATOM 249 N LYS A 33 0.653 23.463 11.786 1.00 7.35 N ATOM 250 CA LYS A 33 1.542 23.795 10.635 1.00 6.50 C ATOM 251 C LYS A 33 2.867 24.333 11.097 1.00 6.89 C ATOM 252 O LYS A 33 3.936 23.889 10.727 1.00 10.45 O ATOM 253 CB LYS A 33 0.863 24.886 9.776 1.00 10.32 C ATOM 254 CG LYS A 33 1.793 25.437 8.676 1.00 13.52 C ATOM 255 CD LYS A 33 1.927 24.485 7.491 1.00 19.87 C ATOM 256 CE LYS A 33 3.138 24.764 6.621 1.00 27.04 C ATOM 257 NZ LYS A 33 3.217 23.793 5.511 1.00 45.44 N ATOM 258 N PHE A 34 2.807 25.345 11.961 1.00 9.24 N ATOM 259 CA PHE A 34 4.029 25.958 12.436 1.00 8.96 C ATOM 260 C PHE A 34 4.846 25.192 13.455 1.00 16.48 C ATOM 261 O PHE A 34 6.039 25.360 13.540 1.00 14.96 O ATOM 262 CB PHE A 34 3.856 27.469 12.721 1.00 9.21 C ATOM 263 CG PHE A 34 3.417 28.201 11.426 1.00 11.78 C ATOM 264 CD1 PHE A 34 4.231 28.189 10.282 1.00 11.49 C ATOM 265 CD2 PHE A 34 2.212 28.933 11.385 1.00 12.86 C ATOM 266 CE1 PHE A 34 3.830 28.854 9.136 1.00 12.74 C ATOM 267 CE2 PHE A 34 1.803 29.618 10.224 1.00 13.38 C ATOM 268 CZ PHE A 34 2.627 29.554 9.090 1.00 13.39 C ATOM 269 N GLU A 35 4.201 24.324 14.225 1.00 9.90 N ATOM 270 CA GLU A 35 4.889 23.543 15.263 1.00 11.92 C ATOM 271 C GLU A 35 5.641 22.352 14.706 1.00 13.79 C ATOM 272 O GLU A 35 6.781 22.129 15.054 1.00 8.23 O ATOM 273 CB GLU A 35 3.839 23.026 16.259 1.00 6.00 C ATOM 274 CG GLU A 35 3.409 24.107 17.322 1.00 11.89 C ATOM 275 CD GLU A 35 4.516 24.690 18.200 1.00 12.03 C ATOM 276 OE1 GLU A 35 5.640 24.296 18.226 1.00 12.97 O ATOM 277 OE2 GLU A 35 4.167 25.730 18.876 1.00 13.03 O ATOM 278 N SER A 36 4.983 21.591 13.819 1.00 8.49 N ATOM 279 CA SER A 36 5.541 20.369 13.283 1.00 8.82 C ATOM 280 C SER A 36 5.483 20.189 11.756 1.00 10.13 C ATOM 281 O SER A 36 5.800 19.070 11.251 1.00 14.88 O ATOM 282 CB SER A 36 4.684 19.256 13.831 1.00 7.77 C ATOM 283 OG SER A 36 3.330 19.336 13.297 1.00 8.30 O ATOM 284 N ASN A 37 4.975 21.223 11.050 1.00 11.55 N ATOM 285 CA ASN A 37 4.752 21.103 9.605 1.00 8.89 C ATOM 286 C ASN A 37 3.825 19.918 9.321 1.00 14.33 C ATOM 287 O ASN A 37 3.972 19.215 8.320 1.00 14.19 O ATOM 288 CB ASN A 37 6.061 21.002 8.788 1.00 20.93 C ATOM 289 CG ASN A 37 5.851 21.458 7.334 1.00 25.83 C ATOM 290 OD1 ASN A 37 5.061 22.365 7.057 1.00 26.84 O ATOM 291 ND2 ASN A 37 6.474 20.759 6.397 1.00 52.87 N ATOM 292 N PHE A 38 2.864 19.696 10.220 1.00 7.19 N ATOM 293 CA PHE A 38 1.862 18.625 10.075 1.00 11.76 C ATOM 294 C PHE A 38 2.411 17.214 10.168 1.00 10.63 C ATOM 295 O PHE A 38 1.747 16.276 9.742 1.00 9.49 O ATOM 296 CB PHE A 38 1.092 18.696 8.696 1.00 8.56 C ATOM 297 CG PHE A 38 0.280 19.956 8.505 1.00 13.59 C ATOM 298 CD1 PHE A 38 -0.367 20.558 9.597 1.00 8.45 C ATOM 299 CD2 PHE A 38 0.112 20.532 7.255 1.00 17.61 C ATOM 300 CE1 PHE A 38 -1.146 21.685 9.432 1.00 11.53 C ATOM 301 CE2 PHE A 38 -0.664 21.687 7.081 1.00 17.65 C ATOM 302 CZ PHE A 38 -1.316 22.268 8.162 1.00 13.17 C ATOM 303 N ASN A 39 3.667 17.073 10.600 1.00 8.40 N ATOM 304 CA ASN A 39 4.271 15.737 10.699 1.00 6.01 C ATOM 305 C ASN A 39 4.101 15.211 12.158 1.00 6.81 C ATOM 306 O ASN A 39 4.597 15.858 13.147 1.00 11.41 O ATOM 307 CB ASN A 39 5.776 15.925 10.373 1.00 6.39 C ATOM 308 CG ASN A 39 6.552 14.636 10.450 1.00 6.34 C ATOM 309 OD1 ASN A 39 5.992 13.541 10.684 1.00 10.75 O ATOM 310 ND2 ASN A 39 7.832 14.764 10.100 1.00 13.88 N ATOM 311 N THR A 40 3.430 14.054 12.314 1.00 8.05 N ATOM 312 CA THR A 40 3.222 13.509 13.676 1.00 10.13 C ATOM 313 C THR A 40 4.525 13.041 14.358 1.00 8.64 C ATOM 314 O THR A 40 4.546 12.831 15.542 1.00 12.11 O ATOM 315 CB THR A 40 2.279 12.302 13.663 1.00 12.49 C ATOM 316 OG1 THR A 40 2.862 11.250 12.880 1.00 10.89 O ATOM 317 CG2 THR A 40 0.843 12.666 13.219 1.00 9.90 C ATOM 318 N GLN A 41 5.594 12.819 13.559 1.00 6.61 N ATOM 319 CA GLN A 41 6.860 12.308 14.019 1.00 3.67 C ATOM 320 C GLN A 41 7.861 13.372 14.433 1.00 4.66 C ATOM 321 O GLN A 41 8.986 13.051 14.864 1.00 8.80 O ATOM 322 CB GLN A 41 7.463 11.344 12.979 1.00 9.30 C ATOM 323 CG GLN A 41 6.598 10.100 12.797 1.00 12.21 C ATOM 324 CD GLN A 41 7.402 8.999 12.104 1.00 22.47 C ATOM 325 OE1 GLN A 41 8.254 8.393 12.763 1.00 16.54 O ATOM 326 NE2 GLN A 41 7.257 8.847 10.744 1.00 13.11 N ATOM 327 N ALA A 42 7.460 14.657 14.305 1.00 6.51 N ATOM 328 CA ALA A 42 8.376 15.748 14.672 1.00 8.14 C ATOM 329 C ALA A 42 8.824 15.710 16.237 1.00 11.70 C ATOM 330 O ALA A 42 8.005 15.547 17.165 1.00 5.54 O ATOM 331 CB ALA A 42 7.744 17.108 14.349 1.00 8.97 C ATOM 332 N THR A 43 10.132 15.865 16.445 1.00 7.08 N ATOM 333 CA THR A 43 10.705 15.992 17.773 1.00 10.42 C ATOM 334 C THR A 43 11.694 17.112 17.692 1.00 11.09 C ATOM 335 O THR A 43 12.280 17.411 16.646 1.00 12.80 O ATOM 336 CB THR A 43 11.362 14.748 18.354 1.00 13.93 C ATOM 337 OG1 THR A 43 12.360 14.429 17.435 1.00 11.09 O ATOM 338 CG2 THR A 43 10.420 13.567 18.530 1.00 7.58 C ATOM 339 N ASN A 44 11.894 17.801 18.808 1.00 10.77 N ATOM 340 CA ASN A 44 12.828 18.909 18.863 1.00 6.02 C ATOM 341 C ASN A 44 13.258 19.036 20.281 1.00 16.51 C ATOM 342 O ASN A 44 12.426 19.127 21.185 1.00 11.61 O ATOM 343 CB ASN A 44 12.171 20.225 18.473 1.00 13.37 C ATOM 344 CG ASN A 44 11.932 20.272 16.966 1.00 55.95 C ATOM 345 OD1 ASN A 44 12.883 20.299 16.146 1.00 30.16 O ATOM 346 ND2 ASN A 44 10.659 20.233 16.594 1.00 20.67 N ATOM 347 N ARG A 45 14.545 19.035 20.479 1.00 13.41 N ATOM 348 CA ARG A 45 15.061 19.112 21.827 1.00 12.01 C ATOM 349 C ARG A 45 15.250 20.555 22.252 1.00 20.93 C ATOM 350 O ARG A 45 15.601 21.418 21.435 1.00 20.22 O ATOM 351 CB ARG A 45 16.408 18.438 21.953 1.00 19.70 C ATOM 352 CG ARG A 45 16.935 18.714 23.338 1.00 35.82 C ATOM 353 CD ARG A 45 16.730 17.468 24.141 1.00 27.63 C ATOM 354 NE ARG A 45 17.249 16.408 23.330 1.00 67.37 N ATOM 355 CZ ARG A 45 18.249 15.588 23.641 1.00 91.84 C ATOM 356 NH1 ARG A 45 18.868 15.589 24.830 1.00 36.08 N ATOM 357 NH2 ARG A 45 18.624 14.698 22.716 1.00 64.26 N ATOM 358 N ASN A 46 15.056 20.796 23.543 1.00 12.63 N ATOM 359 CA ASN A 46 15.247 22.135 24.062 1.00 12.92 C ATOM 360 C ASN A 46 16.508 22.245 24.900 1.00 8.11 C ATOM 361 O ASN A 46 17.149 21.253 25.274 1.00 15.77 O ATOM 362 CB ASN A 46 13.989 22.699 24.735 1.00 11.70 C ATOM 363 CG ASN A 46 12.659 22.418 24.007 1.00 21.14 C ATOM 364 OD1 ASN A 46 11.762 21.669 24.459 1.00 23.29 O ATOM 365 ND2 ASN A 46 12.508 23.062 22.886 1.00 24.99 N ATOM 366 N THR A 47 16.906 23.489 25.146 1.00 23.92 N ATOM 367 CA THR A 47 18.108 23.768 25.931 1.00 39.90 C ATOM 368 C THR A 47 17.996 23.269 27.358 1.00 25.44 C ATOM 369 O THR A 47 18.958 22.798 27.923 1.00 34.24 O ATOM 370 CB THR A 47 18.506 25.250 25.905 1.00 47.42 C ATOM 371 OG1 THR A 47 17.376 26.053 26.142 1.00 38.53 O ATOM 372 CG2 THR A 47 19.115 25.572 24.552 1.00 58.08 C ATOM 373 N ASP A 48 16.797 23.339 27.935 1.00 20.62 N ATOM 374 CA ASP A 48 16.626 22.832 29.261 1.00 9.90 C ATOM 375 C ASP A 48 16.700 21.306 29.306 1.00 19.23 C ATOM 376 O ASP A 48 16.586 20.723 30.361 1.00 22.36 O ATOM 377 CB ASP A 48 15.349 23.377 29.887 1.00 14.78 C ATOM 378 CG ASP A 48 14.119 22.821 29.267 1.00 19.04 C ATOM 379 OD1 ASP A 48 14.160 21.981 28.422 1.00 28.31 O ATOM 380 OD2 ASP A 48 13.002 23.315 29.717 1.00 28.61 O ATOM 381 N GLY A 49 16.883 20.637 28.166 1.00 17.28 N ATOM 382 CA GLY A 49 16.950 19.205 28.182 1.00 10.24 C ATOM 383 C GLY A 49 15.608 18.534 27.977 1.00 14.24 C ATOM 384 O GLY A 49 15.499 17.291 27.852 1.00 13.58 O ATOM 385 N SER A 50 14.564 19.331 27.973 1.00 9.07 N ATOM 386 CA SER A 50 13.311 18.716 27.712 1.00 7.32 C ATOM 387 C SER A 50 13.217 18.531 26.131 1.00 11.52 C ATOM 388 O SER A 50 14.085 19.016 25.374 1.00 13.96 O ATOM 389 CB SER A 50 12.113 19.490 28.182 1.00 4.67 C ATOM 390 OG SER A 50 12.074 20.716 27.461 1.00 9.76 O ATOM 391 N THR A 51 12.150 17.857 25.646 1.00 11.43 N ATOM 392 CA THR A 51 11.958 17.610 24.179 1.00 9.12 C ATOM 393 C THR A 51 10.485 17.806 23.917 1.00 16.87 C ATOM 394 O THR A 51 9.677 17.499 24.825 1.00 8.33 O ATOM 395 CB THR A 51 12.363 16.177 23.757 1.00 5.49 C ATOM 396 OG1 THR A 51 13.711 15.986 24.120 1.00 6.88 O ATOM 397 CG2 THR A 51 12.234 15.930 22.227 1.00 7.94 C ATOM 398 N ASP A 52 10.158 18.354 22.701 1.00 9.46 N ATOM 399 CA ASP A 52 8.767 18.608 22.181 1.00 5.88 C ATOM 400 C ASP A 52 8.451 17.463 21.198 1.00 5.87 C ATOM 401 O ASP A 52 9.311 17.033 20.476 1.00 5.53 O ATOM 402 CB ASP A 52 8.717 19.972 21.485 1.00 6.73 C ATOM 403 CG ASP A 52 9.014 21.046 22.449 1.00 17.46 C ATOM 404 OD1 ASP A 52 8.778 20.978 23.593 1.00 16.69 O ATOM 405 OD2 ASP A 52 9.531 22.065 21.923 1.00 28.92 O ATOM 406 N TYR A 53 7.279 16.908 21.280 1.00 7.33 N ATOM 407 CA TYR A 53 6.899 15.745 20.548 1.00 9.37 C ATOM 408 C TYR A 53 5.580 15.922 19.790 1.00 13.52 C ATOM 409 O TYR A 53 4.554 16.399 20.326 1.00 7.94 O ATOM 410 CB TYR A 53 6.630 14.562 21.517 1.00 7.91 C ATOM 411 CG TYR A 53 7.865 14.099 22.242 1.00 6.82 C ATOM 412 CD1 TYR A 53 8.335 14.742 23.399 1.00 8.88 C ATOM 413 CD2 TYR A 53 8.618 13.027 21.749 1.00 6.30 C ATOM 414 CE1 TYR A 53 9.548 14.382 24.006 1.00 1.83 C ATOM 415 CE2 TYR A 53 9.846 12.646 22.351 1.00 10.07 C ATOM 416 CZ TYR A 53 10.229 13.264 23.534 1.00 8.70 C ATOM 417 OH TYR A 53 11.374 12.889 24.151 1.00 12.40 O ATOM 418 N GLY A 54 5.598 15.446 18.516 1.00 11.04 N ATOM 419 CA GLY A 54 4.390 15.347 17.710 1.00 7.71 C ATOM 420 C GLY A 54 3.939 16.599 17.020 1.00 3.67 C ATOM 421 O GLY A 54 4.535 17.621 17.017 1.00 8.49 O ATOM 422 N ILE A 55 2.748 16.458 16.496 1.00 11.91 N ATOM 423 CA ILE A 55 2.096 17.435 15.686 1.00 7.88 C ATOM 424 C ILE A 55 1.893 18.749 16.386 1.00 10.21 C ATOM 425 O ILE A 55 1.904 19.805 15.761 1.00 9.17 O ATOM 426 CB ILE A 55 0.838 16.805 15.068 1.00 19.48 C ATOM 427 CG1 ILE A 55 0.390 17.438 13.734 1.00 15.27 C ATOM 428 CG2 ILE A 55 -0.262 16.528 16.106 1.00 16.63 C ATOM 429 CD1 ILE A 55 -0.353 16.483 12.846 1.00 21.60 C ATOM 430 N LEU A 56 1.765 18.677 17.706 1.00 9.90 N ATOM 431 CA LEU A 56 1.584 19.877 18.488 1.00 7.23 C ATOM 432 C LEU A 56 2.735 20.173 19.390 1.00 18.66 C ATOM 433 O LEU A 56 2.660 21.074 20.200 1.00 10.73 O ATOM 434 CB LEU A 56 0.216 19.957 19.205 1.00 11.28 C ATOM 435 CG LEU A 56 -0.990 20.157 18.283 1.00 12.31 C ATOM 436 CD1 LEU A 56 -2.255 19.795 19.036 1.00 11.09 C ATOM 437 CD2 LEU A 56 -1.074 21.607 17.850 1.00 11.43 C ATOM 438 N GLN A 57 3.804 19.441 19.202 1.00 7.01 N ATOM 439 CA GLN A 57 5.029 19.733 19.898 1.00 9.13 C ATOM 440 C GLN A 57 4.883 19.918 21.451 1.00 11.13 C ATOM 441 O GLN A 57 5.272 20.968 22.020 1.00 12.02 O ATOM 442 CB GLN A 57 5.767 20.937 19.263 1.00 10.29 C ATOM 443 CG GLN A 57 6.362 20.658 17.863 1.00 6.27 C ATOM 444 CD GLN A 57 7.544 19.747 17.936 1.00 2.25 C ATOM 445 OE1 GLN A 57 8.676 20.257 18.147 1.00 7.47 O ATOM 446 NE2 GLN A 57 7.279 18.413 17.746 1.00 7.69 N ATOM 447 N ILE A 58 4.303 18.898 22.061 1.00 9.58 N ATOM 448 CA ILE A 58 4.031 18.814 23.487 1.00 12.88 C ATOM 449 C ILE A 58 5.301 18.482 24.282 1.00 14.09 C ATOM 450 O ILE A 58 6.055 17.583 23.982 1.00 10.65 O ATOM 451 CB ILE A 58 2.839 17.923 23.711 1.00 12.15 C ATOM 452 CG1 ILE A 58 1.599 18.614 23.110 1.00 12.61 C ATOM 453 CG2 ILE A 58 2.704 17.544 25.215 1.00 12.37 C ATOM 454 CD1 ILE A 58 0.329 17.770 23.138 1.00 17.22 C ATOM 455 N ASN A 59 5.556 19.297 25.282 1.00 11.07 N ATOM 456 CA ASN A 59 6.797 19.305 26.034 1.00 6.68 C ATOM 457 C ASN A 59 6.893 18.239 27.099 1.00 8.46 C ATOM 458 O ASN A 59 5.904 18.002 27.761 1.00 12.15 O ATOM 459 CB ASN A 59 7.045 20.721 26.565 1.00 7.94 C ATOM 460 CG ASN A 59 8.434 20.839 27.178 1.00 12.92 C ATOM 461 OD1 ASN A 59 8.578 20.809 28.411 1.00 30.15 O ATOM 462 ND2 ASN A 59 9.469 20.939 26.342 1.00 15.71 N ATOM 463 N SER A 60 8.096 17.590 27.218 1.00 8.63 N ATOM 464 CA SER A 60 8.333 16.496 28.162 1.00 11.30 C ATOM 465 C SER A 60 8.586 17.015 29.647 1.00 7.42 C ATOM 466 O SER A 60 8.559 16.218 30.620 1.00 18.39 O ATOM 467 CB SER A 60 9.448 15.619 27.698 1.00 9.31 C ATOM 468 OG SER A 60 10.642 16.390 27.790 1.00 9.01 O ATOM 469 N ARG A 61 8.806 18.347 29.787 1.00 11.96 N ATOM 470 CA ARG A 61 8.981 18.933 31.125 1.00 18.58 C ATOM 471 C ARG A 61 7.701 18.806 31.935 1.00 21.66 C ATOM 472 O ARG A 61 7.730 18.363 33.063 1.00 24.43 O ATOM 473 CB ARG A 61 9.507 20.347 31.068 1.00 19.81 C ATOM 474 CG ARG A 61 9.259 21.125 32.338 1.00 40.52 C ATOM 475 CD ARG A 61 10.511 21.648 33.063 1.00 30.90 C ATOM 476 NE ARG A 61 11.777 21.523 32.353 1.00 58.97 N ATOM 477 CZ ARG A 61 12.722 20.587 32.539 1.00 70.61 C ATOM 478 NH1 ARG A 61 12.610 19.570 33.413 1.00 68.85 N ATOM 479 NH2 ARG A 61 13.829 20.673 31.795 1.00 56.33 N ATOM 480 N TRP A 62 6.542 19.071 31.329 1.00 12.69 N ATOM 481 CA TRP A 62 5.279 18.955 32.026 1.00 10.92 C ATOM 482 C TRP A 62 4.281 17.916 31.682 1.00 19.26 C ATOM 483 O TRP A 62 3.526 17.478 32.563 1.00 19.01 O ATOM 484 CB TRP A 62 4.455 20.234 31.875 1.00 14.48 C ATOM 485 CG TRP A 62 5.346 21.376 31.920 1.00 34.77 C ATOM 486 CD1 TRP A 62 5.937 21.965 30.857 1.00 48.56 C ATOM 487 CD2 TRP A 62 5.859 21.980 33.091 1.00 34.03 C ATOM 488 NE1 TRP A 62 6.753 22.970 31.303 1.00 60.61 N ATOM 489 CE2 TRP A 62 6.730 22.995 32.671 1.00 37.59 C ATOM 490 CE3 TRP A 62 5.619 21.790 34.443 1.00 44.85 C ATOM 491 CZ2 TRP A 62 7.373 23.823 33.582 1.00 74.91 C ATOM 492 CZ3 TRP A 62 6.254 22.606 35.347 1.00 49.52 C ATOM 493 CH2 TRP A 62 7.122 23.609 34.923 1.00 52.73 C ATOM 494 N TRP A 63 4.152 17.600 30.385 1.00 11.21 N ATOM 495 CA TRP A 63 3.036 16.858 29.848 1.00 9.63 C ATOM 496 C TRP A 63 3.155 15.396 29.592 1.00 4.89 C ATOM 497 O TRP A 63 2.183 14.725 29.581 1.00 11.10 O ATOM 498 CB TRP A 63 2.652 17.635 28.566 1.00 6.50 C ATOM 499 CG TRP A 63 2.429 19.101 28.874 1.00 5.59 C ATOM 500 CD1 TRP A 63 3.223 20.140 28.615 1.00 15.86 C ATOM 501 CD2 TRP A 63 1.364 19.632 29.695 1.00 11.68 C ATOM 502 NE1 TRP A 63 2.675 21.309 29.075 1.00 15.89 N ATOM 503 CE2 TRP A 63 1.567 21.028 29.780 1.00 12.27 C ATOM 504 CE3 TRP A 63 0.230 19.055 30.324 1.00 14.52 C ATOM 505 CZ2 TRP A 63 0.682 21.862 30.488 1.00 10.75 C ATOM 506 CZ3 TRP A 63 -0.678 19.891 30.985 1.00 10.21 C ATOM 507 CH2 TRP A 63 -0.421 21.271 31.057 1.00 13.33 C ATOM 508 N CYS A 64 4.324 14.905 29.353 1.00 8.53 N ATOM 509 CA CYS A 64 4.448 13.469 29.032 1.00 14.18 C ATOM 510 C CYS A 64 5.785 12.968 29.569 1.00 8.75 C ATOM 511 O CYS A 64 6.694 13.742 29.793 1.00 11.88 O ATOM 512 CB CYS A 64 4.366 13.241 27.432 1.00 12.87 C ATOM 513 SG CYS A 64 5.695 14.086 26.427 1.00 9.81 S ATOM 514 N ASN A 65 5.913 11.651 29.720 1.00 9.55 N ATOM 515 CA ASN A 65 7.127 11.114 30.200 1.00 16.84 C ATOM 516 C ASN A 65 7.999 10.547 29.073 1.00 4.97 C ATOM 517 O ASN A 65 7.529 9.623 28.435 1.00 10.83 O ATOM 518 CB ASN A 65 6.809 9.953 31.188 1.00 9.17 C ATOM 519 CG ASN A 65 8.120 9.322 31.715 1.00 22.59 C ATOM 520 OD1 ASN A 65 9.033 10.017 32.182 1.00 21.36 O ATOM 521 ND2 ASN A 65 8.276 8.015 31.524 1.00 36.98 N ATOM 522 N ASP A 66 9.254 10.993 28.982 1.00 7.66 N ATOM 523 CA ASP A 66 10.153 10.434 27.995 1.00 14.97 C ATOM 524 C ASP A 66 11.354 9.742 28.601 1.00 23.09 C ATOM 525 O ASP A 66 12.237 9.341 27.867 1.00 9.43 O ATOM 526 CB ASP A 66 10.641 11.448 26.948 1.00 13.58 C ATOM 527 CG ASP A 66 11.480 12.554 27.535 1.00 11.41 C ATOM 528 OD1 ASP A 66 11.787 12.613 28.717 1.00 18.43 O ATOM 529 OD2 ASP A 66 11.850 13.432 26.659 1.00 10.72 O ATOM 530 N GLY A 67 11.395 9.644 29.920 1.00 14.60 N ATOM 531 CA GLY A 67 12.449 8.941 30.665 1.00 9.04 C ATOM 532 C GLY A 67 13.738 9.677 30.697 1.00 13.04 C ATOM 533 O GLY A 67 14.726 9.165 31.164 1.00 23.22 O ATOM 534 N ARG A 68 13.787 10.891 30.194 1.00 8.50 N ATOM 535 CA ARG A 68 15.089 11.512 30.237 1.00 11.50 C ATOM 536 C ARG A 68 15.046 12.949 30.560 1.00 11.49 C ATOM 537 O ARG A 68 15.995 13.645 30.281 1.00 17.90 O ATOM 538 CB ARG A 68 15.872 11.277 28.959 1.00 18.67 C ATOM 539 CG ARG A 68 15.218 11.867 27.707 1.00 21.19 C ATOM 540 CD ARG A 68 16.251 12.103 26.592 1.00 19.51 C ATOM 541 NE ARG A 68 15.790 12.984 25.527 1.00 20.38 N ATOM 542 CZ ARG A 68 16.264 12.978 24.248 1.00 29.94 C ATOM 543 NH1 ARG A 68 17.253 12.102 23.926 1.00 13.00 N ATOM 544 NH2 ARG A 68 15.787 13.865 23.293 1.00 13.47 N ATOM 545 N THR A 69 13.937 13.376 31.145 1.00 12.12 N ATOM 546 CA THR A 69 13.674 14.782 31.586 1.00 17.22 C ATOM 547 C THR A 69 13.372 14.770 33.144 1.00 15.41 C ATOM 548 O THR A 69 12.260 14.526 33.618 1.00 19.26 O ATOM 549 CB THR A 69 12.464 15.410 30.798 1.00 12.81 C ATOM 550 OG1 THR A 69 12.589 15.107 29.412 1.00 17.25 O ATOM 551 CG2 THR A 69 12.392 16.932 30.990 1.00 8.98 C ATOM 552 N PRO A 70 14.431 14.960 33.874 1.00 30.00 N ATOM 553 CA PRO A 70 14.563 14.964 35.315 1.00 31.13 C ATOM 554 C PRO A 70 13.654 16.003 35.904 1.00 43.01 C ATOM 555 O PRO A 70 13.699 17.188 35.594 1.00 37.19 O ATOM 556 CB PRO A 70 16.056 15.221 35.541 1.00 43.11 C ATOM 557 CG PRO A 70 16.728 15.203 34.148 1.00 49.23 C ATOM 558 CD PRO A 70 15.635 15.319 33.119 1.00 44.60 C ATOM 559 N GLY A 71 12.698 15.573 36.672 1.00 29.79 N ATOM 560 CA GLY A 71 11.785 16.609 37.130 1.00 38.84 C ATOM 561 C GLY A 71 10.547 16.728 36.220 1.00 34.52 C ATOM 562 O GLY A 71 9.750 17.644 36.328 1.00 53.49 O ATOM 563 N SER A 72 10.339 15.797 35.324 1.00 30.26 N ATOM 564 CA SER A 72 9.157 15.860 34.502 1.00 32.28 C ATOM 565 C SER A 72 7.906 15.615 35.374 1.00 22.29 C ATOM 566 O SER A 72 7.914 14.715 36.197 1.00 26.48 O ATOM 567 CB SER A 72 9.249 14.700 33.473 1.00 31.83 C ATOM 568 OG SER A 72 8.038 14.552 32.612 1.00 33.11 O ATOM 569 N ARG A 73 6.801 16.311 35.113 1.00 20.31 N ATOM 570 CA ARG A 73 5.550 16.055 35.819 1.00 12.77 C ATOM 571 C ARG A 73 4.564 15.081 35.174 1.00 35.87 C ATOM 572 O ARG A 73 3.662 14.597 35.845 1.00 50.20 O ATOM 573 CB ARG A 73 4.830 17.322 36.128 1.00 19.66 C ATOM 574 CG ARG A 73 5.605 18.165 37.124 1.00 35.18 C ATOM 575 CD ARG A 73 4.864 19.471 37.396 1.00 86.10 C ATOM 576 NE ARG A 73 4.736 19.744 38.823 1.00 80.19 N ATOM 577 CZ ARG A 73 4.227 20.854 39.398 1.00 81.09 C ATOM 578 NH1 ARG A 73 3.742 21.891 38.705 1.00 81.15 N ATOM 579 NH2 ARG A 73 4.215 20.930 40.739 1.00 71.03 N ATOM 580 N ASN A 74 4.668 14.781 33.896 1.00 18.76 N ATOM 581 CA ASN A 74 3.715 13.833 33.313 1.00 10.40 C ATOM 582 C ASN A 74 2.194 14.147 33.501 1.00 8.97 C ATOM 583 O ASN A 74 1.355 13.278 33.697 1.00 15.29 O ATOM 584 CB ASN A 74 4.053 12.334 33.426 1.00 16.10 C ATOM 585 CG ASN A 74 3.479 11.413 32.309 1.00 15.75 C ATOM 586 OD1 ASN A 74 2.928 11.864 31.297 1.00 22.77 O ATOM 587 ND2 ASN A 74 3.593 10.101 32.490 1.00 17.62 N ATOM 588 N LEU A 75 1.851 15.405 33.334 1.00 13.92 N ATOM 589 CA LEU A 75 0.471 15.774 33.458 1.00 16.58 C ATOM 590 C LEU A 75 -0.505 15.089 32.565 1.00 21.84 C ATOM 591 O LEU A 75 -1.654 14.976 32.957 1.00 22.99 O ATOM 592 CB LEU A 75 0.245 17.277 33.466 1.00 17.10 C ATOM 593 CG LEU A 75 0.919 17.845 34.715 1.00 30.53 C ATOM 594 CD1 LEU A 75 0.889 19.358 34.725 1.00 35.25 C ATOM 595 CD2 LEU A 75 0.238 17.306 35.969 1.00 21.06 C ATOM 596 N CYS A 76 -0.146 14.663 31.359 1.00 18.42 N ATOM 597 CA CYS A 76 -1.153 13.970 30.513 1.00 10.67 C ATOM 598 C CYS A 76 -1.137 12.463 30.738 1.00 12.68 C ATOM 599 O CYS A 76 -1.935 11.725 30.131 1.00 17.21 O ATOM 600 CB CYS A 76 -1.094 14.295 28.984 1.00 9.97 C ATOM 601 SG CYS A 76 -1.329 16.050 28.713 1.00 13.70 S ATOM 602 N ASN A 77 -0.194 12.038 31.586 1.00 14.93 N ATOM 603 CA ASN A 77 -0.117 10.607 31.926 1.00 19.18 C ATOM 604 C ASN A 77 0.099 9.697 30.747 1.00 21.40 C ATOM 605 O ASN A 77 -0.626 8.715 30.538 1.00 17.53 O ATOM 606 CB ASN A 77 -1.421 10.174 32.620 1.00 36.06 C ATOM 607 CG ASN A 77 -1.361 8.783 33.215 1.00 80.95 C ATOM 608 OD1 ASN A 77 -2.358 8.042 33.188 1.00 78.33 O ATOM 609 ND2 ASN A 77 -0.186 8.412 33.715 1.00 38.97 N ATOM 610 N ILE A 78 1.114 10.006 29.979 1.00 14.33 N ATOM 611 CA ILE A 78 1.373 9.191 28.838 1.00 11.33 C ATOM 612 C ILE A 78 2.873 9.258 28.499 1.00 13.41 C ATOM 613 O ILE A 78 3.568 10.265 28.718 1.00 12.78 O ATOM 614 CB ILE A 78 0.764 9.855 27.598 1.00 15.98 C ATOM 615 CG1 ILE A 78 0.764 11.376 27.743 1.00 20.19 C ATOM 616 CG2 ILE A 78 -0.461 9.195 26.985 1.00 25.51 C ATOM 617 CD1 ILE A 78 0.735 12.094 26.406 1.00 31.88 C ATOM 618 N PRO A 79 3.343 8.210 27.843 1.00 14.97 N ATOM 619 CA PRO A 79 4.715 8.229 27.362 1.00 12.65 C ATOM 620 C PRO A 79 4.738 9.234 26.187 1.00 10.18 C ATOM 621 O PRO A 79 3.762 9.304 25.359 1.00 11.71 O ATOM 622 CB PRO A 79 4.962 6.830 26.843 1.00 11.25 C ATOM 623 CG PRO A 79 3.631 6.096 26.844 1.00 17.21 C ATOM 624 CD PRO A 79 2.621 6.951 27.581 1.00 9.85 C ATOM 625 N CYS A 80 5.798 10.020 26.078 1.00 11.09 N ATOM 626 CA CYS A 80 5.870 11.003 24.969 1.00 5.24 C ATOM 627 C CYS A 80 5.782 10.359 23.546 1.00 8.89 C ATOM 628 O CYS A 80 5.284 10.950 22.568 1.00 11.52 O ATOM 629 CB CYS A 80 7.126 11.894 25.061 1.00 7.40 C ATOM 630 SG CYS A 80 7.251 12.847 26.592 1.00 9.47 S ATOM 631 N SER A 81 6.259 9.115 23.442 1.00 9.85 N ATOM 632 CA SER A 81 6.242 8.432 22.154 1.00 7.67 C ATOM 633 C SER A 81 4.815 8.223 21.687 1.00 15.55 C ATOM 634 O SER A 81 4.554 8.156 20.510 1.00 15.82 O ATOM 635 CB SER A 81 6.995 7.111 22.234 1.00 15.31 C ATOM 636 OG SER A 81 6.295 6.245 23.119 1.00 17.97 O ATOM 637 N ALA A 82 3.857 8.169 22.598 1.00 11.39 N ATOM 638 CA ALA A 82 2.452 8.033 22.185 1.00 14.65 C ATOM 639 C ALA A 82 2.000 9.216 21.325 1.00 20.26 C ATOM 640 O ALA A 82 1.033 9.113 20.571 1.00 22.13 O ATOM 641 CB ALA A 82 1.481 8.009 23.384 1.00 17.51 C ATOM 642 N LEU A 83 2.659 10.349 21.528 1.00 9.56 N ATOM 643 CA LEU A 83 2.329 11.589 20.867 1.00 12.01 C ATOM 644 C LEU A 83 2.834 11.627 19.385 1.00 18.14 C ATOM 645 O LEU A 83 2.626 12.620 18.685 1.00 12.31 O ATOM 646 CB LEU A 83 2.986 12.761 21.651 1.00 15.90 C ATOM 647 CG LEU A 83 2.370 12.966 23.055 1.00 9.43 C ATOM 648 CD1 LEU A 83 3.076 14.069 23.849 1.00 12.61 C ATOM 649 CD2 LEU A 83 0.843 13.174 22.965 1.00 15.37 C ATOM 650 N LEU A 84 3.542 10.556 18.940 1.00 13.34 N ATOM 651 CA LEU A 84 4.131 10.512 17.618 1.00 11.55 C ATOM 652 C LEU A 84 3.361 9.657 16.630 1.00 16.60 C ATOM 653 O LEU A 84 3.704 9.570 15.475 1.00 22.63 O ATOM 654 CB LEU A 84 5.630 10.044 17.645 1.00 7.92 C ATOM 655 CG LEU A 84 6.546 10.859 18.552 1.00 18.00 C ATOM 656 CD1 LEU A 84 7.978 10.414 18.359 1.00 17.76 C ATOM 657 CD2 LEU A 84 6.513 12.306 18.116 1.00 8.41 C ATOM 658 N SER A 85 2.332 9.023 17.096 1.00 15.68 N ATOM 659 CA SER A 85 1.485 8.148 16.333 1.00 22.63 C ATOM 660 C SER A 85 0.792 8.827 15.194 1.00 14.76 C ATOM 661 O SER A 85 0.519 10.007 15.280 1.00 16.99 O ATOM 662 CB SER A 85 0.376 7.776 17.295 1.00 16.59 C ATOM 663 OG SER A 85 -0.373 6.761 16.741 1.00 23.89 O ATOM 664 N SER A 86 0.371 8.039 14.186 1.00 19.04 N ATOM 665 CA SER A 86 -0.430 8.505 13.025 1.00 17.09 C ATOM 666 C SER A 86 -1.827 8.884 13.487 1.00 21.77 C ATOM 667 O SER A 86 -2.481 9.696 12.857 1.00 24.42 O ATOM 668 CB SER A 86 -0.584 7.358 12.026 1.00 21.75 C ATOM 669 OG SER A 86 0.687 7.146 11.467 1.00 50.53 O ATOM 670 N ASP A 87 -2.288 8.227 14.575 1.00 13.55 N ATOM 671 CA ASP A 87 -3.611 8.483 15.195 1.00 14.83 C ATOM 672 C ASP A 87 -3.426 9.673 16.162 1.00 16.43 C ATOM 673 O ASP A 87 -2.640 9.585 17.147 1.00 17.32 O ATOM 674 CB ASP A 87 -4.025 7.244 15.987 1.00 17.38 C ATOM 675 CG ASP A 87 -5.365 7.435 16.676 1.00 36.42 C ATOM 676 OD1 ASP A 87 -5.875 8.512 16.868 1.00 21.05 O ATOM 677 OD2 ASP A 87 -5.952 6.315 17.005 1.00 56.25 O ATOM 678 N ILE A 88 -4.037 10.803 15.879 1.00 12.05 N ATOM 679 CA ILE A 88 -3.749 11.974 16.722 1.00 17.85 C ATOM 680 C ILE A 88 -4.490 12.067 18.055 1.00 12.40 C ATOM 681 O ILE A 88 -4.393 13.081 18.780 1.00 11.64 O ATOM 682 CB ILE A 88 -4.014 13.293 15.954 1.00 16.92 C ATOM 683 CG1 ILE A 88 -5.565 13.392 15.634 1.00 15.36 C ATOM 684 CG2 ILE A 88 -3.104 13.384 14.694 1.00 18.11 C ATOM 685 CD1 ILE A 88 -6.065 14.738 15.196 1.00 20.80 C ATOM 686 N THR A 89 -5.257 11.069 18.381 1.00 13.72 N ATOM 687 CA THR A 89 -6.058 11.103 19.584 1.00 12.45 C ATOM 688 C THR A 89 -5.326 11.520 20.907 1.00 8.02 C ATOM 689 O THR A 89 -5.777 12.403 21.614 1.00 14.43 O ATOM 690 CB THR A 89 -6.717 9.735 19.716 1.00 18.11 C ATOM 691 OG1 THR A 89 -7.492 9.539 18.564 1.00 18.36 O ATOM 692 CG2 THR A 89 -7.642 9.724 20.953 1.00 16.37 C ATOM 693 N ALA A 90 -4.186 10.900 21.216 1.00 10.40 N ATOM 694 CA ALA A 90 -3.483 11.250 22.444 1.00 14.23 C ATOM 695 C ALA A 90 -2.971 12.685 22.412 1.00 17.47 C ATOM 696 O ALA A 90 -2.981 13.344 23.413 1.00 10.92 O ATOM 697 CB ALA A 90 -2.331 10.290 22.751 1.00 15.55 C ATOM 698 N SER A 91 -2.504 13.185 21.257 1.00 8.67 N ATOM 699 CA SER A 91 -2.032 14.567 21.163 1.00 7.03 C ATOM 700 C SER A 91 -3.155 15.522 21.418 1.00 6.83 C ATOM 701 O SER A 91 -3.033 16.547 22.059 1.00 13.20 O ATOM 702 CB SER A 91 -1.445 14.870 19.783 1.00 7.71 C ATOM 703 OG SER A 91 -0.111 14.402 19.670 1.00 11.50 O ATOM 704 N VAL A 92 -4.289 15.234 20.839 1.00 9.57 N ATOM 705 CA VAL A 92 -5.449 16.101 21.004 1.00 7.79 C ATOM 706 C VAL A 92 -5.938 16.148 22.488 1.00 10.65 C ATOM 707 O VAL A 92 -6.254 17.195 23.018 1.00 12.26 O ATOM 708 CB VAL A 92 -6.523 15.597 19.994 1.00 23.58 C ATOM 709 CG1 VAL A 92 -7.936 16.117 20.303 1.00 19.93 C ATOM 710 CG2 VAL A 92 -6.110 15.987 18.555 1.00 17.17 C ATOM 711 N ASN A 93 -6.047 14.973 23.140 1.00 10.03 N ATOM 712 CA ASN A 93 -6.511 14.862 24.536 1.00 24.44 C ATOM 713 C ASN A 93 -5.602 15.647 25.472 1.00 10.79 C ATOM 714 O ASN A 93 -6.049 16.390 26.310 1.00 15.54 O ATOM 715 CB ASN A 93 -6.580 13.395 24.989 1.00 13.16 C ATOM 716 CG ASN A 93 -7.781 12.668 24.406 1.00 15.37 C ATOM 717 OD1 ASN A 93 -7.842 11.422 24.426 1.00 35.75 O ATOM 718 ND2 ASN A 93 -8.682 13.436 23.835 1.00 16.65 N ATOM 719 N CYS A 94 -4.284 15.477 25.249 1.00 10.49 N ATOM 720 CA CYS A 94 -3.267 16.178 25.984 1.00 7.62 C ATOM 721 C CYS A 94 -3.353 17.649 25.690 1.00 17.58 C ATOM 722 O CYS A 94 -3.298 18.462 26.598 1.00 9.76 O ATOM 723 CB CYS A 94 -1.875 15.620 25.709 1.00 5.33 C ATOM 724 SG CYS A 94 -0.613 16.312 26.762 1.00 13.87 S ATOM 725 N ALA A 95 -3.546 18.041 24.407 1.00 7.01 N ATOM 726 CA ALA A 95 -3.656 19.481 24.142 1.00 8.80 C ATOM 727 C ALA A 95 -4.864 20.156 24.849 1.00 8.68 C ATOM 728 O ALA A 95 -4.867 21.353 25.215 1.00 11.44 O ATOM 729 CB ALA A 95 -3.774 19.698 22.627 1.00 6.34 C ATOM 730 N LYS A 96 -5.932 19.405 24.966 1.00 9.62 N ATOM 731 CA LYS A 96 -7.108 19.927 25.596 1.00 9.41 C ATOM 732 C LYS A 96 -6.804 20.229 27.091 1.00 11.43 C ATOM 733 O LYS A 96 -7.271 21.199 27.627 1.00 15.34 O ATOM 734 CB LYS A 96 -8.195 18.868 25.472 1.00 12.74 C ATOM 735 CG LYS A 96 -8.927 18.820 24.137 1.00 9.62 C ATOM 736 CD LYS A 96 -9.976 17.699 24.147 1.00 14.08 C ATOM 737 CE LYS A 96 -10.973 17.784 22.960 1.00 16.34 C ATOM 738 NZ LYS A 96 -11.641 16.485 22.720 1.00 20.55 N ATOM 739 N LYS A 97 -5.944 19.447 27.750 1.00 13.54 N ATOM 740 CA LYS A 97 -5.538 19.706 29.158 1.00 14.41 C ATOM 741 C LYS A 97 -4.672 20.981 29.209 1.00 13.37 C ATOM 742 O LYS A 97 -4.809 21.878 30.014 1.00 13.38 O ATOM 743 CB LYS A 97 -4.710 18.544 29.689 1.00 10.77 C ATOM 744 CG LYS A 97 -5.493 17.342 30.140 1.00 32.04 C ATOM 745 CD LYS A 97 -6.434 17.637 31.297 1.00 45.76 C ATOM 746 CE LYS A 97 -7.073 16.369 31.886 1.00 70.47 C ATOM 747 NZ LYS A 97 -8.523 16.232 31.620 1.00 59.21 N ATOM 748 N ILE A 98 -3.760 21.072 28.264 1.00 12.65 N ATOM 749 CA ILE A 98 -2.856 22.204 28.161 1.00 10.78 C ATOM 750 C ILE A 98 -3.607 23.536 27.991 1.00 8.94 C ATOM 751 O ILE A 98 -3.322 24.532 28.701 1.00 12.98 O ATOM 752 CB ILE A 98 -1.778 22.026 27.022 1.00 17.91 C ATOM 753 CG1 ILE A 98 -0.899 20.798 27.234 1.00 15.21 C ATOM 754 CG2 ILE A 98 -0.932 23.292 26.811 1.00 10.73 C ATOM 755 CD1 ILE A 98 -0.035 20.440 26.059 1.00 5.59 C ATOM 756 N VAL A 99 -4.497 23.570 26.973 1.00 12.61 N ATOM 757 CA VAL A 99 -5.194 24.822 26.643 1.00 14.92 C ATOM 758 C VAL A 99 -6.158 25.244 27.757 1.00 17.60 C ATOM 759 O VAL A 99 -6.529 26.431 27.844 1.00 21.46 O ATOM 760 CB VAL A 99 -5.863 24.788 25.223 1.00 7.93 C ATOM 761 CG1 VAL A 99 -7.102 23.930 25.230 1.00 13.13 C ATOM 762 CG2 VAL A 99 -6.203 26.159 24.648 1.00 14.05 C ATOM 763 N SER A 100 -6.529 24.274 28.623 1.00 14.94 N ATOM 764 CA SER A 100 -7.469 24.559 29.728 1.00 23.99 C ATOM 765 C SER A 100 -6.810 25.233 30.952 1.00 23.57 C ATOM 766 O SER A 100 -7.460 25.872 31.759 1.00 30.51 O ATOM 767 CB SER A 100 -8.109 23.250 30.148 1.00 15.96 C ATOM 768 OG SER A 100 -9.019 22.837 29.120 1.00 33.46 O ATOM 769 N ASP A 101 -5.495 25.061 30.981 1.00 27.50 N ATOM 770 CA ASP A 101 -4.485 25.414 31.955 1.00 38.61 C ATOM 771 C ASP A 101 -4.239 26.879 32.265 1.00 31.46 C ATOM 772 O ASP A 101 -3.422 27.194 33.137 1.00 49.53 O ATOM 773 CB ASP A 101 -3.173 24.648 31.624 1.00 32.62 C ATOM 774 CG ASP A 101 -2.133 24.566 32.715 1.00 66.21 C ATOM 775 OD1 ASP A 101 -2.482 23.821 33.747 1.00 53.53 O ATOM 776 OD2 ASP A 101 -1.045 25.095 32.609 1.00 62.33 O ATOM 777 N GLY A 102 -4.876 27.820 31.617 1.00 31.57 N ATOM 778 CA GLY A 102 -4.525 29.170 32.093 1.00 42.83 C ATOM 779 C GLY A 102 -4.082 30.192 31.049 1.00 56.99 C ATOM 780 O GLY A 102 -4.713 31.264 30.990 1.00 31.68 O ATOM 781 N ASN A 103 -2.979 29.915 30.284 1.00 23.55 N ATOM 782 CA ASN A 103 -2.573 30.864 29.246 1.00 11.97 C ATOM 783 C ASN A 103 -3.176 30.497 27.876 1.00 9.86 C ATOM 784 O ASN A 103 -2.905 31.106 26.860 1.00 13.84 O ATOM 785 CB ASN A 103 -1.070 31.114 29.177 1.00 17.92 C ATOM 786 CG ASN A 103 -0.638 31.476 30.587 1.00 65.73 C ATOM 787 OD1 ASN A 103 0.384 30.993 31.105 1.00 74.71 O ATOM 788 ND2 ASN A 103 -1.509 32.224 31.271 1.00 54.30 N ATOM 789 N GLY A 104 -4.070 29.522 27.865 1.00 10.94 N ATOM 790 CA GLY A 104 -4.733 29.138 26.601 1.00 18.78 C ATOM 791 C GLY A 104 -3.725 28.668 25.570 1.00 8.28 C ATOM 792 O GLY A 104 -2.766 27.947 25.892 1.00 12.01 O ATOM 793 N MET A 105 -3.906 29.119 24.313 1.00 13.56 N ATOM 794 CA MET A 105 -3.014 28.684 23.198 1.00 9.18 C ATOM 795 C MET A 105 -1.637 29.372 23.232 1.00 8.69 C ATOM 796 O MET A 105 -0.727 29.013 22.506 1.00 9.67 O ATOM 797 CB MET A 105 -3.739 28.882 21.838 1.00 3.51 C ATOM 798 CG MET A 105 -4.790 27.788 21.646 1.00 9.82 C ATOM 799 SD MET A 105 -5.184 27.455 19.852 1.00 12.90 S ATOM 800 CE MET A 105 -3.617 26.757 19.326 1.00 6.80 C ATOM 801 N ASN A 106 -1.509 30.373 24.105 1.00 7.08 N ATOM 802 CA ASN A 106 -0.270 31.037 24.269 1.00 4.32 C ATOM 803 C ASN A 106 0.809 30.046 24.765 1.00 8.04 C ATOM 804 O ASN A 106 2.030 30.336 24.608 1.00 11.37 O ATOM 805 CB ASN A 106 -0.396 32.190 25.241 1.00 12.62 C ATOM 806 CG ASN A 106 -1.239 33.309 24.682 1.00 16.51 C ATOM 807 OD1 ASN A 106 -0.864 33.972 23.658 1.00 9.88 O ATOM 808 ND2 ASN A 106 -2.372 33.492 25.355 1.00 15.30 N ATOM 809 N ALA A 107 0.360 28.870 25.250 1.00 8.10 N ATOM 810 CA ALA A 107 1.308 27.840 25.625 1.00 10.48 C ATOM 811 C ALA A 107 2.113 27.450 24.395 1.00 16.77 C ATOM 812 O ALA A 107 3.191 26.948 24.511 1.00 16.10 O ATOM 813 CB ALA A 107 0.585 26.599 26.143 1.00 11.40 C ATOM 814 N TRP A 108 1.577 27.639 23.205 1.00 10.51 N ATOM 815 CA TRP A 108 2.303 27.285 21.966 1.00 9.27 C ATOM 816 C TRP A 108 2.970 28.504 21.404 1.00 9.11 C ATOM 817 O TRP A 108 2.312 29.428 20.865 1.00 9.30 O ATOM 818 CB TRP A 108 1.398 26.569 20.912 1.00 4.39 C ATOM 819 CG TRP A 108 1.005 25.176 21.256 1.00 2.06 C ATOM 820 CD1 TRP A 108 1.760 24.069 21.021 1.00 10.56 C ATOM 821 CD2 TRP A 108 -0.146 24.722 21.926 1.00 4.61 C ATOM 822 NE1 TRP A 108 1.131 22.972 21.471 1.00 11.23 N ATOM 823 CE2 TRP A 108 -0.048 23.321 22.045 1.00 11.25 C ATOM 824 CE3 TRP A 108 -1.256 25.348 22.436 1.00 8.16 C ATOM 825 CZ2 TRP A 108 -1.038 22.520 22.626 1.00 7.13 C ATOM 826 CZ3 TRP A 108 -2.220 24.549 23.074 1.00 13.29 C ATOM 827 CH2 TRP A 108 -2.156 23.123 23.101 1.00 8.74 C ATOM 828 N VAL A 109 4.320 28.523 21.508 1.00 10.59 N ATOM 829 CA VAL A 109 5.046 29.672 21.044 1.00 10.72 C ATOM 830 C VAL A 109 4.800 30.025 19.545 1.00 7.07 C ATOM 831 O VAL A 109 4.617 31.199 19.228 1.00 12.32 O ATOM 832 CB VAL A 109 6.549 29.491 21.342 1.00 15.75 C ATOM 833 CG1 VAL A 109 7.068 28.242 20.605 1.00 38.18 C ATOM 834 CG2 VAL A 109 7.327 30.751 20.898 1.00 17.01 C ATOM 835 N ALA A 110 4.761 28.998 18.662 1.00 7.28 N ATOM 836 CA ALA A 110 4.506 29.281 17.232 1.00 14.92 C ATOM 837 C ALA A 110 3.122 29.845 17.031 1.00 12.74 C ATOM 838 O ALA A 110 2.902 30.659 16.125 1.00 13.19 O ATOM 839 CB ALA A 110 4.783 28.117 16.262 1.00 12.16 C ATOM 840 N TRP A 111 2.190 29.398 17.892 1.00 7.58 N ATOM 841 CA TRP A 111 0.821 29.901 17.789 1.00 5.91 C ATOM 842 C TRP A 111 0.815 31.399 18.100 1.00 9.06 C ATOM 843 O TRP A 111 0.249 32.308 17.369 1.00 6.22 O ATOM 844 CB TRP A 111 -0.240 29.136 18.618 1.00 6.54 C ATOM 845 CG TRP A 111 -1.589 29.763 18.461 1.00 9.13 C ATOM 846 CD1 TRP A 111 -2.510 29.517 17.447 1.00 5.89 C ATOM 847 CD2 TRP A 111 -2.190 30.781 19.295 1.00 10.48 C ATOM 848 NE1 TRP A 111 -3.642 30.322 17.597 1.00 5.88 N ATOM 849 CE2 TRP A 111 -3.471 31.090 18.728 1.00 5.72 C ATOM 850 CE3 TRP A 111 -1.805 31.432 20.511 1.00 4.95 C ATOM 851 CZ2 TRP A 111 -4.306 32.057 19.314 1.00 13.37 C ATOM 852 CZ3 TRP A 111 -2.658 32.382 21.061 1.00 6.90 C ATOM 853 CH2 TRP A 111 -3.906 32.666 20.489 1.00 4.12 C ATOM 854 N ARG A 112 1.497 31.701 19.218 1.00 7.90 N ATOM 855 CA ARG A 112 1.527 33.107 19.659 1.00 11.81 C ATOM 856 C ARG A 112 2.221 34.013 18.630 1.00 9.34 C ATOM 857 O ARG A 112 1.746 35.118 18.330 1.00 9.72 O ATOM 858 CB ARG A 112 2.215 33.175 21.040 1.00 18.21 C ATOM 859 CG ARG A 112 2.053 34.513 21.722 1.00 52.15 C ATOM 860 CD ARG A 112 2.813 34.593 23.056 1.00 27.12 C ATOM 861 NE ARG A 112 3.479 33.351 23.413 1.00 52.40 N ATOM 862 CZ ARG A 112 4.785 33.247 23.639 1.00 49.41 C ATOM 863 NH1 ARG A 112 5.612 34.286 23.535 1.00 53.98 N ATOM 864 NH2 ARG A 112 5.274 32.058 23.981 1.00 51.24 N ATOM 865 N ASN A 113 3.331 33.501 18.078 1.00 8.96 N ATOM 866 CA ASN A 113 4.132 34.283 17.152 1.00 15.60 C ATOM 867 C ASN A 113 3.657 34.303 15.695 1.00 17.72 C ATOM 868 O ASN A 113 3.919 35.261 14.974 1.00 16.73 O ATOM 869 CB ASN A 113 5.657 33.938 17.244 1.00 8.06 C ATOM 870 CG ASN A 113 6.192 34.297 18.636 1.00 11.97 C ATOM 871 OD1 ASN A 113 5.714 35.228 19.278 1.00 19.44 O ATOM 872 ND2 ASN A 113 7.179 33.595 19.091 1.00 9.04 N ATOM 873 N ARG A 114 2.964 33.273 15.287 1.00 7.06 N ATOM 874 CA ARG A 114 2.604 33.129 13.873 1.00 11.57 C ATOM 875 C ARG A 114 1.171 33.002 13.552 1.00 19.78 C ATOM 876 O ARG A 114 0.827 33.118 12.375 1.00 14.27 O ATOM 877 CB ARG A 114 3.309 31.830 13.395 1.00 8.51 C ATOM 878 CG ARG A 114 4.766 31.877 13.898 1.00 21.43 C ATOM 879 CD ARG A 114 5.833 31.132 13.125 1.00 27.54 C ATOM 880 NE ARG A 114 5.898 31.278 11.660 1.00 16.59 N ATOM 881 CZ ARG A 114 6.631 30.413 10.970 1.00 12.23 C ATOM 882 NH1 ARG A 114 7.271 29.439 11.649 1.00 11.43 N ATOM 883 NH2 ARG A 114 6.744 30.477 9.659 1.00 12.83 N ATOM 884 N CYS A 115 0.351 32.723 14.572 1.00 5.86 N ATOM 885 CA CYS A 115 -1.055 32.487 14.333 1.00 8.05 C ATOM 886 C CYS A 115 -1.937 33.541 14.914 1.00 18.18 C ATOM 887 O CYS A 115 -2.914 34.024 14.264 1.00 11.36 O ATOM 888 CB CYS A 115 -1.488 31.114 14.872 1.00 7.31 C ATOM 889 SG CYS A 115 -0.553 29.849 14.022 1.00 10.81 S ATOM 890 N LYS A 116 -1.630 33.796 16.196 1.00 10.46 N ATOM 891 CA LYS A 116 -2.372 34.723 16.976 1.00 9.75 C ATOM 892 C LYS A 116 -2.562 36.032 16.228 1.00 9.63 C ATOM 893 O LYS A 116 -1.583 36.599 15.729 1.00 13.85 O ATOM 894 CB LYS A 116 -1.716 34.948 18.335 1.00 12.72 C ATOM 895 CG LYS A 116 -2.557 35.791 19.284 1.00 7.87 C ATOM 896 CD LYS A 116 -1.809 35.938 20.635 1.00 15.62 C ATOM 897 CE LYS A 116 -2.607 36.597 21.773 1.00 17.04 C ATOM 898 NZ LYS A 116 -1.889 36.524 23.073 1.00 11.32 N ATOM 899 N GLY A 117 -3.862 36.462 16.131 1.00 9.19 N ATOM 900 CA GLY A 117 -4.213 37.737 15.493 1.00 22.87 C ATOM 901 C GLY A 117 -4.091 37.759 13.972 1.00 33.97 C ATOM 902 O GLY A 117 -4.044 38.799 13.371 1.00 28.79 O ATOM 903 N THR A 118 -4.019 36.612 13.340 1.00 15.57 N ATOM 904 CA THR A 118 -3.940 36.537 11.885 1.00 20.24 C ATOM 905 C THR A 118 -5.285 35.977 11.407 1.00 18.25 C ATOM 906 O THR A 118 -6.080 35.563 12.249 1.00 18.09 O ATOM 907 CB THR A 118 -2.747 35.680 11.439 1.00 13.62 C ATOM 908 OG1 THR A 118 -3.060 34.321 11.639 1.00 12.88 O ATOM 909 CG2 THR A 118 -1.455 36.072 12.193 1.00 12.89 C ATOM 910 N ASP A 119 -5.573 35.973 10.102 1.00 20.97 N ATOM 911 CA ASP A 119 -6.848 35.408 9.620 1.00 17.43 C ATOM 912 C ASP A 119 -6.693 33.892 9.567 1.00 19.50 C ATOM 913 O ASP A 119 -6.430 33.280 8.509 1.00 24.87 O ATOM 914 CB ASP A 119 -7.228 35.933 8.234 1.00 27.62 C ATOM 915 CG ASP A 119 -8.359 35.154 7.625 1.00 57.62 C ATOM 916 OD1 ASP A 119 -9.168 34.529 8.288 1.00 36.72 O ATOM 917 OD2 ASP A 119 -8.349 35.190 6.315 1.00 41.26 O ATOM 918 N VAL A 120 -6.836 33.291 10.750 1.00 20.10 N ATOM 919 CA VAL A 120 -6.637 31.835 10.895 1.00 24.77 C ATOM 920 C VAL A 120 -7.664 31.011 10.149 1.00 16.15 C ATOM 921 O VAL A 120 -7.486 29.777 9.914 1.00 13.85 O ATOM 922 CB VAL A 120 -6.476 31.372 12.367 1.00 15.61 C ATOM 923 CG1 VAL A 120 -5.271 32.055 13.060 1.00 17.17 C ATOM 924 CG2 VAL A 120 -7.761 31.691 13.097 1.00 18.96 C ATOM 925 N GLN A 121 -8.761 31.679 9.776 1.00 18.05 N ATOM 926 CA GLN A 121 -9.808 30.981 9.039 1.00 20.34 C ATOM 927 C GLN A 121 -9.285 30.499 7.694 1.00 14.19 C ATOM 928 O GLN A 121 -9.831 29.566 7.093 1.00 15.61 O ATOM 929 CB GLN A 121 -10.896 31.993 8.746 1.00 39.58 C ATOM 930 CG GLN A 121 -12.076 31.743 9.628 1.00 39.30 C ATOM 931 CD GLN A 121 -13.286 31.887 8.785 1.00 58.93 C ATOM 932 OE1 GLN A 121 -13.734 30.908 8.174 1.00 64.91 O ATOM 933 NE2 GLN A 121 -13.757 33.131 8.683 1.00 55.29 N ATOM 934 N ALA A 122 -8.222 31.161 7.229 1.00 14.53 N ATOM 935 CA ALA A 122 -7.588 30.777 5.964 1.00 13.31 C ATOM 936 C ALA A 122 -7.152 29.312 5.955 1.00 18.32 C ATOM 937 O ALA A 122 -7.123 28.622 4.924 1.00 14.96 O ATOM 938 CB ALA A 122 -6.378 31.657 5.724 1.00 18.92 C ATOM 939 N TRP A 123 -6.792 28.829 7.138 1.00 14.16 N ATOM 940 CA TRP A 123 -6.304 27.460 7.305 1.00 21.27 C ATOM 941 C TRP A 123 -7.326 26.369 7.031 1.00 12.05 C ATOM 942 O TRP A 123 -6.976 25.209 6.736 1.00 15.94 O ATOM 943 CB TRP A 123 -5.545 27.274 8.649 1.00 14.43 C ATOM 944 CG TRP A 123 -4.302 28.098 8.663 1.00 16.32 C ATOM 945 CD1 TRP A 123 -4.115 29.310 9.238 1.00 16.23 C ATOM 946 CD2 TRP A 123 -3.066 27.733 8.045 1.00 6.26 C ATOM 947 NE1 TRP A 123 -2.826 29.737 8.996 1.00 13.70 N ATOM 948 CE2 TRP A 123 -2.184 28.799 8.248 1.00 10.20 C ATOM 949 CE3 TRP A 123 -2.680 26.618 7.323 1.00 14.76 C ATOM 950 CZ2 TRP A 123 -0.873 28.742 7.761 1.00 21.80 C ATOM 951 CZ3 TRP A 123 -1.413 26.574 6.804 1.00 21.47 C ATOM 952 CH2 TRP A 123 -0.520 27.623 7.023 1.00 22.40 C ATOM 953 N ILE A 124 -8.590 26.696 7.126 1.00 10.36 N ATOM 954 CA ILE A 124 -9.573 25.659 6.831 1.00 14.89 C ATOM 955 C ILE A 124 -10.353 25.927 5.530 1.00 16.52 C ATOM 956 O ILE A 124 -11.277 25.213 5.172 1.00 16.40 O ATOM 957 CB ILE A 124 -10.480 25.421 8.019 1.00 15.33 C ATOM 958 CG1 ILE A 124 -11.016 26.778 8.456 1.00 15.55 C ATOM 959 CG2 ILE A 124 -9.624 24.846 9.164 1.00 15.50 C ATOM 960 CD1 ILE A 124 -12.489 26.742 8.908 1.00 32.95 C ATOM 961 N ARG A 125 -9.977 27.003 4.848 1.00 17.59 N ATOM 962 CA ARG A 125 -10.598 27.366 3.586 1.00 26.87 C ATOM 963 C ARG A 125 -10.424 26.259 2.569 1.00 18.05 C ATOM 964 O ARG A 125 -9.339 25.658 2.433 1.00 24.03 O ATOM 965 CB ARG A 125 -10.123 28.708 3.068 1.00 29.23 C ATOM 966 CG ARG A 125 -10.586 29.089 1.669 1.00 46.98 C ATOM 967 CD ARG A 125 -10.321 30.571 1.370 1.00 51.79 C ATOM 968 NE ARG A 125 -8.921 30.857 1.669 1.00 80.40 N ATOM 969 CZ ARG A 125 -7.924 30.424 0.892 1.00 80.57 C ATOM 970 NH1 ARG A 125 -8.167 29.752 -0.234 1.00 50.97 N ATOM 971 NH2 ARG A 125 -6.657 30.677 1.239 1.00 73.99 N ATOM 972 N GLY A 126 -11.581 25.957 1.917 1.00 23.54 N ATOM 973 CA GLY A 126 -11.741 24.959 0.858 1.00 15.85 C ATOM 974 C GLY A 126 -11.903 23.570 1.356 1.00 22.07 C ATOM 975 O GLY A 126 -11.988 22.638 0.564 1.00 33.97 O ATOM 976 N CYS A 127 -11.912 23.409 2.685 1.00 12.41 N ATOM 977 CA CYS A 127 -12.009 22.059 3.164 1.00 10.52 C ATOM 978 C CYS A 127 -13.442 21.578 3.291 1.00 13.96 C ATOM 979 O CYS A 127 -14.383 22.316 3.676 1.00 19.22 O ATOM 980 CB CYS A 127 -11.259 21.795 4.516 1.00 16.08 C ATOM 981 SG CYS A 127 -9.562 22.365 4.503 1.00 17.92 S ATOM 982 N ARG A 128 -13.609 20.299 3.023 1.00 19.23 N ATOM 983 CA ARG A 128 -14.929 19.757 3.200 1.00 29.52 C ATOM 984 C ARG A 128 -15.116 19.387 4.645 1.00 19.23 C ATOM 985 O ARG A 128 -14.626 18.345 5.078 1.00 29.24 O ATOM 986 CB ARG A 128 -15.159 18.511 2.363 1.00 35.15 C ATOM 987 CG ARG A 128 -16.602 18.043 2.481 1.00 32.92 C ATOM 988 CD ARG A 128 -16.961 17.187 1.277 1.00 38.70 C ATOM 989 NE ARG A 128 -15.779 16.498 0.721 1.00 50.55 N ATOM 990 CZ ARG A 128 -15.503 16.208 -0.581 1.00 55.70 C ATOM 991 NH1 ARG A 128 -16.293 16.551 -1.610 1.00 46.94 N ATOM 992 NH2 ARG A 128 -14.377 15.541 -0.856 1.00 48.25 N ATOM 993 N LEU A 129 -15.775 20.226 5.404 1.00 22.75 N ATOM 994 CA LEU A 129 -15.976 19.869 6.811 1.00 33.38 C ATOM 995 C LEU A 129 -17.449 19.906 7.141 1.00 72.70 C ATOM 996 O LEU A 129 -18.191 20.465 6.277 1.00 49.87 O ATOM 997 CB LEU A 129 -15.235 20.742 7.845 1.00 23.67 C ATOM 998 CG LEU A 129 -13.711 20.917 7.641 1.00 28.34 C ATOM 999 CD1 LEU A 129 -13.308 22.315 8.150 1.00 36.38 C ATOM 1000 CD2 LEU A 129 -12.970 19.868 8.434 1.00 43.93 C ATOM 1001 OXT LEU A 129 -17.769 19.416 8.251 1.00 70.56 O TER 1002 LEU A 129 END bio3d/inst/examples/crambin.inpcrd0000644000176200001440000005546014046015221016666 0ustar liggesusersdefault_name 639 -7.6740000 -4.4150000 -3.5150000 -8.1310000 -4.5230000 -2.6780000 -8.3170000 -4.3550000 -4.2250000 -7.0990000 -5.1690000 -3.6660000 -6.8580000 -3.1690000 -3.4770000 -7.4350000 -2.3780000 -3.4280000 -5.9250000 -3.1900000 -2.3010000 -5.3500000 -3.9700000 -2.3570000 -5.0540000 -1.9550000 -2.2320000 -4.4730000 -2.0060000 -1.4700000 -4.5210000 -1.8860000 -3.0270000 -5.6030000 -1.1710000 -2.1560000 -6.7140000 -3.2670000 -1.1240000 -7.1680000 -3.9500000 -1.1350000 -6.0560000 -3.1320000 -4.7430000 -5.5470000 -4.1640000 -5.1800000 -5.9320000 -1.9510000 -5.3350000 -6.2860000 -1.2200000 -5.0510000 -5.1600000 -1.8100000 -6.5500000 -4.9520000 -2.7000000 -6.9020000 -5.9170000 -1.0440000 -7.6210000 -5.3530000 -0.9380000 -8.4030000 -7.1740000 -1.7800000 -8.0320000 -7.6390000 -1.2820000 -8.7080000 -6.9470000 -2.6450000 -8.3820000 -7.7520000 -1.8920000 -7.2740000 -6.2510000 0.2300000 -7.1040000 -6.7210000 0.1480000 -6.4360000 -3.8320000 -1.1010000 -6.2280000 -3.7800000 -0.1720000 -5.4210000 -2.7720000 -1.5590000 -6.9030000 -2.8150000 -2.1940000 -7.4800000 -1.4300000 -1.0300000 -6.7340000 -1.4480000 -0.1920000 -6.2250000 -0.5210000 -2.0450000 -6.0300000 -0.3540000 -2.7830000 -6.6360000 0.3170000 -1.6090000 -5.8080000 -1.1970000 -2.7350000 -4.5050000 -0.8590000 -0.7730000 -8.1370000 -0.9630000 -1.6310000 -9.0010000 -0.2400000 0.3810000 -8.3650000 -0.0920000 0.9840000 -7.7690000 0.2480000 0.7160000 -9.6970000 0.0530000 -0.0280000 -10.3050000 -0.4740000 1.9550000 -10.2190000 -0.4040000 2.6610000 -9.5570000 -0.0540000 2.2370000 -11.0470000 -2.2380000 1.6770000 -10.5550000 1.7670000 0.9460000 -9.6990000 2.3370000 1.4130000 -8.7180000 2.4290000 0.6140000 -10.8310000 1.8690000 -0.0700000 -12.0100000 1.1340000 0.4420000 -12.3830000 1.5970000 -0.9730000 -11.7830000 3.0460000 -0.0930000 -12.9740000 3.1150000 0.7440000 -13.4600000 2.9830000 -0.8460000 -13.5820000 4.2290000 -0.2600000 -12.0750000 5.0400000 0.0480000 -12.5070000 4.3160000 -1.1810000 -11.7830000 3.8990000 0.6430000 -10.8710000 4.2670000 0.2410000 -10.0570000 4.5040000 2.0310000 -11.0620000 5.7030000 2.1890000 -10.8550000 3.7040000 3.0040000 -11.4760000 2.8740000 2.8950000 -11.6690000 4.1730000 4.3770000 -11.6440000 4.7860000 4.6060000 -10.9150000 4.8990000 4.5710000 -12.9670000 5.3390000 5.4360000 -12.9660000 5.5510000 3.8630000 -13.0810000 3.9730000 4.5240000 -14.0240000 4.3590000 4.6280000 -14.7400000 2.9580000 5.3060000 -11.5700000 1.8020000 4.8620000 -11.6360000 3.2380000 6.5980000 -11.4440000 4.0340000 6.9150000 -11.3690000 2.1980000 7.6100000 -11.4200000 1.5870000 7.4120000 -10.6800000 2.8300000 8.9880000 -11.1440000 3.6160000 9.0760000 -11.7050000 1.8790000 10.1080000 -11.4920000 2.3050000 10.9480000 -11.3080000 1.6580000 10.0500000 -12.4250000 1.0850000 10.0190000 -10.9600000 3.2870000 9.0220000 -9.6810000 2.5090000 8.9200000 -9.1100000 3.9020000 8.2870000 -9.5300000 3.9740000 10.2720000 -9.2880000 4.2250000 10.2120000 -8.3630000 4.7550000 10.3840000 -9.8340000 3.3750000 11.0110000 -9.4180000 1.3790000 7.5960000 -12.7120000 0.1530000 7.6610000 -12.6560000 2.0290000 7.5250000 -13.8680000 2.8830000 7.4670000 -13.9520000 1.2920000 7.5410000 -15.1220000 0.7310000 8.3440000 -15.1490000 2.2730000 7.6010000 -16.3370000 3.0350000 7.0180000 -16.1380000 1.6500000 7.0910000 -17.6060000 2.2940000 7.1510000 -18.3150000 1.3870000 6.1770000 -17.4780000 0.8820000 7.6280000 -17.8140000 2.8220000 8.9940000 -16.5300000 3.4190000 8.9920000 -17.2820000 2.0930000 9.5970000 -16.6910000 3.2960000 9.2550000 -15.7370000 0.3730000 6.3260000 -15.2020000 -0.7500000 6.4370000 -15.6800000 0.8280000 5.1700000 -14.7290000 1.6100000 5.0470000 -14.3940000 -0.0220000 3.9840000 -14.7550000 -0.3070000 3.8300000 -15.6800000 0.7370000 2.7550000 -14.3080000 0.1480000 1.9970000 -14.3380000 1.4810000 2.6150000 -14.8990000 1.0510000 2.8910000 -13.4110000 -1.2950000 4.1980000 -13.9110000 -2.3800000 3.7880000 -14.3100000 -1.1560000 4.8030000 -12.7340000 -0.4050000 5.0400000 -12.3900000 -2.3280000 5.1200000 -11.9110000 -2.8330000 4.2960000 -11.7500000 -1.8850000 5.6660000 -10.5630000 -1.4000000 4.9720000 -10.0900000 -1.3040000 6.4290000 -10.7110000 -3.0370000 6.1260000 -9.6640000 -2.6650000 6.5670000 -8.8840000 -3.5890000 6.7500000 -10.1610000 -3.9400000 4.9980000 -9.1730000 -4.7050000 5.3770000 -8.7130000 -4.2300000 4.4670000 -9.9300000 -3.2370000 4.1300000 -8.2490000 -2.4310000 4.3390000 -8.0340000 -3.7800000 3.0740000 -7.6630000 -5.0400000 2.7300000 -7.9010000 -5.5210000 3.2010000 -8.4370000 -5.3780000 2.0400000 -7.5140000 -3.0360000 2.3450000 -6.8450000 -2.2200000 2.5690000 -6.6930000 -3.3730000 1.6570000 -6.4560000 -3.2610000 6.1100000 -12.6000000 -4.4770000 5.9360000 -12.5650000 -2.7150000 7.1610000 -13.1950000 -1.8740000 7.3390000 -13.2230000 -3.5740000 8.1170000 -13.8700000 -4.2250000 8.4710000 -13.2300000 -2.7510000 9.2800000 -14.4030000 -2.0390000 8.9360000 -14.9640000 -3.3270000 9.8690000 -14.9160000 -2.1900000 10.0000000 -13.3350000 -2.4090000 9.6600000 -12.6220000 -4.3400000 7.4360000 -15.0020000 -5.5380000 7.7180000 -15.2090000 -3.6730000 6.5540000 -15.7430000 -2.8400000 6.3620000 -15.6440000 -4.3370000 5.8280000 -16.8130000 -4.7880000 6.4700000 -17.4010000 -3.3070000 5.0660000 -17.6500000 -2.7160000 4.5780000 -17.0540000 -3.7710000 4.4470000 -18.2350000 -2.4600000 5.9670000 -18.5050000 -2.8470000 7.0960000 -18.8130000 -1.3010000 5.4720000 -18.9080000 -0.7780000 5.9460000 -19.4000000 -1.0700000 4.6750000 -18.6790000 -5.4030000 4.8630000 -16.2610000 -6.4700000 4.7000000 -16.8510000 -5.1180000 4.2290000 -15.1310000 -4.3690000 4.2960000 -14.7130000 -6.0790000 3.3410000 -14.4860000 -6.3150000 2.6190000 -15.1050000 -5.4410000 2.7090000 -13.2380000 -4.6100000 2.2800000 -13.4960000 -5.2620000 3.4090000 -12.5910000 -6.3000000 1.6740000 -12.5660000 -7.2090000 2.0230000 -11.5840000 -7.3030000 2.9140000 -11.3360000 -7.9950000 1.0430000 -10.9730000 -8.6070000 1.2810000 -10.3140000 -7.8550000 -0.2780000 -11.3400000 -8.3790000 -0.9290000 -10.9330000 -6.9560000 -0.6360000 -12.3100000 -6.8650000 -1.5280000 -12.5570000 -6.1780000 0.3350000 -12.9150000 -5.5690000 0.0890000 -13.5730000 -7.3640000 4.0990000 -14.1270000 -8.4800000 3.6170000 -14.3500000 -7.2130000 5.3000000 -13.5710000 -6.4560000 5.6820000 -13.4240000 -8.3710000 6.0740000 -13.1590000 -8.9330000 5.5040000 -12.5940000 -7.9600000 7.2760000 -12.3150000 -7.2250000 7.7350000 -12.7510000 -8.7180000 7.8730000 -12.2200000 -7.5050000 6.8590000 -10.9270000 -7.8870000 5.7990000 -10.4290000 -6.7100000 7.6990000 -10.2900000 -6.4260000 7.5080000 -9.5010000 -6.4760000 8.4380000 -10.6640000 -9.2220000 6.5010000 -14.3560000 -10.4490000 6.5460000 -14.2470000 -8.5930000 6.8200000 -15.4820000 -7.7400000 6.8660000 -15.5800000 -9.3670000 7.1250000 -16.6770000 -10.0660000 7.7680000 -16.4340000 -8.4910000 7.7880000 -17.7560000 -7.6860000 7.2480000 -17.8970000 -9.2420000 7.8800000 -19.0740000 -8.6750000 8.2960000 -19.7280000 -9.4790000 6.9950000 -19.3610000 -10.0350000 8.4060000 -18.9460000 -8.0650000 9.1610000 -17.2790000 -7.5200000 9.5710000 -17.9540000 -8.8480000 9.6940000 -17.1220000 -7.5640000 9.0670000 -16.4650000 -10.0720000 5.8540000 -17.1860000 -11.2460000 5.9030000 -17.5550000 -9.3690000 4.7170000 -17.1970000 -8.5420000 4.6610000 -16.9670000 -9.9550000 3.4420000 -17.6090000 -10.2100000 3.4980000 -18.5530000 -8.8830000 2.3580000 -17.4710000 -8.1330000 2.5920000 -18.0410000 -8.5920000 2.3280000 -16.5460000 -9.4180000 0.6890000 -17.9300000 -11.2190000 3.1160000 -16.7930000 -12.1870000 2.5620000 -17.3240000 -11.2220000 3.4720000 -15.5140000 -10.5770000 3.8840000 -15.1200000 -12.3660000 3.1790000 -14.6480000 -12.6790000 2.2710000 -14.8420000 -11.9120000 3.2130000 -13.1830000 -11.4110000 4.0290000 -13.0290000 -12.6960000 3.1930000 -12.6120000 -11.0190000 2.0320000 -12.7980000 -10.3810000 1.8690000 -13.5100000 -10.5540000 2.2410000 -11.9720000 -11.8300000 0.7530000 -12.5790000 -12.4680000 0.6480000 -13.3020000 -11.2290000 -0.0070000 -12.5450000 -12.5690000 0.8170000 -11.3120000 -12.2630000 1.3440000 -10.7060000 -13.6700000 0.1320000 -11.0190000 -14.2490000 -0.6470000 -11.9000000 -13.9120000 -0.7330000 -12.6860000 -14.9660000 -1.0750000 -11.6910000 -14.1900000 0.2150000 -9.8050000 -13.8330000 0.7340000 -9.2200000 -14.9200000 -0.2000000 -9.6220000 -13.5510000 4.1230000 -14.8260000 -14.6500000 3.7960000 -14.3800000 -13.3720000 5.2750000 -15.4690000 -12.6390000 5.5150000 -15.8500000 -14.4630000 6.2600000 -15.5740000 -14.6770000 6.5620000 -14.6670000 -14.0490000 7.5050000 -16.3670000 -13.5640000 7.2180000 -17.1570000 -14.8520000 7.9780000 -16.6360000 -13.1630000 8.4970000 -15.6240000 -12.3800000 8.0290000 -15.2950000 -12.6890000 9.5700000 -16.5950000 -12.1310000 10.1930000 -16.1240000 -12.1900000 9.1530000 -17.3020000 -13.4530000 10.0230000 -16.9580000 -13.8700000 9.1210000 -14.4250000 -13.2700000 9.7350000 -13.9950000 -14.6510000 9.5870000 -14.7310000 -14.1210000 8.4250000 -13.8140000 -15.7620000 5.6820000 -16.1630000 -16.8410000 5.9520000 -15.6320000 -15.7050000 4.8950000 -17.2510000 -14.5800000 4.6830000 -18.1760000 -13.8630000 4.2080000 -17.7300000 -14.2740000 5.5320000 -18.5320000 -15.1580000 3.8410000 -19.2700000 -14.9040000 2.9130000 -19.1470000 -14.8520000 4.1600000 -20.1340000 -16.6200000 3.9520000 -19.2070000 -17.0350000 3.1020000 -19.4240000 -16.9350000 4.6470000 -19.8050000 -16.9570000 4.3290000 -17.7620000 -17.6550000 5.0170000 -17.7690000 -17.4660000 3.1170000 -16.9860000 -18.5360000 2.6210000 -17.3130000 -16.7190000 2.6460000 -15.9970000 -15.9590000 2.9730000 -15.7630000 -17.1420000 1.5060000 -15.2120000 -16.9910000 1.6990000 -14.2730000 -18.0940000 1.3720000 -15.3410000 -16.4350000 0.1930000 -15.5380000 -16.8240000 -0.8440000 -15.0140000 -15.3990000 0.2510000 -16.3740000 -15.1110000 0.9810000 -16.7250000 -14.6430000 -0.9250000 -16.7810000 -15.1880000 -1.5090000 -17.3490000 -13.3870000 -0.4760000 -17.5500000 -12.7550000 -0.0990000 -16.9180000 -12.7070000 -1.6340000 -18.2430000 -11.9300000 -1.3240000 -18.7130000 -12.4390000 -2.2910000 -17.5960000 -13.3100000 -2.0400000 -18.8700000 -13.7440000 0.5380000 -18.5020000 -14.0680000 1.1850000 -18.1150000 -14.1660000 -1.6980000 -15.5540000 -13.6500000 -1.0990000 -14.6220000 -14.2820000 -3.0230000 -15.5710000 -14.7023529 -3.5035805 -16.3535887 -13.8290000 -3.8160000 -14.4360000 -14.3650000 -3.5860000 -13.6480000 -13.9990000 -5.3010000 -14.7080000 -13.7960000 -5.8000000 -13.9010000 -14.9110000 -5.4730000 -14.9900000 -13.1080000 -5.6960000 -15.7390000 -12.6700000 -5.0510000 -15.9940000 -12.3650000 -3.5400000 -14.1130000 -11.5310000 -3.3260000 -15.0030000 -12.0460000 -3.6140000 -12.8270000 -12.6060000 -3.7650000 -12.1920000 -10.6790000 -3.4370000 -12.3870000 -10.3950000 -2.5300000 -12.6270000 -10.5390000 -3.5720000 -10.8720000 -10.9560000 -4.4020000 -10.5940000 -9.5950000 -3.5890000 -10.6470000 -11.1850000 -2.4390000 -10.0750000 -10.8740000 -1.5900000 -10.4280000 -12.1490000 -2.5010000 -10.1670000 -10.8560000 -2.4760000 -8.5940000 -10.5700000 -3.5530000 -8.0650000 -10.9330000 -1.4190000 -7.9400000 -9.7180000 -4.4120000 -13.0750000 -8.5930000 -4.0310000 -13.4050000 -10.1410000 -5.6610000 -13.2850000 -10.9300000 -5.9520000 -13.1060000 -9.2360000 -6.6550000 -13.8600000 -8.4290000 -6.6960000 -13.3060000 -9.8870000 -8.0410000 -13.8240000 -9.2800000 -8.6810000 -14.2040000 -10.0770000 -8.2730000 -12.9120000 -10.7000000 -8.0170000 -14.3330000 -8.7970000 -6.2890000 -15.2840000 -7.6510000 -6.5440000 -15.6700000 -9.7020000 -5.7270000 -16.0840000 -10.5240000 -5.5910000 -15.8740000 -9.3400000 -5.2860000 -17.4280000 -8.8070000 -5.9900000 -17.8530000 -10.6000000 -5.0640000 -18.3010000 -11.2710000 -4.6010000 -17.7750000 -10.2960000 -4.2480000 -19.5410000 -11.1040000 -4.1380000 -20.0480000 -9.9570000 -3.3910000 -19.2750000 -9.6410000 -4.7120000 -20.0660000 -11.1670000 -6.4040000 -18.7590000 -11.2140000 -7.0020000 -17.9960000 -12.0560000 -6.2610000 -19.1190000 -10.3360000 -7.0840000 -19.8300000 -10.7520000 -7.9160000 -20.0670000 -10.2890000 -6.5110000 -20.5990000 -9.4540000 -7.2440000 -19.4860000 -8.4710000 -4.0140000 -17.3770000 -7.5190000 -3.8680000 -18.1410000 -8.7930000 -3.0850000 -16.4790000 -9.4780000 -3.0990000 -15.9600000 -7.9560000 -1.9010000 -16.3690000 -7.8550000 -1.5130000 -17.2630000 -8.5820000 -0.8380000 -15.4830000 -8.8130000 -1.2360000 -14.6290000 -7.9420000 -0.1210000 -15.3510000 -10.0870000 -0.1190000 -16.1860000 -6.5420000 -2.2650000 -15.8630000 -5.5690000 -1.5980000 -16.2380000 -6.4200000 -3.3290000 -15.0690000 -7.0830000 -3.8000000 -14.7890000 -5.1240000 -3.8010000 -14.5930000 -4.6670000 -3.0650000 -14.1340000 -5.3120000 -4.9280000 -13.5950000 -4.4500000 -5.2250000 -13.2930000 -5.8260000 -4.6040000 -12.8520000 -5.7760000 -5.6510000 -14.0240000 -4.2380000 -4.2480000 -15.7620000 -3.1100000 -3.7750000 -15.8980000 -4.7270000 -5.1540000 -16.6080000 -5.5120000 -5.5040000 -16.5690000 -3.8900000 -5.6200000 -17.7070000 -3.0210000 -5.8730000 -17.3330000 -4.4560000 -6.8710000 -18.4000000 -3.9250000 -7.0570000 -19.1900000 -4.3730000 -8.0740000 -17.4970000 -4.7300000 -8.8450000 -17.9450000 -3.4580000 -8.2450000 -17.2620000 -4.8770000 -7.9170000 -16.6960000 -5.8010000 -6.6060000 -18.8020000 -6.1170000 -7.2650000 -19.1730000 -3.6230000 -4.5120000 -18.7410000 -2.6240000 -4.5440000 -19.4530000 -4.5250000 -3.5420000 -18.8310000 -5.2510000 -3.5010000 -18.3710000 -4.3300000 -2.4380000 -19.7570000 -4.1090000 -2.7980000 -20.6410000 -5.6330000 -1.6700000 -19.8740000 -6.3450000 -2.2990000 -20.0690000 -5.8100000 -1.2330000 -19.0260000 -5.6590000 -0.6170000 -20.9360000 -5.2550000 -0.8920000 -22.2460000 -4.9470000 -1.7440000 -22.4590000 -5.2910000 0.0690000 -23.2190000 -5.0180000 -0.1290000 -24.0860000 -5.7500000 1.3110000 -22.9080000 -5.7820000 2.2580000 -23.8960000 -5.3110000 2.8970000 -23.6880000 -6.1620000 1.6160000 -21.6280000 -6.4670000 2.4710000 -21.4260000 -6.1130000 0.6510000 -20.6520000 -6.3960000 0.8550000 -19.7900000 -3.1950000 -1.5010000 -19.3280000 -2.4700000 -0.9750000 -20.1640000 -3.0690000 -1.2950000 -18.0180000 -3.4860000 -1.7470000 -17.4170000 -2.1920000 -0.2610000 -17.4750000 -1.9370000 0.3440000 -18.2020000 -2.9230000 0.5720000 -16.4100000 -2.3160000 1.2550000 -16.0830000 -4.1240000 1.2800000 -17.0160000 -4.5730000 1.7970000 -16.3440000 -3.8380000 1.8660000 -17.7210000 -4.7370000 0.6350000 -17.3760000 -3.3040000 -0.2660000 -15.3080000 -3.8030000 -0.8620000 -15.5690000 -0.9100000 -0.7560000 -16.8190000 0.0150000 0.0370000 -16.6160000 -0.8820000 -2.0260000 -16.4240000 -1.4930000 -2.6030000 -16.6070000 0.2010000 -2.5550000 -15.6390000 0.3490000 -3.4800000 -15.8880000 1.0090000 -2.0560000 -15.8390000 -0.0210000 -2.5040000 -14.1340000 0.8200000 -2.9910000 -13.3930000 -1.1360000 -1.9370000 -13.6760000 -1.6960000 -1.5020000 -14.1630000 -1.5030000 -2.0130000 -12.2690000 -0.7290000 -1.7740000 -11.7170000 -2.6470000 -1.0320000 -11.9530000 -3.4280000 -1.2860000 -12.4700000 -2.8490000 -1.0810000 -11.0060000 -2.2570000 0.7030000 -12.3510000 -1.9150000 -3.4590000 -11.9290000 -2.1780000 -4.2660000 -12.8150000 -1.9560000 -3.7540000 -10.6380000 -1.7810000 -3.1880000 -10.0150000 -2.3010000 -5.0670000 -10.1370000 -2.6710000 -5.5960000 -10.8740000 -1.0530000 -5.8170000 -9.6000000 -1.3330000 -6.7070000 -9.3330000 -0.0210000 -5.9690000 -10.7220000 0.7460000 -6.4340000 -10.3790000 -0.4130000 -6.4690000 -11.4410000 0.2350000 -5.0970000 -11.0300000 -0.4650000 -5.1190000 -8.3650000 -0.0950000 -4.2650000 -8.6360000 -1.1740000 -4.9800000 -7.7180000 0.6340000 -5.9010000 -7.6830000 0.9470000 -5.4020000 -6.9260000 0.2830000 -6.7470000 -7.3960000 1.3520000 -6.0380000 -8.3060000 -3.3820000 -4.9540000 -9.0570000 -3.5650000 -3.9090000 -8.4390000 -4.0700000 -6.0750000 -8.8480000 -3.9570000 -6.7910000 -9.3110000 -5.0850000 -6.2170000 -7.8190000 -5.2240000 -5.3630000 -7.3600000 -6.4270000 -6.7050000 -8.3990000 -6.2870000 -7.5860000 -8.7790000 -7.4530000 -6.8320000 -7.2820000 -8.2840000 -7.1360000 -7.6540000 -7.1320000 -7.4640000 -6.6350000 -7.5730000 -5.9730000 -6.8700000 -6.8980000 -5.7790000 -9.5170000 -7.1480000 -4.9240000 -9.1330000 -6.1740000 -5.6580000 -10.1510000 -8.0890000 -6.3170000 -10.2680000 -8.3340000 -5.6910000 -10.9540000 -7.8540000 -7.1600000 -10.6630000 -8.8180000 -6.4340000 -9.6550000 -4.5900000 -7.2500000 -6.8170000 -4.2110000 -8.3620000 -7.2000000 -4.5960000 -6.8770000 -5.5440000 -4.8200000 -6.0930000 -5.2720000 -4.2150000 -7.7850000 -4.4670000 -4.0460000 -8.6740000 -4.8440000 -2.9120000 -7.3060000 -3.7570000 -2.6790000 -7.9580000 -3.0770000 -1.7880000 -7.2460000 -4.7590000 -0.9890000 -6.9510000 -4.3160000 -1.6530000 -8.1220000 -5.1290000 -2.0230000 -6.6290000 -5.4560000 -3.1120000 -5.9450000 -3.0700000 -3.2020000 -5.2620000 -3.7530000 -3.9210000 -5.9820000 -2.5360000 -1.9870000 -5.5400000 -2.1650000 -2.1900000 -4.6850000 -1.7790000 -1.8910000 -6.1980000 -1.4730000 -1.1780000 -5.4840000 -2.6790000 -5.3550000 -7.9050000 -3.4710000 -6.1820000 -7.0070000 -3.3400000 -5.4030000 -9.0200000 -2.7290000 -4.6820000 -10.2780000 -2.9850000 -3.7310000 -10.1550000 -2.8410000 -4.8650000 -10.5920000 -3.8840000 -5.2330000 -11.2240000 -1.9900000 -4.6160000 -11.3220000 -1.2480000 -5.3930000 -12.0860000 -2.4050000 -6.5190000 -10.6860000 -1.4810000 -6.6000000 -10.8430000 -0.5270000 -7.2650000 -11.0840000 -1.9560000 -6.4860000 -9.1760000 -1.7510000 -7.3390000 -8.9080000 -2.1540000 -6.2750000 -8.3780000 -0.4720000 -7.2480000 -8.0870000 0.2230000 -5.0320000 -8.0520000 -0.1540000 -4.3400000 -8.2660000 -0.6170000 -4.7340000 -7.2870000 1.0350000 -5.3750000 -7.5060000 1.7300000 -3.8460000 -7.5140000 1.3520000 -4.7900000 -5.7940000 0.7810000 -5.3440000 -5.3560000 -0.2190000 -4.2110000 -5.0260000 1.6960000 -3.7540000 -5.3340000 2.3560000 -4.2910000 -3.5790000 1.6770000 -4.8210000 -3.3080000 0.8990000 -5.0170000 -3.0840000 2.9220000 -5.0620000 -2.1260000 2.8950000 -5.9020000 -3.4540000 2.9350000 -4.5310000 -3.3680000 3.6990000 -2.9170000 -2.9190000 1.5520000 -2.8250000 -1.6980000 1.5030000 -1.8580000 -3.7240000 1.4990000 -1.9070000 -4.5790000 1.4140000 -0.4880000 -3.2200000 1.5810000 -0.5130000 -2.2520000 1.7340000 0.2570000 -3.8680000 2.7590000 0.4100000 -4.8070000 2.5720000 1.5910000 -3.1980000 2.9930000 2.0430000 -3.6150000 3.7310000 2.1390000 -3.2750000 2.2080000 1.4610000 -2.2680000 3.1920000 -0.5350000 -3.7360000 3.9420000 -0.1480000 -4.0780000 4.5780000 0.2630000 -3.4710000 0.2730000 0.7160000 -4.5810000 -0.0090000 0.3650000 -2.4350000 -0.5510000 0.0520000 -1.6510000 -0.3880000 1.0320000 -2.5500000 -1.8290000 0.7170000 -3.3540000 -2.2910000 0.7170000 -1.3360000 -2.6990000 0.9430000 -0.5320000 -2.2050000 1.2510000 -1.3860000 -3.5070000 -1.0100000 -1.2120000 -3.1880000 2.5410000 -2.6540000 -1.6530000 3.1150000 -1.9740000 -0.8110000 3.1880000 -3.4860000 -2.4800000 2.6190000 -4.3360000 -3.5350000 2.0830000 -3.8070000 -4.1450000 2.1060000 -5.0620000 -3.1450000 3.8420000 -4.8720000 -4.2360000 4.0950000 -4.2920000 -4.9710000 3.6860000 -5.7760000 -4.5510000 4.9060000 -4.8800000 -3.2270000 5.7790000 -4.8180000 -3.6450000 4.8450000 -5.6690000 -2.6660000 4.6410000 -3.6290000 -2.3920000 4.9210000 -3.7820000 -1.4650000 5.3700000 -2.4160000 -2.9620000 4.8140000 -1.5970000 -3.6860000 6.6520000 -2.3240000 -2.6240000 7.0820000 -2.9300000 -2.1910000 7.4530000 -1.1640000 -2.9640000 7.0320000 -0.3750000 -2.5880000 8.3260000 -1.2590000 -2.5540000 7.6650000 -0.9110000 -4.4490000 7.9530000 0.2280000 -4.8210000 7.5480000 -1.9440000 -5.2850000 7.4020000 -2.7540000 -5.0380000 7.6630000 -1.7720000 -6.7280000 8.2030000 -0.9660000 -6.8720000 8.4360000 -2.9180000 -7.4120000 8.4590000 -2.7510000 -8.3670000 9.3410000 -2.9330000 -7.0620000 7.8400000 -4.2880000 -7.2010000 7.0820000 -4.5060000 -6.2370000 8.1710000 -5.1670000 -8.0390000 6.3200000 -1.4950000 -7.4060000 6.2850000 -1.2750000 -8.6170000 5.2440000 -1.4640000 -6.6170000 5.2590000 -1.6970000 -5.7890000 3.9170000 -1.0320000 -7.0670000 4.0050000 -0.5980000 -7.9410000 2.9380000 -2.1990000 -7.2220000 2.9560000 -2.7340000 -6.4130000 2.0460000 -1.8450000 -7.3640000 3.2680000 -3.1020000 -8.3840000 4.2180000 -4.1200000 -8.2800000 4.6620000 -4.2520000 -7.4740000 4.5060000 -4.9330000 -9.3530000 5.1400000 -5.6080000 -9.2730000 3.8510000 -4.7290000 -10.5480000 4.1420000 -5.5570000 -11.6110000 4.4300000 -5.1150000 -12.2390000 2.9060000 -3.7370000 -10.6700000 2.4650000 -3.6070000 -11.4780000 2.6280000 -2.9290000 -9.5940000 1.9920000 -2.2560000 -9.6810000 3.3990000 0.0220000 -6.0670000 2.3670000 -0.1430000 -5.4140000 4.1660000 1.1050000 -5.9750000 4.7800000 1.2970000 -6.5460000 4.0590000 2.0880000 -4.9060000 3.7970000 1.6310000 -4.0800000 5.4270000 2.6970000 -4.6900000 5.3710000 3.3480000 -3.9870000 6.0430000 2.0020000 -4.4460000 5.7140000 3.1180000 -5.5040000 3.0610000 3.2030000 -5.1600000 2.8240000 4.0260000 -4.2650000 2.5180000 3.2510000 -6.3670000 2.6360000 2.6430000 -6.9640000 1.6640000 4.3360000 -6.8160000 1.6380000 5.0200000 -6.1150000 2.2820000 4.9750000 -8.0620000 2.2780000 4.3290000 -8.7850000 1.7630000 5.7560000 -8.3090000 3.7140000 5.4140000 -7.8290000 4.6530000 4.8560000 -8.4000000 3.8900000 6.4110000 -6.9800000 4.6840000 6.6990000 -6.8130000 3.2120000 6.7720000 -6.5950000 0.2210000 3.8910000 -7.0770000 -0.1680000 2.7730000 -6.6680000 -0.5060000 4.6990000 -7.6630000 bio3d/inst/examples/1dpx.pdb0000644000176200001440000036663014046015221015421 0ustar liggesusersHEADER HYDROLASE 28-DEC-99 1DPX TITLE STRUCTURE OF HEN EGG-WHITE LYSOZYME COMPND MOL_ID: 1; COMPND 2 MOLECULE: LYSOZYME; COMPND 3 CHAIN: A; COMPND 4 EC: 3.2.1.17 SOURCE MOL_ID: 1; SOURCE 2 ORGANISM_SCIENTIFIC: GALLUS GALLUS; SOURCE 3 ORGANISM_COMMON: CHICKEN; SOURCE 4 ORGANISM_TAXID: 9031; SOURCE 5 TISSUE: EGG-WHITE KEYWDS PROTEIN-CHLORIDE COMPLEX, HYDROLASE EXPDTA X-RAY DIFFRACTION AUTHOR M.S.WEISS,G.J.PALM,R.HILGENFELD REVDAT 4 24-FEB-09 1DPX 1 VERSN REVDAT 3 09-OCT-02 1DPX 1 REMARK REVDAT 2 30-AUG-00 1DPX 1 JRNL REVDAT 1 03-JAN-00 1DPX 0 JRNL AUTH M.S.WEISS,G.J.PALM,R.HILGENFELD JRNL TITL CRYSTALLIZATION, STRUCTURE SOLUTION AND REFINEMENT JRNL TITL 2 OF HEN EGG-WHITE LYSOZYME AT PH 8.0 IN THE JRNL TITL 3 PRESENCE OF MPD. JRNL REF ACTA CRYSTALLOGR.,SECT.D V. 56 952 2000 JRNL REFN ISSN 0907-4449 JRNL PMID 10944331 JRNL DOI 10.1107/S0907444900006685 REMARK 1 REMARK 2 REMARK 2 RESOLUTION. 1.65 ANGSTROMS. REMARK 3 REMARK 3 REFINEMENT. REMARK 3 PROGRAM : REFMAC REMARK 3 AUTHORS : MURSHUDOV,VAGIN,DODSON REMARK 3 REMARK 3 DATA USED IN REFINEMENT. REMARK 3 RESOLUTION RANGE HIGH (ANGSTROMS) : 1.65 REMARK 3 RESOLUTION RANGE LOW (ANGSTROMS) : 40.00 REMARK 3 DATA CUTOFF (SIGMA(F)) : 0.000 REMARK 3 COMPLETENESS FOR RANGE (%) : NULL REMARK 3 NUMBER OF REFLECTIONS : 13961 REMARK 3 REMARK 3 FIT TO DATA USED IN REFINEMENT. REMARK 3 CROSS-VALIDATION METHOD : NULL REMARK 3 FREE R VALUE TEST SET SELECTION : RANDOM REMARK 3 R VALUE (WORKING + TEST SET) : NULL REMARK 3 R VALUE (WORKING SET) : 0.187 REMARK 3 FREE R VALUE : 0.246 REMARK 3 FREE R VALUE TEST SET SIZE (%) : NULL REMARK 3 FREE R VALUE TEST SET COUNT : 694 REMARK 3 REMARK 3 NUMBER OF NON-HYDROGEN ATOMS USED IN REFINEMENT. REMARK 3 PROTEIN ATOMS : 1013 REMARK 3 NUCLEIC ACID ATOMS : 0 REMARK 3 HETEROGEN ATOMS : 2 REMARK 3 SOLVENT ATOMS : 177 REMARK 3 REMARK 3 B VALUES. REMARK 3 FROM WILSON PLOT (A**2) : 17.20 REMARK 3 MEAN B VALUE (OVERALL, A**2) : NULL REMARK 3 OVERALL ANISOTROPIC B VALUE. REMARK 3 B11 (A**2) : NULL REMARK 3 B22 (A**2) : NULL REMARK 3 B33 (A**2) : NULL REMARK 3 B12 (A**2) : NULL REMARK 3 B13 (A**2) : NULL REMARK 3 B23 (A**2) : NULL REMARK 3 REMARK 3 ESTIMATED OVERALL COORDINATE ERROR. REMARK 3 ESU BASED ON R VALUE (A): NULL REMARK 3 ESU BASED ON FREE R VALUE (A): NULL REMARK 3 ESU BASED ON MAXIMUM LIKELIHOOD (A): NULL REMARK 3 ESU FOR B VALUES BASED ON MAXIMUM LIKELIHOOD (A**2): NULL REMARK 3 REMARK 3 RMS DEVIATIONS FROM IDEAL VALUES. REMARK 3 DISTANCE RESTRAINTS. RMS SIGMA REMARK 3 BOND LENGTH (A) : NULL ; NULL REMARK 3 ANGLE DISTANCE (A) : NULL ; NULL REMARK 3 INTRAPLANAR 1-4 DISTANCE (A) : NULL ; NULL REMARK 3 H-BOND OR METAL COORDINATION (A) : NULL ; NULL REMARK 3 REMARK 3 PLANE RESTRAINT (A) : NULL ; NULL REMARK 3 CHIRAL-CENTER RESTRAINT (A**3) : NULL ; NULL REMARK 3 REMARK 3 NON-BONDED CONTACT RESTRAINTS. REMARK 3 SINGLE TORSION (A) : NULL ; NULL REMARK 3 MULTIPLE TORSION (A) : NULL ; NULL REMARK 3 H-BOND (X...Y) (A) : NULL ; NULL REMARK 3 H-BOND (X-H...Y) (A) : NULL ; NULL REMARK 3 REMARK 3 CONFORMATIONAL TORSION ANGLE RESTRAINTS. REMARK 3 SPECIFIED (DEGREES) : NULL ; NULL REMARK 3 PLANAR (DEGREES) : NULL ; NULL REMARK 3 STAGGERED (DEGREES) : NULL ; NULL REMARK 3 TRANSVERSE (DEGREES) : NULL ; NULL REMARK 3 REMARK 3 ISOTROPIC THERMAL FACTOR RESTRAINTS. RMS SIGMA REMARK 3 MAIN-CHAIN BOND (A**2) : NULL ; NULL REMARK 3 MAIN-CHAIN ANGLE (A**2) : NULL ; NULL REMARK 3 SIDE-CHAIN BOND (A**2) : NULL ; NULL REMARK 3 SIDE-CHAIN ANGLE (A**2) : NULL ; NULL REMARK 3 REMARK 3 OTHER REFINEMENT REMARKS: NULL REMARK 4 REMARK 4 1DPX COMPLIES WITH FORMAT V. 3.15, 01-DEC-08 REMARK 100 REMARK 100 THIS ENTRY HAS BEEN PROCESSED BY RCSB ON 30-DEC-99. REMARK 100 THE RCSB ID CODE IS RCSB010274. REMARK 200 REMARK 200 EXPERIMENTAL DETAILS REMARK 200 EXPERIMENT TYPE : X-RAY DIFFRACTION REMARK 200 DATE OF DATA COLLECTION : NULL REMARK 200 TEMPERATURE (KELVIN) : 100 REMARK 200 PH : 4.5 REMARK 200 NUMBER OF CRYSTALS USED : 1 REMARK 200 REMARK 200 SYNCHROTRON (Y/N) : N REMARK 200 RADIATION SOURCE : ROTATING ANODE REMARK 200 BEAMLINE : NULL REMARK 200 X-RAY GENERATOR MODEL : ENRAF-NONIUS FR591 REMARK 200 MONOCHROMATIC OR LAUE (M/L) : M REMARK 200 WAVELENGTH OR RANGE (A) : 1.54 REMARK 200 MONOCHROMATOR : NULL REMARK 200 OPTICS : NULL REMARK 200 REMARK 200 DETECTOR TYPE : IMAGE PLATE REMARK 200 DETECTOR MANUFACTURER : MARRESEARCH REMARK 200 INTENSITY-INTEGRATION SOFTWARE : DENZO REMARK 200 DATA SCALING SOFTWARE : SCALEPACK REMARK 200 REMARK 200 NUMBER OF UNIQUE REFLECTIONS : 13962 REMARK 200 RESOLUTION RANGE HIGH (A) : 1.650 REMARK 200 RESOLUTION RANGE LOW (A) : 99.000 REMARK 200 REJECTION CRITERIA (SIGMA(I)) : 0.000 REMARK 200 REMARK 200 OVERALL. REMARK 200 COMPLETENESS FOR RANGE (%) : 99.7 REMARK 200 DATA REDUNDANCY : 12.660 REMARK 200 R MERGE (I) : 0.03800 REMARK 200 R SYM (I) : NULL REMARK 200 FOR THE DATA SET : 51.0000 REMARK 200 REMARK 200 IN THE HIGHEST RESOLUTION SHELL. REMARK 200 HIGHEST RESOLUTION SHELL, RANGE HIGH (A) : 1.65 REMARK 200 HIGHEST RESOLUTION SHELL, RANGE LOW (A) : 1.71 REMARK 200 COMPLETENESS FOR SHELL (%) : 100.0 REMARK 200 DATA REDUNDANCY IN SHELL : NULL REMARK 200 R MERGE FOR SHELL (I) : 0.14300 REMARK 200 R SYM FOR SHELL (I) : NULL REMARK 200 FOR SHELL : NULL REMARK 200 REMARK 200 DIFFRACTION PROTOCOL: SINGLE WAVELENGTH REMARK 200 METHOD USED TO DETERMINE THE STRUCTURE: NULL REMARK 200 SOFTWARE USED: NULL REMARK 200 STARTING MODEL: NULL REMARK 200 REMARK 200 REMARK: NULL REMARK 280 REMARK 280 CRYSTAL REMARK 280 SOLVENT CONTENT, VS (%): 36.15 REMARK 280 MATTHEWS COEFFICIENT, VM (ANGSTROMS**3/DA): 1.93 REMARK 280 REMARK 280 CRYSTALLIZATION CONDITIONS: SODIUM ACETATE, SODIUM CHLORIDE, PH REMARK 280 4.5, VAPOR DIFFUSION, HANGING DROP, TEMPERATURE 293K REMARK 290 REMARK 290 CRYSTALLOGRAPHIC SYMMETRY REMARK 290 SYMMETRY OPERATORS FOR SPACE GROUP: P 43 21 2 REMARK 290 REMARK 290 SYMOP SYMMETRY REMARK 290 NNNMMM OPERATOR REMARK 290 1555 X,Y,Z REMARK 290 2555 -X,-Y,Z+1/2 REMARK 290 3555 -Y+1/2,X+1/2,Z+3/4 REMARK 290 4555 Y+1/2,-X+1/2,Z+1/4 REMARK 290 5555 -X+1/2,Y+1/2,-Z+3/4 REMARK 290 6555 X+1/2,-Y+1/2,-Z+1/4 REMARK 290 7555 Y,X,-Z REMARK 290 8555 -Y,-X,-Z+1/2 REMARK 290 REMARK 290 WHERE NNN -> OPERATOR NUMBER REMARK 290 MMM -> TRANSLATION VECTOR REMARK 290 REMARK 290 CRYSTALLOGRAPHIC SYMMETRY TRANSFORMATIONS REMARK 290 THE FOLLOWING TRANSFORMATIONS OPERATE ON THE ATOM/HETATM REMARK 290 RECORDS IN THIS ENTRY TO PRODUCE CRYSTALLOGRAPHICALLY REMARK 290 RELATED MOLECULES. REMARK 290 SMTRY1 1 1.000000 0.000000 0.000000 0.00000 REMARK 290 SMTRY2 1 0.000000 1.000000 0.000000 0.00000 REMARK 290 SMTRY3 1 0.000000 0.000000 1.000000 0.00000 REMARK 290 SMTRY1 2 -1.000000 0.000000 0.000000 0.00000 REMARK 290 SMTRY2 2 0.000000 -1.000000 0.000000 0.00000 REMARK 290 SMTRY3 2 0.000000 0.000000 1.000000 18.60500 REMARK 290 SMTRY1 3 0.000000 -1.000000 0.000000 38.52500 REMARK 290 SMTRY2 3 1.000000 0.000000 0.000000 38.52500 REMARK 290 SMTRY3 3 0.000000 0.000000 1.000000 27.90750 REMARK 290 SMTRY1 4 0.000000 1.000000 0.000000 38.52500 REMARK 290 SMTRY2 4 -1.000000 0.000000 0.000000 38.52500 REMARK 290 SMTRY3 4 0.000000 0.000000 1.000000 9.30250 REMARK 290 SMTRY1 5 -1.000000 0.000000 0.000000 38.52500 REMARK 290 SMTRY2 5 0.000000 1.000000 0.000000 38.52500 REMARK 290 SMTRY3 5 0.000000 0.000000 -1.000000 27.90750 REMARK 290 SMTRY1 6 1.000000 0.000000 0.000000 38.52500 REMARK 290 SMTRY2 6 0.000000 -1.000000 0.000000 38.52500 REMARK 290 SMTRY3 6 0.000000 0.000000 -1.000000 9.30250 REMARK 290 SMTRY1 7 0.000000 1.000000 0.000000 0.00000 REMARK 290 SMTRY2 7 1.000000 0.000000 0.000000 0.00000 REMARK 290 SMTRY3 7 0.000000 0.000000 -1.000000 0.00000 REMARK 290 SMTRY1 8 0.000000 -1.000000 0.000000 0.00000 REMARK 290 SMTRY2 8 -1.000000 0.000000 0.000000 0.00000 REMARK 290 SMTRY3 8 0.000000 0.000000 -1.000000 18.60500 REMARK 290 REMARK 290 REMARK: NULL REMARK 300 REMARK 300 BIOMOLECULE: 1 REMARK 300 SEE REMARK 350 FOR THE AUTHOR PROVIDED AND/OR PROGRAM REMARK 300 GENERATED ASSEMBLY INFORMATION FOR THE STRUCTURE IN REMARK 300 THIS ENTRY. THE REMARK MAY ALSO PROVIDE INFORMATION ON REMARK 300 BURIED SURFACE AREA. REMARK 350 REMARK 350 COORDINATES FOR A COMPLETE MULTIMER REPRESENTING THE KNOWN REMARK 350 BIOLOGICALLY SIGNIFICANT OLIGOMERIZATION STATE OF THE REMARK 350 MOLECULE CAN BE GENERATED BY APPLYING BIOMT TRANSFORMATIONS REMARK 350 GIVEN BELOW. BOTH NON-CRYSTALLOGRAPHIC AND REMARK 350 CRYSTALLOGRAPHIC OPERATIONS ARE GIVEN. REMARK 350 REMARK 350 BIOMOLECULE: 1 REMARK 350 AUTHOR DETERMINED BIOLOGICAL UNIT: MONOMERIC REMARK 350 APPLY THE FOLLOWING TO CHAINS: A REMARK 350 BIOMT1 1 1.000000 0.000000 0.000000 0.00000 REMARK 350 BIOMT2 1 0.000000 1.000000 0.000000 0.00000 REMARK 350 BIOMT3 1 0.000000 0.000000 1.000000 0.00000 REMARK 375 REMARK 375 SPECIAL POSITION REMARK 375 THE FOLLOWING ATOMS ARE FOUND TO BE WITHIN 0.15 ANGSTROMS REMARK 375 OF A SYMMETRY RELATED ATOM AND ARE ASSUMED TO BE ON SPECIAL REMARK 375 POSITIONS. REMARK 375 REMARK 375 ATOM RES CSSEQI REMARK 375 HOH A 232 LIES ON A SPECIAL POSITION. REMARK 375 HOH A 238 LIES ON A SPECIAL POSITION. REMARK 375 HOH A 240 LIES ON A SPECIAL POSITION. REMARK 375 HOH A 267 LIES ON A SPECIAL POSITION. REMARK 375 HOH A 303 LIES ON A SPECIAL POSITION. REMARK 470 REMARK 470 MISSING ATOM REMARK 470 THE FOLLOWING RESIDUES HAVE MISSING ATOMS(M=MODEL NUMBER; REMARK 470 RES=RESIDUE NAME; C=CHAIN IDENTIFIER; SSEQ=SEQUENCE NUMBER; REMARK 470 I=INSERTION CODE): REMARK 470 M RES CSSEQI ATOMS REMARK 470 LEU A 129 C O REMARK 500 REMARK 500 GEOMETRY AND STEREOCHEMISTRY REMARK 500 SUBTOPIC: CLOSE CONTACTS IN SAME ASYMMETRIC UNIT REMARK 500 REMARK 500 THE FOLLOWING ATOMS ARE IN CLOSE CONTACT. REMARK 500 REMARK 500 ATM1 RES C SSEQI ATM2 RES C SSEQI DISTANCE REMARK 500 O HOH A 237 O HOH A 255 1.69 REMARK 500 O HOH A 290 O HOH A 331 1.95 REMARK 500 O HOH A 298 O HOH A 327 2.02 REMARK 500 O HOH A 330 O HOH A 355 2.13 REMARK 500 O HOH A 229 O HOH A 338 2.14 REMARK 500 O HOH A 214 O HOH A 234 2.16 REMARK 500 REMARK 500 REMARK: NULL REMARK 500 REMARK 500 GEOMETRY AND STEREOCHEMISTRY REMARK 500 SUBTOPIC: CLOSE CONTACTS REMARK 500 REMARK 500 THE FOLLOWING ATOMS THAT ARE RELATED BY CRYSTALLOGRAPHIC REMARK 500 SYMMETRY ARE IN CLOSE CONTACT. AN ATOM LOCATED WITHIN 0.15 REMARK 500 ANGSTROMS OF A SYMMETRY RELATED ATOM IS ASSUMED TO BE ON A REMARK 500 SPECIAL POSITION AND IS, THEREFORE, LISTED IN REMARK 375 REMARK 500 INSTEAD OF REMARK 500. ATOMS WITH NON-BLANK ALTERNATE REMARK 500 LOCATION INDICATORS ARE NOT INCLUDED IN THE CALCULATIONS. REMARK 500 REMARK 500 DISTANCE CUTOFF: REMARK 500 2.2 ANGSTROMS FOR CONTACTS NOT INVOLVING HYDROGEN ATOMS REMARK 500 1.6 ANGSTROMS FOR CONTACTS INVOLVING HYDROGEN ATOMS REMARK 500 REMARK 500 ATM1 RES C SSEQI ATM2 RES C SSEQI SSYMOP DISTANCE REMARK 500 O HOH A 253 O HOH A 331 8555 1.86 REMARK 500 O HOH A 298 O HOH A 298 7556 1.96 REMARK 500 REMARK 500 REMARK: NULL REMARK 500 REMARK 500 GEOMETRY AND STEREOCHEMISTRY REMARK 500 SUBTOPIC: COVALENT BOND ANGLES REMARK 500 REMARK 500 THE STEREOCHEMICAL PARAMETERS OF THE FOLLOWING RESIDUES REMARK 500 HAVE VALUES WHICH DEVIATE FROM EXPECTED VALUES BY MORE REMARK 500 THAN 6*RMSD (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN REMARK 500 IDENTIFIER; SSEQ=SEQUENCE NUMBER; I=INSERTION CODE). REMARK 500 REMARK 500 STANDARD TABLE: REMARK 500 FORMAT: (10X,I3,1X,A3,1X,A1,I4,A1,3(1X,A4,2X),12X,F5.1) REMARK 500 REMARK 500 EXPECTED VALUES PROTEIN: ENGH AND HUBER, 1999 REMARK 500 EXPECTED VALUES NUCLEIC ACID: CLOWNEY ET AL 1996 REMARK 500 REMARK 500 M RES CSSEQI ATM1 ATM2 ATM3 REMARK 500 ARG A 5 NE - CZ - NH2 ANGL. DEV. = -3.3 DEGREES REMARK 500 ARG A 14 NE - CZ - NH1 ANGL. DEV. = 3.3 DEGREES REMARK 500 ARG A 14 NE - CZ - NH2 ANGL. DEV. = -6.4 DEGREES REMARK 500 ARG A 45 NE - CZ - NH1 ANGL. DEV. = -3.6 DEGREES REMARK 500 REMARK 500 REMARK: NULL REMARK 800 REMARK 800 SITE REMARK 800 SITE_IDENTIFIER: AC1 REMARK 800 EVIDENCE_CODE: SOFTWARE REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE CL A 200 REMARK 800 SITE_IDENTIFIER: AC2 REMARK 800 EVIDENCE_CODE: SOFTWARE REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE CL A 201 REMARK 900 REMARK 900 RELATED ENTRIES REMARK 900 RELATED ID: 1DPW RELATED DB: PDB REMARK 900 STRUCTURE OF HEN EGG-WHITE LYSOZYME IN COMPLEX WITH MPD DBREF 1DPX A 1 129 UNP P00698 LYSC_CHICK 19 147 SEQRES 1 A 129 LYS VAL PHE GLY ARG CYS GLU LEU ALA ALA ALA MET LYS SEQRES 2 A 129 ARG HIS GLY LEU ASP ASN TYR ARG GLY TYR SER LEU GLY SEQRES 3 A 129 ASN TRP VAL CYS ALA ALA LYS PHE GLU SER ASN PHE ASN SEQRES 4 A 129 THR GLN ALA THR ASN ARG ASN THR ASP GLY SER THR ASP SEQRES 5 A 129 TYR GLY ILE LEU GLN ILE ASN SER ARG TRP TRP CYS ASN SEQRES 6 A 129 ASP GLY ARG THR PRO GLY SER ARG ASN LEU CYS ASN ILE SEQRES 7 A 129 PRO CYS SER ALA LEU LEU SER SER ASP ILE THR ALA SER SEQRES 8 A 129 VAL ASN CYS ALA LYS LYS ILE VAL SER ASP GLY ASN GLY SEQRES 9 A 129 MET ASN ALA TRP VAL ALA TRP ARG ASN ARG CYS LYS GLY SEQRES 10 A 129 THR ASP VAL GLN ALA TRP ILE ARG GLY CYS ARG LEU HET CL A 200 1 HET CL A 201 1 HETNAM CL CHLORIDE ION FORMUL 2 CL 2(CL 1-) FORMUL 4 HOH *177(H2 O) HELIX 1 1 GLY A 4 HIS A 15 1 12 HELIX 2 2 SER A 24 ASN A 37 1 14 HELIX 3 3 CYS A 80 SER A 85 5 6 HELIX 4 4 ILE A 88 SER A 100 1 13 HELIX 5 5 ASN A 103 ALA A 107 5 5 HELIX 6 6 TRP A 108 CYS A 115 1 8 HELIX 7 7 ASP A 119 ARG A 125 5 7 SHEET 1 A 3 THR A 43 ARG A 45 0 SHEET 2 A 3 THR A 51 TYR A 53 -1 N ASP A 52 O ASN A 44 SHEET 3 A 3 ILE A 58 ASN A 59 -1 O ILE A 58 N TYR A 53 SSBOND 1 CYS A 6 CYS A 127 1555 1555 1.99 SSBOND 2 CYS A 30 CYS A 115 1555 1555 2.04 SSBOND 3 CYS A 64 CYS A 80 1555 1555 2.04 SSBOND 4 CYS A 76 CYS A 94 1555 1555 2.04 SITE 1 AC1 2 TYR A 23 ASN A 113 SITE 1 AC2 4 SER A 24 GLY A 26 GLN A 121 ILE A 124 CRYST1 77.050 77.050 37.210 90.00 90.00 90.00 P 43 21 2 8 ORIGX1 1.000000 0.000000 0.000000 0.00000 ORIGX2 0.000000 1.000000 0.000000 0.00000 ORIGX3 0.000000 0.000000 1.000000 0.00000 SCALE1 0.012980 0.000000 0.000000 0.00000 SCALE2 0.000000 0.012980 0.000000 0.00000 SCALE3 0.000000 0.000000 0.026870 0.00000 ATOM 1 N LYS A 1 1.990 9.126 10.027 1.00 16.50 N ATOM 2 CA LYS A 1 1.067 9.654 8.994 1.00 16.87 C ATOM 3 C LYS A 1 1.167 11.156 8.783 1.00 16.39 C ATOM 4 O LYS A 1 1.155 11.908 9.776 1.00 15.96 O ATOM 5 CB LYS A 1 -0.361 9.267 9.380 1.00 18.93 C ATOM 6 CG LYS A 1 -1.429 9.868 8.467 1.00 19.34 C ATOM 7 CD LYS A 1 -2.781 9.259 8.802 1.00 21.34 C ATOM 8 CE ALYS A 1 -3.899 9.938 8.018 0.50 21.41 C ATOM 9 CE BLYS A 1 -3.839 10.005 7.983 0.50 22.40 C ATOM 10 NZ ALYS A 1 -4.034 9.390 6.642 0.50 21.17 N ATOM 11 NZ BLYS A 1 -5.212 9.563 8.333 0.50 24.73 N ATOM 12 N VAL A 2 1.278 11.558 7.532 1.00 16.01 N ATOM 13 CA VAL A 2 1.246 12.972 7.197 1.00 15.32 C ATOM 14 C VAL A 2 -0.182 13.272 6.760 1.00 15.17 C ATOM 15 O VAL A 2 -0.639 12.820 5.703 1.00 16.01 O ATOM 16 CB VAL A 2 2.284 13.391 6.154 1.00 18.75 C ATOM 17 CG1 VAL A 2 2.168 14.868 5.819 1.00 19.78 C ATOM 18 CG2 VAL A 2 3.681 13.115 6.719 1.00 18.93 C ATOM 19 N PHE A 3 -0.913 13.974 7.612 1.00 13.76 N ATOM 20 CA PHE A 3 -2.285 14.327 7.313 1.00 13.57 C ATOM 21 C PHE A 3 -2.360 15.431 6.261 1.00 14.39 C ATOM 22 O PHE A 3 -1.528 16.329 6.193 1.00 14.83 O ATOM 23 CB PHE A 3 -3.040 14.841 8.530 1.00 16.19 C ATOM 24 CG PHE A 3 -3.673 13.812 9.419 1.00 15.21 C ATOM 25 CD1 PHE A 3 -2.900 13.114 10.329 1.00 15.00 C ATOM 26 CD2 PHE A 3 -5.043 13.579 9.383 1.00 16.87 C ATOM 27 CE1 PHE A 3 -3.461 12.164 11.170 1.00 18.25 C ATOM 28 CE2 PHE A 3 -5.600 12.635 10.219 1.00 15.89 C ATOM 29 CZ PHE A 3 -4.818 11.917 11.104 1.00 15.57 C ATOM 30 N GLY A 4 -3.481 15.362 5.521 1.00 14.57 N ATOM 31 CA GLY A 4 -3.767 16.491 4.630 1.00 14.92 C ATOM 32 C GLY A 4 -4.437 17.545 5.518 1.00 15.36 C ATOM 33 O GLY A 4 -4.936 17.238 6.603 1.00 16.28 O ATOM 34 N ARG A 5 -4.454 18.789 5.074 1.00 15.67 N ATOM 35 CA ARG A 5 -5.049 19.858 5.883 1.00 15.52 C ATOM 36 C ARG A 5 -6.508 19.624 6.233 1.00 16.36 C ATOM 37 O ARG A 5 -6.896 19.671 7.412 1.00 15.56 O ATOM 38 CB ARG A 5 -4.855 21.159 5.106 1.00 17.05 C ATOM 39 CG ARG A 5 -5.422 22.389 5.791 1.00 18.54 C ATOM 40 CD ARG A 5 -5.134 23.622 4.972 1.00 15.70 C ATOM 41 NE ARG A 5 -5.637 23.599 3.603 1.00 19.15 N ATOM 42 CZ ARG A 5 -6.888 23.946 3.282 1.00 16.84 C ATOM 43 NH1 ARG A 5 -7.769 24.339 4.191 1.00 16.94 N ATOM 44 NH2 ARG A 5 -7.219 23.890 1.989 1.00 21.28 N ATOM 45 N CYS A 6 -7.354 19.370 5.237 1.00 16.34 N ATOM 46 CA CYS A 6 -8.777 19.141 5.499 1.00 16.26 C ATOM 47 C CYS A 6 -9.012 17.803 6.197 1.00 14.69 C ATOM 48 O CYS A 6 -9.947 17.658 6.988 1.00 14.93 O ATOM 49 CB CYS A 6 -9.612 19.149 4.208 1.00 17.62 C ATOM 50 SG CYS A 6 -9.692 20.816 3.487 1.00 18.05 S ATOM 51 N GLU A 7 -8.149 16.833 5.920 1.00 14.37 N ATOM 52 CA GLU A 7 -8.178 15.522 6.535 1.00 14.18 C ATOM 53 C GLU A 7 -7.993 15.656 8.053 1.00 14.37 C ATOM 54 O GLU A 7 -8.764 15.069 8.822 1.00 14.87 O ATOM 55 CB GLU A 7 -7.098 14.596 5.961 1.00 15.22 C ATOM 56 CG GLU A 7 -7.183 13.180 6.526 1.00 15.78 C ATOM 57 CD GLU A 7 -6.048 12.315 6.036 1.00 17.87 C ATOM 58 OE1 GLU A 7 -5.017 12.791 5.501 1.00 18.58 O ATOM 59 OE2 GLU A 7 -6.222 11.079 6.172 1.00 20.43 O ATOM 60 N LEU A 8 -7.015 16.490 8.416 1.00 14.34 N ATOM 61 CA LEU A 8 -6.778 16.716 9.847 1.00 13.81 C ATOM 62 C LEU A 8 -7.907 17.524 10.455 1.00 13.61 C ATOM 63 O LEU A 8 -8.369 17.246 11.572 1.00 14.07 O ATOM 64 CB LEU A 8 -5.420 17.412 10.063 1.00 11.51 C ATOM 65 CG LEU A 8 -5.119 17.682 11.541 1.00 12.42 C ATOM 66 CD1 LEU A 8 -5.065 16.387 12.326 1.00 13.65 C ATOM 67 CD2 LEU A 8 -3.793 18.446 11.655 1.00 15.48 C ATOM 68 N ALA A 9 -8.435 18.511 9.730 1.00 13.23 N ATOM 69 CA ALA A 9 -9.522 19.337 10.243 1.00 12.88 C ATOM 70 C ALA A 9 -10.719 18.454 10.567 1.00 14.06 C ATOM 71 O ALA A 9 -11.322 18.567 11.634 1.00 14.68 O ATOM 72 CB ALA A 9 -9.839 20.411 9.207 1.00 16.86 C ATOM 73 N ALA A 10 -11.045 17.507 9.677 1.00 13.71 N ATOM 74 CA ALA A 10 -12.200 16.640 9.937 1.00 15.49 C ATOM 75 C ALA A 10 -11.991 15.727 11.132 1.00 15.60 C ATOM 76 O ALA A 10 -12.933 15.472 11.884 1.00 16.64 O ATOM 77 CB ALA A 10 -12.541 15.763 8.735 1.00 16.77 C ATOM 78 N ALA A 11 -10.760 15.269 11.337 1.00 14.64 N ATOM 79 CA ALA A 11 -10.458 14.389 12.465 1.00 15.70 C ATOM 80 C ALA A 11 -10.572 15.118 13.792 1.00 15.70 C ATOM 81 O ALA A 11 -11.106 14.626 14.780 1.00 15.52 O ATOM 82 CB ALA A 11 -9.073 13.794 12.274 1.00 17.40 C ATOM 83 N MET A 12 -9.984 16.327 13.799 1.00 14.14 N ATOM 84 CA MET A 12 -10.053 17.189 14.978 1.00 14.62 C ATOM 85 C MET A 12 -11.494 17.553 15.336 1.00 15.86 C ATOM 86 O MET A 12 -11.829 17.508 16.505 1.00 16.32 O ATOM 87 CB MET A 12 -9.268 18.475 14.742 1.00 15.01 C ATOM 88 CG MET A 12 -7.763 18.206 14.809 1.00 13.33 C ATOM 89 SD MET A 12 -6.840 19.722 14.431 1.00 12.91 S ATOM 90 CE MET A 12 -5.352 19.364 15.355 1.00 16.71 C ATOM 91 N LYS A 13 -12.298 17.858 14.318 1.00 15.42 N ATOM 92 CA LYS A 13 -13.705 18.186 14.557 1.00 15.76 C ATOM 93 C LYS A 13 -14.460 16.954 15.057 1.00 16.81 C ATOM 94 O LYS A 13 -15.206 17.039 16.042 1.00 17.14 O ATOM 95 CB LYS A 13 -14.333 18.675 13.250 1.00 14.49 C ATOM 96 CG LYS A 13 -15.814 19.057 13.415 1.00 15.69 C ATOM 97 CD LYS A 13 -16.288 19.603 12.064 1.00 19.90 C ATOM 98 CE LYS A 13 -17.760 20.006 12.201 1.00 29.11 C ATOM 99 NZ LYS A 13 -18.275 20.550 10.912 1.00 32.38 N ATOM 100 N ARG A 14 -14.176 15.801 14.446 1.00 17.07 N ATOM 101 CA ARG A 14 -14.889 14.602 14.941 1.00 16.60 C ATOM 102 C ARG A 14 -14.581 14.313 16.402 1.00 17.29 C ATOM 103 O ARG A 14 -15.463 13.906 17.184 1.00 16.75 O ATOM 104 CB AARG A 14 -14.605 13.371 14.082 0.50 16.07 C ATOM 105 CB BARG A 14 -14.553 13.417 14.033 0.50 19.58 C ATOM 106 CG AARG A 14 -15.192 12.096 14.704 0.50 19.04 C ATOM 107 CG BARG A 14 -15.114 12.109 14.566 0.50 26.17 C ATOM 108 CD AARG A 14 -15.005 10.934 13.737 0.50 18.21 C ATOM 109 CD BARG A 14 -14.728 10.947 13.663 0.50 30.80 C ATOM 110 NE AARG A 14 -13.651 10.968 13.222 0.50 10.74 N ATOM 111 NE BARG A 14 -14.363 9.812 14.504 0.50 33.11 N ATOM 112 CZ AARG A 14 -12.569 10.399 13.707 0.50 12.39 C ATOM 113 CZ BARG A 14 -13.122 9.501 14.851 0.50 33.04 C ATOM 114 NH1AARG A 14 -12.566 9.620 14.789 0.50 17.90 N ATOM 115 NH1BARG A 14 -12.093 10.215 14.408 0.50 36.74 N ATOM 116 NH2AARG A 14 -11.479 10.640 13.006 0.50 7.03 N ATOM 117 NH2BARG A 14 -12.884 8.455 15.623 0.50 33.50 N ATOM 118 N HIS A 15 -13.353 14.586 16.819 1.00 16.36 N ATOM 119 CA HIS A 15 -12.914 14.403 18.184 1.00 15.95 C ATOM 120 C HIS A 15 -13.228 15.565 19.114 1.00 17.32 C ATOM 121 O HIS A 15 -12.716 15.564 20.246 1.00 17.87 O ATOM 122 CB HIS A 15 -11.414 14.123 18.193 1.00 18.12 C ATOM 123 CG HIS A 15 -11.023 12.748 17.764 1.00 19.90 C ATOM 124 ND1 HIS A 15 -10.327 12.406 16.647 1.00 24.89 N ATOM 125 CD2 HIS A 15 -11.297 11.583 18.430 1.00 20.42 C ATOM 126 CE1 HIS A 15 -10.156 11.089 16.614 1.00 20.82 C ATOM 127 NE2 HIS A 15 -10.745 10.579 17.674 1.00 24.48 N ATOM 128 N GLY A 16 -14.017 16.535 18.687 1.00 16.73 N ATOM 129 CA GLY A 16 -14.489 17.587 19.538 1.00 18.49 C ATOM 130 C GLY A 16 -13.547 18.729 19.839 1.00 18.36 C ATOM 131 O GLY A 16 -13.769 19.385 20.858 1.00 19.10 O ATOM 132 N LEU A 17 -12.597 19.017 18.948 1.00 17.90 N ATOM 133 CA LEU A 17 -11.750 20.183 19.211 1.00 19.00 C ATOM 134 C LEU A 17 -12.327 21.493 18.706 1.00 19.55 C ATOM 135 O LEU A 17 -11.875 22.550 19.160 1.00 18.56 O ATOM 136 CB LEU A 17 -10.361 20.033 18.589 1.00 17.64 C ATOM 137 CG LEU A 17 -9.332 19.205 19.310 1.00 18.62 C ATOM 138 CD1 LEU A 17 -8.019 19.267 18.531 1.00 15.31 C ATOM 139 CD2 LEU A 17 -9.085 19.671 20.751 1.00 16.33 C ATOM 140 N ASP A 18 -13.239 21.485 17.731 1.00 19.98 N ATOM 141 CA ASP A 18 -13.802 22.728 17.200 1.00 21.21 C ATOM 142 C ASP A 18 -14.550 23.446 18.318 1.00 21.85 C ATOM 143 O ASP A 18 -15.519 22.940 18.867 1.00 23.12 O ATOM 144 CB ASP A 18 -14.740 22.516 16.018 1.00 21.68 C ATOM 145 CG ASP A 18 -15.187 23.744 15.260 1.00 27.36 C ATOM 146 OD1 ASP A 18 -14.740 24.890 15.491 1.00 27.43 O ATOM 147 OD2 ASP A 18 -16.029 23.598 14.321 1.00 27.84 O ATOM 148 N ASN A 19 -14.064 24.621 18.681 1.00 20.27 N ATOM 149 CA ASN A 19 -14.573 25.444 19.745 1.00 19.44 C ATOM 150 C ASN A 19 -14.302 24.888 21.139 1.00 17.76 C ATOM 151 O ASN A 19 -14.917 25.354 22.109 1.00 17.54 O ATOM 152 CB ASN A 19 -16.067 25.777 19.565 1.00 27.45 C ATOM 153 CG ASN A 19 -16.236 26.636 18.314 1.00 38.17 C ATOM 154 OD1 ASN A 19 -15.606 27.696 18.245 1.00 45.03 O ATOM 155 ND2 ASN A 19 -17.045 26.157 17.377 1.00 42.07 N ATOM 156 N TYR A 20 -13.343 23.983 21.279 1.00 16.42 N ATOM 157 CA TYR A 20 -12.977 23.461 22.590 1.00 16.85 C ATOM 158 C TYR A 20 -12.221 24.550 23.355 1.00 16.62 C ATOM 159 O TYR A 20 -11.306 25.193 22.847 1.00 15.80 O ATOM 160 CB TYR A 20 -12.125 22.207 22.508 1.00 16.39 C ATOM 161 CG TYR A 20 -11.974 21.587 23.884 1.00 16.50 C ATOM 162 CD1 TYR A 20 -12.947 20.683 24.321 1.00 16.56 C ATOM 163 CD2 TYR A 20 -10.897 21.865 24.695 1.00 16.61 C ATOM 164 CE1 TYR A 20 -12.830 20.105 25.580 1.00 18.24 C ATOM 165 CE2 TYR A 20 -10.781 21.285 25.949 1.00 17.87 C ATOM 166 CZ TYR A 20 -11.754 20.408 26.376 1.00 19.79 C ATOM 167 OH TYR A 20 -11.630 19.839 27.620 1.00 21.37 O ATOM 168 N ARG A 21 -12.755 24.874 24.537 1.00 15.91 N ATOM 169 CA ARG A 21 -12.219 25.991 25.333 1.00 16.69 C ATOM 170 C ARG A 21 -12.302 27.296 24.546 1.00 15.91 C ATOM 171 O ARG A 21 -11.558 28.240 24.789 1.00 15.76 O ATOM 172 CB ARG A 21 -10.805 25.757 25.837 1.00 19.57 C ATOM 173 CG ARG A 21 -10.632 24.645 26.847 1.00 28.39 C ATOM 174 CD ARG A 21 -11.453 24.827 28.105 1.00 39.22 C ATOM 175 NE ARG A 21 -10.800 25.644 29.118 1.00 42.28 N ATOM 176 CZ ARG A 21 -10.843 25.332 30.417 1.00 45.46 C ATOM 177 NH1 ARG A 21 -10.239 26.099 31.317 1.00 46.44 N ATOM 178 NH2 ARG A 21 -11.467 24.242 30.853 1.00 45.99 N ATOM 179 N GLY A 22 -13.245 27.394 23.609 1.00 15.41 N ATOM 180 CA GLY A 22 -13.517 28.540 22.795 1.00 14.49 C ATOM 181 C GLY A 22 -12.600 28.705 21.595 1.00 14.19 C ATOM 182 O GLY A 22 -12.656 29.762 20.970 1.00 15.22 O ATOM 183 N TYR A 23 -11.769 27.707 21.306 1.00 14.34 N ATOM 184 CA TYR A 23 -10.841 27.843 20.178 1.00 14.12 C ATOM 185 C TYR A 23 -11.398 27.187 18.912 1.00 13.63 C ATOM 186 O TYR A 23 -11.617 25.979 18.891 1.00 14.94 O ATOM 187 CB TYR A 23 -9.497 27.215 20.564 1.00 13.40 C ATOM 188 CG TYR A 23 -8.754 28.070 21.578 1.00 12.80 C ATOM 189 CD1 TYR A 23 -7.970 29.120 21.154 1.00 12.01 C ATOM 190 CD2 TYR A 23 -8.842 27.789 22.936 1.00 13.06 C ATOM 191 CE1 TYR A 23 -7.297 29.926 22.057 1.00 12.42 C ATOM 192 CE2 TYR A 23 -8.167 28.586 23.861 1.00 12.92 C ATOM 193 CZ TYR A 23 -7.415 29.654 23.408 1.00 13.15 C ATOM 194 OH TYR A 23 -6.718 30.463 24.271 1.00 12.84 O ATOM 195 N SER A 24 -11.608 27.999 17.875 1.00 13.73 N ATOM 196 CA SER A 24 -12.187 27.470 16.639 1.00 14.62 C ATOM 197 C SER A 24 -11.267 26.481 15.954 1.00 14.51 C ATOM 198 O SER A 24 -10.041 26.459 16.147 1.00 14.88 O ATOM 199 CB SER A 24 -12.515 28.626 15.682 1.00 14.56 C ATOM 200 OG SER A 24 -11.284 29.222 15.269 1.00 15.71 O ATOM 201 N LEU A 25 -11.858 25.652 15.090 1.00 14.36 N ATOM 202 CA LEU A 25 -11.079 24.612 14.399 1.00 13.88 C ATOM 203 C LEU A 25 -9.836 25.105 13.693 1.00 13.76 C ATOM 204 O LEU A 25 -8.794 24.415 13.751 1.00 12.85 O ATOM 205 CB LEU A 25 -11.992 23.868 13.427 1.00 14.00 C ATOM 206 CG LEU A 25 -11.458 22.596 12.769 1.00 14.02 C ATOM 207 CD1 LEU A 25 -11.122 21.576 13.850 1.00 17.04 C ATOM 208 CD2 LEU A 25 -12.485 22.005 11.804 1.00 14.38 C ATOM 209 N GLY A 26 -9.880 26.275 13.073 1.00 13.52 N ATOM 210 CA GLY A 26 -8.736 26.834 12.357 1.00 13.74 C ATOM 211 C GLY A 26 -7.548 27.066 13.283 1.00 12.49 C ATOM 212 O GLY A 26 -6.398 26.967 12.868 1.00 12.78 O ATOM 213 N ASN A 27 -7.795 27.451 14.531 1.00 12.27 N ATOM 214 CA ASN A 27 -6.702 27.584 15.498 1.00 11.78 C ATOM 215 C ASN A 27 -5.942 26.275 15.715 1.00 13.00 C ATOM 216 O ASN A 27 -4.711 26.313 15.789 1.00 12.58 O ATOM 217 CB ASN A 27 -7.248 28.040 16.859 1.00 11.61 C ATOM 218 CG ASN A 27 -7.491 29.541 16.837 1.00 14.37 C ATOM 219 OD1 ASN A 27 -6.564 30.355 16.873 1.00 13.63 O ATOM 220 ND2 ASN A 27 -8.762 29.922 16.777 1.00 13.86 N ATOM 221 N TRP A 28 -6.679 25.170 15.848 1.00 12.57 N ATOM 222 CA TRP A 28 -6.039 23.870 16.062 1.00 12.05 C ATOM 223 C TRP A 28 -5.310 23.366 14.831 1.00 12.07 C ATOM 224 O TRP A 28 -4.234 22.756 14.919 1.00 12.53 O ATOM 225 CB TRP A 28 -7.118 22.850 16.456 1.00 14.11 C ATOM 226 CG TRP A 28 -7.754 23.223 17.773 1.00 11.68 C ATOM 227 CD1 TRP A 28 -8.971 23.792 17.986 1.00 12.85 C ATOM 228 CD2 TRP A 28 -7.169 22.999 19.062 1.00 14.15 C ATOM 229 NE1 TRP A 28 -9.186 23.948 19.342 1.00 12.86 N ATOM 230 CE2 TRP A 28 -8.082 23.465 20.012 1.00 12.97 C ATOM 231 CE3 TRP A 28 -5.961 22.440 19.481 1.00 14.04 C ATOM 232 CZ2 TRP A 28 -7.841 23.401 21.381 1.00 13.14 C ATOM 233 CZ3 TRP A 28 -5.709 22.383 20.855 1.00 13.88 C ATOM 234 CH2 TRP A 28 -6.650 22.855 21.788 1.00 14.45 C ATOM 235 N VAL A 29 -5.909 23.591 13.647 1.00 11.44 N ATOM 236 CA VAL A 29 -5.220 23.174 12.403 1.00 11.51 C ATOM 237 C VAL A 29 -3.963 24.005 12.219 1.00 11.97 C ATOM 238 O VAL A 29 -2.891 23.493 11.846 1.00 12.00 O ATOM 239 CB VAL A 29 -6.161 23.283 11.196 1.00 12.38 C ATOM 240 CG1 VAL A 29 -5.430 22.951 9.892 1.00 13.79 C ATOM 241 CG2 VAL A 29 -7.316 22.296 11.343 1.00 12.68 C ATOM 242 N CYS A 30 -4.066 25.328 12.467 1.00 11.38 N ATOM 243 CA CYS A 30 -2.893 26.198 12.355 1.00 11.20 C ATOM 244 C CYS A 30 -1.808 25.747 13.333 1.00 11.19 C ATOM 245 O CYS A 30 -0.625 25.665 12.969 1.00 10.49 O ATOM 246 CB CYS A 30 -3.314 27.648 12.667 1.00 12.47 C ATOM 247 SG CYS A 30 -1.972 28.859 12.483 1.00 11.06 S ATOM 248 N ALA A 31 -2.169 25.458 14.578 1.00 12.04 N ATOM 249 CA ALA A 31 -1.143 24.998 15.541 1.00 10.89 C ATOM 250 C ALA A 31 -0.474 23.723 15.055 1.00 11.75 C ATOM 251 O ALA A 31 0.765 23.580 15.117 1.00 12.20 O ATOM 252 CB ALA A 31 -1.829 24.727 16.876 1.00 12.94 C ATOM 253 N ALA A 32 -1.292 22.769 14.573 1.00 11.68 N ATOM 254 CA ALA A 32 -0.693 21.528 14.060 1.00 11.94 C ATOM 255 C ALA A 32 0.209 21.764 12.857 1.00 11.76 C ATOM 256 O ALA A 32 1.283 21.132 12.708 1.00 10.64 O ATOM 257 CB ALA A 32 -1.797 20.522 13.726 1.00 10.36 C ATOM 258 N LYS A 33 -0.149 22.685 11.966 1.00 11.49 N ATOM 259 CA LYS A 33 0.725 22.960 10.821 1.00 11.83 C ATOM 260 C LYS A 33 2.108 23.410 11.294 1.00 12.00 C ATOM 261 O LYS A 33 3.114 22.907 10.788 1.00 12.88 O ATOM 262 CB LYS A 33 0.087 24.057 9.964 1.00 13.47 C ATOM 263 CG LYS A 33 1.056 24.658 8.925 1.00 17.22 C ATOM 264 CD LYS A 33 1.245 23.642 7.826 1.00 17.45 C ATOM 265 CE LYS A 33 2.151 24.131 6.708 1.00 23.72 C ATOM 266 NZ LYS A 33 2.264 23.054 5.675 1.00 23.82 N ATOM 267 N PHE A 34 2.132 24.372 12.228 1.00 12.51 N ATOM 268 CA PHE A 34 3.432 24.902 12.635 1.00 12.30 C ATOM 269 C PHE A 34 4.122 24.074 13.700 1.00 14.82 C ATOM 270 O PHE A 34 5.365 24.183 13.832 1.00 15.60 O ATOM 271 CB PHE A 34 3.326 26.388 13.004 1.00 11.76 C ATOM 272 CG PHE A 34 2.881 27.201 11.807 1.00 12.09 C ATOM 273 CD1 PHE A 34 3.602 27.148 10.633 1.00 11.72 C ATOM 274 CD2 PHE A 34 1.749 28.003 11.912 1.00 13.88 C ATOM 275 CE1 PHE A 34 3.183 27.906 9.547 1.00 12.51 C ATOM 276 CE2 PHE A 34 1.352 28.756 10.802 1.00 16.14 C ATOM 277 CZ PHE A 34 2.071 28.700 9.622 1.00 15.05 C ATOM 278 N GLU A 35 3.381 23.215 14.383 1.00 13.40 N ATOM 279 CA GLU A 35 4.074 22.368 15.373 1.00 13.41 C ATOM 280 C GLU A 35 4.676 21.148 14.682 1.00 13.91 C ATOM 281 O GLU A 35 5.832 20.751 14.982 1.00 14.32 O ATOM 282 CB GLU A 35 3.070 21.947 16.444 1.00 15.49 C ATOM 283 CG GLU A 35 2.661 23.063 17.392 1.00 11.90 C ATOM 284 CD GLU A 35 3.765 23.547 18.292 1.00 13.50 C ATOM 285 OE1 GLU A 35 4.922 23.044 18.283 1.00 13.70 O ATOM 286 OE2 GLU A 35 3.505 24.506 19.059 1.00 13.45 O ATOM 287 N SER A 36 3.941 20.534 13.780 1.00 12.23 N ATOM 288 CA SER A 36 4.390 19.254 13.204 1.00 12.91 C ATOM 289 C SER A 36 4.329 19.098 11.705 1.00 12.45 C ATOM 290 O SER A 36 4.678 18.049 11.134 1.00 13.32 O ATOM 291 CB SER A 36 3.502 18.133 13.804 1.00 13.38 C ATOM 292 OG SER A 36 2.181 18.269 13.290 1.00 10.74 O ATOM 293 N ASN A 37 3.854 20.129 10.988 1.00 12.49 N ATOM 294 CA ASN A 37 3.615 20.082 9.549 1.00 13.68 C ATOM 295 C ASN A 37 2.656 18.941 9.240 1.00 14.00 C ATOM 296 O ASN A 37 2.744 18.236 8.231 1.00 15.39 O ATOM 297 CB ASN A 37 4.930 19.967 8.757 1.00 18.52 C ATOM 298 CG ASN A 37 4.716 20.501 7.350 1.00 22.16 C ATOM 299 OD1 ASN A 37 3.785 21.280 7.100 1.00 21.09 O ATOM 300 ND2 ASN A 37 5.538 20.074 6.398 1.00 26.09 N ATOM 301 N PHE A 38 1.731 18.672 10.155 1.00 13.56 N ATOM 302 CA PHE A 38 0.697 17.656 10.084 1.00 13.00 C ATOM 303 C PHE A 38 1.234 16.225 10.124 1.00 13.56 C ATOM 304 O PHE A 38 0.509 15.288 9.757 1.00 12.49 O ATOM 305 CB PHE A 38 -0.190 17.839 8.843 1.00 12.15 C ATOM 306 CG PHE A 38 -0.837 19.176 8.625 1.00 12.14 C ATOM 307 CD1 PHE A 38 -1.334 19.904 9.707 1.00 12.74 C ATOM 308 CD2 PHE A 38 -1.006 19.707 7.362 1.00 15.83 C ATOM 309 CE1 PHE A 38 -1.971 21.115 9.523 1.00 13.21 C ATOM 310 CE2 PHE A 38 -1.628 20.932 7.167 1.00 13.63 C ATOM 311 CZ PHE A 38 -2.108 21.642 8.244 1.00 11.31 C ATOM 312 N ASN A 39 2.425 16.019 10.647 1.00 12.73 N ATOM 313 CA ASN A 39 3.057 14.703 10.693 1.00 13.15 C ATOM 314 C ASN A 39 2.880 14.089 12.072 1.00 13.12 C ATOM 315 O ASN A 39 3.511 14.608 12.999 1.00 13.52 O ATOM 316 CB ASN A 39 4.560 14.891 10.367 1.00 14.57 C ATOM 317 CG ASN A 39 5.283 13.574 10.147 1.00 12.98 C ATOM 318 OD1 ASN A 39 4.798 12.490 10.526 1.00 14.00 O ATOM 319 ND2 ASN A 39 6.460 13.625 9.527 1.00 18.03 N ATOM 320 N THR A 40 2.119 12.994 12.206 1.00 12.50 N ATOM 321 CA THR A 40 1.926 12.378 13.523 1.00 11.76 C ATOM 322 C THR A 40 3.229 11.877 14.100 1.00 11.93 C ATOM 323 O THR A 40 3.307 11.749 15.328 1.00 12.52 O ATOM 324 CB THR A 40 0.924 11.200 13.545 1.00 12.79 C ATOM 325 OG1 THR A 40 1.454 10.162 12.692 1.00 15.08 O ATOM 326 CG2 THR A 40 -0.403 11.617 12.942 1.00 12.99 C ATOM 327 N GLN A 41 4.250 11.576 13.262 1.00 11.70 N ATOM 328 CA GLN A 41 5.483 11.044 13.837 1.00 12.34 C ATOM 329 C GLN A 41 6.518 12.075 14.245 1.00 11.82 C ATOM 330 O GLN A 41 7.584 11.718 14.754 1.00 13.25 O ATOM 331 CB GLN A 41 6.174 10.063 12.860 1.00 15.60 C ATOM 332 CG GLN A 41 5.230 8.963 12.391 1.00 12.40 C ATOM 333 CD GLN A 41 6.001 7.840 11.713 1.00 17.63 C ATOM 334 OE1 GLN A 41 6.727 7.100 12.379 1.00 17.30 O ATOM 335 NE2 GLN A 41 5.843 7.696 10.400 1.00 13.89 N ATOM 336 N ALA A 42 6.243 13.367 14.167 1.00 11.78 N ATOM 337 CA ALA A 42 7.211 14.384 14.519 1.00 11.40 C ATOM 338 C ALA A 42 7.629 14.331 15.979 1.00 11.97 C ATOM 339 O ALA A 42 6.803 14.286 16.876 1.00 12.76 O ATOM 340 CB ALA A 42 6.578 15.751 14.239 1.00 12.23 C ATOM 341 N THR A 43 8.932 14.400 16.226 1.00 12.73 N ATOM 342 CA THR A 43 9.476 14.479 17.574 1.00 13.87 C ATOM 343 C THR A 43 10.562 15.543 17.560 1.00 13.42 C ATOM 344 O THR A 43 11.305 15.720 16.573 1.00 13.86 O ATOM 345 CB THR A 43 10.100 13.177 18.096 1.00 16.26 C ATOM 346 OG1 THR A 43 11.200 12.864 17.215 1.00 15.72 O ATOM 347 CG2 THR A 43 9.134 12.007 18.135 1.00 15.56 C ATOM 348 N ASN A 44 10.630 16.391 18.589 1.00 13.63 N ATOM 349 CA ASN A 44 11.650 17.442 18.631 1.00 13.86 C ATOM 350 C ASN A 44 12.122 17.624 20.068 1.00 14.83 C ATOM 351 O ASN A 44 11.317 17.774 20.992 1.00 15.66 O ATOM 352 CB ASN A 44 11.120 18.781 18.095 1.00 15.14 C ATOM 353 CG ASN A 44 10.877 18.740 16.597 1.00 17.51 C ATOM 354 OD1 ASN A 44 11.845 18.675 15.819 1.00 20.30 O ATOM 355 ND2 ASN A 44 9.630 18.683 16.131 1.00 16.80 N ATOM 356 N ARG A 45 13.438 17.530 20.284 1.00 15.87 N ATOM 357 CA ARG A 45 14.004 17.690 21.624 1.00 16.06 C ATOM 358 C ARG A 45 14.037 19.160 22.016 1.00 17.54 C ATOM 359 O ARG A 45 14.365 20.027 21.213 1.00 18.09 O ATOM 360 CB ARG A 45 15.444 17.174 21.659 1.00 19.49 C ATOM 361 CG ARG A 45 15.986 16.903 23.059 1.00 15.81 C ATOM 362 CD ARG A 45 15.351 15.624 23.557 1.00 25.18 C ATOM 363 NE ARG A 45 15.791 15.165 24.853 1.00 30.71 N ATOM 364 CZ ARG A 45 16.740 14.288 25.134 1.00 27.82 C ATOM 365 NH1 ARG A 45 16.949 14.025 26.418 1.00 28.93 N ATOM 366 NH2 ARG A 45 17.459 13.698 24.194 1.00 32.48 N ATOM 367 N ASN A 46 13.657 19.431 23.255 1.00 15.69 N ATOM 368 CA ASN A 46 13.691 20.783 23.795 1.00 17.20 C ATOM 369 C ASN A 46 15.029 20.983 24.514 1.00 17.91 C ATOM 370 O ASN A 46 15.658 20.013 24.936 1.00 18.81 O ATOM 371 CB ASN A 46 12.519 20.961 24.750 1.00 16.03 C ATOM 372 CG ASN A 46 11.176 20.724 24.095 1.00 21.74 C ATOM 373 OD1 ASN A 46 10.355 20.003 24.672 1.00 21.91 O ATOM 374 ND2 ASN A 46 10.921 21.249 22.907 1.00 22.89 N ATOM 375 N THR A 47 15.412 22.248 24.690 1.00 19.67 N ATOM 376 CA THR A 47 16.650 22.563 25.388 1.00 20.37 C ATOM 377 C THR A 47 16.661 22.100 26.826 1.00 20.76 C ATOM 378 O THR A 47 17.751 21.780 27.305 1.00 21.54 O ATOM 379 CB THR A 47 16.977 24.075 25.381 1.00 27.12 C ATOM 380 OG1 THR A 47 15.949 24.786 26.076 1.00 29.45 O ATOM 381 CG2 THR A 47 17.076 24.563 23.946 1.00 28.33 C ATOM 382 N ASP A 48 15.521 21.993 27.506 1.00 19.67 N ATOM 383 CA ASP A 48 15.483 21.544 28.883 1.00 19.14 C ATOM 384 C ASP A 48 15.563 20.034 28.998 1.00 19.12 C ATOM 385 O ASP A 48 15.589 19.516 30.124 1.00 19.76 O ATOM 386 CB ASP A 48 14.246 22.078 29.607 1.00 17.48 C ATOM 387 CG ASP A 48 12.955 21.486 29.106 1.00 17.83 C ATOM 388 OD1 ASP A 48 12.996 20.605 28.218 1.00 14.85 O ATOM 389 OD2 ASP A 48 11.863 21.869 29.585 1.00 24.15 O ATOM 390 N GLY A 49 15.711 19.316 27.891 1.00 16.97 N ATOM 391 CA GLY A 49 15.866 17.879 27.811 1.00 18.17 C ATOM 392 C GLY A 49 14.575 17.108 27.667 1.00 16.79 C ATOM 393 O GLY A 49 14.613 15.879 27.552 1.00 17.78 O ATOM 394 N SER A 50 13.456 17.808 27.703 1.00 15.19 N ATOM 395 CA SER A 50 12.179 17.114 27.463 1.00 14.12 C ATOM 396 C SER A 50 12.089 17.004 25.937 1.00 13.24 C ATOM 397 O SER A 50 12.954 17.499 25.220 1.00 12.87 O ATOM 398 CB SER A 50 11.011 17.906 28.039 1.00 13.16 C ATOM 399 OG SER A 50 10.981 19.180 27.409 1.00 14.96 O ATOM 400 N THR A 51 11.073 16.286 25.464 1.00 12.78 N ATOM 401 CA THR A 51 10.840 16.154 24.027 1.00 12.79 C ATOM 402 C THR A 51 9.358 16.419 23.758 1.00 13.79 C ATOM 403 O THR A 51 8.476 16.143 24.560 1.00 13.23 O ATOM 404 CB THR A 51 11.225 14.746 23.565 1.00 12.34 C ATOM 405 OG1 THR A 51 12.596 14.522 23.941 1.00 12.44 O ATOM 406 CG2 THR A 51 11.125 14.569 22.049 1.00 11.50 C ATOM 407 N ASP A 52 9.112 16.974 22.558 1.00 13.36 N ATOM 408 CA ASP A 52 7.751 17.230 22.092 1.00 13.27 C ATOM 409 C ASP A 52 7.365 16.138 21.098 1.00 13.99 C ATOM 410 O ASP A 52 8.178 15.768 20.247 1.00 13.69 O ATOM 411 CB ASP A 52 7.683 18.589 21.393 1.00 12.91 C ATOM 412 CG ASP A 52 7.711 19.765 22.352 1.00 17.41 C ATOM 413 OD1 ASP A 52 7.632 19.600 23.577 1.00 16.32 O ATOM 414 OD2 ASP A 52 7.798 20.897 21.821 1.00 19.54 O ATOM 415 N TYR A 53 6.158 15.613 21.221 1.00 12.70 N ATOM 416 CA TYR A 53 5.712 14.497 20.407 1.00 13.43 C ATOM 417 C TYR A 53 4.401 14.713 19.667 1.00 12.80 C ATOM 418 O TYR A 53 3.406 15.217 20.192 1.00 12.87 O ATOM 419 CB TYR A 53 5.450 13.272 21.328 1.00 12.20 C ATOM 420 CG TYR A 53 6.689 12.771 22.032 1.00 11.53 C ATOM 421 CD1 TYR A 53 7.102 13.340 23.220 1.00 12.21 C ATOM 422 CD2 TYR A 53 7.467 11.756 21.459 1.00 11.27 C ATOM 423 CE1 TYR A 53 8.252 12.936 23.865 1.00 11.70 C ATOM 424 CE2 TYR A 53 8.616 11.324 22.109 1.00 10.80 C ATOM 425 CZ TYR A 53 8.993 11.921 23.294 1.00 11.40 C ATOM 426 OH TYR A 53 10.141 11.462 23.916 1.00 12.14 O ATOM 427 N GLY A 54 4.377 14.261 18.409 1.00 12.80 N ATOM 428 CA GLY A 54 3.196 14.149 17.611 1.00 12.45 C ATOM 429 C GLY A 54 2.718 15.409 16.911 1.00 13.24 C ATOM 430 O GLY A 54 3.387 16.440 16.830 1.00 13.19 O ATOM 431 N ILE A 55 1.486 15.260 16.431 1.00 13.98 N ATOM 432 CA ILE A 55 0.824 16.315 15.662 1.00 13.71 C ATOM 433 C ILE A 55 0.709 17.642 16.380 1.00 13.72 C ATOM 434 O ILE A 55 0.733 18.679 15.723 1.00 13.06 O ATOM 435 CB ILE A 55 -0.576 15.788 15.267 1.00 18.90 C ATOM 436 CG1 ILE A 55 -1.272 16.703 14.258 1.00 28.94 C ATOM 437 CG2 ILE A 55 -1.474 15.532 16.462 1.00 18.47 C ATOM 438 CD1 ILE A 55 -1.143 16.136 12.863 1.00 28.28 C ATOM 439 N LEU A 56 0.579 17.637 17.707 1.00 13.89 N ATOM 440 CA LEU A 56 0.511 18.878 18.464 1.00 13.26 C ATOM 441 C LEU A 56 1.725 19.033 19.378 1.00 13.84 C ATOM 442 O LEU A 56 1.693 19.885 20.266 1.00 13.70 O ATOM 443 CB LEU A 56 -0.827 18.980 19.231 1.00 12.22 C ATOM 444 CG LEU A 56 -2.019 19.308 18.290 1.00 15.11 C ATOM 445 CD1 LEU A 56 -3.361 19.027 18.947 1.00 14.40 C ATOM 446 CD2 LEU A 56 -1.915 20.769 17.881 1.00 15.30 C ATOM 447 N GLN A 57 2.833 18.326 19.115 1.00 12.52 N ATOM 448 CA GLN A 57 4.075 18.517 19.860 1.00 11.86 C ATOM 449 C GLN A 57 3.842 18.671 21.366 1.00 12.75 C ATOM 450 O GLN A 57 4.323 19.608 22.010 1.00 12.81 O ATOM 451 CB GLN A 57 4.851 19.723 19.275 1.00 9.79 C ATOM 452 CG GLN A 57 5.344 19.423 17.837 1.00 10.50 C ATOM 453 CD GLN A 57 6.463 18.397 17.841 1.00 10.63 C ATOM 454 OE1 GLN A 57 7.624 18.760 18.077 1.00 12.76 O ATOM 455 NE2 GLN A 57 6.128 17.130 17.594 1.00 11.89 N ATOM 456 N ILE A 58 3.269 17.611 21.925 1.00 12.44 N ATOM 457 CA ILE A 58 2.960 17.556 23.365 1.00 12.03 C ATOM 458 C ILE A 58 4.248 17.218 24.098 1.00 13.00 C ATOM 459 O ILE A 58 4.979 16.309 23.699 1.00 12.27 O ATOM 460 CB ILE A 58 1.821 16.541 23.558 1.00 14.33 C ATOM 461 CG1 ILE A 58 0.551 17.172 22.943 1.00 15.72 C ATOM 462 CG2 ILE A 58 1.640 16.227 25.037 1.00 16.30 C ATOM 463 CD1 ILE A 58 -0.623 16.207 22.939 1.00 19.58 C ATOM 464 N ASN A 59 4.548 17.977 25.152 1.00 13.56 N ATOM 465 CA ASN A 59 5.821 17.864 25.841 1.00 15.06 C ATOM 466 C ASN A 59 5.887 16.861 26.975 1.00 15.66 C ATOM 467 O ASN A 59 4.961 16.744 27.761 1.00 17.53 O ATOM 468 CB ASN A 59 6.186 19.261 26.397 1.00 16.59 C ATOM 469 CG ASN A 59 7.634 19.275 26.857 1.00 21.97 C ATOM 470 OD1 ASN A 59 7.946 19.352 28.033 1.00 34.80 O ATOM 471 ND2 ASN A 59 8.538 19.171 25.898 1.00 37.21 N ATOM 472 N SER A 60 7.014 16.173 27.092 1.00 14.88 N ATOM 473 CA SER A 60 7.243 15.161 28.096 1.00 15.86 C ATOM 474 C SER A 60 7.554 15.763 29.460 1.00 17.19 C ATOM 475 O SER A 60 7.489 14.998 30.402 1.00 19.11 O ATOM 476 CB SER A 60 8.384 14.251 27.630 1.00 11.55 C ATOM 477 OG SER A 60 9.605 14.993 27.628 1.00 14.76 O ATOM 478 N ARG A 61 7.798 17.058 29.591 1.00 17.46 N ATOM 479 CA ARG A 61 8.065 17.598 30.938 1.00 18.93 C ATOM 480 C ARG A 61 6.808 17.516 31.793 1.00 19.51 C ATOM 481 O ARG A 61 6.933 17.252 32.986 1.00 21.21 O ATOM 482 CB ARG A 61 8.588 19.033 30.897 1.00 25.26 C ATOM 483 CG ARG A 61 8.782 19.586 32.321 1.00 31.29 C ATOM 484 CD ARG A 61 9.980 20.503 32.391 1.00 40.32 C ATOM 485 NE ARG A 61 11.186 19.943 31.814 1.00 46.29 N ATOM 486 CZ ARG A 61 11.997 19.039 32.347 1.00 46.51 C ATOM 487 NH1 ARG A 61 11.764 18.517 33.548 1.00 44.12 N ATOM 488 NH2 ARG A 61 13.064 18.664 31.652 1.00 43.34 N ATOM 489 N TRP A 62 5.631 17.705 31.194 1.00 17.36 N ATOM 490 CA TRP A 62 4.399 17.678 31.968 1.00 17.09 C ATOM 491 C TRP A 62 3.358 16.656 31.599 1.00 15.64 C ATOM 492 O TRP A 62 2.590 16.155 32.442 1.00 15.50 O ATOM 493 CB TRP A 62 3.670 19.047 31.794 1.00 21.49 C ATOM 494 CG TRP A 62 4.497 20.216 32.242 1.00 25.27 C ATOM 495 CD1 TRP A 62 5.185 21.093 31.451 1.00 31.43 C ATOM 496 CD2 TRP A 62 4.759 20.599 33.591 1.00 33.57 C ATOM 497 NE1 TRP A 62 5.848 22.013 32.235 1.00 36.44 N ATOM 498 CE2 TRP A 62 5.601 21.725 33.551 1.00 36.42 C ATOM 499 CE3 TRP A 62 4.349 20.092 34.830 1.00 37.32 C ATOM 500 CZ2 TRP A 62 6.046 22.359 34.713 1.00 40.44 C ATOM 501 CZ3 TRP A 62 4.793 20.720 35.982 1.00 43.37 C ATOM 502 CH2 TRP A 62 5.628 21.843 35.907 1.00 42.07 C ATOM 503 N TRP A 63 3.258 16.334 30.301 1.00 14.66 N ATOM 504 CA TRP A 63 2.100 15.607 29.826 1.00 14.06 C ATOM 505 C TRP A 63 2.159 14.148 29.490 1.00 13.80 C ATOM 506 O TRP A 63 1.127 13.484 29.588 1.00 15.16 O ATOM 507 CB TRP A 63 1.599 16.379 28.555 1.00 14.24 C ATOM 508 CG TRP A 63 1.403 17.834 28.890 1.00 14.30 C ATOM 509 CD1 TRP A 63 2.177 18.876 28.462 1.00 15.36 C ATOM 510 CD2 TRP A 63 0.406 18.376 29.768 1.00 14.38 C ATOM 511 NE1 TRP A 63 1.698 20.050 29.012 1.00 18.28 N ATOM 512 CE2 TRP A 63 0.641 19.763 29.823 1.00 14.74 C ATOM 513 CE3 TRP A 63 -0.642 17.810 30.498 1.00 16.06 C ATOM 514 CZ2 TRP A 63 -0.178 20.617 30.582 1.00 17.10 C ATOM 515 CZ3 TRP A 63 -1.447 18.660 31.251 1.00 16.14 C ATOM 516 CH2 TRP A 63 -1.188 20.033 31.276 1.00 16.87 C ATOM 517 N CYS A 64 3.290 13.629 29.038 1.00 14.24 N ATOM 518 CA CYS A 64 3.373 12.217 28.688 1.00 13.13 C ATOM 519 C CYS A 64 4.663 11.664 29.292 1.00 13.66 C ATOM 520 O CYS A 64 5.556 12.462 29.593 1.00 13.70 O ATOM 521 CB CYS A 64 3.288 11.987 27.168 1.00 12.35 C ATOM 522 SG CYS A 64 4.599 12.784 26.194 1.00 12.29 S ATOM 523 N ASN A 65 4.774 10.330 29.350 1.00 13.27 N ATOM 524 CA ASN A 65 6.002 9.742 29.846 1.00 13.40 C ATOM 525 C ASN A 65 6.882 9.167 28.736 1.00 13.11 C ATOM 526 O ASN A 65 6.375 8.371 27.945 1.00 13.38 O ATOM 527 CB ASN A 65 5.684 8.575 30.794 1.00 14.26 C ATOM 528 CG ASN A 65 7.000 7.953 31.257 1.00 17.69 C ATOM 529 OD1 ASN A 65 7.832 8.680 31.776 1.00 17.85 O ATOM 530 ND2 ASN A 65 7.136 6.661 31.000 1.00 23.06 N ATOM 531 N ASP A 66 8.147 9.621 28.713 1.00 13.15 N ATOM 532 CA ASP A 66 9.083 9.071 27.748 1.00 13.84 C ATOM 533 C ASP A 66 10.268 8.406 28.472 1.00 14.87 C ATOM 534 O ASP A 66 11.179 7.970 27.776 1.00 15.07 O ATOM 535 CB ASP A 66 9.574 10.065 26.715 1.00 13.01 C ATOM 536 CG ASP A 66 10.404 11.218 27.206 1.00 13.24 C ATOM 537 OD1 ASP A 66 10.750 11.247 28.386 1.00 15.15 O ATOM 538 OD2 ASP A 66 10.727 12.102 26.374 1.00 13.59 O ATOM 539 N GLY A 67 10.239 8.383 29.790 1.00 15.39 N ATOM 540 CA GLY A 67 11.305 7.739 30.551 1.00 17.01 C ATOM 541 C GLY A 67 12.650 8.402 30.525 1.00 18.70 C ATOM 542 O GLY A 67 13.612 7.852 31.110 1.00 20.29 O ATOM 543 N ARG A 68 12.809 9.558 29.903 1.00 17.00 N ATOM 544 CA ARG A 68 14.100 10.229 29.865 1.00 18.17 C ATOM 545 C ARG A 68 13.970 11.712 30.156 1.00 18.62 C ATOM 546 O ARG A 68 14.817 12.503 29.738 1.00 20.22 O ATOM 547 CB ARG A 68 14.741 9.969 28.507 1.00 16.63 C ATOM 548 CG ARG A 68 14.005 10.632 27.359 1.00 16.60 C ATOM 549 CD ARG A 68 14.949 10.573 26.145 1.00 15.25 C ATOM 550 NE ARG A 68 14.508 11.546 25.131 1.00 16.84 N ATOM 551 CZ ARG A 68 14.969 11.525 23.872 1.00 15.76 C ATOM 552 NH1 ARG A 68 15.890 10.645 23.489 1.00 19.00 N ATOM 553 NH2 ARG A 68 14.524 12.428 22.999 1.00 14.12 N ATOM 554 N THR A 69 12.930 12.114 30.881 1.00 18.96 N ATOM 555 CA THR A 69 12.768 13.533 31.244 1.00 20.03 C ATOM 556 C THR A 69 12.708 13.637 32.769 1.00 22.06 C ATOM 557 O THR A 69 11.642 13.550 33.361 1.00 20.67 O ATOM 558 CB THR A 69 11.506 14.116 30.601 1.00 17.21 C ATOM 559 OG1 THR A 69 11.494 13.791 29.185 1.00 14.31 O ATOM 560 CG2 THR A 69 11.431 15.633 30.715 1.00 14.59 C ATOM 561 N PRO A 70 13.852 13.725 33.424 1.00 24.14 N ATOM 562 CA PRO A 70 13.925 13.747 34.876 1.00 26.59 C ATOM 563 C PRO A 70 13.092 14.840 35.496 1.00 28.31 C ATOM 564 O PRO A 70 13.218 16.003 35.103 1.00 29.43 O ATOM 565 CB PRO A 70 15.401 14.033 35.176 1.00 27.24 C ATOM 566 CG PRO A 70 16.128 13.494 33.994 1.00 27.21 C ATOM 567 CD PRO A 70 15.212 13.768 32.830 1.00 25.98 C ATOM 568 N GLY A 71 12.286 14.461 36.483 1.00 28.93 N ATOM 569 CA GLY A 71 11.481 15.430 37.208 1.00 31.07 C ATOM 570 C GLY A 71 10.126 15.591 36.537 1.00 31.15 C ATOM 571 O GLY A 71 9.428 16.510 36.929 1.00 32.49 O ATOM 572 N SER A 72 9.815 14.734 35.580 1.00 31.97 N ATOM 573 CA SER A 72 8.623 14.778 34.807 1.00 31.32 C ATOM 574 C SER A 72 7.342 14.229 35.404 1.00 30.17 C ATOM 575 O SER A 72 7.224 13.288 36.175 1.00 29.68 O ATOM 576 CB SER A 72 8.817 14.005 33.463 1.00 30.95 C ATOM 577 OG SER A 72 9.225 14.976 32.522 1.00 48.38 O ATOM 578 N ARG A 73 6.301 14.928 34.927 1.00 28.57 N ATOM 579 CA ARG A 73 4.945 14.519 35.239 1.00 26.37 C ATOM 580 C ARG A 73 4.482 13.901 33.921 1.00 25.15 C ATOM 581 O ARG A 73 5.115 14.064 32.857 1.00 25.87 O ATOM 582 CB ARG A 73 4.110 15.689 35.739 1.00 25.25 C ATOM 583 CG ARG A 73 4.725 16.369 36.972 1.00 30.81 C ATOM 584 CD ARG A 73 4.540 15.496 38.207 1.00 34.64 C ATOM 585 NE ARG A 73 3.151 15.213 38.537 1.00 43.61 N ATOM 586 CZ ARG A 73 2.303 15.981 39.205 1.00 46.83 C ATOM 587 NH1 ARG A 73 2.710 17.159 39.668 1.00 49.43 N ATOM 588 NH2 ARG A 73 1.052 15.592 39.424 1.00 50.26 N ATOM 589 N ASN A 74 3.422 13.169 34.011 1.00 22.41 N ATOM 590 CA ASN A 74 2.720 12.476 32.956 1.00 18.90 C ATOM 591 C ASN A 74 1.230 12.741 33.232 1.00 18.51 C ATOM 592 O ASN A 74 0.479 11.826 33.539 1.00 17.69 O ATOM 593 CB ASN A 74 3.052 10.981 33.053 1.00 15.23 C ATOM 594 CG ASN A 74 2.375 10.143 32.010 1.00 17.61 C ATOM 595 OD1 ASN A 74 1.812 10.710 31.047 1.00 16.53 O ATOM 596 ND2 ASN A 74 2.432 8.834 32.130 1.00 17.98 N ATOM 597 N LEU A 75 0.849 14.011 33.069 1.00 17.76 N ATOM 598 CA LEU A 75 -0.548 14.370 33.362 1.00 18.17 C ATOM 599 C LEU A 75 -1.597 13.800 32.447 1.00 17.60 C ATOM 600 O LEU A 75 -2.780 13.699 32.869 1.00 17.69 O ATOM 601 CB LEU A 75 -0.666 15.895 33.476 1.00 20.05 C ATOM 602 CG LEU A 75 0.161 16.474 34.639 1.00 22.89 C ATOM 603 CD1 LEU A 75 0.201 17.987 34.532 1.00 24.89 C ATOM 604 CD2 LEU A 75 -0.371 16.009 35.979 1.00 26.46 C ATOM 605 N CYS A 76 -1.279 13.397 31.211 1.00 16.50 N ATOM 606 CA CYS A 76 -2.239 12.752 30.338 1.00 16.72 C ATOM 607 C CYS A 76 -2.246 11.248 30.516 1.00 16.24 C ATOM 608 O CYS A 76 -3.010 10.507 29.890 1.00 15.79 O ATOM 609 CB CYS A 76 -1.952 13.075 28.852 1.00 14.35 C ATOM 610 SG CYS A 76 -2.205 14.845 28.603 1.00 12.80 S ATOM 611 N ASN A 77 -1.351 10.778 31.398 1.00 17.38 N ATOM 612 CA ASN A 77 -1.222 9.373 31.716 1.00 17.28 C ATOM 613 C ASN A 77 -1.114 8.516 30.457 1.00 18.05 C ATOM 614 O ASN A 77 -1.879 7.602 30.190 1.00 19.07 O ATOM 615 CB AASN A 77 -2.330 8.861 32.635 0.50 19.29 C ATOM 616 CB BASN A 77 -2.458 8.917 32.513 0.50 17.92 C ATOM 617 CG AASN A 77 -1.953 7.532 33.270 0.50 22.46 C ATOM 618 CG BASN A 77 -2.707 9.722 33.771 0.50 23.19 C ATOM 619 OD1AASN A 77 -2.840 6.733 33.572 0.50 30.03 O ATOM 620 OD1BASN A 77 -1.899 9.711 34.694 0.50 22.14 O ATOM 621 ND2AASN A 77 -0.669 7.267 33.489 0.50 23.82 N ATOM 622 ND2BASN A 77 -3.834 10.425 33.785 0.50 22.71 N ATOM 623 N ILE A 78 -0.096 8.821 29.647 1.00 16.67 N ATOM 624 CA ILE A 78 0.089 8.093 28.375 1.00 16.83 C ATOM 625 C ILE A 78 1.571 8.062 28.071 1.00 16.79 C ATOM 626 O ILE A 78 2.288 9.015 28.373 1.00 15.80 O ATOM 627 CB ILE A 78 -0.703 8.911 27.332 1.00 20.32 C ATOM 628 CG1 ILE A 78 -0.977 8.184 26.020 1.00 22.75 C ATOM 629 CG2 ILE A 78 -0.075 10.268 27.049 1.00 18.60 C ATOM 630 CD1 ILE A 78 -2.121 7.193 26.190 1.00 27.62 C ATOM 631 N PRO A 79 2.060 6.975 27.491 1.00 15.84 N ATOM 632 CA PRO A 79 3.432 6.905 27.000 1.00 15.30 C ATOM 633 C PRO A 79 3.545 7.953 25.897 1.00 15.24 C ATOM 634 O PRO A 79 2.606 8.061 25.106 1.00 15.04 O ATOM 635 CB PRO A 79 3.527 5.505 26.379 1.00 15.36 C ATOM 636 CG PRO A 79 2.337 4.757 26.868 1.00 17.63 C ATOM 637 CD PRO A 79 1.269 5.775 27.121 1.00 15.90 C ATOM 638 N CYS A 80 4.657 8.684 25.769 1.00 13.72 N ATOM 639 CA CYS A 80 4.743 9.688 24.698 1.00 14.15 C ATOM 640 C CYS A 80 4.680 9.041 23.325 1.00 14.31 C ATOM 641 O CYS A 80 4.230 9.664 22.358 1.00 14.82 O ATOM 642 CB CYS A 80 6.043 10.492 24.833 1.00 12.75 C ATOM 643 SG CYS A 80 6.159 11.473 26.337 1.00 11.08 S ATOM 644 N SER A 81 5.097 7.787 23.190 1.00 14.14 N ATOM 645 CA SER A 81 5.035 7.100 21.892 1.00 15.73 C ATOM 646 C SER A 81 3.609 6.967 21.397 1.00 17.04 C ATOM 647 O SER A 81 3.336 6.912 20.179 1.00 18.31 O ATOM 648 CB SER A 81 5.724 5.730 22.096 1.00 20.50 C ATOM 649 OG SER A 81 4.882 4.936 22.919 1.00 21.04 O ATOM 650 N ALA A 82 2.613 6.925 22.284 1.00 17.55 N ATOM 651 CA ALA A 82 1.202 6.829 21.896 1.00 19.09 C ATOM 652 C ALA A 82 0.689 8.093 21.244 1.00 20.22 C ATOM 653 O ALA A 82 -0.351 8.134 20.564 1.00 20.99 O ATOM 654 CB ALA A 82 0.373 6.422 23.116 1.00 19.91 C ATOM 655 N LEU A 83 1.468 9.189 21.325 1.00 19.14 N ATOM 656 CA LEU A 83 1.114 10.441 20.672 1.00 18.22 C ATOM 657 C LEU A 83 1.631 10.500 19.241 1.00 17.88 C ATOM 658 O LEU A 83 1.591 11.556 18.590 1.00 18.02 O ATOM 659 CB LEU A 83 1.651 11.589 21.532 1.00 16.41 C ATOM 660 CG LEU A 83 1.159 11.566 22.988 1.00 17.08 C ATOM 661 CD1 LEU A 83 1.746 12.787 23.682 1.00 20.50 C ATOM 662 CD2 LEU A 83 -0.368 11.505 23.051 1.00 21.70 C ATOM 663 N LEU A 84 2.243 9.421 18.748 1.00 17.90 N ATOM 664 CA LEU A 84 2.812 9.395 17.404 1.00 17.56 C ATOM 665 C LEU A 84 2.023 8.554 16.425 1.00 17.56 C ATOM 666 O LEU A 84 2.314 8.439 15.224 1.00 18.07 O ATOM 667 CB LEU A 84 4.255 8.847 17.461 1.00 17.51 C ATOM 668 CG LEU A 84 5.188 9.587 18.402 1.00 19.56 C ATOM 669 CD1 LEU A 84 6.599 8.985 18.301 1.00 19.02 C ATOM 670 CD2 LEU A 84 5.288 11.076 18.134 1.00 15.18 C ATOM 671 N SER A 85 0.948 7.974 16.935 1.00 18.11 N ATOM 672 CA SER A 85 0.064 7.104 16.186 1.00 18.71 C ATOM 673 C SER A 85 -0.627 7.799 15.020 1.00 19.48 C ATOM 674 O SER A 85 -0.854 9.015 15.046 1.00 20.41 O ATOM 675 CB ASER A 85 -1.010 6.573 17.152 0.50 20.52 C ATOM 676 CB BSER A 85 -1.006 6.559 17.148 0.50 19.28 C ATOM 677 OG ASER A 85 -1.911 5.724 16.470 0.50 18.30 O ATOM 678 OG BSER A 85 -1.479 7.585 18.005 0.50 14.26 O ATOM 679 N SER A 86 -1.050 6.991 14.046 1.00 18.39 N ATOM 680 CA SER A 86 -1.833 7.518 12.925 1.00 18.98 C ATOM 681 C SER A 86 -3.233 7.946 13.363 1.00 19.55 C ATOM 682 O SER A 86 -3.877 8.800 12.755 1.00 21.91 O ATOM 683 CB SER A 86 -1.885 6.501 11.781 1.00 28.82 C ATOM 684 OG SER A 86 -2.374 5.244 12.224 1.00 32.53 O ATOM 685 N ASP A 87 -3.746 7.396 14.454 1.00 18.54 N ATOM 686 CA ASP A 87 -5.023 7.754 15.052 1.00 17.67 C ATOM 687 C ASP A 87 -4.738 8.880 16.050 1.00 16.94 C ATOM 688 O ASP A 87 -3.931 8.677 16.956 1.00 16.53 O ATOM 689 CB ASP A 87 -5.610 6.523 15.729 1.00 19.19 C ATOM 690 CG ASP A 87 -6.887 6.747 16.498 1.00 24.83 C ATOM 691 OD1 ASP A 87 -7.162 7.844 17.009 1.00 20.38 O ATOM 692 OD2 ASP A 87 -7.681 5.777 16.631 1.00 26.78 O ATOM 693 N ILE A 88 -5.331 10.059 15.885 1.00 15.81 N ATOM 694 CA ILE A 88 -5.012 11.198 16.734 1.00 14.90 C ATOM 695 C ILE A 88 -5.758 11.246 18.058 1.00 14.53 C ATOM 696 O ILE A 88 -5.580 12.228 18.803 1.00 14.34 O ATOM 697 CB ILE A 88 -5.215 12.540 15.976 1.00 13.07 C ATOM 698 CG1 ILE A 88 -6.689 12.822 15.713 1.00 16.88 C ATOM 699 CG2 ILE A 88 -4.378 12.529 14.692 1.00 15.25 C ATOM 700 CD1 ILE A 88 -6.921 14.242 15.210 1.00 17.37 C ATOM 701 N THR A 89 -6.524 10.212 18.404 1.00 13.93 N ATOM 702 CA THR A 89 -7.303 10.243 19.632 1.00 13.76 C ATOM 703 C THR A 89 -6.508 10.633 20.868 1.00 14.16 C ATOM 704 O THR A 89 -6.932 11.524 21.628 1.00 14.13 O ATOM 705 CB THR A 89 -8.021 8.888 19.844 1.00 17.13 C ATOM 706 OG1 THR A 89 -8.880 8.585 18.741 1.00 17.25 O ATOM 707 CG2 THR A 89 -8.833 8.891 21.128 1.00 17.08 C ATOM 708 N ALA A 90 -5.364 10.006 21.111 1.00 14.14 N ATOM 709 CA ALA A 90 -4.612 10.300 22.340 1.00 13.95 C ATOM 710 C ALA A 90 -4.102 11.727 22.387 1.00 13.93 C ATOM 711 O ALA A 90 -4.145 12.398 23.436 1.00 14.20 O ATOM 712 CB ALA A 90 -3.479 9.285 22.477 1.00 16.92 C ATOM 713 N SER A 91 -3.613 12.195 21.233 1.00 13.80 N ATOM 714 CA SER A 91 -3.117 13.570 21.141 1.00 12.79 C ATOM 715 C SER A 91 -4.258 14.556 21.417 1.00 12.65 C ATOM 716 O SER A 91 -4.021 15.544 22.088 1.00 13.98 O ATOM 717 CB SER A 91 -2.503 13.877 19.781 1.00 14.04 C ATOM 718 OG SER A 91 -1.194 13.311 19.667 1.00 12.81 O ATOM 719 N VAL A 92 -5.435 14.288 20.852 1.00 12.64 N ATOM 720 CA VAL A 92 -6.555 15.213 21.108 1.00 12.99 C ATOM 721 C VAL A 92 -6.975 15.179 22.564 1.00 14.03 C ATOM 722 O VAL A 92 -7.159 16.253 23.167 1.00 14.85 O ATOM 723 CB VAL A 92 -7.749 14.860 20.202 1.00 14.47 C ATOM 724 CG1 VAL A 92 -8.986 15.660 20.618 1.00 14.77 C ATOM 725 CG2 VAL A 92 -7.374 15.170 18.755 1.00 16.57 C ATOM 726 N ASN A 93 -7.101 13.990 23.173 1.00 14.37 N ATOM 727 CA ASN A 93 -7.508 13.930 24.580 1.00 14.89 C ATOM 728 C ASN A 93 -6.525 14.699 25.464 1.00 14.52 C ATOM 729 O ASN A 93 -6.903 15.377 26.433 1.00 15.52 O ATOM 730 CB ASN A 93 -7.544 12.465 25.066 1.00 16.92 C ATOM 731 CG ASN A 93 -8.702 11.650 24.545 1.00 26.22 C ATOM 732 OD1 ASN A 93 -8.668 10.408 24.525 1.00 29.79 O ATOM 733 ND2 ASN A 93 -9.762 12.320 24.141 1.00 25.39 N ATOM 734 N CYS A 94 -5.236 14.545 25.162 1.00 13.24 N ATOM 735 CA CYS A 94 -4.190 15.212 25.914 1.00 12.58 C ATOM 736 C CYS A 94 -4.207 16.707 25.624 1.00 13.66 C ATOM 737 O CYS A 94 -4.082 17.481 26.580 1.00 12.38 O ATOM 738 CB CYS A 94 -2.835 14.548 25.649 1.00 12.11 C ATOM 739 SG CYS A 94 -1.514 15.193 26.719 1.00 12.21 S ATOM 740 N ALA A 95 -4.383 17.116 24.375 1.00 14.17 N ATOM 741 CA ALA A 95 -4.474 18.539 24.058 1.00 13.88 C ATOM 742 C ALA A 95 -5.627 19.226 24.788 1.00 13.75 C ATOM 743 O ALA A 95 -5.504 20.373 25.219 1.00 13.71 O ATOM 744 CB ALA A 95 -4.636 18.738 22.553 1.00 12.66 C ATOM 745 N LYS A 96 -6.749 18.532 24.996 1.00 13.49 N ATOM 746 CA LYS A 96 -7.851 19.133 25.758 1.00 13.23 C ATOM 747 C LYS A 96 -7.407 19.461 27.180 1.00 13.65 C ATOM 748 O LYS A 96 -7.865 20.472 27.733 1.00 15.26 O ATOM 749 CB LYS A 96 -9.065 18.192 25.767 1.00 12.83 C ATOM 750 CG LYS A 96 -9.712 18.090 24.390 1.00 14.55 C ATOM 751 CD LYS A 96 -10.830 17.055 24.395 1.00 14.51 C ATOM 752 CE LYS A 96 -11.561 17.073 23.055 1.00 16.86 C ATOM 753 NZ LYS A 96 -12.571 15.944 23.061 1.00 20.49 N ATOM 754 N LYS A 97 -6.608 18.549 27.786 1.00 13.10 N ATOM 755 CA LYS A 97 -6.130 18.864 29.143 1.00 13.93 C ATOM 756 C LYS A 97 -5.180 20.051 29.129 1.00 14.45 C ATOM 757 O LYS A 97 -5.217 20.925 30.008 1.00 15.18 O ATOM 758 CB LYS A 97 -5.400 17.610 29.668 1.00 14.43 C ATOM 759 CG LYS A 97 -6.329 16.432 29.960 1.00 18.28 C ATOM 760 CD LYS A 97 -5.452 15.238 30.361 1.00 24.01 C ATOM 761 CE LYS A 97 -6.340 14.047 30.708 1.00 28.70 C ATOM 762 NZ LYS A 97 -7.055 14.346 31.984 1.00 38.09 N ATOM 763 N ILE A 98 -4.268 20.079 28.137 1.00 13.44 N ATOM 764 CA ILE A 98 -3.287 21.167 28.059 1.00 13.11 C ATOM 765 C ILE A 98 -3.979 22.518 27.938 1.00 13.98 C ATOM 766 O ILE A 98 -3.685 23.464 28.681 1.00 15.23 O ATOM 767 CB ILE A 98 -2.306 20.964 26.887 1.00 12.74 C ATOM 768 CG1 ILE A 98 -1.481 19.685 27.088 1.00 15.28 C ATOM 769 CG2 ILE A 98 -1.371 22.172 26.758 1.00 11.29 C ATOM 770 CD1 ILE A 98 -0.735 19.252 25.831 1.00 14.28 C ATOM 771 N VAL A 99 -4.919 22.634 27.008 1.00 14.00 N ATOM 772 CA VAL A 99 -5.610 23.904 26.746 1.00 14.71 C ATOM 773 C VAL A 99 -6.519 24.352 27.880 1.00 16.29 C ATOM 774 O VAL A 99 -6.919 25.513 27.943 1.00 16.68 O ATOM 775 CB VAL A 99 -6.376 23.821 25.414 1.00 12.95 C ATOM 776 CG1 VAL A 99 -7.622 22.972 25.507 1.00 15.00 C ATOM 777 CG2 VAL A 99 -6.709 25.216 24.891 1.00 14.40 C ATOM 778 N SER A 100 -6.822 23.431 28.794 1.00 16.10 N ATOM 779 CA SER A 100 -7.628 23.721 29.965 1.00 18.30 C ATOM 780 C SER A 100 -6.761 24.090 31.160 1.00 18.68 C ATOM 781 O SER A 100 -7.294 24.343 32.246 1.00 20.11 O ATOM 782 CB SER A 100 -8.440 22.470 30.296 1.00 16.65 C ATOM 783 OG SER A 100 -9.347 22.068 29.277 1.00 19.71 O ATOM 784 N ASP A 101 -5.443 24.100 31.044 1.00 18.52 N ATOM 785 CA ASP A 101 -4.551 24.318 32.188 1.00 19.48 C ATOM 786 C ASP A 101 -4.439 25.751 32.681 1.00 20.06 C ATOM 787 O ASP A 101 -3.870 25.967 33.767 1.00 21.45 O ATOM 788 CB ASP A 101 -3.182 23.737 31.833 1.00 22.09 C ATOM 789 CG ASP A 101 -2.307 23.447 33.042 1.00 28.56 C ATOM 790 OD1 ASP A 101 -2.751 22.672 33.906 1.00 30.69 O ATOM 791 OD2 ASP A 101 -1.194 24.006 33.100 1.00 29.39 O ATOM 792 N GLY A 102 -4.930 26.742 31.970 1.00 19.45 N ATOM 793 CA GLY A 102 -4.898 28.112 32.466 1.00 19.52 C ATOM 794 C GLY A 102 -4.594 29.167 31.427 1.00 18.90 C ATOM 795 O GLY A 102 -5.168 30.264 31.426 1.00 19.27 O ATOM 796 N ASN A 103 -3.671 28.834 30.526 1.00 17.54 N ATOM 797 CA ASN A 103 -3.234 29.800 29.526 1.00 16.22 C ATOM 798 C ASN A 103 -3.734 29.500 28.124 1.00 14.21 C ATOM 799 O ASN A 103 -3.217 30.124 27.192 1.00 15.07 O ATOM 800 CB ASN A 103 -1.700 29.866 29.488 1.00 18.05 C ATOM 801 CG ASN A 103 -1.175 30.310 30.848 1.00 23.49 C ATOM 802 OD1 ASN A 103 -1.730 31.232 31.431 1.00 25.06 O ATOM 803 ND2 ASN A 103 -0.135 29.619 31.312 1.00 27.78 N ATOM 804 N GLY A 104 -4.761 28.679 28.019 1.00 12.62 N ATOM 805 CA GLY A 104 -5.381 28.411 26.724 1.00 12.88 C ATOM 806 C GLY A 104 -4.356 27.869 25.736 1.00 12.56 C ATOM 807 O GLY A 104 -3.452 27.114 26.109 1.00 12.94 O ATOM 808 N MET A 105 -4.478 28.322 24.493 1.00 11.50 N ATOM 809 CA MET A 105 -3.564 27.832 23.461 1.00 11.04 C ATOM 810 C MET A 105 -2.196 28.486 23.535 1.00 11.84 C ATOM 811 O MET A 105 -1.329 28.071 22.757 1.00 11.99 O ATOM 812 CB MET A 105 -4.138 27.941 22.044 1.00 12.59 C ATOM 813 CG MET A 105 -5.218 26.866 21.851 1.00 10.74 C ATOM 814 SD MET A 105 -5.752 26.759 20.136 1.00 11.07 S ATOM 815 CE MET A 105 -4.396 25.782 19.457 1.00 15.91 C ATOM 816 N ASN A 106 -1.932 29.429 24.432 1.00 11.22 N ATOM 817 CA ASN A 106 -0.581 29.976 24.546 1.00 12.48 C ATOM 818 C ASN A 106 0.392 28.906 25.028 1.00 13.49 C ATOM 819 O ASN A 106 1.596 29.109 24.874 1.00 14.44 O ATOM 820 CB ASN A 106 -0.547 31.171 25.500 1.00 12.42 C ATOM 821 CG ASN A 106 -1.372 32.321 24.992 1.00 13.53 C ATOM 822 OD1 ASN A 106 -1.021 32.991 24.004 1.00 13.91 O ATOM 823 ND2 ASN A 106 -2.501 32.577 25.664 1.00 12.59 N ATOM 824 N ALA A 107 -0.105 27.768 25.505 1.00 12.94 N ATOM 825 CA ALA A 107 0.754 26.643 25.850 1.00 13.10 C ATOM 826 C ALA A 107 1.573 26.197 24.630 1.00 14.73 C ATOM 827 O ALA A 107 2.678 25.685 24.862 1.00 15.38 O ATOM 828 CB ALA A 107 -0.040 25.452 26.346 1.00 13.35 C ATOM 829 N TRP A 108 1.016 26.348 23.433 1.00 13.94 N ATOM 830 CA TRP A 108 1.792 26.032 22.228 1.00 14.95 C ATOM 831 C TRP A 108 2.468 27.324 21.766 1.00 15.45 C ATOM 832 O TRP A 108 1.820 28.222 21.212 1.00 15.12 O ATOM 833 CB TRP A 108 0.867 25.494 21.145 1.00 12.27 C ATOM 834 CG TRP A 108 0.340 24.125 21.451 1.00 12.97 C ATOM 835 CD1 TRP A 108 0.973 22.954 21.098 1.00 13.33 C ATOM 836 CD2 TRP A 108 -0.855 23.744 22.137 1.00 12.18 C ATOM 837 NE1 TRP A 108 0.242 21.878 21.541 1.00 11.97 N ATOM 838 CE2 TRP A 108 -0.892 22.345 22.187 1.00 12.29 C ATOM 839 CE3 TRP A 108 -1.895 24.475 22.738 1.00 14.22 C ATOM 840 CZ2 TRP A 108 -1.937 21.637 22.775 1.00 12.72 C ATOM 841 CZ3 TRP A 108 -2.963 23.788 23.327 1.00 14.91 C ATOM 842 CH2 TRP A 108 -2.957 22.362 23.357 1.00 12.30 C ATOM 843 N VAL A 109 3.785 27.422 21.963 1.00 16.15 N ATOM 844 CA VAL A 109 4.517 28.629 21.575 1.00 16.88 C ATOM 845 C VAL A 109 4.336 28.942 20.092 1.00 16.07 C ATOM 846 O VAL A 109 4.145 30.135 19.805 1.00 16.46 O ATOM 847 CB VAL A 109 6.003 28.493 21.958 1.00 25.60 C ATOM 848 CG1 VAL A 109 6.820 29.652 21.399 1.00 27.97 C ATOM 849 CG2 VAL A 109 6.171 28.432 23.477 1.00 29.37 C ATOM 850 N ALA A 110 4.314 27.956 19.210 1.00 16.70 N ATOM 851 CA ALA A 110 4.116 28.203 17.785 1.00 15.82 C ATOM 852 C ALA A 110 2.723 28.779 17.516 1.00 16.01 C ATOM 853 O ALA A 110 2.567 29.609 16.613 1.00 15.28 O ATOM 854 CB ALA A 110 4.344 26.954 16.948 1.00 18.42 C ATOM 855 N TRP A 111 1.730 28.332 18.291 1.00 13.89 N ATOM 856 CA TRP A 111 0.399 28.941 18.118 1.00 14.03 C ATOM 857 C TRP A 111 0.439 30.415 18.501 1.00 14.86 C ATOM 858 O TRP A 111 0.010 31.288 17.761 1.00 13.24 O ATOM 859 CB TRP A 111 -0.675 28.255 18.990 1.00 12.15 C ATOM 860 CG TRP A 111 -2.005 28.955 18.861 1.00 13.15 C ATOM 861 CD1 TRP A 111 -2.942 28.734 17.894 1.00 12.87 C ATOM 862 CD2 TRP A 111 -2.534 29.964 19.720 1.00 12.67 C ATOM 863 NE1 TRP A 111 -4.026 29.567 18.088 1.00 11.29 N ATOM 864 CE2 TRP A 111 -3.796 30.325 19.221 1.00 12.21 C ATOM 865 CE3 TRP A 111 -2.056 30.608 20.861 1.00 15.29 C ATOM 866 CZ2 TRP A 111 -4.579 31.296 19.834 1.00 14.29 C ATOM 867 CZ3 TRP A 111 -2.837 31.569 21.484 1.00 14.63 C ATOM 868 CH2 TRP A 111 -4.092 31.916 20.958 1.00 13.59 C ATOM 869 N ARG A 112 1.043 30.736 19.664 1.00 14.40 N ATOM 870 CA ARG A 112 1.124 32.137 20.051 1.00 15.21 C ATOM 871 C ARG A 112 1.908 32.967 19.033 1.00 14.80 C ATOM 872 O ARG A 112 1.460 34.071 18.682 1.00 14.84 O ATOM 873 CB ARG A 112 1.838 32.238 21.432 1.00 17.37 C ATOM 874 CG ARG A 112 1.874 33.702 21.871 1.00 18.15 C ATOM 875 CD ARG A 112 2.343 33.875 23.310 1.00 22.52 C ATOM 876 NE ARG A 112 3.668 33.306 23.498 1.00 28.83 N ATOM 877 CZ ARG A 112 4.829 33.868 23.156 1.00 29.79 C ATOM 878 NH1 ARG A 112 4.873 35.067 22.603 1.00 27.45 N ATOM 879 NH2 ARG A 112 5.956 33.219 23.383 1.00 27.38 N ATOM 880 N ASN A 113 3.030 32.412 18.553 1.00 14.69 N ATOM 881 CA ASN A 113 3.837 33.266 17.655 1.00 13.54 C ATOM 882 C ASN A 113 3.388 33.307 16.213 1.00 13.89 C ATOM 883 O ASN A 113 3.786 34.231 15.486 1.00 14.09 O ATOM 884 CB ASN A 113 5.298 32.763 17.745 1.00 13.29 C ATOM 885 CG ASN A 113 5.976 33.106 19.057 1.00 13.75 C ATOM 886 OD1 ASN A 113 5.639 34.127 19.672 1.00 17.11 O ATOM 887 ND2 ASN A 113 6.931 32.287 19.495 1.00 16.63 N ATOM 888 N ARG A 114 2.648 32.299 15.741 1.00 12.76 N ATOM 889 CA ARG A 114 2.319 32.226 14.308 1.00 12.70 C ATOM 890 C ARG A 114 0.847 32.134 13.982 1.00 12.74 C ATOM 891 O ARG A 114 0.500 32.353 12.810 1.00 13.48 O ATOM 892 CB ARG A 114 3.018 30.935 13.773 1.00 13.37 C ATOM 893 CG ARG A 114 4.518 31.009 14.035 1.00 12.57 C ATOM 894 CD ARG A 114 5.360 29.847 13.561 1.00 12.73 C ATOM 895 NE ARG A 114 5.499 29.930 12.087 1.00 13.18 N ATOM 896 CZ ARG A 114 6.225 29.022 11.429 1.00 13.66 C ATOM 897 NH1 ARG A 114 6.848 28.010 12.050 1.00 13.96 N ATOM 898 NH2 ARG A 114 6.298 29.123 10.104 1.00 15.20 N ATOM 899 N CYS A 115 0.005 31.827 14.983 1.00 13.02 N ATOM 900 CA CYS A 115 -1.405 31.650 14.691 1.00 11.82 C ATOM 901 C CYS A 115 -2.281 32.688 15.396 1.00 13.26 C ATOM 902 O CYS A 115 -3.245 33.175 14.808 1.00 14.49 O ATOM 903 CB CYS A 115 -1.930 30.266 15.111 1.00 10.17 C ATOM 904 SG CYS A 115 -1.065 28.894 14.310 1.00 10.81 S ATOM 905 N LYS A 116 -1.935 32.968 16.638 1.00 12.68 N ATOM 906 CA LYS A 116 -2.732 33.872 17.470 1.00 13.98 C ATOM 907 C LYS A 116 -2.981 35.200 16.773 1.00 14.67 C ATOM 908 O LYS A 116 -2.060 35.851 16.293 1.00 14.91 O ATOM 909 CB LYS A 116 -1.974 34.092 18.786 1.00 9.53 C ATOM 910 CG LYS A 116 -2.764 34.952 19.797 1.00 13.11 C ATOM 911 CD LYS A 116 -1.936 34.981 21.091 1.00 13.14 C ATOM 912 CE LYS A 116 -2.721 35.744 22.162 1.00 13.27 C ATOM 913 NZ LYS A 116 -1.883 35.787 23.422 1.00 14.45 N ATOM 914 N GLY A 117 -4.251 35.597 16.644 1.00 16.40 N ATOM 915 CA GLY A 117 -4.593 36.863 16.029 1.00 17.97 C ATOM 916 C GLY A 117 -4.611 36.902 14.513 1.00 18.71 C ATOM 917 O GLY A 117 -4.949 37.956 13.958 1.00 20.37 O ATOM 918 N THR A 118 -4.273 35.792 13.872 1.00 16.21 N ATOM 919 CA THR A 118 -4.239 35.755 12.415 1.00 16.01 C ATOM 920 C THR A 118 -5.554 35.225 11.883 1.00 15.77 C ATOM 921 O THR A 118 -6.407 34.825 12.673 1.00 14.91 O ATOM 922 CB THR A 118 -3.096 34.866 11.880 1.00 14.72 C ATOM 923 OG1 THR A 118 -3.430 33.495 12.120 1.00 13.23 O ATOM 924 CG2 THR A 118 -1.776 35.245 12.521 1.00 15.36 C ATOM 925 N ASP A 119 -5.718 35.241 10.547 1.00 14.92 N ATOM 926 CA ASP A 119 -6.949 34.738 9.956 1.00 15.76 C ATOM 927 C ASP A 119 -6.929 33.215 9.980 1.00 16.21 C ATOM 928 O ASP A 119 -6.689 32.571 8.976 1.00 16.06 O ATOM 929 CB ASP A 119 -7.014 35.278 8.510 1.00 16.37 C ATOM 930 CG ASP A 119 -8.220 34.797 7.739 1.00 24.33 C ATOM 931 OD1 ASP A 119 -9.221 34.412 8.388 1.00 25.30 O ATOM 932 OD2 ASP A 119 -8.107 34.823 6.490 1.00 26.75 O ATOM 933 N VAL A 120 -7.181 32.582 11.137 1.00 15.22 N ATOM 934 CA VAL A 120 -7.079 31.124 11.243 1.00 15.52 C ATOM 935 C VAL A 120 -8.153 30.362 10.497 1.00 15.62 C ATOM 936 O VAL A 120 -7.996 29.181 10.169 1.00 15.61 O ATOM 937 CB VAL A 120 -7.010 30.652 12.705 1.00 14.50 C ATOM 938 CG1 VAL A 120 -5.751 31.174 13.406 1.00 13.49 C ATOM 939 CG2 VAL A 120 -8.260 31.106 13.426 1.00 18.01 C ATOM 940 N GLN A 121 -9.273 30.994 10.132 1.00 16.86 N ATOM 941 CA GLN A 121 -10.273 30.336 9.315 1.00 15.91 C ATOM 942 C GLN A 121 -9.692 29.922 7.965 1.00 15.75 C ATOM 943 O GLN A 121 -10.167 28.980 7.335 1.00 16.32 O ATOM 944 CB GLN A 121 -11.495 31.223 9.070 1.00 22.07 C ATOM 945 CG GLN A 121 -12.657 30.497 8.406 1.00 27.94 C ATOM 946 CD GLN A 121 -12.614 30.561 6.892 1.00 32.52 C ATOM 947 OE1 GLN A 121 -12.924 29.580 6.207 1.00 35.65 O ATOM 948 NE2 GLN A 121 -12.206 31.703 6.348 1.00 37.52 N ATOM 949 N ALA A 122 -8.664 30.607 7.461 1.00 14.16 N ATOM 950 CA ALA A 122 -8.027 30.196 6.206 1.00 14.48 C ATOM 951 C ALA A 122 -7.622 28.740 6.245 1.00 15.17 C ATOM 952 O ALA A 122 -7.595 28.065 5.210 1.00 15.64 O ATOM 953 CB ALA A 122 -6.822 31.092 5.912 1.00 13.71 C ATOM 954 N TRP A 123 -7.234 28.188 7.408 1.00 14.85 N ATOM 955 CA TRP A 123 -6.812 26.817 7.556 1.00 15.09 C ATOM 956 C TRP A 123 -7.910 25.791 7.334 1.00 15.70 C ATOM 957 O TRP A 123 -7.574 24.626 7.131 1.00 15.01 O ATOM 958 CB TRP A 123 -6.153 26.558 8.944 1.00 13.01 C ATOM 959 CG TRP A 123 -4.873 27.352 9.027 1.00 13.65 C ATOM 960 CD1 TRP A 123 -4.669 28.519 9.711 1.00 15.17 C ATOM 961 CD2 TRP A 123 -3.632 27.050 8.386 1.00 14.16 C ATOM 962 NE1 TRP A 123 -3.381 28.967 9.494 1.00 14.36 N ATOM 963 CE2 TRP A 123 -2.731 28.074 8.704 1.00 16.38 C ATOM 964 CE3 TRP A 123 -3.214 25.995 7.561 1.00 15.02 C ATOM 965 CZ2 TRP A 123 -1.413 28.095 8.223 1.00 17.35 C ATOM 966 CZ3 TRP A 123 -1.915 26.031 7.067 1.00 20.19 C ATOM 967 CH2 TRP A 123 -1.026 27.061 7.411 1.00 18.61 C ATOM 968 N ILE A 124 -9.186 26.173 7.348 1.00 16.26 N ATOM 969 CA ILE A 124 -10.244 25.203 7.081 1.00 17.34 C ATOM 970 C ILE A 124 -10.958 25.562 5.783 1.00 18.63 C ATOM 971 O ILE A 124 -11.938 24.916 5.400 1.00 18.03 O ATOM 972 CB ILE A 124 -11.213 25.069 8.264 1.00 17.88 C ATOM 973 CG1 ILE A 124 -11.838 26.401 8.663 1.00 20.55 C ATOM 974 CG2 ILE A 124 -10.467 24.479 9.476 1.00 17.12 C ATOM 975 CD1 ILE A 124 -12.851 26.299 9.796 1.00 28.01 C ATOM 976 N ARG A 125 -10.388 26.510 5.037 1.00 18.58 N ATOM 977 CA ARG A 125 -10.994 26.967 3.786 1.00 19.52 C ATOM 978 C ARG A 125 -11.056 25.839 2.787 1.00 19.76 C ATOM 979 O ARG A 125 -10.131 25.059 2.624 1.00 20.17 O ATOM 980 CB ARG A 125 -10.203 28.151 3.221 1.00 27.40 C ATOM 981 CG ARG A 125 -10.855 28.871 2.055 1.00 39.28 C ATOM 982 CD ARG A 125 -11.064 30.346 2.332 1.00 48.18 C ATOM 983 NE ARG A 125 -9.952 31.034 2.972 1.00 53.75 N ATOM 984 CZ ARG A 125 -10.104 32.121 3.724 1.00 57.96 C ATOM 985 NH1 ARG A 125 -11.318 32.625 3.921 1.00 62.67 N ATOM 986 NH2 ARG A 125 -9.086 32.743 4.298 1.00 61.35 N ATOM 987 N GLY A 126 -12.222 25.666 2.127 1.00 19.98 N ATOM 988 CA GLY A 126 -12.389 24.617 1.148 1.00 20.71 C ATOM 989 C GLY A 126 -12.705 23.238 1.709 1.00 21.05 C ATOM 990 O GLY A 126 -13.006 22.326 0.933 1.00 22.69 O ATOM 991 N CYS A 127 -12.640 23.079 3.024 1.00 20.04 N ATOM 992 CA CYS A 127 -12.893 21.753 3.586 1.00 20.56 C ATOM 993 C CYS A 127 -14.398 21.535 3.715 1.00 21.00 C ATOM 994 O CYS A 127 -15.106 22.449 4.118 1.00 20.88 O ATOM 995 CB CYS A 127 -12.223 21.588 4.955 1.00 20.27 C ATOM 996 SG CYS A 127 -10.443 21.944 4.947 1.00 18.11 S ATOM 997 N ARG A 128 -14.786 20.327 3.360 1.00 22.07 N ATOM 998 CA ARG A 128 -16.165 19.845 3.461 1.00 24.51 C ATOM 999 C ARG A 128 -16.185 19.162 4.837 1.00 26.37 C ATOM 1000 O ARG A 128 -15.699 18.046 5.040 1.00 27.58 O ATOM 1001 CB ARG A 128 -16.407 18.893 2.307 1.00 23.69 C ATOM 1002 CG ARG A 128 -17.767 18.293 2.147 1.00 36.80 C ATOM 1003 CD ARG A 128 -18.606 18.878 1.000 1.00 47.34 C ATOM 1004 NE ARG A 128 -19.983 18.652 1.462 1.00 52.78 N ATOM 1005 CZ ARG A 128 -20.795 19.592 1.896 1.00 54.36 C ATOM 1006 NH1 ARG A 128 -20.372 20.856 1.947 1.00 59.14 N ATOM 1007 NH2 ARG A 128 -21.988 19.273 2.373 1.00 54.49 N ATOM 1008 N LEU A 129 -16.556 19.949 5.844 1.00 26.47 N ATOM 1009 CA LEU A 129 -16.464 19.472 7.216 1.00 27.32 C ATOM 1010 CB LEU A 129 -15.904 20.629 8.074 1.00 28.32 C ATOM 1011 CG LEU A 129 -14.376 20.692 7.953 1.00 31.26 C ATOM 1012 CD1 LEU A 129 -13.837 22.063 8.284 1.00 33.18 C ATOM 1013 CD2 LEU A 129 -13.758 19.629 8.845 1.00 31.52 C TER 1014 LEU A 129 HETATM 1015 CL CL A 200 -8.573 31.142 26.528 1.00 18.19 CL HETATM 1016 CL CL A 201 -11.694 28.713 12.250 1.00 21.82 CL HETATM 1017 O HOH A 202 10.879 10.613 32.587 1.00 10.97 O HETATM 1018 O HOH A 203 10.289 12.194 14.636 1.00 13.30 O HETATM 1019 O HOH A 204 0.644 15.551 19.649 1.00 13.78 O HETATM 1020 O HOH A 205 8.693 11.787 30.570 1.00 14.14 O HETATM 1021 O HOH A 206 12.958 13.612 26.453 1.00 14.15 O HETATM 1022 O HOH A 207 4.285 31.927 10.426 1.00 14.43 O HETATM 1023 O HOH A 208 -6.938 16.618 3.112 1.00 15.01 O HETATM 1024 O HOH A 209 7.639 26.744 8.912 1.00 15.19 O HETATM 1025 O HOH A 210 -2.286 10.409 19.133 1.00 15.48 O HETATM 1026 O HOH A 211 -1.195 23.202 4.340 1.00 15.81 O HETATM 1027 O HOH A 212 4.482 10.025 9.236 1.00 15.96 O HETATM 1028 O HOH A 213 -6.655 27.410 29.873 1.00 16.34 O HETATM 1029 O HOH A 214 7.137 13.059 31.577 1.00 16.43 O HETATM 1030 O HOH A 215 -2.967 26.170 28.758 1.00 16.45 O HETATM 1031 O HOH A 216 -2.846 31.753 10.013 1.00 16.64 O HETATM 1032 O HOH A 217 9.614 4.677 30.905 1.00 16.94 O HETATM 1033 O HOH A 218 8.449 21.343 18.679 1.00 17.27 O HETATM 1034 O HOH A 219 -0.414 31.336 8.901 1.00 17.68 O HETATM 1035 O HOH A 220 -4.069 11.072 25.838 1.00 17.78 O HETATM 1036 O HOH A 221 -3.386 37.687 25.212 1.00 18.02 O HETATM 1037 O HOH A 222 -1.662 11.131 16.406 1.00 18.03 O HETATM 1038 O HOH A 223 -3.281 31.115 5.697 1.00 18.28 O HETATM 1039 O HOH A 224 -10.939 30.911 24.243 1.00 18.32 O HETATM 1040 O HOH A 225 7.094 24.986 15.739 1.00 18.56 O HETATM 1041 O HOH A 226 -4.578 7.661 19.577 1.00 18.94 O HETATM 1042 O HOH A 227 -2.329 6.339 20.642 1.00 19.32 O HETATM 1043 O HOH A 228 -7.243 34.881 15.339 1.00 19.33 O HETATM 1044 O HOH A 229 2.942 20.443 25.408 1.00 19.37 O HETATM 1045 O HOH A 230 17.901 9.077 24.625 1.00 19.61 O HETATM 1046 O HOH A 231 -0.047 17.718 4.493 1.00 19.75 O HETATM 1047 O HOH A 232 13.490 13.490 18.605 0.50 19.79 O HETATM 1048 O HOH A 233 -6.318 33.019 17.248 1.00 19.85 O HETATM 1049 O HOH A 234 6.916 11.433 32.978 1.00 19.95 O HETATM 1050 O HOH A 235 -3.497 38.476 18.726 1.00 20.26 O HETATM 1051 O HOH A 236 -4.178 32.654 7.872 1.00 20.37 O HETATM 1052 O HOH A 237 -8.400 10.064 14.433 1.00 20.37 O HETATM 1053 O HOH A 238 -18.493 18.493 9.303 0.50 20.39 O HETATM 1054 O HOH A 239 1.385 32.790 10.400 1.00 20.43 O HETATM 1055 O HOH A 240 11.896 11.896 37.210 0.50 20.74 O HETATM 1056 O HOH A 241 -3.961 36.825 8.829 1.00 20.87 O HETATM 1057 O HOH A 242 -6.693 19.428 2.190 1.00 20.90 O HETATM 1058 O HOH A 243 -0.775 38.308 19.723 1.00 20.91 O HETATM 1059 O HOH A 244 -15.875 15.692 11.542 1.00 21.02 O HETATM 1060 O HOH A 245 7.123 16.827 10.556 1.00 21.29 O HETATM 1061 O HOH A 246 13.092 23.814 26.808 1.00 21.60 O HETATM 1062 O HOH A 247 5.471 25.661 20.192 1.00 21.65 O HETATM 1063 O HOH A 248 -4.933 12.015 28.281 1.00 21.85 O HETATM 1064 O HOH A 249 -9.500 32.799 16.423 1.00 22.13 O HETATM 1065 O HOH A 250 5.304 23.715 9.208 1.00 22.17 O HETATM 1066 O HOH A 251 4.829 22.431 21.586 1.00 22.23 O HETATM 1067 O HOH A 252 -15.332 19.844 17.081 1.00 22.29 O HETATM 1068 O HOH A 253 -11.938 12.129 10.600 1.00 22.30 O HETATM 1069 O HOH A 254 -0.010 37.715 22.558 1.00 22.39 O HETATM 1070 O HOH A 255 -7.202 10.129 13.243 1.00 22.76 O HETATM 1071 O HOH A 256 2.317 18.684 5.478 1.00 22.97 O HETATM 1072 O HOH A 257 -0.609 26.419 30.111 1.00 23.01 O HETATM 1073 O HOH A 258 -12.876 18.006 2.111 1.00 23.03 O HETATM 1074 O HOH A 259 6.914 23.143 20.073 1.00 23.39 O HETATM 1075 O HOH A 260 -3.577 28.426 5.186 1.00 23.46 O HETATM 1076 O HOH A 261 4.675 4.962 29.797 1.00 23.56 O HETATM 1077 O HOH A 262 -1.245 38.248 15.147 1.00 23.56 O HETATM 1078 O HOH A 263 -5.564 8.814 25.596 1.00 23.69 O HETATM 1079 O HOH A 264 7.009 23.807 11.646 1.00 23.70 O HETATM 1080 O HOH A 265 1.879 6.009 30.780 1.00 23.71 O HETATM 1081 O HOH A 266 5.216 25.173 22.892 1.00 23.72 O HETATM 1082 O HOH A 267 18.106 18.106 18.605 0.50 23.78 O HETATM 1083 O HOH A 268 -14.988 23.445 25.814 1.00 24.14 O HETATM 1084 O HOH A 269 -2.222 34.844 7.765 1.00 24.45 O HETATM 1085 O HOH A 270 0.390 12.722 16.652 1.00 24.62 O HETATM 1086 O HOH A 271 -14.530 24.676 5.590 1.00 24.72 O HETATM 1087 O HOH A 272 -3.166 5.199 23.295 1.00 24.86 O HETATM 1088 O HOH A 273 1.216 9.738 5.280 1.00 25.40 O HETATM 1089 O HOH A 274 -18.265 22.087 4.822 1.00 25.66 O HETATM 1090 O HOH A 275 -15.201 9.092 16.700 1.00 25.72 O HETATM 1091 O HOH A 276 4.600 36.742 19.557 1.00 25.73 O HETATM 1092 O HOH A 277 -5.992 9.643 32.090 1.00 25.80 O HETATM 1093 O HOH A 278 1.304 36.804 18.883 1.00 25.84 O HETATM 1094 O HOH A 279 -9.132 14.941 28.012 1.00 25.89 O HETATM 1095 O HOH A 280 4.528 7.893 34.391 1.00 26.12 O HETATM 1096 O HOH A 281 -2.547 30.453 34.163 1.00 26.23 O HETATM 1097 O HOH A 282 -0.620 35.566 26.185 1.00 26.24 O HETATM 1098 O HOH A 283 -7.927 11.450 28.856 1.00 26.35 O HETATM 1099 O HOH A 284 1.788 6.539 10.936 1.00 26.51 O HETATM 1100 O HOH A 285 13.159 10.398 34.593 1.00 26.79 O HETATM 1101 O HOH A 286 7.222 16.362 8.190 1.00 27.07 O HETATM 1102 O HOH A 287 -7.850 10.126 8.000 1.00 27.14 O HETATM 1103 O HOH A 288 -10.393 8.137 24.443 1.00 27.20 O HETATM 1104 O HOH A 289 -2.733 40.337 14.551 1.00 27.27 O HETATM 1105 O HOH A 290 -9.169 11.966 9.156 1.00 27.41 O HETATM 1106 O HOH A 291 -12.985 17.705 28.178 1.00 27.42 O HETATM 1107 O HOH A 292 10.547 21.468 20.359 1.00 27.50 O HETATM 1108 O HOH A 293 -10.183 33.721 11.223 1.00 27.72 O HETATM 1109 O HOH A 294 7.457 25.395 18.468 1.00 27.87 O HETATM 1110 O HOH A 295 -9.754 18.975 29.738 1.00 27.87 O HETATM 1111 O HOH A 296 17.581 14.317 21.216 1.00 28.20 O HETATM 1112 O HOH A 297 16.590 14.860 29.890 1.00 28.36 O HETATM 1113 O HOH A 298 14.635 15.792 18.064 1.00 28.37 O HETATM 1114 O HOH A 299 -7.275 39.098 15.412 1.00 28.45 O HETATM 1115 O HOH A 300 -2.211 38.505 10.070 1.00 28.51 O HETATM 1116 O HOH A 301 -8.571 37.178 15.480 1.00 28.80 O HETATM 1117 O HOH A 302 2.949 5.060 18.299 1.00 29.00 O HETATM 1118 O HOH A 303 -16.726 16.726 9.303 0.50 29.27 O HETATM 1119 O HOH A 304 13.606 24.178 23.338 1.00 29.57 O HETATM 1120 O HOH A 305 -4.676 26.495 38.634 1.00 29.58 O HETATM 1121 O HOH A 306 -10.948 29.213 27.557 1.00 29.60 O HETATM 1122 O HOH A 307 -2.697 11.318 4.964 1.00 29.70 O HETATM 1123 O HOH A 308 -1.522 3.392 27.650 1.00 29.71 O HETATM 1124 O HOH A 309 -4.251 17.996 33.619 1.00 29.91 O HETATM 1125 O HOH A 310 -5.110 6.413 24.610 1.00 29.96 O HETATM 1126 O HOH A 311 -19.900 22.788 12.165 1.00 30.10 O HETATM 1127 O HOH A 312 -6.817 8.451 27.930 1.00 30.10 O HETATM 1128 O HOH A 313 9.177 23.023 16.646 1.00 30.15 O HETATM 1129 O HOH A 314 19.217 16.433 25.700 1.00 30.15 O HETATM 1130 O HOH A 315 -16.634 14.607 19.679 1.00 30.53 O HETATM 1131 O HOH A 316 -1.426 28.041 3.446 1.00 30.85 O HETATM 1132 O HOH A 317 2.295 3.473 21.971 1.00 30.99 O HETATM 1133 O HOH A 318 2.568 37.386 21.852 1.00 31.04 O HETATM 1134 O HOH A 319 0.159 4.298 14.251 1.00 31.06 O HETATM 1135 O HOH A 320 0.692 3.808 19.651 1.00 31.15 O HETATM 1136 O HOH A 321 -5.834 20.579 32.561 1.00 31.19 O HETATM 1137 O HOH A 322 -4.693 5.674 29.352 1.00 31.20 O HETATM 1138 O HOH A 323 -15.358 14.932 22.145 1.00 31.42 O HETATM 1139 O HOH A 324 1.238 38.146 25.783 1.00 31.44 O HETATM 1140 O HOH A 325 20.230 21.631 26.500 1.00 31.80 O HETATM 1141 O HOH A 326 -16.031 19.645 22.360 1.00 31.83 O HETATM 1142 O HOH A 327 15.665 17.533 18.043 1.00 31.91 O HETATM 1143 O HOH A 328 5.286 16.954 41.850 1.00 31.92 O HETATM 1144 O HOH A 329 -8.597 28.043 31.993 1.00 32.24 O HETATM 1145 O HOH A 330 -3.444 19.251 2.289 1.00 32.41 O HETATM 1146 O HOH A 331 -10.753 12.992 8.668 1.00 32.58 O HETATM 1147 O HOH A 332 8.018 19.892 13.833 1.00 32.64 O HETATM 1148 O HOH A 333 -12.861 11.915 21.063 1.00 32.92 O HETATM 1149 O HOH A 334 -5.704 8.037 10.830 1.00 33.68 O HETATM 1150 O HOH A 335 -20.305 17.389 -0.507 1.00 33.75 O HETATM 1151 O HOH A 336 6.238 2.840 24.049 1.00 33.77 O HETATM 1152 O HOH A 337 -4.670 8.314 29.558 1.00 33.81 O HETATM 1153 O HOH A 338 2.193 22.444 25.296 1.00 33.85 O HETATM 1154 O HOH A 339 -16.498 21.632 23.971 1.00 34.03 O HETATM 1155 O HOH A 340 -9.160 5.260 18.834 1.00 34.18 O HETATM 1156 O HOH A 341 -8.559 19.349 0.671 1.00 34.21 O HETATM 1157 O HOH A 342 13.968 6.338 33.309 1.00 34.39 O HETATM 1158 O HOH A 343 10.492 18.283 39.312 1.00 34.80 O HETATM 1159 O HOH A 344 3.455 31.157 24.979 1.00 34.87 O HETATM 1160 O HOH A 345 -1.988 4.987 29.616 1.00 35.02 O HETATM 1161 O HOH A 346 -6.300 7.200 32.899 1.00 35.03 O HETATM 1162 O HOH A 347 -20.135 18.837 11.394 1.00 35.17 O HETATM 1163 O HOH A 348 -1.041 3.883 25.065 1.00 35.59 O HETATM 1164 O HOH A 349 -5.860 27.566 35.957 1.00 35.59 O HETATM 1165 O HOH A 350 7.817 17.167 38.889 1.00 35.72 O HETATM 1166 O HOH A 351 3.038 22.719 28.596 1.00 35.80 O HETATM 1167 O HOH A 352 7.383 23.092 5.206 1.00 36.12 O HETATM 1168 O HOH A 353 -1.512 28.095 34.397 1.00 36.18 O HETATM 1169 O HOH A 354 -3.790 22.766 1.644 1.00 36.56 O HETATM 1170 O HOH A 355 -1.740 19.862 3.414 1.00 37.02 O HETATM 1171 O HOH A 356 2.114 12.911 36.519 1.00 37.08 O HETATM 1172 O HOH A 357 3.724 24.464 3.530 1.00 37.13 O HETATM 1173 O HOH A 358 -18.346 29.918 18.378 1.00 37.27 O HETATM 1174 O HOH A 359 4.572 26.197 26.844 1.00 37.66 O HETATM 1175 O HOH A 360 20.535 20.940 24.404 1.00 37.82 O HETATM 1176 O HOH A 361 9.634 21.963 28.448 1.00 38.26 O HETATM 1177 O HOH A 362 -1.080 21.418 35.703 1.00 38.49 O HETATM 1178 O HOH A 363 1.677 28.597 28.743 1.00 38.60 O HETATM 1179 O HOH A 364 19.283 15.322 28.250 1.00 38.60 O HETATM 1180 O HOH A 365 7.015 18.690 35.740 1.00 38.72 O HETATM 1181 O HOH A 366 1.249 3.610 16.471 1.00 38.94 O HETATM 1182 O HOH A 367 1.582 19.199 38.346 1.00 39.28 O HETATM 1183 O HOH A 368 11.048 24.309 30.326 1.00 39.30 O HETATM 1184 O HOH A 369 -14.416 21.935 28.473 1.00 39.31 O HETATM 1185 O HOH A 370 18.376 19.088 24.588 1.00 39.45 O HETATM 1186 O HOH A 371 -10.984 36.550 14.845 1.00 39.83 O HETATM 1187 O HOH A 372 -2.577 29.992 1.311 1.00 40.38 O HETATM 1188 O HOH A 373 17.114 21.181 21.516 1.00 40.73 O HETATM 1189 O HOH A 374 5.265 21.346 3.207 1.00 41.14 O HETATM 1190 O HOH A 375 9.959 11.483 35.605 1.00 42.02 O HETATM 1191 O HOH A 376 -8.712 37.262 11.831 1.00 42.48 O HETATM 1192 O HOH A 377 9.550 17.444 6.125 1.00 44.76 O HETATM 1193 O HOH A 378 -19.917 19.989 14.602 1.00 49.67 O CONECT 50 996 CONECT 247 904 CONECT 522 643 CONECT 610 739 CONECT 643 522 CONECT 739 610 CONECT 904 247 CONECT 996 50 MASTER 292 0 2 7 3 0 2 6 1192 1 8 10 END bio3d/inst/matrices/0000755000176200001440000000000014046015221014031 5ustar liggesusersbio3d/inst/matrices/emboss_properties.mat0000644000176200001440000000112214046015221020274 0ustar liggesusers# EMBOSS DATA FILE # # This file contains the chemical classifications of the common amino # acids. # # # # # # aromatic polar positive # Tiny Small aliphatic non-polar charged negative A 1 1 0 0 1 0 0 0 0 C 1 1 0 0 1 0 0 0 0 D 0 1 0 0 0 1 1 0 1 E 0 0 0 0 0 1 1 0 1 F 0 0 0 1 1 0 0 0 0 G 1 1 0 0 1 0 0 0 0 H 0 0 0 1 0 1 1 1 0 I 0 0 1 0 1 0 0 0 0 K 0 0 0 0 0 1 1 1 0 L 0 0 1 0 1 0 0 0 0 M 0 0 0 0 1 0 0 0 0 N 0 1 0 0 0 1 0 0 0 P 0 1 0 0 1 0 0 0 0 Q 0 0 0 0 0 1 0 0 0 R 0 0 0 0 0 1 1 1 0 S 1 1 0 0 0 1 0 0 0 T 1 1 0 0 0 1 0 0 0 V 0 1 1 0 1 0 0 0 0 W 0 0 0 1 1 0 0 0 0 Y 0 0 0 1 1 0 0 0 0 // bio3d/inst/matrices/properties.mat0000644000176200001440000000336214046015221016734 0ustar liggesusers# Amino acid property index # The first 10 properties are derived from the venn diagram of # Taylor 1986 (J. Theor. Biol. 119, 205-218) and the work of # Zvelebil 1987 (J. Mol. Biol. 195, 957-961). # Properties 'burried', 'surface' and 'neutral' are based on # relative hydrophobicity and the extent to which residues are # distributed between the surface and interior of known structures, # see Chothia 1998 (J. Mol. Biol. 278, 457-479 ) and the work of # Miller 1986 (J. Mol. Biol. 196, 641-656) I L V C A G M F Y W H K R E Q D N S T P B Z X - hydrophobic 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 0 1 0 polar 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 small 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 1 0 proline 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 tiny 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 aliphatic 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 aromatic 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 positive 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 negative 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 charged 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 1 0 special 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 burried 1 1 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 surface 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 1 0 neutral 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 1 1 0 0 1 0 bio3d/inst/matrices/similarity.mat0000644000176200001440000000256114046015221016726 0ustar liggesusers# Similarity Matrix derived from the PET91 matrix # of Jones, Taylor and Thornton 1991 with values # sacled to 0 or 1. Input with 'read.table' A R N D C Q E G H I L K M F P S T W Y V B Z X - A 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 R 0 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 N 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 D 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 C 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 Q 0 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 E 0 0 1 1 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 G 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 H 0 1 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 I 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0 1 0 0 0 0 L 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 0 0 0 K 0 1 1 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 M 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 F 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 P 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 S 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 T 1 0 1 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 W 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 Y 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 V 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 B 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 Z 0 1 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 bio3d/inst/matrices/blosum62.mat0000644000176200001440000000411314046015221016204 0ustar liggesusers# Matrix made by matblas from blosum62.iij # * column uses minimum score # BLOSUM Clustered Scoring Matrix in 1/2 Bit Units # Blocks Database = /data/blocks_5.0/blocks.dat # Cluster Percentage: >= 62 # Entropy = 0.6979, Expected = -0.5209 A R N D C Q E G H I L K M F P S T W Y V B Z X - A 4 -1 -2 -2 0 -1 -1 0 -2 -1 -1 -1 -1 -2 -1 1 0 -3 -2 0 -2 -1 0 0 R -1 5 0 -2 -3 1 0 -2 0 -3 -2 2 -1 -3 -2 -1 -1 -3 -2 -3 -1 0 0 0 N -2 0 6 1 -3 0 0 0 1 -3 -3 0 -2 -3 -2 1 0 -4 -2 -3 3 0 0 0 D -2 -2 1 6 -3 0 2 -1 -1 -3 -4 -1 -3 -3 -1 0 -1 -4 -3 -3 4 1 0 0 C 0 -3 -3 -3 9 -3 -4 -3 -3 -1 -1 -3 -1 -2 -3 -1 -1 -2 -2 -1 -3 -3 0 0 Q -1 1 0 0 -3 5 2 -2 0 -3 -2 1 0 -3 -1 0 -1 -2 -1 -2 0 3 0 0 E -1 0 0 2 -4 2 5 -2 0 -3 -3 1 -2 -3 -1 0 -1 -3 -2 -2 1 4 0 0 G 0 -2 0 -1 -3 -2 -2 6 -2 -4 -4 -2 -3 -3 -2 0 -2 -2 -3 -3 -1 -2 0 0 H -2 0 1 -1 -3 0 0 -2 8 -3 -3 -1 -2 -1 -2 -1 -2 -2 2 -3 0 0 0 0 I -1 -3 -3 -3 -1 -3 -3 -4 -3 4 2 -3 1 0 -3 -2 -1 -3 -1 3 -3 -3 0 0 L -1 -2 -3 -4 -1 -2 -3 -4 -3 2 4 -2 2 0 -3 -2 -1 -2 -1 1 -4 -3 0 0 K -1 2 0 -1 -3 1 1 -2 -1 -3 -2 5 -1 -3 -1 0 -1 -3 -2 -2 0 1 0 0 M -1 -1 -2 -3 -1 0 -2 -3 -2 1 2 -1 5 0 -2 -1 -1 -1 -1 1 -3 -1 0 0 F -2 -3 -3 -3 -2 -3 -3 -3 -1 0 0 -3 0 6 -4 -2 -2 1 3 -1 -3 -3 0 0 P -1 -2 -2 -1 -3 -1 -1 -2 -2 -3 -3 -1 -2 -4 7 -1 -1 -4 -3 -2 -2 -1 0 0 S 1 -1 1 0 -1 0 0 0 -1 -2 -2 0 -1 -2 -1 4 1 -3 -2 -2 0 0 0 0 T 0 -1 0 -1 -1 -1 -1 -2 -2 -1 -1 -1 -1 -2 -1 1 5 -2 -2 0 -1 -1 0 0 W -3 -3 -4 -4 -2 -2 -3 -2 -2 -3 -2 -3 -1 1 -4 -3 -2 11 2 -3 -4 -3 0 0 Y -2 -2 -2 -3 -2 -1 -2 -3 2 -1 -1 -2 -1 3 -3 -2 -2 2 7 -1 -3 -2 0 0 V 0 -3 -3 -3 -1 -2 -2 -3 -3 3 1 -2 1 -1 -2 -2 0 -3 -1 4 -3 -2 0 0 B -2 -1 3 4 -3 0 1 -1 0 -3 -4 0 -3 -3 -2 0 -1 -4 -3 -3 4 1 0 0 Z -1 0 0 1 -3 3 4 -2 0 -3 -3 1 -1 -3 -1 0 -1 -3 -2 -2 1 4 0 0 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 bio3d/inst/matrices/custom.mat0000644000176200001440000000347214046015221016054 0ustar liggesusers A R N D C Q E G H I L K M F P S T W Y V B Z X * A 8 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 -4 R -1 8 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 -4 N -1 -1 8 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 -4 D -1 -1 -1 8 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 -4 C -1 -1 -1 -1 8 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 -4 Q -1 -1 -1 -1 -1 8 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 -4 E -1 -1 -1 -1 -1 -1 8 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 -4 G -1 -1 -1 -1 -1 -1 -1 8 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 -4 H -1 -1 -1 -1 -1 -1 -1 -1 8 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 -4 I -1 -1 -1 -1 -1 -1 -1 -1 -1 8 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 -4 L -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 -4 K -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 -4 M -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 -4 F -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 -1 -1 -1 -1 -1 -1 -1 -1 5 -4 P -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 -1 -1 -1 -1 -1 -1 -1 5 -4 S -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 -1 -1 -1 -1 -1 -1 5 -4 T -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 -1 -1 -1 -1 -1 5 -4 W -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 -1 -1 -1 -1 5 -4 Y -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 -1 -1 -1 5 -4 V -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 -1 -1 5 -4 B -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 -1 5 -4 Z -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 8 5 -4 X 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 -3 * -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -3 1 bio3d/inst/matrices/pam30.mat0000644000176200001440000000521414046015221015456 0ustar liggesusers# # This matrix was produced by "pam" Version 1.0.6 [28-Jul-93] # # PAM 30 substitution matrix, scale = ln(2)/2 = 0.346574 # # Expected score = -5.06, Entropy = 2.57 bits # # Lowest score = -17, Highest score = 13 # # Note. 'X' and '-' set to zero # A R N D C Q E G H I L K M F P S T W Y V B Z X - A 6 -7 -4 -3 -6 -4 -2 -2 -7 -5 -6 -7 -5 -8 -2 0 -1 -13 -8 -2 -3 -3 0 0 R -7 8 -6 -10 -8 -2 -9 -9 -2 -5 -8 0 -4 -9 -4 -3 -6 -2 -10 -8 -7 -4 0 0 N -4 -6 8 2 -11 -3 -2 -3 0 -5 -7 -1 -9 -9 -6 0 -2 -8 -4 -8 6 -3 0 0 D -3 -10 2 8 -14 -2 2 -3 -4 -7 -12 -4 -11 -15 -8 -4 -5 -15 -11 -8 6 1 0 0 C -6 -8 -11 -14 10 -14 -14 -9 -7 -6 -15 -14 -13 -13 -8 -3 -8 -15 -4 -6 -12 -14 0 0 Q -4 -2 -3 -2 -14 8 1 -7 1 -8 -5 -3 -4 -13 -3 -5 -5 -13 -12 -7 -3 6 0 0 E -2 -9 -2 2 -14 1 8 -4 -5 -5 -9 -4 -7 -14 -5 -4 -6 -17 -8 -6 1 6 0 0 G -2 -9 -3 -3 -9 -7 -4 6 -9 -11 -10 -7 -8 -9 -6 -2 -6 -15 -14 -5 -3 -5 0 0 H -7 -2 0 -4 -7 1 -5 -9 9 -9 -6 -6 -10 -6 -4 -6 -7 -7 -3 -6 -1 -1 0 0 I -5 -5 -5 -7 -6 -8 -5 -11 -9 8 -1 -6 -1 -2 -8 -7 -2 -14 -6 2 -6 -6 0 0 L -6 -8 -7 -12 -15 -5 -9 -10 -6 -1 7 -8 1 -3 -7 -8 -7 -6 -7 -2 -9 -7 0 0 K -7 0 -1 -4 -14 -3 -4 -7 -6 -6 -8 7 -2 -14 -6 -4 -3 -12 -9 -9 -2 -4 0 0 M -5 -4 -9 -11 -13 -4 -7 -8 -10 -1 1 -2 11 -4 -8 -5 -4 -13 -11 -1 -10 -5 0 0 F -8 -9 -9 -15 -13 -13 -14 -9 -6 -2 -3 -14 -4 9 -10 -6 -9 -4 2 -8 -10 -13 0 0 P -2 -4 -6 -8 -8 -3 -5 -6 -4 -8 -7 -6 -8 -10 8 -2 -4 -14 -13 -6 -7 -4 0 0 S 0 -3 0 -4 -3 -5 -4 -2 -6 -7 -8 -4 -5 -6 -2 6 0 -5 -7 -6 -1 -5 0 0 T -1 -6 -2 -5 -8 -5 -6 -6 -7 -2 -7 -3 -4 -9 -4 0 7 -13 -6 -3 -3 -6 0 0 W -13 -2 -8 -15 -15 -13 -17 -15 -7 -14 -6 -12 -13 -4 -14 -5 -13 13 -5 -15 -10 -14 0 0 Y -8 -10 -4 -11 -4 -12 -8 -14 -3 -6 -7 -9 -11 2 -13 -7 -6 -5 10 -7 -6 -9 0 0 V -2 -8 -8 -8 -6 -7 -6 -5 -6 2 -2 -9 -1 -8 -6 -6 -3 -15 -7 7 -8 -6 0 0 B -3 -7 6 6 -12 -3 1 -3 -1 -6 -9 -2 -10 -10 -7 -1 -3 -10 -6 -8 6 0 0 0 Z -3 -4 -3 1 -14 6 6 -5 -1 -6 -7 -4 -5 -13 -4 -5 -6 -14 -9 -6 0 6 0 0 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 bio3d/inst/matrices/bio3d.mat0000644000176200001440000000377614046015221015551 0ustar liggesusers# PET91 Matrix - Jones, Taylor and Thornton 1991 # This is an update of the MDM78 Dayhoff matrix normalised such that # all maxima are on the diagonal with a score of 10 A R N D C Q E G H I L K M F P S T W Y V B Z X - A 10 -1 0 -1 -1 -1 -1 1 -2 0 -1 -1 -1 -3 1 1 2 -4 -3 1 0 -1 0 0 R -1 10 0 -1 -1 2 0 0 2 -3 -3 4 -2 -4 -1 -1 -1 0 -2 -3 0 1 0 0 N 0 0 10 2 -1 0 1 0 1 -2 -3 1 -2 -3 -1 1 1 -4 -1 -2 2 0 0 0 D -1 -1 2 10 -3 0 4 1 0 -3 -4 0 -3 -5 -2 0 -1 -5 -2 -3 3 2 0 0 C -1 -1 -1 -3 10 -3 -4 -1 0 -2 -3 -3 -2 0 -2 1 -1 1 2 -2 -2 -3 0 0 Q -1 2 0 0 -3 10 2 -1 3 -3 -2 2 -2 -4 0 -1 -1 -3 -1 -3 0 3 0 0 E -1 0 1 4 -4 2 10 1 0 -3 -4 1 -3 -5 -2 -1 -1 -5 -4 -2 2 3 0 0 G 1 0 0 1 -1 -1 1 10 -2 -3 -4 -1 -3 -5 -1 1 0 -2 -4 -2 0 0 0 0 H -2 2 1 0 0 3 0 -2 10 -3 -2 1 -2 0 0 -1 -1 -3 4 -3 0 1 0 0 I 0 -3 -2 -3 -2 -3 -3 -3 -3 10 2 -3 3 0 -2 -1 1 -4 -2 4 -2 -3 0 0 L -1 -3 -3 -4 -3 -2 -4 -4 -2 2 10 -3 3 2 0 -2 -1 -2 -1 2 -3 -3 0 0 K -1 4 1 0 -3 2 1 -1 1 -3 -3 10 -2 -5 -2 -1 -1 -3 -3 -3 0 1 0 0 M -1 -2 -2 -3 -2 -2 -3 -3 -2 3 3 -2 10 0 -2 -1 0 -3 -3 2 -2 -2 0 0 F -3 -4 -3 -5 0 -4 -5 -5 0 0 2 -5 0 10 -2 -2 -2 -1 5 0 -4 -4 0 0 P 1 -1 -1 -2 -2 0 -2 -1 0 -2 0 -2 -2 -2 10 1 1 -5 -3 -1 -1 -1 0 0 S 1 -1 1 0 1 -1 -1 1 -1 -1 -2 -1 -1 -2 1 10 1 -3 -1 -1 0 -1 0 0 T 2 -1 1 -1 -1 -1 -1 0 -1 1 -1 -1 0 -2 1 1 10 -4 -3 0 0 -1 0 0 W -4 0 -4 -5 1 -3 -5 -2 -3 -4 -2 -3 -3 -1 -5 -3 -4 10 0 -4 -4 -4 0 0 Y -3 -2 -1 -2 2 -1 -4 -4 4 -2 -1 -3 -3 5 -3 -1 -3 0 10 -3 -1 -2 0 0 V 1 -3 -2 -3 -2 -3 -2 -2 -3 4 2 -3 2 0 -1 -1 0 -4 -3 10 -2 -2 0 0 B 0 0 2 3 -2 0 2 0 0 -2 -3 0 -2 -4 -1 0 0 -4 -1 -2 10 1 0 0 Z -1 1 0 2 -3 3 3 0 1 -3 -3 1 -2 -4 -1 -1 -1 -4 -2 -2 1 10 0 0 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 bio3d/inst/doc/0000755000176200001440000000000014046127635013004 5ustar liggesusersbio3d/inst/doc/bio3d_vignettes.Rmd0000644000176200001440000000465514046077017016550 0ustar liggesusers--- title: "bio3d Vignettes" date: "Sep 22 2016" output: rmarkdown::html_vignette vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{bio3d Vignettes} \usepackage[utf8]{inputenc} --- We distribute a number of extended **Bio3D vignettes** that provide worked examples of using Bio3D to perform a particular type of structural bioinformatics analysis. An updated list of these can be found on-line. At the time of writing these include: - [Installing Bio3D](http://thegrantlab.org/bio3d/articles/online/install_vignette/Bio3D_install.html) - [Getting started with Bio3D](http://thegrantlab.org/bio3d/articles/online/intro_vignette/Bio3D_introduction.html) - [PDB structure manipulation and analysis with Bio3D](http://thegrantlab.org/bio3d/articles/online/pdb_vignette/Bio3D_pdb.html) - [Beginning trajectory analysis with Bio3D](http://thegrantlab.org/bio3d/articles/online/traj_vignette/Bio3D_md.html) - [Enhanced methods for Normal Mode Analysis with Bio3D](http://thegrantlab.org/bio3d/articles/online/nma_vignette/Bio3D_nma.html) - [Comparative sequence and structure analysis with Bio3D](http://thegrantlab.org/bio3d/articles/online/pca_vignette/Bio3D_pca.html) - [Ensemble NMA of E.coli DHFR structures](http://thegrantlab.org/bio3d/articles/online/enma_vignettes/Bio3D_nma-dhfr-partI.html) - [Ensemble NMA across multiple species of DHFR](http://thegrantlab.org/bio3d/articles/online/enma_vignettes/Bio3D_nma-dhfr-partII.html) - [Protein structure network analysis with Bio3D](http://thegrantlab.org/bio3d/articles/online/cna_vignette/cna_vignette.spin.html) - [Introduction to Ensemble Difference Distance Matrix (eDDM) Analysis](http://thegrantlab.org/bio3d/articles/online/eddm_vignette/Bio3D_eddm.spin.html) - Online protein structure analysis with the Bio3D WebApp ( [PDF](http://thegrantlab.org/bio3d_v2/download/webapp-tutorials?download=22:bio3d-webapp-pca)) - Online Normal Mode Analysis with Bio3D WebApps ( PDF | HTML ) There is also extensive [on-line documentation](http://thegrantlab.org/bio3d/reference/) with worked examples (and their output) for all functions and a package manual (in [PDF](https://CRAN.R-project.org/package=bio3d/bio3d.pdf) format) that is a concatenation of each functions documentation (without example output). Note that for information on Bio3D development status or to report a bug, please refer to: https://bitbucket.org/Grantlab/bio3d/ bio3d/inst/doc/bio3d_vignettes.html0000644000176200001440000002377714046127635017002 0ustar liggesusers bio3d Vignettes

bio3d Vignettes

Sep 22 2016

We distribute a number of extended Bio3D vignettes that provide worked examples of using Bio3D to perform a particular type of structural bioinformatics analysis. An updated list of these can be found on-line.

At the time of writing these include:

There is also extensive on-line documentation with worked examples (and their output) for all functions and a package manual (in PDF format) that is a concatenation of each functions documentation (without example output).

Note that for information on Bio3D development status or to report a bug, please refer to: https://bitbucket.org/Grantlab/bio3d/

bio3d/inst/CITATION0000644000176200001440000000122614046015221013360 0ustar liggesuserscitHeader("To cite bio3d in publications use:") citEntry(entry = "article", author = "Grant B.J., Rodrigues A.P.C., ElSawy K.M., McCammon J.A., Caves L.S.D.", title = "Bio3D: An R package for the comparative analysis of protein structures.", journal = "Bioinformatics", year = "2006", volume = "22", pages = "2695--2696", month = "Nov", organization = "University of California, San Diego, La Jolla, CA 92093, USA.", textVersion = "Grant, B.J. et al. (2006) Bioinformatics 22, 2695--2696.") citFooter("Original article and updates are available from http://thegrantlab.org/bio3d/") bio3d/inst/staticdocs/0000755000176200001440000000000014046015221014362 5ustar liggesusersbio3d/inst/staticdocs/index.r0000644000176200001440000001361214046015221015657 0ustar liggesusers##"io" sd_section("Input/Output:", "Read and Write Common Biomolecular Data Types", c( "read.pdb", "read.fasta", "read.fasta.pdb", "read.ncdf", "read.dcd", "read.crd", "read.pqr", "read.mol2", "read.all", "read.pdcBD", "read.cif", "read.crd.amber", "read.crd.charmm", "read.prmtop", "aln2html", "get.pdb", "get.seq", "load.enmff", "write.pdb", "write.crd", "write.fasta", "write.ncdf", "write.pqr", "write.pir", "write.mol2", "mktrj.nma", "mktrj.pca", "mktrj.enma", "pymol", "vmd" ) ) ##"sequence" sd_section("Sequence Analysis:", "Do Interesting Things with Protein Sequence", c( "consensus", "conserv", "blast.pdb", "hmmer", "pfam", "uniprot", "entropy", "filter.identity", "seqidentity", "motif.find", "pdbaln", "seq2aln", "seqaln", "seqaln.pair", "seqbind" ) ) ##"structure" sd_section("Structure Analysis:", "Do Interesting Things with Protein Structure", c( "angle.xyz", "biounit", "blast.pdb", "get.blast", "atom.select", "combine.select", "cmap", "filter.cmap", "core.find", "core.cmap", "com", "dccm", "filter.dccm", "dist.xyz", "dm", "dssp", "dssp.pdbs", "geostas", "mustang", "fit.xyz", "binding.site", "mktrj", "mktrj.pca", "overlap", "pca", "pca.xyz", "pca.pdbs", "pca.array", "pca.tor", "dccm.pca", "project.pca", "pdbaln", "pdb.annotate", "pdb2aln", "pdb2aln.ind", "pdb2sse", "pdbs2sse", "pdbfit", "chain.pdb", "convert.pdb", "rgyr", "rmsd", "filter.rmsd", "rmsf", "rmsip", "struct.aln", "torsion.pdb", "torsion.xyz", "wrap.tor", "aa2mass", "aa.table", "atom.index", "atom2mass", "atom2ele", "cov.nma", "dccm.enma", "dccm.nma", "dccm.xyz", "deformation.nma", "fluct.nma", "inner.prod", "load.enmff", "mktrj.nma", "nma", "nma.pdb", "nma.pdbs", "normalize.vector", "pdbs2pdb", "plot.enma", "plot.nma", "plot.rmsip", "sdENM", "sse.bridges", "view.dccm", "view.modes", "var.xyz", "inspect.connectivity" ) ) ##"trajectory" sd_section("Trajectory Analysis:", "Do Interesting Things with Simulation Data", c( "angle.xyz", "cmap", "filter.cmap", "core.find", "core.map", "dccm", "dccm.pca", "filter.dccm", # "lmi", "dist.xyz", "dm", "dssp.xyz", "geostas", "fit.xyz", "mktrj", "mktrj.pca", "overlap", "project.pca", "pca.tor", "pca.xyz", "pdbaln", "rgyr", "rmsd", "filter.rmsd", "rmsf", "rmsip", "torsion.pdb", "torsion.xyz", "wrap.tor" ) ) ##"nma" sd_section("Normal Mode Analysis:", "Probe Large-Scale Protein Motions", c( "aa2mass", "aa.table", "atom.index", "atom2mass", "atom2ele", "bhattacharyya", "cov.nma", "covsoverlap", "dccm.enma", "dccm.nma", "dccm.xyz", "deformation.nma", "geostas", "fluct.nma", "inner.prod", "load.enmff", "mktrj", "mktrj.nma", "mktrj.enma", "nma", "nma.pdb", "nma.pdbs", "aanma", "aanma.pdbs", "gnm", "dccm.gnm", "normalize.vector", "pdbs2pdb", "plot.enma", "plot.nma", "plot.rmsip", "sdENM", "sse.bridges", "sip", "var.xyz", "var.pdbs", "view.dccm", "view.modes" ) ) ##"cna" sd_section("Correlation Network Analysis:", "Network analysis of dynamic coupling", c( "cna", "cnapath", # "cov2dccm", "dccm", # "lmi", "filter.dccm", "cmap", "community.tree", "network.amendment", "view.cna", "view.dccm", "view.cnapath", "plot.cna", "print.cna", "identify.cna", "layout.cna", "prune.cna", "community.aln" ) ) ##"graphics" sd_section("Graphics:", "Plotting and Graphic Display", c( "bwr.colors", "vmd_colors", "mono.colors", "plot.bio3d", "plot.blast", "plot.cmap", "plot.core", "plot.dccm", "plot.dmat", "plot.fluct", "plot.geostas", "plot.pca", "plot.pca.loadings", "hclustplot", "plot.cna", "plot.fasta", "plot.hmmer", "plot.matrix.loadings" ) ) ##"util" sd_section("Utilities:", "Convert and Manipulate Data", c( "aa.index", "aa123", "aa2index", "aln2html", "as.fasta", "as.pdb", "as.select", "as.xyz", "atom.select", "combine.select", "atom2xyz", "basename.pdb", "bio3d-package", "biounit", "bounds", "bounds.sse", "cat.pdb", "check.utility", "clean.pdb", "chain.pdb", "convert.pdb", "diag.ind", "difference.vector", "gap.inspect", "get.blast", "inspect.connectivity", "filter.identity", "is.gap", "is.pdb", "is.select", "is.xyz", "is.pdbs", "is.mol2", "lbio3d", "mask", "orient.pdb", "pairwise", "plot.bio3d", "print.core", "print.cna", "print.fasta", "print.xyz", "print.cnapath", "print.enma", "print.geostas", "print.mol2", "print.nma", "print.pca", "print.pdb", "print.prmtop", "print.rle2", "print.select", "print.sse", "rle2", "filter.rmsd", "pdbseq", "seqbind", "pdbsplit", "store.atom", "trim", "trim.mol2", "trim.pdbs", "trim.xyz", "unbound", "vec2resno", "setup.ncore", "elements", "formula2mass" ) ) ##"example" sd_section("Example Data:", "Bio3d Example Data", c("example.data") ) #sd_icon("Some title:", # "some sub-text", # c("pants") # )

>P0I:3.ќAٞ>Ae@@g+9ITr-ʋօ#AepL@ YӆA+h7Ts>]4rɩ\~kJԿXS6Tޞ=[Tz7m~-* Aʎ¸A楙1[NPiQS *<dW@eDCڄsI)؇ #0yPV,ԦM4VAA H9b*Îϕl.>'*Wzk|;ԖUA%Fk/Sc&F:cL_9Cr#.6Cj㎃`S$bsy޷c_RNN~kbm`lLA9Rq>ګL JDv rA?Q'V=u39eÿ+WwO LtӍTt ;> 33g':g_UZ8*)0~3嵍 ?9]h<]$V[isεkeW;yFnxhk +޹]Æ:$KY&Rjb;yymh'#B~2igA ['6ՄudŸ=7Hgj Zs{tiwh;/ p 2^( ziV'@ ^>@ת@J\O"J,z@I.Pڶ$)^J5O$@iiܟ} bQgU+Ñ@z~P442Ai}q}v_J (>7>8ŔzL%(N};Z5>0(NvF O.{kdA}j\O<+P"羽xq+;|oc ()M"@C ;(l3=:L6˕Uӏ 9NoG(~Nx<2o>ᗜK'0>a5q GXIXLodb1l3 DÅPǩ"Wz;fr8WXŸk`*I!5j'5%˿pOo{_DӾ.mSٮgkTo*8:fXB'?xRq&1xu,~FD&QyCپO1KU 30,bi;090_ţ{R[N0+0˜\8%EBi Sb<=وqT<ҋx:ACu s[Eܖoc}5>,a={*$ [%O+H)6w>O 39=biD Sȴa-ol]$ ;ǩlOq-@]OmOYͤ3C} ؁7lraKd=F'v& _s2 {`?|5 {7;^kMA6A%d+ʶ, V;>xX/)t~56I_*;8: Ѧ%O# +eMK9glhf U^9)OO"mJG] )es 'xnp%VJ?][@mw:}IdSG&.mϹ<9 <ٺѺw_NG𗠡z0tTlk z$Ȏo9 t!Wn>oZ~{2ݺXor3 ~Ia0YL~G f}Ƿc`9]84Ȁp J&3^9T?/oϟk|=[ڥ}}MƗq§5 &ߴ17aVG`ؙ~g0Y6#~NVu".\g5 &Wig'm0e3 yL׸1nbIQVׯN̟֔^V|v1=`K5`P}gZ}.}Xfc:|_Y\`[Wv(A}Ѕ*Hqyim[w 0nN̺rCb *~++I.țL8HR-t5|%ZMmι @`>K3j׾ֶ;.";- })zUHKu$-koszw8tt.Ϙ=*V13:=dQH ;zf^K'++7 L~rzf QniP}=/,Z9iX|?囘,S~Ig׍x% }2贈{ʉ 1sY#ԚPwļk]R/ZxI& ? eۑZp#v3/UٺNGGa?F)GH"%w c}1;Kb˫"}ᙯ }&{(HS% mϷ9>7/ ¼ pfrB H蒒1Q|&@e<|p!O(tiwt†> KcCȢ Ik r Op]z׈t|}uZ5d.k*Xu$"Htʿ)ښ }`c֡U PW"|u؉q> _ BI>tUiwVcS8iq bG崄ӘCǤH? xY_^a]$}C\AZyMuH=2p"e9> }_}}>6W8^sKnmMžܻ&cXs bGAJxOkB6ZU1l[̣PU=N酒9!h"O: o00~c.S@=:7xKUp2 ǀJ#$}؇qtߏw'c ;wK7Qw}"Pkꖝj})r_j&P(- >z-t_jCXK2<',VBq"X l>z#zo7q}3 7$eL]Jۑ @$_ v}t)v..,!b7hG~"7$6&[{XN.be oE۞:#̚oq58uNLvT/B屘+E ^ s!r_|XNic7A{ 3cyq,M"l<؋x#eS#+cyPy⳵_|X{7#^F~@Ү/i40+X}vIA\q~D2Nk3!`粡q*jK:6.>\_F,y+d'8LZ/ԡF?\!{V|–c%CGDrduN諒.ݨ7uQ2kN= 듹c*|kl7 TM(]OO1j=3 ][dښ;9l/ԏ~s7RV*w[ ;{=Psű0}U\nuko[QG[<a:Mo]@>~No ȇ(چ|'&_Ńzo0Jo5' +š'l\h4AgÜz@lxǁ3@zgC#dU l+)A ebcDRG e+w=$elKbX&UvLJɧ= Ÿs(ut͌GmK8f6kԕOfI&0>WhXoU`Vz~AI7p}jv..ޡ?1I74W{4;V`VeںfMׇ `Ufs@A6YMyUv_LDGRņ9wG D;^<) b_)ߜz)e@hٮO[}$dw @TF 1z]q8!u _ܕ)˥.JL͏{ARY,pP`銽ώLΆcU Czt)VK 2=j@wK Ȩ,}_$qQn5{A|]Co.̍ C?t dZ~89 \O 2!^?eAq}m s2sKȸ=dtV-M0~\K/fa6o~Cl;,,HϲtDLjVM긨2}AV SJMd=o\^3 2Qϟ<}{=>2J@fw3hȱ!ZbJ@&9M(c~Qqoc;_t%Da6$.hƬ֘ε@`| :c͈=hwcD<6W`|%"b|)~WC}Øt3OΩ91A`miI'}$UjZ+ޥw9.`L )ymڼ& "hxc?M`}v?̥_Nq0y>,.m(07 y]$`5V^pF`aiA:;Dq*7E=|5[BE?"P㈖Y}c*0m}~C vNi0 8n1űr ujb IIO uu ہNz;ts=Qՙ@lQ,Hx=~@,*$BbX9aȯoցA V&gF/S^J:kKχzNq4=w8ޔ~UVk~r*?I5ݼ $ v126z ėCX4ך$[.$=W7|뚀{4߭i@ڒ@X~ƾT,vr}+$RgK)?B@lxj  k35xZ֛A/Ǿ@|>q(by# FJѱ`d% e)nBjŹ=PW=_?(1 mѶoBrx`(_@kʬ^랻xAaGkw8z#?O},2(8oK vkO]DW|>V.4;f uPHlۛu*趠Bsq\T>}T$g¼%nc82f ælXwx0z#_j wȱµDƠp(H[mxu:@!LG/2:wПUiP(mam:(La%_foBZՓ,gFmigLw'JJ0x/s(nF;XLC!-Ahc/f6f51E60z;{݇GnG6I+`4R?n0.HG2d]mn5B5](PGO~UKg!=sfF%?#>k|oP/&ZϦlo0^5<+sY[|Von`t $$y0U|x~bw}*m1^_짏93x19%Xrx֓y ơې}k]ɖ-gj:~j`PX@5Mm:-Zj˓zz"Ӡ<<:|_!+iaP앶T%CJݭT@Ķ;lp-T]?*)@bjPk j:}.bUsWA1^P1i 6>>Ǭe.:6|)TQ" h!0^:TiGN,A2k{ }@uÏȭCXAN/OcPU~f a(V6oO}^she: J\'72iۤ=5(rőHۏc8Tp=(Ndtׇy0Ow1ޣ_Aq~."d?;t>}JvgAi{oP؞<Gz$?Aq.+!-(H #:<\>Y 0S\Mvb,Αh C[``PGǝG=P3t!ܯ&77thk!ԁY/y:IԵ='hu4eWqU85]sg\|IbG=T ԇOzBnӅ0‡9&(8xߘv-^ͭ;a袊Vg]O[P繩qfc}Ez|nA}`ue찯{Jkan1-ϨVizaud/ 6ێUD},xN_&=xN,ݙJ0=07gŶb|wPlؼP|wsx WȬx9bAd(-8;b)/gpq1(V ^9 eǡjŰq>(=bU b% yAqf=qU剱S8*lzF7cD0_sb;'0(Eg i|{`NkAc;0hɕFE(P>v pԍx_7Zܽe ̀&mM~O8J K٦:D0sW5 ylu)'v IӝCދJ/+vy,eAN+ A">O3|;{0]kba."0E "^x&!f_=" ,=#(Zm jyһv0ϿJ^~'+~R1~_?C,γ9(cwrWp{hU,S03CketynkC fG[>3y**B^׉rs*N~2qv{Kў ]||բsy@1wNɳ*pkIΧHo2Xȯ8{['+[RJg\ Q:@ɭP]soUi87i\ ?Jlrȑ*g['pGw?lُ7pc@ٱ_@6Q*ſa7zFh!WtTa}lFvEdoI)dyXF[bڀέh?o%U6h6o_Yl{|rF P]4x۹A뿼MWa%mWx1P/:(x-Iz4(]}'(e0ǟy@%EP:CmKkvnne@z1K({24Ӥρ6bw+l~#-΄ȣ>Sq~<(ˋ |{AYMO P6.|>=p8 {ڗZ7llց }tiVAaDoUE6Ǽs9檚U!%|cROUlߔPǟ%s.l.z(a=yJCDFbBr6֢TPVɬ['cNo:q\3vw2FKxN꽌 O}rʳxPnÙ.Xp#C~IFSEw0ܺhIǤlFwNw#:u!:Zи~' e_)Z1nхlm<.xn^_C?ߍ%hH3*U+D]*٢&ԓw=t⇶̱%$Qyz N wfF<}b&XG>b7YAP|0 zPZC)JrY\>w97gşM8,mz|7K8w{ m+J303<\teP q }/O:˃|O9~Cs)oSwv9kuǽ|3z.ϧJҝ`لxꗨoK˚h`~ΗCȏ}M"`~C'^ROp4(d +]GAk.@8^*/3 hpY|IW laԆT䵪9O!/?6pj&P&1unr (er v՟WL46,\K)A X ؎Xy W8<7@z U"rۀ~>Q_U<zr#+ uU7捁[7m80̮EE mvp O<&wC撳&0+ 5sM$?.ﺈo0:ͦD,Oz&&E[ 0>^-rK06uc( Z܋q6yn ߾s6]mwk0~j}oT`,4<|o]IuO_Z"0&` pted߄4 ]~ځV\pa|qS`xZ"/]3Ѿ|wI3mOw̅KXNZmrp8=(0f_ :Hnm@bð .ܴCqZUmwa1^|燸Y|4Kw$!(mʎ qQ 9 <|O끠` = qԷ@|ã;2Φ&9]#N V]X4e}}Ec@LKuL9 .'{_X>=)@|r畷)g{}+_v^ C& *b'5d &lZϿX\bA7Y@! s^>O?N:a/z ^]T=^Χ2fin)]ub/q Fga Vq,yq@#hK퓷y?E@p+liARt 9BD% $[%'! d'x J K! ϹzZT-y < |=?&wb3\Bb';?I3[@(6vd U7hfK[ 8j>GՓ^KxX ]g.}oӿ6q*me@xk d}{#ύ-L$T)Bw?T5m sP&0ޛ{y߀P]k Ċ>|B]@y7nY{w`0 Y_Z00pW:ݯEL`>-r ֍/$Q>VCY5UǛk*9+~ 1W,X~q㬶w2{&0`?YG>-sN~爺|/_f9|y 2okE[&B#0^ʝDE]P?S(eԯUDaޙ?Yvuq-㫊pLU\/;b;qnm5C~Q> st3籐؁)`3??i_˘M9اZ)γzkP072KvD)ߡ>}h}@Aݝ.S(eNJ2P·i~G}{Y;)($`f[Z띀b/wϽwU+6p(.9DR|%Z4c_L;ԛEzw WXĸ˧=vb:|Q t P~9 喣Wel'?me u73@R켻11r2p@H;dm@iЈ矉FN槤Rʦ-wq*iԱ[nKHz< =v\urMc54| ~xdWP~v܂zx7ù@noY@ M%߀?ԶĮLv1GN˂xIJ2Zٮ-/@8;yo-ef5ڰxnE?+Nic:Bmk5n {>}>!ڀ̎TKG#07o"9\_qގ}7JBBq5D|X%qS5a _0_+䭦2C8}llO.Da/:s70:2e o4G)Vt K܍<뒾S\b-p@`f}ޔ#;b 8{1NSijPsrgC[8x7jgxBuǮ |pr<OV#N$> Lu90Uc{.7g L/ :J{Q L"maAw B?whnBQƠ>㤤;,yDQq<{8leۮ}(q@V}uR}BXOczOw4tc*0HKc.6D%[Fȩf\69PϚ=Adi'kߧugnOZs>h:ԋ-/p?Kh%g~ H.OfLH-\ b.dNag3 o,kݰȻu.YZ f wzkEhx3@z+i.u:%:;}4@;k^kvjRu@z:5TyIP 9g2ՁI_#V=#@>A >RuG~)+MϱRߦ1VlFÉ_Qxhc*q+q>h|06)Hy#u[Uԃw$lK<%~8>0˓*##ye| [Mwz&u5UoK #wc~{K~M#V`Df}Ƶj;ZqEH0{yƜ<#u-1KƑ4nʗqn8X::!d#MY(T"׽~&0"[݄q;ɫokxCQACFo'G802xjB0ny|Ƽzo؆y4 M7*E}^P. :,nUDPV6PWvtoBq^è]䲳]@nԛA%M⠦5vpî+Ejk o55B_r=Qo$^{FޫYy:mP]|&z7sr#֟0p ȬFK{ve+P;HV͙@ٜ']t1NM@mFK PE Rꫛ2{Re0È+82$[W@6'jYyΉpj`G\/M/:܀c±tJ!xvگn-PiTNǁa6 *_8pv CCC|y PǒW]x}#uJ}?7}`_T웨W؟V@|ܛV뢿]q|yK8f..z)n~m ر0P$JWxK܉c+Gb@5K殠,oꑑX|ݴbR}7Tehdtp>Ä?8,/Eչ9gNJ>_vO̫|?-v=f㮟1j{Jxg܎ Pc^4/57>!U.~5*xjP~KLuWWБ6%O^T?]Pb}*9nU_4Vuq@5m:E5f_)Q =ԭ]V桚U:!xqΟ7:`[A[E*zxOGruʯ._p!9sorf]||ȗR*8hE^vrN6+ը-{Ñ8oF^g"|Rgk sw~ͣ|H?LMqE#. .\'q|Q3|#}FJ@gݤ)I|?q<xtP9 S,AMW/|߯o&_oǭ*Zb5{1b'u֛+XSgoqX@m5. '~|ߧ '/.P k)ϺyNwdzU{0K]]&@b~?rJ"n;[ Te4~ݓ T@Usc­O@=lX^N3Ƽ83 5|-93_'ˊm@Me~xKηmtIBYjijs: U_T@/@nnx(9@u [v!p; ~Dީz uڃ{^3eӭTnIYWyS]-8P1cx0CN4x3:.a!0ox] +3=q.~b `\|߾u|q|Ge`]aS; :ZV} Z~4 4ޫпtIէy ؑC7?0#tQ''>l30=K9qf$㹊srWagjpCe 7GŖau#NW ~E'~&^U~6ףOD|M{̻ ׉ @)_NZQ]<}ŰKx{c2߿@{6: #u':@A @r3MI(C]6X:1-˩em83+"X(_>@Ck=;Spݰ4DʞƲ*xZZP }Gu-srAcAzE:mhtN?ޣq S+K#Z!+79ߊ4'Gĩn7Uk_Ϥ'kKNFy2߾k@Oar h4܎ռ:_@t 9ո|VrAhG6{il%m>mU_~8||H h|`}#՗(-4~QS=sx^,([5 @_mL,FGF){28##/6F[ʭj~ݫ@n)RT~;n0W.V[8QcZ8p"{4<򝁏GvJ+T y)kȧ!s!L '8!~uWEweO}cCI2yHƁJޘzq1JW_?А.*au>\?",gNxNzC,oT6nY E/)s˭S&cUKj\oQ T~gvA|8 sV́>Gp >bVgʹ*٘|NOƣR*0v_O Ɠ%&;0 y2lQܱ Գ{fcN^]ǽyf9Gw(Ywma8)PUmϰF*Mv Z ;N}߿f=Nx-upޭϬ_'Gt`#ttn̫p!{q0JFǜп^gokɯsȮd|U|Wioo\XK<~WV ڲ7Q/goۅ~ιS0;/lq>ɪ=/'G}Trly*%`hJɷoB}?票42} qbҽP!`i O@ÇV&j\Ow'"DO!cK~am>27[t@obŞQ\1&WUU# 緈*f7ugy pmoM|ns* $ :9/0/ Yw{?_ouތ6|bQ/u%ZW_4Ul.X] TSnEd5ԐU>ȍ0ӊ9<s,:* 8N ytJ)h2U}YNTK 2M>qDk+6Į<(W|~dBu4hG^y0htq]}j4|FEЏxKh>/e17@#!Wx3.تi4'oq?Gs cdKv@0R4] _M'F φ0!~ɏT"h$>)9DU 򆫏FoBU8ߜf/AS_E7dzɁO b{7\ vu U1YąV9J5GyFZ1 m{<0J /Da`9}Ums]Ϸnda #!)k'J * ā3x)Q Ou۫"c|;,n dݳq;&'Ym@  Bq(,EJ)V")Z(%lHi<3~>ff{ȵwL߭} 3,n}ʩ^ӽtp.vc=fW7x9b_o_{Z?u&vqS_bbw9lrcZqiigϿsVw9|Ћj;W{sote:vzG}O:@{n?98?}npտ*|wž‡&v-:cW{G05M[u _5{&w O`,cVᒭ_j45)kM>޻cֹqSSyՇnj[65ߜ񎾎.^T _Cw?"c6{/?[]fj19_7<4f=^'_?mꇼڒLF?yMm2˘Q~0lǿk*lVSy%v6f҇Ϟmj+n=јvtBe݅>|t]K_?65gUL vFtv~SO~)aً{}8_z!Ok^[pwqk8vj5/loj|"p'7:5vySsW1dϊ6iJSMe_rIs?| V=͊_auj'W\dL]긿:ߟUԘp}fy:3vkn)vw;]Л7+\ʛ/^0+%Ts[v1S>}ֿe. xzw<~]ccÍ}'_W:m;~uƄ|*3ţ6wߴŅw9k#q9G;v߷Nzީñ396wi3Z^l_1wPuۉS񿫎3}[V8<מjvG?iI?>y<ձ|É >u9[ {^z҇;tQNc7vyCMD#;Ķq~&묈_Mz7N͔n{qe%&o86ˢN|gRw-p&~_|OzL[>Է㾏]gޭ>[s&n\c~Wm?Pu䝜:q[l.k菻}щg̘dzM1c?؉?#۹w{1gG6e4MϾ붱us~И&}#7~lhʘC>?):~-k_w_jxzgGdc~m\ߛ_ӱ4ri8;{CS}25m˯f8gbfeOgɋU^)> ıtGtWGDnn}﹯15'sPMV/̾4hj;v68ql9f[l-\E=}ܿإK/+=U֙<:gwwn{9s.ڱ[׷45 Ɨw/98dU^&>DOڪ⿬ac7Tiu 7tw<1 +tlѷ_|&>5~:87ٰnxv8Qzigقy3V]WNķ[첂 &'}L|ħ?럵g x5]k 5.7bm2+\7I3s]cN{:`+O&>ּot7۷8ģsg1xaׅ[_sݽο>x|Uxޅvujq[m\/b1G]s-?N㢊&}>o ݯW/_~V./~/r3O[wp;[`܋VV}y707wUj3ENָOy_dg9r6{mXo7.kT|?Zj Wןuh]|說gn;ywxq\3ooܛo4~u6 =#{|~y}v5G]pQ4C#pqڣ7߸{?|q~e73Ϲ}̔&ldܿvQ[p^{Tf^tsr󻎒K#o,9gqZ|p}hhڃAnz'ƽ/q~/wȸ:k:k6v3W~u,+0 ^,jwӮq[.οoa}]e̝KRcW*LBcl?{9籏}S~/ؘs/f[3ح.ۺbop.:rWN'y16믓7N՟n3(Ʊw~tX}QGOyu҅|yqmnE)q1iգ:3iИ_lbY{4Oz cfؠQwNkp{:~i.cnoxo?6qWs'oF.zkc~sֽit]}\{Uycmnnr._ƟUCo+}ͣkj|:_uת)Nϸ/_oQebs^Ƙ؞{m:?{k:=5GSjb5?.7ʧ/>m yn'7}q ؁w3wL섷;Ɖw.?s6&GĢomw[&yT)lЩsu@]*Xn贳1/v}r_9 R^uݮӏ5y+Lk]יX۳ 9iK'/׿&6Ov?Uh%|ɆN~ԩնاz_O>%~f&)4w8*xskLlڇo|Q㴻_5ouYG7ɇ'ߟq\qwf_q9#uçZ{ƽ-lO2?4zY}nʷ;?g6o^ `ʕ {ޕ|^Ԓ;K_>z'qR㺬<{gS.GOE7qgmu;?uϾʖ]w=P?܍ϭϧ3Ы7wwcVûcպG9{uɲ4/\s.f#{xqPΞxDk6(oe-Nyy=~`oK޸WNtwtrݜՎwʎAY3kݝ,5n_i\c?}C]ݱGᄄemo_xMVϙ&|ݲ;ߡGfjk^wE}xwyC^g~_ʬm]oϸ]뗟3'5]ƝycgZݧ{3#wd[{G>tSN駇;fڱ۽l'+:w{[׸WOl65g3|VrW8x;do\=sس^rr'^Xz#}o|fSn8WmW;ne[aS.={W'6S?U?x?j@{sWcvy1Mt1y9%Μc'l|A9=4zt㤞71n_mwx^>,_wM_d}ŹoPsW&甜:6G2ێ٩M즹>9g왎?3oܩUx7&]_ūTW&ªKG93quǣ&e&veM3[kKz[u38WlCjcګL싃ˋL~wSϢ` &'We/ºMӱ2{qq&εHxZqM1؉ҦQ ;Ҹ7Ktӵh铵{.pe_ͷ|z3_oŏers ?wY_[ƌ3g8;*~ܸyp\{ntwj;ev2{wzg{89n%9?Os wNk>}*vܸu֬; >.<?뇭Zvߚ;:v8޸>:-:xqͤe`yw_Nu^|.=5KW<`kGᯭw +zݝ83>}GN|#cgs{=/o'[ti]{{x-is^OozG&3M|c~lτo_w:ȉ_s{nϨ3Ļ}~'*gӣ^pQ&~ɨ{Oz}]N=USzرny1[|z+ |ď{MvӉs{71kO(g<_zEYN/Xě}@}Go6Ļ~}#!z8?'v٘C|1'.~jDZ+Ǿj,'Jf1W׷ ZxB|8s׋g=~ #Gh?gy^;w>^٪tq깹`QK H^];<~~3؄f/ԩhͺBV~ֿ1Gwg:q3gmc>¿xW/wp̳U7)k<.\c[-tO)~v;Ӹm:f7\x՗nt~C_xNٱ[ Wx̿r+n{5ں)_7qٳf-j0j>y{xtULw;>yΟ7Yw~^q|W?öpϵo8Kj\^9^kY߭q97^|Q37pUǎ+9 Ga{\Kv/}?L:8f}o3N|ePKəy[].q)ϵ:Wwqg]5?;x>/-}ۛ~XtN#-~xtwxF_Qۺ}^mi۬?<ֿqϓqEO;ͧvϱO[;0'N8_tűw9f݅s;{^9~Ěy\rہ[v8^ٿ3tzTw׽ {iDoZ}Į;$עWgx?^wͧg9޻o;;/^?wEmۏz8M/4çqpqD<ŖOzkN+7wOĮ*~>nn*m7'u~ěǴvm1q7GϷ/ӿ={1G:t'Ϻ%.ˮ]r鍎iWs㞚K>_$G궿`{iSGo&_Ռ"![[>gmN7ޝOKӃ_~"=낛ς[/2+_7?+7j'<:x ogڽκx}Ԟ1Q7zT~173w wxOod篻߯7|h{~#`<#x/~nWy,{k?V0j|渏#y[㺍>5G>vzEOg[޻]mé^Z9qgyuy쏝cž9G[37i[SG%y ƽwǕ_wUěG]ZzQo{@<ɵo=ƵI[ށrΖxK[fuQ^yXOx.5ެ/,xNogGb:D?˫.@}\/ppw.7dmē;_?ð7r旵G~ Sv-rKv= N+^ZϵwWkӅZs瞛}v&ulߏ< :+sr(ǮrU[oǦa^nwXwUۏ{N w횛{ӯ&Oodj__/xҁ|=k4l<_{F-oxmw纽ww?~;q̀\^u`~l׍} N}/όȞSzo YT˴<3>|^6C;_߾[ܹSGx)M?}ޥ\w}>bcwŹ]72g?}`<ןJUgѧݾbfMsޙƳūWl\3_% y~qS>g3ˉ[fǷ*vyNn63PynV({V8-8Q}~h>5k\cw7Ԛ+GgouM{l6&:`w,WljWpPp}:l8PοU0P%'񜉷gOYt&>tG1]Zn {e f>1uŭZNx叮v/ۃ/5{ܽO=WK`n6oy={<&;-Xn[c#רz#bο/O?yvw|ӢgkSso4G}േ]x˻kY1[O3v۳VMyN˿9NjN5wjh9S*7?j?sS?JxX>n8;_A53#[O?[FymOMGKN߸8r]S#7+c/^t}ˎ׳ϿuqݚyRi[~>!먁W۫<3!nDn7琁߼WiO o:/4>;Kv|]=sWrMn85&_]6}z\WL`wLݮ.ݮ} 3^{twƹ{?{?|иܷwh↟-xd8L>MpesMxꖯk{oWz#쿈mFǯ6];#7Nhǜ{&^~ݮ4Cw}K7{7=uh}=r;˾z.pYY*YgC6pE}em+{sޔ5 nJ%J%@ɵ7]+}ӵ7},h웒{@uࠒ[J՞11Y~kC|Pi`۷jYQ%>[[QW@|o. * ||3_]ۥ[^ -JsoR[\*j7o񳠮εRo6Rij5o) CsaJ?~J5*SBBkc~J rU7 tYS ?fo3h7t`^nj6퉎t'k .oez+gpgomOtM7GlRo :R#6O?>ɡAtM7Gl~}1;KH՛n#Uo;bÈّDGtw) ?wq;TO#fGhwzhF̎ :R#6O?>)AtM7Gl~}1;RJH՛nu9Si~{rrtm07u9Siaۗ4]x8 =3u9Siq{vrtmdڻ$u9Si6b.g*MFzO]T.,^4+=4: ]4]x^4]xޘ4]xޚ4+=46 ]4jCc޻R3 oc{S3 ocS3fƇ.g*MƇ.g*ƇO.g*MƇϧ.g,JM C{.g*M&.g*M&.g*/KM C{N]X4 }/u9SiiQrtm0LۦahKC 4]x< ]zrtm0tک˙JӅЅ.g,Jm.4]x2 ]Yrtm0tV˙JӅ-ЅS3fCf.g*M޶CO]T.m.4]x: ]8=u9ciVzh0tanrtm0taartm0tairtm0taerҬaB4]x> ]M]T.m..g*M޶CS3fv CFR3 o; ˙JӅЅ˙JӅЅKC; KvCK]_F?/]x9 ]Krtm0tKC .g(~?.?gg O]8cib0t匣,M].<4u9,i {R3KӅ N]8cipw0tGY6.<9u9hw4a匣tn0ta_rKӅЅg.g]fipwL,ia%G-MtᅩG]?.}rѤitG{Yi=CӅKS3.f..6u92I]64]xcrd[S3΢ܓӅR3f[.U»R3KӅj0]xorѤitG{Yi=CӅ.g]N]24]xreP&lh匣ˡ4CӅϧ.gE'=T .gͶ4]Ӆ.g5 w`匣IKӆɡ·S3@D{ K]8&dh匣ˠ&Mtt᧩GCiˇ H]4:7rOzL}O9h]?.Z=u9㨱4]Ek.gMZ6MMq&34]4*u9hv蒡R3.4eCE[.g]M..i^k6U匣?]ES3K.KUɩG wCES3@D{rS3.f..*L]8 jD M.g]M..L]4cP?.2G-Mt7u9㨱4]E匣IKӆɡprhVhtQ$u9hv蒡DreP&lh5u9rh2MttQgrѝ(tQ2u9h]?.qX.U]R3&-M&H]8J.qt 4;MttGAM財GCiˇM]4sP?.I]8mipWN]8j,MtG wCE'.gf M.g]N]24]ԗqtԤ..:3u9rh2Mtt٩˙Fm:+mEKR3f[.U S3KӅj0]匣IKӆɡS3@D{.g]N]24]tmreP&lh匣ˡ4CE.g5rOzL-K]8mipWJ]8j,MtѽG wCE.gf M=qt 4;MttGAM財颧S3.&DM=it,=j0]M]8L]>4]Erݳ(t3f[.US3KӅj0]vrѤitG{Yi=CţR3.f..,u92I]64]Urdѩ˙FNYi]?.N]8Ӆj0]<>u9㨱4]œS3&-M&.gf M.g]N]24]\qtԤ...M]8L]>4]\it,=j0]lR3f[.UborQcipWG wC匣=Ь4ўHr%4%Cʼn匣ˠ&MttqkrdL{eQIUdrlKӅj0]4*u9{Хi MF.g7P?e.geipW}S3f[.Ui匣 ws}S3hV.g@GF}G4д4u9|hni_erI匣Hhдϛqt 4&dhO]8:?Mtд/qt'Mtд/qahoCӾDr%iˇ}G߃.M}ohיit,C`ڗL]8:tL.gͶ4]Ӿ]R3Z6푺q@Dдo~rtThdhڷr$4;M494[qt>47Mtд匣=P&34r[k>4&dhw|riK}'.g,I]64M]Xڛ&д/u9MtKDML]X4Mi٩KtwiߒLG M.L]T.?{hLs}.g,J5CӾKGF}צ.g,NMMnL]X&:hwkrR&34[4&;4+u9ci2Mtд匥DMO]Xړ&lhpr4ч}.g,]&|htrҥi MO]X,=􀬡iLF M^I]T.= {hzrtCӾS3fi{KGF}.g,NMM>M]X&:hErR&34==+uG?sډ(:Пޡ髧.H:ߟ^Gс~}.vۏoo|Cn8[:4=}H=|{=){?٠ ]>}v~g8|v{oe}k:ÏsO #7崳|PC}cq{\cÈOy'Q+o#58߲QyZ}լUv 8s;(+k9﫭}7CK4x]++<%JtM |97woJJuEJoB+}V{g A~mߪeEonEB_QtoJ=E̬}OgQ+ouw*hD5]Nmߘnx{%?=O5'7ÊG}2ǏɌ>Tu :D4>Ӭ+;_lȭ?,~32sS~'#{oK7Gl'ټͼwl=W#iRu֟<2Idd)4a;ցSs]O1#7L?l^dgdl|NX;U?Rvo[y#+Yuu8ox[7udhۈ5PӴ~zݿL#1>Հ{?ʹWZ?swlVk=rnp{oe̮5g\#?.[̾O_f?k'ZAy1ť9??zw}+>4[qnk7|17~Ȟ| 3 -=iqm[So-_y_b#}Z3v0O>e1[Vu3X~ϵbؙլiy&&5/rR򂍣#Jrdf]9q},%m.>*%˲%czcreӺ&q7yٮWY_MKJ4sFvDm;QuB'dZQy폏yw1u[Ma#l'vCGh7ƅnf:SK8mv`e:~log-;n?mj,_M9gv+q5Ij)zY;~/dq4n%nm*y8[CcOqQh˷Ǩ5Myʽl=nWj櫌 KؼIl glи~JycTr\h:;&a{l^x7 K!rTRTse[+,B5c?]>F#!f,>|vm_`jS܎nkˏȩv>L-}}}/>' ^Ęvn+ܨ]Zڶ?U䃋l\hjxX_DOS+_EVL*)"4 9%aT~՟,?X`Xu,lfoֳzqq!:)y9?vOߒw!Ri^vߒ)n=/ŽTCOk\WB/cֿ4:;zEާyٞs3i~4Gߥ̷ 4ҏB:a^~@Sθ]=]czWoƑ͔^mg:@?KZ~cX~­Lsy+> y;tWþW~ӏZM?)4WiSM~,isvkM;_g;RT ?&բI93ഋqMa;n0߮o{G$pe*{>caM9/ ~aWm ~WNLx0׶G< 7ӥس0vVM+*'ecQ{ub'I$# x.OgI{6|+` ]̟}RA=?~ѿ0Y+9B |ɸƃ3dLJ^5,_y!~ML^Ю#񖏭#!'[JeO%{. 8? y^ПmK?zN15ZiD rKʘh*˗]114~1/ƛ@1Bg89AN&</OEv |wb 8(aܥ?5u2 } {h- v<ɥ=ڎAbJ&bCC+ڨ;}EN7C?zqDU2傋ہSZ 5¿<5෶3-Z)zPޕ#' \3=_3&/*ƃUu\d>GY<#a`O Ly:pѿSrZCy2z\M .ᦞs:P>h۩N3ff rX^G!oa\XvU6񹘗)9WNC؋,~W bgKƂ/g TcoshǏ}sHrI?c/2->Owrx~7~Oh ΐQC_LާD $=*E[8q{b g!w o0/񝇼D7r5y+|w0Cv"qx*tycG 2hvx<;Ɓch6E[ }<4}r)oFN߾աOq8TƠYn Wo㱻Uؗ*N~t@z=ϭWnǸ=O|:([o!Q f c XqCK>)SA*b^KgU~于'`7sɭek쀝բk oMOc߶ _r_YjS8 ~\2N;]#o>p^i=<>ѯzVQgr\~`!\p 9+o qu:ɼ_ȹAN&c|xioxoXAѧ1q>S X^^QO8|QqGU 3Oؙ2Iؗz ̺ysCo3ecC:{w yѴY}4!ߖ*|Ρ<\r\<`' %4?KAsSqjyD% $m0SV2 3@xÃ?1Qߓ>L28ɳ:w;=(.P}iZwhݗ,5`ޔu Wy*hw]Mw^5i?OMc~9#86c?E!֋乔7Ζ/1Do 'RE~eՑdao+./7]ANpP~4g6l[K0S nf0ZAdg:T=Nq:Oc%zJgpx<- .CzWAnybK*ʷM"f|UاWRf߻ i}M!D~;-O<4#8^R=gZg͐_4FCĎ+RMgjyGNIygŝZ_X楚ϵY]30At֭F<歜5*<׀>Rn!* G:h|ZO"7j}½֏So Y ԡsy0r[ N4Τ5?9ECAye=z2l~X>z+G\?X1ȱANZ' 7DG[_WE~ ^jxDpߴ|Փ'?֎3}o ?EM“?"WeeSJN.쓏cz`\ ыr*E [rF~O=_LKzT^`|ߕk]}.&Tuy|rV\ߵ߈wr:||Q.q1o6c\؃ZWkx 9^l Es'~ހ?WqF8(\,ę[ F#>ZK p Z h]0ʺ1Ѻ3?Jy/Q}KQOֺFRJ?w3$hy~uORv7 _N$=l=ݬkcb~׃+Y?W  M:r Ԅ~i|hhA߂W3BJ UȣR\"7a/v^`YH? i@ vj> A3zc E~E{C¡Q-g{pO#zL.$$t!^3,Z6Bog}ӶۂZ8r׵o.ryjz1g'mΣK]4qL%<Hb<̓,|DYwjRd6~vG~g }Omk"oczdg"~*m[Xu^i"yR8ߵGD]?b|!֊b|+^)ߧ!'oq3 ׽wk1Y/es <G`U~a84y=7r17&SG֑=QŖoNl {S!Nsiw+}O-mc<{:r؟/ig@ w.v]Q"|&?Ոߌ~E{[@Cwwl=xii;{}n[`%{>N^"guג9n3~"of(r>y.ɼ+Ow0yK\'2/q Bee)bA߷ƯF'_x={S6WպT)o栿uG.ɏ)&?"L|Wې<bړva 2!_oLߓ'l@ ;~5!oc'~L-~g DYNح ~EZ>aȽ]Uo- )D&0ch=Ч Ζ_[ܵǷ?O.pÐ jOv=t8'yV!qTAWo<}ݦT ڭFGI~;?^x7zw{+SN_o^DJ 5~'?[Ѕ^7D־:Y eV-E3~͓n7]ȯ L!~<,b(<{kj&ހ|GP8<< 3ڧ\n~;ǯWҲ>bȳaWHFTyJl=hX橚|E'A~XƵsZj7 y q~7tOTUi_4?u|h/c/lr g? BLu2F*來wKr{N>qi{\HulچdiojryrmE䑂C=UW*@>+p>ytGuN,85boOm7.'g*=W g0O$&aϔV>>_ĸӪW ?4oϔ?P~ONՀ 㙏3m<˟5m;OqSWw;l4ڭ5kft^5铇a=~>L7"N?=M51oU*;HC+sG'&ҟj;>B/3lօ\L/9\cJ|zqh=CKwyr9i!*Yʽm~>0~9=ZƼ)##AV03c !? g=cUBc7?[ ~T5~U vOoAfvKv|唧2"+<ԺK+]_(~i#ϼ4$_W@'wo] a9`r&_"7!sedȍR^ ?}2iSsr[~4US5g^꼧6ǟ-sy@1??g|=N^1ʿ\z }LqtOCVH:>IB;Y#y(z+ᒛzjUB ~Λ%iO )>"?7u~4"߬x\~G/5W qg!%,kC \F㶝-l?e}7I·myI^:ܠxt7[D^Uq!oFp)/;s_5NrQ_~{ >?LGLh?)F^fmL^8hkQ|:W{9S6b:{eL98q)馿>Wu\ћzW[7u)_C{G C(?g9E+4zs96p iFB4_ϼAf/Je])nߛyp~*R[*A^MJ#oڏwƖڲwr:x NK_?6]_1y'[rc[nV~{9m:iha]\k=^"pR.2":so䬈xEtk!~4)F.|x/~Ik*ݫP\ߺo;@9QmW>;6F|[ϊ{uw%+ȳ`.e}Iʹ2:Vg'l9ʶ6Et &3Kݳч& i/(.niC=ع:䢎IM'`<%ۏZU A= k%"Hc/:(_guFyζ䛶]:5X_!yhf&ju(9`> cFB (x!N}Bc:_c6^%ӺeGͬj_n T" c|~,\OFRF6$M|Mi!pxV7FЯ옋[.ѽ i+g$||a |k Eԫtv]FY/K IګE凐toG\19]-f\kW1}%M7|j#~&9wFu^Ey\1%c}%~+cJ<TCu˜wTGoYO?ؗ`'RaE~G~y˧=% 7գΠ<|.pno:~7^7zy(x}U8z'Iy G>$݇Uuh?}gUQU6B|Bѫj/W~?v"ocb;ؿ3]m}-,=["4Sأc۔b/ݳQ@?' <r-9,[M>?MLgcwу+.ig7~Tүw#敳^G|u8ĉ*;2?u{sCim(o"{?w!G=QwjH>W^Ķ" _jy~GSnAgvvn<ş-VGGN׹tޯ(ïj>'7ݱ8qr?bO뻶VW-x~y ~Wr@ܗߺ =d imD}g=dYqkun}쎗'}Ǣx/xu.j;?By c%bW~u`K;η+B?1Gj/i띯v3v?3N~#V9r]Mگ%kN::'])/>>^]Zg-ق\~J>EzPL/ Sļ%fv=v\l_`%yx9:j&L\um{~kj! 17:wP~2 Ym<+US*.Fu<{](1)`|Uu6֩t?Oc3ng*qK~,ދm">8:c f}*A7y Jc~f=y=yOj#'OEz?ք\d8fS.=ߗϤ i&\$߷| ‡6Ns:˶)lWՊvs#ƟhJqbv<:wNfZuE'>wa'u/ۖH?wUy8z*&л9O .);}A.-JP싈O_]J܌GxO-A>M^T:k~EWKߌa >Uo^?g^|S٧vZu?lEy|E?qy*SS;8˭uM$:8|UkFC\_ Wy881 &$8T}o}nm{ÿ=M]N{ `?f E?WMmlBkjg-}+zGۍ\= ?G?Ҷ-Gx%kVh;=ZǪF=[rA3s7u37yYG~I~W?6/'#VCo BVx&Q|_yhx<#8'-{= yݯE^BisA~ߏy?oŮ6u'e ~dNَ?]a=뙶ɯwՑ}^¿صm?|~Fu幰 1VyfQ8D?uɎIo> >vSȅQ ;uVӺ[yLZߋWb/fϰ>Džқ8(sag>ho>g[ ]ʿcA.|xoNEymbc|ri{ktߢx΃5`:n!a?Dgg뾴z,cGЗ99':W_9oH~]j"ر/{od}9 7HyfBfv<?Hc''1NX|D?V~qGrDڑ3QsWi13O8 U}[~/ng_bGOό',.QgڇϼxזmJџva}S}{]^F{+4U< `G89nwO~/n5UE>AqyyY$YsWɯSv7!F/Wm?mӉXgds peĉǛ/W:sEGtC|¾w:L'![ EѣYGۿkrPQSt/ίxc*vh%ƎÃJol>cC#|~tFV+%>/S oa^=k2u6< {V8wy0s.Q}m?0v,w࿻ϕ/ 2?zʣy:n~.YQbWb]7:Cz贈~&IV8 ==zDWџm['c kt%/{ZH0l?¸C#Q*屣$tޡ{5ܬԚ_꿏C6_!wWYG~czH2 y.ԹՓ SoxEPHGtbZwio!'Ϋ$=?VbǡpZI't8ZNoTo?7H>Y"m}wy\J }1zg.XY{~'៹W|>9[~¶ڂN?Euf K*W I7To?My53 n)鼪> ?fcW"Um' 9jIq|P3xUG~yIύs#cȩ# /y)ǿ-un]G-Qß~ßѽzuɏ77DgYMU_.ک!m`^bKquQ1~{rftv%@5\|y!k/ǙD.n'\݆ m,z|="]Wr<[4ዡ-m}|M]:y-|!ߜ`@ūwUu a<^qbQU1J9rSʉȣAt6菗mگ]+vucN"/vmUW?獲tvӐ^Ĉ+b%{CnjER~r{l{lz/;P?}E'O8o;2o]XNxnc׋/v4aʈ[<_;,g] ~eeP+;?E#̤ G5 Z<}L^V΁; SeҽA;ޭw)271O<ޟNftOS~dDrFyp9/&guu'K+k\#vYkg _-bTjgAYGԹؕPL1vۍ}Gw:=>ĈϚY_M^G zG _9ͬU.nNsjaBW:y9m^m΀;^+k^ / tOtOG*.y5r}A6~*ݎ}Drw(OA?u\~Xr~֫}Xte~z6ѻ߉&Vx=U>"rtl is(\|7`fh?rt1_NO~k GQ -]T3j"NoߎT^kuϩÏq;]^~q4 >5g9f}H'"F o Tv$<4VJuD7xW}Jݏ{YB \h7+D=M}vX |ž|Lq)Պ~|:|+P״~DQ ?K{#ekY);4xk'AoKhO.z}:g7~1~αT#oܥqUyk$_Fܥs^zT({ܺ_M#szzG$w v΃j x 3濊Guo10#ݳ]N\bۺRqVZtw{~{mbg=QpUu2: ~\ d_Kw #_ĸ^݇|fX~G%UD{8u~&PEGֿtߌ~WRC>6> qGvAq'kG6I9\˼q>H/;ֱrIWX 7gWw}\ȅ5]qu|`}Y >Q<طrק‡q G;{k@ZekҺ K6KH-_-sOr{eC_CQ'aG\^`6yݖy-D΅sojvq1= ~3uJy^}:/PCC;9zϙGp=մGd*~+vWѿw"b̃,b~5uODo~ jpm~FOQO%g-$CޣZŏ-bwM1[_1zwJ3 IGKz3_Ox=xԏ?@KEw5ҿIʗf7--kg@_s#E Ak|+~z# ?Fy؉~k[>$(7OXADԣoA_hȯLB&#G}/ȫս ^I8tZ_JOv'c76˿;Z޹cbm;ywjӟ0X ?K5x,>U#z/Nzm8wk>P=[_c'ӡU~}h|]ݛPZ=ӹK餿x= z α=rpEy牼N#v:? 5:%/k(WY,C^B Hd+ḅy׾bImr!ϕKC)ϊuw=a6s.{u_n3Z~0{3zlS_KMMĥ\?A 6h[ѻw-=yq+JGzy6t\W5?T5g-~b^nRtJ  5yS^r!q֋ro}2ƟO\42^Oy"TTpyס&4_ݴ"TRbbO\Eo4Ns M 6=f'{zt/C}3ޟHs(W'wtN82y_0P>^'ͺW 0O)tOޑk!Y:ȶȎ>~::uȽEka-l1~ɺW@w'#zzOE/hwYnv3AUr$-i_0ǖmoE xY){tAѷJ?mo7|j_?-Z;[Vk Oz+?m)FKW>)ȋU|Y{WJ0V|8e?hB)Oko/#j}?Rriu)watَ+ҽl~|b]J\Uоkc?UINsҿ?\ ?ki?s:->i?i섑n|m=p++Τ~/i>ktWZޙʵ'Yѿr ˑ0z?3ԺEj 򖋝p6B>y'wM1]ymR_7onƭ{:C|\|x[Q|jC;u/,eu_1U'ۿ7h_v >< ?Nqe1,N#zS/̋>bi%A=|\NEOMy0)uN{І6׃;{Ey8?sو}}3?}߅gc YpU㕇=[za<~ 5b_>m::|m=M+qc6<P8^E z~d| _|oڟ\}o)NV0g߅ȧNQZ7нڇ%3z|M'Ӿ/ʟj}}պ ̓J{VS5J>BDՀ ;մ[=T^LPәɌam۟xy9^xһnoZz[&UȽԺz7D6\e ޯ]yo}(Ud~/0_y{*=մFJP7^yrj}Wk*L?' Q#zPԷQڮнqКu3NsA}y!7Xw$؉*$ֹ?AJ[m=? 7KUc<7a?rމt?j&|_wg5$|q)ԟ,w;S'u2a>o67vXyҙ[ysvW鞠}؋:J/)y?v_m.](rf=U~+% *:_~@:a"^q/bױO۶>?\ZkO8W9~ WJX?pS+w:sc^K~ ^w>/'m$_w p\3'|z/x ~KC(1p?Bp;Wx<x!LޛfY9!Ny:d\\.u-I+p;rm^>afj]}=ct)yx6o^jǥ p%.L'3qϫS<M\'/~ZQ39|̋Ώ3Sψޛz_8AS2?Sv` VU?uk\&?&/Domwލ?"Yz 3'؎?bvN۵qQ-|螂Y<'Ի^ ŝ3u^#O$/z`t;/0.ŁuY/ʲ%േL5~\Od' oP'2YfN_#_}~Q*R+S܁?3IqxWZ_grCˢW DVu9]P{_L{Ed-A?$_ į'υ>^uA{/uO}zO&?iH~~D( xMﭔ}jU̓W~.J<)r1A70pyAj_Yr>ġ-;.@#׀_~|?OawmaϢ䝚\уܹ/`ЍG|@#Q~у'菛ޗEwϙlg].!:/?/=İM$:K_gi?}M {c5}9f>cq@<7_{x-!F=-+WB|/>Js]w|ܓw~݁=#{I׾ȓtal䁶^mXM#3o3zXQ?ɟչ|&B~ʁ|?s?a|Z=e=?5.;xOCZ@o&/+O6~*]~j'?)*`;rrM;:'~8AuF&cЯy/`g^a^?s/\Һz|D!7 /oA^("|:Dkbs?1yAOg3_{o0,wlO(7Qܮ'0O:so>վ&_{^~e~("Ҍ]W"_u.'/{W}u(C.$0}#|F>aycݓs1ȗ;h\ڟ#o8 ?$tO_Cv G{.0gCR΅bsu~Z{]S3П-v;{ >z{:?sWQ{)y>p~ggVcoU[xmw.G?%׊?{f Sh_L`c|_T_(:QDCT8ls;zWqNjoĭ^/Nި/I<с?ü>z_^{?2":WN gvuu΃?cΑM@n{ ?9_A_ÊBg)ޏվ)ֺ;.SuOmkdoq_^1 9'4B*Cv\kaM;.1 ̓}< #בMm?rgt |z_y"},~pb Q0ԯVE\}lc#JNh_3{7ȓtyx\n>x?@~ ~/T?yrz-Bv6d>dX=ᅇ<8R:=7zx=/7.Ld|?%;8LQMO_Ďһ̛ޅT>HԷhS^]b/|ؿ9q;UA{ f\OQ+}n8!Dy D  G/ݭ__={ȅVW~Vd۟88[dk".A?~{S:'9 /GX$Vt]q&}'(sO Iε/;;LoUUb7̯0VABrs1+a|{{w蝷 O>'U_tF t_t=^DY =#ݿۦ]>v35FZcYs#ue.QD {Ax5oXzZt,vֳqGEwLe۟8jAQ:ϓ?uŦuOg= d^ȟr+Aut!>׽zϽy#'1S,Z.8{>S-Z`ߘWeAG5y1,"KbRۿ7b>K[rsDMfYDh߃}L&[g*cBw܈Ɯl}l%ٌđB۫{KhDvIy_QVV|;7a_&3;(}b}1{LgG\-x~?K9^^{[_8\+Ao*b{؅=M~Q;1c\~*/BQ;Su}>y7v݇f=>J\.}~݇̓i{n! OEOꜛޯ;?AJ2י547+l YBuo˙A8g2zOY(^>V5pa7f[cz- hk?EnuJk!'3ji'qwݻ&m΅i*Q !?Zv*o_ 3oS#҄_UJ%ԯ{gK&au7E#w?דga]çHKKtgu"ve|D9:;k\!:#.G27}3ݗ Ty cjڊ\~ruݿqĉE?+5ț ~(rރP,Vz\sAȻ}vl_aG#"Z˪t_roެ,@͵M#%o3rnVn#EC;B}EȕΝ1yc{9ac< BX}żޒ(xdbZ%p\j?k|GN~qf"_XOt# .J&OE6!.$^{1Suo&q y" X,nUGGQ6ā KFw_ ,U#MxEBNtOp#zHRղZ{(y8{w]SQ ۿ7!:Cox;/FVr.Z2jo; ] ȏw_؍=hߺ')|"nX/y*I"'4",F^ZK ?m;5V;9YW֓yϋݍߜg7K纟k'z={# C{ǹı9~,uiMvC?3ͺP!.C ;} O:|J`e搧 .τouL 5'c/+KXywg߀U$m'y}1(Nk`<*j`oDNę1,pzA"t|OϺLFCŋe}'F}ޖ~%#N(r8{ڿK}oKb%R#3n}¶.ig9KDߵn _Or'ZVx GQ#EzS4bԧsv1-_yQ}&+Wq߫WQy0 [ҟ\\CPu?$&*Q9qes.\E/󑟱\T6̼o4`'D:~j_X1~OπߓwG,2pԋUt/vK=۽W=~_ 2Qu:[*>4Y!~}_K\ڊ)g}SJOt/s[Ѐ=M<ڇ;q=*,N"?|wOb<2>_".#zGHyi1zs*W{ïA~NsrV皘<=}Nc|{`34Ǔ 0vz/?B诏w'ÿRO~,A)sm?Qگ WS%o]?Tl侁_%3z$-䡔h ?߯{9 zM6P_ll=~s5zHHߦ!/W(μ"{??J;Iׇ]O/~{iOB a=)W"':w^ι};?f0N>?T< ~o_i~>2_:'7?s3GLwڰk]WAtOiCNEr{Y,:HN^Mz]`Vv/~Y5DwsXLF ה!zDՅ}ӟfЖl;MO$뱴}!i7t"]sTNYg=GfW;B̿֡t^h|]+o&\{' g-/Zr{tǜ5,:rڿG=^=0Na};~8rZA"%R+ߑ *+sڈ+Cu9z?nr۟ykY^~oOtcgz7;h3~϶; N2_ڏ l=s`iU:h/e=;Nl-SC >d7%N;/7:V{}OʔZG~#E|_jTh!"eu\l~l3EhYY/#/]"~C){cK3;.Mыb[ kB~?:t~t>V; +ib?7|_|W iy5xk̟⪶vpyTC=>~5qo˙'z{z@^KϪuOWoF' >'8YK}os}{]{>)>r4py}g5GߏfI>[7b;ϣwrw+un3u?)c!Be'뿧?9?l JrqXy{1A9SMZZIb夎yAYٹ4||B^9"WzL#zRø+ׂ??]s;m͔â{օķt^n9g=T~ lG0 ~n: s~y)?DGMhE<;u b8NyJ~Nۓ䣨_S>߶}znpW1* ̣lR^qV0zq:r8JLV~<ҿ\^d?K;G/̃!2<6vA)~hB~4|e=R Zъdg'=ø+\hvc'Ǯ)φfrRRuQc\-seO{[yeS9&ctC.SM9u 4=K.JnȃWY?u&kJ7r|^sO3vW9>kjݬX~ rD>*1 X gr6g6y ?kGyQzY88D>=]GC{>9:_ sM; +…=nhU**9~(5/y9ѾzڋA=Bߍu#GzԅFo:-U^վ~Y r{y#[%ȡ;=.F>yjW_qIp5uS'lF/CQyBDC)䩂p2!b"" :ؽԎ{?77rR  n'7h]&r4pI׎ſm`|Yq@Yҟf:t19=gL$l^H܁=}p ȅ\k _uJ~VdG>_~~c=:sNƥC;ط@ȋ |L<>xTy*5|ȃ1ѮkBrЛou ~W_оs_dC|DVnC ~ʙxc^Yqr3=;Վrȡ* ; jOe'C'G3nvgOc8 I& ϺCW:SOO30D9z_z]@|:VHř؇W1e̓Γ<R>[癴u:GsY:s [c"E3/{fʮ~+A1:>4|6!TatUfӉNU5g̷oͿC^XϨRSu}^s5KLۊt.݇%wȵuܦW91Zឡ zỹ/Nx[rzX}O"ߣ}.@޷i_ [($.un_Rc*Ɓ .;"һ)a7F3O/mʿ/ke{k!pו~\W!zws7̇ߤ{<4ƥ(߭^Dq׹9V~ZQX(?}3xKtk=nwS~&{.|o ~}?QRHg<a'je'xU ~k)?vN4Y!>8w_hgw PG\%pWoNn>P{W:7ypr#:v?]z}%_$اzãm y=̓P4\k"{w%}ZZGwJpH{,,Co$ 1+S}H=vsR O"w96eF퇰/zn+/S}Za1N[jk|15AQQ̸ΧLdy43+9vt߫17W"i? }ͭlk@^Um<>ƫ{f)}H Z~Uq˟ӽ]џՁ/~yob?>/S_xbmۿRǙG0o[??b3gzǫi蓗8A?Ӯ>Oudt-{7y0F$)>U^5Ya9{$O&~G(_w Ouw1_dr'B5tR5t{(ڇK'^_4~I;^G4~WWMؗCy~JɫAyLbzO~p;ZbQבהfN`uLc:'pZ[#?O1MȽޯs!:F^i׍}":W# 3./MC<rȶ/*_^U _uy;3RuV5/[>ku>oȷnlaPy泔׽z+ydt$U5x-rB&up;r2z9<- c= ,oнK +qtٶW:M%ݾvv;}%;>{q/ڗZ/$<ɯy_%JϢGvM| x6+ v}(LWDuoX5+у<\~~5߰|JX].k9EUz?7A$G[ `*]GVW^D*Y"^GVjD;fzT{FpC **&ˡ^n~VQ9d's[3aFp UUtZ+I!+/qGAH$is~zǨ>R7)0upfۖ0sv淆q4f?O!pSӢ.F]1;ͳxS ]`e~40Yge[Oh={wt[B=O+?|wc'}W7}? 춛z_U'Oк~B8~ و=i>7Z\+K<sctόԠzgGmUc~#. {?^m ~}?E͸tnyjŷ'[)?]&2TF1? Gs|F#SG>Ru^D5RO5|;/*|к~;yy{U>OjCOl_~_%ȓ]`%9wWyYg ~C6~QmE>By׽ buÚ<=D7%ߙ5^B7׻Q$**4"?9g#S':xKAds8}\$;}˺:HNW1x#U汘Q~W>19K?yh-(_S>\ {Р6}X3B_,vtt)=A.B;>ouȃ+ҟŖ-QťkD|?Ii? lUk]B\H?#s]]}U'|w6wtNX+5W!C74R|9:q7,Ư}Fv:wZ._RFqzPW=rs_C$e[HJht_U<zt []=ʋ^3$1NgTkP]#GZwLм 브[*8!qlg[5Us "qgH'+|=#Oa7y .o,Ɵoj|CZֻ:gHGuk=${QfABB 6iNܼ;=;M$m*Š06=$K+Z#=Mx&g1vNv2{ߕ83v i|6Ok?Csϳw#1MmDžx{3Nb)z܂<).=|wů^s?]FNj=1j}i?e>kqvRxO~w=z>5ʩ8Z'zSYuS/~׊Z3+["=&.8Ws/:[@Ζ7H3(N֣|6C@=C~h}tЯw#wڮy$cFlҌ#?߭T8O9ي _Z_CI~*c:5> On"A{Q.;٬ϗ\YauV=W;ޏ{b+2C}7ӎ<~E?OJP$E> 4u/G=@P6PBnj{tG1Ky*>v;KIAtr3??}y}1!%MdVW/E}yFOf=Gi~+L?イZLqkt;.czf+g3wA ȱ~%v,7oCJ>hV|A!Iӏo#k>AĴOG_Mj?]K~aQi9p#~yQ^RIxiǯGUB^0KmGN?Z}RD1l%K>AZv?uڧ04_iEv{RQIƩDɿvRf}~9wѺfk Qܽ{ OȗzPZ[#OhҿZi/ى:8ϸ݃s򤫸 YxMV?Z^y'۪u#Z^d<2 _w_!O!_ҳ;tP.EyGGHJ>>̋k=J7z[=b|+M{۶P/KuA e38xxGȑvgՏs54AмAI ocؿO4&4kFkws&S^F?hG|{~#{zo(OJkCo]KiR&29L|oR ׺e!I ?G?y%-_zS_)>γTu3ϐWFm4Wq_z=3{ނJ}Oeo`m=dXG~oJ}^3Kh^_]^N-tNt>DC!wZ?uEh~'0rA67s]G{9D%c|szM~:UqA=ƙm軒[݌o`^9!=r8$ߊsP~s/Pz],5ϵ-zA7tαy~3"? {^ވJ]'C(bG!~b28z؂n$]6Y_B >u~Bdȗw^Q3^o˘?~KZڅα- 9Cu3N@B_i'=eحZ =@=nLxGj_%ʹ詛h󚆇,KQ[vvlG;vOj\BV6/›摛eO#_9؊:I:~OʗD`Gj_qMm?J=;u }I霰%eC$ZM>.ޓct->9tUU~S:E:N/cE:GR6#OIh6QixOFFu3^RLezN;PqWRCkJ\vwu1yWǼEN;{q.<0~,F3i rxrځH>VH#^ ̟voW~~;J&iŞ-0ޯ~$ Z?9;ʯف}x؅]{7kӮCЂ uno \9Qj'ؿZC9G}|7@ WPaW4)C3rE9K}͊ {+_h>^Pi݌Mo_u3?n?3˾\J^F: +<]rIk[Zx)\B;sp<}3C=<³h#z CZп$C؊JT\jGuޖsYOo^}qQzW3܋+T)IW2ȧ  }C|%'Mȝ-ay_i%=)exrv}@r+{9zKָWƏ$9Sȗ.?%ڵ֣_Zq24irvv.]z(O~@R?|tکH.E^M:LYsꡯh}Qzc\RoTx_͌K]ΝҾ`}9_k#9ވ> ?:Ǣ?;SvlNN5x)0XOyq?u_i+xtoې^]N;_V ONL yփIQ ح IizGi,*BA9:OQJ.N׼يL~ o$3я])%i3wzY7zej2D>ON0'&3SEK/S?9jwE~F/Ojn7Peg;mE)>Iq't7oWB蜔3K~)g?alDrY _,n`` $K/7џ~Vځ}Ժ0CJ ?륀B9 [7ҏ{4Qҷߦxˑ?I"h7룼nq+}ʿB;XJ=JtЮ4.蜡W?|^jxC?Nfih~=3w}/j^,s' j|O0'öQNɿMݴKwS;R|fw+(GtD^uSOVuҿ SoxW>;hҋ$'͓s-bx QBoB^j?ſg7&5ed==;(w!B+w58Wo ȡ-_u-k:Mv/hh.o3jG:7WOQڧλּ\?R(η!ϴ>ୋs6?B?{U~4~SїA~?D^0{NIQQO»?X ͗i~gGxJzm+3N'oì_ʅ>iEeOu?O]-AE)D~5SoC]Cԃmn*tN[#ZбOB9!~j:Op#O~9}vCғN\2oxڋ O3}zUܮ~=Ys 5϶9uܷ'ub ңDzzuGȑnOzJ+r Jnȟ(;&ޏ>_"~W?vWWq!G3A~~S<ȋw#J7Qw+yO{˿El/W{9nI/zkQ bƋ{գ u@;:"O;H un'tU{;t~I#XCW }^O7(6[!_)I=*n⑷ɿF/O=kO~m'Q|D/6#_7V`!>BqYz.OAzW?]+ ::7[+!Ǹ)b\z>|(f4e~ȅ C/uSi;i/.D0kkq k? P?I==/݁ /:g-s.:W{ yIϒc()=~8&ڇR+*NjV~Xq=rI`ӟ|ϓԿ 6çǧs SBr>z_>Eߐ\Ʀ%d7MKq 6 G?>'WiکεyKkťUnG)U*'WM`>j9~ԥvC5ӊ޻BYs7i?_"Xz]={*߁݈C^)?$OȝvSclF>/1~:?z6o/W{u"h'xL_?%P7LrLK !/ y?[яO=V~[Pj/so\_=__Crߋk:58~70_J{߶f >a?`cHо4OKѿuއa[_!751NhZчޣuzً腲qy6}[vevM9ۇ|d^(=,?_`6V_R;2GrequIڱO',#oKvKo\E'~6#?C>an{:Dz'2zIvY(nK+\^K?b'M; - oO;bYߡ^G%}IڋڝηK;#Rۥw=F>|m rRqgouXNӌ?d;zֽ;^,K#bQ|u9}۲[/ڧ}-cqk##]jZq+׺N/+BA3˫K 3A>[_vqW/KdOf^Du+r@,/Hӹ e]O;oޡÌ'ÔWH%ك ?xntiN/Pzck|ŏ?&WWOoWW|nWE c/S'x4*v+0Ƈ팯iGSW|T/Α_\vt?Q4 xBOkȉ_X$?,j:AV$-K|vnƃ,Gn!V@YHŇM{H}R{'OkL/{gվ[|d[?V!W2~,׃^J')~ ~'QN63nG_j~x^Nqp#Kџ|~7Яikxԛ֕\%{QoW"wΚt%k J?I~} IWzv<ˬA>#:/y6_~A*nzلkCni`?zyLr (| W@UKq }5%[2+iw+:F-ih_KУ2A$7H Rݎ:-#:/0rM?G{/nJfyk]c{]/nC]End_˟s6Vݴ z}1ocSev.=LE5iO_\E?U^[})\(ȾP<ҋ7`(^O&Ϻ7jZu=I 9r)^m;[yT~ys><YMhWҾÓ#' (j ޲*~v"WˢgKdыӴ~%R“gӂ\X+;W_ӟ'> wn"_v΍ø݃?z;zJ;}ԫ~_>L{#e{VKȷqg>XőT\"|o,܇;J뼯f=A]Ix/tx_?_GGCzIsnxٌi v~FL?W"/eSKOBQ|Aڵ.?1<9r# 䣝v4LO}Fq󶠗ȷʣ1=m%r(bxy9S~,Y"y|kAoĮU\Z7c\:U={ߢ?mE>h*ꡄ[/g7Ҿ2E;J;MlQvNH ]v~kT!%\)_= )GzjyHzCF"/:HQ/0^ދ9D?L1"=/{S_l%#}Ҫ/QśhDng\KoWx s CNJÿjaƧU菫hW[nHM`$}?F"8#E}b:gM#f}mO{w~}d|nCLkz~®>x唧_:zP+vo?CEQȹߕh:wCEH0&Gf.u?wGï'HW^wo?GZC_>r_}"vchE7|;B+9ȏM|Z\P=/ҏ(J;V}=9s$(+/ԧփ_%扊C/Fov9'^8݊7x˪Ƿ}Ge#21y_3sDOy}/α)gw?ΤFt:h;6 :`vߦ_i2z_~E(AxC{Nbr>O6w+={镯AηxM!AqBc%N?1@w߮biց!/WJy"֋z.zi)o+F JߔA~_o/w93v`ot+A o ~_ˣ2ȫ$!: O ϟ/xl@\;o9kIPpIw׻z؃_$}C~|@zu@ǯ_DA˿q.eshoA"73IOB-9$;K}r~u2i^syM#{dgz=W@+j+m2ai>i.~sũQ8;k_^}nypf?~m s +{EQNše+|v3OąGOR<L{Ԟn# ݔ^^Jw+hgnljk I2^(ЅGkޭ5]<I_K~Fz+tNgIf~AC=w`5ʗB\OmD(_3hϽ!ˎ骽iݍ9^?~߂#*Kq[i:)AQ?zOP2IVS߫۞ߵc7ogJ{ߴZv>ůgG׹-oo-X(X~?-G{/ZO:;s33'0>j=SUW ڨ_S(柆z\~"rFz&>-ȝ[B;oXߠ2:_;noYm4Qٹc?24HNK_ CAr~-|GoS=_/AYI}%}z[{Zt:窛~&^Z=I{R\6HKNj [~#oi~zf\ڏ;ͯoCvZGY.y8:Wj_p7Oqr5vh /'UJO_ 7H})7VhIͫ\;@q k_NP?E)F*SH~ȣ^ʝ޴Wv>'з }c=Gq1ťz6ͧ*B.B.ii']JZ+' +?Z/ENnѾ࿛MK9\c_}#ZRF"O9џ䷔?zѹ ۑ7я:؁]Kg9wW\enh?fMI_X´Pq/ҷW|jc\S|\aڧPf~@2<~QE=ԫƿ|_>őQ\%z ,~{OQ\Dwk,y63~+"?rei%2/.d~ͬ=m?bvU_GC<_wJ9ZW!}e&oᏠ'NЮ89Gv1EqtXa]ȷEؑ:qD]Jp:g%CYv2*{~;k #֌=ԏίyK,$OʾFˣ\y7{gὛzl'_ S'3Ҽ//SoԚiȍK/4#?'S\P\V4ϖ!G~uE{it ozxY-ʻ'}9F=9sZ=Cֳ@Oon8@oX,\w-~߬stnb7rOGRޥcj:7~-tԮ<=.<0~c>TG_7P.S O:Yً?=QT^b|*yoƾC{?t"Ϸ{$a/N{ZWE#z#~>G> e˧>wQ/E?dFɷ&Iw~z9 n2>cvi#7ym;xv`:Ošm5.;zN|l/:%K/淛 V!w"//+NB=KBQ=565Nk>x3sFMhvY}o?L&/\ݬކw#Ne2Yʧu슧/=grWoC_X_ AwEc]znw%ԗg>y9j'G0k߄ΩӹΛҴ is:72I~i_śCCEo Eܶ1׺ i[rȣN{7P#+ގ?y2"/W3.j?a3qMÛ=T5ؿC^#}77yFɏ5ui#YZO=)捐.sũ(a+.Fq1OuwHWyF>wb0iW̻+Γ]hK;u).K'6^xi$4IjB}xCC'U_ ~&؁F>VYݗ룜. >e~oW;c>(x!9>7_Lc[ZOn'] =#6W+O%u.4E!׆{_?K+^k9v~-"[@dCsSع}o~8D>~+_~$rmTi:H;oq-s~fO~D_^K~}nnV:<Ԇv2@Kvxz?xZhixV6sObO1^#r<LB!1^j @~ršSɋ>Z5Mz){?OяF}糓&-ns_h7aP ge߾oɟ gҼ?0 zFmrťR. L(̧ż!z ׼D]3[SIoG_ D?v3~w iwcfhx[*zx7z]'?AI gFTu~wѾOy*2yIqǓ۵f9׍2^ ސ?_8-O=޾ӽ/_7mu;I9wʤ\ȱzvieo~?Mu׮Ur+ַSmwVj=)Is@;|ytSq{yP;~]׏|ʾ?Z?'qy?MMgto;8nhj:m3NB~clZpzvKy uM.Yu5veꗉ_f~6<챻d7 =RwUz+ Ǟݍ峷gGWN_iox]=Q{X2Z⸻_v2ݹʻ\"L9?֝nw7Vd2/L] qwc_) Wui>ۺU,m*tףּte]a}gU]Wgk.z68.붮 'ZHSokbAi. G($f'lԷrMO%NMM%сPMCRWzk`=7n>*ܨ`TӐeFA4#D&q5 I_sllui΂䠦OqrzP<%΂9{pk U $ :0qIgXrГpSNt?-ב1O{G$#nG,_8" 8M5P ..;sY.`m`o #Sa -K 8(3pd7pD82ژpĉj RHc3p Hm4j.` QGLN5-;B#Tc& Dytd`c@>;bv#SDoh pdCcV D$*AXsY3n5}9l^Avĩb )Ho eGT!0)pDZ#C#pDk pd@ rd#.A(9G;|1@-;sh &vG&@ ք-is ^Gt9RMƑ i ME@ Žhˎ8sPP$pD4 ^Gss)w D&Oi0m N rmVkQ[Y Žk Dh27#Yc\GQ8h\0aQ6#v(#* ,'#NQGnG|;Zuĉa DA0eq# D %|(#:#QGzGa8rƁ(#ĉoG2VSVY3` eg @S@'(#k G;l̀5G,2QG:G bAqD829Ho0ȴ(#$gqq8r~e7@} $o=Vu8b7eG(TבQ@m@#FDcS86pD[6"fG& D2pd #CGژ(#:(# L%  82Yo  3pd7pd1k mqM40p85Hh8+qdA(#{s"dЩY ~ 1b n 0lq# B p$&G2682{ꀾyL;@\QGr8"@ Dq0`&0bq#I DY{` eq#3_dٲd 0G}l̵w#jXdslb qvD7pR^g 6aQG̱;@%; 4.pۀ; +Ef Hc30H`#} D 8i ",0Gʑi*A@#Q[ Dn $1pd(# (#k Dvdp1P vDt9D 4pdチ(@tG6Ne^g fCQ. 01H) Xs܍HY+@`+q8 Dq8(3tGJaieQG,2QGژ(#.nQG\  8p3`@`KG7a R^g @6f)Zo<r,90pR0yG|)s,3pRn NRQ9wp8q:G$(9rN9Z@Xh\0!'GO8(3pD3p"30'F぀G,;QG,2Gj#J#`@ gq#+u "sܟpd]JcCH3pd(#˧ j\!qCe yێ9]w 8e # A6#+ #17G<8f@]-"9ơ22phcV$,1pdF6jQuuE>"FS813"pD8 D1 D82:83pdt0pd#r1#0X6ƦbM6|NMp$N2])ܰ~< }3Ht$?]Z5^SZKt&9z]O1qpɗg451.`bIk')09*oB/\o~vӛNyM'~!?ggR$Uw]cw_&~efmcKVݍ}3.Uq["`yY@iX>{{vT|]֊N3gݍ,x%)eW._,ӝ%*RϔcnYqwcKf+T*jkw7pe]+곭;Q;ҖRHW:JW1wVuE}ɪgnp45wV9x+f&!&Pzq<Օ|c]!r}rbOғw7p0 ո>3?c_i`bsh}^1\]&?k.Kf$gEYcf=gΉ'!&Pz?1:"E2M+gs3%#.i*E]cFczWN]ig+MNmYӌE "^ߏ:#3JuR Ng, 9tA 4hԃ3r485''Ɔ.4erR_s-_8g 48W8&5g ]c;tA"=ta148c.gc3} N  4hTh 1tA͟24-tUBu+ ުAӮn^b KgZ_1`>ʜ[Xʖ:֢܅.HD`ƅ:vNP{ww]0 0y ;a `U,Oy^W+^(SL'gf™ʟ#)ҍ#{~p3:2XήT=cRf^1r \25}y m ͮ3DU{*̀q۸ܺ  0`aYAKr55: 0` L᚟ wfVtycNc  0` 0` DRk`:5MUy}5r 0`S Aa>Гp;PF 4$Ouב"8 0` 0` 0` 0` r/w@j"Z:е/ϱ\ 0`1RrRQu9>5ذrt 0` 0` 0``>Ěf#߂G7j_Q#pޚwۙ>Ga5TBMi0:k0.6<[_%wJ 1oW7NЇ9{4`<G,4g f 0` 0` h 798m 0` 0`rbwI5rFG#raJ&\ 088u$X%uIP0` 0P+pD)5%k 7P_r]JH~bMg=<Ԅ^s|V 0`)kItL 0` SQN3w;S|yF4)3yM%5ʬ) 0` uu)Lު7S"ה>h`5o 0`Tp??5P5}Ѐq&랟IJ#c 0`ƁXv3yL񗚊\S棫CM߀;en3K}iMC59F%wkFn]v/ԥ8%]q̮<ۨ}rCJNAr\ 0`I<3)WMq Bqͻ;-LGu5Nqrg!${=,v 0` 85AXg~#ec)Zuh#&aeZuq$wDJXA e~ߩK sԟNM_+\AJ#2`$ &<;&NnM߱1m``V캸&fLߩ) 0` 0` 0`36+Tץbyoj69qVkVzL)ȝ"UTXiUΊe#5rOArm̍5` "0YXSV1ʪ#׀ 0 ZJ3?3P9z|ǀ 0`Ne`UНIVgzMeϊrEGK,t _ ѕ"J2CaU#Fkcn_+k 0` 4+U#.A1F 0` 0` 4Y!1%PӣZ<.ߙZoZBsV<ɓy ̢kHoνRWOmJDX{7p:^9\F欆 &8Z85ys> yƗ dtՇ3Ooj:;8n8|3NB~cRH]KVu%~e_ 77={.Yu7BϸT]oճފ2gqwcQwWZ[+;qvg~쐗<ѭ _w~k+ԣ\ORÂ׵'^߾%EݑW'wzoj{D]=4|rɪįzwׂ+u~egz۷?}W;GwGme[m^ۺb{.{[^3Wm Wy֌nZm>M޳=]qAo˞v_m\z~S >MakyKnXJ'o}?\}:ϙu;xҕ^Gə;x?~7{oڏ}d}zm_/?v?׶H־k^vZo/%ǎ~-^[>qۮZwXtr_]?tk~Ջxڍu?8 m [onޚ7wܟyk\V]+oU[?}w~rwsOoѿ/~ӅޢW;EWo#ޢ+<ۻ녧~|'{wۻ74u?yu^p-g[/)o܇Y-;^Y-oGq/z s^i}dzs_wYկ5Y{0w|;oϿgzg.{;Wxg/{߽~v>G/-vƋ?]nkZgCwYuwWn{:;ϋ_|koWּ>/> _?>oyS#yX}Ο=ą_EWOa^WrϞ.[ٽ^Mw>/|s>heCX5]]'uw~__>x9}i珼M}E΃{+{:jAEYТ ^ ^G>Ɩv~:v|{{y/^޿kx~5ϯ<{x{xyyxx;y;y;x;x<(Gy>|<0χy>!|ey^y%x^yEy^yx^yyy[&cƙ~ kO\es4Ωk}y sո*rk0R?';pk8G[m HW?+5KK^IJJ_ܑ~wh=Ko< >*=0eq>#eɎ8{{N~/Xv^Wu}Ͳdo&va-@e^P9?̕1JzI#;#}'Op例)ܧ澛 gqev/ b f+Zvv`w~;~A~'!QW ,+?a;{yv޻nۛv};|No';Nw4?1K CS`Ox AHW{iS܏oGOo~ =OH.fe?ʞx(@]KIq^ɷڟ#7J&03 ;äI?~5n~%O5'K4JOԸ_5IHI+Ez_C7J)(]~qPx9Kj!wä356*ǽ4wJ"=W{J? 9{eeI~@}zt-Izx4ɤoI#LOtI?'ZvN(8(C]xىg4IϺ{WײSdw,>"}H=/HB+қ OzGO=yʇ4ޏ]'U)$+Y~%_Qfo ̓~V0E^O>Y Co%O߭]p%v5^O +x>^G_t>?'[zN0_5ygw| :߲(&Zt_8?5.m`^ߍJOo׻^•w.=߻>s\̕r}q|8s}*Wsr\7rwg湎rwp^+志rK9樂R{)罔^y/弗rK9P#NY 8*гo鎛.r7,ς÷<[UȜ3~#<@KbmţsN܏=^p?м_yX>q~Ckj:߿eT 0ν uhFř:5?3xOەZ0Sʯ^؟oOJu^ؕ8àavsPKsKR|S ];ɟΙ\y?1.siMtp8gZ}$>[Q quXxWd~2>ONJI8_E='{;.ZI."VrԦ^,g't{"*S1g}2l:pM>KM7^o̐=5j# ~Q)ַ4}}ro&0˰cFbio3d/man/0000755000176200001440000000000014046077017012033 5ustar liggesusersbio3d/man/atom2ele.Rd0000644000176200001440000000423014046073105014023 0ustar liggesusers\name{atom2ele} \alias{atom2ele} \alias{atom2ele.default} \alias{atom2ele.pdb} \title{ Atom Names/Types to Atomic Symbols Converter } \description{ Convert atom names/types into atomic symbols } \usage{ atom2ele(\dots) \method{atom2ele}{default}(x, elety.custom=NULL, rescue=TRUE, \dots) \method{atom2ele}{pdb}(pdb, inds=NULL, \dots) } \arguments{ \item{x}{a character vector containing atom names/types to be converted.} \item{elety.custom}{a customized data.frame containing atom names/types and corresponding atomic symbols.} \item{rescue}{logical, if TRUE the atomic symbols will be converted based on matching with \code{bio3d::elements$symb}. } \item{pdb}{an object of class \sQuote{pdb} for which \code{elety} will be converted.} \item{inds}{an object of class \sQuote{select} indicating a subset of the \code{pdb} object to be used (see \code{\link{atom.select}} and \code{\link{trim.pdb}}).} \item{\dots}{further arguments passed to or from other methods.} } \details{ The default method searchs for the atom names/types in the \code{\link{atom.index}} data set and returns their corresponding atomic symbols. If \code{elety.custom} is specified it is combined with \code{\link{atom.index}} (using \code{rbind}) before searching. Therefore, \code{elety.custom} must contains columns named \code{name} and \code{symb}. The S3 method for object of class \sQuote{pdb}, pass \code{pdb$atom[,"elety"]} to the default method. } \value{Return a character vector of atomic symbols} \author{Julien Ide, Lars Skjaerven} \seealso{ \code{\link{atom.index}}, \code{\link{elements}}, \code{\link{read.pdb}}, \code{\link{atom2mass}}, \code{\link{formula2mass}} } \examples{ atom.names <- c("CA", "O", "N", "OXT") atom2ele(atom.names) \donttest{ # PDB server connection required - testing excluded ## Get atomic symbols from a PDB object with a customized data set pdb <- read.pdb("3RE0",verbose=FALSE) lig <- trim(pdb, "ligand") ## maps PT1 to Pt, CL2 to Cl, C4A to C atom2ele(lig) ## map atom name to element manually myelety <- data.frame(name = "CL2", symb = "Cl") atom2ele(lig, elety.custom = myelety) } } \keyword{ utilities } bio3d/man/plot.cmap.Rd0000644000176200001440000001015014046073105014206 0ustar liggesusers\name{plot.cmap} \alias{plot.cmap} \title{ Plot Contact Matrix } \description{ Plot a contact matrix with optional secondary structure in the marginal regions. } \usage{ \method{plot}{cmap}(x, col=2, pch=16, main="Contact map", sub="", xlim=NULL, ylim=NULL, xlab = "Residue index", ylab = xlab, axes=TRUE, ann=par("ann"), sse=NULL, sse.type="classic", sse.min.length=5, bot=TRUE, left=TRUE, helix.col="gray20", sheet.col="gray80", sse.border=FALSE, add=FALSE, ...) } \arguments{ \item{x}{ a numeric matrix of residue contacts as obtained from function \code{cmap}. } \item{col}{ color code or name, see \code{par}. } \item{pch}{ plotting \sQuote{character}, i.e., symbol to use. This can either be a single character or an integer code for one of a set of graphics symbols. See \code{points}. } \item{main}{ a main title for the plot, see also \sQuote{title}. } \item{sub}{ a sub-title for the plot. } \item{xlim}{ the x limits (x1,x2) of the plot. Note that x1 > x2 is allowed and leads to a reversed axis. } \item{ylim}{ the y limits of the plot. } \item{xlab}{ a label for the x axis, defaults to a description of \sQuote{x}. } \item{ylab}{ a label for the y axis, defaults to a description of \sQuote{y}. } \item{axes}{ a logical value indicating whether both axes should be drawn on the plot. Use graphical parameter \sQuote{xaxt} or \sQuote{yaxt} to suppress just one of the axes. } \item{ann}{ a logical value indicating whether the default annotation (title and x and y axis labels) should appear on the plot. } \item{sse}{ secondary structure object as returned from \code{\link{dssp}}, \code{\link{stride}} or in certain cases \code{\link{read.pdb}}. } \item{sse.type}{ single element character vector that determines the type of secondary structure annotation drawn. The following values are possible, \sQuote{classic} and \sQuote{fancy}. See details and examples below. } \item{sse.min.length}{ a single numeric value giving the length below which secondary structure elements will not be drawn. This is useful for the exclusion of short helix and strand regions that can often crowd these forms of plots. } \item{left}{ logical, if TRUE rectangles for each sse are drawn towards the left of the plotting region. } \item{bot}{ logical, if TRUE rectangles for each sse are drawn towards the bottom of the plotting region. } \item{helix.col}{ The colors for rectangles representing alpha helices. } \item{sheet.col}{ The colors for rectangles representing beta strands. } \item{sse.border}{ The border color for all sse rectangles. } \item{add}{ logical, specifying if the contact map should be added to an already existing plot. Note that when \sQuote{TRUE} only points are plotted (no annotation). } \item{\dots}{ other graphical parameters. } } \details{ This function is useful for plotting a residue-residue contact data for a given protein structure along with a schematic representation of major secondary structure elements. Two forms of secondary structure annotation are available: so called \sQuote{classic} and \sQuote{fancy}. The former draws marginal rectangles and has been available within Bio3D from version 0.1. The later draws more \sQuote{fancy} (and distracting) 3D like helices and arrowed strands. } \value{ Called for its effect. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven, Barry Grant } \note{ Be sure to check the correspondence of your \sQuote{sse} object with the \sQuote{x} values being plotted as no internal checks are performed. } \seealso{ \code{\link{cmap}}, \code{\link{dm}}, \code{\link{plot.dmat}}, \code{\link{plot.default}}, \code{\link{plot.bio3d}}, \code{\link{dssp}}, \code{\link{stride}} } \examples{ ##- Read PDB file pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) ##- Calcualte contact map cm <- cmap(pdb) ##- Plot contact map plot.cmap(cm, sse=pdb) ##- Add to plot plot.cmap(t(cm), col=3, pch=17, add=TRUE) } \keyword{ hplot } bio3d/man/pdbseq.Rd0000644000176200001440000000256314046073105013600 0ustar liggesusers\name{pdbseq} \alias{pdbseq} \title{ Extract The Aminoacid Sequence From A PDB Object } \description{ Return a vector of the one-letter IUPAC or three-letter PDB style aminoacid codes from a given PDB object. } \usage{ pdbseq(pdb, inds = NULL, aa1 = TRUE) } \arguments{ \item{pdb}{a PDB structure object obtained from \code{\link{read.pdb}}. } \item{inds}{ a list object of ATOM and XYZ indices as obtained from \code{\link{atom.select}}. } \item{aa1}{ logical, if TRUE then the one-letter IUPAC sequence is returned. IF FALSE then the three-letter PDB style sequence is returned.} } \details{ See the examples below and the functions \code{\link{atom.select}} and \code{\link{aa321}} for further details. } \value{ A character vector of aminoacid codes. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. For a description of IUPAC one-letter codes see:\cr \url{http://www.insdc.org/documents/feature_table.html#7.4.3} For more information on PDB residue codes see:\cr \url{http://ligand-expo.rcsb.org/ld-search.html} } \author{ Barry Grant } \seealso{ \code{\link{read.pdb}}, \code{\link{atom.select}}, \code{\link{aa321}}, \code{\link{read.fasta}} } \examples{ \dontrun{ pdb <- read.pdb( "5p21" ) pdbseq(pdb) #pdbseq(pdb, inds=atom.select(pdb, resno=5:15, elety="CA"), aa1=FALSE) } } \keyword{ utilities } bio3d/man/aa.index.Rd0000644000176200001440000000404114046077017014010 0ustar liggesusers\name{aa.index} \alias{aa.index} \docType{data} \title{ AAindex: Amino Acid Index Database } \description{ A collection of published indices, or scales, of numerous physicochemical and biological properties of the 20 standard aminoacids (Release 9.1, August 2006). } \usage{data(aa.index)} \format{ A list of 544 named indeces each with the following components: \enumerate{ \item{H}{ character vector: Accession number. } \item{D}{ character vector: Data description. } \item{R}{ character vector: LITDB entry number. } \item{A}{ character vector: Author(s). } \item{T}{ character vector: Title of the article. } \item{J}{ character vector: Journal reference. } \item{C}{ named numeric vector: Correlation coefficients of similar indeces (with coefficients of 0.8/-0.8 or more/less). The correlation coefficient is calculated with zeros filled for missing values. } \item{I}{ named numeric vector: Amino acid index data. } } } \source{ \sQuote{AAIndex} was obtained from:\cr \url{https://www.genome.jp/aaindex/}\cr For a description of the \sQuote{AAindex} database see:\cr \url{https://www.genome.jp/aaindex/aaindex_help.html}. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. \sQuote{AAIndex} is the work of Kanehisa and co-workers:\cr Kawashima and Kanehisa (2000) \emph{Nucleic Acids Res.} \bold{28}, 374;\cr Tomii and Kanehisa (1996) \emph{Protein Eng.} \bold{9}, 27--36;\cr Nakai, Kidera and Kanehisa (1988) \emph{Protein Eng.} \bold{2}, 93--100. } \examples{ ## Load AAindex data data(aa.index) ## Find all indeces described as "volume" ind <- which(sapply(aa.index, function(x) length(grep("volume", x$D, ignore.case=TRUE)) != 0)) ## find all indeces with author "Kyte" ind <- which(sapply(aa.index, function(x) length(grep("Kyte", x$A)) != 0)) ## examine the index aa.index[[ind]]$I ## find indeces which correlate with it all.ind <- names(which(Mod(aa.index[[ind]]$C) >= 0.88)) ## examine them all sapply(all.ind, function (x) aa.index[[x]]$I) } \keyword{datasets} bio3d/man/overlap.Rd0000644000176200001440000000554014046073105013770 0ustar liggesusers\name{overlap} \alias{overlap} \title{ Overlap analysis } \description{ Calculate the squared overlap between sets of vectors. } \usage{ overlap(modes, dv, nmodes=20) } \arguments{ \item{modes}{ an object of class \code{"pca"} or \code{"nma"} as obtained from function \code{pca.xyz} or \code{nma}. Alternatively a 3NxM matrix of eigenvectors can be provided. } \item{dv}{ a displacement vector of length 3N. } \item{nmodes}{ the number of modes in which the calculation should be based. } } \details{ Squared overlap (or dot product) is used to measure the similiarity between a displacement vector (e.g. a difference vector between two conformational states) and mode vectors obtained from principal component or normal modes analysis. By definition the cumulative sum of the overlap values equals to one. Structure \code{modes$U} (or alternatively, the 3NxM matrix of eigenvectors) should be of same length (3N) as \code{dv}. } \value{ Returns a list with the following components: \item{overlap}{ a numeric vector of the squared dot products (overlap values) between the (normalized) vector (\code{dv}) and each mode in \code{mode}. } \item{overlap.cum}{ a numeric vector of the cumulative squared overlap values. } } \references{ Skjaerven, L. et al. (2011) \emph{Proteins} \bold{79}, 232--243. Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{rmsip}}, \code{\link{pca.xyz}}, \code{\link{nma}}, \code{\link{difference.vector}} } \examples{ attach(kinesin) # Ignore gap containing positions ##gaps.res <- gap.inspect(pdbs$ali) gaps.pos <- gap.inspect(pdbs$xyz) #-- Do PCA pc.xray <- pca.xyz(pdbs$xyz[, gaps.pos$f.inds]) # Define a difference vector between two structural states diff.inds <- c(grep("d1v8ka", pdbs$id), grep("d1goja", pdbs$id)) dv <- difference.vector( pdbs$xyz[diff.inds,], gaps.pos$f.inds ) # Calculate the squared overlap between the PCs and the difference vector o <- overlap(pc.xray, dv) o <- overlap(pc.xray$U, dv) # Plot results plot(o$overlap, type='h', ylim=c(0,1)) points(o$overlap) lines(o$overlap.cum, type='b', col='red') detach(kinesin) \dontrun{ ## Calculate overlap from NMA pdb.a <- read.pdb("1cmk") pdb.b <- read.pdb("3dnd") ## Fetch CA coordinates sele.a <- atom.select(pdb.a, chain='E', resno=c(15:350), elety='CA') sele.b <- atom.select(pdb.b, chain='A', resno=c(1:350), elety='CA') xyz <- rbind(pdb.a$xyz[sele.a$xyz], pdb.b$xyz[sele.b$xyz]) ## Superimpose xyz[2,] <- fit.xyz(xyz[1,], xyz[2,], 1:ncol(xyz)) ## The difference between the two conformations dv <- difference.vector( xyz ) ## Calculate normal modes modes <- nma(pdb.a, inds=sele.a) # Calculate the squared overlap between the normal modes # and the difference vector o <- overlap(modes, dv) } } \keyword{ utilities } bio3d/man/read.dcd.Rd0000644000176200001440000000632214046073105013763 0ustar liggesusers\name{read.dcd} \alias{read.dcd} \title{ Read CHARMM/X-PLOR/NAMD Binary DCD files } \description{ Read coordinate data from a binary DCD trajectory file. } \usage{ read.dcd(trjfile, big=FALSE, verbose = TRUE, cell = FALSE) } \arguments{ \item{trjfile}{ name of trajectory file to read. A vector if treat a batch of files } \item{big}{ logical, if TRUE attempt to read large files into a big.matrix object } \item{verbose}{ logical, if TRUE print details of the reading process. } \item{cell}{logical, if TRUE return cell information only. Otherwise, return coordinates.} } \details{ Reads a CHARMM or X-PLOR/NAMD binary trajectory file with either big- or little-endian storage formats. Reading is accomplished with two different sub-functions: \code{dcd.header}, which reads header info, and \code{dcd.frame}, which takes header information and reads atoms frame by frame producing an nframes/natom*3 matrix of cartesian coordinates or an nframes/6 matrix of cell parameters. } \value{ A numeric matrix of xyz coordinates with a frame/structure per row and a Cartesian coordinate per column or a numeric matrix of cell information with a frame/structure per row and lengths and angles per column. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \note{ See CHARMM documentation for DCD format description. If you experience problems reading your trajectory file with read.dcd() consider first reading your file into VMD and from there exporting a new DCD trajectory file with the 'save coordinates' option. This new file should be easily read with read.dcd(). Error messages beginning 'cannot allocate vector of size' indicate a failure to obtain memory, either because the size exceeded the address-space limit for a process or, more likely, because the system was unable to provide the memory. Note that on a 32-bit OS there may well be enough free memory available, but not a large enough contiguous block of address space into which to map it. In such cases try setting the input option 'big' to TRUE. This is an experimental option that results in a 'big.matrix' object. } \seealso{ \code{\link{read.pdb}}, \code{\link{write.pdb}}, \code{\link{atom.select}} } \examples{ \donttest{ # Redundant testing excluded ##-- Read cell parameters from example trajectory file trtfile <- system.file("examples/hivp.dcd", package="bio3d") trj <- read.dcd(trtfile, cell = TRUE) ##-- Read coordinates from example trajectory file trj <- read.dcd(trtfile) ## Read the starting PDB file to determine atom correspondence pdbfile <- system.file("examples/hivp.pdb", package="bio3d") pdb <- read.pdb(pdbfile) ## select residues 24 to 27 and 85 to 90 in both chains inds <- atom.select(pdb, resno=c(24:27,85:90), elety='CA') ## lsq fit of trj on pdb xyz <- fit.xyz(pdb$xyz, trj, fixed.inds=inds$xyz, mobile.inds=inds$xyz) ##-- RMSD of trj frames from PDB r1 <- rmsd(a=pdb, b=xyz) } \dontrun{ # Pairwise RMSD of trj frames for positions 47 to 54 flap.inds <- atom.select(pdb, resno=c(47:54), elety='CA') p <- rmsd(xyz[,flap.inds$xyz]) # plot highlighting flap opening? plot.dmat(p, color.palette = mono.colors) } } \keyword{ IO } bio3d/man/write.pdb.Rd0000644000176200001440000000721414046073105014216 0ustar liggesusers\name{write.pdb} \alias{write.pdb} \title{ Write PDB Format Coordinate File } \description{ Write a Protein Data Bank (PDB) file for a given \sQuote{xyz} Cartesian coordinate vector or matrix. } \usage{ write.pdb(pdb = NULL, file = "R.pdb", xyz = pdb$xyz, type = NULL, resno = NULL, resid = NULL, eleno = NULL, elety = NULL, chain = NULL, insert = NULL, alt = NULL, o = NULL, b = NULL, segid = NULL, elesy = NULL, charge = NULL, append = FALSE, verbose = FALSE, chainter = FALSE, end = TRUE, sse = FALSE, print.segid = FALSE) } \arguments{ \item{pdb}{ a PDB structure object obtained from \code{\link{read.pdb}}. } \item{file}{ the output file name. } \item{xyz}{ Cartesian coordinates as a vector or 3xN matrix. } \item{type}{ vector of record types, i.e. "ATOM" or "HETATM", with length equal to length(xyz)/3. } \item{resno}{ vector of residue numbers of length equal to length(xyz)/3. } \item{resid}{ vector of residue types/ids of length equal to length(xyz)/3. } \item{eleno}{ vector of element/atom numbers of length equal to length(xyz)/3. } \item{elety}{ vector of element/atom types of length equal to length(xyz)/3. } \item{chain}{ vector of chain identifiers with length equal to length(xyz)/3. } \item{insert}{ vector of insertion code with length equal to length(xyz)/3. } \item{alt}{ vector of alternate record with length equal to length(xyz)/3. } \item{o}{ vector of occupancy values of length equal to length(xyz)/3. } \item{b}{ vector of B-factors of length equal to length(xyz)/3. } \item{segid}{ vector of segment id of length equal to length(xyz)/3. } \item{elesy}{ vector of element symbol of length equal to length(xyz)/3. } \item{charge}{ vector of atomic charge of length equal to length(xyz)/3. } \item{append}{ logical, if TRUE output is appended to the bottom of an existing file (used primarly for writing multi-model files). } \item{verbose}{ logical, if TRUE progress details are printed. } \item{chainter}{ logical, if TRUE a TER line is inserted at termination of a chain. } \item{end}{ logical, if TRUE END line is written. } \item{sse}{ logical, if TRUE secondary structure annotations are written. } \item{print.segid}{ logical, if FALSE segid will not be written. } } \details{ Only the \code{xyz} argument is strictly required. Other arguments assume a default poly-ALA C-alpha structure with a blank chain id, occupancy values of 1.00 and B-factors equal to 0.00. If the input argument \code{xyz} is a matrix then each row is assumed to be a different structure/frame to be written to a \dQuote{multimodel} PDB file, with frames separated by \dQuote{END} records. } \value{ Called for its effect. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. For a description of PDB format (version3.3) see:\cr \url{http://www.wwpdb.org/documentation/format33/v3.3.html}. } \author{ Barry Grant with contributions from Joao Martins. } \note{ Check that: (1) \code{chain} is one character long e.g. \dQuote{A}, and (2) \code{resno} and \code{eleno} do not exceed \dQuote{9999}. } \seealso{ \code{\link{read.pdb}}, \code{\link{read.dcd}}, \code{\link{read.fasta.pdb}}, \code{\link{read.fasta}} } \examples{ \donttest{ # PDB server connection required - testing excluded # Read a PDB file pdb <- read.pdb( "1bg2" ) # Renumber residues nums <- as.numeric(pdb$atom[,"resno"]) nums <- nums - (nums[1] - 1) # Write out renumbered PDB file outfile = file.path(tempdir(), "eg.pdb") write.pdb(pdb=pdb, resno = nums, file = outfile) invisible( cat("\nSee the output file:", outfile, sep = "\n") ) } } \keyword{ IO } bio3d/man/pdb.annotate.Rd0000644000176200001440000000501214046073105014667 0ustar liggesusers\name{pdb.annotate} \alias{pdb.annotate} \alias{pdb.pfam} \title{ Get Customizable Annotations From PDB Or PFAM Databases} \description{ Get customizable annotations for query results from PDB or PFAM. } \usage{ pdb.annotate(ids, anno.terms = NULL, unique = FALSE, verbose = FALSE, extra.terms = NULL) pdb.pfam(ids, best.only = TRUE, compact = TRUE) } \arguments{ \item{ids}{ A charater vector of one or more 4-letter PDB codes/identifiers of the files for query, or a \sQuote{blast} object containing \sQuote{pdb.id}. } \item{anno.terms}{ Terms can be used for query. The "anno.terms" can be "structureId", "chainId", "macromoleculeType", "chainLength", "experimentalTechnique", "resolution", "scopDomain", "pfam", "ligandId", "ligandName", "source", "structureTitle", "citation", "rObserved", "rFree", "rWork", and "spaceGroup". If anno.terms=NULL, all information would be returned. } \item{unique}{ logical, if TRUE only unique PDB entries are returned. Alternatively data for each chain ID is provided. } \item{verbose}{ logical, if TRUE more details are printed. } \item{extra.terms}{ Additional annotation terms to retrieve from PDB. Currently not supported. } \item{best.only}{ logical, if TRUE only the lowest eValue match for a given input id will be reported. Otherwise all significant matches will be returned. } \item{compact}{ logical, if TRUE only a subset of annotation terms are returned. Otherwise full match details are reported (see examples).} } \details{ Given a list of PDB IDs (and query terms for the pdb.annotate function), these functions will download annotation information from the RCSB PDB and PFAM databases. } \value{ Returns a data frame of query results with a row for each PDB record, and annotation terms column-wise. } \author{ Hongyang Li, Barry Grant, Lars Skjaerven, Xin-Qiu Yao} \examples{ \donttest{ # PDB server connection required - testing excluded # Fetch all annotation terms ids <- c("6Q21_B", "1NVW", "1P2U_A") anno <- pdb.annotate(ids) # Access terms, e.g. ligand names: anno$ligandName ## only unique PDB IDs anno <- pdb.annotate(ids, unique=TRUE) # Fetch only specific terms pdb.annotate(ids, anno.terms = c("pfam", "ligandId", "citation")) } \dontrun{ # PFAM server connection required - testing excluded # Find PFAM annotations of PDB entries pdb.pfam(c("6Q21_A", "1NVW", "1P2U_A")) # More details and a not fond entry warning pdb.pfam(c("1P2U_A", "6Q21_B"), compact=FALSE) } } \keyword{ utilities } bio3d/man/pdbsplit.Rd0000644000176200001440000000575614046073105014152 0ustar liggesusers\name{pdbsplit} \alias{pdbsplit} \title{ Split a PDB File Into Separate Files, One For Each Chain. } \description{ Split a Protein Data Bank (PDB) coordinate file into new separate files with one file for each chain. } \usage{ pdbsplit(pdb.files, ids = NULL, path = "split_chain", overwrite=TRUE, verbose = FALSE, mk4=FALSE, ncore = 1, progress = NULL, \dots) } \arguments{ \item{pdb.files}{ a character vector of PDB file names. } \item{ids}{ a character vector of PDB and chain identifiers (of the form: \sQuote{pdbId_chainId}, e.g. \sQuote{1bg2_A}). Used for filtering chain IDs for output (in the above example only chain A would be produced). } \item{path}{ output path for chain-split files. } \item{overwrite}{ logical, if FALSE the PDB structures will not be read and written if split files already exist. } \item{verbose}{ logical, if TRUE details of the PDB header and chain selections are printed. } \item{mk4}{ logical, if TRUE output filenames will use only the first four characters of the input filename (see \code{basename.pdb} for details). } \item{ncore}{ number of CPU cores used for the calculation. \code{ncore>1} requires package \sQuote{parallel} be installed. } \item{progress}{ progress bar for use with shiny web app. } \item{...}{ additional arguments to \code{read.pdb}. Useful e.g. for parsing multi model PDB files, including ALT records etc. in the output files. } } \details{ This function will produce single chain PDB files from multi-chain input files. By default all separate filenames are returned. To return only a subset of select chains the optional input \sQuote{ids} can be provided to filter the output (e.g. to fetch only chain C, of a PDB object with additional chains A+B ignored). See examples section for further details. Note that multi model atom records will only split into individual PDB files if \code{multi=TRUE}, else they are omitted. See examples. } \value{ Returns a character vector of chain-split file names. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. For a description of PDB format (version3.3) see:\cr \url{http://www.wwpdb.org/documentation/format33/v3.3.html}. } \author{ Barry Grant } \seealso{ \code{\link{read.pdb}}, \code{\link{atom.select}}, \code{\link{write.pdb}}, \code{\link{get.pdb}}. } \examples{ \dontrun{ ## Save separate PDB files for each chain of a local or on-line file pdbsplit( get.pdb("2KIN", URLonly=TRUE) ) ## Split several PDBs by chain ID and multi-model records raw.files <- get.pdb( c("1YX5", "3NOB") , URLonly=TRUE) chain.files <- pdbsplit(raw.files, path=tempdir(), multi=TRUE) basename(chain.files) ## Output only desired pdbID_chainID combinations ## for the last entry (1f9j), fetch all chains ids <- c("1YX5_A", "3NOB_B", "1F9J") raw.files <- get.pdb( ids , URLonly=TRUE) chain.files <- pdbsplit(raw.files, ids, path=tempdir()) basename(chain.files) } } \keyword{ utilities } bio3d/man/nma.pdb.Rd0000644000176200001440000001661714046073105013646 0ustar liggesusers\name{nma.pdb} \alias{nma.pdb} \alias{build.hessian} \alias{print.nma} \title{ Normal Mode Analysis } \description{ Perform elastic network model (ENM) C-alpha normal modes calculation of a protein structure. } \usage{ \method{nma}{pdb}(pdb, inds = NULL, ff = 'calpha', pfc.fun = NULL, mass = TRUE, temp = 300.0, keep = NULL, hessian = NULL, outmodes = NULL, \dots ) build.hessian(xyz, pfc.fun, fc.weights = NULL, pdb = NULL, \dots) \method{print}{nma}(x, nmodes=6, \dots) } \arguments{ \item{pdb}{ an object of class \code{pdb} as obtained from function \code{\link{read.pdb}}. } \item{inds}{ atom and xyz coordinate indices obtained from \code{\link{atom.select}} that selects the elements of \code{pdb} upon which the calculation should be based. If not provided the function will attempt to select the calpha atoms automatically (based on function \code{\link{atom.select}}). } \item{ff}{ character string specifying the force field to use: \sQuote{calpha}, \sQuote{anm}, \sQuote{pfanm}, \sQuote{reach}, or \sQuote{sdenm}. } \item{pfc.fun}{ customized pair force constant (\sQuote{pfc}) function. The provided function should take a vector of distances as an argument to return a vector of force constants. If provided, 'pfc.fun' will override argument \code{ff}. See examples below. } \item{mass}{ logical, if TRUE the Hessian will be mass-weighted. } \item{temp}{ numerical, temperature for which the amplitudes for scaling the atomic displacement vectors are calculated. Set \sQuote{temp=NULL} to avoid scaling. } \item{keep}{ numerical, final number of modes to be stored. Note that all subsequent analyses are limited to this subset of modes. This option is useful for very large structures and cases where memory may be limiting. } \item{hessian}{ hessian matrix as obtained from \code{\link{build.hessian}}. For internal purposes and generally not intended for public use. } \item{outmodes}{ atom indices as obtained from \code{\link{atom.select}}) specifying the atoms to include in the resulting mode object. } \item{xyz}{ a numeric vector of Cartesian coordinates. } \item{fc.weights}{ a numeric matrix of size NxN (where N is the number of calpha atoms) containg scaling factors for the pariwise force constants. See examples below. } \item{x}{ an \code{nma} object obtained from \code{\link{nma.pdb}}. } \item{nmodes}{ numeric, number of modes to be printed. } \item{...}{ additional arguments to \code{\link{build.hessian}}, \code{\link{aa2mass}}, \code{pfc.fun}, and \code{\link{print}}. One useful option here for dealing with unconventional residues is \sQuote{mass.custom}, see the \code{\link{aa2mass}} function for details. } } \details{ This function calculates the normal modes of a C-alpha model of a protein structure. A number of force fields are implemented all of whhich employ the elastic network model (ENM). The \sQuote{calpha} force field - originally developed by Konrad Hinsen - is the recommended one for most applications. It employs a spring force constant differentiating between nearest-neighbour pairs along the backbone and all other pairs. The force constant function was parameterized by fitting to a local minimum of a crambin model using the AMBER94 force field. See \code{\link{load.enmff}} for details of the different force fields. By default \code{\link{nma.pdb}} will diagonalize the mass-weighted Hessian matrix. The resulting mode vectors are moreover scaled by the thermal fluctuation amplitudes. The implementation under default arguments reproduces the calculation of normal modes (VibrationalModes) in the Molecular Modeling Toolkit (MMTK) package. To reproduce ANM modes set \code{ff='anm'}, \code{mass=FALSE}, and \code{temp=NULL}. } \value{ Returns an object of class \sQuote{nma} with the following components: \item{modes}{ numeric matrix with columns containing the normal mode vectors. Mode vectors are converted to unweighted Cartesian coordinates when \code{mass=TRUE}. Note that the 6 first trivial eigenvectos appear in columns one to six. } \item{frequencies}{ numeric vector containing the vibrational frequencies corresponding to each mode (for \code{mass=TRUE}). } \item{force.constants}{ numeric vector containing the force constants corresponding to each mode (for \code{mass=FALSE)}). } \item{fluctuations}{ numeric vector of atomic fluctuations. } \item{U}{ numeric matrix with columns containing the raw eigenvectors. Equals to the \code{modes} component when \code{mass=FALSE} and \code{temp=NULL}. } \item{L}{ numeric vector containing the raw eigenvalues. } \item{xyz}{ numeric matrix of class \code{xyz} containing the Cartesian coordinates in which the calculation was performed. } \item{mass}{ numeric vector containing the residue masses used for the mass-weighting. } \item{temp}{ numerical, temperature for which the amplitudes for scaling the atomic displacement vectors are calculated. } \item{triv.modes}{ number of trivial modes. } \item{natoms}{ number of C-alpha atoms. } \item{call}{ the matched call. } } \note{ The current version provides an efficent implementation of NMA with execution time comparable to similar software (when the entire Hessian is diagonalized). The main (speed related) bottleneck is currently the diagonalization of the Hessian matrix which is performed with the core R function \code{\link{eigen}}. For computing a few (5-20) approximate modes the user can consult package \sQuote{irlba}. NMA is memory extensive and users should be cautions when running larger proteins (>3000 residues). Use \sQuote{keep} to reduce the amount of memory needed to store the final \sQuote{nma} object (the full 3Nx3N Hessian matrix still needs to be allocated). We thank Edvin Fuglebakk for valuable discussions on the implementation as well as for contributing with testing. } \references{ Skjaerven, L. et al. (2014) \emph{BMC Bioinformatics} \bold{15}, 399. Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. Hinsen, K. et al. (2000) \emph{Chemical Physics} \bold{261}, 25--37. } \author{ Lars Skjaerven } \seealso{ \code{\link{fluct.nma}}, \code{\link{mktrj.nma}}, \code{\link{dccm.nma}}, \code{\link{overlap}}, \code{\link{rmsip}}, \code{\link{load.enmff}}. } \examples{ ## Fetch stucture pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) ## Calculate normal modes modes <- nma(pdb) ## Print modes print(modes) ## Plot modes plot(modes) ## Visualize modes #m7 <- mktrj.nma(modes, mode=7, file="mode_7.pdb") \dontrun{ ## Use Anisotropic Network Model modes <- nma(pdb, ff="anm", mass=FALSE, temp=NULL, cutoff=15) ## Use SSE information and SS-bonds sse <- dssp(pdb, resno=FALSE, full=TRUE) ss.bonds <- matrix(c(76,94, 64,80, 30,115, 6,127), ncol=2, byrow=TRUE) ## User defined energy function ## Note: Must take a vector of distances "my.ff" <- function(r) { ifelse( r>15, 0, 1 ) } ## Modes with a user defined energy function modes <- nma(pdb, pfc.fun=my.ff) ## A more manual approach sele <- atom.select(pdb, chain='A', elety='CA') xyz <- pdb$xyz[sele$xyz] hessian <- build.hessian(xyz, my.ff) modes <- eigen(hessian) ## Dealing with unconventional residues pdb <- read.pdb("1xj0") ## nma(pdb) #modes <- nma(pdb, mass.custom=list(CSX=121.166)) } } \keyword{ analysis } bio3d/man/filter.rmsd.Rd0000644000176200001440000000425414046073105014552 0ustar liggesusers\name{filter.rmsd} \alias{filter.rmsd} \title{ RMSD Filter } \description{ Identify and filter subsets of conformations at a given RMSD cutoff. } \usage{ filter.rmsd(xyz = NULL, rmsd.mat = NULL, cutoff = 0.5, fit = TRUE, verbose = TRUE, inds = NULL, method = "complete", \dots) } \arguments{ \item{xyz}{ a numeric matrix or list object containing multiple coordinates for pairwise comparison, such as that obtained from \code{\link{read.fasta.pdb}}. Not used if \code{rmsd.mat} is given. } \item{rmsd.mat}{ an optional matrix of RMSD values obtained from \code{\link{rmsd}}. } \item{cutoff}{ a numeric rmsd cutoff value. } \item{fit}{ logical, if TRUE coordinate superposition is performed prior to RMSD calculation. } \item{verbose}{ logical, if TRUE progress details are printed. } \item{inds}{ a vector of indices that selects the elements of \code{xyz} upon which the calculation should be based. By default, all the non-gap sites in \code{xyz}. } \item{method}{ the agglomeration method to be used. See function \code{\link{hclust}} for more information. } \item{\dots}{ additional arguments passed to and from functions. } } \details{ This function performs hierarchical cluster analysis of a given matrix of RMSD values \sQuote{rmsd.mat}, or an RMSD matrix calculated from a given coordinate matrix \sQuote{xyz}, to identify conformers that fall below a given RMSD cutoff value \sQuote{cutoff}. } \value{ Returns a list object with components: \item{ind}{indices of the conformers (rows) below the cutoff value.} \item{tree}{an object of class \code{"hclust"}, which describes the tree produced by the clustering process. } \item{rmsd.mat}{a numeric matrix with all pairwise RMSD values.} } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \seealso{ \code{\link{rmsd}}, \code{\link{read.pdb}}, \code{\link{read.fasta.pdb}}, \code{\link{read.dcd}} } \examples{ \dontrun{ attach(kinesin) k <- filter.rmsd(xyz=pdbs,cutoff=0.5) pdbs$id[k$ind] hclustplot(k$tree, h=0.5, ylab="RMSD") abline(h=0.5, col="gray") detach(kinesin) } } \keyword{ utilities } bio3d/man/aanma.pdbs.Rd0000644000176200001440000001212314046073105014317 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/aanma.pdbs.R \name{aanma.pdbs} \alias{aanma.pdbs} \title{Ensemble Normal Mode Analysis with All-Atom ENM} \usage{ \method{aanma}{pdbs}(pdbs, fit = TRUE, full = FALSE, subspace = NULL, rm.gaps = TRUE, ligand = FALSE, outpath = NULL, gc.first = TRUE, ncore = NULL, ...) } \arguments{ \item{pdbs}{an \sQuote{pdbs} object as obtained from \code{\link{read.all}}.} \item{fit}{logical, if TRUE C-alpha coordinate based superposition is performed prior to normal mode calculations.} \item{full}{logical, if TRUE return the complete, full structure, \sQuote{nma} objects.} \item{subspace}{number of eigenvectors to store for further analysis.} \item{rm.gaps}{logical, if TRUE obtain the hessian matrices for only atoms in the aligned positions (non-gap positions in all aligned structures). Thus, gap positions are removed from output.} \item{ligand}{logical, if TRUE ligand molecules are also included in the calculation.} \item{outpath}{character string specifing the output directory to which the PDB structures should be written.} \item{gc.first}{logical, if TRUE will call gc() first before mode calculation for each structure. This is to avoid memory overload when \code{ncore > 1}.} \item{ncore}{number of CPU cores used to do the calculation.} \item{...}{additional arguments to \code{\link{aanma}}.} } \value{ Returns a list of \sQuote{nma} objects (\code{outmodes} is provided and is not \sQuote{calpha}) or an \sQuote{enma} object with the following components: \item{fluctuations }{ a numeric matrix containing aligned atomic fluctuations with one row per input structure. } \item{rmsip }{ a numeric matrix of pair wise RMSIP values (only the ten lowest frequency modes are included in the calculation). } \item{U.subspace }{ a three-dimensional array with aligned eigenvectors (corresponding to the subspace defined by the first N non-trivial eigenvectors (\sQuote{U}) of the \sQuote{nma} object). } \item{L }{ numeric matrix containing the raw eigenvalues with one row per input structure. } \item{full.nma }{ a list with a \code{nma} object for each input structure (available only when \code{full=TRUE}). } } \description{ Perform normal mode analysis (NMA) on an ensemble of aligned protein structures using all-atom elastic network model (aaENM). } \details{ This function builds elastic network model (ENM) using all heavy atoms and performs subsequent normal mode analysis (NMA) on a set of aligned protein structures obtained with function \code{\link{read.all}}. The main purpose is to automate ensemble normal mode analysis using all-atom ENMs. By default, the effective Hessian for all C-alpha atoms is calculated based on the Hessian built from all heavy atoms (including ligand atoms if \code{ligand=TRUE}). Returned values include aligned mode vectors and (when \code{full=TRUE}) a list containing the full \sQuote{nma} objects one per each structure. When \sQuote{rm.gaps=TRUE} the unaligned atoms are ommited from output. With default arguments \sQuote{rmsip} provides RMSIP values for all pairwise structures. When \code{outmodes} is provided and is not \sQuote{calpha} (e.g. \sQuote{noh}. See \code{\link{aanma}} for more details), the function simply returns a list of \sQuote{nma} objects, one per each structure, and no aligned mode vector is returned. In this case, the arguments \code{full}, \code{subspace}, and \code{rm.gaps} are ignored. This is equivalent to a wrapper function repeatedly calling \code{\link{aanma}}. } \examples{ \donttest{ # Needs MUSCLE installed - testing excluded if(check.utility("muscle")) { ## Fetch PDB files and split to chain A only PDB files ids <- c("1a70_A", "1czp_A", "1frd_A", "1fxi_A", "1iue_A", "1pfd_A") files <- get.pdb(ids, split = TRUE, path = tempdir()) ## Sequence Alignement aln <- pdbaln(files, outfile = tempfile()) ## Read all pdb coordinates pdbs <- read.all(aln) ## Normal mode analysis on aligned data modes <- aanma(pdbs, rm.gaps=TRUE) ## Plot fluctuation data plot(modes, pdbs=pdbs) ## Cluster on Fluctuation similariy sip <- sip(modes) hc <- hclust(dist(sip)) col <- cutree(hc, k=3) ## Plot fluctuation data plot(modes, pdbs=pdbs, col=col) ## RMSIP is pre-calculated heatmap(1-modes$rmsip) ## Bhattacharyya coefficient bc <- bhattacharyya(modes) heatmap(1-bc) } } } \author{ Xin-Qiu Yao & Lars Skjaerven } \seealso{ For normal mode analysis on single structure PDB: \code{\link{aanma}} For conventional C-alpha based normal mode analysis: \code{\link{nma}}, \code{\link{nma.pdbs}}. For the analysis of the resulting \sQuote{eNMA} object: \code{\link{mktrj.enma}}, \code{\link{dccm.enma}}, \code{\link{plot.enma}}, \code{\link{cov.enma}}. Similarity measures: \code{\link{sip}}, \code{\link{covsoverlap}}, \code{\link{bhattacharyya}}, \code{\link{rmsip}}. Related functionality: \code{\link{read.all}}. } bio3d/man/seqaln.pair.Rd0000644000176200001440000000412414046077017014540 0ustar liggesusers\name{seqaln.pair} \alias{seqaln.pair} \title{ Sequence Alignment of Identical Protein Sequences } \description{ Create multiple alignments of amino acid sequences according to the method of Edgar. } \usage{ seqaln.pair(aln, \dots) } \arguments{ \item{aln}{ a sequence character matrix, as obtained from \code{\link{seqbind}}, or an alignment list object as obtained from \code{\link{read.fasta}}. } \item{\dots}{ additional arguments for the function \code{\link{seqaln}}. } } \details{ This function is intended for the alignment of identical sequences only. For standard alignment see the related function \code{\link{seqaln}}. This function is useful for determining the equivalences between sequences and structures. For example in aligning a PDB sequence to an existing multiple sequence alignment, where one would first mask the alignment sequences and then run the alignment to determine equivalences. } \value{ A list with two components: \item{ali}{ an alignment character matrix with a row per sequence and a column per equivalent aminoacid/nucleotide. } \item{ids}{ sequence names as identifers.} } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. \sQuote{MUSCLE} is the work of Edgar: Edgar (2004) \emph{Nuc. Acid. Res.} \bold{32}, 1792--1797. Full details of the \sQuote{MUSCLE} algorithm, along with download and installation instructions can be obtained from:\cr \url{http://www.drive5.com/muscle/}. } \author{ Barry Grant } \note{ A system call is made to the \sQuote{MUSCLE} program, which must be installed on your system and in the search path for executables. } \seealso{ \code{\link{seqaln}}, \code{\link{read.fasta}}, \code{\link{read.fasta.pdb}}, \code{\link{seqbind}} } \examples{ ## NOTE: FOLLOWING EXAMPLE NEEDS MUSCLE INSTALLED if(check.utility("muscle")) { ##- Aligning a PDB sequence to an existing sequence alignment ##- Simple example aln <- seqbind(c("X","C","X","X","A","G","K"), c("C","-","A","X","G","X","X","K")) seqaln.pair(aln, outfile = tempfile()) } } \keyword{ utilities } bio3d/man/example.data.Rd0000644000176200001440000000530514046073105014662 0ustar liggesusers\name{example.data} \docType{data} \alias{example.data} \alias{kinesin} \alias{transducin} \alias{pdbs} \alias{core} \alias{annotation} \alias{hivp} \title{Bio3d Example Data} \description{ These data sets contain the results of running various Bio3D functions on example kinesin and transducin structural data, and on a short coarse-grained MD simulation data for HIV protease. The main purpose of including this data (which may be generated by the user by following the extended examples documented within the various Bio3D functions) is to speed up example execution. It should allow users to more quickly appreciate the capabilities of functions that would otherwise require raw data download, input and processing before execution. Note that related datasets formed the basis of the work described in (Grant, 2007) and (Yao & Grant, 2013) for \code{kinesin} and \code{transducin} examples, respectively. } \usage{ data(kinesin) data(transducin) data(hivp) } \format{ Three objects from analysis of the \code{kinesin} and \code{transducin} sequence and structure data: \enumerate{ \item{pdbs}{ is a list of class \code{pdbs} containing aligned PDB structure data. In the case of transducin this is the output of running \code{\link{pdbaln}} on a set of 53 G[alpha]i structures from the PDB database (see \code{pdbs$id} or \code{annotation} described below for details). The coordinates are fitted onto the first structure based on \code{"core"} positions obtained from \code{\link{core.find}} and superposed using the function \code{\link{pdbfit}}. } \item{core}{ is a list of class \code{"core"} obtained by running the function \code{\link{core.find}} on the \code{pdbs} object as described above.} \item{annotation}{ is a character matrix describing the nucleotide state and bound ligand species for each structure in \code{pdbs} as obtained from the function \code{\link{pdb.annotate}}.} } One object named \code{net} in the hivp example data stores the correlation network obtained from the analysis of the MD simulation trajectory of HIV protease using the \code{cna} function. The original trajectory file can be accessed by the command \sQuote{system.file("examples/hivp.dcd", package="bio3d")}. } \source{ A related but more extensive dataset formed the basis of the work described in (Grant, 2007) and (Yao & Grant, 2013) for \code{kinesin} and \code{transducin} examples, respectively. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. Grant, B.J. et al. (2007) \emph{J. Mol. Biol.} \bold{368}, 1231--1248. Yao, X.Q. et al. (2013) \emph{Biophys. J.} \bold{105}, L08--L10. } \keyword{datasets} bio3d/man/read.all.Rd0000644000176200001440000001023414046073105013776 0ustar liggesusers\name{read.all} \alias{read.all} \title{ Read Aligned Structure Data} \description{ Read aligned PDB structures and store their equalvalent atom data, including xyz coordinates, residue numbers, residue type and B-factors. } \usage{ read.all(aln, prefix = "", pdbext = "", sel = NULL, rm.wat=TRUE, rm.ligand=FALSE, compact = TRUE, ncore = NULL, ...) } \arguments{ \item{aln}{ an alignment data structure obtained with \code{\link{read.fasta}}. } \item{prefix}{ prefix to aln$id to locate PDB files. } \item{pdbext}{ the file name extention of the PDB files. } \item{sel}{ a selection string detailing the atom type data to store (see function store.atom) } \item{rm.wat}{logical, if TRUE water atoms are removed. } \item{rm.ligand}{logical, if TRUE ligand atoms are removed. } \item{compact}{ logical, if TRUE the number of atoms stored for each aligned residue varies according to the amino acid type. If FALSE, the constant maximum possible number of atoms are stored for all aligned residues. } \item{ncore }{ number of CPU cores used to do the calculation. By default (\code{ncore=NULL}) use all detected CPU cores. } \item{\dots}{ other parameters for \code{\link{read.pdb}}. } } \details{ The input \code{aln}, produced with \code{\link{read.fasta}}, must have identifers (i.e. sequence names) that match the PDB file names. For example the sequence corresponding to the structure file \dQuote{mypdbdir/1bg2.pdb} should have the identifer \sQuote{mypdbdir/1bg2.pdb} or \sQuote{1bg2} if input \sQuote{prefix} and \sQuote{pdbext} equal \sQuote{mypdbdir/} and \sQuote{pdb}. See the examples below. Sequence miss-matches will generate errors. Thus, care should be taken to ensure that the sequences in the alignment match the sequences in their associated PDB files. } \value{ Returns a list of class \code{"pdbs"} with the following five components: \item{xyz}{numeric matrix of aligned C-alpha coordinates.} \item{resno}{character matrix of aligned residue numbers.} \item{b}{numeric matrix of aligned B-factor values.} \item{chain}{character matrix of aligned chain identifiers.} \item{id}{character vector of PDB sequence/structure names.} \item{ali}{character matrix of aligned sequences.} \item{resid}{character matrix of aligned 3-letter residue names.} \item{all }{numeric matrix of aligned equalvelent atom coordinates. } \item{all.elety}{numeric matrix of aligned atom element types. } \item{all.resid}{numeric matrix of aligned three-letter residue codes. } \item{all.resno}{numeric matrix of aligned residue numbers. } \item{all.grpby}{numeric vector indicating the group of atoms belonging to the same aligned residue. } \item{all.hetatm}{a list of \sQuote{pdb} objects for non-protein atoms. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \note{ This function is still in development and is NOT part of the offical bio3d package. The sequence character \sQuote{X} is useful for masking unusual or unknown residues, as it can match any other residue type. } \seealso{ \code{\link{read.fasta}}, \code{\link{read.pdb}}, \code{\link{core.find}}, \code{\link{fit.xyz}} } \examples{ # still working on speeding this guy up \dontrun{ ## Read sequence alignment file <- system.file("examples/kif1a.fa",package="bio3d") aln <- read.fasta(file) ## Read aligned PDBs storing all data for 'sel' sel <- c("N", "CA", "C", "O", "CB", "*G", "*D", "*E", "*Z") pdbs <- read.all(aln, sel=sel) atm <- colnames(pdbs$all) ca.ind <- which(atm == "CA") core <- core.find(pdbs) core.ind <- c( matrix(ca.ind, nrow=3)[,core$c0.5A.atom] ) ## Fit structures nxyz <- fit.xyz(pdbs$all[1,], pdbs$all, fixed.inds = core.ind, mobile.inds = core.ind) ngap.col <- gap.inspect(nxyz) #npc.xray <- pca.xyz(nxyz[ ,ngap.col$f.inds]) #a <- mktrj.pca(npc.xray, pc=1, file="pc1-all.pdb", # elety=pdbs$all.elety[1,unique( ceiling(ngap.col$f.inds/3) )], # resid=pdbs$all.resid[1,unique( ceiling(ngap.col$f.inds/3) )], # resno=pdbs$all.resno[1,unique( ceiling(ngap.col$f.inds/3) )] ) } } \keyword{ IO } bio3d/man/store.atom.Rd0000644000176200001440000000153714046073105014415 0ustar liggesusers\name{store.atom} \alias{store.atom} \title{ Store all-atom data from a PDB object } \description{ Not intended for public usage } \usage{ store.atom(pdb=NULL) } \arguments{ \item{pdb}{ A pdb object as obtained from read.pdb } } \details{ This function was requested by a user and has not been extensively tested. Hence it is not yet recommended for public usage. } \value{ Returns a matrix of all-atom data. If \code{pdb=NULL}, returns the default atom names to be stored. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \note{ This function is still in development and is NOT part of the offical bio3d package } \seealso{ \code{\link{read.fasta.pdb}} } \examples{ \dontrun{ pdb <- read.pdb( get.pdb("5p21", URLonly=TRUE) ) a <- store.atom(pdb) a[,,1:2] } } \keyword{ utilities } bio3d/man/gap.inspect.Rd0000644000176200001440000000421314046073105014527 0ustar liggesusers\name{gap.inspect} \alias{gap.inspect} \title{ Alignment Gap Summary } \description{ Report the number of gaps per sequence and per position for a given alignment. } \usage{ gap.inspect(x) } \arguments{ \item{x}{ a matrix or an alignment data structure obtained from \code{\link{read.fasta}} or \code{\link{read.fasta.pdb}}.} } \details{ Reports the number of gap characters per row (i.e. sequence) and per column (i.e. position) for a given \code{alignment}. In addition, the indices for gap and non-gap containing coloums are returned along with a binary matrix indicating the location of gap positions. } \value{ Returns a list object with the following components: \item{row }{a numeric vector detailing the number of gaps per row (i.e. sequence).} \item{col }{a numeric vector detailing the number of gaps per column (i.e. position).} \item{t.inds }{ indices for gap containing coloums } \item{f.inds }{ indices for non-gap containing coloums} \item{bin }{a binary numeric matrix with the same dimensions as the \code{alignment}, with 0 at non-gap positions and 1 at gap positions.} } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \note{ During alignment, gaps are introduced into sequences that are believed to have undergone deletions or insertions with respect to other sequences in the alignment. These gaps, often referred to as indels, can be represented with \sQuote{NA}, a \sQuote{-} or \sQuote{.} character. This function gives an overview of gap occurrence and may be useful when considering positions or sequences that could/should be excluded from further analysis. } \seealso{ \code{\link{read.fasta}}, \code{\link{read.fasta.pdb}}} \examples{ aln <- read.fasta( system.file("examples/hivp_xray.fa", package = "bio3d") ) gap.stats <- gap.inspect(aln$ali) gap.stats$row # Gaps per sequence gap.stats$col # Gaps per position ##gap.stats$bin # Binary matrix (1 for gap, 0 for aminoacid) ##aln[,gap.stats$f.inds] # Alignment without gap positions plot(gap.stats$col, typ="h", ylab="No. of Gaps") } \keyword{ utilities } bio3d/man/formula2mass.Rd0000644000176200001440000000132014046073105014723 0ustar liggesusers\name{formula2mass} \alias{formula2mass} \title{Chemical Formula to Mass Converter} \description{Compute the molar mass associated to a chemical formula.} \usage{ formula2mass(form, sum.mass = TRUE) } \arguments{ \item{form}{a character string containing a chemical formula on the form: 'C3 H5 N O1'.} \item{sum.mass}{logical, should the mass of each element be summed.} } \details{ Compute the molar mass (in g.mol-1) associated to a chemical formula. } \value{ Return a single element numeric vector containing the mass corresponding to a given chemical formula. } \author{Lars Skjaerven} \seealso{ \code{\link{atom2ele}}, \code{\link{atom2mass}} } \examples{ #formula2mass("C5 H6 N O3") } \keyword{ utilities } bio3d/man/bhattacharyya.Rd0000644000176200001440000000346614046073105015151 0ustar liggesusers\name{bhattacharyya} \alias{bhattacharyya} \alias{bhattacharyya.nma} \alias{bhattacharyya.pca} \alias{bhattacharyya.enma} \alias{bhattacharyya.array} \alias{bhattacharyya.matrix} \title{ Bhattacharyya Coefficient } \description{ Calculate the Bhattacharyya Coefficient as a similarity between two modes objects. } \usage{ bhattacharyya(...) \method{bhattacharyya}{enma}(enma, covs=NULL, ncore=NULL, ...) \method{bhattacharyya}{array}(covs, ncore=NULL, ...) \method{bhattacharyya}{matrix}(a, b, q=90, n=NULL, ...) \method{bhattacharyya}{nma}(...) \method{bhattacharyya}{pca}(...) } \arguments{ \item{enma}{ an object of class \code{"enma"} obtained from function \code{nma.pdbs}. } \item{covs}{ an array of covariance matrices of equal dimensions. } \item{ncore }{ number of CPU cores used to do the calculation. \code{ncore>1} requires package \sQuote{parallel} installed. } \item{a}{ covariance matrix to be compared with \code{b}. } \item{b}{ covariance matrix to be compared with \code{a}. } \item{q}{ a numeric value (in percent) determining the number of modes to be compared. } \item{n}{ the number of modes to be compared. } \item{\dots}{ arguments passed to associated functions. } } \details{ Bhattacharyya coefficient provides a means to compare two covariance matrices derived from NMA or an ensemble of conformers (e.g. simulation or X-ray conformers). } \value{ Returns the similarity coefficient(s). } \references{ Skjaerven, L. et al. (2014) \emph{BMC Bioinformatics} \bold{15}, 399. Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. Fuglebakk, E. et al. (2013) \emph{JCTC} \bold{9}, 5618--5628. } \author{ Lars Skjaerven } \seealso{Other similarity measures: \code{\link{sip}}, \code{\link{covsoverlap}}, \code{\link{rmsip}}. } \keyword{ utilities } bio3d/man/pca.array.Rd0000644000176200001440000000310414046073105014172 0ustar liggesusers\name{pca.array} \alias{pca.array} \title{ Principal Component Analysis of an array of matrices } \description{ Calculate the principal components of an array of correlation or covariance matrices. } \usage{ \method{pca}{array}(x, use.svd = TRUE, rm.gaps=TRUE, ...) } \arguments{ \item{x}{ an array of matrices, e.g. correlation or covariance matrices as obtained from functions \code{dccm} or \code{enma2covs}. } \item{use.svd}{ logical, if TRUE singular value decomposition (SVD) is called instead of eigenvalue decomposition. } \item{rm.gaps}{ logical, if TRUE gap cells (with missing coordinate data in any input matrix) are removed before calculation. This is equivalent to removing NA cells from x. } \item{\dots}{ . } } \details{ This function performs PCA of symmetric matrices, such as distance matrices from an ensemble of crystallographic structures, residue-residue cross-correlations or covariance matrices derived from ensemble NMA or MD simulation replicates, and so on. The \sQuote{upper triangular} region of the matrix is regarded as a long vector of random variables. The function returns M eigenvalues and eigenvectors with each eigenvector having the dimension N(N-1)/2, where M is the number of matrices and N the number of rows/columns of matrices. } \value{ Returns a list with components equivalent to the output from \code{pca.xyz}. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Xin-Qiu Yao, Lars Skjaerven } \seealso{ \code{\link{pca.xyz}} } \keyword{ utilities } bio3d/man/dccm.xyz.Rd0000644000176200001440000001144014046073105014053 0ustar liggesusers\name{dccm.xyz} \alias{dccm.xyz} \title{ Dynamical Cross-Correlation Matrix from Cartesian Coordinates } \description{ Determine the cross-correlations of atomic displacements. } \usage{ \method{dccm}{xyz}(x, reference = NULL, grpby=NULL, method=c("pearson", "lmi"), ncore=1, nseg.scale=1, \dots) } \arguments{ \item{x}{ a numeric matrix of Cartesian coordinates with a row per structure/frame. } \item{reference}{ The reference structure about which displacements are analysed. } \item{grpby}{ a vector counting connective duplicated elements that indicate the elements of \code{xyz} that should be considered as a group (e.g. atoms from a particular residue). } \item{method}{ method to calculate the cross-correlation. Currently supports Pearson and linear mutual information (LMI). } \item{ncore }{ number of CPU cores used to do the calculation. \code{ncore=NULL} will use all the cores detected. } \item{nseg.scale }{ split input data into specified number of segments prior to running multiple core calculation. See \code{\link{fit.xyz}}. } \item{\dots}{ Additional arguments to be passed (currently ignored). } } \details{ The extent to which the atomic fluctuations/displacements of a system are correlated with one another can be assessed by examining the magnitude of all pairwise cross-correlation coefficients (see McCammon and Harvey, 1986). This function returns a matrix of all atom-wise cross-correlations whose elements, Cij, may be displayed in a graphical representation frequently termed a dynamical cross-correlation map, or DCCM. If Cij = 1 the fluctuations of atoms i and j are completely correlated (same period and same phase), if Cij = -1 the fluctuations of atoms i and j are completely anticorrelated (same period and opposite phase), and if Cij = 0 the fluctuations of i and j are not correlated. Typical characteristics of DCCMs include a line of strong cross-correlation along the diagonal, cross-correlations emanating from the diagonal, and off-diagonal cross-correlations. The high diagonal values occur where i = j, where Cij is always equal to 1.00. Positive correlations emanating from the diagonal indicate correlations between contiguous residues, typically within a secondary structure element or other tightly packed unit of structure. Typical secondary structure patterns include a triangular pattern for helices and a plume for strands. Off-diagonal positive and negative correlations may indicate potentially interesting correlations between domains of non-contiguous residues. If \code{method = "pearson"}, the conventional Pearson's inner-product correlaiton calculation will be invoked, in which only the diagnol of each atom-atom variance-covariance sub-matrix is considered. If \code{method = "lmi"}, then the linear mutual information cross-correlation will be calculated. \sQuote{LMI} considers both diagnol and off-diagnol entries in the sub-matrices, and so even captures the correlation of atoms moving in orthognal directions. } \value{ Returns a cross-correlation matrix with values in a range from -1 to 1 (Pearson) or from 0 to 1 (LMI). } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. McCammon, A. J. and Harvey, S. C. (1986) \emph{Dynamics of Proteins and Nucleic Acids}, Cambridge University Press, Cambridge. Lange, O.F. and Grubmuller, H. (2006) \emph{PROTEINS: Structure, Function, and Bioinformatics} \bold{62}:1053--1061. } \author{ Xin-Qiu Yao, Hongyang Li, Gisle Saelensminde, and Barry Grant } \seealso{ \code{\link{cor}} for examining xyz cross-correlations, \code{\link{dccm}}, \code{\link{dccm.nma}}, \code{\link{dccm.pca}}, \code{\link{dccm.enma}}. } \examples{ \donttest{ ##-- Read example trajectory file trtfile <- system.file("examples/hivp.dcd", package="bio3d") trj <- read.dcd(trtfile) ## Read the starting PDB file to determine atom correspondence pdbfile <- system.file("examples/hivp.pdb", package="bio3d") pdb <- read.pdb(pdbfile) ## select residues 24 to 27 and 85 to 90 in both chains inds <- atom.select(pdb, resno=c(24:27,85:90), elety='CA') ## lsq fit of trj on pdb xyz <- fit.xyz(pdb$xyz, trj, fixed.inds=inds$xyz, mobile.inds=inds$xyz) ## DCCM (slow to run so restrict to Calpha) cij <- dccm(xyz) ## Plot DCCM plot(cij) ## Or library(lattice) contourplot(cij, region = TRUE, labels=FALSE, col="gray40", at=c(-1, -0.75, -0.5, -0.25, 0.25, 0.5, 0.75, 1), xlab="Residue No.", ylab="Residue No.", main="DCCM: dynamic cross-correlation map") ## LMI matrix cij <- dccm(xyz, method='lmi') ## Plot LMI matrix #plot(cij) col.scale <- colorRampPalette(c("gray95", "cyan"))(5) plot(cij, at=seq(0.4,1, length=5), col.regions=col.scale) } } \keyword{ utilities } bio3d/man/filter.dccm.Rd0000644000176200001440000000741214046073105014512 0ustar liggesusers\name{filter.dccm} \alias{filter.dccm} \title{ Filter for Cross-correlation Matrices (Cij) } \description{ This function builds various cij matrix for correlation network analysis } \usage{ filter.dccm(x, cutoff.cij = NULL, cmap = NULL, xyz = NULL, fac = NULL, cutoff.sims = NULL, collapse = TRUE, extra.filter = NULL, ...) } \arguments{ \item{x}{ A matrix (nXn), a numeric array with 3 dimensions (nXnXm), a list with m cells each containing nXn matrix, or a list with \sQuote{all.dccm} component, containing atomic correlation values, where "n" is the number of residues and "m" the number of calculations. The matrix elements should be in between -1 and 1. See \sQuote{dccm} function in bio3d package for further details. } \item{cutoff.cij}{ Threshold for each individual correlation value. If NULL, a guessed value will be used. See below for details. } \item{cmap}{ logical or numerical matrix indicating the contact map. If logical and TRUE, contact map will be calculated with input \code{xyz}. } \item{xyz}{ XYZ coordinates, or a \sQuote{pdbs} object obtained from \code{pdbaln} or \code{read.fasta.pdb}, for contact map calculations. } \item{fac}{ factor indicating distinct categories of input correlation matrices. } \item{cutoff.sims}{ Threshold for the number of simulations with observed correlation value above \code{cutoff.cij} for the same residue/atomic pairs. See below for details. } \item{collapse}{ logical, if TRUE the mean matrix will be returned. } \item{extra.filter}{ Filter to apply in addition to the model chosen. } \item{\dots}{ extra arguments passed to function \code{cmap}. } } \value{ Returns a matrix of class "dccm" or a 3D array of filtered cross-correlations. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Xin-Qiu Yao, Guido Scarabelli & Barry Grant } \details{ If cmap is TRUE or provided a numerical matrix, the function inspects a set of cross-correlation matrices, or DCCM, and decides edges for correlation network analysis based on: 1. min(abs(cij)) >= cutoff.cij, or 2. max(abs(cij)) >= cutoff.cij && residues contact each other based on results from \code{cmap}. Otherwise, the function filters DCCMs with \code{cutoff.cij} and return the mean of correlations present in at least \code{cutoff.sims} calculated matrices. An internally guessed \code{cuoff.cij} is used if \code{cutoff.cij=NULL} is provided. By default, the cutoff is determined by keeping 5\% of all residue pairs connected. } \seealso{ \code{\link{cna}}, \code{\link{dccm}}, \code{\link{dccm.nma}}, \code{\link{dccm.xyz}}, \code{\link{cmap}}, \code{\link{plot.dccm}} } \examples{ \dontrun{ # Example of transducin attach(transducin) gaps.pos <- gap.inspect(pdbs$xyz) modes <- nma.pdbs(pdbs, ncore=NULL) dccms <- dccm.enma(modes, ncore=NULL) cij <- filter.dccm(dccms, xyz=pdbs) # Example protein kinase # Select Protein Kinase PDB IDs ids <- c("4b7t_A", "2exm_A", "1opj_A", "4jaj_A", "1a9u_A", "1tki_A", "1csn_A", "1lp4_A") # Download and split by chain ID files <- get.pdb(ids, path = "raw_pdbs", split=TRUE) # Alignment of structures pdbs <- pdbaln(files) # Sequence identity summary(c(seqidentity(pdbs))) # NMA on all structures modes <- nma.pdbs(pdbs, ncore=NULL) # Calculate correlation matrices for each structure cij <- dccm(modes) # Set DCCM plot panel names for combined figure dimnames(cij$all.dccm) = list(NULL, NULL, ids) plot.dccm(cij$all.dccm) # Filter to display only correlations present in all structures cij.all <- filter.dccm(cij, cutoff.sims = 8, cutoff.cij = 0) plot.dccm(cij.all, main = "Consensus Residue Cross Correlation") detach(transducin) } } \keyword{analysis} bio3d/man/nma.Rd0000644000176200001440000000506514046073105013075 0ustar liggesusers\name{nma} \alias{nma} \title{ Normal Mode Analysis } \description{ Perform normal mode analysis (NMA) on either a single or an ensemble of protein structures. } \usage{ nma(...) } \arguments{ \item{\dots}{ arguments passed to the methods \code{\link{nma.pdb}}, or \code{\link{nma.pdbs}}. For function \code{\link{nma.pdb}} this will include an object of class \code{pdb} as obtained from function \code{\link{read.pdb}}. For function \code{\link{nma.pdbs}} an object of class \code{pdbs} as obtained from function \code{\link{pdbaln}} or \code{\link{read.fasta.pdb}}. } } \details{ Normal mode analysis (NMA) is a computational approach for studying and characterizing protein flexibility. Current functionality entails normal modes calculation on either a single protein structure or an ensemble of aligned protein structures. This generic \code{\link{nma}} function calls the corresponding methods for the actual calculation, which is determined by the class of the input argument: Function \code{\link{nma.pdb}} will be used when the input argument is of class \code{pdb}. The function calculates the normal modes of a C-alpha model of a protein structure. Function \code{\link{nma.pdbs}} will be used when the input argument is of class \code{pdbs}. The function will perform normal mode analysis of each PDB structure stored in the \code{pdbs} object (\sQuote{ensemble NMA}). See documentation and examples for each corresponding function for more details. } \references{ Skjaerven, L. et al. (2014) \emph{BMC Bioinformatics} \bold{15}, 399. Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{nma.pdb}}, \code{\link{nma.pdbs}}, \code{\link{pca}}. } \examples{ ##- Singe structure NMA ## Fetch stucture pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) ## Calculate normal modes modes <- nma(pdb) ## Print modes print(modes) ## Plot modes plot(modes) ## Visualize modes #m7 <- mktrj.nma(modes, mode=7, file="mode_7.pdb") \donttest{ ## Needs MUSCLE installed - testing excluded ##- Ensemble NMA if(check.utility("muscle")) { ## Fetch PDB files and split to chain A only PDB files ids <- c("1a70_A", "1czp_A", "1frd_A", "1fxi_A", "1iue_A", "1pfd_A") files <- get.pdb(ids, split = TRUE, path = tempdir()) ## Sequence Alignement pdbs <- pdbaln(files, outfile = tempfile()) ## Normal mode analysis on aligned data modes <- nma(pdbs, rm.gaps=FALSE) ## Plot fluctuation data plot(modes, pdbs=pdbs) } } } \keyword{ analysis } bio3d/man/mustang.Rd0000644000176200001440000000611714046073105013777 0ustar liggesusers\name{mustang} \alias{mustang} \title{ Structure-based Sequence Alignment with MUSTANG } \description{ Create a multiple sequence alignment from a bunch of PDB files. } \usage{ mustang(files, exefile="mustang", outfile="aln.mustang.fa", cleanpdb=FALSE, cleandir="mustangpdbs", verbose=TRUE) } \arguments{ \item{files}{ a character vector of PDB file names. } \item{exefile}{ file path to the \sQuote{MUSTANG} program on your system (i.e. how is \sQuote{MUSTANG} invoked). } \item{outfile}{ name of \sQuote{FASTA} output file to which alignment should be written. } \item{cleanpdb}{ logical, if TRUE iterate over the PDB files and map non-standard residues to standard residues (e.g. SEP->SER..) to produce \sQuote{clean} PDB files. } \item{cleandir}{ character string specifying the directory in which the \sQuote{clean} PDB files should be written. } \item{verbose}{ logical, if TRUE \sQuote{MUSTANG} warning and error messages are printed. } } \details{ Structure-based sequence alignment with \sQuote{MUSTANG} attempts to arrange and align the sequences of proteins based on their 3D structure. This function calls the \sQuote{MUSTANG} program, to perform a multiple structure alignment, which MUST BE INSTALLED on your system and in the search path for executables. Note that non-standard residues are mapped to \dQuote{Z} in MUSTANG. As a workaround the bio3d \sQuote{mustang} function will attempt to map any non-standard residues to standard residues (e.g. SEP->SER, etc). To avoid this behaviour use \sQuote{cleanpdb=FALSE}. } \value{ A list with two components: \item{ali}{ an alignment character matrix with a row per sequence and a column per equivalent aminoacid. } \item{ids}{ sequence names as identifers.} } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. \sQuote{MUSTANG} is the work of Konagurthu et al: Konagurthu, A.S. et al. (2006) \emph{Proteins} \bold{64}(3):559--74. More details of the \sQuote{MUSTANG} algorithm, along with download and installation instructions can be obtained from:\cr \url{https://lcb.infotech.monash.edu/mustang/}. } \author{ Lars Skjaerven } \note{ A system call is made to the \sQuote{MUSTANG} program, which must be installed on your system and in the search path for executables. } \seealso{ \code{\link{read.fasta}}, \code{\link{read.fasta.pdb}}, \code{\link{pdbaln}}, \code{\link{plot.fasta}}, \code{\link{seqaln}} } \examples{ \dontrun{ if(!check.utility('mustang')) { message('Need MUSTANG installed to run this example') } else { ## Fetch PDB files and split to chain A only PDB files ids <- c("1a70_A", "1czp_A", "1frd_A") files <- get.pdb(ids, split = TRUE, path = tempdir()) ##-- Or, read a folder/directory of existing PDB files #pdb.path <- "my_dir_of_pdbs" #files <- list.files(path=pdb.path , # pattern=".pdb", # full.names=TRUE) ##-- Align these PDB sequences aln <- mustang(files) ##-- Read Aligned PDBs storing coordinate data pdbs <- read.fasta.pdb(aln) } } } \keyword{ utilities } bio3d/man/rmsf.Rd0000644000176200001440000000410714046073105013265 0ustar liggesusers\name{rmsf} \alias{rmsf} \title{ Atomic RMS Fluctuations } \description{ Calculate atomic root mean squared fluctuations. } \usage{ rmsf(xyz, grpby=NULL, average=FALSE) } \arguments{ \item{xyz}{ numeric matrix of coordinates with each row corresponding to an individual conformer. } \item{grpby}{ a vector counting connective duplicated elements that indicate the elements of 'xyz' that should be considered as a group (e.g. atoms from a particular residue). If provided a 'pdb' object, grouping is automatically set by amino acid residues. } \item{average}{ logical, if TRUE averaged over atoms. } } \details{ RMSF is an often used measure of conformational variance. It is calculated by \deqn{f_i=\sqrt{\frac{1}{M-1}\sum_j \|r_i^j-r_i^0\|^2}}{% f_i=sqrt((1/(M-1))Sum_j(||r_i^j-r_i^0||^2))}, where \eqn{f_i}{f_i} is the RMSF value for the ith atom, M the total number of frames (total number of rows of \code{xyz}), \eqn{r_i^j}{r_i^j} the positional vector of the ith atom in the jth frame, and \eqn{r_i^0}{r_i^0} the mean position of ith atom. ||r|| denotes the Euclidean norm of the vector r. } \value{ Returns a numeric vector of RMSF values. If \code{average=TRUE} a single numeric value representing the averaged RMSF value over all atoms will be returned. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \seealso{ \code{\link{read.dcd}}, \code{\link{fit.xyz}}, \code{\link{read.fasta.pdb}} } \examples{ attach(transducin) # Ignore Gaps gaps <- gap.inspect(pdbs$ali) r <- rmsf(pdbs$xyz) plot(r[gaps$f.inds], typ="h", ylab="RMSF (A)") detach(transducin) \dontrun{ pdb <- read.pdb("1d1d", multi=TRUE) xyz <- pdb$xyz # superimpose trajectory xyz <- fit.xyz(xyz[1, ], xyz) # select mainchain atoms sele <- atom.select(pdb, elety=c("CA", "C", "N", "O")) # residue numbers to group by resno <- pdb$atom$resno[sele$atom] # mean rmsf value of mainchain atoms of each residue r <- rmsf(xyz[, sele$xyz], grpby=resno) plot.bio3d(r, resno=pdb, sse=pdb, ylab="RMSF (A)") } } \keyword{ utilities } bio3d/man/wrap.tor.Rd0000644000176200001440000000204514046073105014071 0ustar liggesusers\name{wrap.tor} \alias{wrap.tor} \title{ Wrap Torsion Angle Data } \description{ Adjust angular data so that the absolute difference of any of the observations from its mean is not greater than 180 degrees. } \usage{ wrap.tor(data, wrapav=TRUE, avestruc=NULL) } \arguments{ \item{data}{ a numeric vector or matrix of torsion angle data as obtained from \code{torsion.xyz}. } \item{wrapav}{ logical, if TRUE average structure is also \sQuote{wrapped} } \item{avestruc}{ a numeric vector corresponding to the average structure } } \details{ This is a basic utility function for coping with the periodicity of torsion angle data, by \sQuote{wraping} angular data such that the absolute difference of any of the observations from its column-wise mean is not greater than 180 degrees. } \value{ A numeric vector or matrix of wrapped torsion angle data. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Karim ElSawy } \seealso{ \code{\link{torsion.xyz}} } \keyword{ utilities } bio3d/man/plot.dccm.Rd0000644000176200001440000001035214046073105014200 0ustar liggesusers\name{plot.dccm} \alias{plot.dccm} \title{ DCCM Plot } \description{ Plot a dynamical cross-correlation matrix. } \usage{ \method{plot}{dccm}(x, resno=NULL, sse=NULL, colorkey=TRUE, at=c(-1, -0.75, -0.5, -0.25, 0.25, 0.5, 0.75, 1), main="Residue Cross Correlation", helix.col = "gray20", sheet.col = "gray80", inner.box=TRUE, outer.box=FALSE, xlab="Residue No.", ylab="Residue No.", margin.segments=NULL, segment.col=vmd_colors(), segment.min=1, ...) } \arguments{ \item{x}{ a numeric matrix of atom-wise cross-correlations as output by the \sQuote{dccm} function. } \item{resno}{ an optional vector with length equal to that of \code{x} that will be used to annotate the x- and y-axis. This is typically a vector of residue numbers. Can be also provided with a \sQuote{pdb} object, in which \sQuote{resno} of all C-alpha atoms will be used. If NULL residue positions from 1 to the length of \code{x} will be used. See examples below. } \item{sse}{ secondary structure object as returned from \code{\link{dssp}}, \code{\link{stride}} or \code{\link{read.pdb}}. } \item{colorkey}{ logical, if TRUE a key is plotted. } \item{at}{ numeric vector specifying the levels to be colored. } \item{main}{ a main title for the plot. } \item{helix.col}{ The colors for rectangles representing alpha helices. } \item{sheet.col}{ The colors for rectangles representing beta strands. } \item{inner.box}{ logical, if TRUE an outer box is drawn. } \item{outer.box}{ logical, if TRUE an outer box is drawn. } \item{xlab}{ a label for the x axis. } \item{ylab}{ a label for the y axis. } \item{margin.segments}{ a numeric vector of cluster membership as obtained from cutree() or other community detection method. This will be used for bottom and left margin annotation. } \item{segment.col}{ a vector of colors used for each cluster group in margin.segments. } \item{segment.min}{ a single element numeric vector that will cause margin.segments with a length below this value to be excluded from the plot. } \item{\dots}{ additional graphical parameters for contourplot. } } \details{ See the \sQuote{contourplot} function from the lattice package for plot customization options, and the functions \code{\link{dssp}} and \code{\link{stride}} for further details. } \value{ Called for its effect. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \note{ Be sure to check the correspondence of your \sQuote{sse} object with the \sQuote{cij} values being plotted as no internal checks are currently performed. } \seealso{ \code{\link{plot.bio3d}}, \code{\link{plot.dmat}}, \code{\link{filled.contour}}, \code{\link{contour}}, \code{\link{image}} \code{\link{plot.default}}, \code{\link{dssp}}, \code{\link{stride}} } \examples{ \dontrun{ ##-- Read example trajectory file trtfile <- system.file("examples/hivp.dcd", package="bio3d") trj <- read.dcd(trtfile) ## Read reference PDB and trim it to match the trajectory pdb <- trim(read.pdb("1W5Y"), 'calpha') ## select residues 24 to 27 and 85 to 90 in both chains inds <- atom.select(pdb, resno=c(24:27,85:90)) ## lsq fit of trj on pdb xyz <- fit.xyz(pdb$xyz, trj, fixed.inds=inds$xyz, mobile.inds=inds$xyz) ## Dynamic cross-correlations of atomic displacements cij <- dccm(xyz) ## Default plot plot.dccm(cij) ## Change the color scheme and the range of colored data levels plot.dccm(cij, contour=FALSE, col.regions=bwr.colors(200), at=seq(-1,1,by=0.01) ) ## Add secondary structure annotation to plot margins plot.dccm(cij, sse=pdb) ## Add additional margin annotation for chains ## Also label x- and y-axis with PDB residue numbers ch <- ifelse(pdb$atom$chain=="A", 1,2) plot.dccm(cij, resno=pdb, sse=pdb, margin.segments=ch) ## Plot with cluster annotation from dynamic network analysis #net <- cna(cij) #plot.dccm(cij, margin.segments=net$raw.communities$membership) ## Focus on major communities (i.e. exclude those below a certain total length) #plot.dccm(cij, margin.segments=net$raw.communities$membership, segment.min=25) } } \keyword{ hplot } bio3d/man/pdbfit.Rd0000644000176200001440000000471114046073105013567 0ustar liggesusers\name{pdbfit} \alias{pdbfit} \alias{pdbfit.pdb} \alias{pdbfit.pdbs} \title{ PDB File Coordinate Superposition } \description{ Protein Databank Bank file coordinate superposition with the Kabsch algorithm. } \usage{ pdbfit(...) \method{pdbfit}{pdb}(pdb, inds = NULL, ...) \method{pdbfit}{pdbs}(pdbs, inds = NULL, outpath = NULL, ...) } \arguments{ \item{pdb}{ a multi-model pdb object of class \code{"pdb"}, as obtained from \code{read.pdb}. } \item{pdbs}{ a list of class \code{"pdbs"} containing PDB file data, as obtained from \code{read.fasta.pdb} or \code{pdbaln}. } \item{inds}{ a list object with a \sQuote{xyz} component with indices that selects the coordinate positions (in terms of x, y and z elements) upon which fitting should be based. This defaults to all equivalent non-gap positions for function \code{pdbfit.pdbs}, and to all calpha atoms for function \code{pdbfit.pdb}. } \item{outpath}{ character string specifing the output directory for optional coordinate file output. Note that full files (i.e. all atom files) are written, seebelow. } \item{\dots}{ extra arguments passed to \code{fit.xyz} function. } } \details{ The function \code{pdbfit} is a wrapper for the function \code{fit.xyz}, wherein full details of the superposition procedure are documented. Input to \code{pdbfit.pdbs} should be a list object obtained with the function \code{\link{read.fasta.pdb}} or \code{\link{pdbaln}}. See the examples below. For function \code{pdbfit.pdb} the input should be a multi-model \code{pdb} object with multiple (>1) frames in the \sQuote{xyz} component. The reference frame for supperposition (i.e. the fixed structure to which others are superposed) is the first entry in the input \code{"pdbs"} object. For finer control use \code{\link{fit.xyz}}. } \value{ Returns moved coordinates. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. Kabsch \emph{Acta Cryst} (1978) \bold{A34}, 827--828. } \author{ Barry Grant } \seealso{ \code{\link{pdbaln}}, \code{\link{read.fasta.pdb}}, \code{\link{fit.xyz}}, \code{\link{rmsd}}, \code{\link{read.pdb}} } \examples{ \dontrun{ #files <- get.pdb(c("4q21","5p21"), URLonly=TRUE) files <- get.pdb(c("4q21","5p21"), path=tempdir(), overwrite=TRUE) pdbs <- pdbaln(files) xyz <- pdbfit(pdbs) # Superpose again this time outputing all-atom PDBs to disc #xyz <- pdbfit( pdbs, outpath="fitted" ) } } \keyword{ utilities } bio3d/man/aln2html.Rd0000644000176200001440000000371414046073105014042 0ustar liggesusers\name{aln2html} \alias{aln2html} \title{ Create a HTML Page For a Given Alignment } \description{ Renders a sequence alignment as coloured HTML suitable for viewing with a web browser. } \usage{ aln2html(aln, file="alignment.html", Entropy=0.5, append=TRUE, caption.css="color: gray; font-size: 9pt", caption="Produced by Bio3D", fontsize="11pt", bgcolor=TRUE, colorscheme="clustal") } \arguments{ \item{aln}{ an alignment list object with \code{id} and \code{ali} components, similar to that generated by \code{\link{read.fasta}}. } \item{file}{ name of output html file. } \item{Entropy}{ conservation \sQuote{cuttoff} value below which alignment columns are not coloured. } \item{append}{ logical, if TRUE output will be appended to \code{file}; otherwise, it will overwrite the contents of \code{file}. } \item{caption.css}{ a character string of css options for rendering \sQuote{caption} text. } \item{caption}{ a character string of text to act as a caption. } \item{fontsize}{ the font size for alignment characters. } \item{bgcolor}{ background colour. } \item{colorscheme}{ conservation colouring scheme, currently only \dQuote{clustal} is supported with alternative arguments resulting in an entropy shaded alignment.} } \value{ Called for its effect. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \note{ Your web browser should support style sheets. } \seealso{ \code{\link{read.fasta}}, \code{\link{write.fasta}}, \code{\link{seqaln}} } \examples{ \dontrun{ ## Read an example alignment aln <- read.fasta(system.file("examples/hivp_xray.fa",package="bio3d")) ## Produce a HTML file for this alignment aln2html(aln, append=FALSE, file=file.path("eg.html")) aln2html(aln, colorscheme="ent", file="eg.html") ## View/open the file in your web browser #browseURL("eg.html") } } \keyword{ IO } bio3d/man/bounds.sse.Rd0000644000176200001440000000204314046073105014376 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bounds.sse.R \name{bounds.sse} \alias{bounds.sse} \title{Obtain A SSE Object From An SSE Sequence Vector} \usage{ bounds.sse(x, pdb = NULL) } \arguments{ \item{x}{a character vector indicating SSE for each amino acid residue.} \item{pdb}{an object of class \code{pdb} as obtained from function \code{\link{read.pdb}}. Can be ignored if \code{x} has 'names' attribute for residue labels.} } \value{ a 'sse' object. } \description{ Inverse process of the funciton \code{\link{pdb2sse}}. } \details{ call for its effects. } \note{ In both \code{$helix} and \code{$sheet}, an additional \code{$id} component is added to indicate the original numbering of the sse. This is particularly useful in e.g. \code{trim.pdb()} function. } \examples{ \donttest{ # PDB server connection required - testing excluded pdb <- read.pdb("1a7l") sse <- pdb2sse(pdb) sse.ind <- bounds.sse(sse) sse.ind } } \author{ Xin-Qiu Yao & Barry Grant } \seealso{ \code{\link{pdb2sse}} } bio3d/man/plot.dmat.Rd0000644000176200001440000000763614046073105014232 0ustar liggesusers\name{plot.dmat} \alias{plot.dmat} \title{ Plot Distance Matrix } \description{ Plot a distance matrix (DM) or a difference distance matrix (DDM). } \usage{ \method{plot}{dmat}(x, key = TRUE, resnum.1 = c(1:ncol(x)), resnum.2 = resnum.1, axis.tick.space = 20, zlim = range(x, finite = TRUE), nlevels = 20, levels = pretty(zlim, nlevels), color.palette = bwr.colors, col = color.palette(length(levels) - 1), axes = TRUE, key.axes, xaxs = "i", yaxs = "i", las = 1, grid = TRUE, grid.col = "yellow", grid.nx = floor(ncol(x)/30), grid.ny = grid.nx, center.zero = TRUE, flip=TRUE, ...) } \arguments{ \item{x}{ a numeric distance matrix generated by the function \code{\link{dm}}. } \item{key}{ logical, if TRUE a color key is plotted. } \item{resnum.1}{ a vector of residue numbers for annotating the x axis. } \item{resnum.2}{ a vector of residue numbers for annotating the y axis. } \item{axis.tick.space}{ the separation between each axis tick mark. } \item{zlim}{ z limits for the distances to be plotted. } \item{nlevels}{ if \code{levels} is not specified, the range of 'z' values is divided into approximately this many levels. } \item{levels}{ a set of levels used to partition the range of 'z'. Must be *strictly* increasing (and finite). Areas with 'z' values between consecutive levels are painted with the same color. } \item{color.palette}{ a color palette function, used to assign colors in the plot. } \item{col}{ an explicit set of colors to be used in the plot. This argument overrides any palette function specification. } \item{axes}{ logical, if TRUE plot axes are drawn. } \item{key.axes}{ statements which draw axes on the plot key. It overrides the default axis. } \item{xaxs}{ the x axis style. The default is to use internal labeling. } \item{yaxs}{ the y axis style. The default is to use internal labeling. } \item{las}{ the style of labeling to be used. The default is to use horizontal labeling. } \item{grid}{ logical, if TRUE overlaid grid is drawn. } \item{grid.col}{ color of the overlaid grid. } \item{grid.nx}{ number of grid cells in the x direction. } \item{grid.ny}{ number of grid cells in the y direction. } \item{center.zero}{ logical, if TRUE levels are forced to be equidistant around zero, assuming that zlim ranges from less than to more than zero. } \item{flip}{ logical, indicating whether the second axis should be fliped. } \item{\dots}{ additional graphical parameters for image. } } \value{ Called for its effect. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696.T Much of this function is based on the \code{filled.contour} function by Ross Ihaka. } \author{ Barry Grant } \note{ This function is based on the \code{layout} and legend key code in the function \code{filled.contour} by Ross Ihaka. As with \code{filled.contour} the output is a combination of two plots: the legend and (in this case) \code{image} (rather than a contour plot). } \seealso{ \code{\link{dm}}, \code{\link{filled.contour}}, \code{\link{contour}}, \code{\link{image}} } \examples{ # Read PDB file pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) # DM d <- dm(pdb,"calpha") # Plot DM ##filled.contour(d, nlevels = 4) ##plot(d) plot(d, resnum.1 = pdb$atom[pdb$calpha,"resno"], color.palette = mono.colors, xlab="Residue Number", ylab="Residue Number") \dontrun{ # Download and align two PDB files pdbs <- pdbaln( get.pdb( c( "4q21", "521p"), path=tempdir(), overwrite=TRUE)) # Get distance matrix a <- dm.xyz(pdbs$xyz[1,]) b <- dm.xyz(pdbs$xyz[2,]) # Calculate DDM c <- a - b # Plot DDM plot(c,key=FALSE, grid=FALSE) plot(c, axis.tick.space=10, resnum.1=pdbs$resno[1,], resnum.2=pdbs$resno[2,], grid.col="black", xlab="Residue No. (4q21)", ylab="Residue No. (521p)") } } \keyword{ hplot } bio3d/man/blast.pdb.Rd0000644000176200001440000001705214046077017014200 0ustar liggesusers\name{blast.pdb} \alias{blast.pdb} \alias{get.blast} \alias{plot.blast} \title{ NCBI BLAST Sequence Search and Summary Plot of Hit Statistics} \description{ Run NCBI blastp, on a given sequence, against the PDB, NR and swissprot sequence databases. Produce plots that facilitate hit selection from the match statistics of a BLAST result. } \usage{ blast.pdb(seq, database = "pdb", time.out = NULL, chain.single=TRUE) get.blast(urlget, time.out = NULL, chain.single=TRUE) \method{plot}{blast}(x, cutoff = NULL, cut.seed=NULL, cluster=TRUE, mar=c(2, 5, 1, 1), cex=1.5, ...) } \arguments{ \item{seq}{ a single element or multi-element character vector containing the query sequence. Alternatively a \sQuote{fasta} object from function \code{get.seq} or \sQuote{pdb} object from function \code{read.pdb} can be provided. } \item{database}{ a single element character vector specifying the database against which to search. Current options are \sQuote{pdb}, \sQuote{nr} and \sQuote{swissprot}. } \item{time.out}{ integer specifying the number of seconds to wait for the blast reply before a time out occurs. } \item{urlget}{ the URL to retrieve BLAST results; Usually it is returned by blast.pdb if time.out is set and met. } \item{chain.single}{ logical, if TRUE double NCBI character PDB database chain identifiers are simplified to lowercase '1WF4_GG' > '1WF4_g'. If FALSE no conversion to match RCSB PDB files is performed. } \item{x}{ BLAST results as obtained from the function \code{\link{blast.pdb}}. } \item{cutoff}{ A numeric cutoff value, in terms of minus the log of the evalue, for returned hits. If null then the function will try to find a suitable cutoff near \sQuote{cut.seed} which can be used as an initial guide (see below). } \item{cut.seed}{ A numeric seed cutoff value, used for initial cutoff estimation. If null then a seed position is set to the point of largest drop-off in normalized scores (i.e. the biggest jump in E-values). } \item{cluster}{ Logical, if TRUE (and \sQuote{cutoff} is null) a clustering of normalized scores is performed to partition hits in groups by similarity to query. If FALSE the partition point is set to the point of largest drop-off in normalized scores. } \item{mar}{ A numerical vector of the form c(bottom, left, top, right) which gives the number of lines of margin to be specified on the four sides of the plot.} \item{cex}{ a numerical single element vector giving the amount by which plot labels should be magnified relative to the default. } \item{\dots}{ extra plotting arguments. } } \details{ The \code{blast.pdb} function employs direct HTTP-encoded requests to the NCBI web server to run BLASTP, the protein search algorithm of the BLAST software package. BLAST, currently the most popular pairwise sequence comparison algorithm for database searching, performs gapped local alignments via a heuristic strategy: it identifies short nearly exact matches or hits, bidirectionally extends non-overlapping hits resulting in ungapped extended hits or high-scoring segment pairs(HSPs), and finally extends the highest scoring HSP in both directions via a gapped alignment (Altschul et al., 1997) For each pairwise alignment BLAST reports the raw score, bitscore and an E-value that assess the statistical significance of the raw score. Note that unlike the raw score E-values are normalized with respect to both the substitution matrix and the query and database lengths. Here we also return a corrected normalized score (mlog.evalue) that in our experience is easier to handle and store than conventional E-values. In practice, this score is equivalent to minus the natural log of the E-value. Note that, unlike the raw score, this score is independent of the substitution matrix and and the query and database lengths, and thus is comparable between BLASTP searches. Examining plots of BLAST alignment lengths, scores, E-values and normalized scores (-log(E-Value) from the \code{blast.pdb} function can aid in the identification sensible hit similarity thresholds. This is facilitated by the \code{plot.blast} function. If a \sQuote{cutoff} value is not supplied then a basic hierarchical clustering of normalized scores is performed with initial group partitioning implemented at a hopefully sensible point in the vicinity of \sQuote{h=cut.seed}. Inspection of the resultant plot can then be use to refine the value of \sQuote{cut.seed} or indeed \sQuote{cutoff}. As the \sQuote{cutoff} value can vary depending on the desired application and indeed the properties of the system under study it is envisaged that \sQuote{plot.blast} will be called multiple times to aid selection of a suitable \sQuote{cutoff} value. See the examples below for further details. } \value{ The function \code{blast.pdb} returns a list with three components, \code{hit.tbl}, \code{raw}, and \code{url}. The function \code{plot.blast} produces a plot on the active graphics device and returns a list object with four components, \code{hits}, \code{pdb.id}, \code{acc}, and \code{inds}. See below: \item{hit.tbl }{ a data frame summarizing BLAST results for each reported hit. It contains following major columns: \itemize{ \item \sQuote{bitscore}, a numeric vector containing the raw score for each alignment. \item \sQuote{evalue}, a numeric vector containing the E-value of the raw score for each alignment. \item \sQuote{mlog.evalue}, a numeric vector containing minus the natural log of the E-value. \item \sQuote{acc}, a character vector containing the accession database identifier of each hit. \item \sQuote{pdb.id}, a character vector containing the PDB database identifier of each hit. } } \item{raw }{ a data frame containing the raw BLAST output. Note multiple hits may appear in the same row. } \item{url }{ a single element character vector with the NCBI result URL and RID code. This can be passed to the get.blast function. } \item{hits}{ an ordered matrix detailing the subset of hits with a normalized score above the chosen cutoff. Database identifiers are listed along with their cluster group number. } \item{pdb.id}{ a character vector containing the PDB database identifier of each hit above the chosen threshold. } \item{acc}{ a character vector containing the accession database identifier of each hit above the chosen threshold. } \item{inds}{ a numeric vector containing the indices of the hits relative to the input blast object.} } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. \sQuote{BLAST} is the work of Altschul et al.: Altschul, S.F. et al. (1990) \emph{J. Mol. Biol.} \bold{215}, 403--410. Full details of the \sQuote{BLAST} algorithm, along with download and installation instructions can be obtained from:\cr \url{https://www.ncbi.nlm.nih.gov/BLAST/}. } \author{ Barry Grant } \note{ Online access is required to query NCBI blast services. } \seealso{ \code{\link{plot.blast}}, \code{\link{hmmer}}, \code{\link{seqaln}}, \code{\link{get.pdb}} } \examples{ \dontrun{ pdb <- read.pdb("4q21") blast <- blast.pdb( pdbseq(pdb) ) head(blast$hit.tbl) top.hits <- plot(blast) head(top.hits$hits) ## Use 'get.blast()' to retrieve results at a later time. #x <- get.blast(blast$url) #head(x$hit.tbl) # Examine and download 'best' hits top.hits <- plot.blast(blast, cutoff=188) head(top.hits$hits) #get.pdb(top.hits) } } \keyword{ utilities } \keyword{ hplot } bio3d/man/read.fasta.pdb.Rd0000644000176200001440000000702014046073105015067 0ustar liggesusers\name{read.fasta.pdb} \alias{read.fasta.pdb} \title{ Read Aligned Structure Data } \description{ Read aligned PDB structures and store their C-alpha atom data, including xyz coordinates, residue numbers, residue type and B-factors. } \usage{ read.fasta.pdb(aln, prefix = "", pdbext = "", fix.ali = FALSE, pdblist=NULL, ncore = 1, nseg.scale = 1, progress = NULL, ...) } \arguments{ \item{aln}{ an alignment data structure obtained with \code{\link{read.fasta}}. } \item{prefix}{ prefix to aln$id to locate PDB files. } \item{pdbext}{ the file name extention of the PDB files. } \item{fix.ali}{ logical, if TRUE check consistence between \code{$ali} and \code{$resno}, and correct \code{$ali} if they don't match. } \item{pdblist}{ an optional list of \code{pdb} objects with sequence corresponding to the alignments in \code{aln}. Primarily used through function \code{pdbaln} when the PDB objects already exists (avoids reading PDBs from file). } \item{ncore }{ number of CPU cores used to do the calculation. \code{ncore>1} requires package \sQuote{parallel} installed. } \item{nseg.scale }{ split input data into specified number of segments prior to running multiple core calculation. See \code{\link{fit.xyz}}. } \item{progress}{ progress bar for use with shiny web app. } \item{\dots}{ other parameters for \code{\link{read.pdb}}. } } \details{ The input \code{aln}, produced with \code{\link{read.fasta}}, must have identifers (i.e. sequence names) that match the PDB file names. For example the sequence corresponding to the structure \dQuote{1bg2.pdb} should have the identifer \sQuote{1bg2}. See examples below. Sequence miss-matches will generate errors. Thus, care should be taken to ensure that the sequences in the alignment match the sequences in their associated PDB files. } \value{ Returns a list of class \code{"pdbs"} with the following five components: \item{xyz}{numeric matrix of aligned C-alpha coordinates.} \item{resno}{character matrix of aligned residue numbers.} \item{b}{numeric matrix of aligned B-factor values.} \item{chain}{character matrix of aligned chain identifiers.} \item{id}{character vector of PDB sequence/structure names.} \item{ali}{character matrix of aligned sequences.} \item{resid}{character matrix of aligned 3-letter residue names.} \item{sse}{character matrix of aligned helix and strand secondary structure elements as defined in each PDB file.} \item{call}{ the matched call. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \note{ The sequence character \sQuote{X} is useful for masking unusual or unknown residues, as it can match any other residue type. } \seealso{ \code{\link{read.fasta}}, \code{\link{read.pdb}}, \code{\link{core.find}}, \code{\link{fit.xyz}}, \code{\link{read.all}}, \code{\link{pymol.pdbs}} } \examples{ \donttest{ # Redundant testing excluded # Read sequence alignment file <- system.file("examples/kif1a.fa",package="bio3d") aln <- read.fasta(file) # Read aligned PDBs pdbs <- read.fasta.pdb(aln) # Structure/sequence names/ids basename( pdbs$id ) # Alignment positions 335 to 339 pdbs$ali[,335:339] pdbs$resid[,335:339] pdbs$resno[,335:339] pdbs$b[,335:339] # Alignment C-alpha coordinates for these positions pdbs$xyz[, atom2xyz(335:339)] # See 'fit.xyz()' function for actual coordinate superposition # e.g. fit to first structure # xyz <- fit.xyz(pdbs$xyz[1,], pdbs) # xyz[, atom2xyz(335:339)] } } \keyword{ IO } bio3d/man/filter.cmap.Rd0000644000176200001440000000405314046073105014522 0ustar liggesusers\name{filter.cmap} \alias{filter.cmap} \title{ Contact Map Consensus Filtering } \description{ This function filters a tridimensional contact matrix (NxNxZ), where N is the residue number and Z is the simulation number) selecting only contacts present in at least P simulations. } \usage{ filter.cmap(cm, cutoff.sims = NULL) } \arguments{ \item{cm}{ An array of dimensions NxNxZ or a list of NxN matrices containing binary contact values as obtained from \code{cmap}. Here, \sQuote{N} is the residue number and \sQuote{Z} the simulation number. The matrix elements should be 1 if two residues are in contact and 0 if they are not in contact. } \item{cutoff.sims}{ A single element numeric vector corresponding to the minimum number of simulations a contact between two residues must be present. If not, it will be set to 0 in the output matrix. } } \value{ The output matrix is a nXn binary matrix (n = residue number). Elements equal to 1 correspond to residues in contact, elements equal to 0 to residues not in contact. } \seealso{ \code{\link{cmap}}, \code{\link{plot.cmap}} } \examples{ \dontrun{ ## load example data pdbfile <- system.file("examples/hivp.pdb", package="bio3d") pdb <- read.pdb(pdbfile) trtfile <- system.file("examples/hivp.dcd", package="bio3d") trj <- read.dcd(trtfile, verbose=FALSE) ## split the trj example in two num.of.frames <- dim(trj)[1] trj1 <- trj[1:(num.of.frames/2),] trj2 <- trj[((num.of.frames/2)+1):num.of.frames,] ## Lets work with Calpha atoms only ca.inds <- atom.select(pdb, "calpha") #noh.inds <- atom.select(pdb, "noh") ## calculate single contact map matrices cms <- list() cms[[1]] <- cmap(trj1[,ca.inds$xyz], pcut=0.3, scut=0, dcut=7, mask.lower=FALSE) cms[[2]] <- cmap(trj1[,ca.inds$xyz], pcut=0.3, scut=0, dcut=7, mask.lower=FALSE) ## calculate average contact matrix cm.filter <- filter.cmap(cms, cutoff.sims=2) ## plot the result par(pty="s", mfcol=c(1,3)) plot.cmap(cms[[1]]) plot.cmap(cms[[2]]) plot.cmap(cm.filter) } } \keyword{analysis} bio3d/man/aanma.pdb.Rd0000644000176200001440000001707014046073105014142 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/aanma.R, R/aanma.pdb.R, R/rtb.R \name{aanma} \alias{aanma} \alias{aanma.pdb} \alias{rtb} \title{All Atom Normal Mode Analysis} \usage{ aanma(...) \method{aanma}{pdb}(pdb, pfc.fun = NULL, mass = TRUE, temp = 300, keep = NULL, hessian = NULL, outmodes = "calpha", rm.wat = TRUE, reduced = FALSE, rtb = FALSE, nmer = 1, ...) rtb(hessian, pdb, mass = TRUE, nmer = 1, verbose = TRUE) } \arguments{ \item{...}{additional arguments to \code{\link{build.hessian}} and \code{\link{aa2mass}}. One useful option here for dealing with unconventional residues is \sQuote{mass.custom}, see the \code{\link{aa2mass}} function for details.} \item{pdb}{an object of class \code{pdb} as obtained from function \code{\link{read.pdb}}.} \item{pfc.fun}{customized pair force constant (\sQuote{pfc}) function. The provided function should take a vector of distances as an argument to return a vector of force constants. If NULL, the default function \sQuote{aaenm2} will be employed. (See details below).} \item{mass}{logical, if TRUE the Hessian will be mass-weighted.} \item{temp}{numerical, temperature for which the amplitudes for scaling the atomic displacement vectors are calculated. Set \sQuote{temp=NULL} to avoid scaling.} \item{keep}{numerical, final number of modes to be stored. Note that all subsequent analyses are limited to this subset of modes. This option is useful for very large structures and cases where memory may be limited.} \item{hessian}{hessian matrix as obtained from \code{\link{build.hessian}}. For internal purposes and generally not intended for public use.} \item{outmodes}{either a character (\sQuote{calpha} or \sQuote{noh}) or atom indices as obtained from \code{\link{atom.select}} specifying the atoms to include in the resulting mode object. (See details below).} \item{rm.wat}{logical, if TRUE water molecules will be removed before calculation.} \item{reduced}{logical, if TRUE the coarse-grained (\sQuote{4-bead}) ENM will be employed. (See details below).} \item{rtb}{logical, if TRUE the rotation-translation block based approximate modes will be calculated. (See details below).} \item{nmer}{numerical, defines the number of residues per block (used only when \code{rtb=TRUE}).} \item{verbose}{logical, if TRUE print detailed processing message} } \value{ Returns an object of class \sQuote{nma} with the following components: \item{modes}{ numeric matrix with columns containing the normal mode vectors. Mode vectors are converted to unweighted Cartesian coordinates when \code{mass=TRUE}. Note that the 6 first trivial eigenvectos appear in columns one to six. } \item{frequencies}{ numeric vector containing the vibrational frequencies corresponding to each mode (for \code{mass=TRUE}). } \item{force.constants}{ numeric vector containing the force constants corresponding to each mode (for \code{mass=FALSE)}). } \item{fluctuations}{ numeric vector of atomic fluctuations. } \item{U}{ numeric matrix with columns containing the raw eigenvectors. Equals to the \code{modes} component when \code{mass=FALSE} and \code{temp=NULL}. } \item{L}{ numeric vector containing the raw eigenvalues. } \item{xyz}{ numeric matrix of class \code{xyz} containing the Cartesian coordinates in which the calculation was performed. } \item{mass}{ numeric vector containing the residue masses used for the mass-weighting. } \item{temp}{ numerical, temperature for which the amplitudes for scaling the atomic displacement vectors are calculated. } \item{triv.modes}{ number of trivial modes. } \item{natoms}{ number of C-alpha atoms. } \item{call}{ the matched call. } } \description{ Perform all-atom elastic network model normal modes calculation of a protein structure. } \details{ This function builds an elastic network model (ENM) based on all heavy atoms of input \code{pdb}, and performs subsequent normal mode analysis (NMA) in various manners. By default, the \sQuote{aaenm2} force field (defining of the spring constants between atoms) is used, which was obtained by fitting to a local energy minimum of a crambin model derived from the AMBER99SB force field. It employs a pair force constant function which falls as r^-6, and specific force constants for covalent and intra-residue atom pairs. See also \code{\link{load.enmff}} for other force field options. The \code{outmodes} argument controls the type of output modes. There are two standard types of output modes: \sQuote{noh} and \sQuote{calpha}. \code{outmodes='noh'} invokes regular all-atom based ENM-NMA. When \code{outmodes='calpha'}, an effective Hessian with respect to all C-alpha atoms will be first calculated using the same formula as in Hinsen et al. NMA is then performed on this effective C-alpha based Hessian. In addition, users can provide their own atom selection (see \code{\link{atom.select}}) as the value of \code{outmodes} for customized output modes generation. When \code{reduced=TRUE}, only a selection of all heavy atoms is used to build the ENM. More specifically, three to five atoms per residue constitute the model. Here the N, CA, C atoms represent the protein backbone, and zero to two selected side chain atoms represent the side chain (selected based on side chain size and the distance to CA). This coarse-grained ENM has significantly improved computational efficiency and similar prediction accuracy with respect to the all-atom ENM. When \code{rtb=TRUE}, rotation-translation block (RTB) based approximate modes will be calculated. In this method, each residue is assumed to be a rigid body (or \sQuote{block}) that has only rotational and translational degrees of freedom. Intra-residue deformation is thus ignored. (See Durand et al 1994 and Tama et al. 2000 for more details). N residues per block is also supported, where N=1, 2, 3, etc. (See argument \code{nmer}). The RTB method has significantly improved computational efficiency and similar prediction accuracy with respect to the all-atom ENM. By default the function will diagonalize the mass-weighted Hessian matrix. The resulting mode vectors are moreover scaled by the thermal fluctuation amplitudes. } \examples{ \dontrun{ # All-atom NMA takes relatively long time - Don't run by default. ## Fetch stucture pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) ## Calculate all-atom normal modes modes.aa <- aanma(pdb, outmodes='noh') ## Calculate all-atom normal modes with RTB approximation modes.aa.rtb <- aanma(pdb, outmodes='noh', rtb=TRUE) ## Compare the two modes rmsip(modes.aa, modes.aa.rtb) ## Calculate C-alpha normal modes. modes <- aanma(pdb) ## Calculate C-alpha normal modes with reduced ENM. modes.cg <- aanma(pdb, reduced=TRUE) ## Calculate C-alpha normal modes with RTB approximation modes.rtb <- aanma(pdb, rtb=TRUE) ## Compare modes rmsip(modes, modes.cg) rmsip(modes, modes.rtb) ## Print modes print(modes) ## Plot modes plot(modes) ## Visualize modes #m7 <- mktrj.nma(modes, mode=7, file="mode_7.pdb", pdb=pdb) } } \author{ Lars Skjaerven & Xin-Qiu Yao } \references{ Hinsen, K. et al. (2000) \emph{Chem. Phys.} \bold{261}, 25. Durand, P. et al. (1994) \emph{Biopolymers} \bold{34}, 759. Tama, F. et al. (2000) \emph{Proteins} \bold{41}, 1. } \seealso{ \code{\link{nma.pdb}} for C-alpha based NMA, \code{\link{aanma.pdbs}} for ensemble all-atom NMA, \code{\link{load.enmff}} for available ENM force fields, and \code{\link{fluct.nma}}, \code{\link{mktrj.nma}}, and \code{\link{dccm.nma}} for various post-NMA calculations. } bio3d/man/rgyr.Rd0000644000176200001440000000334314046073105013302 0ustar liggesusers\name{rgyr} \alias{rgyr} \title{ Radius of Gyration} \description{ Calculate the radius of gyration of coordinate sets. } \usage{ rgyr(xyz, mass=NULL, ncore=1, nseg.scale=1) } \arguments{ \item{xyz}{ a numeric vector, matrix or list object with an \code{xyz} component, containing one or more coordinate sets.} \item{mass}{ a numeric vector of atomic masses (unit a.m.u.), or a PDB object with masses stored in the "B-factor" column. If \code{mass==NULL}, all atoms are assumed carbon.} \item{ncore }{ number of CPU cores used to do the calculation. \code{ncore>1} requires package \sQuote{parallel} installed. } \item{nseg.scale }{ split input data into specified number of segments prior to running multiple core calculation. See \code{\link{fit.xyz}}. } } \details{ Radius of gyration is a standard measure of overall structural change of macromolecules. } \value{ Returns a numeric vector of radius of gyration. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Xin-Qiu Yao & Pete Kekenes-Huskey} \seealso{ \code{\link{fit.xyz}}, \code{\link{rmsd}}, \code{\link{read.pdb}}, \code{\link{read.fasta.pdb}} } \examples{ \donttest{ # PDB server connection required - testing excluded # -- Calculate Rog of single structure pdb <- read.pdb("1bg2") mass <- rep(12, length(pdb$xyz)/3) mass[substr(pdb$atom[,"elety"], 1, 1) == "N"] <- 14 mass[substr(pdb$atom[,"elety"], 1, 1) == "H"] <- 1 mass[substr(pdb$atom[,"elety"], 1, 1) == "O"] <- 16 mass[substr(pdb$atom[,"elety"], 1, 1) == "S"] <- 32 rgyr(pdb, mass) } \dontrun{ # -- Calculate Rog of a trajectory xyz <- read.dcd(system.file("examples/hivp.dcd", package="bio3d")) rg <- rgyr(xyz) rg[1:10] } } \keyword{ utilities } bio3d/man/trim.mol2.Rd0000644000176200001440000000245614046073105014146 0ustar liggesusers\name{trim.mol2} \alias{trim.mol2} \title{ Trim a MOL2 Object To A Subset of Atoms. } \description{ Produce a new smaller MOL2 object, containing a subset of atoms, from a given larger MOL2 object. } \usage{ \method{trim}{mol2}(mol, \dots, inds = NULL) } \arguments{ \item{mol}{ a MOL2 structure object obtained from \code{\link{read.mol2}}. } \item{\dots}{ additional arguments passed to \code{\link{atom.select}}. If \code{inds} is also provided, these arguments will be ignored. } \item{inds}{ a list object of ATOM and XYZ indices as obtained from \code{\link{atom.select}}. If NULL, atom selection will be obtained from calling \code{atom.select(mol, \dots)}. } } \details{ This is a basic utility function for creating a new MOL2 object based on a selection of atoms. } \value{ Returns a list of class \code{"mol2"}. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{read.mol2}}, \code{\link{atom.select.mol2}}, \code{\link{as.pdb.mol2}}, \code{\link{write.mol2}}, } \examples{ \dontrun{ ## Read a MOL2 file from those included with the package mol <- read.mol2( system.file("examples/aspirin.mol2", package="bio3d")) ## Trim away H-atoms mol <- trim(mol, "noh") } } \keyword{ utilities } bio3d/man/community.aln.Rd0000644000176200001440000000663314046073105015121 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/community.aln.R \name{community.aln} \alias{community.aln} \title{Align communities from two or more networks} \usage{ community.aln(x, ..., aln = NULL) } \arguments{ \item{x, ...}{two or more objects of class \code{cna} (if the numbers of nodes are different, an alignment \sQuote{fasta} object is required for the \code{aln} argument; See below) as obtained from function \code{\link{cna}}. Alternatively, a list of \code{cna} objects can be given to \code{x}.} \item{aln}{alignment for comparing networks with different numbers of nodes.} } \value{ Returns a list of updated \code{cna} objects. } \description{ Find equivalent communities from two or more networks and re-assign colors to them in a consistent way across networks. A \sQuote{new.membership} vector is also generated for each network, which maps nodes to community IDs that are renumbered according to the community equivalency. } \details{ This function facilitates the inspection on the variance of the community partition in a group of similar networks. The original community numbering (and so the colors of communities in the output of \code{plot.cna} and \code{vmd.cna}) can be inconsistent across networks, i.e. equivalent communities may display different colors, impeding network comparison. The function calculates the dissimilarity between all communities and clusters communities with \sQuote{hclust} funciton. In each cluster, 0 or 1 community per network is included. The color attribute of communities is then re-assigned according to the clusters through all networks. In addition, a \sQuote{new.membership} vector is generated for each network, which mapps nodes to new community IDs that are numbered consistently across networks. } \examples{ \donttest{ # Needs MUSCLE installed - testing excluded if(check.utility("muscle")) { if (!requireNamespace("igraph", quietly = TRUE)) { message('Need igraph installed to run this example') } else { ## Fetch PDB files and split to chain A only PDB files ids <- c("1tnd_A", "1tag_A") files <- get.pdb(ids, split = TRUE, path = tempdir()) ## Sequence Alignement pdbs <- pdbaln(files, outfile = tempfile()) ## Normal mode analysis on aligned data modes <- nma(pdbs, rm.gaps=TRUE) ## Dynamic Cross Correlation Matrix cijs <- dccm(modes)$all.dccm ## Correlation Network nets <- cna(cijs, cutoff.cij=0.3) ## Align network communities nets.aln <- community.aln(nets) ## plot all-residue and coarse-grained (community) networks pdb <- pdbs2pdb(pdbs, inds=1, rm.gaps=TRUE)[[1]] op <- par(no.readonly=TRUE) # before alignment par(mar=c(0.1, 0.1, 0.1, 0.1), mfrow=c(2,2)) invisible( lapply(nets, function(x) plot(x, layout=layout.cna(x, pdb=pdb, k=3, full=TRUE)[, 1:2], full=TRUE)) ) invisible( lapply(nets, function(x) plot(x, layout=layout.cna(x, pdb=pdb, k=3)[, 1:2])) ) # after alignment par(mar=c(0.1, 0.1, 0.1, 0.1), mfrow=c(2,2)) invisible( lapply(nets.aln, function(x) plot(x, layout=layout.cna(x, pdb=pdb, k=3, full=TRUE)[, 1:2], full=TRUE)) ) invisible( lapply(nets.aln, function(x) plot(x, layout=layout.cna(x, pdb=pdb, k=3)[, 1:2])) ) par(op) } } } } \seealso{ \code{\link{cna}}, \code{\link{plot.cna}}, \code{\link{vmd.cna}} } \keyword{analysis} bio3d/man/fluct.nma.Rd0000644000176200001440000000220314046073105014200 0ustar liggesusers\name{fluct.nma} \alias{fluct.nma} \title{ NMA Fluctuations } \description{ Calculates the atomic fluctuations from normal modes analysis. } \usage{ fluct.nma(nma, mode.inds=NULL) } \arguments{ \item{nma}{ a list object of class \code{"nma"} (obtained with \code{\link{nma}}).} \item{mode.inds}{ a numeric vector containing the the mode numbers in which the calculation should be based. } } \details{ Atomic fluctuations are calculated based on the \code{nma} object. By default all modes are included in the calculation. See examples for more details. } \value{ Returns a numeric vector of atomic fluctuations. } \references{ Hinsen, K. et al. (2000) \emph{Chemical Physics} \bold{261}, 25--37. Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{nma} } } \examples{ ## Fetch stucture pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) ## Calculate (vibrational) normal modes modes <- nma(pdb) ## Fluctuations f <- fluct.nma(modes) ## Fluctuations of first non-trivial mode f <- fluct.nma(modes, mode.inds=c(7,8)) } \keyword{ analysis } bio3d/man/rmsd.Rd0000644000176200001440000000501614046073105013263 0ustar liggesusers\name{rmsd} \alias{rmsd} \title{ Root Mean Square Deviation } \description{ Calculate the RMSD between coordinate sets. } \usage{ rmsd(a, b=NULL, a.inds=NULL, b.inds=NULL, fit=FALSE, ncore=1, nseg.scale=1) } \arguments{ \item{a}{ a numeric vector containing the reference coordinate set for comparison with the coordinates in \code{b}. Alternatively, if \code{b=NULL} then \code{a} can be a matrix or list object containing multiple coordinates for pairwise comparison. } \item{b}{ a numeric vector, matrix or list object with an \code{xyz} component, containing one or more coordinate sets to be compared with \code{a}. } \item{a.inds }{ a vector of indices that selects the elements of \code{a} upon which the calculation should be based. } \item{b.inds }{ a vector of indices that selects the elements of \code{b} upon which the calculation should be based. } \item{fit }{logical, if TRUE coordinate superposition is performed prior to RMSD calculation. } \item{ncore }{ number of CPU cores used to do the calculation. \code{ncore>1} requires package \sQuote{parallel} installed. } \item{nseg.scale }{ split input data into specified number of segments prior to running multiple core calculation. See \code{\link{fit.xyz}}. } } \details{ RMSD is a standard measure of structural distance between coordinate sets. Structure \code{a[a.inds]} and \code{b[b.inds]} should have the same length. A least-squares fit is performed prior to RMSD calculation by setting \code{fit=TRUE}. See the function \code{fit.xyz} for more details of the fitting process. } \value{ Returns a numeric vector of RMSD value(s). } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \seealso{ \code{\link{fit.xyz}}, \code{\link{rot.lsq}}, \code{\link{read.pdb}}, \code{\link{read.fasta.pdb}} } \examples{ \donttest{ # Redundant testing excluded # -- Calculate RMSD between two or more structures aln <- read.fasta(system.file("examples/kif1a.fa",package="bio3d")) pdbs <- read.fasta.pdb(aln) # Gap positions inds <- gap.inspect(pdbs$xyz) # Superposition before pairwise RMSD rmsd(pdbs$xyz, fit=TRUE) # RMSD between structure 1 and structures 2 and 3 rmsd(a=pdbs$xyz[1,], b=pdbs$xyz[2:3,], a.inds=inds$f.inds, b.inds=inds$f.inds, fit=TRUE) # RMSD between structure 1 and all structures in alignment rmsd(a=pdbs$xyz[1,], b=pdbs, a.inds=inds$f.inds, b.inds=inds$f.inds, fit=TRUE) # RMSD without superposition rmsd(pdbs$xyz) } } \keyword{ utilities } bio3d/man/cnapath.Rd0000644000176200001440000001234614046073105013740 0ustar liggesusers\name{cnapath} \alias{cnapath} \alias{summary.cnapath} \alias{print.cnapath} \alias{plot.cnapath} \alias{plot.ecnapath} \title{ Suboptimal Path Analysis for Correlation Networks } \description{ Find k shortest paths between a pair of nodes, source and sink, in a correlation network. } \usage{ cnapath(cna, from, to=NULL, k=10, collapse=TRUE, ncore=NULL, \dots) \method{summary}{cnapath}(object, \dots, pdb = NULL, label = NULL, col = NULL, plot = FALSE, concise = FALSE, cutoff = 0.1, normalize = TRUE, weight = FALSE) \method{print}{cnapath}(x, \dots) \method{plot}{cnapath}(x, \dots) \method{plot}{ecnapath}(x, \dots) } \arguments{ \item{cna}{ A \sQuote{cna} object or a list of \sQuote{cna} objects obtained from \code{\link{cna}}. } \item{from}{ Integer vector or matrix indicating node id(s) of source. If is matrix and \code{to} is NULL, the first column represents source and the second sink. } \item{to}{ Integer vector indicating node id(s) of sink. All combinations of \code{from} and \code{to} values will be used as source/sink pairs. } \item{k}{ Integer, number of suboptimal paths to identify. } \item{collapse}{ Logical, if TRUE results from all source/sink pairs are merged with a single \sQuote{cnapath} object returned. } \item{ncore}{ Number of CPU cores used to do the calculation. By default (NULL), use all detected CPU cores. } \item{object}{ A \sQuote{cnapath} class of object obtained from \code{cnapath}. Multiple \sQuote{object} input is allowed for comparing paths from different networks. } \item{pdb}{ A \sQuote{pdb} class of object obtained from \code{\link{read.pdb}} and is used as the reference for node residue ids (in \code{summary.cnapath}) or for molecular visulaization with VMD (in \code{vmd.cnapath}). } \item{label}{ Character, label for paths identified from different networks. } \item{col}{ Colors for plotting statistical results for paths identified from different networks. } \item{plot}{ Logical, if TRUE path length distribution and node degeneracy will be plotted. } \item{concise}{ Logical, if TRUE only \sQuote{on path} residues will be displayed in the node degeneracy plot. } \item{cutoff}{ Numeric, nodes with node degeneracy larger than \code{cutoff} are shown in the output. } \item{normalize}{ Logical, if TRUE node degeneracy is divided by the total (weighted) number of paths. } \item{weight}{ Logical, if TRUE each path is weighted by path length in calculating the node degeneracty. } \item{x}{ A 'cnapath' class object, or a list of such objects, as obtained from function \code{cnapath}. } \item{\dots}{ Additional arguments passed to igraph function \code{\link[igraph:distances]{get.shortest.paths}} (in the function \code{cnapath}), passed to \code{summary.cnapath} (in \code{print.cnapath}), as additional paths for comparison (in \code{summary.cnapath}). } } \value{ The function \code{cnapath} returns a (or a list of) \sQuote{cnapath} class of list containing following three components: \item{path}{ a list object containing all identified suboptimal paths. Each entry of the list is a sequence of node ids for the path. } \item{epath}{ a list object containing all identified suboptimal paths. Each entry of the list is a sequence of edge ids for the path. } \item{dist}{ a numeric vector of all path lengths. } The function \code{summary.cnapath} returns a matrix of (normalized) node degeneracy for \sQuote{on path} residues. } \references{ Yen, J.Y. (1971) \emph{Management Science} \bold{17}, 712--716. } \author{ Xin-Qiu Yao } \seealso{ \code{\link{cna}}, \code{\link{cna.dccm}}, \code{\link{vmd.cna}}, \code{\link{vmd.cnapath}}, \code{\link[igraph:distances]{get.shortest.paths}}. } \examples{ \donttest{ # Redundant testing excluded if (!requireNamespace("igraph", quietly = TRUE)) { message('Need igraph installed to run this example') } else { attach(transducin) inds = match(c("1TND_A", "1TAG_A"), pdbs$id) npdbs <- trim(pdbs, row.inds=inds) gaps.res <- gap.inspect(npdbs$ali) modes <- nma(npdbs) cij <- dccm(modes) net <- cna(cij, cutoff.cij=0.3) # get paths pa1 <- cnapath(net[[1]], from = 314, to=172, k=50) pa2 <- cnapath(net[[2]], from = 314, to=172, k=50) # print the information of a path pa1 # print two paths simultaneously pas <- list(pa1, pa2) names(pas) <- c("GTP", "GDP") print.cnapath(pas) # Or, for the same effect, # summary(pa1, pa2, label=c("GTP", "GDP")) # replace node numbers with residue name and residue number in the PDB file pdb <- read.pdb("1tnd") pdb <- trim.pdb(pdb, atom.select(pdb, chain="A", resno=npdbs$resno[1, gaps.res$f.inds])) print.cnapath(pas, pdb=pdb) # plot path length distribution and node degeneracy print.cnapath(pas, pdb = pdb, col=c("red", "darkgreen"), plot=TRUE) # View paths in 3D molecular graphic with VMD #vmd.cnapath(pa1, pdb, launch = TRUE) #vmd.cnapath(pa1, pdb, colors = 7, launch = TRUE) #vmd.cnapath(pa1, pdb, spline=TRUE, colors=c("pink", "red"), launch = TRUE) #pdb2 <- read.pdb("1tag") #pdb2 <- trim.pdb(pdb2, atom.select(pdb2, chain="A", resno=npdbs$resno[2, gaps.res$f.inds])) #vmd.cnapath(pa2, pdb2, launch = TRUE) detach(transducin) } } } \keyword{ utilities } bio3d/man/pymol.Rd0000644000176200001440000001245014046073105013456 0ustar liggesusers\name{pymol} \alias{pymol} \alias{pymol.pdbs} \alias{pymol.nma} \alias{pymol.pca} \alias{pymol.modes} \alias{pymol.dccm} \title{ Biomolecular Visualization with PyMOL } \description{ Visualize Bio3D structure objects in PyMOL } \usage{ pymol(\dots) \method{pymol}{pdbs}(pdbs, col=NULL, as="ribbon", file=NULL, type="script", exefile="pymol", user.vec=NULL, \dots) \method{pymol}{nma}(\dots) \method{pymol}{pca}(\dots) \method{pymol}{modes}(modes, mode=NULL, file=NULL, scale=5, dual=FALSE, type="script", exefile="pymol", \dots) \method{pymol}{dccm}(dccm, pdb, file=NULL, step=0.2, omit=0.2, radius = 0.15, type="script", exefile="pymol", \dots) } \arguments{ \item{pdbs}{ aligned C-alpha Cartesian coordinates as obtained with \code{\link{read.fasta.pdb}} or \code{\link{pdbaln}}. } \item{col}{ a single element character vector specifying the coloring of the structures. Options are: \sQuote{index}, \sQuote{index2}, \sQuote{gaps}, \sQuote{rmsf}, \sQuote{user}. Special cases: Provide a \sQuote{core} object as obtained by \code{core.find} to color on the invariant core. Alternatively, provide a vector containing the color code for each structure in the \sQuote{pdbs} object. } \item{user.vec}{ User defined vector for coloring. Only used if \code{col="user"}. } \item{as}{ show as \sQuote{ribbon}, \sQuote{cartoon}, \sQuote{lines}, \sQuote{putty}. } \item{file}{ a single element character vector specifying the file name of the PyMOL session/script file. } \item{type}{ a single element character vector specifying the output type: \sQuote{script} generates a .pml script; \sQuote{session} generates a .pse session file; \sQuote{launch} launches pymol. } \item{exefile}{ file path to the \sQuote{PYMOL} program on your system (i.e. how is \sQuote{PYMOL} invoked). If \code{NULL}, use OS-dependent default path to the program. } \item{modes}{ an object of class \code{nma} or \code{pca} as obtained from functions \code{nma} or \code{pca.xyz}. } \item{mode}{ the mode number for which the vector field should be made. } \item{scale}{ global scaling factor. } \item{dual}{ logical, if TRUE mode vectors are also drawn in both direction. } \item{dccm}{ an object of class \code{dccm} as obtained from function \code{\link{dccm}}. } \item{pdb}{ an object of class \code{pdb} as obtained from function \code{read.pdb} or a numerical vector of Cartesian coordinates. } \item{step}{ binning interval of cross-correlation coefficents. } \item{omit}{ correlation coefficents with values (0-omit, 0+omit) will be omitted from visualization. } \item{radius}{ numeric, radius of visualized correlation cylinders in PyMol. Alternatively, a matrix with the same dimesions as \code{dccm} can be provided, e.g. to draw cylinders with radii associated to the pairwise correlation value. } \item{\dots}{ arguments passed to function \code{pymol.modes} for \sQuote{nma} and \sQuote{pca} objects. } } \details{ These functions provides a convenient approach for the visualization of Bio3D objects in PyMOL. See examples for more details. DCCM PyMOL visualization: This function generates a PyMOL (python) script that will draw colored lines between (anti)correlated residues. The PyMOL script file is stored in the working directory with filename \dQuote{R.py}. PyMOL will only be launched (and opened) when using argument \sQuote{type='launch'}. Alternatively a PDB file with CONECT records will be generated (when argument \code{type='pdb'}). For the PyMOL version, PyMOL CGO objects are generated - each object representing a range of correlation values (corresponding to the actual correlation values as found in the correlation matrix). E.g. the PyMOL object with name \dQuote{cor_-1_-08} would display all pairs of correlations with values between -1 and -0.8. NMA / PCA PyMOL vector field visualization: This function generates a PyMOL (python) script for drawing mode vectors on a PDB structure. The PyMOL script file is stored in the working directory with filename \dQuote{R.py}. } \value{ Called for its action } \references{ Skjaerven, L. et al. (2014) \emph{BMC Bioinformatics} \bold{15}, 399. Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{view} } \examples{ \dontrun{ ##- pymol with a 'pdbs' object attach(transducin) # build a pymol session containing all structures in the PDBs object pymol(pdbs) # color by invariant core ( # core <- core.find(pdbs) pymol(pdbs, col=core) # color by RMSF pymol(pdbs, col="rmsf") # color by a user defined vector # For example, colored by averaged contact density around each residue cm <- cmap(pdbs, binary=FALSE) vec <- rowSums(cm, na.rm=TRUE) pymol(pdbs, col="user", user.vec=vec) # color by clustering rd <- rmsd(pdbs$xyz) hc <- hclust(as.dist(rd)) grps <- cutree(hc, k=3) pymol(pdbs, col=grps) ##- pymol with a 'dccm' object ## Fetch stucture pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) ## Calculate normal modes modes <- nma(pdb) ## Calculate correlation matrix cm <- dccm.nma(modes) pymol(cm, modes$xyz) ##- pymol with a 'nma' or 'pca' object pymol(modes, mode=7) detach(transducin) } } bio3d/man/sse.bridges.Rd0000644000176200001440000000227014046073105014525 0ustar liggesusers\name{sse.bridges} \alias{sse.bridges} \title{ SSE Backbone Hydrogen Bonding } \description{ Determine backbone C=O to N-H hydrogen bonding in secondary structure elements. } \usage{ sse.bridges(sse, type="helix", hbond=TRUE, energy.cut=-1.0) } \arguments{ \item{sse}{ an sse object as obtained with \code{dssp}. } \item{type}{ character string specifying \sQuote{helix} or \sQuote{sheet}. } \item{hbond}{ use hbond records in the dssp output. } \item{energy.cut}{ cutoff for the dssp hbond energy. } } \details{ Simple functionality to parse the \sQuote{BP} and \sQuote{hbond} records of the DSSP output. Requires input from function \code{dssp} with arguments \code{resno=FALSE} and \code{full=TRUE}. } \value{ Returns a numeric matrix of two columns containing the residue ids of the paired residues. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{read.pdb}}, \code{\link{dssp}} } \examples{ \dontrun{ # Read a PDB file pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) sse <- dssp(pdb, resno=FALSE, full=TRUE) sse.bridges(sse, type="helix") } } \keyword{ utilities } bio3d/man/bounds.Rd0000644000176200001440000000263414046073105013613 0ustar liggesusers\name{bounds} \alias{bounds} \title{ Bounds of a Numeric Vector } \description{ Find the \sQuote{bounds} (i.e. start, end and length) of consecutive numbers within a larger set of numbers in a given vector. } \usage{ bounds(nums, dup.inds=FALSE, pre.sort=TRUE) } \arguments{ \item{nums}{ a numeric vector. } \item{dup.inds}{ logical, if TRUE the bounds of consecutive duplicated elements are returned. } \item{pre.sort}{ logical, if TRUE the input vector is ordered prior to bounds determination. } } \details{ This is a simple utility function useful for summarizing the contents of a numeric vector. For example: find the start position, end position and lengths of secondary structure elements given a vector of residue numbers obtained from a DSSP secondary structure prediction. By setting \sQuote{dup.inds} to TRUE then the indices of the first (start) and last (end) duplicated elements of the vector are returned. For example: find the indices of atoms belonging to a particular residue given a vector of residue numbers (see below). } \value{ Returns a three column matrix listing starts, ends and lengths. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \examples{ test <- c(seq(1,5,1),8,seq(10,15,1)) bounds(test) test <- rep(c(1,2,4), times=c(2,3,4)) bounds(test, dup.ind=TRUE) } \keyword{ utilities } bio3d/man/trim.xyz.Rd0000644000176200001440000000264514046073105014127 0ustar liggesusers\name{trim.xyz} \alias{trim.xyz} \title{ Trim a XYZ Object of Cartesian Coordinates. } \description{ Produce a new smaller XYZ object, containing a subset of atoms. } \usage{ \method{trim}{xyz}(xyz, row.inds = NULL, col.inds = NULL, \dots) } \arguments{ \item{xyz}{ a XYZ object containing Cartesian coordinates, e.g. obtained from \code{\link{read.pdb}}, \code{\link{read.ncdf}}. } \item{row.inds}{ a numeric vector specifying which rows of the xyz matrix to return. } \item{col.inds}{ a numeric vector specifying which columns of the xyz matrix to return. } \item{\dots}{ additional arguments passed to and from functions. } } \details{ This function provides basic functionality for subsetting a matrix of class \sQuote{xyz} while also maintaining the class attribute. } \value{ Returns an object of class \code{xyz} with the Cartesian coordinates stored in a matrix object with dimensions M x 3N, where N is the number of atoms, and M number of frames. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{read.pdb}}, \code{\link{as.xyz}}. } \examples{ \dontrun{ ## Read a PDB file from the RCSB online database pdb <- read.pdb("1bg2") ## Select calpha atoms sele <- atom.select(pdb, "calpha") ## Trim XYZ trim(pdb$xyz, col.inds=sele$xyz) ## Equals to pdb$xyz[, sele$xyz, drop=FALSE] } } \keyword{ utilities } bio3d/man/pairwise.Rd0000644000176200001440000000111214046073105014132 0ustar liggesusers\name{pairwise} \alias{pairwise} \title{ Pair Indices } \description{ A utility function to determine indices for pairwise comparisons. } \usage{ pairwise(N) } \arguments{ \item{N}{ a single numeric value representing the total number of things to undergo pairwise comparison. } } \value{ Returns a two column numeric matrix giving the indices for all pairs. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \seealso{ \code{\link{seqidentity}} } \examples{ pairwise(3) pairwise(20) } \keyword{ utilities } bio3d/man/atom2xyz.Rd0000644000176200001440000000123714046073105014114 0ustar liggesusers\name{atom2xyz} \alias{atom2xyz} \alias{xyz2atom} \title{ Convert Between Atom and xyz Indices } \description{ Basic functions to convert between xyz and their corresponding atom indices. } \usage{ atom2xyz(num) xyz2atom(xyz.ind) } \arguments{ \item{num}{ a numeric vector of atom indices. } \item{xyz.ind}{ a numeric vector of xyz indices. } } \value{ A numeric vector of either xyz or atom indices. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \seealso{ \code{\link{atom.select}}, \code{\link{read.pdb}} } \examples{ xyz.ind <- atom2xyz(c(1,10,15)) xyz2atom( xyz.ind ) } \keyword{ utilities } bio3d/man/print.core.Rd0000644000176200001440000000250114046073105014375 0ustar liggesusers\name{print.core} \alias{print.core} \title{ Printing Core Positions and Returning Indices } \description{ Print method for core.find objects. } \usage{ \method{print}{core}(x, vol = NULL, ...) } \arguments{ \item{x}{ a list object obtained with the function \code{\link{core.find}}. } \item{vol}{ the maximal cumulative volume value at which core positions are detailed. } \item{...}{ additional arguments to \sQuote{print}. } } \value{ Returns a three component list of indices: \item{atom}{atom indices of core positions} \item{xyz}{xyz indices of core positions} \item{resno}{residue numbers of core positions} } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \note{ The produced \code{\link{plot.core}} function can be useful for deciding on the core/non-core boundary. } \seealso{ \code{\link{core.find}}, \code{\link{plot.core}}} \examples{ \dontrun{ ##-- Generate a small kinesin alignment and read corresponding structures pdbfiles <- get.pdb(c("1bg2","2ncd","1i6i","1i5s"), URLonly=TRUE) pdbs <- pdbaln(pdbfiles) ##-- Find 'core' positions core <- core.find(pdbs) plot(core) ##-- Fit on these relatively invarient subset of positions core.inds <- print(core, vol=0.5) print(core, vol=0.7) print(core, vol=1.0) } } \keyword{ utilities } bio3d/man/is.gap.Rd0000644000176200001440000000364614046073105013506 0ustar liggesusers\name{is.gap} \alias{is.gap} \title{ Gap Characters } \description{ Test for the presence of gap characters. } \usage{ is.gap(x, gap.char = c("-", ".")) } \arguments{ \item{x}{ an R object to be tested. Typically a sequence vector or sequence/structure alignment object as returned from \code{seqaln}, \code{pdbaln} etc. } \item{gap.char}{ a character vector containing the gap character types to test for. } } \value{ Returns a logical vector with the same length as the input vector, or the same length as the number of columns present in an alignment input object \sQuote{x}. In the later case TRUE elements corresponding to \sQuote{gap.char} matches in any alignment column (i.e. gap containing columns). } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \note{ During alignment, gaps are introduced into sequences that are believed to have undergone deletions or insertions with respect to other sequences in the alignment. These gaps, often referred to as indels, can be represented with \sQuote{NA}, \sQuote{-} or \sQuote{.} characters. This function provides a simple test for the presence of such characters, or indeed any set of user defined characters set by the \sQuote{gap.char} argument. } \seealso{ \code{\link{gap.inspect}}, \code{\link{read.fasta}}, \code{\link{read.fasta.pdb}}, \code{\link{seqaln}}, \code{\link{pdbaln}} } \examples{ is.gap( c("G",".","X","-","G","K","S","T") ) \dontrun{ aln <- read.fasta( system.file("examples/kif1a.fa", package = "bio3d") ) ##- Print only non-gap positions (i.e. no gaps in any sequence) aln$ali[, !is.gap(aln) ] ##- Mask any existing gaps with an "X" xaln <- aln xaln$ali[ is.gap(xaln$ali) ]="X" ##- Read a new PDB and align its sequence to the existing masked alignment pdb <- read.pdb( "1mkj" ) seq2aln(pdbseq(pdb), xaln, id = "1mkj") } } \keyword{ utilities } bio3d/man/pdbs2sse.Rd0000644000176200001440000000473014046073105014045 0ustar liggesusers\name{pdbs2sse} \alias{pdbs2sse} \title{ SSE annotation for a PDBs Object } \description{ Returns secondary structure element (SSE) annotation (\code{"sse"} object) for a structure in the provided \code{"pdbs"} object. } \usage{ pdbs2sse(pdbs, ind = NULL, rm.gaps = TRUE, resno = TRUE, pdb = FALSE, \dots) } \arguments{ \item{pdbs}{ a list of class \code{"pdbs"} containing PDB file data, as obtained from \code{read.fasta.pdb} or \code{pdbaln}. } \item{ind}{ numeric index pointing to the PDB in which the SSE should be provided. If \code{ind=NULL}, then the consensus SSE is returned. } \item{rm.gaps}{ logical, if TRUE SSEs spanning gap containing columns are omitted from the output in the resulting \code{sse} object. } \item{resno}{ logical, if TRUE output is in terms of residue numbers rather than residue index (position in sequence). } \item{pdb}{ logical, if TRUE function \code{dssp} will be called on the corresponding \code{pdb} object rather than to use \code{pdbs$sse} to obtain the SSE object. } \item{\dots}{ arguments passed to function \code{dssp}. } } \details{ This function provides a \code{"sse"} list object containing secondary structure elements (SSE) annotation data for a particular structure in the provided \code{"pdbs"} object. Residue numbers are provided relative to the alignment in the \code{"pdbs"} object. When \code{ind=NULL} the function will attemt to return the consensus SSE annotation, i.e. where there are SSEs across all structures. This will only work SSE data is found in the \code{"pdbs"} object. See examples for more details. } \value{ Returns a list object of class \code{sse}. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{dssp}}, \code{\link{pdbaln}}, \code{\link{read.fasta.pdb}}. } \examples{ \dontrun{ attach(transducin) ## calculate RMSF rf <- rmsf(pdbs$xyz) ## Fetch SSE annotation, output in terms of alignment index sse <- pdbs2sse(pdbs, ind=1, rm.gaps=FALSE, resno=FALSE) ## Add SSE annotation to plot plotb3(rf, sse=sse) ## Calculate RMSF only for non-gap columns gaps.pos <- gap.inspect(pdbs$xyz) rf <- rmsf(pdbs$xyz[, gaps.pos$f.inds]) ## With gap columns removed, output in terms of residue number sse <- pdbs2sse(pdbs, ind=1, rm.gaps=TRUE, resno=TRUE) gaps.res <- gap.inspect(pdbs$ali) plotb3(rf, sse=sse, resno=pdbs$resno[1, gaps.res$f.inds]) detach(transducin) } } \keyword{ utilities } bio3d/man/nma.pdbs.Rd0000644000176200001440000001160314046073105014017 0ustar liggesusers\name{nma.pdbs} \alias{nma.pdbs} \alias{print.enma} \title{ Ensemble Normal Mode Analysis } \description{ Perform normal mode analysis (NMA) on an ensemble of aligned protein structures. } \usage{ \method{nma}{pdbs}(pdbs, fit = TRUE, full = FALSE, subspace = NULL, rm.gaps = TRUE, varweight=FALSE, outpath = NULL, ncore = 1, progress = NULL, \dots) \method{print}{enma}(x, \dots) } \arguments{ \item{pdbs}{ a numeric matrix of aligned C-alpha xyz Cartesian coordinates. For example an alignment data structure obtained with \code{\link{read.fasta.pdb}} or \code{\link{pdbaln}}. } \item{fit}{ logical, if TRUE coordinate superposition is performed prior to normal mode calculations. } \item{full}{ logical, if TRUE return the complete, full structure, \sQuote{nma} objects. } \item{subspace}{ number of eigenvectors to store for further analysis. } \item{rm.gaps}{ logical, if TRUE obtain the hessian matrices for only atoms in the aligned positions (non-gap positions in all aligned structures). Thus, gap positions are removed from output. } \item{varweight}{ logical, if TRUE perform weighing of the pair force constants. Alternatively, provide a NxN matrix containing the weights. See function \code{\link{var.xyz}}. } \item{outpath}{ character string specifing the output directory to which the PDB structures should be written. } \item{ncore }{ number of CPU cores used to do the calculation. \code{ncore>1} requires package \sQuote{parallel} installed. } \item{x}{ an \code{enma} object obtained from \code{\link{nma.pdbs}}. } \item{progress}{ progress bar for use with shiny web app. } \item{...}{ additional arguments to \code{nma}, \code{\link{aa2mass}}, and \code{\link{print}}. } } \details{ This function performs normal mode analysis (NMA) on a set of aligned protein structures obtained with function \code{\link{read.fasta.pdb}} or \code{\link{pdbaln}}. The main purpose is to provide aligned atomic fluctuations and mode vectors in an automated fashion. The normal modes are calculated on the full structures as provided by object \sQuote{pdbs}. With the input argument \sQuote{full=TRUE} the full \sQuote{nma} objects are returned together with output \sQuote{U.subs} providing the aligned mode vectors. When \sQuote{rm.gaps=TRUE} the unaligned atoms are ommited from output. With default arguments \sQuote{rmsip} provides RMSIP values for all pairwise structures. See examples for more details. } \value{ Returns an \sQuote{enma} object with the following components: \item{fluctuations }{ a numeric matrix containing aligned atomic fluctuations with one row per input structure. } \item{rmsip}{ a numeric matrix of pair wise RMSIP values (only the ten lowest frequency modes are included in the calculation). } \item{U.subspace }{ a three-dimensional array with aligned eigenvectors (corresponding to the subspace defined by the first N non-trivial eigenvectors (\sQuote{U}) of the \sQuote{nma} object). } \item{L}{ numeric matrix containing the raw eigenvalues with one row per input structure. } \item{xyz }{ an object of class \sQuote{xyz} containing the Cartesian coordinates in which the calculation was performed. Coordinates are superimposed to the first structure of the \code{pdbs} object when \sQuote{fit=TRUE}. } \item{full.nma }{ a list with a \code{nma} object for each input structure. } } \references{ Skjaerven, L. et al. (2014) \emph{BMC Bioinformatics} \bold{15}, 399. Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ For normal mode analysis on single structure PDB: \code{\link{nma.pdb}} For the analysis of the resulting \sQuote{eNMA} object: \code{\link{mktrj.enma}}, \code{\link{dccm.enma}}, \code{\link{plot.enma}}, \code{\link{cov.enma}}. Similarity measures: \code{\link{sip}}, \code{\link{covsoverlap}}, \code{\link{bhattacharyya}}, \code{\link{rmsip}}. Related functionality: \code{\link{pdbaln}}, \code{\link{read.fasta.pdb}}. } \examples{ \donttest{ # Needs MUSCLE installed - testing excluded if(check.utility("muscle")) { ## Fetch PDB files and split to chain A only PDB files ids <- c("1a70_A", "1czp_A", "1frd_A", "1fxi_A", "1iue_A", "1pfd_A") files <- get.pdb(ids, split = TRUE, path = tempdir()) ## Sequence Alignement pdbs <- pdbaln(files, outfile = tempfile()) ## Normal mode analysis on aligned data modes <- nma(pdbs, rm.gaps=FALSE) ## Plot fluctuation data plot(modes, pdbs=pdbs) ## Cluster on Fluctuation similariy sip <- sip(modes) hc <- hclust(dist(sip)) col <- cutree(hc, k=3) ## Plot fluctuation data plot(modes, pdbs=pdbs, col=col) ## Remove gaps from output modes <- nma(pdbs, rm.gaps=TRUE) ## RMSIP is pre-calculated heatmap(1-modes$rmsip) ## Bhattacharyya coefficient bc <- bhattacharyya(modes) heatmap(1-bc) } } } \keyword{ analysis } bio3d/man/read.pqr.Rd0000644000176200001440000001031414046073105014027 0ustar liggesusers\name{read.pqr} \alias{read.pqr} \title{ Read PQR File } \description{ Read a PQR coordinate file. } \usage{ read.pqr(file, maxlines = -1, multi = FALSE, rm.insert = FALSE, rm.alt = TRUE, verbose = TRUE) } \arguments{ \item{file}{ the name of the PQR file to be read. } \item{maxlines}{ the maximum number of lines to read before giving up with large files. By default if will read up to the end of input on the connection. } \item{multi}{ logical, if TRUE multiple ATOM records are read for all models in multi-model files. } \item{rm.insert}{ logical, if TRUE PDB insert records are ignored. } \item{rm.alt}{ logical, if TRUE PDB alternate records are ignored. } \item{verbose}{ print details of the reading process. } } \details{ PQR file format is basically the same as PDB format except for the fields of \code{o} and \code{b}. In PDB, these two fields are filled with \sQuote{Occupancy} and \sQuote{B-factor} values, respectively, with each field 6-column long. In PQR, they are atomic \sQuote{partial charge} and \sQuote{radii} values, respectively, with each field 8-column long. \code{maxlines} may require increasing for some large multi-model files. The preferred means of reading such data is via binary DCD format trajectory files (see the \code{\link{read.dcd}} function). } \value{ Returns a list of class \code{"pdb"} with the following components: \item{atom}{ a data.frame containing all atomic coordinate ATOM and HETATM data, with a row per ATOM/HETATM and a column per record type. See below for details of the record type naming convention (useful for accessing columns). } \item{helix }{ \sQuote{start}, \sQuote{end} and \sQuote{length} of H type sse, where start and end are residue numbers \dQuote{resno}. } \item{sheet }{ \sQuote{start}, \sQuote{end} and \sQuote{length} of E type sse, where start and end are residue numbers \dQuote{resno}. } \item{seqres }{ sequence from SEQRES field. } \item{xyz }{ a numeric matrix of class \code{"xyz"} containing the ATOM and HETATM coordinate data. } \item{calpha }{ logical vector with length equal to \code{nrow(atom)} with TRUE values indicating a C-alpha \dQuote{elety}. } \item{call }{ the matched call. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. For a description of PDB format (version3.3) see:\cr \url{http://www.wwpdb.org/documentation/format33/v3.3.html}. } \author{ Barry Grant } \note{ For both \code{atom} and \code{het} list components the column names can be used as a convenient means of data access, namely: Atom serial number \dQuote{eleno} , Atom type \dQuote{elety}, Alternate location indicator \dQuote{alt}, Residue name \dQuote{resid}, Chain identifier \dQuote{chain}, Residue sequence number \dQuote{resno}, Code for insertion of residues \dQuote{insert}, Orthogonal coordinates \dQuote{x}, Orthogonal coordinates \dQuote{y}, Orthogonal coordinates \dQuote{z}, Occupancy \dQuote{o}, and Temperature factor \dQuote{b}. See examples for further details. } \seealso{ \code{\link{atom.select}}, \code{\link{write.pqr}}, \code{\link{read.pdb}}, \code{\link{write.pdb}}, \code{\link{read.dcd}}, \code{\link{read.fasta.pdb}}, \code{\link{read.fasta}} } \examples{ \donttest{ # PDB server connection required - testing excluded # Read a PDB file and write it as a PQR file pdb <- read.pdb( "4q21" ) outfile = file.path(tempdir(), "eg.pqr") write.pqr(pdb=pdb, file = outfile) # Read the PQR file pqr <- read.pqr(outfile) ## Print a brief composition summary pqr ## Examine the storage format (or internal *str*ucture) str(pqr) ## Print data for the first four atom pqr$atom[1:4,] ## Print some coordinate data head(pqr$atom[, c("x","y","z")]) ## Print C-alpha coordinates (can also use 'atom.select' function) head(pqr$atom[pqr$calpha, c("resid","elety","x","y","z")]) inds <- atom.select(pqr, elety="CA") head( pqr$atom[inds$atom, ] ) ## The atom.select() function returns 'indices' (row numbers) ## that can be used for accessing subsets of PDB objects, e.g. inds <- atom.select(pqr,"ligand") pqr$atom[inds$atom,] pqr$xyz[inds$xyz] ## See the help page for atom.select() function for more details. } } \keyword{ IO } bio3d/man/aa.table.Rd0000644000176200001440000000232014046073105013760 0ustar liggesusers\name{aa.table} \alias{aa.table} \docType{data} \title{ Table of Relevant Amino Acids } \description{ This data set provides the atomic masses of a selection of amino acids regularly occuring in proteins. } \usage{ aa.table } \format{ A data frame with the following components. \describe{ \item{\code{aa3}}{a character vector containing three-letter amino acid code.} \item{\code{aa1}}{a character vector containing one-letter amino acid code.} \item{\code{mass}}{a numeric vector containing the mass of the respective amino acids. } \item{\code{formula}}{a character vector containing the formula of the amino acid in which the mass calculat was based. } \item{\code{name}}{a character vector containing the full names of the respective amino acids. } } } \seealso{ \code{\link{aa2mass}}, \code{\link{aa.index}}, \code{\link{atom.index}}, \code{\link{elements}}, } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \examples{ data(aa.table) aa.table ## table look up aa.table["HIS", ] ## read PDB, and fetch residue masses pdb <- read.pdb(system.file("examples/1hel.pdb", package="bio3d")) aa2mass(pdb) } \keyword{datasets} bio3d/man/write.pir.Rd0000644000176200001440000000456014046073105014244 0ustar liggesusers\name{write.pir} \alias{write.pir} \title{ Write PIR Formated Sequences } \description{ Write aligned or un-aligned sequences to a PIR format file. } \usage{ write.pir(alignment=NULL, ids=NULL, seqs=alignment$ali, pdb.file = NULL, chain.first = NULL, resno.first = NULL, chain.last = NULL, resno.last = NULL, file, append = FALSE) } \arguments{ \item{alignment}{ an alignment list object with \code{id} and \code{ali} components, similar to that generated by \code{\link{read.fasta}}. } \item{ids}{ a vector of sequence names to serve as sequence identifers } \item{seqs}{ an sequence or alignment character matrix or vector with a row per sequence } \item{pdb.file}{ a vector of pdb filenames; For sequence, provide "". } \item{chain.first}{ a vector of chain id for the first residue. } \item{resno.first}{ a vector of residue number for the first residue. } \item{chain.last}{ a vector of chain id for the last residue. } \item{resno.last}{ a vector of residue number for the last residue. } \item{file}{ name of output file. } \item{append}{ logical, if TRUE output will be appended to \code{file}; otherwise, it will overwrite the contents of \code{file}. } } \value{ Called for its effect. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Xin-Qiu Yao } \note{ PIR is required format for input alignment file to use Modeller. For a description of PIR format see: \url{https://salilab.org/modeller/manual/node488.html}. } \seealso{ \code{\link{read.fasta}}, \code{\link{read.fasta.pdb}}, \code{\link{write.fasta}} } \examples{ \donttest{ # Needs MUSCLE installed - testing excluded if(check.utility("muscle")) { ## Generate an input file for structural modeling of ## transducin G-alpha subunit using the template 3SN6_A ## Read transducin alpha subunit sequence seq <- get.seq("P04695", outfile = tempfile()) ## Read structure template path = tempdir() pdb.file <- get.pdb("3sn6_A", path = path, split = TRUE) pdb <- read.pdb(pdb.file) ## Build an alignment between template and target aln <- seqaln(seqbind(pdbseq(pdb), seq), id = c("3sn6_A", seq$id), outfile = tempfile()) ## Write PIR format alignment file outfile = file.path(tempdir(), "eg.pir") write.pir(aln, pdb.file = c(pdb.file, ""), file = outfile) invisible( cat("\nSee the output file:", outfile, sep = "\n") ) } } } \keyword{ IO } bio3d/man/atom.index.Rd0000644000176200001440000000142614046073105014365 0ustar liggesusers\name{atom.index} \alias{atom.index} \docType{data} \title{ Atom Names/Types } \description{ This data set gives for various atom names/types the corresponding atomic symbols. } \usage{ atom.index } \format{ A data frame with the following components. \describe{ \item{\code{name}}{a character vector containing atom names/types.} \item{\code{symb}}{a character vector containing atomic symbols.} } } \seealso{ \code{\link{elements}}, \code{\link{atom.index}}, \code{\link{atom2ele}} } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \examples{ data(atom.index) atom.index # Get the atomic symbol of some atoms atom.names <- c("CA", "O", "N", "OXT") atom.index[match(atom.names, atom.index$name), "symb"] } \keyword{datasets} bio3d/man/convert.pdb.Rd0000644000176200001440000000772514046073105014553 0ustar liggesusers\name{convert.pdb} \alias{convert.pdb} \title{Renumber and Convert Between Various PDB formats} \description{ Renumber and convert between CHARMM, Amber, Gromacs and Brookhaven PDB formats. } \usage{ convert.pdb(pdb, type=c("original", "pdb", "charmm", "amber", "gromacs"), renumber = FALSE, first.resno = 1, first.eleno = 1, consecutive=TRUE, rm.h = TRUE, rm.wat = FALSE, verbose=TRUE) } \arguments{ \item{pdb}{ a structure object of class \code{"pdb"}, obtained from \code{\link{read.pdb}}. } \item{type}{ output format, one of \sQuote{original}, \sQuote{pdb}, \sQuote{charmm}, \sQuote{amber}, or \sQuote{gromacs}. The default option of \sQuote{original} results in no conversion. } \item{renumber}{ logical, if TRUE atom and residue records are renumbered using \sQuote{first.resno} and \sQuote{first.eleno}. } \item{first.resno}{ first residue number to be used if \sQuote{renumber} is TRUE. } \item{first.eleno}{ first element number to be used if \sQuote{renumber} is TRUE. } \item{consecutive}{ logical, if TRUE renumbering will result in consecutive residue numbers spanning all chains. Otherwise new residue numbers will begin at \sQuote{first.resno} for each chain. } \item{rm.h}{ logical, if TRUE hydrogen atoms are removed. } \item{rm.wat}{ logical, if TRUE water atoms are removed. } \item{verbose}{ logical, if TRUE details of the conversion process are printed. } } \details{ Convert atom names and residue names, renumber atom and residue records, strip water and hydrogen atoms from \code{pdb} objects. Format \code{type} can be one of \dQuote{ori}, \dQuote{pdb}, \dQuote{charmm}, \dQuote{amber} or \dQuote{gromacs}. } \value{ Returns a list of class \code{"pdb"}, with the following components: \item{atom}{ a character matrix containing all atomic coordinate ATOM data, with a row per ATOM and a column per record type. See below for details of the record type naming convention (useful for accessing columns). } \item{het}{ a character matrix containing atomic coordinate records for atoms within \dQuote{non-standard} HET groups (see \code{atom}). } \item{helix}{ \sQuote{start}, \sQuote{end} and \sQuote{length} of H type sse, where start and end are residue numbers \dQuote{resno}. } \item{sheet}{ \sQuote{start}, \sQuote{end} and \sQuote{length} of E type sse, where start and end are residue numbers \dQuote{resno}. } \item{seqres }{ sequence from SEQRES field. } \item{xyz}{ a numeric vector of ATOM coordinate data. } \item{calpha}{ logical vector with length equal to \code{nrow(atom)} with TRUE values indicating a C-alpha \dQuote{elety}. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. For a description of PDB format (version3.3) see:\cr \url{http://www.wwpdb.org/documentation/format33/v3.3.html}. } \author{ Barry Grant } \note{ For both \code{atom} and \code{het} list components the column names can be used as a convenient means of data access, namely: Atom serial number \dQuote{eleno} , Atom type \dQuote{elety}, Alternate location indicator \dQuote{alt}, Residue name \dQuote{resid}, Chain identifier \dQuote{chain}, Residue sequence number \dQuote{resno}, Code for insertion of residues \dQuote{insert}, Orthogonal coordinates \dQuote{x}, Orthogonal coordinates \dQuote{y}, Orthogonal coordinates \dQuote{z}, Occupancy \dQuote{o}, and Temperature factor \dQuote{b}. See examples for further details. } \seealso{ \code{\link{atom.select}}, \code{\link{write.pdb}}, \code{\link{read.dcd}}, \code{\link{read.fasta.pdb}}, \code{\link{read.fasta}} } \examples{ \dontrun{ # Read a PDB file pdb <- read.pdb("4q21") pdb head( pdb$atom[pdb$calpha,"resno"] ) # Convert to CHARMM format new <- convert.pdb(pdb, type="amber", renumber=TRUE, first.resno=22 ) head( new$atom[new$calpha,"resno"] ) # Write a PDB file #write.pdb(new, file="tmp4amber.pdb") } } \keyword{ utilities } bio3d/man/dm.Rd0000644000176200001440000001162214046073105012716 0ustar liggesusers\name{dm} \alias{dm} \alias{dm.pdb} \alias{dm.xyz} \alias{dm.pdbs} \title{ Distance Matrix Analysis } \description{ Construct a distance matrix for a given protein structure. } \usage{ dm(\dots) \method{dm}{pdb}(pdb, inds = NULL, grp = TRUE, verbose=TRUE, \dots) \method{dm}{pdbs}(pdbs, rm.gaps=FALSE, all.atom=FALSE, aligned.atoms.only=NULL, \dots) \method{dm}{xyz}(xyz, grpby = NULL, scut = NULL, mask.lower = TRUE, gc.first=FALSE, ncore=1, \dots) } \arguments{ \item{pdb}{ a \code{pdb} structure object as returned by \code{\link{read.pdb}} or a numeric vector of \sQuote{xyz} coordinates.} \item{inds}{ atom and xyz coordinate indices obtained from \code{atom.select} that selects the elements of \code{pdb} upon which the calculation should be based. } \item{grp}{ logical, if TRUE atomic distances will be grouped according to their residue membership. See \sQuote{grpby}. } \item{verbose}{ logical, if TRUE possible warnings are printed. } \item{pdbs}{ a \sQuote{pdbs} object as returned by \code{\link{read.fasta.pdb}}, \code{\link{read.all}}, or \code{\link{pdbaln}}. } \item{rm.gaps}{ logical, if TRUE gapped positions are removed in the returned value. } \item{all.atom}{ logical, if TRUE all-atom coordinates from \code{\link{read.all}} are used. } \item{aligned.atoms.only}{ logical, if TRUE only equivalent (aligned) atoms are considered. Only meaningful when \code{all.atom=TRUE}. Default: FALSE. } \item{xyz}{ a numeric vector or matrix of Cartesian coordinates.} \item{grpby}{ a vector counting connective duplicated elements that indicate the elements of \code{xyz} that should be considered as a group (e.g. atoms from a particular residue). } \item{scut}{ a cutoff neighbour value which has the effect of excluding atoms, or groups, that are sequentially within this value.} \item{mask.lower}{ logical, if TRUE the lower matrix elements (i.e. those below the diagonal) are returned as NA.} \item{gc.first}{ logical, if TRUE will call gc() first before calculation of distance matrix. This is to solve the memory overload problem when \code{ncore > 1} and \code{xyz} has many rows/columns, with a bit sacrifice on speed. } \item{ncore }{ number of CPU cores used to do the calculation. \code{ncore>1} requires package \sQuote{parallel} installed. } \item{\dots}{ arguments passed to and from functions. } } \details{ Distance matrices, also called distance plots or distance maps, are an established means of describing and comparing protein conformations (e.g. Phillips, 1970; Holm, 1993). A distance matrix is a 2D representation of 3D structure that is independent of the coordinate reference frame and, ignoring chirality, contains enough information to reconstruct the 3D Cartesian coordinates (e.g. Havel, 1983). } \value{ Returns a numeric matrix of class \code{"dmat"}, with all N by N distances, where N is the number of selected atoms. With multiple frames the output is provided in a three dimensional array. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. Phillips (1970) \emph{Biochem. Soc. Symp.} \bold{31}, 11--28. Holm (1993) \emph{J. Mol. Biol.} \bold{233}, 123--138. Havel (1983) \emph{Bull. Math. Biol.} \bold{45}, 665--720. } \author{ Barry Grant } \note{ The input \code{selection} can be any character string or pattern interpretable by the function \code{\link{atom.select}}. For example, shortcuts \code{"calpha"}, \code{"back"}, \code{"all"} and selection strings of the form \code{/segment/chain/residue number/residue name/element number/element name/}; see \code{\link{atom.select}} for details. If a coordinate vector is provided as input (rather than a \code{pdb} object) the \code{selection} option is redundant and the input vector should be pruned instead to include only desired positions. } \seealso{ \code{\link{plot.dmat}}, \code{\link{read.pdb}}, \code{\link{atom.select}} } \examples{ \donttest{ # PDB server connection required - testing excluded ##--- Distance Matrix Plot pdb <- read.pdb( "4q21" ) k <- dm(pdb,inds="calpha") filled.contour(k, nlevels = 10) ## NOTE: FOLLOWING EXAMPLE NEEDS MUSCLE INSTALLED if(check.utility("muscle")) { ##--- DDM: Difference Distance Matrix # Downlaod and align two PDB files pdbs <- pdbaln( get.pdb( c( "4q21", "521p"), path = tempdir() ), outfile = tempfile() ) # Get distance matrix a <- dm.xyz(pdbs$xyz[1,]) b <- dm.xyz(pdbs$xyz[2,]) # Calculate DDM c <- a - b # Plot DDM plot(c,key=FALSE, grid=FALSE) plot(c, axis.tick.space=10, resnum.1=pdbs$resno[1,], resnum.2=pdbs$resno[2,], grid.col="black", xlab="Residue No. (4q21)", ylab="Residue No. (521p)") } } \dontrun{ ##-- Residue-wise distance matrix based on the ## minimal distance between all available atoms l <- dm.xyz(pdb$xyz, grpby=pdb$atom[,"resno"], scut=3) } } \keyword{ utilities } bio3d/man/aa123.Rd0000644000176200001440000000301114046073105013116 0ustar liggesusers\name{aa123} \alias{aa123} \alias{aa321} \title{ Convert Between 1-letter and 3-letter Aminoacid Codes } \description{ Convert between one-letter IUPAC aminoacid codes and three-letter PDB style aminoacid codes. } \usage{ aa123(aa) aa321(aa) } \arguments{ \item{aa}{ a character vector of individual aminoacid codes. } } \details{ Standard conversions will map \sQuote{A} to \sQuote{ALA}, \sQuote{G} to \sQuote{GLY}, etc. Non-standard codes in \code{aa} will generate a warning and return \sQuote{UNK} or \sQuote{X}. } \value{ A character vector of aminoacid codes. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. For a description of IUPAC one-letter codes see:\cr \url{http://www.insdc.org/documents/feature_table.html#7.4.3} For more information on PDB residue codes see:\cr \url{http://ligand-expo.rcsb.org/ld-search.html} } \author{ Barry Grant } \seealso{ \code{\link{read.pdb}}, \code{\link{read.fasta}}, \code{\link{pdbseq}} } \examples{ # Simple conversion aa123(c("D","L","A","G","S","H")) aa321(c("ASP", "LEU", "ALA", "GLY", "SER", "HIS")) \dontrun{ # Extract sequence from a PDB file's ATOM and SEQRES cards pdb <- read.pdb("1BG2") s <- aa321(pdb$seqres) # SEQRES a <- aa321(pdb$atom[pdb$calpha,"resid"]) # ATOM # Write both sequences to a fasta file write.fasta(alignment=seqbind(s,a), id=c("seqres","atom"), file="eg2.fa") # Alternative approach for ATOM sequence extraction pdbseq(pdb) pdbseq(pdb, aa1=FALSE ) } } \keyword{ utilities } bio3d/man/deformation.nma.Rd0000644000176200001440000000430414046073105015376 0ustar liggesusers\name{deformation.nma} \alias{deformation.nma} \title{ Deformation Analysis } \description{ Calculate deformation energies from Normal Mode Analysis. } \usage{ deformation.nma(nma, mode.inds = NULL, pfc.fun = NULL, ncore = NULL) } \arguments{ \item{nma}{ a list object of class \code{"nma"} (obtained with \code{\link{nma}}).} \item{mode.inds}{ a numeric vector of mode indices in which the calculation should be based. } \item{pfc.fun}{ customized pair force constant (\sQuote{pfc}) function. The provided function should take a vector of distances as an argument to return a vector of force constants. See \code{nma} for examples. } \item{ncore }{ number of CPU cores used to do the calculation. \code{ncore>1} requires package \sQuote{parallel} installed. } } \details{ Deformation analysis provides a measure for the amount of local flexibility of the protein structure - i.e. atomic motion relative to neighbouring atoms. It differs from \sQuote{fluctuations} (e.g. RMSF values) which provide amplitudes of the absolute atomic motion. Deformation energies are calculated based on the \code{nma} object. By default the first 20 non-trivial modes are included in the calculation. See examples for more details. } \value{ Returns a list with the following components: \item{ei }{ numeric matrix containing the energy contribution (E) from each atom (i; row-wise) at each mode index (column-wise). } \item{sums }{ deformation energies corresponding to each mode. } } \references{ Hinsen, K. (1998) \emph{Proteins} \bold{33}, 417--429. Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{nma} } } \examples{ \donttest{ # Running the example takes some time - testing excluded ## Fetch stucture pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) ## Calculate (vibrational) normal modes modes <- nma(pdb) ## Calculate deformation energies def.energies <- deformation.nma(modes) } \dontrun{ ## Fluctuations of first non-trivial mode def.energies <- deformation.nma(modes, mode.inds=seq(7, 16)) write.pdb(pdb=NULL, xyz=modes$xyz, b=def.energies$ei[,1]) } } \keyword{ analysis } bio3d/man/trim.pdb.Rd0000644000176200001440000000650514046073105014041 0ustar liggesusers\name{trim} \alias{trim} \alias{trim.pdb} \title{ Trim a PDB Object To A Subset of Atoms. } \description{ Produce a new smaller PDB object, containing a subset of atoms, from a given larger PDB object. } \usage{ trim(\dots) \method{trim}{pdb}(pdb, \dots, inds = NULL, sse = TRUE) } \arguments{ \item{pdb}{ a PDB structure object obtained from \code{\link{read.pdb}}. } \item{\dots}{ additional arguments passed to \code{\link{atom.select}}. If \code{inds} is also provided, these arguments will be ignored. } \item{inds}{ a list object of ATOM and XYZ indices as obtained from \code{\link{atom.select}}. If NULL, atom selection will be obtained from calling \code{atom.select(pdb, \dots)}. } \item{sse}{ logical, if \sQuote{FALSE} helix and sheet components are omitted from output. } } \details{ This is a basic utility function for creating a new PDB object based on a selection of atoms. } \value{ Returns a list of class \code{"pdb"} with the following components: \item{atom}{ a character matrix containing all atomic coordinate ATOM data, with a row per ATOM and a column per record type. See below for details of the record type naming convention (useful for accessing columns). } \item{het }{ a character matrix containing atomic coordinate records for atoms within \dQuote{non-standard} HET groups (see \code{atom}). } \item{helix }{ \sQuote{start}, \sQuote{end} and \sQuote{length} of H type sse, where start and end are residue numbers \dQuote{resno}. } \item{sheet }{ \sQuote{start}, \sQuote{end} and \sQuote{length} of E type sse, where start and end are residue numbers \dQuote{resno}. } \item{seqres }{ sequence from SEQRES field. } \item{xyz }{ a numeric vector of ATOM coordinate data. } \item{xyz.models }{ a numeric matrix of ATOM coordinate data for multi-model PDB files. } \item{calpha }{ logical vector with length equal to \code{nrow(atom)} with TRUE values indicating a C-alpha \dQuote{elety}. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. For a description of PDB format (version3.3) see:\cr \url{http://www.wwpdb.org/documentation/format33/v3.3.html}. . } \author{ Barry Grant, Lars Skjaerven } \note{ \code{het} and \code{seqres} list components are returned unmodified. For both \code{atom} and \code{het} list components the column names can be used as a convenient means of data access, namely: Atom serial number \dQuote{eleno}, Atom type \dQuote{elety}, Alternate location indicator \dQuote{alt}, Residue name \dQuote{resid}, Chain identifier \dQuote{chain}, Residue sequence number \dQuote{resno}, Code for insertion of residues \dQuote{insert}, Orthogonal coordinates \dQuote{x}, Orthogonal coordinates \dQuote{y}, Orthogonal coordinates \dQuote{z}, Occupancy \dQuote{o}, and Temperature factor \dQuote{b}. See examples for further details. } \seealso{ \code{\link{trim.pdbs}}, \code{\link{trim.xyz}}, \code{\link{read.pdb}}, \code{\link{atom.select}} } \examples{ \dontrun{ ## Read a PDB file from the RCSB online database pdb <- read.pdb("1bg2") ## Select calpha atoms sele <- atom.select(pdb, "calpha") ## Trim PDB new.pdb <- trim.pdb(pdb, inds=sele) ## Or, simply #new.pdb <- trim.pdb(pdb, "calpha") ## Write to file write.pdb(new.pdb, file="calpha.pdb") } } \keyword{ utilities } bio3d/man/print.xyz.Rd0000644000176200001440000000137614046073105014310 0ustar liggesusers\name{print.xyz} \alias{print.xyz} \title{ Printing XYZ coordinates } \description{ Print method for objects of class \sQuote{xyz}. } \usage{ \method{print}{xyz}(x, ...) } \arguments{ \item{x}{ a \sQuote{xyz} object indicating 3-D coordinates of biological molecules. } \item{\dots}{ additional arguments passed to \sQuote{print}. } } \value{ Called for its effect. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696.} \author{ Barry Grant } \seealso{ \code{\link{is.xyz}}, \code{\link{read.ncdf}}, \code{\link{read.pdb}}, \code{\link{read.dcd}}, \code{\link{fit.xyz}} } \examples{ # Read a PDB file pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) print(pdb$xyz) } \keyword{ utilities } bio3d/man/difference.vector.Rd0000644000176200001440000000306614046073105015714 0ustar liggesusers\name{difference.vector} \alias{difference.vector} \title{ Difference Vector } \description{ Define a difference vector between two conformational states. } \usage{ difference.vector(xyz, xyz.inds=NULL, normalize=FALSE) } \arguments{ \item{xyz}{ numeric matrix of Cartesian coordinates with a row per structure. } \item{xyz.inds}{ a vector of indices that selects the elements of columns upon which the calculation should be based. } \item{normalize}{ logical, if TRUE the difference vector is normalized. } } \details{ Squared overlap (or dot product) is used to measure the similiarity between a displacement vector (e.g. a difference vector between two conformational states) and mode vectors obtained from principal component or normal modes analysis. } \value{ Returns a numeric vector of the structural difference (normalized if desired). } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{overlap}} } \examples{ attach(kinesin) # Ignore gap containing positions gaps.pos <- gap.inspect(pdbs$xyz) #-- Do PCA pc.xray <- pca.xyz(pdbs$xyz[, gaps.pos$f.inds]) # Define a difference vector between two structural states diff.inds <- c(grep("d1v8ka", pdbs$id), grep("d1goja", pdbs$id)) ## Calculate the difference vector dv <- difference.vector( pdbs$xyz[diff.inds,], gaps.pos$f.inds ) # Calculate the squared overlap between the PCs and the difference vector o <- overlap(pc.xray, dv) detach(kinesin) } \keyword{ utilities } bio3d/man/layout.cna.Rd0000644000176200001440000000444514046073105014400 0ustar liggesusers\name{layout.cna} \alias{layout.cna} \title{ Protein Structure Network Layout } \description{ Determine protein structure network layout in 2D and 3D from the geometric center of each community. } \usage{ layout.cna(x, pdb, renumber=TRUE, k=2, full=FALSE) } \arguments{ \item{x}{ A protein structure network object as obtained from the \sQuote{cna} function. } \item{pdb}{ A pdb class object as obtained from the \sQuote{read.pdb} function. } \item{renumber}{ Logical, if TRUE the input \sQuote{pdb} will be re-numbered starting at residue number one before community coordinate averages are calculated. } \item{k}{ A single element numeric vector between 1 and 3 specifying the returned coordinate dimensions. } \item{full}{ Logical, if TRUE the full all-Calpha atom network coordinates will be returned rather than the default clustered network community coordinates. } } \details{ This function calculates the geometric center for each community from the atomic position of it's Calpha atoms taken from a corresponding PDB file. Care needs to be taken to ensure the PDB residue numbers and the community vector names/length match. The community residue membership are typically taken from the input network object but can be supplied as a list object with 'x$communities$membership'. } \value{ A numeric matrix of Nxk, where N is the number of communities and k the number of dimensions requested. } \author{ Guido Scarabelli and Barry Grant } \seealso{ \code{\link{plot.cna}}, \code{\link[igraph:communities]{plot.communities}}, \code{\link[igraph:plot.common]{igraph.plotting}}, \code{\link[igraph:plot.igraph]{plot.igraph}}} \examples{ if (!requireNamespace("igraph", quietly = TRUE)) { message('Need igraph installed to run this example') } else { # Load the correlation network attach(hivp) # Read the starting PDB file to determine atom correspondence pdbfile <- system.file("examples/hivp.pdb", package="bio3d") pdb <- read.pdb(pdbfile) # Plot will be slow #xy <- plot.cna(net) #plot3d.cna(net, pdb) layout.cna(net, pdb, k=3) layout.cna(net, pdb) # can be used as input to plot.cna and plot3d.cna.... # plot.cna( net, layout=layout.cna(net, pdb) ) # plot3d.cna(net, pdb, layout=layout.cna(net, pdb, k=3)) detach(hivp) } } \keyword{ utility } bio3d/man/read.crd.Rd0000644000176200001440000000327114046073105014001 0ustar liggesusers\name{read.crd} \alias{read.crd} \title{ Read Coordinate Data from Amber or Charmm } \description{ Read a CHARMM CARD (CRD) or AMBER coordinate file. } \usage{ read.crd(file, ...) } \arguments{ \item{file}{ the name of the coordinate file to be read. } \item{\dots}{ additional arguments passed to the methods \code{read.crd.charmm} or \code{read.crd.amber}. } } \details{ \code{read.crd} is a generic function calling the corresponding function determined by the class of the input argument \code{x}. Use \code{methods("read.crd")} to get all the methods for \code{read.crd} generic: \code{\link{read.crd.charmm}} will be used for file extension \sQuote{.crd}. \code{\link{read.crd.amber}} will be used for file extension \sQuote{.rst} or \sQuote{.inpcrd}. See examples for each corresponding function for more details. } \value{ See the \sQuote{value} section for the corresponding functions for more details. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant and Lars Skjaerven} \seealso{ \code{\link{read.crd.amber}}, \code{\link{read.crd.charmm}}, \code{\link{write.crd}}, \code{\link{read.prmtop}}, \code{\link{read.pdb}}, \code{\link{write.pdb}}, \code{\link{atom.select}}, \code{\link{read.dcd}}, \code{\link{read.ncdf}} } \examples{ \dontrun{ ## Read a PRMTOP file prmtop <- read.prmtop(system.file("examples/crambin.prmtop", package="bio3d")) print(prmtop) ## Read a Amber CRD file crds <- read.crd(system.file("examples/crambin.inpcrd", package="bio3d")) ## Atom selection ca.inds <- atom.select(prmtop, "calpha") ## Convert to PDB format pdb <- as.pdb(prmtop, crds, inds=ca.inds) } } \keyword{ IO } bio3d/man/pca.Rd0000644000176200001440000000345314046073105013064 0ustar liggesusers\name{pca} \alias{pca} \title{ Principal Component Analysis } \description{ Performs principal components analysis (PCA) on biomolecular structure data. } \usage{ pca(...) } \arguments{ \item{\dots}{ arguments passed to the methods \code{pca.xyz}, \code{pca.pdbs}, etc. Typically this includes either a numeric matrix of Cartesian coordinates with a row per structure/frame (function \code{pca.xyz()}), or an object of class \code{pdbs} as obtained from function \code{pdbaln} or \code{read.fasta.pdb} (function \code{pca.pdbs()}). } } \details{ Principal component analysis can be performed on any structure dataset of equal or unequal sequence composition to capture and characterize inter-conformer relationships. This generic \code{pca} function calls the corresponding methods function for actual calculation, which is determined by the class of the input argument \code{x}. Use \code{methods("pca")} to list all the current methods for \code{pca} generic. These will include: \code{\link{pca.xyz}}, which will be used when \code{x} is a numeric matrix containing Cartesian coordinates (e.g. trajectory data). \code{\link{pca.pdbs}}, which will perform PCA on the Cartesian coordinates of a input \code{pdbs} object (as obtained from the \sQuote{read.fasta.pdb} or \sQuote{pdbaln} functions). Currently, function \code{\link{pca.tor}} should be called explicitly as there are currently no defined \sQuote{tor} object classes. See the documentation and examples for each individual function for more details and worked examples. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant, Lars Skjaerven } \seealso{ \code{\link{pca.xyz}}, \code{\link{pca.pdbs}}, \code{\link{pdbaln}}. } \keyword{ utilities } bio3d/man/pdb2sse.Rd0000644000176200001440000000175014046073105013661 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pdb2sse.R \name{pdb2sse} \alias{pdb2sse} \title{Obtain An SSE Sequence Vector From A PDB Object} \usage{ pdb2sse(pdb, verbose = TRUE) } \arguments{ \item{pdb}{an object of class \code{pdb} as obtained from function \code{\link{read.pdb}}.} \item{verbose}{logical, if TRUE warnings and other messages will be printed.} } \value{ a character vector indicating SSE elements for each amino acide residue. The 'names' attribute of the vector contains 'resno', 'chain', 'insert', and 'SSE segment number', seperated by the character '_'. } \description{ Results are similar to that returned by stride(pdb)$sse and dssp(pdb)$sse. } \details{ call for its effects. } \examples{ \donttest{ #PDB server connection required - testing excluded pdb <- read.pdb("1a7l") sse <- pdb2sse(pdb) sse } } \author{ Barry Grant & Xin-Qiu Yao } \seealso{ \code{\link{dssp}}, \code{\link{stride}}, \code{\link{bounds.sse}} } bio3d/man/atom.select.Rd0000644000176200001440000001706514046073105014543 0ustar liggesusers\name{atom.select} \alias{atom.select} \alias{atom.select.pdb} \alias{atom.select.pdbs} \alias{atom.select.mol2} \alias{atom.select.prmtop} \alias{print.select} \title{ Atom Selection from PDB and PRMTOP Structure Objects } \description{ Return the \sQuote{atom} and \sQuote{xyz} coordinate indices of \sQuote{pdb} or \sQuote{prmtop} structure objects corresponding to the intersection of a hierarchical selection. } \usage{ atom.select(\dots) \method{atom.select}{pdb}(pdb, string = NULL, type = NULL, eleno = NULL, elety = NULL, resid = NULL, chain = NULL, resno = NULL, insert = NULL, segid = NULL, operator = "AND", inverse = FALSE, value = FALSE, verbose=FALSE, \dots) \method{atom.select}{pdbs}(pdbs, string = NULL, resno = NULL, chain = NULL, resid = NULL, operator="AND", inverse = FALSE, value = FALSE, verbose=FALSE, \dots) \method{atom.select}{mol2}(mol, string=NULL, eleno = NULL, elena = NULL, elety = NULL, resid = NULL, chain = NULL, resno = NULL, statbit = NULL, operator = "AND", inverse = FALSE, value = FALSE, verbose=FALSE, \dots) \method{atom.select}{prmtop}(prmtop, ...) \method{print}{select}(x, \dots) } \arguments{ \item{\dots}{ arguments passed to \code{atom.select.pdb}, \code{atom.select.prmtop}, or \code{print}. } \item{pdb}{ a structure object of class \code{"pdb"}, obtained from \code{\link{read.pdb}}. } \item{pdbs}{ a numeric matrix of aligned C-alpha xyz Cartesian coordinates as obtained with \code{\link{read.fasta.pdb}} or \code{\link{pdbaln}}. } \item{string}{ a single selection keyword from \code{calpha} \code{cbeta} \code{backbone} \code{sidechain} \code{protein} \code{nucleic} \code{ligand} \code{water} \code{h} or \code{noh}. } \item{type}{ a single element character vector for selecting \sQuote{ATOM} or \sQuote{HETATM} record types. } \item{eleno}{ a numeric vector of element numbers. } \item{elena}{ a character vector of atom names. } \item{elety}{ a character vector of atom names. } \item{resid}{ a character vector of residue name identifiers. } \item{chain}{ a character vector of chain identifiers. } \item{resno}{ a numeric vector of residue numbers. } \item{insert}{ a character vector of insert identifiers. Non-insert residues can be selected with \code{NA} or \sQuote{} values. The default value of \code{NULL} will select both insert and non-insert residues. } \item{segid}{ a character vector of segment identifiers. Empty segid values can be selected with \code{NA} or \sQuote{} values. The default value of \code{NULL} will select both empty and non-empty segment identifiers. } \item{operator}{ a single element character specifying either the AND or OR operator by which individual selection components should be combined. Allowed values are \sQuote{"AND"} and \sQuote{"OR"}. } \item{verbose}{ logical, if TRUE details of the selection are printed. } \item{inverse}{ logical, if TRUE the inversed selection is retured (i.e. all atoms NOT in the selection). } \item{value}{ logical, if FALSE, vectors containing the (integer) indices of the matches determined by \code{atom.select} are returned, and if TRUE, a \code{pdb} object containing the matching atoms themselves is returned. } \item{mol}{ a structure object of class \code{"mol2"}, obtained from \code{\link{read.mol2}}. } \item{statbit}{ a character vector of statbit identifiers. } \item{prmtop}{ a structure object of class \code{"prmtop"}, obtained from \code{\link{read.prmtop}}. } \item{x}{ a atom.select object as obtained from \code{\link{atom.select}}. } } \details{ This function allows for the selection of atom and coordinate data corresponding to the intersection of various input criteria. Input selection criteria include selection \code{string} keywords (such as \code{"calpha"}, \code{"backbone"}, \code{"sidechain"}, \code{"protein"}, \code{"nucleic"}, \code{"ligand"}, etc.) and individual named selection components (including \sQuote{chain}, \sQuote{resno}, \sQuote{resid}, \sQuote{elety} etc.). For example, \code{atom.select(pdb, "calpha")} will return indices for all C-alpha (CA) atoms found in protein residues in the \code{pdb} object, \code{atom.select(pdb, "backbone")} will return indices for all protein N,CA,C,O atoms, and \code{atom.select(pdb, "cbeta")} for all protein N,CA,C,O,CB atoms. Note that keyword \code{string} shortcuts can be combined with individual selection components, e.g. \code{atom.select(pdb, "protein", chain="A")} will select all protein atoms found in chain A. Selection criteria are combined according to the provided \code{operator} argument. The default operator \code{AND} (or \code{&}) will combine by intersection while \code{OR} (or \code{|}) will take the union. For example, \code{atom.select(pdb, "protein", elety=c("N", "CA", "C"), resno=65:103)} will select the N, CA, C atoms in the protein residues 65 through 103, while \code{atom.select(pdb, "protein", resid="ATP", operator="OR")} will select all protein atoms as well as any ATP residue(s). Other \code{string} shortcuts include: \code{"calpha"}, \code{"back"}, \code{"backbone"}, \code{"cbeta"}, \code{"protein"}, \code{"notprotein"}, \code{"ligand"}, \code{"water"}, \code{"notwater"}, \code{"h"}, \code{"noh"}, \code{"nucleic"}, and \code{"notnucleic"}. In addition, the \code{\link{combine.select}} function can further combine atom selections using \sQuote{AND}, \sQuote{OR}, or \sQuote{NOT} logical operations. } \note{ Protein atoms are defined as any atom in a residue matching the residue name in the attached \code{aa.table} data frame. See \code{aa.table$aa3} for a complete list of residue names. Nucleic atoms are defined as all atoms found in residues with names A, U, G, C, T, I, DA, DU, DG, DC, DT, or DI. Water atoms/residues are defined as those with residue names H2O, OH2, HOH, HHO, OHH, SOL, WAT, TIP, TIP, TIP3, or TIP4. } \value{ Returns a list of class \code{"select"} with the following components: \item{atom}{ a numeric matrix of atomic indices. } \item{xyz }{ a numeric matrix of xyz indices. } \item{call }{ the matched call. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant, Lars Skjaerven } \seealso{ \code{\link{read.pdb}}, \code{\link{as.select}}, \code{\link{combine.select}}, \code{\link{trim.pdb}}, \code{\link{write.pdb}}, \code{\link{read.prmtop}}, \code{\link{read.crd}}, \code{\link{read.dcd}}, \code{\link{read.ncdf}}. } \examples{ ##- PDB example # Read a PDB file pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) # Select protein atoms of chain A atom.select(pdb, "protein", chain="A") # Select all atoms except from the protein atom.select(pdb, "protein", inverse=TRUE, verbose=TRUE) # Select all C-alpha atoms with residues numbers between 43 and 54 sele <- atom.select(pdb, "calpha", resno=43:54, verbose=TRUE) # Access the PDB data with the selection indices print( pdb$atom[ sele$atom, "resid" ] ) print( pdb$xyz[ sele$xyz ] ) # Trim PDB to selection ca.pdb <- trim.pdb(pdb, sele) \dontrun{ ##- PRMTOP example prmtop <- read.prmtop(system.file("examples/crambin.prmtop", package="bio3d")) ## Atom selection ca.inds <- atom.select(prmtop, "calpha") } } \keyword{utilities} bio3d/man/gnm.Rd0000644000176200001440000001012414046073105013073 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/gnm.R, R/gnm.pdbs.R \name{gnm} \alias{gnm} \alias{gnm.pdb} \alias{gnm.pdbs} \title{Gaussian Network Model} \usage{ gnm(x, ...) \method{gnm}{pdb}(x, inds = NULL, temp = 300, keep = NULL, outmodes = NULL, gamma = 1, cutoff = 8, check.connect = TRUE, ...) \method{gnm}{pdbs}(x, fit = TRUE, full = FALSE, subspace = NULL, rm.gaps = TRUE, gc.first = TRUE, ncore = NULL, ...) } \arguments{ \item{x}{an object of class \code{pdb} as obtained from function \code{\link{read.pdb}}.} \item{...}{(in \code{gnm.pdbs}) additional arguments passed to \code{gnm.pdb}.} \item{inds}{atom and xyz coordinate indices obtained from \code{\link{atom.select}} that selects the elements of \code{pdb} upon which the calculation should be based. If not provided the function will attempt to select all calpha atoms automatically.} \item{temp}{numerical, temperature for which the amplitudes for scaling the atomic displacement vectors are calculated. Set \sQuote{temp=NULL} to avoid scaling.} \item{keep}{numerical, final number of modes to be stored. Note that all subsequent analyses are limited to this subset of modes. This option is useful for very large structures and cases where memory may be limited.} \item{outmodes}{atom indices as obtained from \code{\link{atom.select}} specifying the atoms to include in the resulting mode object.} \item{gamma}{numerical, global scale of the force constant.} \item{cutoff}{numerical, distance cutoff for pair-wise interactions.} \item{check.connect}{logical, if TRUE check chain connectivity.} \item{fit}{logical, if TRUE C-alpha coordinate based superposition is performed prior to normal mode calculations.} \item{full}{logical, if TRUE return the complete, full structure, \sQuote{nma} objects.} \item{subspace}{number of eigenvectors to store for further analysis.} \item{rm.gaps}{logical, if TRUE obtain the hessian matrices for only atoms in the aligned positions (non-gap positions in all aligned structures). Thus, gap positions are removed from output.} \item{gc.first}{logical, if TRUE will call gc() first before mode calculation for each structure. This is to avoid memory overload when \code{ncore > 1}.} \item{ncore}{number of CPU cores used to do the calculation.} } \value{ Returns an object of class \sQuote{gnm} with the following components: \item{force.constants}{ numeric vector containing the force constants corresponding to each mode. } \item{fluctuations}{ numeric vector of atomic fluctuations. } \item{U}{ numeric matrix with columns containing the raw eigenvectors. } \item{L}{ numeric vector containing the raw eigenvalues. } \item{xyz}{ numeric matrix of class \code{xyz} containing the Cartesian coordinates in which the calculation was performed. } \item{temp}{ numerical, temperature for which the amplitudes for scaling the atomic displacement vectors are calculated. } \item{triv.modes}{ number of trivial modes. } \item{natoms}{ number of C-alpha atoms. } \item{call}{ the matched call. } } \description{ Perform Gaussian network model (GNM) based normal mode analysis (NMA) for a protein structure. } \details{ This function builds a Gaussian network model (an isotropic elastic network model) for C-alpha atoms and performs subsequent normal mode analysis (NMA). The model employs a distance cutoff for the network construction: Atom pairs with distance falling within the cutoff have a harmonic interaction with a uniform force constant; Otherwise atoms have no interaction. Output contains N-1 (N, the number of residues) non-trivial modes (i.e. the degree of freedom is N-1), which can then be used to calculate atomic fluctuations and covariance. } \examples{ ## Fetch stucture pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) ## Calculate normal modes modes <- gnm(pdb) ## Print modes print(modes) ## Plot modes plot(modes) } \author{ Xin-Qiu Yao & Lars Skjaerven } \references{ Bahar, I. et al. (1997) \emph{Folding Des.} \bold{2}, 173. } \seealso{ \code{\link{gnm.pdbs}} } bio3d/man/write.ncdf.Rd0000644000176200001440000000365114046077017014372 0ustar liggesusers\name{write.ncdf} \alias{write.ncdf} \title{ Write AMBER Binary netCDF files } \description{ Write coordinate data to a binary netCDF trajectory file. } \usage{ write.ncdf(x, trjfile = "R.ncdf", cell = NULL) } \arguments{ \item{x}{ A numeric matrix of xyz coordinates with a frame/structure per row and a Cartesian coordinate per column. } \item{trjfile}{ name of the output trajectory file. } \item{cell}{ A numeric matrix of cell information with a frame/structure per row and a cell length or angle per column. If NULL cell will not be written. } } \details{ Writes an AMBER netCDF (Network Common Data Form) format trajectory file with the help of David W. Pierce's (UCSD) ncdf4 package available from CRAN. } \value{ Called for its effect. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. \url{https://www.unidata.ucar.edu/software/netcdf/} \url{https://cirrus.ucsd.edu/~pierce/ncdf/} \url{https://ambermd.org/FileFormats.php#netcdf} } \author{ Barry Grant } \note{ See AMBER documentation for netCDF format description. NetCDF binary trajectory files are supported by the AMBER modules sander, pmemd and ptraj. Compared to formatted trajectory files, the binary trajectory files are smaller, higher precision and significantly faster to read and write. NetCDF provides for file portability across architectures, allows for backwards compatible extensibility of the format and enables the files to be self-describing. Support for this format is available in VMD. } \seealso{ \code{\link{read.dcd}}, \code{\link{read.ncdf}}, \code{\link{read.pdb}}, \code{\link{write.pdb}}, \code{\link{atom.select}} } \examples{ \dontrun{ ##-- Read example trajectory file trtfile <- system.file("examples/hivp.dcd", package="bio3d") trj <- read.dcd(trtfile) ## Write to netCDF format write.ncdf(trj, "newtrj.nc") ## Read trj trj <- read.ncdf("newtrj.nc") } } \keyword{ IO } bio3d/man/bio3d.package.Rd0000644000176200001440000001056714046077017014725 0ustar liggesusers\name{bio3d-package} \alias{bio3d-package} \alias{bio3d} \docType{package} \title{ Biological Structure Analysis } \description{ Utilities for the analysis of protein structure and sequence data. } \details{ \tabular{ll}{ Package: \tab bio3d\cr Type: \tab Package\cr Version: \tab 2.4-2\cr Date: \tab 2021-05-03\cr License: \tab GPL version 2 or newer\cr URL: \tab \url{http://thegrantlab.org/bio3d/}\cr } Features include the ability to read and write structure (\code{\link{read.pdb}}, \code{\link{write.pdb}}, \code{\link{read.fasta.pdb}}), sequence (\code{\link{read.fasta}}, \code{\link{write.fasta}}) and dynamics trajectory data (\code{\link{read.dcd}}, \code{\link{read.ncdf}}, \code{\link{write.ncdf}}). Perform sequence and structure database searches (\code{\link{blast.pdb}}, \code{\link{hmmer}}), atom summaries (\code{\link{summary.pdb}}), atom selection (\code{\link{atom.select}}), alignment (\code{\link{pdbaln}}, \code{\link{seqaln}}, \code{\link{mustang}}) superposition (\code{\link{rot.lsq}}, \code{\link{fit.xyz}}), \code{\link{pdbfit}}), rigid core identification (\code{\link{core.find}}, \code{\link{plot.core}}, \code{\link{fit.xyz}}), dynamic domain analysis (\code{\link{geostas}}), torsion/dihedral analysis (\code{\link{torsion.pdb}}, \code{\link{torsion.xyz}}), clustering (via \code{\link{hclust}}), principal component analysis (\code{\link{pca.xyz}}, \code{\link{pca.pdbs}}, \code{\link{pca.tor}}, \code{\link{plot.pca}}, \code{\link{plot.pca.loadings}}, \code{\link{mktrj.pca}}), dynamical cross-correlation analysis (\code{\link{dccm}}, \code{\link{plot.dccm}}) and correlation network analysis (\code{\link{cna}}, \code{\link{plot.cna}}, \code{\link{cnapath}}) of structure data. Perform conservation analysis of sequence (\code{\link{seqaln}}, \code{\link{conserv}}, \code{\link{seqidentity}}, \code{\link{entropy}}, \code{\link{consensus}}) and structural (\code{\link{pdbaln}}, \code{\link{rmsd}}, \code{\link{rmsf}}, \code{\link{core.find}}) data. Perform normal mode analysis (\code{\link{nma}}, \code{\link{build.hessian}}), ensemble normal mode analysis (\code{\link{nma.pdbs}}), mode comparison (\code{\link{rmsip}}) and (\code{\link{overlap}}), atomic fluctuation prediction (\code{\link{fluct.nma}}), cross-correlation analysis (\code{\link{dccm.nma}}), cross-correlation visualization (\code{\link{pymol.dccm}}), deformation analysis (\code{\link{deformation.nma}}), and mode visualization (\code{\link{pymol.modes}}, \code{\link{mktrj.nma}}). In addition, various utility functions are provided to facilitate manipulation and analysis of biological sequence and structural data (e.g. \code{\link{get.pdb}}, \code{\link{get.seq}}, \code{\link{aa123}}, \code{\link{aa321}}, \code{\link{pdbseq}}, \code{\link{aln2html}}, \code{\link{atom.select}}, \code{\link{rot.lsq}}, \code{\link{fit.xyz}}, \code{\link{is.gap}}, \code{\link{gap.inspect}}, \code{\link{orient.pdb}}, \code{\link{pairwise}}, \code{\link{plot.bio3d}}, \code{\link{plot.nma}}, \code{\link{plot.blast}}, \code{\link{biounit}}, etc.). } \note{ The latest version, package vignettes and documentation with worked example outputs can be obtained from the bio3d website:\cr \url{http://thegrantlab.org/bio3d/}.\cr \url{http://thegrantlab.org/bio3d/reference/}.\cr \url{https://bitbucket.org/Grantlab/bio3d/}. } \author{ Barry Grant Xin-Qiu Yao Lars Skjaerven Julien Ide } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. Skjaerven, L. et al. (2014) \emph{BMC Bioinformatics} \bold{15}, 399. Grant, B.J. et al. (2021) \emph{Protein Science} \bold{30}, 20--30. } \keyword{ documentation } \examples{ help(package="bio3d") # list the functions within the package #lbio3d() # list bio3d function names only ## Or visit: ## http://thegrantlab.org/bio3d/reference/ ## See the individual functions for further documentation and examples, e.g. #help(read.pdb) ## Or online: ## http://thegrantlab.org/bio3d/reference/read.pdb.html \dontrun{ ##-- See the list of Bio3D demos demo(package="bio3d") ## Try some out, e.g: demo(pdb) # PDB Reading, Manipulation, Searching and Alignment demo(pca) # Principal Component Analysis demo(md) # Molecular Dynamics Trajectory Analysis demo(nma) # Normal Mode Analysis ## See package vignettes and tutorals online: ## http://thegrantlab.org/bio3d/articles/ } } bio3d/man/as.select.Rd0000644000176200001440000000177414046073105014206 0ustar liggesusers\name{as.select} \alias{as.select} \title{ Convert Atomic Indices to a Select Object } \description{ Convert atomic indices to a select object with \sQuote{atom} and \sQuote{xyz} components. } \usage{ as.select(x, \dots) } \arguments{ \item{x}{ a numeric vector containing atomic indices to be converted to a \sQuote{select} object. Alternatively, a logical vector can be provided. } \item{\dots}{ arguments passed to and from functions. } } \details{ Convert atomic indices to a select object with \sQuote{atom} and \sQuote{xyz} components. } \value{ Returns a list of class \code{"select"} with the following components: \item{atom}{ a numeric matrix of atomic indices. } \item{xyz }{ a numeric matrix of xyz indices. } \item{call }{ the matched call. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{atom.select}}, \code{\link{read.pdb}} } \examples{ as.select(c(1,2,3)) } \keyword{ utilities } bio3d/man/dccm.gnm.Rd0000644000176200001440000000300014046073105013773 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dccm.gnm.R \name{dccm.gnm} \alias{dccm.egnm} \alias{dccm.gnm} \title{Dynamic Cross-Correlation from Gaussian Network Model} \usage{ \method{dccm}{gnm}(x, ...) \method{dccm}{egnm}(x, ...) } \arguments{ \item{x}{an object of class \sQuote{gnm} or \sQuote{egnm} as obtained from \code{\link{gnm}}.} \item{...}{additional arguments (currently ignored).} } \value{ Returns a cross-correlation matrix. } \description{ Calculate the cross-correlation matrix from Gaussian network model normal modes analysis. } \details{ This function calculates the cross-correlation matrix from Gaussian network model (GNM) normal modes analysis (NMA) obtained from \code{gnm}. It returns a matrix of residue-wise cross-correlations whose elements, Cij, may be displayed in a graphical representation frequently termed a dynamical cross-correlation map, or DCCM. (See more details in \code{help(dccm.nma)}). } \examples{ ## Fetch stucture pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) ## Calculate normal modes modes <- gnm(pdb) ## Calculate correlation matrix cm <- dccm(modes) ## Plot correlation map plot(cm, sse = pdb, contour = FALSE, col.regions = bwr.colors(20), at = seq(-1, 1, 0.1)) } \author{ Xin-Qiu Yao & Lars Skjaerven } \references{ Bahar, I. et al. (1997) \emph{Folding Des.} \bold{2}, 173. } \seealso{ \code{\link{gnm}}, \code{\link{dccm.nma}}, \code{\link{dccm.enma}}, \code{\link{plot.dccm}}. } \keyword{analysis} bio3d/man/write.pqr.Rd0000644000176200001440000000620414046073105014251 0ustar liggesusers\name{write.pqr} \alias{write.pqr} \title{ Write PQR Format Coordinate File } \description{ Write a PQR file for a given \sQuote{xyz} Cartesian coordinate vector or matrix. } \usage{ write.pqr(pdb = NULL, xyz = pdb$xyz, resno = NULL, resid = NULL, eleno = NULL, elety = NULL, chain = NULL, o = NULL, b = NULL, append = FALSE, verbose = FALSE, chainter = FALSE, file = "R.pdb") } \arguments{ \item{pdb}{ a PDB structure object obtained from \code{\link{read.pdb}} or \code{\link{read.pqr}}. } \item{xyz}{ Cartesian coordinates as a vector or 3xN matrix. } \item{resno}{ vector of residue numbers of length equal to length(xyz)/3. } \item{resid}{ vector of residue types/ids of length equal to length(xyz)/3. } \item{eleno}{ vector of element/atom numbers of length equal to length(xyz)/3. } \item{elety}{ vector of element/atom types of length equal to length(xyz)/3. } \item{chain}{ vector of chain identifiers with length equal to length(xyz)/3. } \item{o}{ atomic partial charge values of length equal to length(xyz)/3. } \item{b}{ atomic radii values of length equal to length(xyz)/3. } \item{append}{ logical, if TRUE output is appended to the bottom of an existing file (used primarly for writing multi-model files). } \item{verbose}{ logical, if TRUE progress details are printed. } \item{chainter}{ logical, if TRUE a TER line is inserted between chains. } \item{file}{ the output file name. } } \details{ PQR file format is basically the same as PDB format except for the fields of \code{o} and \code{b}. In PDB, these two fields are filled with \sQuote{Occupancy} and \sQuote{B-factor} values, respectively, with each field 6-column long. In PQR, they are atomic \sQuote{partial charge} and \sQuote{radii} values, respectively, with each field 8-column long. Only the \code{xyz} argument is strictly required. Other arguments assume a default poly-ALA C-alpha structure with a blank chain id, atomic charge values of 0.00 and atomic radii equal to 1.00. If the input argument \code{xyz} is a matrix then each row is assumed to be a different structure/frame to be written to a \dQuote{multimodel} PDB file, with frames separated by \dQuote{END} records. } \value{ Called for its effect. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. For a description of PDB format (version3.3) see:\cr \url{http://www.wwpdb.org/documentation/format33/v3.3.html}. } \author{ Barry Grant with contributions from Joao Martins. } \note{ Check that: (1) \code{chain} is one character long e.g. \dQuote{A}, and (2) \code{resno} and \code{eleno} do not exceed \dQuote{9999}. } \seealso{ \code{\link{read.pqr}}, \code{\link{read.pdb}}, \code{\link{write.pdb}}, \code{\link{read.dcd}}, \code{\link{read.fasta.pdb}}, \code{\link{read.fasta}} } \examples{ \donttest{ # PDB server connection required - testing excluded # Read a PDB file pdb <- read.pdb( "1bg2" ) # Write out in PQR format outfile = file.path(tempdir(), "eg.pqr") write.pqr(pdb=pdb, file = outfile) invisible( cat("\nSee the output file:", outfile, sep = "\n") ) } } \keyword{ IO } bio3d/man/seqaln.Rd0000644000176200001440000001664114046077017013615 0ustar liggesusers\name{seqaln} \alias{seqaln} \title{ Sequence Alignment with MUSCLE} \description{ Create multiple alignments of amino acid or nucleotide sequences according to the method of Edgar. } \usage{ seqaln(aln, id=NULL, profile=NULL, exefile="muscle", outfile="aln.fa", protein=TRUE, seqgroup=FALSE, refine=FALSE, extra.args="", verbose=FALSE, web.args = list(), \dots) } \arguments{ \item{aln}{ a sequence character matrix, as obtained from \code{\link{seqbind}}, or an alignment list object as obtained from \code{\link{read.fasta}}. } \item{id}{ a vector of sequence names to serve as sequence identifers. } \item{profile}{ a profile alignment of class \sQuote{fasta} (e.g. obtained from \code{\link{read.fasta}}). The alignment \code{aln} will be added to the profile. } \item{exefile}{ file path to the \sQuote{MUSCLE} program on your system (i.e. how is \sQuote{MUSCLE} invoked). Alternatively, \sQuote{CLUSTALO} can be used. Also supported is using the \sQuote{msa} package from Bioconductor (need to install packages using \code{BiocManager::install()}). To do so, simply set \code{exefile="msa"}. } \item{outfile}{ name of \sQuote{FASTA} output file to which alignment should be written. } \item{protein}{ logical, if TRUE the input sequences are assumed to be protein not DNA or RNA. } \item{seqgroup}{ logical, if TRUE similar sequences are grouped together in the output. } \item{refine}{ logical, if TRUE the input sequences are assumed to already be aligned, and only tree dependent refinement is performed. } \item{extra.args}{ a single character string containing extra command line arguments for the alignment program. } \item{verbose}{ logical, if TRUE \sQuote{MUSCLE} warning and error messages are printed. } \item{web.args}{ a \sQuote{list} object containing arguments to perform online sequence alignment using EMBL-EBI Web Services. See below for details. } \item{\dots}{ additional arguments passed to the function \code{msa::msaMuscle()}. } } \details{ Sequence alignment attempts to arrange the sequences of protein, DNA or RNA, to highlight regions of shared similarity that may reflect functional, structural, and/or evolutionary relationships between the sequences. Aligned sequences are represented as rows within a matrix. Gaps (\sQuote{-}) are inserted between the aminoacids or nucleotides so that equivalent characters are positioned in the same column. This function calls the \sQuote{MUSCLE} program to perform a multiple sequence alignment, which must be installed on your system and in the search path for executables. If local \sQuote{MUSCLE} can not be found, alignment can still be performed via online web services (see below) with limited features. If you have a large number of input sequences (a few thousand), or they are very long, the default settings may be too slow for practical use. A good compromise between speed and accuracy is to run just the first two iterations of the \sQuote{MUSCLE} algorithm by setting the \code{extra.args} argument to \dQuote{-maxiters 2}. You can set \sQuote{MUSCLE} to improve an existing alignment by setting \code{refine} to TRUE. To inspect the sequence clustering used by \sQuote{MUSCLE} to produce alignments, include \dQuote{-tree2 tree.out} in the \code{extra.args} argument. You can then load the \dQuote{tree.out} file with the \sQuote{read.tree} function from the \sQuote{ape} package. \sQuote{CLUSTALO} can be used as an alternative to \sQuote{MUSCLE} by specifiying \code{exefile='clustalo'}. This might be useful e.g. when adding several sequences to a profile alignment. If local \sQuote{MUSCLE} or \sQuote{CLUSTALO} program is unavailable, the alignment can be performed via the \sQuote{msa} package from the Bioconductor repository. To do so, set \code{exefile="msa"}. Note that both \sQuote{msa} and \sQuote{Biostrings} packages need to be installed properly using \code{BiocManager::install()}. If the access to any method metioned above fails, the function will attempt to perform alignment via the EMBL-EBI Web Services (See \url{https://www.ebi.ac.uk/}). In this case, the argument \code{web.args} cannot be empty and must contain at least user's E-Mail address. Note that as stated by EBI, a fake email address may result in your jobs being killed and your IP, organisation or entire domain being black-listed (See FAQs on \url{https://www.ebi.ac.uk/}). Possible parameters to be passed via \code{web.args} include: \describe{ \item{email}{ a string containing a valid E-Mail address. Required. } \item{title}{ a string for the title of the job to be submitted to the remote server. Optional. } \item{timeout}{ integer specifying the number of seconds to wait for the response of the server before a time out occurs. Default: 90. } } An example of usage is \code{web.args=list(email='user_id@email.provider')}. } \value{ Returns a list of class \code{"fasta"} with the following components: \item{ali}{ an alignment character matrix with a row per sequence and a column per equivalent aminoacid/nucleotide. } \item{id}{ sequence names as identifers.} \item{call}{ the matched call. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. \sQuote{MUSCLE} is the work of Edgar: Edgar (2004) \emph{Nuc. Acid. Res.} \bold{32}, 1792--1797. Full details of the \sQuote{MUSCLE} algorithm, along with download and installation instructions can be obtained from:\cr \url{http://www.drive5.com/muscle/}. } \author{ Barry Grant } \note{ A system call is made to the \sQuote{MUSCLE} program, which must be installed on your system and in the search path for executables. See \url{http://thegrantlab.org/bio3d/articles/online/install_vignette/Bio3D_install.html} for instructions of how to install this program. } \seealso{ \code{\link{read.fasta}}, \code{\link{read.fasta.pdb}}, \code{\link{get.seq}}, \code{\link{seqbind}}, \code{\link{pdbaln}}, \code{\link{plot.fasta}}, \code{\link{blast.pdb}} } \examples{ \dontrun{ ##-- Basic sequence alignemnt seqs <- get.seq(c("4q21_A", "1ftn_A")) aln <- seqaln(seqs) ##-- add a sequence to the (profile) alignment seq <- get.seq("1tnd_A") aln <- seqaln(seq, profile=aln) ##-- Read a folder/directory of PDB files #pdb.path <- "my_dir_of_pdbs" #files <- list.files(path=pdb.path , # pattern=".pdb", # full.names=TRUE) ##-- Use online files files <- get.pdb(c("4q21","1ftn"), URLonly=TRUE) ##-- Extract and store sequences raw <- NULL for(i in 1:length(files)) { pdb <- read.pdb(files[i]) raw <- seqbind(raw, pdbseq(pdb) ) } ##-- Align these sequences aln <- seqaln(raw, id=files, outfile="seqaln.fa") ##-- Read Aligned PDBs storing coordinate data pdbs <- read.fasta.pdb(aln) ## Sequence identity seqidentity(aln) ## Note that all the above can be done with the pdbaln() function: #pdbs <- pdbaln(files) ##-- For identical sequences with masking use a custom matrix aa <- seqbind(c("X","C","X","X","A","G","K"), c("C","-","A","X","G","X","X","K")) aln <- seqaln(aln=aln, id=c("a","b"), outfile="temp.fas", protein=TRUE, extra.args= paste("-matrix", system.file("matrices/custom.mat", package="bio3d"), "-gapopen -3.0 ", "-gapextend -0.5", "-center 0.0") ) } } \keyword{ utilities } bio3d/man/aa2mass.Rd0000644000176200001440000000400414046073105013641 0ustar liggesusers\name{aa2mass} \alias{aa2mass} \title{ Amino Acid Residues to Mass Converter } \description{ Convert a sequence of amino acid residue names to mass. } \usage{ aa2mass(pdb, inds=NULL, mass.custom=NULL, addter=TRUE, mmtk=FALSE) } \arguments{ \item{pdb}{ a character vector containing the atom names to convert to atomic masses. Alternatively, a object of type \code{pdb} can be provided. } \item{inds}{ atom and xyz coordinate indices obtained from \code{atom.select} that selects the elements of \code{pdb} upon which the calculation should be based. } \item{mass.custom}{ a list of amino acid residue names and their corresponding masses. } \item{addter}{ logical, if TRUE terminal atoms are added to final masses. } \item{mmtk}{ logical, if TRUE use the exact aminoacid residue masses as provided with the MMTK database (for testing purposes). } } \details{ This function converts amino acid residue names to their corresponding masses. In the case of a non-standard amino acid residue name \code{mass.custom} can be used to map the residue to the correct mass. User-defined amino acid masses (with argument \code{mass.custom}) will override mass entries obtained from the database. See examples for more details. } \note{ When object of type \code{pdb} is provided, non-calpha atom records are omitted from the selection. } \value{ Returns a numeric vector of masses. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{atom.index}}, \code{\link{atom2mass}}, \code{\link{aa.index}}} \examples{ resi.names <- c("LYS", "ALA", "CYS", "HIS") masses <- aa2mass(resi.names, addter=FALSE) \dontrun{ ## Fetch atomic masses in a PDB object pdb <- read.pdb("3dnd") masses <- aa2mass(pdb) ## or masses <- aa2mass(pdb$atom[1:10,"resid"]) ## Dealing with unconventional residues #pdb <- read.pdb("1xj0") #mass.cust <- list("CSX"=122.166) #masses <- aa2mass(pdb, mass.custom=mass.cust) } } \keyword{ utilities } bio3d/man/plot.enma.Rd0000644000176200001440000000355514046073105014221 0ustar liggesusers\name{plot.enma} \alias{plot.enma} \title{ Plot eNMA Results } \description{ Produces a plot of atomic fluctuations of aligned normal modes. } \usage{ \method{plot}{enma}(x, pdbs = NULL, xlab = NULL, ylab="Fluctuations", ...) } \arguments{ \item{x}{ the results of ensemble NMA obtained with \code{\link{nma.pdbs}}. Alternatively, a matrix in the similar format as \code{enma$fluctuations} can be provided. } \item{pdbs}{ an object of class \sQuote{pdbs} in which the \sQuote{enma} object \code{x} was obtained from. If provided SSE data of the first structure of \code{pdbs} will drawn. } \item{xlab}{ a label for the x axis. } \item{ylab}{ labels for the y axes. } \item{\dots}{ extra plotting arguments passed to \code{plot.fluct} that effect the atomic fluctuations plot only. } } \details{ \code{plot.enma} produces a fluctuation plot of aligned \code{nma} objects. If corresponding \code{pdbs} object is provided the plot contains SSE annotation and appropriate resiude index numbering. } \value{ Called for its effect. } \references{ Skjaerven, L. et al. (2014) \emph{BMC Bioinformatics} \bold{15}, 399. Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven, Barry Grant } \seealso{ \code{\link{nma}}, \code{\link{plotb3}}, \code{\link{plot.fluct}} } \examples{ \dontrun{ ids <- c("1a70_A", "1czp_A", "1frd_A", "1fxi_A", "1iue_A", "1pfd_A") raw.files <- get.pdb(ids, path = "raw_pdbs") files <- pdbsplit(raw.files, ids, path = "raw_pdbs/split_chain") ## Sequence/structure alignement pdbs <- pdbaln(files) ## Normal mode analysis on aligned data modes <- nma(pdbs) ## Plot fluctuations plot(modes, pdbs=pdbs) ## Group and spread fluctuation profiles hc <- hclust(as.dist(1-modes$rmsip)) col <- cutree(hc, k=2) plot(modes, pdbs=pdbs, col=col, spread=TRUE) } } \keyword{ hplot } bio3d/man/motif.find.Rd0000644000176200001440000000206714046073105014356 0ustar liggesusers\name{motif.find} \alias{motif.find} \title{ Find Sequence Motifs. } \description{ Return Position Indices of a Short Sequence Motif Within a Larger Sequence. } \usage{ motif.find(motif, sequence) } \arguments{ \item{motif}{ a character vector of the short sequence motif. } \item{sequence}{ a character vector of the larger sequence. } } \details{ The sequence and the motif can be given as a either a multiple or single element character vector. The dot character and other valid \code{regexpr} characters are allowed in the motif, see examples. } \value{ Returns a vector of position indices within the sequence where the motif was found, see examples. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \seealso{ \code{\link{regexpr}}, \code{\link{read.fasta}}, \code{\link{pdbseq}} } \examples{ \donttest{ # PDB server connection required - testing excluded aa.seq <- pdbseq( read.pdb( get.pdb("4q21", URLonly=TRUE) ) ) motif = c("G....GKS") motif.find(motif, aa.seq) } } \keyword{ utilities } bio3d/man/uniprot.Rd0000644000176200001440000000233214046077017014022 0ustar liggesusers\name{uniprot} \alias{uniprot} \title{ Fetch UniProt Entry Data. } \description{ Fetch protein sequence and functional information from the UniProt database. } \usage{ uniprot(accid) } \arguments{ \item{accid}{ UniProt accession id. } } \details{ This is a basic utility function for downloading information from the UniProt database. UniProt contains protein sequence and functional information. } \value{ Returns a list object with the following components: \item{accession}{ a character vector with UniProt accession id's. } \item{name}{ abbreviated name. } \item{fullName}{ full recommended protein name. } \item{shortName }{ short protein name. } \item{sequence}{ protein sequence. } \item{gene}{ gene names. } \item{organism}{ organism. } \item{taxon}{ taxonomic lineage. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. See also the UniProt web-site for more information:\cr \url{https://www.uniprot.org/}. } \author{ Lars Skjaerven } \seealso{ \code{\link{blast.pdb}}, \code{\link{get.seq}} } \examples{ \dontrun{ # UNIPROT server connection required - testing excluded prot <- uniprot('PH4H_HUMAN') prot$fullName prot$sequence } } \keyword{ utilities } bio3d/man/hmmer.Rd0000644000176200001440000001420414046077017013433 0ustar liggesusers\name{hmmer} \alias{hmmer} \title{ HMMER Sequence Search } \description{ Perform a HMMER search against the PDB, NR, swissprot or other sequence and structure databases. } \usage{ hmmer(seq, type="phmmer", db = NULL, verbose = TRUE, timeout = 90) } \arguments{ \item{seq}{ a multi-element character vector containing the query sequence. Alternatively a \sQuote{fasta} object as obtained from functions \code{get.seq} or \code{read.fasta} can be provided. } \item{type}{ character string specifying the \sQuote{HMMER} job type. Current options are \sQuote{phmmer}, \sQuote{hmmscan}, \sQuote{hmmsearch}, and \sQuote{jackhmmer}. } \item{db}{ character string specifying the database to search. Current options are \sQuote{pdb}, \sQuote{nr}, \sQuote{swissprot}, \sQuote{pfam}, etc. See \sQuote{details} for a complete list. } \item{verbose}{ logical, if TRUE details of the download process is printed. } \item{timeout}{ integer specifying the number of seconds to wait for the blast reply before a time out occurs. } } \details{ This function employs direct HTTP-encoded requests to the HMMER web server. HMMER can be used to search sequence databases for homologous protein sequences. The HMMER server implements methods using probabilistic models called profile hidden Markov models (profile HMMs). There are currently four types of HMMER search to perform: - \sQuote{phmmer}: protein sequence vs protein sequence database.\cr (input argument \code{seq} must be a sequence). Allowed options for \code{type} includes: \sQuote{env_nr}, \sQuote{nr}, \sQuote{refseq}, \sQuote{pdb}, \sQuote{rp15}, \sQuote{rp35}, \sQuote{rp55}, \sQuote{rp75}, \sQuote{swissprot}, \sQuote{unimes}, \sQuote{uniprotkb}, \sQuote{uniprotrefprot}, \sQuote{pfamseq}. - \sQuote{hmmscan}: protein sequence vs profile-HMM database.\cr (input argument \code{seq} must be a sequence). Allowed options for \code{type} includes: \sQuote{pfam}, \sQuote{gene3d}, \sQuote{superfamily}, \sQuote{tigrfam}. - \sQuote{hmmsearch}: protein alignment/profile-HMM vs protein sequence database.\cr (input argument \code{seq} must be an alignment). Allowed options for \code{type} includes: \sQuote{pdb}, \sQuote{swissprot}. - \sQuote{jackhmmer}: iterative search vs protein sequence database.\cr (input argument \code{seq} must be an alignment). \sQuote{jackhmmer} functionality incomplete!! Allowed options for \code{type} includes: \sQuote{env_nr}, \sQuote{nr}, \sQuote{refseq}, \sQuote{pdb}, \sQuote{rp15}, \sQuote{rp35}, \sQuote{rp55}, \sQuote{rp75}, \sQuote{swissprot}, \sQuote{unimes}, \sQuote{uniprotkb}, \sQuote{uniprotrefprot}, \sQuote{pfamseq}. More information can be found at the HMMER website:\cr \url{http://hmmer.org} } \value{ A list object with components \sQuote{hit.tbl} and \sQuote{url}. \sQuote{hit.tbl} is a data frame with multiple components depending on the selected job \sQuote{type}. Frequently reported fields include: \item{name}{ a character vector containing the name of the target. } \item{acc}{ a character vector containing the accession identifier of the target. } \item{acc2}{ a character vector containing secondary accession of the target. } \item{pdb.id}{ same as \sQuote{acc}. } \item{id}{ a character vector containing Identifier of the target } \item{desc}{ a character vector containing entry description. } \item{score}{ a numeric vector containing bit score of the sequence (all domains, without correction). } \item{bitscore}{ same as \sQuote{score}. } \item{pvalue}{ a numeric vector containing the P-value of the score. } \item{evalue}{ a numeric vector containing the E-value of the score. } \item{mlog.evalue }{ a numeric vector containing minus the natural log of the E-value. } \item{nregions}{ a numeric vector containing Number of regions evaluated. } \item{nenvelopes}{ a numeric vector containing the number of envelopes handed over for domain definition, null2, alignment, and scoring. } \item{ndom}{ a numeric vector containing the total number of domains identified in this sequence. } \item{nreported}{ a numeric vector containing the number of domains satisfying reporting thresholding. } \item{nincluded}{ a numeric vector containing the number of domains satisfying inclusion thresholding. } \item{taxid}{ a character vector containing The NCBI taxonomy identifier of the target (if applicable). } \item{species}{ a character vector containing the species name. } \item{kg}{ a character vector containing the kingdom of life that the target belongs to - based on placing in the NCBI taxonomy tree. } More details can be found at the HMMER website:\cr \url{https://www.ebi.ac.uk/Tools/hmmer/help/api} } \note{ Note that the chained \sQuote{pdbs} HMMER field (used for redundant PDBs) is included directly into the result list (applies only when \code{db='pdb'}). In this case, the \sQuote{name} component of the target contains the parent (non redundant) entry, and the \sQuote{acc} component the chained PDB identifiers. The search results will therefore provide duplicated PDB identifiers for component \code{$name}, while \code{$acc} should be unique. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. Finn, R.D. et al. (2011) \emph{Nucl. Acids Res.} \bold{39}, 29--37. Eddy, S.R. (2011) \emph{PLoS Comput Biol} \bold{7}(10): e1002195. See also the \sQuote{HMMER} website:\cr \url{http://hmmer.org} } \author{ Lars Skjaerven } \note{ Online access is required to query HMMER services. } \seealso{ \code{\link{blast.pdb}}, \code{\link{plot.blast}}, \code{\link{seqaln}}, \code{\link{get.seq}}, \code{\link{pfam}}, \code{\link{uniprot}} } \examples{ \dontrun{ # HMMER server connection required - testing excluded ##- PHMMER seq <- get.seq("2abl_A", outfile=tempfile()) res <- hmmer(seq, db="pdb") ##- HMMSCAN fam <- hmmer(seq, type="hmmscan", db="pfam") pfam.aln <- pfam(fam$hit.tbl$acc[1]) ##- HMMSEARCH hmm <- hmmer(pfam.aln, type="hmmsearch", db="pdb") unique(hmm$hit.tbl$species) hmm$hit.tbl$acc } } \keyword{ utilities } bio3d/man/elements.Rd0000644000176200001440000000367314046073105014141 0ustar liggesusers\name{elements} \alias{elements} \docType{data} \title{Periodic Table of the Elements} \description{This data set gives various information on chemical elements.} \usage{elements} \format{ A data frame containing for each chemical element the following information. \describe{ \item{\code{num}}{atomic number} \item{\code{symb}}{elemental symbol} \item{\code{areneg}}{Allred and Rochow electronegativity (0.0 if unknown)} \item{\code{rcov}}{covalent radii (in Angstrom) (1.6 if unknown)} \item{\code{rbo}}{"bond order" radii} \item{\code{rvdw}}{van der Waals radii (in Angstrom) (2.0 if unknown)} \item{\code{maxbnd}}{maximum bond valence (6 if unknown)} \item{\code{mass}}{IUPAC recommended atomic masses (in amu)} \item{\code{elneg}}{Pauling electronegativity (0.0 if unknown)} \item{\code{ionization}}{ionization potential (in eV) (0.0 if unknown)} \item{\code{elaffinity}}{electron affinity (in eV) (0.0 if unknown)} \item{\code{red}}{red value for visualization} \item{\code{green}}{green value for visualization} \item{\code{blue}}{blue value for visualization} \item{\code{name}}{element name} } } \source{ Open Babel (2.3.1) file: element.txt\cr Created from the Blue Obelisk Cheminformatics Data Repository\cr Direct Source: http://www.blueobelisk.org/\cr http://www.blueobelisk.org/repos/blueobelisk/elements.xml includes furhter bibliographic citation information\cr - Allred and Rochow Electronegativity from http://www.hull.ac.uk/chemistry/electroneg.php?type=Allred-Rochow\cr - Covalent radii from http://dx.doi.org/10.1039/b801115j\cr - Van der Waals radii from http://dx.doi.org/10.1021/jp8111556\cr } \examples{ data(elements) elements # Get the mass of some elements symb <- c("C","O","H") elements[match(symb,elements[,"symb"]),"mass"] # Get the van der Waals radii of some elements symb <- c("C","O","H") elements[match(symb,elements[,"symb"]),"rvdw"] } \keyword{datasets} bio3d/man/normalize.vector.Rd0000644000176200001440000000236314046073105015621 0ustar liggesusers\name{normalize.vector} \alias{normalize.vector} \title{ Mass-Weighted Normalized Vector } \description{ Normalizes a vector (mass-weighted if requested). } \usage{ normalize.vector(x, mass=NULL) } \arguments{ \item{x}{ a numeric vector or matrix to be normalized. } \item{mass}{ a numeric vector containing the atomic masses for weighting. } } \details{ This function normalizes a vector, or alternatively, the column-wise vector elements of a matrix. If atomic masses are provided the vector is mass-weigthed. See examples for more details. } \value{ Returns the normalized vector(s). } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{nma} }, \code{\link{inner.prod} } } \examples{ x <- 1:3 y <- matrix(1:9, ncol = 3, nrow = 3) normalize.vector(x) normalize.vector(y) ## Application to normal modes pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) ## Calculate (vibrational) normal modes modes <- nma(pdb) ## Returns a vector nv <- normalize.vector(modes$modes[,7]) ## Returns a matrix nv <- normalize.vector(modes$modes[,7:10]) ## Mass-weighted nv <- normalize.vector(modes$modes[,7], mass=modes$mass) } \keyword{ utilities } bio3d/man/mask.dccm.Rd0000644000176200001440000000443514046073105014162 0ustar liggesusers\name{mask} \alias{mask} \alias{mask.dccm} \title{ Mask a Subset of Atoms in a DCCM Object. } \description{ Produce a new DCCM object with selected atoms masked. } \usage{ mask(\dots) \method{mask}{dccm}(dccm, pdb = NULL, a.inds = NULL, b.inds = NULL, \dots) } \arguments{ \item{dccm}{ a DCCM structure object obtained from function \code{\link{dccm}}. } \item{pdb}{ a PDB structure object obtained from \code{\link{read.pdb}}. Must match the dimensions of \code{dccm}. } \item{a.inds}{ a numeric vector containing the indices of the elements of the DCCM matrix in which should not be masked. Alternatively, if \code{pdb} is provided a selection object (as obtained from \code{\link{atom.select}}) can be provided. } \item{b.inds}{ a numeric vector containing the indices of the elements of the DCCM matrix in which should not be masked. } \item{\dots}{ arguments not passed anywhere. } } \details{ This is a basic utility function for masking a DCCM object matrix to highlight user-selected regions in the correlation network. When both \code{a.inds} and \code{b.inds} are provided only their intersection is retained. When only \code{a.inds} is provided then the corresponding region to everything else is retained. Note: The current version assumes that the input PDB corresponds to the input DCCM. In many cases this will correspond to a PDB object containing only CA atoms. } \value{ Returns a matrix list of class \code{"dccm"} with the indices/atoms not corresponding to the selection masked. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{dccm}}, \code{\link{atom.select}} } \examples{ ## Calculate DCCM pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) cij <- dccm(nma(pdb)) ## Mask DCCM matrix according to matrix indices cijm <- mask(cij, a.inds=40:50, b.inds=80:90) plot(cijm) ## Retain only 40:50 to everything else cijm <- mask(cij, a.inds=40:50) plot(cijm) ## Mask DCCM matrix according PDB selection pdb.ca <- trim(pdb, "calpha") a.inds <- atom.select(pdb.ca, resno=40:50) b.inds <- atom.select(pdb.ca, resno=80:90) # Provide pdb object correspoding to input dccm cijm <- mask(cij, pdb.ca, a.inds, b.inds) plot(cijm) } \keyword{ utilities } bio3d/man/chain.pdb.Rd0000644000176200001440000000347114046073105014147 0ustar liggesusers\name{chain.pdb} \alias{chain.pdb} \title{ Find Possible PDB Chain Breaks } \description{ Find possible chain breaks based on connective Calpha or peptide bond (C-N) atom separation. } \usage{ chain.pdb(pdb, ca.dist = 4, bond=TRUE, bond.dist=1.5, blank = "X", rtn.vec = TRUE) } \arguments{ \item{pdb}{ a PDB structure object obtained from \code{\link{read.pdb}}. } \item{ca.dist}{ the maximum distance that separates Calpha atoms considered to be in the same chain. } \item{bond}{ logical, if TRUE inspect peptide bond (C-N) instead of Calpha-Calpha distances whenever possible.} \item{bond.dist}{ cutoff value for C-N distance separation. } \item{blank}{ a character to assign non-protein atoms. } \item{rtn.vec}{ logical, if TRUE then the one-letter chain vector consisting of the 26 upper-case letters of the Roman alphabet is returned. } } \details{ This is a basic function for finding possible chain breaks in PDB structure files, i.e. connective Calpha atoms that are further than \code{ca.dist} apart or peptide bond (C-N) atoms separated by at least \code{bond.dist}. } \value{ Prints basic chain information and if \code{rtn.vec} is TRUE returns a character vector of chain ids consisting of the 26 upper-case letters of the Roman alphabet plus possible \code{blank} entries for non-protein atoms. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \seealso{ \code{\link{read.pdb}}, \code{\link{atom.select}}, \code{\link{trim.pdb}}, \code{\link{write.pdb}} } \examples{ \donttest{ # PDB server connection required - testing excluded full.pdb <- read.pdb( get.pdb("5p21", URLonly=TRUE) ) inds <- atom.select(full.pdb, resno=c(10:20,30:33)) cut.pdb <- trim.pdb(full.pdb, inds) chain.pdb(cut.pdb) } } \keyword{ utilities } bio3d/man/rmsip.Rd0000644000176200001440000000476614046073105013463 0ustar liggesusers\name{rmsip} \alias{rmsip} \alias{rmsip.default} \alias{rmsip.enma} \title{ Root Mean Square Inner Product } \description{ Calculate the RMSIP between two mode subspaces. } \usage{ rmsip(...) \method{rmsip}{enma}(enma, ncore=NULL, subset=10, ...) \method{rmsip}{default}(modes.a, modes.b, subset=10, row.name="a", col.name="b", ...) } \arguments{ \item{enma}{ an object of class \code{"enma"} obtained from function \code{nma.pdbs}. } \item{ncore }{ number of CPU cores used to do the calculation. \code{ncore>1} requires package \sQuote{parallel} installed. } \item{subset}{ the number of modes to consider. } \item{modes.a}{ an object of class \code{"pca"} or \code{"nma"} as obtained from functions \code{pca.xyz} or \code{nma}. } \item{modes.b}{ an object of class \code{"pca"} or \code{"nma"} as obtained from functions \code{pca.xyz} or \code{nma}. } \item{row.name}{ prefix name for the rows. } \item{col.name}{ prefix name for the columns. } \item{\dots}{ arguments passed to associated functions. } } \details{ RMSIP is a measure for the similarity between two set of modes obtained from principal component or normal modes analysis. } \value{ Returns an \code{rmsip} object with the following components: \item{overlap}{ a numeric matrix containing pairwise (squared) dot products between the modes. } \item{rmsip}{ a numeric RMSIP value. } For function \code{rmsip.enma} a numeric matrix containing all pairwise RMSIP values of the modes stored in the \code{enma} object. } \references{ Skjaerven, L. et al. (2014) \emph{BMC Bioinformatics} \bold{15}, 399. Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. Amadei, A. et al. (1999) \emph{Proteins} \bold{36}, 19--424. } \author{ Lars Skjaerven } \seealso{ \code{\link{pca}}, \code{\link{nma}}, \code{\link{overlap}}. Other similarity measures: \code{\link{sip}}, \code{\link{covsoverlap}}, \code{\link{bhattacharyya}}. } \examples{ \dontrun{ # Load data for HIV example trj <- read.dcd(system.file("examples/hivp.dcd", package="bio3d")) pdb <- read.pdb(system.file("examples/hivp.pdb", package="bio3d")) # Do PCA on simulation data xyz.md <- fit.xyz(pdb$xyz, trj, fixed.inds=1:ncol(trj)) pc.sim <- pca.xyz(xyz.md) # NMA modes <- nma(pdb) # Calculate the RMSIP between the MD-PCs and the NMA-MODEs r <- rmsip(modes, pc.sim, subset=10, row.name="NMA", col.name="PCA") # Plot pairwise overlap values plot(r, xlab="NMA", ylab="PCA") } } \keyword{ utilities } bio3d/man/check.utility.Rd0000644000176200001440000000142014046073105015070 0ustar liggesusers\name{check.utility} \alias{check.utility} \title{ Check on Missing Utility Programs } \description{ Internally used in examples, tests, or vignettes. } \usage{ check.utility(x = c("muscle", "clustalo", "dssp", "stride", "mustang", "makeup"), quiet = TRUE) } \arguments{ \item{x}{ Names of one or more utility programs to check. } \item{quiet}{ logical, if TRUE no warning or message printed. } } \details{ Check if requested utility programs are availabe or not. } \value{ logical, TRUE if programs are available and FALSE if any one of them is missing. } \examples{ check.utility(c("muscle", "dssp"), quiet=FALSE) if(!check.utility("mustang")) cat(" The utility program, MUSTANG, is missing on your system\n") } \keyword{ utilities } bio3d/man/entropy.Rd0000644000176200001440000000715014046073105014017 0ustar liggesusers\name{entropy} \alias{entropy} \title{ Shannon Entropy Score } \description{ Calculate the sequence entropy score for every position in an alignment. } \usage{ entropy(alignment) } \arguments{ \item{alignment}{ sequence alignment returned from \code{\link{read.fasta}} or an alignment character matrix. } } \details{ Shannon's information theoretic entropy (Shannon, 1948) is an often-used measure of residue diversity and hence residue conservation. } \value{ Returns a list with five components: \item{H }{standard entropy score for a 22-letter alphabet.} \item{H.10 }{entropy score for a 10-letter alphabet (see below).} \item{H.norm }{ normalized entropy score (for 22-letter alphabet), so that conserved (low entropy) columns (or positions) score 1, and diverse (high entropy) columns score 0.} \item{H.10.norm }{ normalized entropy score (for 10-letter alphabet), so that conserved (low entropy) columns score 1 and diverse (high entropy) columns score 0.} \item{freq }{residue frequency matrix containing percent occurrence values for each residue type.} } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. Shannon (1948) \emph{The System Technical J.} \bold{27}, 379--422. Mirny and Shakhnovich (1999) \emph{J. Mol. Biol.} \bold{291}, 177--196. } \author{ Barry Grant } \note{ In addition to the standard entropy score (based on a 22-letter alphabet of the 20 standard amino-acids, plus a gap character \sQuote{-} and a mask character \sQuote{X}), an entropy score, \code{H.10}, based on a 10-letter alphabet is also returned. For \code{H.10}, residues from the 22-letter alphabet are classified into one of 10 types, loosely following the convention of Mirny and Shakhnovich (1999): Hydrophobic/Aliphatic [V,I,L,M], Aromatic [F,W,Y], Ser/Thr [S,T], Polar [N,Q], Positive [H,K,R], Negative [D,E], Tiny [A,G], Proline [P], Cysteine [C], and Gaps [-,X]. The residue code \sQuote{X} is useful for handling non-standard aminoacids. } \seealso{ \code{\link{consensus}}, \code{\link{read.fasta}} } \examples{ # Read HIV protease alignment aln <- read.fasta(system.file("examples/hivp_xray.fa",package="bio3d")) # Entropy and consensus h <- entropy(aln) con <- consensus(aln) names(h$H)=con$seq print(h$H) # Entropy for sub-alignment (positions 1 to 20) h.sub <- entropy(aln$ali[,1:20]) # Plot entropy and residue frequencies (excluding positions >=60 percent gaps) H <- h$H.norm H[ apply(h$freq[21:22,],2,sum)>=0.6 ] = 0 col <- mono.colors(32) aa <- rev(rownames(h$freq)) oldpar <- par(no.readonly=TRUE) layout(matrix(c(1,2),2,1,byrow = TRUE), widths = 7, heights = c(2, 8), respect = FALSE) # Plot 1: entropy par(mar = c(0, 4, 2, 2)) barplot(H, border="white", ylab = "Entropy", space=0, xlim=c(3.7, 97.3),yaxt="n" ) axis(side=2, at=c(0.2,0.4, 0.6, 0.8)) axis(side=3, at=(seq(0,length(con$seq),by=5)-0.5), labels=seq(0,length(con$seq),by=5)) box() # Plot2: residue frequencies par(mar = c(5, 4, 0, 2)) image(x=1:ncol(con$freq), y=1:nrow(con$freq), z=as.matrix(rev(as.data.frame(t(con$freq)))), col=col, yaxt="n", xaxt="n", xlab="Alignment Position", ylab="Residue Type") axis(side=1, at=seq(0,length(con$seq),by=5)) axis(side=2, at=c(1:22), labels=aa) axis(side=3, at=c(1:length(con$seq)), labels =con$seq) axis(side=4, at=c(1:22), labels=aa) grid(length(con$seq), length(aa)) box() for(i in 1:length(con$seq)) { text(i, which(aa==con$seq[i]),con$seq[i],col="white") } abline(h=c(3.5, 4.5, 5.5, 3.5, 7.5, 9.5, 12.5, 14.5, 16.5, 19.5), col="gray") par(oldpar) } \keyword{ utilities } bio3d/man/rle2.Rd0000644000176200001440000000260114046073105013157 0ustar liggesusers\name{rle2} \title{Run Length Encoding with Indices} \alias{rle2} \alias{print.rle2} \concept{runs} \description{ Compute the lengths, values and indices of runs of equal values in a vector. This is a modifed version of base function \code{rle()}. } \usage{ rle2(x) \method{print}{rle2}(x, digits = getOption("digits"), prefix = "", \dots) } \arguments{ \item{x}{an atomic vector for \code{rle()}; an object of class \code{"rle"} for \code{inverse.rle()}.} \item{\dots}{further arguments; ignored here.} \item{digits}{number of significant digits for printing, see \code{\link{print.default}}.} \item{prefix}{character string, prepended to each printed line.} } \details{ Missing values are regarded as unequal to the previous value, even if that is also missing. \code{inverse.rle()} is the inverse function of \code{rle2()} and \code{rle()}, reconstructing \code{x} from the runs. } \value{ \code{rle()} returns an object of class \code{"rle"} which is a list with components: \item{lengths}{an integer vector containing the length of each run.} \item{values}{a vector of the same length as \code{lengths} with the corresponding values.} } \examples{ x <- rev(rep(6:10, 1:5)) rle(x) ## lengths [1:5] 5 4 3 2 1 ## values [1:5] 10 9 8 7 6 rle2(x) ## lengths: int [1:5] 5 4 3 2 1 ## values : int [1:5] 10 9 8 7 6 ## indices: int [1:5] 5 9 12 14 15 } \keyword{manip} bio3d/man/var.xyz.Rd0000644000176200001440000000220014046073105013727 0ustar liggesusers\name{var.xyz} \alias{var.xyz} \alias{var.pdbs} \title{ Pairwise Distance Variance in Cartesian Coordinates } \description{ Calculate the variance of all pairwise distances in an ensemble of Cartesian coordinates. } \usage{ var.xyz(xyz, weights=TRUE) var.pdbs(pdbs, ...) } \arguments{ \item{xyz}{ an object of class \code{"xyz"} containing Cartesian coordinates in a matrix. } \item{weights }{ logical, if TRUE weights are calculated based on the pairwise distance variance. } \item{pdbs}{ a \sQuote{pdbs} object as object from function \code{pdbaln}. } \item{\dots}{ arguments passed to associated functions. } } \details{ This function calculates the variance of all pairwise distances in an ensemble of Cartesian coordinates. The primary use of this function is to calculate weights to scale the pair force constant for NMA. } \value{ Returns the a matrix of the pairwise distance variance, formated as weights if \sQuote{weights=TRUE}. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{nma.pdbs}} } \keyword{ utilities } bio3d/man/write.mol2.Rd0000644000176200001440000000155314046073105014322 0ustar liggesusers\name{write.mol2} \alias{write.mol2} \title{ Write MOL2 Format Coordinate File } \description{ Write a Sybyl MOL2 file } \usage{ write.mol2(mol, file = "R.mol2", append = FALSE) } \arguments{ \item{mol}{ a MOL2 structure object obtained from \code{\link{read.mol2}}. } \item{file}{ the output file name. } \item{append}{ logical, if TRUE output is appended to the bottom of an existing file (used primarly for writing multi-model files). } } \details{ See examples for further details. } \value{ Called for its effect. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \examples{ \donttest{ # Read MOL2 file mol <- read.mol2( system.file("examples/aspirin.mol2", package="bio3d") ) # Trim away H-atoms mol <- trim(mol, "noh") # Write new MOL2 file #write.mol2(mol) } } \keyword{ IO } bio3d/man/dist.xyz.Rd0000644000176200001440000000345414046073105014116 0ustar liggesusers\name{dist.xyz} \alias{dist.xyz} \title{ Calculate the Distances Between the Rows of Two Matrices } \description{ Compute the pairwise euclidean distances between the rows of two matrices. } \usage{ dist.xyz(a, b = NULL, all.pairs=TRUE, ncore=1, nseg.scale=1) } \arguments{ \item{a}{ a \sQuote{xyz} object, numeric data matrix, or vector. } \item{b}{ an optional second \sQuote{xyz} object, data matrix, or vector. } \item{all.pairs}{ logical, if TRUE all pairwise distances between the rows of \sQuote{a} and all rows of \sQuote{b} are computed, if FALSE only the distances between coresponding rows of \sQuote{a} and \sQuote{b} are computed. } \item{ncore }{ number of CPU cores used to do the calculation. \code{ncore>1} requires package \sQuote{parallel} installed. } \item{nseg.scale }{ split input data into specified number of segments prior to running multiple core calculation. See \code{\link{fit.xyz}}. } } \details{ This function returns a matrix of euclidean distances between each row of \sQuote{a} and all rows of \sQuote{b}. Input vectors are coerced to three dimensional matrices (representing the Cartesian coordinates x, y and z) prior to distance computation. If \sQuote{b} is not provided then the pairwise distances between all rows of \sQuote{a} are computed. } \value{ Returns a matrix of pairwise euclidean distances between each row of \sQuote{a} and all rows of \sQuote{b}. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \note{ This function will choke if \sQuote{b} has too many rows. } \seealso{ \code{\link{dm}}, \code{\link{dist}} } \examples{ dist.xyz( c(1,1,1, 3,3,3), c(3,3,3, 2,2,2, 1,1,1)) dist.xyz( c(1,1,1, 3,3,3), c(3,3,3, 2,2,2, 1,1,1), all.pairs=FALSE) } \keyword{ utilities } bio3d/man/lbio3d.Rd0000644000176200001440000000055614046073105013476 0ustar liggesusers\name{lbio3d} \alias{lbio3d} \title{ List all Functions in the bio3d Package } \description{ A simple shortcut for ls("package:bio3d"). } \usage{ lbio3d() } \value{ A character vector of function names from the bio3d package. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \keyword{ utilities } bio3d/man/read.pdb.Rd0000644000176200001440000001435314046073105014001 0ustar liggesusers\name{read.pdb} \alias{read.pdb} \alias{read.pdb2} \alias{print.pdb} \alias{summary.pdb} \title{ Read PDB File} \description{ Read a Protein Data Bank (PDB) coordinate file. } \usage{ read.pdb(file, maxlines = -1, multi = FALSE, rm.insert = FALSE, rm.alt = TRUE, ATOM.only = FALSE, hex = FALSE, verbose = TRUE) read.pdb2(file, maxlines = -1, multi = FALSE, rm.insert = FALSE, rm.alt = TRUE, ATOM.only = FALSE, verbose = TRUE) \method{print}{pdb}(x, printseq=TRUE, \dots) \method{summary}{pdb}(object, printseq=FALSE, \dots) } \arguments{ \item{file}{ a single element character vector containing the name of the PDB file to be read, or the four letter PDB identifier for online file access. } \item{maxlines}{ the maximum number of lines to read before giving up with large files. By default if will read up to the end of input on the connection. } \item{multi}{ logical, if TRUE multiple ATOM records are read for all models in multi-model files and their coordinates returned. } \item{rm.insert}{ logical, if TRUE PDB insert records are ignored. } \item{rm.alt}{ logical, if TRUE PDB alternate records are ignored. } \item{ATOM.only}{ logical, if TRUE only ATOM/HETATM records are stored. Useful for speed enhancements with large files where secondary structure, biological unit and other remark records are not required. } \item{hex}{ logical, if TRUE enable parsing of hexadecimal atom numbers (> 99.999) and residue numbers (> 9.999) (e.g. from VMD). Note that numbering is assumed to be consecutive (with no missing numbers) and the hexadecimals should start at atom number 100.000 and residue number 10.000 and proceed to the end of file. } \item{verbose}{ print details of the reading process. } \item{x}{ a PDB structure object obtained from \code{\link{read.pdb}}. } \item{object}{ a PDB structure object obtained from \code{\link{read.pdb}}. } \item{printseq}{ logical, if TRUE the PDB ATOM sequence will be printed to the screen. See also \code{\link{pdbseq}}. } \item{...}{ additional arguments to \sQuote{print}. } } \details{ \code{read.pdb} is a re-implementation (using Rcpp) of the slower but more tested R implementation of the same function (called \code{read.pdb2} since bio3d-v2.3). \code{maxlines} may be set so as to restrict the reading to a portion of input files. Note that the preferred means of reading large multi-model files is via binary DCD or NetCDF format trajectory files (see the \code{\link{read.dcd}} and \code{\link{read.ncdf}} functions). } \value{ Returns a list of class \code{"pdb"} with the following components: \item{atom}{ a data.frame containing all atomic coordinate ATOM and HETATM data, with a row per ATOM/HETATM and a column per record type. See below for details of the record type naming convention (useful for accessing columns). } \item{helix }{ \sQuote{start}, \sQuote{end} and \sQuote{length} of H type sse, where start and end are residue numbers \dQuote{resno}. } \item{sheet }{ \sQuote{start}, \sQuote{end} and \sQuote{length} of E type sse, where start and end are residue numbers \dQuote{resno}. } \item{seqres }{ sequence from SEQRES field. } \item{xyz }{ a numeric matrix of class \code{"xyz"} containing the ATOM and HETATM coordinate data. } \item{calpha }{ logical vector with length equal to \code{nrow(atom)} with TRUE values indicating a C-alpha \dQuote{elety}. } \item{remark }{ a list object containing information taken from 'REMARK' records of a \code{"pdb"}. It can be used for building biological units (See \code{\link{biounit}}). } \item{call }{ the matched call. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. For a description of PDB format (version3.3) see:\cr \url{http://www.wwpdb.org/documentation/format33/v3.3.html}. } \author{ Barry Grant } \note{ For both \code{atom} and \code{het} list components the column names can be used as a convenient means of data access, namely: Atom serial number \dQuote{eleno} , Atom type \dQuote{elety}, Alternate location indicator \dQuote{alt}, Residue name \dQuote{resid}, Chain identifier \dQuote{chain}, Residue sequence number \dQuote{resno}, Code for insertion of residues \dQuote{insert}, Orthogonal coordinates \dQuote{x}, Orthogonal coordinates \dQuote{y}, Orthogonal coordinates \dQuote{z}, Occupancy \dQuote{o}, and Temperature factor \dQuote{b}. See examples for further details. } \seealso{ \code{\link{atom.select}}, \code{\link{write.pdb}}, \code{\link{trim.pdb}}, \code{\link{cat.pdb}}, \code{\link{read.prmtop}}, \code{\link{as.pdb}}, \code{\link{read.dcd}}, \code{\link{read.ncdf}}, \code{\link{read.fasta.pdb}}, \code{\link{read.fasta}}, \code{\link{biounit}} } \examples{ ## Read a PDB file from the RCSB online database #pdb <- read.pdb("4q21") ## Read a PDB file from those included with the package pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) ## Print a brief composition summary pdb ## Examine the storage format (or internal *str*ucture) str(pdb) ## Print data for the first four atom pdb$atom[1:4,] ## Print some coordinate data head(pdb$atom[, c("x","y","z")]) ## Or coordinates as a numeric vector #head(pdb$xyz) ## Print C-alpha coordinates (can also use 'atom.select' function) head(pdb$atom[pdb$calpha, c("resid","elety","x","y","z")]) inds <- atom.select(pdb, elety="CA") head( pdb$atom[inds$atom, ] ) ## The atom.select() function returns 'indices' (row numbers) ## that can be used for accessing subsets of PDB objects, e.g. inds <- atom.select(pdb,"ligand") pdb$atom[inds$atom,] pdb$xyz[inds$xyz] ## See the help page for atom.select() function for more details. \dontrun{ ## Print SSE data for helix and sheet, ## see also dssp() and stride() functions print.sse(pdb) pdb$helix pdb$sheet$start ## Print SEQRES data pdb$seqres ## SEQRES as one letter code aa321(pdb$seqres) ## Where is the P-loop motif in the ATOM sequence inds.seq <- motif.find("G....GKT", pdbseq(pdb)) pdbseq(pdb)[inds.seq] ## Where is it in the structure inds.pdb <- atom.select(pdb,resno=inds.seq, elety="CA") pdb$atom[inds.pdb$atom,] pdb$xyz[inds.pdb$xyz] ## View in interactive 3D mode #view(pdb) } } \keyword{ IO } bio3d/man/aa2index.Rd0000644000176200001440000000370514046077017014022 0ustar liggesusers\name{aa2index} \alias{aa2index} \title{ Convert an Aminoacid Sequence to AAIndex Values } \description{ Converts sequences to aminoacid indeces from the \sQuote{AAindex} database. } \usage{ aa2index(aa, index = "KYTJ820101", window = 1) } \arguments{ \item{aa}{ a protein sequence character vector. } \item{index}{ an index name or number (default: \dQuote{KYTJ820101}, hydropathy index by Kyte-Doolittle, 1982). } \item{window}{ a positive numeric value, indicating the window size for smoothing with a sliding window average (default: 1, i.e. no smoothing). } } \details{ By default, this function simply returns the index values for each amino acid in the sequence. It can also be set to perform a crude sliding window average through the \code{window} argument. } \value{ Returns a numeric vector. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. \sQuote{AAIndex} is the work of Kanehisa and co-workers: Kawashima and Kanehisa (2000) \emph{Nucleic Acids Res.} \bold{28}, 374; Tomii and Kanehisa (1996) \emph{Protein Eng.} \bold{9}, 27--36; Nakai, Kidera and Kanehisa (1988) \emph{Protein Eng.} \bold{2}, 93--100. For a description of the \sQuote{AAindex} database see:\cr \url{https://www.genome.jp/aaindex/} or the \code{\link{aa.index}} documentation. } \author{ Ana Rodrigues } \seealso{ \code{\link{aa.index}}, \code{\link{read.fasta}} } \examples{ ## Residue hydropathy values seq <- c("R","S","D","X","-","X","R","H","Q","V","L") aa2index(seq) \dontrun{ ## Use a sliding window average aa2index(aa=seq, index=22, window=3) ## Use an alignment aln <- read.fasta(system.file("examples/hivp_xray.fa",package="bio3d")) prop <- t(apply(aln$ali, 1, aa2index, window=1)) ## find and use indices for volume calculations i <- which(sapply(aa.index, function(x) length(grep("volume", x$D, ignore.case=TRUE)) != 0)) sapply(i, function(x) aa2index(aa=seq, index=x, window=5)) } } \keyword{ utilities } bio3d/man/filter.identity.Rd0000644000176200001440000000417414046073105015437 0ustar liggesusers\name{filter.identity} \alias{filter.identity} \title{ Percent Identity Filter } \description{ Identify and filter subsets of sequences at a given sequence identity cutoff. } \usage{ filter.identity(aln = NULL, ide = NULL, cutoff = 0.6, verbose = TRUE, \dots) } \arguments{ \item{aln}{ sequence alignment list, obtained from \code{\link{seqaln}} or \code{\link{read.fasta}}, or an alignment character matrix. Not used if \sQuote{ide} is given.} \item{ide}{ an optional identity matrix obtained from \code{\link{seqidentity}}. } \item{cutoff}{ a numeric identity cutoff value ranging between 0 and 1. } \item{verbose}{ logical, if TRUE print details of the clustering process. } \item{\dots}{ additional arguments passed to and from functions. } } \details{ This function performs hierarchical cluster analysis of a given sequence identity matrix \sQuote{ide}, or the identity matrix calculated from a given alignment \sQuote{aln}, to identify sequences that fall below a given identity cutoff value \sQuote{cutoff}. } \value{ Returns a list object with components: \item{ind}{indices of the sequences below the cutoff value.} \item{tree}{an object of class \code{"hclust"}, which describes the tree produced by the clustering process. } \item{ide}{a numeric matrix with all pairwise identity values.} } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \seealso{ \code{\link{read.fasta}}, \code{\link{seqaln}}, \code{\link{seqidentity}}, \code{\link{entropy}}, \code{\link{consensus}} } \examples{ attach(kinesin) ide.mat <- seqidentity(pdbs) # Histogram of pairwise identity values op <- par(no.readonly=TRUE) par(mfrow=c(2,1)) hist(ide.mat[upper.tri(ide.mat)], breaks=30,xlim=c(0,1), main="Sequence Identity", xlab="Identity") k <- filter.identity(ide=ide.mat, cutoff=0.6) ide.cut <- seqidentity(pdbs$ali[k$ind,]) hist(ide.cut[upper.tri(ide.cut)], breaks=10, xlim=c(0,1), main="Sequence Identity", xlab="Identity") #plot(k$tree, axes = FALSE, ylab="Sequence Identity") #print(k$ind) # selected par(op) detach(kinesin) } \keyword{ utilities } bio3d/man/dccm.nma.Rd0000644000176200001440000000360414046073105013777 0ustar liggesusers\name{dccm.nma} \alias{dccm.nma} \title{ Dynamic Cross-Correlation from Normal Modes Analysis } \description{ Calculate the cross-correlation matrix from Normal Modes Analysis. } \usage{ \method{dccm}{nma}(x, nmodes = NULL, ncore = NULL, progress = NULL, \dots) } \arguments{ \item{x}{ an object of class \code{nma} as obtained from function \code{nma}. } \item{nmodes}{ numerical, number of modes to consider. } \item{ncore }{ number of CPU cores used to do the calculation. \code{ncore>1} requires package \sQuote{parallel} installed. } \item{progress}{ progress bar for use with shiny web app. } \item{\dots}{ additional arguments ? } } \details{ This function calculates the cross-correlation matrix from Normal Modes Analysis (NMA) obtained from \code{nma} of a protein structure. It returns a matrix of residue-wise cross-correlations whose elements, Cij, may be displayed in a graphical representation frequently termed a dynamical cross-correlation map, or DCCM. If Cij = 1 the fluctuations of residues i and j are completely correlated (same period and same phase), if Cij = -1 the fluctuations of residues i and j are completely anticorrelated (same period and opposite phase), and if Cij = 0 the fluctuations of i and j are not correlated. } \value{ Returns a cross-correlation matrix. } \references{ Wynsberghe. A.W.V, Cui, Q. \emph{Structure} \bold{14}, 1647--1653. Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{nma}}, \code{\link{plot.dccm}} } \examples{ ## Fetch stucture pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) ## Calculate normal modes modes <- nma(pdb) ## Calculate correlation matrix cm <- dccm.nma(modes) ## Plot correlation map plot(cm, sse = pdb, contour = FALSE, col.regions = bwr.colors(20), at = seq(-1, 1, 0.1)) } \keyword{ analysis } bio3d/man/read.ncdf.Rd0000644000176200001440000000634214046077017014153 0ustar liggesusers\name{read.ncdf} \alias{read.ncdf} \title{ Read AMBER Binary netCDF files } \description{ Read coordinate data from a binary netCDF trajectory file. } \usage{ read.ncdf(trjfile, headonly = FALSE, verbose = TRUE, time = FALSE, first = NULL, last = NULL, stride = 1, cell = FALSE, at.sel = NULL) } \arguments{ \item{trjfile}{ name of trajectory file to read. A vector if treat a batch of files } \item{headonly}{ logical, if TRUE only trajectory header information is returned. If FALSE only trajectory coordinate data is returned. } \item{verbose}{ logical, if TRUE print details of the reading process. } \item{time}{ logical, if TRUE the \code{first} and \code{last} have the time unit ps; Otherwise the unit is the frame number. } \item{first}{ starting time or frame number to read; If NULL, start from the begining of the file(s). } \item{last}{ read data until \code{last} time or frame number; If NULL or equal to -1, read until the end of the file(s). } \item{stride}{ take at every \code{stride} frame(s) } \item{cell}{ logical, if TRUE and \code{headonly} is FALSE return cell information only. Otherwise, return header or coordinates.} \item{at.sel}{an object of class \sQuote{select} indicating a subset of atomic coordinates to be read.} } \details{ Reads a AMBER netCDF format trajectory file with the help of David W. Pierce's (UCSD) ncdf4 package available from CRAN. } \value{ A list of trajectory header data, a numeric matrix of xyz coordinates with a frame/structure per row and a Cartesian coordinate per column, or a numeric matrix of cell information with a frame/structure per row and lengths and angles per column. If time=TRUE, row names of returned coordinates or cell are set to be the physical time of corresponding frames. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. \url{https://www.unidata.ucar.edu/software/netcdf/} \url{https://cirrus.ucsd.edu/~pierce/ncdf/} \url{https://ambermd.org/FileFormats.php#netcdf} } \author{ Barry Grant } \note{ See AMBER documentation for netCDF format description. NetCDF binary trajectory files are supported by the AMBER modules sander, pmemd and ptraj. Compared to formatted trajectory files, the binary trajectory files are smaller, higher precision and significantly faster to read and write. NetCDF provides for file portability across architectures, allows for backwards compatible extensibility of the format and enables the files to be self-describing. Support for this format is available in VMD. If you experience problems reading your trajectory file with read.ncdf() consider first reading your file into VMD and from there exporting a new DCD trajectory file with the 'save coordinates' option. This new file should be easily read with read.dcd(). } \seealso{ \code{\link{read.dcd}}, \code{\link{write.ncdf}}, \code{\link{read.pdb}}, \code{\link{write.pdb}}, \code{\link{atom.select}} } \examples{ \dontrun{ ##-- Read example trajectory file trtfile <- system.file("examples/hivp.dcd", package="bio3d") trj <- read.dcd(trtfile) ## Write to netCDF format write.ncdf(trj, "newtrj.nc") ## Read trj trj <- read.ncdf("newtrj.nc") } } \keyword{ IO } bio3d/man/plot.geostas.Rd0000644000176200001440000000267314046073105014746 0ustar liggesusers\name{plot.geostas} \alias{plot.geostas} \title{ Plot Geostas Results } \description{ Plot an atomic movement similarity matrix with domain annotation } \usage{ \method{plot}{geostas}(x, at=seq(0, 1, 0.1), main="AMSM with Domain Assignment", col.regions=rev(heat.colors(200)), margin.segments=x$grps, ...) } \arguments{ \item{x}{ an object of type \code{geostas} as obtained by the \sQuote{geostas} function. } \item{at}{ numeric vector specifying the levels to be colored. } \item{main}{ a main title for the plot. } \item{col.regions}{ color vector. See \code{contourplot} for more information. } \item{margin.segments}{ a numeric vector of cluster membership as obtained from cutree() or other community detection method. This will be used for bottom and left margin annotation. } \item{\dots}{ additional graphical parameters for \code{\link{plot.dccm}} and \code{contourplot}. } } \details{ This is a wrapper function for \code{\link{plot.dccm}} with appropriate adjustments for plotting atomic movement similarity matrix obtained from function \code{\link{geostas}}. See the \code{\link{plot.dccm}} for more details. } \value{ Called for its effect. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant, Lars Skjaerven } \seealso{ \code{\link{plot.dccm}}, \code{\link{geostas}} } \keyword{ hplot } bio3d/man/vec2resno.Rd0000644000176200001440000000240014046073105014216 0ustar liggesusers\name{vec2resno} \alias{vec2resno} \title{ Replicate Per-residue Vector Values } \description{ Replicate values in one vector based on consecutive entries in a second vector. Useful for adding per-residue data to all-atom PDB files. } \usage{ vec2resno(vec, resno) } \arguments{ \item{vec}{ a vector of values to be replicated.} \item{resno}{ a reference vector or a PDB structure object, obtained from \code{\link{read.pdb}}, upon which replication is based. } } \details{ This function can aid in mapping data to PDB structure files. For example, residue conservation per position (or any other one value per residue data) can be replicated to fit the B-factor field of an all atom PDB file which can then be rendered according to this field in a molecular viewer. A basic check is made to ensure that the number of consecutively unique entries in the reference vector equals the length of the vector to be replicated. } \value{ Returns a vector of replicated values. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \seealso{ \code{\link{read.pdb}}, \code{\link{atom.select}}, \code{\link{write.pdb}} } \examples{ vec2resno(c("a","b"), c(1,1,1,1,2,2)) } \keyword{ utilities } bio3d/man/plot.bio3d.Rd0000644000176200001440000001437214046073105014300 0ustar liggesusers\name{plot.bio3d} \alias{plot.bio3d} \alias{plotb3} \title{ Plots with marginal SSE annotation } \description{ Draw a standard scatter plot with optional secondary structure in the marginal regions. } \usage{ plotb3(x, resno = NULL, rm.gaps = FALSE, type = "h", main = "", sub = "", xlim = NULL, ylim = NULL, ylim2zero = TRUE, xlab = "Residue", ylab = NULL, axes = TRUE, ann = par("ann"), col = par("col"), sse = NULL, sse.type="classic", sse.min.length=5, top = TRUE, bot = TRUE, helix.col = "gray20", sheet.col = "gray80", sse.border = FALSE, ...) \method{plot}{bio3d}(...) } \arguments{ \item{x}{ a numeric vector of values to be plotted. Any reasonable way of defining these plot coordinates is acceptable. See the function \sQuote{xy.coords} for details. } \item{resno}{ an optional vector with length equal to that of \sQuote{x} that will be used to annotate the xaxis. This is typically a vector of residue numbers. If NULL residue positions from 1 to the length of \sQuote{x} will be used. See examples below. } \item{rm.gaps}{ logical, if TRUE gaps in \code{x}, indicated by NA values, will be removed from plot. } \item{type}{ one-character string giving the type of plot desired. The following values are possible, (for details, see \sQuote{plot}): \sQuote{p} for points, \sQuote{l} for lines, \sQuote{o} for over-plotted points and lines, \sQuote{b}, \sQuote{c}) for points joined by lines, \sQuote{s} and \sQuote{S} for stair steps and \sQuote{h} for histogram-like vertical lines. Finally, \sQuote{n} does not produce any points or lines. } \item{main}{ a main title for the plot, see also \sQuote{title}. } \item{sub}{ a sub-title for the plot. } \item{xlim}{ the x limits (x1,x2) of the plot. Note that x1 > x2 is allowed and leads to a reversed axis. } \item{ylim}{ the y limits of the plot. } \item{ylim2zero}{ logical, if TRUE the y-limits are forced to start at zero. } \item{xlab}{ a label for the x axis, defaults to a description of \sQuote{x}. } \item{ylab}{ a label for the y axis, defaults to a description of \sQuote{y}. } \item{axes}{ a logical value indicating whether both axes should be drawn on the plot. Use graphical parameter \sQuote{xaxt} or \sQuote{yaxt} to suppress just one of the axes. } \item{ann}{ a logical value indicating whether the default annotation (title and x and y axis labels) should appear on the plot. } \item{col}{ The colors for lines and points. Multiple colors can be specified so that each point is given its own color. If there are fewer colors than points they are recycled in the standard fashion. Lines are plotted in the first color specified. } \item{sse}{ secondary structure object as returned from \code{\link{dssp}}, \code{\link{stride}} or in certain cases \code{\link{read.pdb}}. } \item{sse.type}{ single element character vector that determines the type of secondary structure annotation drawn. The following values are possible, \sQuote{classic} and \sQuote{fancy}. See details and examples below. } \item{sse.min.length}{ a single numeric value giving the length below which secondary structure elements will not be drawn. This is useful for the exclusion of short helix and strand regions that can often crowd these forms of plots. } \item{top}{ logical, if TRUE rectangles for each sse are drawn towards the top of the plotting region. } \item{bot}{ logical, if TRUE rectangles for each sse are drawn towards the bottom of the plotting region. } \item{helix.col}{ The colors for rectangles representing alpha helices. } \item{sheet.col}{ The colors for rectangles representing beta strands. } \item{sse.border}{ The border color for all sse rectangles. } \item{\dots}{ other graphical parameters. } } \details{ This function is useful for plotting per-residue numeric vectors for a given protein structure (e.g. results from RMSF, PCA, NMA etc.) along with a schematic representation of major secondary structure elements. Two forms of secondary structure annotation are available: so called \sQuote{classic} and \sQuote{fancy}. The former draws marginal rectangles and has been available within Bio3D from version 0.1. The later draws more \sQuote{fancy} (and distracting) 3D like helices and arrowed strands. See the functions \sQuote{plot.default}, \code{\link{dssp}} and \code{\link{stride}} for further details. } \value{ Called for its effect. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \note{ Be sure to check the correspondence of your \sQuote{sse} object with the \sQuote{x} values being plotted as no internal checks are performed. } \seealso{ \code{\link{plot.default}}, \code{\link{dssp}}, \code{\link{stride}} } \examples{ \donttest{ # PDB server connection required - testing excluded ## Plot of B-factor values along with secondary structure from PDB pdb <- read.pdb( "1bg2" ) bfac <- pdb$atom[pdb$calpha,"b"] plot.bio3d(bfac, sse=pdb, ylab="B-factor", col="gray") points(bfac, typ="l") } \dontrun{ ## Use PDB residue numbers and include short secondary structure elements plot.bio3d(pdb$atom[pdb$calpha,"b"], sse=pdb, resno=pdb, ylab="B-factor", typ="l", lwd=1.5, col="blue", sse.min.length=0) ## Calculate secondary structure using stride() or dssp() #sse <- stride(pdb) sse <- dssp(pdb) ## Plot of B-factor values along with calculated secondary structure plot.bio3d(pdb$atom[pdb$calpha,"b"], sse=sse, ylab="B-factor", typ="l", col="blue", lwd=2) } \donttest{ # PDB server connection required - testing excluded ## Plot 'aligned' data respecting gap positions attach(transducin) pdb = read.pdb("1tnd") ## Reference PDB see: pdbs$id[1] pdb = trim.pdb(pdb, inds=atom.select(pdb, chain="A")) ## Plot of B-factor values with gaps plot.bio3d(pdbs$b, resno=pdb, sse=pdb, ylab="B-factor") ## Plot of B-factor values after removing all gaps plot.bio3d(pdbs$b, rm.gaps=TRUE, resno = pdb, sse=pdb, ylab="B-factor") detach(transducin) } ## Fancy secondary structure elements ##plot.bio3d(pdb$atom[pdb$calpha,"b"], sse=pdb, ssetype="fancy") ## Currently not implemented } \keyword{ hplot } bio3d/man/cna.Rd0000644000176200001440000002004314046073105013054 0ustar liggesusers\name{cna} \alias{cna} \alias{cna.dccm} \alias{cna.ensmb} \title{ Protein Dynamic Correlation Network Construction and Community Analysis. } \description{ This function builds both residue-based and community-based undirected weighted network graphs from an input correlation matrix, as obtained from the functions \sQuote{dccm}, \sQuote{dccm.nma}, and \sQuote{dccm.enma}. Community detection/clustering is performed on the initial residue based network to determine the community organization and network structure of the community based network. } \usage{ cna(cij, \dots) \method{cna}{dccm}(cij, cutoff.cij=0.4, cm=NULL, vnames=colnames(cij), cluster.method="btwn", collapse.method="max", cols=vmd_colors(), minus.log=TRUE, \dots) \method{cna}{ensmb}(cij, \dots, ncore = NULL) } \arguments{ \item{cij}{ A numeric array with 2 dimensions (nXn) containing atomic correlation values, where "n" is the residue number. The matrix elements should be in between 0 and 1 (atomic correlations). Can be also a set of correlation matrices for ensemble network analysis. See \sQuote{dccm} function in bio3d package for further details. } \item{\dots}{ Additional arguments passed to the methods \code{cna.dccm} and \code{cna.ensmb}. } \item{cutoff.cij}{ Numeric element specifying the cutoff on cij matrix values. Coupling below cutoff.cij are set to 0. } \item{cm}{ (optinal) A numeric array with 2 dimensions (nXn) containing binary contact values, where "n" is the residue number. The matrix elements should be 1 if two residues are in contact and 0 if not in contact. See the \sQuote{cmap} function in bio3d package for further details. } \item{vnames}{ A vector of names for each column in the input cij. This will be used for referencing residues in a similar way to residue numbers in later analysis. } \item{cluster.method}{ A character string specifying the method for community determination. Supported methods are:\cr btwn="Girvan-Newman betweenness"\cr walk="Random walk"\cr greed="Greedy algorithm for modularity optimization"\cr infomap="Infomap algorithm for community detection"\cr } \item{collapse.method}{ A single element character vector specifing the \sQuote{cij} collapse method, can be one of \sQuote{max}, \sQuote{median}, \sQuote{mean}, or \sQuote{trimmed}. By defualt the \sQuote{max} method is used to collapse the input residue based \sQuote{cij} matrix into a smaller community based network by taking the maximium \sQuote{abs(cij)} value between communities as the comunity-to-community cij value for clustered network construction. } \item{cols}{ A vector of colors assigned to network nodes. } \item{minus.log}{ Logical, indicating whether \sQuote{-log(abs(cij))} values should be used for network construction. } \item{ncore}{ Number of CPU cores used to do the calculation. By default, use all available cores. } } \value{ Returns a list object that includes igraph network and community objects with the following components: \item{network}{ An igraph residue-wise graph object. See below for more details.} \item{communities}{ An igraph residue-wise community object. See below for more details. } \item{communitiy.network}{ An igraph community-wise graph object. See below for more details. } \item{community.cij}{ Numeric square matrix containing the absolute values of the atomic correlation input matrix for each community as obtained from \sQuote{cij} via application of \sQuote{collapse.method}. } \item{cij}{ Numeric square matrix containing the absolute values of the atomic correlation input matrix. } If an ensemble of correlation matrices is provided, a list of \sQuote{cna} object, of the \sQuote{ecna} class, will be returned. } \details{ The input to this function should be a correlation matrix as obtained from the \sQuote{dccm}, \sQuote{dccm.mean} or \sQuote{dccm.nma} and related functions. Optionally, a contact map \sQuote{cm} may also given as input to filter the correlation matrix resulting in the exclusion of network edges between non-contacting atom pairs (as defined in the contact map). Internally this function calls the igraph package functions \sQuote{graph.adjacency}, \sQuote{edge.betweenness.community}, \sQuote{walktrap.community}, \sQuote{fastgreedy.community}, and \sQuote{infomap.community}. The first constructs an undirected weighted network graph. The second performs Girvan-Newman style clustering by calculating the edge betweenness of the graph, removing the edge with the highest edge betweenness score, calculates modularity (i.e. the difference between the current graph partition and the partition of a random graph, see Newman and Girvan, Physical Review E (2004), Vol 69, 026113), then recalculating edge betweenness of the edges and again removing the one with the highest score, etc. The returned community partition is the one with the highest overall modularity value. \sQuote{walktrap.community} implements the Pons and Latapy algorithm based on the idea that random walks on a graph tend to get "trapped" into densely connected parts of it, i.e. a community. The random walk process is used to determine a distance between nodes. Nodes with low distance values are joined in the same community. \sQuote{fastgreedy.community} instead determines the community structure based on the optimization of the modularity. In the starting state each node is isolated and belongs to a separated community. Communities are then joined together (according to the network edges) in pairs and the modularity is calculated. At each step the join resulting in the highest increase of modularity is chosen. This process is repeated until a single community is obtained, then the partitioning with the highest modularity score is selected. \sQuote{infomap.community} finds community structure that minimizes the expected description length of a random walker trajectory. } \author{ Guido Scarabelli and Barry Grant } \seealso{ \code{\link{plot.cna}}, \code{\link{summary.cna}}, \code{\link{vmd.cna}}, \code{\link[igraph:graph_from_adjacency_matrix]{graph.adjacency}}, \code{\link[igraph:cluster_edge_betweenness]{edge.betweenness.community}}, \code{\link[igraph:cluster_walktrap]{walktrap.community}}, \code{\link[igraph:cluster_fast_greedy]{fastgreedy.community}}, \code{\link[igraph:cluster_infomap]{infomap.community}} } \examples{ \donttest{ # PDB server connection required - testing excluded if (!requireNamespace("igraph", quietly = TRUE)) { message('Need igraph installed to run this example') } else { ##-- Build a correlation network from NMA results ## Read example PDB pdb <- read.pdb("4Q21") ## Perform NMA modes <- nma(pdb) #plot(modes, sse=pdb) ## Calculate correlations cij <- dccm(modes) #plot(cij, sse=pdb) ## Build, and betweenness cluster, a network graph net <- cna(cij, cutoff.cij=0.35) #plot(net, pdb) ## within VMD set 'coloring method' to 'Chain' and 'Drawing method' to Tube #vmd.cna(net, trim.pdb(pdb, atom.select(pdb,"calpha")), launch=TRUE ) ##-- Build a correlation network from MD results ## Read example trajectory file trtfile <- system.file("examples/hivp.dcd", package="bio3d") trj <- read.dcd(trtfile) ## Read the starting PDB file to determine atom correspondence pdbfile <- system.file("examples/hivp.pdb", package="bio3d") pdb <- read.pdb(pdbfile) ## select residues 24 to 27 and 85 to 90 in both chains inds <- atom.select(pdb, resno=c(24:27,85:90), elety='CA') ## lsq fit of trj on pdb xyz <- fit.xyz(pdb$xyz, trj, fixed.inds=inds$xyz, mobile.inds=inds$xyz) ## calculate dynamical cross-correlation matrix cij <- dccm(xyz) ## Build, and betweenness cluster, a network graph net <- cna(cij) # Plot coarse grained network based on dynamically coupled communities xy <- plot.cna(net) plot.dccm(cij, margin.segments=net$communities$membership) ##-- Begin to examine network structure - see CNA vignette for more details net summary(net) attributes(net) table( net$communities$members ) } } } \keyword{analysis} bio3d/man/struct.aln.Rd0000644000176200001440000000712214046073105014413 0ustar liggesusers\name{struct.aln} \alias{struct.aln} \title{ Structure Alignment Of Two PDB Files } \description{ Performs a sequence and structural alignment of two PDB entities. } \usage{ struct.aln(fixed, mobile, fixed.inds=NULL, mobile.inds=NULL, write.pdbs=TRUE, outpath = "fitlsq", prefix=c("fixed", "mobile"), max.cycles=10, cutoff=0.5, ... ) } \arguments{ \item{fixed}{ an object of class \code{pdb} as obtained from function \code{read.pdb}. } \item{mobile}{ an object of class \code{pdb} as obtained from function \code{read.pdb}. } \item{fixed.inds}{ atom and xyz coordinate indices obtained from \code{atom.select} that selects the elements of \code{fixed} upon which the calculation should be based.} \item{mobile.inds}{ atom and xyz coordinate indices obtained from \code{atom.select} that selects the elements of \code{mobile} upon which the calculation should be based.} \item{write.pdbs}{ logical, if TRUE the aligned structures are written to PDB files.} \item{outpath}{ character string specifing the output directory when \code{write.pdbs} is TRUE. } \item{prefix}{ a character vector of length 2 containing the filename prefix in which the fitted structures should be written. } \item{max.cycles}{ maximum number of refinement cycles.} \item{cutoff}{ standard deviation of the pairwise distances for aligned residues at which the fitting refinement stops.} \item{\dots}{ extra arguments passed to \code{seqaln} function.} } \details{ This function performs a sequence alignment followed by a structural alignment of the two PDB entities. Cycles of refinement steps of the structural alignment are performed to improve the fit by removing atoms with a high structural deviation. The primary purpose of the function is to allow rapid structural alignment (and RMSD analysis) for protein structures with unequal, but related sequences. The function reports the residues of \code{fixed} and \code{mobile} included in the final structural alignment, as well as the related RMSD values. This function makes use of the underlying functions \code{seqaln}, \code{rot.lsq}, and \code{rmsd}. } \value{ Returns a list with the following components: \item{a.inds}{ atom and xyz indices of \code{fixed}. } \item{b.inds}{ atom and xyz indices of \code{mobile}. } \item{xyz}{ fitted xyz coordinates of \code{mobile}. } \item{rmsd}{ a numeric vector of RMSD values after each cycle of refinement. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjarven } \seealso{ \code{\link{rmsd}}, \code{\link{rot.lsq}}, \code{\link{seqaln}}, \code{\link{pdbaln}} } \examples{ \donttest{ # Needs MUSCLE installed - testing excluded if(check.utility("muscle")) { ## Stucture of PKA: a <- read.pdb("1cmk") ## Stucture of PKB: b <- read.pdb("2jdo") ## Align and fit b on to a: path = file.path(tempdir(), "struct.aln") aln <- struct.aln(a, b, outpath = path, outfile = tempfile()) ## Should be the same as aln$rmsd (when using aln$a.inds and aln$b.inds) rmsd(a$xyz, b$xyz, aln$a.inds$xyz, aln$b.inds$xyz, fit=TRUE) invisible( cat("\nSee the output files:", list.files(path, full.names = TRUE), sep="\n") ) } } \dontrun{ ## Align two subunits of GroEL (open and closed states) a <- read.pdb("1sx4") b <- read.pdb("1xck") ## Select chain A only a.inds <- atom.select(a, chain="A") b.inds <- atom.select(b, chain="A") ## Align and fit: aln <- struct.aln(a,b, a.inds, b.inds) } } \keyword{ utilities } bio3d/man/load.enmff.Rd0000644000176200001440000001147614046073105014336 0ustar liggesusers\name{load.enmff} \alias{load.enmff} \alias{ff.calpha} \alias{ff.anm} \alias{ff.pfanm} \alias{ff.sdenm} \alias{ff.reach} \alias{ff.aaenm} \alias{ff.aaenm2} \title{ ENM Force Field Loader } \description{ Load force field for elastic network normal mode calculation. } \usage{ load.enmff(ff = 'calpha') ff.calpha(r, rmin=2.9, ...) ff.anm(r, cutoff=15, gamma=1, ...) ff.pfanm(r, cutoff=NULL, ...) ff.sdenm(r, atom.id, pdb, ...) ff.reach(r, atom.id, ...) ff.aaenm(r, ...) ff.aaenm2(r, atom.id, pdb, ...) } \arguments{ \item{ff}{ a character string specifying the force field to use: \sQuote{calpha}, \sQuote{anm}, \sQuote{pfanm}, \sQuote{reach}, or \sQuote{sdenm}. } \item{r}{ a numeric vector of c-alpha distances. } \item{rmin}{ lowest allowed atom-atom distance for the force constant calculation. The default of 2.9A is based on an evaluation of 24 high-resolution X-ray structures (< 1A). } \item{cutoff}{ numerical, cutoff for pair-wise interactions. } \item{gamma}{ numerical, global scaling factor. } \item{atom.id}{ atomic index. } \item{pdb}{ a \code{pdb} object as obtained from function \code{read.pdb}. } \item{...}{ additional arguments passed to and from functions. } } \details{ This function provides a collection of elastic network model (ENM) force fields for normal modes analysis (NMA) of protein structures. It returns a function for calculating the residue-residue spring force constants. The \sQuote{calpha} force field - originally developed by Konrad Hinsen - is the recommended one for most applications. It employs a spring force constant differentiating between nearest-neighbour pairs along the backbone and all other pairs. The force constant function was parameterized by fitting to a local minimum of a crambin model using the AMBER94 force field. The implementation of the \sQuote{ANM} (Anisotropic Network Model) force field originates from the lab of Ivet Bahar. It uses a simplified (step function) spring force constant based on the pair-wise distance. A variant of this from the Jernigan lab is the so-called \sQuote{pfANM} (parameter free ANM) with interactions that fall off with the square of the distance. The \sQuote{sdENM} (by Dehouck and Mikhailov) employs residue specific spring force constants. It has been parameterized through a statistical analysis of a total of 1500 NMR ensembles. The \sQuote{REACH} force field (by Moritsugu and Smith) is parameterized based on variance-covariance matrices obtained from MD simulations. It employs force constants that fall off exponentially with distance for non-bonded pairs. The all-atom ENM force fields (\sQuote{aaenm} and \sQuote{aaenm2}) was obtained by fitting to a local energy minimum of a crambin model derived from the AMBER99SB force field (same approach as in Hinsen et al 2000). It employs a pair force constant function which falls as r^-6. \sQuote{aanma2} employs additonally specific force constants for covalent and intra-residue atom pairs. See also \code{\link{aanma}} for more details. See references for more details on the individual force fields. } \note{ The arguments \sQuote{atom.id} and \sQuote{pdb} are used from within function \sQuote{build.hessian} for functions that are not simply a function of the pair-wise distance. e.g. the force constants in the \sQuote{sdENM} model computes the force constants based on a function of the residue types and calpha distance. } \value{ \sQuote{load.enmff} returns a function for calculating the spring force constants. The \sQuote{ff} functions returns a numeric vector of residue-residue spring force constants. } \references{ Skjaerven, L. et al. (2014) \emph{BMC Bioinformatics} \bold{15}, 399. Hinsen, K. et al. (2000) \emph{Chemical Physics} \bold{261}, 25--37. Atilgan, A.R. et al. (2001) \emph{Biophysical Journal} \bold{80}, 505--515. Dehouck Y. & Mikhailov A.S. (2013) \emph{PLoS Comput Biol} \bold{9}:e1003209. Moritsugu K. & Smith J.C. (2008) \emph{Biophysical Journal} \bold{95}, 1639--1648. Yang, L. et al. (2009) \emph{PNAS} \bold{104}, 12347-52. Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{nma}}, \code{\link{build.hessian}} } \examples{ ## Load the c-alpha force field pfc.fun <- load.enmff('calpha') ## Calculate the pair force constant for a set of C-alpha distances force.constants <- pfc.fun( seq(4,8, by=0.5) ) ## Calculate the complete spring force constant matrix ## Fetch PDB pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) ## Fetch only c-alpha coordinates ca.inds <- atom.select(pdb, 'calpha') xyz <- pdb$xyz[ca.inds$xyz] ## Calculate distance matrix dists <- dm.xyz(xyz, mask.lower=FALSE) ## all pair-wise spring force constants fc.matrix <- apply(dists, 1, pfc.fun) } \keyword{ utilities } bio3d/man/read.cif.Rd0000644000176200001440000000416314046073105013773 0ustar liggesusers\name{read.cif} \alias{read.cif} \title{ Read mmCIF File} \description{ Read a Protein Data Bank (mmCIF) coordinate file. } \usage{ read.cif(file, maxlines = -1, multi = FALSE, rm.insert = FALSE, rm.alt = TRUE, verbose = TRUE) } \arguments{ \item{file}{ a single element character vector containing the name of the mmCIF file to be read, or the four letter PDB identifier for online file access. } \item{maxlines}{ the maximum number of lines to read before giving up with large files. By default if will read up to the end of input on the connection. } \item{multi}{ logical, if TRUE multiple ATOM records are read for all models in multi-model files and their coordinates returned. } \item{rm.insert}{ logical, if TRUE PDB insert records are ignored. } \item{rm.alt}{ logical, if TRUE PDB alternate records are ignored. } \item{verbose}{ print details of the reading process. } } \details{ The current version of \code{read.cif} reads only ATOM/HETATM records and creates a \code{pdb} object of the data. See \code{read.pdb} for more info. } \value{ Returns a list of class \code{"pdb"} with the following components: \item{atom}{ a data.frame containing all atomic coordinate ATOM and HETATM data, with a row per ATOM/HETATM and a column per record type. See below for details of the record type naming convention (useful for accessing columns). } \item{xyz }{ a numeric matrix of class \code{"xyz"} containing the ATOM and HETATM coordinate data. } \item{calpha }{ logical vector with length equal to \code{nrow(atom)} with TRUE values indicating a C-alpha \dQuote{elety}. } \item{call }{ the matched call. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{read.pdb}} \code{\link{atom.select}}, \code{\link{write.pdb}}, \code{\link{trim.pdb}}, \code{\link{cat.pdb}}, \code{\link{read.prmtop}}, \code{\link{as.pdb}}, \code{\link{read.dcd}}, \code{\link{read.ncdf}}, } \examples{ ## Read a mmCIF file from the RCSB online database # cif <- read.cif("1hel") } \keyword{ IO } bio3d/man/network.amendment.Rd0000644000176200001440000000322214046073105015753 0ustar liggesusers\name{network.amendment} \alias{network.amendment} \title{ Amendment of a CNA Network According To A Input Community Membership Vector. } \description{ This function changes the \sQuote{communities} attribute of a \sQuote{cna} class object to match a given membership vector. } \usage{ network.amendment(x, membership, minus.log=TRUE) } \arguments{ \item{x}{ A protein network graph object as obtained from the \sQuote{cna} function. } \item{membership}{ A numeric vector containing the new community membership. } \item{minus.log}{ Logical. Whether to use the minus.log on the cij values. } } \value{ Returns a \sQuote{cna} class object with the attributes changed according to the membership vector provided. } \details{ This function is useful, in combination with \sQuote{community.tree}, for inspecting different community partitioning options of a input \sQuote{cna} object. See examples. } \author{ Guido Scarabelli } \seealso{ \code{\link{cna}}, \code{\link{community.tree}}, \code{\link{summary.cna}} } \examples{ \donttest{ # PDB server connection required - testing excluded if (!requireNamespace("igraph", quietly = TRUE)) { message('Need igraph installed to run this example') } else { ##-- Build a CNA object pdb <- read.pdb("4Q21") modes <- nma(pdb) cij <- dccm(modes) net <- cna(cij, cutoff.cij=0.2) ##-- Community membership vector for each clustering step tree <- community.tree(net, rescale=TRUE) ## Produce a new k=7 membership vector and CNA network memb.k7 <- tree$tree[ tree$num.of.comms == 7, ] net.7 <- network.amendment(net, memb.k7) plot(net.7, pdb) print(net) print(net.7) } } } \keyword{utility} bio3d/man/pca.tor.Rd0000644000176200001440000000275514046073105013673 0ustar liggesusers\name{pca.tor} \alias{pca.tor} \title{ Principal Component Analysis } \description{ Performs principal components analysis (PCA) on torsion angle \code{data}. } \usage{ \method{pca}{tor}(data, \dots) } \arguments{ \item{data}{ numeric matrix of torsion angles with a row per structure. } \item{\dots}{ additional arguments passed to the method \code{pca.xyz}. } } \value{ Returns a list with the following components: \item{L }{eigenvalues.} \item{U }{eigenvectors (i.e. the variable loadings).} \item{z.u }{scores of the supplied \code{data} on the pcs.} \item{sdev }{the standard deviations of the pcs.} \item{mean }{the means that were subtracted.} } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant and Karim ElSawy } \seealso{ \code{\link{torsion.xyz}}, \code{\link{plot.pca}}, \code{\link{plot.pca.loadings}}, \code{\link{pca.xyz}} } \examples{ ##-- PCA on torsion data for multiple PDBs attach(kinesin) gaps.pos <- gap.inspect(pdbs$xyz) tor <- t(apply( pdbs$xyz[, gaps.pos$f.inds], 1, torsion.xyz, atm.inc=1)) pc.tor <- pca.tor(tor[,-c(1,233,234,235)]) #plot(pc.tor) plot.pca.loadings(pc.tor) detach(kinesin) \dontrun{ ##-- PCA on torsion data from an MD trajectory trj <- read.dcd( system.file("examples/hivp.dcd", package="bio3d") ) tor <- t(apply(trj, 1, torsion.xyz, atm.inc=1)) gaps <- gap.inspect(tor) pc.tor <- pca.tor(tor[,gaps$f.inds]) plot.pca.loadings(pc.tor) } } \keyword{ utilities } \keyword{ multivariate } bio3d/man/cat.pdb.Rd0000644000176200001440000000234014046073105013626 0ustar liggesusers\name{cat.pdb} \alias{cat.pdb} \title{ Concatenate Multiple PDB Objects } \description{ Produce a new concatenated PDB object from two or more smaller PDB objects. } \usage{ cat.pdb(\dots, renumber=FALSE, rechain=TRUE) } \arguments{ \item{\dots}{ two or more PDB structure objects obtained from \code{\link{read.pdb}}. } \item{renumber}{ logical, if \sQuote{TRUE} residues will be renumbered. } \item{rechain}{ logical, if \sQuote{TRUE} molecules will be assigned new chain identifiers. } } \details{ This is a basic utility function for creating a concatenated PDB object based on multipe smaller PDB objects. } \value{ Returns an object of class \code{"pdb"}. See \code{\link{read.pdb}} for further details. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{read.pdb}}, \code{\link{atom.select}}, \code{\link{write.pdb}}, \code{\link{trim.pdb}} } \examples{ \dontrun{ ## Read a PDB file from the RCSB online database pdb1 <- read.pdb("1etl") pdb2 <- read.pdb("1hel") ## Concat new.pdb <- cat.pdb(pdb1, pdb2, pdb1, rechain=TRUE, renumber=TRUE) ## Write to file write.pdb(new.pdb, file="concat.pdb") } } \keyword{ utilities } bio3d/man/pdbaln.Rd0000644000176200001440000000526714046073105013566 0ustar liggesusers\name{pdbaln} \alias{pdbaln} \title{ Sequence Alignment of PDB Files } \description{ Create multiple sequences alignments from a list of PDB files returning aligned sequence and structure records. } \usage{ pdbaln(files, fit = FALSE, pqr = FALSE, ncore = 1, nseg.scale = 1, progress = NULL, ...) } \arguments{ \item{files}{ a character vector of PDB file names. Alternatively, a list of \code{pdb} objects can be provided. } \item{fit}{ logical, if TRUE coordinate superposition is performed on the input structures. } \item{pqr}{ logical, if TRUE the input structures are assumed to be in PQR format. } \item{ncore }{ number of CPU cores used to do the calculation. \code{ncore>1} requires package \sQuote{parallel} installed. } \item{nseg.scale }{ split input data into specified number of segments prior to running multiple core calculation. See \code{\link{fit.xyz}}. } \item{progress}{ progress bar for use with shiny web app. } \item{\dots}{ extra arguments passed to \code{seqaln} function. } } \details{ This wrapper function calls the underlying functions \code{read.pdb}, \code{pdbseq}, \code{seqaln} and \code{read.fasta.pdb} returning a list of class \code{"pdbs"} similar to that returned by \code{read.fasta.pdb}. As these steps are often error prone it is recomended for most cases that the individual underlying functions are called in sequence with checks made on the valadity of their respective outputs to ensure sensible results. } \value{ Returns a list of class \code{"pdbs"} with the following five components: \item{xyz}{numeric matrix of aligned C-alpha coordinates.} \item{resno}{character matrix of aligned residue numbers.} \item{b}{numeric matrix of aligned B-factor values.} \item{chain}{character matrix of aligned chain identifiers.} \item{id}{character vector of PDB sequence/structure names.} \item{ali}{character matrix of aligned sequences.} \item{call}{ the matched call. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \note{ See recommendation in details section above. } \seealso{ \code{\link{read.pdb}}, \code{\link{pdbseq}}, \code{\link{seqaln}}, \code{\link{read.fasta}},\code{\link{read.fasta.pdb}}, \code{\link{core.find}}, \code{\link{fit.xyz}}, \code{\link{read.all}}, \code{\link{pymol.pdbs}} } \examples{ \dontrun{ ##- Align PDBs (from vector of filenames) #files <- get.pdb(c("4q21","5p21"), URLonly=TRUE) files <- get.pdb(c("4q21","5p21"), path=tempdir(), overwrite=TRUE) pdbaln(files) ##- Align PDBs (from list of existing PDB objects) pdblist <- list(read.pdb(files[1]), read.pdb(files[2])) pdbaln(pdblist) } } \keyword{ utilities } bio3d/man/covsoverlap.Rd0000644000176200001440000000317714046073105014667 0ustar liggesusers\name{covsoverlap} \alias{covsoverlap} \alias{covsoverlap.enma} \alias{covsoverlap.nma} \title{ Covariance Overlap } \description{ Calculate the covariance overlap obtained from NMA. } \usage{ covsoverlap(...) \method{covsoverlap}{enma}(enma, ncore=NULL, ...) \method{covsoverlap}{nma}(a, b, subset=NULL, ...) } \arguments{ \item{enma}{ an object of class \code{"enma"} obtained from function \code{nma.pdbs}. } \item{ncore }{ number of CPU cores used to do the calculation. \code{ncore>1} requires package \sQuote{parallel} installed. } \item{a}{ a list object with elements \sQuote{U} and \sQuote{L} (e.g. as obtained from function \code{nma}) containing the eigenvectors and eigenvalues, respectively, to be compared with \code{b}. } \item{b}{ a list object with elements \sQuote{U} and \sQuote{L} (e.g. as obtained from function \code{nma}) containing the eigenvectors and eigenvalues, respectively, to be compared with \code{a}. } \item{subset}{ the number of modes to consider. } \item{\dots}{ arguments passed to associated functions. } } \details{ Covariance overlap is a measure for the similarity between two covariance matrices, e.g. obtained from NMA. } \value{ Returns the similarity coefficient(s). } \references{ Skjaerven, L. et al. (2014) \emph{BMC Bioinformatics} \bold{15}, 399. Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. Romo, T.D. et al. (2011) \emph{Proteins} \bold{79}, 23--34. } \author{ Lars Skjaerven } \seealso{ Other similarity measures: \code{\link{sip}}, \code{\link{covsoverlap}}, \code{\link{bhattacharyya}}. } \keyword{ utilities } bio3d/man/inspect.connectivity.Rd0000644000176200001440000000256414046073105016505 0ustar liggesusers\name{inspect.connectivity} \alias{inspect.connectivity} \title{ Check the Connectivity of Protein Structures } \description{ Investigate protein coordinates to determine if the structure has missing residues. } \usage{ inspect.connectivity(pdbs, cut=4.) } \arguments{ \item{pdbs}{ an object of class \code{3daling} as obtained from function \code{pdbaln} or \code{read.fasta.pdb}; a xyz matrix containing the cartesian coordinates of C-alpha atoms; or a \sQuote{pdb} object as obtained from function \code{read.pdb}. } \item{cut }{ cutoff value to determine residue connectvitiy. } } \details{ Utility function for checking if the PDB structures in a \sQuote{pdbs} object contains missing residues inside the structure. } \value{ Returns a vector. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{dm}}, \code{\link{gap.inspect}} } \examples{ \dontrun{ ## Fetch PDB files and split to chain A only PDB files ids <- c("1a70_A", "1czp_A", "1frd_A", "1fxi_A", "1iue_A", "1pfd_A") raw.files <- get.pdb(ids, path = "raw_pdbs") files <- pdbsplit(raw.files, ids, path = "raw_pdbs/split_chain") ## Sequence Alignement, and connectivity check pdbs <- pdbaln(files) cons <- inspect.connectivity(pdbs) ## omit files with missing residues files = files[cons] } } \keyword{ analysis } bio3d/man/print.fasta.Rd0000644000176200001440000000367314046073105014556 0ustar liggesusers\name{print.fasta} \alias{print.fasta} \alias{.print.fasta.ali} \title{ Printing Sequence Alignments } \description{ Print method for fasta and pdbs sequence alignment objects. } \usage{ \method{print}{fasta}(x, alignment=TRUE, ...) .print.fasta.ali(x, width = NULL, col.inds = NULL, numbers = TRUE, conservation=TRUE, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ a sequence alignment object as obtained from the functions \code{\link{read.fasta}}, \code{\link{read.fasta.pdb}}, \code{\link{pdbaln}}, \code{\link{seqaln}}, etc. } \item{alignment}{ logical, if TRUE the sequence alignment will be printed to screen. } \item{width}{ a single numeric value giving the number of residues per printed sequence block. By default this is determined from considering alignment identifier widths given a standard 85 column terminal window. } \item{col.inds}{ an optional numeric vector that can be used to select subsets of alignment positions/columns for printing. } \item{numbers}{ logical, if TRUE position numbers and a tick-mark every 10 positions are printed above and below sequence blocks. } \item{conservation}{ logical, if TRUE conserved and semi-conserved columns in the alignment are marked with an \sQuote{*} and \sQuote{^}, respectively. } \item{\dots}{ additional arguments to \sQuote{.print.fasta.ali}. } } \value{ Called mostly for its effect but also silently returns block divided concatenated sequence strings as a matrix. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696.} \author{ Barry Grant } \seealso{ \code{\link{read.fasta}}, \code{\link{read.fasta.pdb}}, \code{\link{pdbaln}}, \code{\link{seqaln}} } \examples{ file <- system.file("examples/kif1a.fa",package="bio3d") aln <- read.fasta(file) print(aln) # print(aln, col.inds=30:100, numbers=FALSE) } \keyword{ utilities } bio3d/man/dccm.Rd0000644000176200001440000000357514046073105013234 0ustar liggesusers\name{dccm} \alias{dccm} \title{ DCCM: Dynamical Cross-Correlation Matrix } \description{ Determine the cross-correlations of atomic displacements. } \usage{ dccm(x, ...) } \arguments{ \item{x}{ a numeric matrix of Cartesian coordinates with a row per structure/frame which will br passed to \code{dccm.xyz()}. Alternatively, an object of class \code{nma} as obtained from function \code{nma} that will be passed to the \code{dccm.nma()} function, see below for examples. } \item{\dots}{ additional arguments passed to the methods \code{dccm.xyz}, \code{dccm.pca}, \code{dccm.nma}, and \code{dccm.enma}. } } \details{ \code{dccm} is a generic function calling the corresponding function determined by the class of the input argument \code{x}. Use \code{methods("dccm")} to get all the methods for \code{dccm} generic: \code{\link{dccm.xyz}} will be used when \code{x} is a numeric matrix containing Cartesian coordinates (e.g. trajectory data). \code{\link{dccm.pca}} will calculate the cross-correlations based on an \code{pca} object. \code{\link{dccm.nma}} will calculate the cross-correlations based on an \code{nma} object. Similarly, \code{\link{dccm.enma}} will calculate the correlation matrices based on an ensemble of \code{nma} objects (as obtained from function \code{nma.pdbs}). \code{\link{plot.dccm}} and \code{\link{pymol.dccm}} provides convenient functionality to plot a correlation map, and visualize the correlations in the structure, respectively. See examples for each corresponding function for more details. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant, Lars Skjaerven } \seealso{ \code{\link{dccm.xyz}}, \code{\link{dccm.nma}}, \code{\link{dccm.enma}}, \code{\link{dccm.pca}}, \code{\link{plot.dccm}}, \code{\link{pymol.dccm}}. } \keyword{ utilities } bio3d/man/prune.cna.Rd0000644000176200001440000000376614046073105014221 0ustar liggesusers\name{prune.cna} \alias{prune.cna} \title{ Prune A cna Network Object } \description{ Remove nodes and their associated edges from a cna network graph. } \usage{ prune.cna(x, edges.min = 1, size.min = 1) } \arguments{ \item{x}{ A protein network graph object as obtained from the \sQuote{cna} function.} \item{edges.min}{ A single element numeric vector specifying the minimum number of edges that retained nodes should have. Nodes with less than \sQuote{edges.min} will be pruned. } \item{size.min}{ A single element numeric vector specifying the minimum node size that retained nodes should have. Nodes with less composite residues than \sQuote{size.min} will be pruned. } } \details{ This function is useful for cleaning up cna network plots by removing, for example, small isolated nodes. The output is a new cna object minus the pruned nodes and their associated edges. Node naming is preserved. } \value{ A cna class object, see function \code{\link{cna}} for details. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \note{ Some improvements to this function are required, including a better effort to preserve the original community structure rather than calculating a new one. Also may consider removing nodes form the raw.network object that is returned also. } \seealso{ \code{\link{cna}}, \code{\link{summary.cna}}, \code{\link{vmd.cna}}, \code{\link{plot.cna}} } \examples{ if (!requireNamespace("igraph", quietly = TRUE)) { message('Need igraph installed to run this example') } else { # Load the correlation network attach(hivp) # Read the starting PDB file to determine atom correspondence pdbfile <- system.file("examples/hivp.pdb", package="bio3d") pdb <- read.pdb(pdbfile) # Plot coarse grain network based on dynamically coupled communities par(mfcol=c(1,2), mar=c(0,0,0,0)) plot.cna(net) # Prune network dnet <- prune.cna(net, edges.min = 1) plot(dnet) detach(hivp) } } \keyword{ utility } bio3d/man/community.tree.Rd0000644000176200001440000000565414046073105015310 0ustar liggesusers\name{community.tree} \alias{community.tree} \title{ Reconstruction of the Girvan-Newman Community Tree for a CNA Class Object. } \description{ This function reconstructs the community tree of the community clustering analysis performed by the \sQuote{cna} function. It allows the user to explore different network community partitions. } \usage{ community.tree(x, rescale=FALSE) } \arguments{ \item{x}{ A protein network graph object as obtained from the \sQuote{cna} function. } \item{rescale}{ Logical, indicating whether to rescale the community names starting from 1. If FALSE, the community names will start from N+1, where N is the number of nodes. } } \value{ Returns a list object that includes the following components: \item{modularity}{ A numeric vector containing the modularity values. } \item{tree}{ A numeric matrix containing in each row the community residue memberships corresponding to a modularity value. The rows are ordered according to the \sQuote{modularity} object. } \item{num.of.comms}{ A numeric vector containing the number of communities per modularity value. The vector elements are ordered according to the \sQuote{modularity} object. } } \details{ The input of this function should be a \sQuote{cna} class object containing \sQuote{network} and \sQuote{communities} attributes. This function reconstructs the community residue memberships for each modularity value. The purpose is to facilitate inspection of alternate community partitioning points, which in practice often corresponds to a value close to the maximum of the modularity, but not the maximum value itself. } \author{ Guido Scarabelli } \seealso{ \code{\link{cna}}, \code{\link{network.amendment}}, \code{\link{summary.cna}} } \examples{ \donttest{ # PDB server connection required - testing excluded if (!requireNamespace("igraph", quietly = TRUE)) { message('Need igraph installed to run this example') } else { ###-- Build a CNA object pdb <- read.pdb("4Q21") modes <- nma(pdb) cij <- dccm(modes) net <- cna(cij, cutoff.cij=0.2) ##-- Reconstruct the community membership vector for each clustering step. tree <- community.tree(net, rescale=TRUE) ## Plot modularity vs number of communities plot( tree$num.of.comms, tree$modularity ) ## Inspect the maximum modularity value partitioning max.mod.ind <- which.max(tree$modularity) ## Number of communities (k) at max modularity tree$num.of.comms[ max.mod.ind ] ## Membership vector at this partition point tree$tree[max.mod.ind,] # Should be the same as that contained in the original CNA network object net$communities$membership == tree$tree[max.mod.ind,] # Inspect a new membership partitioning (at k=7) memb.k7 <- tree$tree[ tree$num.of.comms == 7, ] ## Produce a new k=7 community network net.7 <- network.amendment(net, memb.k7) plot(net.7, pdb) #view.cna(net.7, trim.pdb(pdb, atom.select(pdb,"calpha")), launch=TRUE ) } } } \keyword{analysis} bio3d/man/conserv.Rd0000644000176200001440000000561214046073105013777 0ustar liggesusers\name{conserv} \alias{conserv} \title{ Score Residue Conservation At Each Position in an Alignment } \description{ Quantifies residue conservation in a given protein sequence alignment by calculating the degree of amino acid variability in each column of the alignment. } \usage{ conserv(x, method = c("similarity","identity","entropy22","entropy10"), sub.matrix = c("bio3d", "blosum62", "pam30", "other"), matrix.file = NULL, normalize.matrix = TRUE) } \arguments{ \item{x}{ an alignment list object with \code{id} and \code{ali} components, similar to that generated by \code{\link{read.fasta}}. } \item{method}{ the conservation assesment method. } \item{sub.matrix}{ a matrix to score conservation. } \item{matrix.file}{ a file name of an arbitary user matrix. } \item{normalize.matrix}{ logical, if TRUE the matrix is normalized pior to assesing conservation. } } \details{ To assess the level of sequence conservation at each position in an alignment, the \dQuote{similarity}, \dQuote{identity}, and \dQuote{entropy} per position can be calculated. The \dQuote{similarity} is defined as the average of the similarity scores of all pairwise residue comparisons for that position in the alignment, where the similarity score between any two residues is the score value between those residues in the chosen substitution matrix \dQuote{sub.matrix}. The \dQuote{identity} i.e. the preference for a specific amino acid to be found at a certain position, is assessed by averaging the identity scores resulting from all possible pairwise comparisons at that position in the alignment, where all identical residue comparisons are given a score of 1 and all other comparisons are given a value of 0. \dQuote{Entropy} is based on Shannons information entropy. See the \code{\link{entropy}} function for further details. Note that the returned scores are normalized so that conserved columns score 1 and diverse columns score 0. } \value{ Returns a numeric vector of scores } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. Grant, B.J. et al. (2007) \emph{J. Mol. Biol.} \bold{368}, 1231--1248. } \author{ Barry Grant } \note{ Each of these conservation scores has particular strengths and weaknesses. For example, entropy elegantly captures amino acid diversity but fails to account for stereochemical similarities. By employing a combination of scores and taking the union of their respective conservation signals we expect to achieve a more comprehensive analysis of sequence conservation (Grant, 2007). } \seealso{ \code{\link{read.fasta}}, \code{\link{read.fasta.pdb}} } \examples{ ## Read an example alignment aln <- read.fasta(system.file("examples/hivp_xray.fa",package="bio3d")) ## Score conservation conserv(x=aln$ali, method="similarity", sub.matrix="bio3d") ##conserv(x=aln$ali,method="entropy22", sub.matrix="other") } \keyword{ utilities } bio3d/man/diag.ind.Rd0000644000176200001440000000167414046073105014001 0ustar liggesusers\name{diag.ind} \alias{diag.ind} \title{ Diagonal Indices of a Matrix } \description{ Returns a matrix of logicals the same size of a given matrix with entries 'TRUE' in the upper triangle close to the diagonal. } \usage{ diag.ind(x, n = 1, diag = TRUE) } \arguments{ \item{x}{ a matrix. } \item{n}{ the number of elements from the diagonal to include. } \item{diag}{ logical. Should the diagonal be included? } } \details{ Basic function useful for masking elements close to the diagonal of a given matrix. } \value{ Returns a matrix of logicals the same size of a given matrix with entries 'TRUE' in the upper triangle close to the diagonal. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \seealso{ \code{\link{diag}}, \code{\link{lower.tri}}, \code{\link{upper.tri}}, \code{\link{matrix}} } \examples{ diag.ind( matrix(,ncol=5,nrow=5), n=3 ) } \keyword{ utilities } bio3d/man/get.pdb.Rd0000644000176200001440000000455014046073105013643 0ustar liggesusers\name{get.pdb} \alias{get.pdb} \title{ Download PDB Coordinate Files } \description{ Downloads PDB coordinate files from the RCSB Protein Data Bank. } \usage{ get.pdb(ids, path = ".", URLonly=FALSE, overwrite = FALSE, gzip = FALSE, split = FALSE, format = "pdb", verbose = TRUE, ncore = 1, ...) } \arguments{ \item{ids}{ A character vector of one or more 4-letter PDB codes/identifiers or 6-letter PDB-ID_Chain-ID of the files to be downloaded, or a \sQuote{blast} object containing \sQuote{pdb.id}. } \item{path}{ The destination path/directory where files are to be written. } \item{URLonly}{ logical, if TRUE a character vector containing the URL path to the online file is returned and files are not downloaded. If FALSE the files are downloaded. } \item{overwrite}{ logical, if FALSE the file will not be downloaded if it alread exist. } \item{gzip}{ logical, if TRUE the gzipped PDB will be downloaded and extracted locally. } \item{split}{ logical, if TRUE \code{\link{pdbsplit}} funciton will be called to split pdb files into separated chains. } \item{format}{ format of the data file: \sQuote{pdb} or \sQuote{cif} for PDB and mmCIF file formats, respectively. } \item{verbose}{ print details of the reading process. } \item{ncore}{ number of CPU cores used to do the calculation. \code{ncore>1} requires package \sQuote{parallel} installed. } \item{\dots}{ extra arguments passed to \code{\link{pdbsplit}} function. } } \details{ This is a basic function to automate file download from the PDB. } \value{ Returns a list of successfully downloaded files. Or optionally if URLonly is TRUE a list of URLs for said files. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. For a description of PDB format (version3.3) see:\cr \url{http://www.wwpdb.org/documentation/format33/v3.3.html}. } \author{ Barry Grant } \seealso{ \code{\link{read.pdb}}, \code{\link{write.pdb}}, \code{\link{atom.select}}, \code{\link{read.fasta.pdb}}, \code{\link{read.fasta}}, \code{\link{pdbsplit}} } \examples{ \donttest{ # PDB server connection required - testing excluded ## PDB file paths get.pdb( c("1poo", "1moo"), URLonly=TRUE ) ## These URLs can be used by 'read.pdb' pdb <- read.pdb( get.pdb("5p21", URL=TRUE) ) summary(pdb) ## Download PDB file ## get.pdb("5p21") } } \keyword{utilities} bio3d/man/angle.xyz.Rd0000644000176200001440000000302714046073105014235 0ustar liggesusers\name{angle.xyz} \alias{angle.xyz} \title{ Calculate the Angle Between Three Atoms } \description{ A function for basic bond angle determination. } \usage{ angle.xyz(xyz, atm.inc = 3) } \arguments{ \item{xyz}{ a numeric vector of Cartisean coordinates. } \item{atm.inc}{ a numeric value indicating the number of atoms to increment by between successive angle evaluations (see below). } } \value{ Returns a numeric vector of angles. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \note{ With \code{atm.inc=1}, angles are calculated for each set of three successive atoms contained in \code{xyz} (i.e. moving along one atom, or three elements of \code{xyz}, between sucessive evaluations). With \code{atm.inc=3}, angles are calculated for each set of three successive non-overlapping atoms contained in \code{xyz} (i.e. moving along three atoms, or nine elements of \code{xyz}, between sucessive evaluations). } \seealso{ \code{\link{torsion.pdb}}, \code{\link{torsion.xyz}}, \code{\link{read.pdb}}, \code{\link{read.dcd}}. } \examples{ ## Read a PDB file pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) ## Angle between N-CA-C atoms of residue four inds <- atom.select(pdb, resno=4, elety=c("N","CA","C")) angle.xyz(pdb$xyz[inds$xyz]) ## Basic stats of all N-CA-C bound angles inds <- atom.select(pdb, elety=c("N","CA","C")) summary( angle.xyz(pdb$xyz[inds$xyz]) ) #hist( angle.xyz(pdb$xyz[inds$xyz]), xlab="Angle" ) } \keyword{ utilities } bio3d/man/binding.site.Rd0000644000176200001440000000644714046073105014704 0ustar liggesusers\name{binding.site} \alias{binding.site} \title{ Binding Site Residues } \description{ Determines the interacting residues between two PDB entities. } \usage{ binding.site(a, b=NULL, a.inds=NULL, b.inds=NULL, cutoff=5, hydrogens=TRUE, byres=TRUE, verbose=FALSE) } \arguments{ \item{a}{ an object of class \code{pdb} as obtained from function \code{read.pdb}. } \item{b}{ an object of class \code{pdb} as obtained from function \code{read.pdb}. } \item{a.inds}{ atom and xyz coordinate indices obtained from \code{atom.select} that selects the elements of \code{a} upon which the calculation should be based.} \item{b.inds}{ atom and xyz coordinate indices obtained from \code{atom.select} that selects the elements of \code{b} upon which the calculation should be based.} \item{cutoff}{ distance cutoff } \item{hydrogens}{ logical, if FALSE hydrogen atoms are omitted from the calculation. } \item{byres}{ logical, if TRUE all atoms in a contacting residue is returned. } \item{verbose}{ logical, if TRUE details of the selection are printed. } } \details{ This function reports the residues of \code{a} closer than a cutoff to \code{b}. This is a wrapper function calling the underlying function \code{dist.xyz}. If \code{b=NULL} then \code{b.inds} should be elements of \code{a} upon which the calculation is based (typically chain A and B of the same PDB file). If \code{b=a.inds=b.inds=NULL} the function will use \code{\link{atom.select}} with arguments \code{"protein"} and \code{"ligand"} to determine receptor and ligand, respectively. } \value{ Returns a list with the following components: \item{inds}{ object of class \code{select} with \code{atom} and \code{xyz} components. } \item{inds$atom}{ atom indices of \code{a}. } \item{inds$xyz}{ xyz indices of \code{a}. } \item{resnames}{ a character vector of interacting residues. } \item{resno}{ a numeric vector of interacting residues numbers. } \item{chain}{ a character vector of the associated chain identifiers of \code{"resno"}. } \item{call}{ the matched call. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{read.pdb}}, \code{\link{atom.select}}, \code{\link{dm}} } \examples{ \donttest{ # PDB server connection required - testing excluded pdb <- read.pdb('3dnd') ## automatically identify 'protein' and 'ligand' bs <- binding.site(pdb) bs$resnames #pdb$atom[bs$inds$atom, ] # provide indices rec.inds <- atom.select(pdb, chain="A", resno=1:350) lig.inds <- atom.select(pdb, chain="A", resno=351) bs <- binding.site(pdb, a.inds=rec.inds, b.inds=lig.inds) } \dontrun{ # Interaction between peptide and protein rec.inds <- atom.select(pdb, chain='A', resno=c(1:350)) lig.inds <- atom.select(pdb, chain='I', resno=c(5:24)) bs <- binding.site(pdb, a.inds=rec.inds, b.inds=lig.inds) } \donttest{ # Redundant testing excluded # Interaction between two PDB entities #rec <- read.pdb("receptor.pdb") #lig <- read.pdb("ligand.pdb") rec <- trim.pdb(pdb, inds=rec.inds) lig <- trim.pdb(pdb, inds=lig.inds) bs <- binding.site(rec, lig, hydrogens=FALSE) } } \keyword{ utilities } bio3d/man/plot.hmmer.Rd0000644000176200001440000000277214046073105014411 0ustar liggesusers\name{plot.hmmer} \alias{plot.hmmer} \title{ Plot a Summary of HMMER Hit Statistics. } \description{ Produces a number of basic plots that should facilitate hit selection from the match statistics of a HMMER result. } \usage{ \method{plot}{hmmer}(x, ...) } \arguments{ \item{x}{ HMMER results as obtained from the function \code{\link{hmmer}}. } \item{\dots}{ arguments passed to \code{\link{plot.blast}}. } } \details{ See \code{\link{plot.blast}} for details. } \value{ Produces a plot on the active graphics device and returns a three component list object: \item{hits}{ an ordered matrix detailing the subset of hits with a normalized score above the chosen cutoff. Database identifiers are listed along with their cluster group number. } \item{acc}{ a character vector containing the database accession identifier of each hit above the chosen threshold. } \item{pdb.id}{ a character vector containing the database accession identifier of each hit above the chosen threshold. } \item{inds}{ a numeric vector containing the indices of the hits relative to the input hmmer object.} } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant, Lars Skjaerven } \seealso{ \code{\link{hmmer}}, \code{\link{blast.pdb}} } \examples{ \dontrun{ # HMMER server connection required - testing excluded ##- PHMMER seq <- get.seq("2abl_A", outfile = tempfile()) res <- hmmer(seq, db="pdb") plot.hmmer(res) } } \keyword{ hplot } bio3d/man/plot.matrix.loadings.Rd0000644000176200001440000000530014046073105016372 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot.matrix.loadings.R \name{plot.matrix.loadings} \alias{plot.matrix.loadings} \title{Plot Residue-Residue Matrix Loadings} \usage{ \method{plot}{matrix.loadings}(x, pc = 1, resno = NULL, sse = NULL, mask.n = 0, plot = TRUE, ...) } \arguments{ \item{x}{the results of PCA as obtained from \code{\link{pca.array}}.} \item{pc}{the principal component along which the loadings will be shown.} \item{resno}{numerical vector or \sQuote{pdb} object as obtained from \code{\link{read.pdb}} to show residue number on the x- and y-axis.} \item{sse}{a \sQuote{sse} object as obtained from \code{\link{dssp}} or \code{\link{stride}}, or a \sQuote{pdb} object as obtained from \code{\link{read.pdb}} to show secondary structural elements along x- and y-axis.} \item{mask.n}{the number of elements from the diagonal to be masked from output.} \item{plot}{logical, if FALSE no plot will be shown.} \item{...}{additional arguments passed to \code{\link{plot.dccm}}.} } \value{ Plot and also returns a numeric matrix containing the loadings. } \description{ Plot residue-residue matrix loadings of a particular PC that is obtained from a principal component analysis (PCA) of cross-correlation or distance matrices. } \details{ The function plots loadings (the eigenvectors) of PCA performed on a set of matrices such as distance matrices from an ensemble of crystallographic structures and residue-residue cross-correlations or covariance matrices derived from ensemble NMA or MD simulation replicates (See \code{\link{pca.array}} for detail). Loadings are displayed as a matrix with dimension the same as the input matrices of the PCA. Each element of loadings represents the proportion that the corresponding residue pair contributes to the variance in a particular PC. The plot can be used to identify key regions that best explain the variance of underlying matrices. } \examples{ \dontrun{ attach(transducin) gaps.res <- gap.inspect(pdbs$ali) sse <- pdbs$sse[1, gaps.res$f.inds] # calculate modes modes <- nma(pdbs, ncore=NULL) # calculate cross-correlation matrices from the modes cijs <- dccm(modes, ncore=NULL)$all.dccm # do PCA on cross-correlation matrices pc <- pca.array(cijs) # plot loadings l <- plot.matrix.loadings(pc, sse=sse) l[1:10, 1:10] # plot loadings with elements 10-residue separated from diagonal masked plot.matrix.loadings(pc, sse=sse, mask.n=10) } } \author{ Xin-Qiu Yao } \references{ Skjaerven, L. et al. (2014) \emph{BMC Bioinformatics} \bold{15}, 399. Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \seealso{ \code{\link{plot.dccm}}, \code{\link{pca.array}} } bio3d/man/as.fasta.Rd0000644000176200001440000000237214046073105014020 0ustar liggesusers\name{as.fasta} \alias{as.fasta} \title{ Alignment to FASTA object } \description{ Convert alignment/sequence in matrix/vector format to FASTA object. } \usage{ as.fasta(x, id=NULL, \dots) } \arguments{ \item{x}{ a sequence character matrix/vector (e.g obtained from \code{\link{get.seq}} or \code{\link{seqbind}}). } \item{id}{ a vector of sequence names to serve as sequence identifers. By default the function will use the row names of the alignment if they exists, otherwise ids will be generated. } \item{\dots}{ arguments passed to and from functions. } } \details{ This function provides basic functionality to convert a sequence character matrix/vector to a FASTA object. } \value{ Returns a list of class \code{"fasta"} with the following components: \item{ali}{ an alignment character matrix with a row per sequence and a column per equivalent aminoacid/nucleotide. } \item{id}{ sequence names as identifers.} \item{call }{ the matched call. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{get.seq}}, \code{\link{seqaln}}, \code{\link{seqbind}}, \code{\link{pdbaln}} } \examples{ as.fasta(c("A", "C", "D")) } \keyword{ utilities } bio3d/man/pdb2aln.ind.Rd0000644000176200001440000000704614046073105014416 0ustar liggesusers\name{pdb2aln.ind} \alias{pdb2aln.ind} \title{ Mapping from alignment positions to PDB atomic indices } \description{ Find the best alignment between a PDB structure and an existing alignment. Then, given a set of column indices of the original alignment, returns atom selections of equivalent C-alpha atoms in the PDB structure. } \usage{ pdb2aln.ind(aln, pdb, inds = NULL, ...) } \arguments{ \item{aln}{ an alignment list object with \code{id} and \code{ali} components, similar to that generated by \code{\link{read.fasta}}, \code{\link{read.fasta.pdb}}, \code{\link{pdbaln}}, and \code{\link{seqaln}}. } \item{pdb}{ the PDB object to be aligned to \code{aln}. } \item{inds}{ a numeric vector containing a subset of column indices of \code{aln}. If NULL, non-gap positions of \code{aln$ali} are used. } \item{\dots}{ additional arguments passed to \code{\link{pdb2aln}}. } } \details{ Call \code{\link{pdb2aln}} to align the sequence of \code{pdb} to \code{aln}. Then, find the atomic indices of C-alpha atoms in \code{pdb} that are equivalent to \code{inds}, the subset of column indices of \code{aln$ali}. The function is a rountine utility in a combined analysis of molecular dynamics (MD) simulation trajectories and crystallographic structures. For example, a typical post-analysis of MD simulation is to compare the principal components (PCs) derived from simulation trajectories with those derived from crystallographic structures. The C-alpha atoms used to fit trajectories and do PCA must be the same (or equivalent) to those used in the analysis of crystallographic structures, e.g. the 'non-gap' alignment positions. Call \code{pdb2aln.ind} with providing relevant alignment positions, one can easily get equivalent atom selections ('select' class objects) for the simulation topology (PDB) file and then do proper trajectory analysis. } \value{ Returns a list containing two "select" objects: \item{a}{ atom and xyz indices for the alignment. } \item{b}{ atom and xyz indices for the PDB. } Note that if any element of \code{inds} has no corresponding CA atom in the PDB, the output \code{a$atom} and \code{b$atom} will be shorter than \code{inds}, i.e. only indices having equivalent CA atoms are returned. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Xin-Qiu Yao, Lars Skjaerven & Barry Grant } \seealso{ \code{\link{seq2aln}}, \code{\link{seqaln.pair}}, \code{\link{pdb2aln}} } \examples{ \dontrun{ ##--- Read aligned PDB coordinates (CA only) aln <- read.fasta(system.file("examples/kif1a.fa",package="bio3d")) pdbs <- read.fasta.pdb(aln) ##--- Read the topology file of MD simulations ##--- For illustration, here we read another pdb file (all atoms) pdb <- read.pdb("2kin") #--- Map the non-gap positions to PDB C-alpha atoms #pc.inds <- gap.inspect(pdbs$ali) #npc.inds <- pdb2aln.ind(aln=pdbs, pdb=pdb, inds=pc.inds$f.inds) #npc.inds$a #npc.inds$b #--- Or, map the non-gap positions with a known close sequence in the alignment #npc.inds <- pdb2aln.ind(aln=pdbs, pdb=pdb, aln.id="1bg2", inds=pc.inds$f.inds) #--- Map core positions core <- core.find(pdbs) core.inds <- pdb2aln.ind(aln=pdbs, pdb=pdb, inds = core$c1A.atom) core.inds$a core.inds$b ##--- Fit simulation trajectories to one of the X-ray structures based on ##--- core positions #xyz <- fit.xyz(pdbs$xyz[1,], pdb$xyz, core.inds$a$xyz, core.inds$b$xyz) ##--- Do PCA of trajectories based on non-gap positions #pc.traj <- pca(xyz[, npc.inds$b$xyz]) } } \keyword{ utilities } bio3d/man/torsion.xyz.Rd0000644000176200001440000000614114046073105014644 0ustar liggesusers\name{torsion.xyz} \alias{torsion.xyz} \title{ Calculate Torsion/Dihedral Angles } \description{ Defined from the Cartesian coordinates of four successive atoms (A-B-C-D) the torsion or dihedral angle is calculated about an axis defined by the middle pair of atoms (B-C). } \usage{ torsion.xyz(xyz, atm.inc = 4) } \arguments{ \item{xyz}{ a numeric vector of Cartisean coordinates. } \item{atm.inc}{ a numeric value indicating the number of atoms to increment by between successive torsion evaluations (see below). } } \details{ The conformation of a polypeptide or nucleotide chain can be usefully described in terms of angles of internal rotation around its constituent bonds. If a system of four atoms A-B-C-D is projected onto a plane normal to bond B-C, the angle between the projection of A-B and the projection of C-D is described as the torsion angle of A and D about bond B-C. By convention angles are measured in the range -180 to +180, rather than from 0 to 360, with positive values defined to be in the clockwise direction. With \code{atm.inc=1}, torsion angles are calculated for each set of four successive atoms contained in \code{xyz} (i.e. moving along one atom, or three elements of \code{xyz}, between sucessive evaluations). With \code{atm.inc=4}, torsion angles are calculated for each set of four successive non-overlapping atoms contained in \code{xyz} (i.e. moving along four atoms, or twelve elements of \code{xyz}, between sucessive evaluations). } \value{ A numeric vector of torsion angles. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Karim ElSawy } \note{ Contributions from Barry Grant. } \seealso{ \code{\link{torsion.pdb}}, \code{\link{pca.tor}}, \code{\link{wrap.tor}}, \code{\link{read.pdb}}, \code{\link{read.dcd}}. } \examples{ ## Calculate torsions for cis & trans conformers xyz <- rbind(c(0,-0.5,0,1,0,0,1,1,0,0,1.5,0), c(0,-0.5,0,1,0,0,1,1,0,2,1.5,0)-3) cis.tor <- torsion.xyz( xyz[1,] ) trans.tor <- torsion.xyz( xyz[2,] ) apply(xyz, 1, torsion.xyz) plot(range(xyz), range(xyz), xlab="", ylab="", typ="n", axes=FALSE) apply(xyz, 1, function(x){ lines(matrix(x, ncol=3, byrow=TRUE), lwd=4) points(matrix(x, ncol=3, byrow=TRUE), cex=2.5, bg="white", col="black", pch=21) } ) text( t(apply(xyz, 1, function(x){ apply(matrix(x, ncol=3, byrow=TRUE)[c(2,3),], 2, mean) })), labels=c(0,180), adj=-0.5, col="red") \donttest{ # PDB server connection required - testing excluded ##-- PDB torsion analysis pdb <- read.pdb("1bg2") tor <- torsion.pdb(pdb) ## basic Ramachandran plot plot(tor$phi, tor$psi) ## torsion analysis of a single coordinate vector inds <- atom.select(pdb,"calpha") tor.ca <- torsion.xyz(pdb$xyz[inds$xyz], atm.inc=3) ##-- Compare two PDBs to highlight interesting residues aln <- read.fasta(system.file("examples/kif1a.fa",package="bio3d")) m <- read.fasta.pdb(aln) a <- torsion.xyz(m$xyz[1,],1) b <- torsion.xyz(m$xyz[2,],1) ## Note the periodicity of torsion angles d <- wrap.tor(a-b) plot(m$resno[1,],d, typ="h") } } \keyword{ utilities } bio3d/man/pdbs2pdb.Rd0000644000176200001440000000360314046073105014016 0ustar liggesusers\name{pdbs2pdb} \alias{pdbs2pdb} \title{ PDBs to PDB Converter } \description{ Convert a list of PDBs from an \code{"pdbs"} object to a list of \code{pdb} objects. } \usage{ pdbs2pdb(pdbs, inds = NULL, rm.gaps = FALSE, all.atom=FALSE, ncore=NULL) } \arguments{ \item{pdbs}{ a list of class \code{"pdbs"} containing PDB file data, as obtained from \code{read.fasta.pdb}, \code{pdbaln}, or \code{read.all}. } \item{inds}{ a vector of indices that selects the PDB structures to convert. } \item{rm.gaps}{ logical, if TRUE atoms in gap containing columns are removed in the output \code{pdb} objects. } \item{all.atom}{ logical, if TRUE all atom data are converted (the \sQuote{pdbs} object must be obtained from \code{read.all} or \code{pdbs$id} refers to existing PDB files). } \item{ncore}{ number of CPU cores used to do the calculation. } } \details{ This function will generate a list of \code{pdb} objects from a \code{"pdbs"} class. See examples for more details/ } \value{ Returns a list of \code{pdb} objects. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{read.pdb}}, \code{\link{pdbaln}}, \code{\link{read.fasta.pdb}}. } \examples{ \dontrun{ ## Fetch PDBs pdb.ids <- c("1YX5_B", "3NOB", "1P3Q_U") #outdir <- paste(tempdir(), "/raw_pdbs", sep="") outdir = "raw_pdbs" raw.files <- get.pdb(pdb.ids, path = outdir) ## Split PDBs by chain ID and multi-model records all.files <- pdbsplit(raw.files, pdb.ids, path =paste(outdir, "/split_chain", sep="")) ## Align and fit pdbs <- pdbaln(all.files, fit=TRUE) ## Convert back to PDB objects all.pdbs <- pdbs2pdb(pdbs) ## Access the first PDB object ## all.pdbs[[1]] ## Return PDB objects consisting of only ## atoms in non-gap positions all.pdbs <- pdbs2pdb(pdbs, rm.gaps=TRUE) } } \keyword{ utilities } bio3d/man/vmd_colors.Rd0000644000176200001440000000235114046073105014464 0ustar liggesusers\name{vmd_colors} \alias{vmd_colors} \title{ VMD Color Palette } \description{ This function creates a character vector of the colors used by the VMD molecular graphics program. } \usage{ vmd_colors(n=33, picker=FALSE, ...) } \arguments{ \item{n}{ The number of desired colors chosen in sequence from the VMD color palette (>=1) } \item{picker}{ Logical, if TRUE a color wheel plot will be produced to aid with color choice. } \item{\dots}{ Extra arguments passed to the \code{rgb} function, including alpha transparency. } } \details{ The function uses the underlying 33 RGB color codes from VMD, See \url{http://www.ks.uiuc.edu/Research/vmd/}. Note that colors will be recycled if \dQuote{n} > 33 with a warning issued. When \sQuote{picker} is set to \dQuote{TRUE} a color wheel of the requested colors will be plotted to the currently active device. } \value{ Returns a character vector with color names. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. \url{http://www.ks.uiuc.edu/Research/vmd/} } \author{ Barry Grant } \seealso{ \code{\link{bwr.colors}} } \examples{ ## Generate a vector of 10 colors clrs <- vmd_colors(10) vmd_colors(4, picker=TRUE) } \keyword{utility} bio3d/man/plot.fluct.Rd0000644000176200001440000001105714046073105014412 0ustar liggesusers\name{plot.fluct} \alias{plot.fluct} \title{ Plot Fluctuations } \description{ Produces a plot of atomic fluctuations obtained from ensemble normal mode analysis or molecular dynamics simulations. } \usage{ \method{plot}{fluct}(x, col = NULL, label = rownames(x), signif = FALSE, p.cutoff = 0.005, q.cutoff = 0.04, s.cutoff = 5, n.cutoff = 2, mean = FALSE, polygon = FALSE, spread = FALSE, offset = 1, ncore = NULL, ...) } \arguments{ \item{x}{ a numeric vector or matrix containing atomic fluctuation data obtained from e.g. \code{\link{nma.pdbs}} or \code{\link{rmsf}}. } \item{col}{ a character vector of plotting colors. Used also to group fluctuation profiles. NA values in col will omit the corresponding fluctuation profile in the plot. } \item{label}{ a character vector of plotting labels with length matching \code{nrow(x)}. If \code{mean=TRUE}, the length of \code{label} can be equal to the number of categories indicated by \code{col}. } \item{signif}{ logical, if TRUE significance of fluctuation difference is calculated and annotated for each atomic position. } \item{p.cutoff}{ Cutoff of p-value to define significance. } \item{q.cutoff}{ Cutoff of the mean fluctuation difference to define significance. } \item{s.cutoff}{ Cutoff of sample size in each group to calculate the significance. } \item{n.cutoff}{ Cutoff of consecutive residue positions with significant fluctuation difference. If the actual number is less than the cutoff, correponding postions will not be annotated. } \item{mean}{ logical, if TRUE plot mean fluctuations of each group. Significance is still calculated with the original data. } \item{polygon}{ logical, if TRUE a nicer plot with area under the line for the first row of \code{x} are filled with polygons. } \item{ncore }{ number of CPU cores used to do the calculation. By default (\code{ncore=NULL}), use all available CPU cores. The argument is only used when \code{signif=TRUE}. } \item{spread}{ logical, if TRUE the fluctuation profiles are spread - i.e. not on top of each other. } \item{offset}{ numerical offset value in use when \sQuote{spread=TRUE}. } \item{\dots}{ extra plotting arguments passed to \code{plot.bio3d}. } } \details{ The significance calculation is performed when \code{signif=TRUE} and there are at least two groups with sample size larger than or equal to \code{s.cutoff}. A "two-sided" student's t-test is performed for each atomic position (each column of \code{x}). If \code{x} contains gaps, indicated by \code{NA}s, only non-gapped positions are considered. The position is considered significant if both \code{p-value <= p.cutoff} and the mean value difference of the two groups, q, satisfies \code{q >= q.cutoff}. If more than two groups are available, every pair of groups are subjected to the t-test calculation and the minimal p-value along with the q-value for the corresponding pair are used for the significance evaluation. } \value{ If significance is calculated, return a vector indicating significant positions. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Xin-Qiu Yao, Lars Skjaerven, Barry Grant } \seealso{ \code{\link{plot.bio3d}}, \code{\link{rmsf}}, \code{\link{nma.pdbs}}, \code{\link[stats:t.test]{t.test}}, \code{\link[graphics:polygon]{polygon}}. } \examples{ \dontrun{ ## load transducin example data attach(transducin) ## subset of pdbs to analyze inds = c(1:5, 16:20) pdbs <- trim(pdbs, row.inds=inds) gaps.res = gap.inspect(pdbs$ali) ## reference RESNO and SSE for axis annotations resno <- pdbs$resno[1, gaps.res$f.inds] sse <- pdbs$sse[1, gaps.res$f.inds] ## eNMA calculation and obtain modes of motion including atomic fluctuations modes <- nma(pdbs, ncore=NULL) x = modes$fluctuation ## simple line plot with SSE annotation plot.fluct(x, sse=sse, resno=resno) ## group data by specifying colors of each fluctuation line; same color indicates ## same group. Also do significance calculation and annotation col = c(rep('red', 5), rep('blue', 5)) plot.fluct(x, col=col, signif=TRUE, sse=sse, resno=resno) ## spread lines plot.fluct(x, col=col, signif=TRUE, sse=sse, resno=resno, typ='l', spread=TRUE) ## show only line of mean values for each group. ## Nicer plot with area shaded for the first group. plot.fluct(x, col=col, signif=TRUE, sse=sse, resno=resno, mean=TRUE, polygon=TRUE, label=c('GTP', 'GDI')) detach(transducin) } } \keyword{ hplot } bio3d/man/orient.pdb.Rd0000644000176200001440000000265414046073105014367 0ustar liggesusers\name{orient.pdb} \alias{orient.pdb} \title{ Orient a PDB Structure } \description{ Center, to the coordinate origin, and orient, by principal axes, the coordinates of a given PDB structure or xyz vector. } \usage{ orient.pdb(pdb, atom.subset = NULL, verbose = TRUE) } \arguments{ \item{pdb}{ a pdb data structure obtained from \code{\link{read.pdb}} or a vector of \sQuote{xyz} coordinates. } \item{atom.subset}{ a subset of atom positions to base orientation on. } \item{verbose}{ print dimension details. } } \value{ Returns a numeric vector of re-oriented coordinates. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \note{ Centering and orientation can be restricted to a \code{atom.subset} of atoms. } \seealso{ \code{\link{read.pdb}}, \code{\link{write.pdb}}, \code{\link{fit.xyz}}, \code{\link{rot.lsq}} , \code{\link{atom.select}}} \examples{ \donttest{ # PDB server connection required - testing excluded pdb <- read.pdb( "1bg2" ) xyz <- orient.pdb(pdb) #write.pdb(pdb, xyz = xyz, file = "mov1.pdb") # Based on C-alphas inds <- atom.select(pdb, "calpha") xyz <- orient.pdb(pdb, atom.subset=inds$atom) #write.pdb(pdb, xyz = xyz, file = "mov2.pdb") # Based on a central Beta-strand inds <- atom.select(pdb, resno=c(224:232), elety='CA') xyz <- orient.pdb(pdb, atom.subset=inds$atom) #write.pdb(pdb, xyz = xyz, file = "mov3.pdb") } } \keyword{ manip } bio3d/man/seqbind.Rd0000644000176200001440000000236314046073105013745 0ustar liggesusers\name{seqbind} \alias{seqbind} \title{ Combine Sequences by Rows Without Recycling } \description{ Take vectors and/or matrices arguments and combine them row-wise without recycling them (as is the case with \code{\link{rbind}}). } \usage{ seqbind(..., blank = "-") } \arguments{ \item{\dots}{ vectors, matrices, and/or alignment \sQuote{fasta} objects to combine. } \item{blank}{ a character to add to short arguments, to achieve the same length as the longer argument. } } \value{ Returns a list of class \code{"fasta"} with the following components: \item{ali}{ an alignment character matrix with a row per sequence and a column per equivalent aminoacid/nucleotide. } \item{id}{ sequence names as identifers.} \item{call}{ the matched call. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \seealso{ \code{\link{seqaln}}, \code{\link{read.fasta}}, \code{\link{read.pdb}}, \code{\link{write.fasta}}, \code{\link{rbind}} } \examples{ \dontrun{ ## Read two pdbs a.pdb <- read.pdb("1bg2") b.pdb <- read.pdb("1goj") seqs <- seqbind(aa321(a.pdb$atom[a.pdb$calpha,"resid"]), aa321(b.pdb$atom[b.pdb$calpha,"resid"])) # seqaln(seqs) } } \keyword{ utilities } bio3d/man/fit.xyz.Rd0000644000176200001440000001217014046077017013736 0ustar liggesusers\name{fit.xyz} \alias{fit.xyz} \alias{rot.lsq} \title{ Coordinate Superposition } \description{ Coordinate superposition with the Kabsch algorithm. } \usage{ fit.xyz(fixed, mobile, fixed.inds = NULL, mobile.inds = NULL, verbose=FALSE, prefix= "", pdbext = "", outpath = "fitlsq", full.pdbs=FALSE, ncore = 1, nseg.scale = 1, ...) rot.lsq(xx, yy, xfit = rep(TRUE, length(xx)), yfit = xfit, verbose = FALSE) } \arguments{ \item{fixed }{ numeric vector of xyz coordinates.} \item{mobile}{ numeric vector, numeric matrix, or an object with an \code{xyz} component containing one or more coordinate sets. } \item{fixed.inds}{ a vector of indices that selects the elements of \code{fixed} upon which fitting should be based.} \item{mobile.inds}{ a vector of indices that selects the elements of \code{mobile} upon which fitting should be based.} \item{full.pdbs}{ logical, if TRUE \dQuote{full} coordinate files (i.e. all atoms) are written to the location specified by \code{outpath}. } \item{prefix}{ prefix to mobile$id to locate \dQuote{full} input PDB files. Only required if \code{full.pdbs} is TRUE. } \item{pdbext}{ the file name extension of the input PDB files. } \item{outpath}{ character string specifing the output directory when \code{full.pdbs} is TRUE. } \item{xx}{ numeric vector corresponding to the moving \sQuote{subject} coordinate set. } \item{yy}{ numeric vector corresponding to the fixed \sQuote{target} coordinate set. } \item{xfit}{ logical vector with the same length as \code{xx}, with TRUE elements corresponding to the subset of positions upon which fitting is to be performed. } \item{yfit}{ logical vector with the same length as \code{yy}, with TRUE elements corresponding to the subset of positions upon which fitting is to be performed. } \item{verbose}{ logical, if TRUE more details are printed. } \item{\dots}{ other parameters for \code{\link{read.pdb}}. } \item{ncore }{ number of CPU cores used to do the calculation. \code{ncore>1} requires package \sQuote{parallel} installed. } \item{nseg.scale }{ split input data into specified number of segments prior to running multiple core calculation. } } \details{ The function \code{fit.xyz} is a wrapper for the function \code{rot.lsq}, which performs the actual coordinate superposition. The function \code{rot.lsq} is an implementation of the Kabsch algorithm (Kabsch, 1978) and evaluates the optimal rotation matrix to minimize the RMSD between two structures. Since the Kabsch algorithm assumes that the number of points are the same in the two input structures, care should be taken to ensure that consistent atom sets are selected with \code{fixed.inds} and \code{mobile.inds}. Optionally, \dQuote{full} PDB file superposition and output can be accomplished by setting \cr \code{full.pdbs=TRUE}. In that case, the input (\code{mobile}) passed to \code{fit.xyz} should be a list object obtained with the function \code{\link{read.fasta.pdb}}, since the components \code{id}, \code{resno} and \code{xyz} are required to establish correspondences. See the examples below. In dealing with large vector and matrix, running on multiple cores, especially when \code{ncore>>1}, may ask for a large portion of system memory. To avoid the overuse of memory, input data is first split into segments (for xyz matrix, the splitting is along the row). The number of data segments is equal to \code{nseg.scale*nseg.base}, where \code{nseg.base } is an integer determined by the dimension of the data. } \value{ Returns moved coordinates. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. Kabsch \emph{Acta Cryst} (1978) \bold{A34}, 827--828. } \author{ Barry Grant with \code{rot.lsq} contributions from Leo Caves } \seealso{ \code{\link{rmsd}}, \code{\link{read.pdb}}, \code{\link{read.fasta.pdb}}, \code{\link{read.dcd}} } \examples{ \donttest{ # PDB server connection required - testing excluded ##--- Read an alignment & Fit aligned structures aln <- read.fasta(system.file("examples/kif1a.fa",package="bio3d")) pdbs <- read.fasta.pdb(aln) gaps <- gap.inspect(pdbs$xyz) xyz <- fit.xyz( fixed = pdbs$xyz[1,], mobile = pdbs$xyz, fixed.inds = gaps$f.inds, mobile.inds = gaps$f.inds ) #rmsd( xyz[, gaps$f.inds] ) #rmsd( pdbs$xyz[, gaps$f.inds] ) } \dontrun{ ##-- Superpose again this time outputing PDBs xyz <- fit.xyz( fixed = pdbs$xyz[1,], mobile = pdbs, fixed.inds = gaps$f.inds, mobile.inds = gaps$f.inds, outpath = "rough_fit", full.pdbs = TRUE) } \donttest{ ##--- Fit two PDBs A <- read.pdb("1bg2") A.ind <- atom.select(A, resno=c(256:269), elety='CA') B <- read.pdb("2kin") B.ind <- atom.select(B, resno=c(257:270), elety='CA') xyz <- fit.xyz(fixed=A$xyz, mobile=B$xyz, fixed.inds=A.ind$xyz, mobile.inds=B.ind$xyz) } \dontrun{ # Write out moved PDB C <- B; C$xyz = xyz write.pdb(pdb=C, file = "moved.pdb") } } \keyword{ utilities } bio3d/man/inner.prod.Rd0000644000176200001440000000227614046073105014401 0ustar liggesusers\name{inner.prod} \alias{inner.prod} \title{ Mass-weighted Inner Product } \description{ Inner product of vectors (mass-weighted if requested). } \usage{ inner.prod(x, y, mass=NULL) } \arguments{ \item{x}{ a numeric vector or matrix. } \item{y}{ a numeric vector or matrix. } \item{mass}{ a numeric vector containing the atomic masses for weighting. } } \details{ This function calculates the inner product between two vectors, or alternatively, the column-wise vector elements of matrices. If atomic masses are provided, the dot products will be mass-weighted. See examples for more details. } \value{ Returns the inner product(s). } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{nma} }, \code{\link{normalize.vector} } } \examples{ ## Matrix operations x <- 1:3 y <- diag(x) z <- matrix(1:9, ncol = 3, nrow = 3) inner.prod(x,y) inner.prod(y,z) ## Application to normal modes pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) ## Calculate (vibrational) normal modes modes <- nma(pdb) ## Check for orthogonality inner.prod(modes$U[,7], modes$U[,8]) } \keyword{ utilities } bio3d/man/plot.pca.Rd0000644000176200001440000000714714046073105014045 0ustar liggesusers\name{plot.pca} \alias{plot.pca} \alias{plot.pca.score} \alias{plot.pca.scree} \title{ Plot PCA Results } \description{ Produces a z-score plot (conformer plot) and an eigen spectrum plot (scree plot). } \usage{ \method{plot}{pca}(x, pc.axes=NULL, pch=16, col=par("col"), cex=0.8, mar=c(4, 4, 1, 1),...) \method{plot}{pca.scree}(x, y = NULL, type = "o", pch = 18, main = "", sub = "", xlim = c(0, 20), ylim = NULL, ylab = "Proportion of Variance (\%)", xlab = "Eigenvalue Rank", axes = TRUE, ann = par("ann"), col = par("col"), lab = TRUE, ...) \method{plot}{pca.score}(x, inds=NULL, col=rainbow(nrow(x)), lab = "", ...) } \arguments{ \item{x}{ the results of principal component analysis obtained with \code{\link{pca.xyz}}. } \item{pc.axes}{ an optional numeric vector of length two specifying the principal components to be plotted. A NULL value will result in an overview plot of the first three PCs and a scree plot. See examples. } \item{pch}{ a vector of plotting characters or symbols: see \sQuote{points}. } \item{col}{ a character vector of plotting colors. } \item{cex}{ a numerical single element vector giving the amount by which plotting text and symbols should be magnified relative to the default. } \item{mar}{ A numerical vector of the form c(bottom, left, top, right) which gives the number of lines of margin to be specified on the four sides of the plot.} \item{inds}{ row indices of the conformers to label. } \item{lab}{ a character vector of plot labels. } \item{y}{ the y coordinates for the scree plot. } \item{type}{ one-character string giving the type of plot desired.} \item{main}{ a main title for the plot, see also 'title'.} \item{sub}{ a sub-title for the plot.} \item{xlim}{ the x limits of the plot. } \item{ylim}{ the y limits of the plot.} \item{ylab}{ a label for the y axis.} \item{xlab}{ a label for the x axis.} \item{axes}{ a logical value indicating whether both axes should be drawn.} \item{ann}{ a logical value indicating whether the default annotation (title and x and y axis labels) should appear on the plot. } \item{\dots}{ extra plotting arguments. } } \details{ \code{plot.pca} is a wrapper calling both \code{plot.pca.score} and \code{plot.pca.scree} resulting in a 2x2 plot with three score plots and one scree plot. } \value{ Produces a plot of PCA results in the active graphics device and invisibly returns the plotted \sQuote{z} coordinates along the requested \sQuote{pc.axes}. See examples section where these coordinates are used to identify plotted points. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \seealso{ \code{\link{pca.xyz}}, \code{\link{plot.bio3d}} } \examples{ attach(transducin) pc.xray <- pca(pdbs$xyz, rm.gaps=TRUE) plot(pc.xray) ## Color plot by nucleotide state vcolors <- annotation[, "color"] plot(pc.xray, col=vcolors) ## Focus on a single plot of PC1 vs PC2 x <- plot(pc.xray, pc.axes=1:2, col=vcolors) ## Identify points interactively with mouse clicks #identify(x, labels=basename.pdb(pdbs$id)) ## Add labels to select points inds <- c(1,10,37) text(x[inds,], labels=basename.pdb(pdbs$id[inds]), col="blue") ## Alternative labeling method #labs <- rownames(annotation) #inds <- c(2,7) #plot.pca.score(pc.xray, inds=inds, col=vcolors, lab=labs) ## color by seq identity groupings #ide <- seqidentity(pdbs$ali) #hc <- hclust(as.dist(1-ide)) #grps <- cutree(hc, h=0.2) #vcolors <- rainbow(max(grps))[grps] #plot.pca.score(pc.xray, inds=inds, col=vcolors, lab=labs) detach(transducin) } \keyword{ hplot } bio3d/man/consensus.Rd0000644000176200001440000000356514046073105014345 0ustar liggesusers\name{consensus} \alias{consensus} \title{ Sequence Consensus for an Alignment } \description{ Determines the consensus sequence for a given alignment at a given identity cutoff value. } \usage{ consensus(alignment, cutoff = 0.6) } \arguments{ \item{alignment}{ an \code{alignment} object created by the \code{\link{read.fasta}} function or an alignment character matrix. } \item{cutoff}{ a numeric value beteen 0 and 1, indicating the minimum sequence identity threshold for determining a consensus amino acid. Default is 0.6, or 60 percent residue identity. } } \value{ A vector containing the consensus sequence, where \sQuote{-} represents positions with no consensus (i.e. under the \code{cutoff}) } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \seealso{ \code{\link{read.fasta}} } \examples{ #-- Read HIV protease alignment aln <- read.fasta(system.file("examples/hivp_xray.fa",package="bio3d")) # Generate consensus con <- consensus(aln) print(con$seq) # Plot residue frequency matrix ##png(filename = "freq.png", width = 1500, height = 780) col <- mono.colors(32) aa <- rev(rownames(con$freq)) image(x=1:ncol(con$freq), y=1:nrow(con$freq), z=as.matrix(rev(as.data.frame(t(con$freq)))), col=col, yaxt="n", xaxt="n", xlab="Alignment Position", ylab="Residue Type") # Add consensus along the axis axis(side=1, at=seq(0,length(con$seq),by=5)) axis(side=2, at=c(1:22), labels=aa) axis(side=3, at=c(1:length(con$seq)), labels =con$seq) axis(side=4, at=c(1:22), labels=aa) grid(length(con$seq), length(aa)) box() # Add consensus sequence for(i in 1:length(con$seq)) { text(i, which(aa==con$seq[i]),con$seq[i],col="white") } # Add lines for residue type separation abline(h=c(2.5,3.5, 4.5, 5.5, 3.5, 7.5, 9.5, 12.5, 14.5, 16.5, 19.5), col="gray") } \keyword{ utilities } bio3d/man/pdb2aln.Rd0000644000176200001440000000611214046073105013636 0ustar liggesusers\name{pdb2aln} \alias{pdb2aln} \title{ Align a PDB structure to an existing alignment } \description{ Extract sequence from a PDB object and align it to an existing multiple sequence alignment that you wish keep intact. } \usage{ pdb2aln(aln, pdb, id="seq.pdb", aln.id=NULL, file="pdb2aln.fa", \dots) } \arguments{ \item{aln}{ an alignment list object with \code{id} and \code{ali} components, similar to that generated by \code{\link{read.fasta}}, \code{\link{read.fasta.pdb}}, and \code{\link{seqaln}}. } \item{pdb}{ the PDB object to be added to \code{aln}. } \item{id}{ name for the PDB sequence in the generated new alignment. } \item{aln.id}{ id of the sequence in \code{aln} that is close to the sequence from \code{pdb}. } \item{file}{ output file name for writing the generated new alignment. } \item{\dots}{ additional arguments passed to \code{\link{seqaln}}. } } \details{ The basic effect of this function is to add a PDB sequence to an existing alignement. In this case, the function is simply a wrapper of \code{\link{seq2aln}}. The more advanced (and also more useful) effect is giving complete mappings from the column indices of the original alignment (\code{aln$ali}) to atomic indices of equivalent C-alpha atoms in the \code{pdb}. These mappings are stored in the output list (see below 'Value' section). This feature is better illustrated in the function \code{\link{pdb2aln.ind}}, which calls \code{pdb2aln} and directly returns atom selections given a set of alignment positions. (See \code{\link{pdb2aln.ind}} for details. ) When \code{aln.id} is provided, the function will do pairwise alignment between the sequence from \code{pdb} and the sequence in \code{aln} with id matching \code{aln.id}. This is the best way to use the function if the protein has an identical or very similar sequence to one of the sequences in \code{aln}. } \value{ Return a list object of the class 'fasta' containing three components: \item{id}{ sequence names as identifers.} \item{ali}{ an alignment character matrix with a row per sequence and a column per equivalent aminoacid/nucleotide. } \item{ref}{ an integer 2xN matrix, where N is the number of columns of the new alignment \code{ali}. The first row contains the column indices of the original alignment \code{aln$ali}. The second row contains atomic indices of equivalent C-alpha atoms in \code{pdb}. Gaps in the new alignement are indicated by NAs. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Xin-Qiu Yao & Barry Grant } \seealso{ \code{\link{seqaln}}, \code{\link{seq2aln}}, \code{\link{seqaln.pair}}, \code{\link{pdb2aln.ind}}} \examples{ \dontrun{ ##--- Read aligned PDB coordinates (CA only) aln <- read.fasta(system.file("examples/kif1a.fa",package="bio3d")) pdbs <- read.fasta.pdb(aln) ##--- Read PDB coordinate for a new structure (all atoms) id <- get.pdb("2kin", URLonly=TRUE) pdb <- read.pdb(id) # add pdb to the alignment naln <- pdb2aln(aln=pdbs, pdb=pdb, id=id) naln } } \keyword{ utilities } bio3d/man/as.pdb.Rd0000644000176200001440000001506414046073105013471 0ustar liggesusers\name{as.pdb} \alias{as.pdb} \alias{as.pdb.mol2} \alias{as.pdb.prmtop} \alias{as.pdb.default} \title{ Convert to PDB format } \description{ Convert Tripos Mol2 format, or Amber parameter/topology and coordinate data to PDB format. } \usage{ as.pdb(\dots) \method{as.pdb}{mol2}(mol, \dots) \method{as.pdb}{prmtop}(prmtop, crd=NULL, inds=NULL, inds.crd=inds, ncore=NULL, \dots) \method{as.pdb}{default}(pdb=NULL, xyz=NULL, type=NULL, resno=NULL, resid=NULL, eleno=NULL, elety=NULL, chain=NULL, insert=NULL, alt=NULL, o=NULL, b=NULL, segid=NULL, elesy=NULL, charge=NULL, verbose=TRUE, \dots) } \arguments{ \item{\dots}{ arguments passed to and from functions. } \item{mol}{ a list object of type \code{"mol2"} (obtained with \code{\link{read.mol2}}). } \item{prmtop}{ a list object of type \code{"prmtop"} (obtained with \code{\link{read.prmtop}}). } \item{crd}{ a list object of type \code{"crd"} (obtained with \code{\link{read.crd.amber}}). } \item{inds}{ a list object of type \code{"select"} as obtained from \code{\link{atom.select}}. The indices points to which atoms in the PRMTOP object to convert. } \item{inds.crd}{ same as the \sQuote{inds} argument, but pointing to the atoms in CRD object to convert. By default, this argument equals to \sQuote{inds}, assuming the same number and sequence of atoms in the PRMTOP and CRD objects. } \item{ncore }{ number of CPU cores used to do the calculation. \code{ncore>1} requires package \sQuote{parallel} installed. } \item{pdb}{ an object of class \sQuote{pdb} as obtained from \code{\link{read.pdb}}. } \item{xyz}{ a numeric vector/matrix of Cartesian coordinates. If provided, the number of atoms in the new PDB object will be set to \code{ncol(as.xyz(xyz))/3} (see \code{\link{as.xyz}}). If \code{xyz} is not provided the number of atoms will be based on the length of \code{eleno}, \code{resno}, or \code{resid} (in that order). } \item{type}{ a character vector of record types, i.e. "ATOM" or "HETATM", with length equal to \code{ncol(as.xyz(xyz))/3}. Alternatively, a single element character vector can be provided which will be repeated to match the number of atoms. } \item{resno}{ a numeric vector of residue numbers of length equal to \code{ncol(as.xyz(xyz))/3}. } \item{resid}{ a character vector of residue types/ids of length equal to \code{ncol(as.xyz(xyz))/3}. Alternatively, a single element character vector can be provided which will be repeated to match the number of atoms. } \item{eleno}{ a numeric vector of element/atom numbers of length equal to \code{ncol(as.xyz(xyz))/3}. } \item{elety}{ a character vector of element/atom types of length equal to \code{ncol(as.xyz(xyz))/3}. Alternatively, a single element character vector can be provided which will be repeated to match the number of atoms. } \item{chain}{ a character vector of chain identifiers with length equal to \code{ncol(as.xyz(xyz))/3}. Alternatively, a single element character vector can be provided which will be repeated to match the number of atoms. } \item{insert}{ a character vector of insertion code with length equal to \code{ncol(as.xyz(xyz))/3}. } \item{alt}{ a character vector of alternate record with length equal to \code{ncol(as.xyz(xyz))/3}. } \item{o}{ a numeric vector of occupancy values of length equal to \code{ncol(as.xyz(xyz))/3}. Alternatively, a single element numeric vector can be provided which will be repeated for to match the number of atoms. } \item{b}{ a numeric vector of B-factors of length equal to \code{ncol(as.xyz(xyz))/3}. Alternatively, a single element numeric vector can be provided which will be repeated to match the number of atoms.} \item{segid}{ a character vector of segment id of length equal to \code{ncol(as.xyz(xyz))/3}. Alternatively, a single element character vector can be provided which will be repeated to match the number of atoms. } \item{elesy}{ a character vector of element symbol of length equal to \code{ncol(as.xyz(xyz))/3}. Alternatively, a single element character vector can be provided which will be repeated to match the number of atoms. } \item{charge}{ a numeric vector of atomic charge of length equal to \code{ncol(as.xyz(xyz))/3}. } \item{verbose}{ logical, if TRUE details of the PDB generation process is printed to screen. } } \details{ This function converts Tripos Mol2 format, Amber formatted parameter/topology (PRMTOP) and coordinate objects, and vector data to a PDB object. While \code{as.pdb.mol2} and \code{as.pdb.prmtop} converts specific objects to a PDB object, \code{as.pdb.default} provides basic functionality to convert raw data such as vectors of e.g. residue numbers, residue identifiers, Cartesian coordinates, etc to a PDB object. When \code{pdb} is provided the returned PDB object is built from the input object with fields replaced by any input vector arguments. e.g. \code{as.pdb(pdb, xyz=crd)} will return the same PDB object, with only the Cartesian coordinates changed to \code{crd}. } \value{ Returns a list of class \code{"pdb"} with the following components: \item{atom}{ a data.frame containing all atomic coordinate ATOM data, with a row per ATOM and a column per record type. See below for details of the record type naming convention (useful for accessing columns). } \item{xyz }{ a numeric matrix of ATOM coordinate data of class \code{xyz}. } \item{calpha }{ logical vector with length equal to \code{nrow(atom)} with TRUE values indicating a C-alpha \dQuote{elety}. } \item{call }{ the matched call. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. \url{http://ambermd.org/FileFormats.php} } \author{ Lars Skjaerven } \seealso{ \code{\link{read.crd}}, \code{\link{read.ncdf}}, \code{\link{atom.select}}, \code{\link{read.pdb}} } \examples{ ## Vector(s) to PDB object pdb <- as.pdb(resno=1:6, elety="CA", resid="ALA", chain="A") pdb \dontrun{ ## Read a PRMTOP file prmtop <- read.prmtop(system.file("examples/crambin.prmtop", package="bio3d")) ## Read Amber coordinates crds <- read.crd(system.file("examples/crambin.inpcrd", package="bio3d")) ## Atom selection ca.inds <- atom.select(prmtop, "calpha") ## Convert to PDB format pdb <- as.pdb(prmtop, crds, inds=ca.inds) ## Read a single entry MOL2 file ## (returns a single object) mol <- read.mol2( system.file("examples/aspirin.mol2", package="bio3d") ) ## Convert to PDB pdb <- as.pdb(mol) } } \keyword{ IO } bio3d/man/is.select.Rd0000644000176200001440000000145214046073105014207 0ustar liggesusers\name{is.select} \alias{is.select} \title{Is an Object of Class \sQuote{select}?} \description{ Checks whether its argument is an object of class \sQuote{select}. } \usage{ is.select(x) } \arguments{ \item{x}{an R object to be tested.} } \details{ Tests if x is an object of class \sQuote{select}, i.e. if x has a \dQuote{class} attribute equal to \code{select}. } \value{ TRUE if x is an object of class \sQuote{select} and FALSE otherwise } \author{ Julien Ide } \seealso{ \code{\link{atom.select}} } \examples{ # Read a PDB file pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) # Print structure summary atom.select(pdb) # Select all C-alpha atoms with residues numbers between 43 and 54 ca.inds <- atom.select(pdb, "calpha", resno=43:54) is.select(ca.inds) } \keyword{ classes } bio3d/man/plot.pca.loadings.Rd0000644000176200001440000000166214046073105015640 0ustar liggesusers\name{plot.pca.loadings} \alias{plot.pca.loadings} \title{ Plot Residue Loadings along PC1 to PC3 } \description{ Plot residue loadings along PC1 to PC3 from a given xyz C-alpha matrix of \code{loadings}. } \usage{ \method{plot}{pca.loadings}(x, resnums = seq(1, (length(x[, 1])/3), 25), ...) } \arguments{ \item{x}{ the results of principal component analysis obtained from \code{\link{pca.xyz}}, or just the loadings returned from \code{\link{pca.xyz}}. } \item{resnums}{ a numeric vector of residue numbers. } \item{\dots}{ extra plotting arguments. } } \value{ Called for its effect. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \seealso{ \code{\link{pca.xyz}}, \code{\link{plot.pca}} } \examples{ attach(transducin) pc.xray <- pca.xyz(pdbs$xyz[, gap.inspect(pdbs$xyz)$f.inds]) plot.pca.loadings(pc.xray$U) detach(transducin) } \keyword{ hplot } bio3d/man/combine.select.Rd0000644000176200001440000000536614046073105015220 0ustar liggesusers\name{combine.select} \alias{combine.select} \title{ Combine Atom Selections From PDB Structure } \description{ Do "and", "or", or "not" set operations between two or more atom selections made by \code{\link{atom.select}} } \usage{ combine.select(sel1=NULL, sel2=NULL, \dots, operator="AND", verbose=TRUE) } \arguments{ \item{sel1}{ an atom selection object of class \code{"select"}, obtained from \code{\link{atom.select}}. } \item{sel2}{ a second atom selection object of class \code{"select"}, obtained from \code{\link{atom.select}}. } \item{\dots}{ more select objects for the set operation. } \item{operator}{ name of the set operation. } \item{verbose}{ logical, if TRUE details of the selection combination are printed. } } \details{ The value of \code{operator} should be one of following: (1) "AND", "and", or "&" for set intersect, (2) "OR", "or", "|", or "+" for set union, (3) "NOT", "not", "!", or "-" for set difference \code{sel1 - sel2 - sel3 ...}. } \value{ Returns a list of class \code{"select"} with components: \item{atom }{atom indices of selected atoms.} \item{xyz }{xyz indices of selected atoms.} \item{call }{the matched call.} } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Xin-Qiu Yao } \seealso{ \code{\link{atom.select}}, \code{\link{as.select}} \code{\link{read.pdb}}, \code{\link{trim.pdb}} } \examples{ # Read a PDB file pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) ## - Build atom selections to be operated # Select C-alpha atoms of entire system ca.global.inds <- atom.select(pdb, "calpha") # Select C-beta atoms of entire protein cb.global.inds <- atom.select(pdb, "protein", elety="CB") # Select backbone atoms of entire system bb.global.inds <- atom.select(pdb, "backbone") # Select all atoms with residue number from 46 to 50 aa.local.inds <- atom.select(pdb, resno=46:50) # Do set intersect: # - Return C-alpha atoms with residue number from 46 to 50 ca.local.inds <- combine.select(ca.global.inds, aa.local.inds) print( pdb$atom[ ca.local.inds$atom, ] ) # Do set subtract: # - Return side-chain atoms with residue number from 46 to 50 sc.local.inds <- combine.select(aa.local.inds, bb.global.inds, operator="-") print( pdb$atom[ sc.local.inds$atom, ] ) # Do set union: # - Return C-alpha and side-chain atoms with residue number from 46 to 50 casc.local.inds <- combine.select(ca.local.inds, sc.local.inds, operator="+") print( pdb$atom[ casc.local.inds$atom, ] ) # More than two selections: # - Return side-chain atoms (but not C-beta) with residue number from 46 to 50 sc2.local.inds <- combine.select(aa.local.inds, bb.global.inds, cb.global.inds, operator="-") print( pdb$atom[ sc2.local.inds$atom, ] ) } \keyword{utilities} bio3d/man/read.fasta.Rd0000644000176200001440000000303514046077017014333 0ustar liggesusers\name{read.fasta} \alias{read.fasta} \title{ Read FASTA formated Sequences } \description{ Read aligned or un-aligned sequences from a FASTA format file. } \usage{ read.fasta(file, rm.dup = TRUE, to.upper = FALSE, to.dash=TRUE) } \arguments{ \item{file}{ input sequence file. } \item{rm.dup}{ logical, if TRUE duplicate sequences (with the same names/ids) will be removed. } \item{to.upper}{ logical, if TRUE residues are forced to uppercase. } \item{to.dash}{ logical, if TRUE \sQuote{.} gap characters are converted to \sQuote{-} gap characters. } } \value{ A list with two components: \item{ali }{ an alignment character matrix with a row per sequence and a column per equivalent aminoacid/nucleotide. } \item{ids }{ sequence names as identifers.} \item{call}{ the matched call. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \note{ For a description of FASTA format see: \url{https://www.ncbi.nlm.nih.gov/BLAST/blastcgihelp.shtml}. When reading alignment files, the dash \sQuote{-} is interpreted as the gap character. } \seealso{ \code{\link{read.fasta.pdb}} } \examples{ # Read alignment aln <- read.fasta(system.file("examples/hivp_xray.fa",package="bio3d")) # Print alignment overview aln # Sequence names/ids head( aln$id ) # Alignment positions 335 to 339 head( aln$ali[,33:39] ) # Sequence d2a4f_b aa123( aln$ali["d2a4f_b",] ) # Write out positions 33 to 45 only #aln$ali=aln$ali[,30:45] #write.fasta(aln, file="eg2.fa") } \keyword{ IO } bio3d/man/basename.pdb.Rd0000644000176200001440000000257714046073105014646 0ustar liggesusers\name{basename.pdb} \alias{basename.pdb} \title{ Manipulate PDB File Names } \description{ Removes all of the path up to and including the last path separator (if any) and the final \sQuote{.pdb} extension. } \usage{ basename.pdb(x, mk4 = FALSE, ext=".pdb") } \arguments{ \item{x}{ character vector of PDB file names, containing path and extensions.} \item{mk4}{ logical, if TRUE the output will be truncated to the first 4 characters of the basename. This is frequently convenient for matching RCSB PDB identifier conventions (see examples below). } \item{ext}{ character, specifying the file extension, e.g. \sQuote{.pdb} or \sQuote{.mol2}. } } \details{ This is a simple utility function for the common task of PDB file name manipulation. It is used internally in several bio3d functions and van be thought of as basename for PDB files. } \value{ A character vector of the same length as the input \sQuote{x}. Paths not containing any separators are taken to be in the current directory. If an element of input is \sQuote{x} is \sQuote{NA}, so is the result. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \seealso{ \code{\link{basename}}, \code{\link{dirname}} } \examples{ basename.pdb("/somedir/somewhere/1bg2_myfile.pdb") basename.pdb("/somedir/somewhere/1bg2_myfile.pdb", TRUE) } \keyword{ utilities } bio3d/man/atom2mass.Rd0000644000176200001440000000562214046073105014227 0ustar liggesusers\encoding{UTF-8} \name{atom2mass} \alias{atom2mass} \alias{atom2mass.default} \alias{atom2mass.pdb} \title{ Atom Names/Types to Mass Converter } \description{ Convert atom names/types into atomic masses. } \usage{ atom2mass(\dots) \method{atom2mass}{default}(x, mass.custom=NULL, elety.custom=NULL, grpby=NULL, rescue=TRUE, \dots) \method{atom2mass}{pdb}(pdb, inds=NULL, mass.custom=NULL, elety.custom=NULL, grpby=NULL, rescue=TRUE, \dots) } \arguments{ \item{x}{ a character vector containing atom names/types to be converted. } \item{mass.custom}{ a customized data.frame containing atomic symbols and corresponding masses. } \item{elety.custom}{ a customized data.frame containing atom names/types and corresponding atomic symbols.} \item{grpby}{a \sQuote{factor}, as returned by \code{as.factor}, used to group the atoms.} \item{rescue}{ logical, if TRUE the atomic symbols will be mapped to the first character of the atom names/types.} \item{pdb}{ an object of class \sQuote{pdb} for which \code{elety} will be converted.} \item{inds}{ an object of class \sQuote{select} indicating a subset of the \code{pdb} object to be used (see \code{\link{atom.select}} and \code{\link{trim.pdb}}).} \item{\dots}{.} } \details{ The default method first convert atom names/types into atomic symbols using the \code{\link{atom2ele}} function. Then, atomic symbols are searched in the \code{elements} data set and their corresponding masses are returned. If \code{mass.custom} is specified it is combined with \code{elements} (using \code{rbind}) before searching. Therefore, \code{mass.custom} must have columns named \code{symb} and \code{mass} (see examples). If \code{grpby} is specified masses are splitted (using \code{split}) to compute the mass of groups of atoms defined by \code{grpby}. The S3 method for object of class \sQuote{pdb}, pass \code{pdb$atom$elety} to the default method. } \value{Return a numeric vector of masses.} \author{Julien Ide, Lars Skjaerven} \seealso{ \code{\link{elements}}, \code{\link{atom.index}}, \code{\link{atom2ele}}, \code{\link{read.pdb}} } \examples{ atom.names <- c("CA", "O", "N", "OXT") atom2mass(atom.names) \donttest{ # PDB server connection required - testing excluded ## Get atomic symbols from a PDB object with a customized data set pdb <- read.pdb("3RE0", verbose=FALSE) inds <- atom.select(pdb, resno=201, verbose=FALSE) ## selected atoms print(pdb$atom$elety[inds$atom]) ## default will map CL2 to C atom2mass(pdb, inds) ## map element CL2 correctly to Cl myelety <- data.frame(name = c("CL2","PT1","N1","N2"), symb = c("Cl","Pt","N","N")) atom2mass(pdb, inds, elety.custom = myelety) ## custom masses mymasses <- data.frame(symb = c("Cl","Pt"), mass = c(35.45, 195.08)) atom2mass(pdb, inds, elety.custom = myelety, mass.custom = mymasses) } } \keyword{ utilities } bio3d/man/read.prmtop.Rd0000644000176200001440000000525714046073105014560 0ustar liggesusers\name{read.prmtop} \alias{read.prmtop} \alias{print.prmtop} \title{ Read AMBER Parameter/Topology files } \description{ Read parameter and topology data from an AMBER PrmTop file. } \usage{ read.prmtop(file) \method{print}{prmtop}(x, printseq=TRUE, \dots) } \arguments{ \item{file}{ a single element character vector containing the name of the PRMTOP file to be read. } \item{x}{ a PRMTOP structure object obtained from \code{\link{read.prmtop}}. } \item{printseq}{ logical, if TRUE the residue sequence will be printed to the screen. See also \code{\link{pdbseq}}. } \item{...}{ additional arguments to \sQuote{print}. } } \details{ This function provides basic functionality to read and parse a AMBER PrmTop file. The resulting \sQuote{prmtop} object contains a complete list object of the information stored in the PrmTop file. See examples for further details. } \value{ Returns a list of class \sQuote{prmtop} (inherits class \sQuote{amber}) with components according to the flags present in the PrmTop file. See the AMBER documentation for a complete list of flags/components: \url{http://ambermd.org/FileFormats.php}. Selected components: \item{ATOM_NAME}{ a character vector of atom names. } \item{ATOMS_PER_MOLECULE}{ a numeric vector containing the number of atoms per molecule. } \item{MASS}{ a numeric vector of atomic masses. } \item{RESIDUE_LABEL}{ a character vector of residue labels. } \item{RESIDUE_RESIDUE_POINTER}{ a numeric vector of pointers to the first atom in each residue. } \item{call }{ the matched call. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. \url{http://ambermd.org/FileFormats.php} } \author{ Lars Skjaerven } \note{ See AMBER documentation for PrmTop format description:\cr \url{http://ambermd.org/FileFormats.php}. } \seealso{ \code{\link{read.crd}}, \code{\link{read.ncdf}}, \code{\link{as.pdb}}, \code{\link{atom.select}}, \code{\link{read.pdb}} } \examples{ \dontrun{ ## Read a PRMTOP file prmtop <- read.prmtop(system.file("examples/crambin.prmtop", package="bio3d")) print(prmtop) ## Explore prmtop file head(prmtop$MASS) head(prmtop$ATOM_NAME) ## Read Amber coordinates crds <- read.crd(system.file("examples/crambin.inpcrd", package="bio3d")) ## Atom selection ca.inds <- atom.select(prmtop, "calpha") ## Convert to PDB format pdb <- as.pdb(prmtop, crds) pdb.ca <- as.pdb(prmtop, crds, inds=ca.inds) ## Trajectory processing #trj <- read.ncdf("traj.nc", at.sel=ca.inds) ## Convert to multimodel PDB format #pdb <- as.pdb(prmtop, trj[1:20,], inds=ca.inds, inds.crd=NULL) ## RMSD of trajectory #rd <- rmsd(crds$xyz[ca.inds$xyz], traj, fit=TRUE) } } \keyword{ IO } bio3d/man/pca.xyz.Rd0000644000176200001440000001132414046073105013711 0ustar liggesusers\name{pca.xyz} \alias{pca.xyz} \alias{print.pca} \title{ Principal Component Analysis } \description{ Performs principal components analysis (PCA) on a \code{xyz} numeric data matrix. } \usage{ \method{pca}{xyz}(xyz, subset = rep(TRUE, nrow(as.matrix(xyz))), use.svd = FALSE, rm.gaps=FALSE, mass = NULL, \dots) \method{print}{pca}(x, nmodes=6, \dots) } \arguments{ \item{xyz}{ numeric matrix of Cartesian coordinates with a row per structure. } \item{subset}{ an optional vector of numeric indices that selects a subset of rows (e.g. experimental structures vs molecular dynamics trajectory structures) from the full \code{xyz} matrix. Note: the full \code{xyz} is projected onto this subspace.} \item{use.svd}{ logical, if TRUE singular value decomposition (SVD) is called instead of eigenvalue decomposition. } \item{rm.gaps}{ logical, if TRUE gap positions (with missing coordinate data in any input structure) are removed before calculation. This is equivalent to removing NA cols from xyz. } \item{x}{ an object of class \code{pca}, as obtained from function \code{pca.xyz}. } \item{nmodes}{ numeric, number of modes to be printed. } \item{mass}{ a \sQuote{pdb} object or numeric vector of residue/atom masses. By default (\code{mass=NULL}), mass is ignored. If provided with a \sQuote{pdb} object, masses of all amino acids obtained from \code{\link{aa2mass}} are used. } \item{\dots}{ additional arguments to \code{\link{fit.xyz}} (for \code{pca.xyz}) or to \code{print} (for \code{print.pca}). } } \note{ If \code{mass} is provided, mass weighted coordinates will be considered, and iteration of fitting onto the mean structure is performed internally. The extra fitting process is to remove external translation and rotation of the whole system. With this option, a direct comparison can be made between PCs from \code{\link{pca.xyz}} and vibrational modes from \code{\link{nma.pdb}}, with the fact that \deqn{A=k_BTF^{-1}}{A=k[B]TF^-1}, where \eqn{A} is the variance-covariance matrix, \eqn{F} the Hessian matrix, \eqn{k_B}{k[B]} the Boltzmann's constant, and \eqn{T} the temperature. } \value{ Returns a list with the following components: \item{L }{eigenvalues.} \item{U }{eigenvectors (i.e. the x, y, and z variable loadings).} \item{z }{scores of the supplied \code{xyz} on the pcs.} \item{au }{atom-wise loadings (i.e. xyz normalized eigenvectors).} \item{sdev }{the standard deviations of the pcs.} \item{mean }{the means that were subtracted.} } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \seealso{ \code{\link{pca}}, \code{\link{pca.pdbs}}, \code{\link{plot.pca}}, \code{\link{mktrj.pca}}, \code{\link{pca.tor}}, \code{\link{project.pca}} } \examples{ \dontrun{ #-- Read transducin alignment and structures aln <- read.fasta(system.file("examples/transducin.fa",package="bio3d")) pdbs <- read.fasta.pdb(aln) # Find core core <- core.find(pdbs, #write.pdbs = TRUE, verbose=TRUE) rm(list=c("pdbs", "core")) } #-- OR for demo purposes just read previously saved transducin data attach(transducin) # Previously fitted coordinates based on sub 1.0A^3 core. See core.find() function. xyz <- pdbs$xyz #-- Do PCA ignoring gap containing positions pc.xray <- pca.xyz(xyz, rm.gaps=TRUE) # Plot results (conformer plots & scree plot overview) plot(pc.xray, col=annotation[, "color"]) # Plot a single conformer plot of PC1 v PC2 plot(pc.xray, pc.axes=1:2, col=annotation[, "color"]) ## Plot atom wise loadings plot.bio3d(pc.xray$au[,1], ylab="PC1 (A)") \donttest{ # PDB server connection required - testing excluded ## Plot loadings in relation to reference structure 1TAG pdb <- read.pdb("1tag") ind <- grep("1TAG", pdbs$id) ## location in alignment resno <- pdbs$resno[ind, !is.gap(pdbs)] ## non-gap residues tpdb <- trim.pdb(pdb, resno=resno) op <- par(no.readonly=TRUE) par(mfrow = c(3, 1), cex = 0.6, mar = c(3, 4, 1, 1)) plot.bio3d(pc.xray$au[,1], resno, ylab="PC1 (A)", sse=tpdb) plot.bio3d(pc.xray$au[,2], resno, ylab="PC2 (A)", sse=tpdb) plot.bio3d(pc.xray$au[,3], resno, ylab="PC3 (A)", sse=tpdb) par(op) } \dontrun{ # Write PC trajectory resno = pdbs$resno[1, !is.gap(pdbs)] resid = aa123(pdbs$ali[1, !is.gap(pdbs)]) a <- mktrj.pca(pc.xray, pc=1, file="pc1.pdb", resno=resno, resid=resid ) b <- mktrj.pca(pc.xray, pc=2, file="pc2.pdb", resno=resno, resid=resid ) c <- mktrj.pca(pc.xray, pc=3, file="pc3.pdb", resno=resno, resid=resid ) } detach(transducin) } \keyword{ utilities } \keyword{ multivariate } bio3d/man/core.cmap.Rd0000644000176200001440000000477514046073105014200 0ustar liggesusers\name{core.cmap} \alias{core.cmap} \title{ Identification of Contact Map Core Positions } \description{ Find core positions that have the largest number of contact with neighboring residues. } \usage{ core.cmap(pdbs, write.pdb = FALSE, outfile="core.pdb", cutoff = NULL, refine = FALSE, ncore = NULL, \dots) } \arguments{ \item{pdbs}{ an alignment data structure of class \sQuote{pdbs} as obtained with \code{\link{read.fasta.pdb}} or \code{\link{pdbaln}}, or a numeric matrix of aligned C-alpha xyz Cartesian coordinates. } \item{write.pdb}{ logical, if TRUE core coordinate files, containing only core positions for each iteration, are written to a location specified by \code{outpath}. } \item{outfile}{ character string specifying the output directory when \code{write.pdb} is \sQuote{TRUE}. } \item{cutoff}{ numeric value speciyfing the inclusion criteria for core positions. } \item{refine}{ logical, if TRUE explore core positions determined by multiple eigenvectors. By default only the eigenvector describing the largest variation is used. } \item{ncore }{ number of CPU cores used to do the calculation. By default (\code{ncore=NULL}) use all cores detected. } \item{\dots}{ arguments passed to and from functions. } } \details{ This function calculates eigenvector centrality of the weighted contact network built based on input structure data and uses it to determine the core positions. In this context, core positions correspond to the most invariant C-alpha atom positions across an aligned set of protein structures. Traditionally one would use the \code{core.find} function to for their identification and then use these positions as the basis for improved structural superposition. This more recent function utilizes a much faster approach and is thus preferred in time sensitive applications such as shiny apps. } \value{ Returns a list of class \code{"select"} containing \sQuote{atom} and \sQuote{xyz} indices. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Xin-Qiu Yao } \seealso{ \code{\link{core.find}}, \code{\link{read.fasta.pdb}}, \code{\link{fit.xyz}} } \examples{ \dontrun{ ##-- Generate a small kinesin alignment and read corresponding structures pdbfiles <- get.pdb(c("1bg2","2ncd","1i6i","1i5s"), URLonly=TRUE) pdbs <- pdbaln(pdbfiles) ##-- Find 'core' positions core <- core.cmap(pdbs) xyz <- pdbfit(pdbs, core, outpath="corefit_structures") } } \keyword{ utilities } bio3d/man/cmap.Rd0000644000176200001440000001005214046073105013232 0ustar liggesusers\name{cmap} \alias{cmap} \alias{cmap.default} \alias{cmap.xyz} \alias{cmap.pdb} \alias{cmap.pdbs} \title{ Contact Map } \description{ Construct a Contact Map for Given Protein Structure(s).} \usage{ cmap(\dots) \method{cmap}{default}(\dots) \method{cmap}{xyz}(xyz, grpby = NULL, dcut = 4, scut = 3, pcut=1, binary=TRUE, mask.lower = TRUE, collapse=TRUE, gc.first=FALSE, ncore=1, nseg.scale=1, \dots) \method{cmap}{pdb}(pdb, inds = NULL, verbose = FALSE, \dots) \method{cmap}{pdbs}(pdbs, rm.gaps=FALSE, all.atom=FALSE, \dots) } \arguments{ \item{xyz}{ numeric vector of xyz coordinates or a numeric matrix of coordinates with a row per structure/frame. } \item{grpby}{ a vector counting connective duplicated elements that indicate the elements of \code{xyz} that should be considered as a group (e.g. atoms from a particular residue). } \item{dcut}{ a cutoff distance value below which atoms are considered in contact. } \item{scut}{ a cutoff neighbour value which has the effect of excluding atoms that are sequentially within this value. } \item{pcut}{ a cutoff probability of structures/frames showing a contact, above which atoms are considered in contact with respect to the ensemble. Ignored if \code{binary=FALSE}. } \item{binary}{ logical, if FALSE the raw matrix containing fraction of frames that two residues are in contact is returned. } \item{mask.lower}{ logical, if TRUE the lower matrix elements (i.e. those below the diagonal) are returned as NA.} \item{collapse}{ logical, if FALSE an array of contact maps for all frames is returned. } \item{gc.first}{ logical, if TRUE will call gc() first before calculation of distance matrix. This is to solve the memory overload problem when \code{ncore > 1} and \code{xyz} has many rows, with a bit sacrifice on speed. } \item{ncore }{ number of CPU cores used to do the calculation. \code{ncore>1} requires package \sQuote{parallel} installed. } \item{nseg.scale }{ split input data into specified number of segments prior to running multiple core calculation. See \code{\link{fit.xyz}}. } \item{pdb}{ a structure object of class \code{"pdb"}, obtained from \code{\link{read.pdb}}. } \item{inds}{ a list object of ATOM and XYZ indices as obtained from \code{\link{atom.select}}. } \item{verbose}{ logical, if TRUE details of the selection are printed. } \item{pdbs}{ a \sQuote{pdbs} object as returned by \code{\link{read.fasta.pdb}}, \code{\link{read.all}}, or \code{\link{pdbaln}}. } \item{rm.gaps}{ logical, if TRUE gapped positions are removed in the returned value. } \item{all.atom}{ logical, if TRUE all-atom coordinates from \code{\link{read.all}} are used. } \item{\dots}{ arguments passed to and from functions. } } \details{ A contact map is a simplified distance matrix. See the distance matrix function \code{\link{dm}} for further details. Function \code{"cmap.pdb"} is a wrapper for \code{"cmap.xyz"} which selects all \sQuote{notwater} atoms and calculates the contact matrix grouped by residue number. } \value{ Returns a N by N numeric matrix composed of zeros and ones, where one indicates a contact between selected atoms. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \seealso{ \code{\link{dm}}, \code{\link{dccm}}, \code{\link{dist}}, \code{\link{dist.xyz}} } \examples{ ##- Read PDB file pdb <- read.pdb( system.file("examples/hivp.pdb", package="bio3d") ) ## Atom Selection indices inds <- atom.select(pdb, "calpha") ## Reference contact map ref.cont <- cmap( pdb$xyz[inds$xyz], dcut=6, scut=3 ) plot.cmap(ref.cont) \dontrun{ ##- Read Traj file trj <- read.dcd( system.file("examples/hivp.dcd", package="bio3d") ) ## For each frame of trajectory sum.cont <- NULL for(i in 1:nrow(trj)) { ## Contact map for frame 'i' cont <- cmap(trj[i,inds$xyz], dcut=6, scut=3) ## Product with reference prod.cont <- ref.cont * cont sum.cont <- c(sum.cont, sum(prod.cont,na.rm=TRUE)) } plot(sum.cont, typ="l") } } \keyword{ utilities } bio3d/man/seq2aln.Rd0000644000176200001440000000413714046077017013674 0ustar liggesusers\name{seq2aln} \alias{seq2aln} \title{ Add a Sequence to an Existing Alignmnet } \description{ Add one or more sequences to an existing multiple alignment that you wish to keep intact. } \usage{ seq2aln(seq2add, aln, id = "seq", file = "aln.fa", \dots) } \arguments{ \item{seq2add}{ an sequence character vector or an alignment list object with \code{id} and \code{ali} components, similar to that generated by \code{\link{read.fasta}} and \code{\link{seqaln}}. } \item{aln}{ an alignment list object with \code{id} and \code{ali} components, similar to that generated by \code{\link{read.fasta}} and \code{\link{seqaln}}. } \item{id}{ a vector of sequence names to serve as sequence identifers. } \item{file}{ name of \sQuote{FASTA} output file to which alignment should be written. } \item{\dots}{ additional arguments passed to \code{\link{seqaln}}. } } \details{ This function calls the \sQuote{MUSCLE} program, to perform a profile profile alignment, which MUST BE INSTALLED on your system and in the search path for executables. } \value{ A list with two components: \item{ali}{ an alignment character matrix with a row per sequence and a column per equivalent aminoacid/nucleotide. } \item{id}{ sequence names as identifers.} } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. \sQuote{MUSCLE} is the work of Edgar: Edgar (2004) \emph{Nuc. Acid. Res.} \bold{32}, 1792--1797. Full details of the \sQuote{MUSCLE} algorithm, along with download and installation instructions can be obtained from:\cr \url{http://www.drive5.com/muscle/}. } \author{ Barry Grant } \note{ A system call is made to the \sQuote{MUSCLE} program, which must be installed on your system and in the search path for executables. } \seealso{ \code{\link{seqaln}}, \code{\link{read.fasta}}, \code{\link{read.fasta.pdb}}, \code{\link{seqbind}} } \examples{ \dontrun{ aa.1 <- pdbseq( read.pdb("1bg2") ) aa.2 <- pdbseq( read.pdb("3dc4") ) aa.3 <- pdbseq( read.pdb("1mkj") ) aln <- seqaln( seqbind(aa.1,aa.2) ) seq2aln(aa.3, aln) } } \keyword{ utilities } bio3d/man/is.mol2.Rd0000644000176200001440000000120614046073105013576 0ustar liggesusers\name{is.mol2} \alias{is.mol2} \title{ Is an Object of Class \sQuote{mol2}? } \description{ Checks whether its argument is an object of class \sQuote{mol2}. } \usage{ is.mol2(x) } \arguments{ \item{x}{ an R object. } } \details{ Tests if the object \sQuote{x} is of class \sQuote{mol2} (\code{is.mol2}), i.e. if \sQuote{x} has a \dQuote{class} attribute equal to \code{mol2}. } \value{ TRUE if x is an object of class \sQuote{mol2} and FALSE otherwise } \seealso{ \code{\link{read.mol2}} } \examples{ # Read a PDB file mol <- read.mol2( system.file("examples/aspirin.mol2", package="bio3d") ) is.mol2(mol) } \keyword{ classes } bio3d/man/write.crd.Rd0000644000176200001440000000413714046073105014222 0ustar liggesusers\name{write.crd} \alias{write.crd} \title{ Write CRD File } \description{ Write a CHARMM CARD (CRD) coordinate file. } \usage{ write.crd(pdb = NULL, xyz = pdb$xyz, resno = NULL, resid = NULL, eleno = NULL, elety = NULL, segid = NULL, resno2 = NULL, b = NULL, verbose = FALSE, file = "R.crd") } \arguments{ \item{pdb}{ a structure object obtained from \code{\link{read.pdb}} or \code{\link{read.crd}}. } \item{xyz}{ Cartesian coordinates as a vector or 3xN matrix. } \item{resno}{ vector of residue numbers of length equal to length(xyz)/3. } \item{resid}{ vector of residue types/ids of length equal to length(xyz)/3. } \item{eleno}{ vector of element/atom numbers of length equal to length(xyz)/3. } \item{elety}{ vector of element/atom types of length equal to length(xyz)/3. } \item{segid}{ vector of segment identifiers with length equal to length(xyz)/3. } \item{resno2}{ vector of alternate residue numbers of length equal to length(xyz)/3. } \item{b}{ vector of weighting factors of length equal to length(xyz)/3. } \item{verbose}{ logical, if TRUE progress details are printed. } \item{file}{ the output file name. } } \details{ Only the \code{xyz} argument is strictly required. Other arguments assume a default poly-ALA C-alpha structure with a blank segid and B-factors equal to 0.00. } \value{ Called for its effect. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. For a description of CHARMM CARD (CRD) format see:\cr \url{http://www.charmmtutorial.org/index.php/CHARMM:The_Basics}. } \author{ Barry Grant } \note{ Check that \code{resno} and \code{eleno} do not exceed \dQuote{9999}. } \seealso{ \code{\link{read.crd}}, \code{\link{read.pdb}}, \code{\link{atom.select}}, \code{\link{write.pdb}}, \code{\link{read.dcd}}, \code{\link{read.fasta.pdb}}, \code{\link{read.fasta}} } \examples{ \dontrun{ # Read a PDB file pdb <- read.pdb( "1bg2" ) summary(pdb) # Convert to CHARMM format new <- convert.pdb(pdb, type="charmm") summary(new) # Write a CRD file write.crd(new, file="4charmm.crd") } } \keyword{ IO } bio3d/man/write.fasta.Rd0000644000176200001440000000406314046077017014554 0ustar liggesusers\name{write.fasta} \alias{write.fasta} \title{ Write FASTA Formated Sequences } \description{ Write aligned or un-aligned sequences to a FASTA format file. } \usage{ write.fasta(alignment=NULL, ids=NULL, seqs=alignment$ali, gap=TRUE, file, append = FALSE) } \arguments{ \item{alignment}{ an alignment list object with \code{id} and \code{ali} components, similar to that generated by \code{\link{read.fasta}}. } \item{ids}{ a vector of sequence names to serve as sequence identifers } \item{seqs}{ an sequence or alignment character matrix or vector with a row per sequence } \item{gap}{ logical, if FALSE gaps will be removed. } \item{file}{ name of output file. } \item{append}{ logical, if TRUE output will be appended to \code{file}; otherwise, it will overwrite the contents of \code{file}. } } \value{ Called for its effect. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \note{ For a description of FASTA format see: \url{https://www.ncbi.nlm.nih.gov/BLAST/blastcgihelp.shtml}. } \seealso{ \code{\link{read.fasta}}, \code{\link{read.fasta.pdb}} } \examples{ \donttest{ # PDB server connection required - testing excluded ## Read a PDB file pdb <- read.pdb("1bg2") ## Extract sequence from PDB file s <- aa321(pdb$seqres) # SEQRES a <- aa321(pdb$atom[pdb$calpha,"resid"]) # ATOM ## Write simple fasta file #write.fasta( seqs=seqbind(s,a), file="eg.fa") #write.fasta( ids=c("seqres","atom"), seqs=seqbind(s,a), file="eg.fa" ) outfile1 = file.path(tempdir(), "eg.fa") write.fasta(list( id=c("seqres"),ali=s ), file = outfile1) write.fasta(list( id=c("atom"),ali=a ), file = outfile1, append=TRUE) ## Align seqres and atom records #seqaln(seqbind(s,a)) ## Read alignment aln<-read.fasta(system.file("examples/kif1a.fa",package="bio3d")) ## Cut all but positions 130 to 245 aln$ali=aln$ali[,130:245] outfile2 = file.path(tempdir(), "eg2.fa") write.fasta(aln, file = outfile2) invisible( cat("\nSee the output files:", outfile1, outfile2, sep="\n") ) } } \keyword{ IO } bio3d/man/unbound.Rd0000644000176200001440000000230414046073105013765 0ustar liggesusers\name{unbound} \alias{unbound} \title{ Sequence Generation from a Bounds Vector } \description{ Generate a sequence of consecutive numbers from a \code{\link{bounds}} vector. } \usage{ unbound(start, end = NULL) } \arguments{ \item{start}{ vector of starting values, or a matrix containing starting and end values such as that obtained from \code{\link{bounds}}. } \item{end}{ vector of (maximal) end values, such as that obtained from \code{\link{bounds}}. } } \details{ This is a simple utility function that does the opposite of the \code{\link{bounds}} function. If \code{start} is a vector, \code{end} must be a vector having the same length as \code{start}. If \code{start} is a matrix with column names contain 'start' and 'end', such as that returned from \code{\link{bounds}}, \code{end} can be skipped and both starting and end values will be extracted from \code{start}. } \value{ Returns a numeric sequence vector. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \seealso{ \code{\link{bounds}} } \author{ Barry Grant } \examples{ test <- c(seq(1,5,1),8,seq(10,15,1)) b <- bounds(test) unbound(b) } \keyword{ utilities } bio3d/man/geostas.Rd0000644000176200001440000001727314046073105013773 0ustar liggesusers\name{geostas} \alias{geostas} \alias{geostas.default} \alias{geostas.xyz} \alias{geostas.nma} \alias{geostas.enma} \alias{geostas.pdb} \alias{geostas.pdbs} \alias{amsm.xyz} \alias{print.geostas} \title{ GeoStaS Domain Finder } \description{ Identifies geometrically stable domains in biomolecules } \usage{ geostas(\dots) \method{geostas}{default}(\dots) \method{geostas}{xyz}(xyz, amsm = NULL, k = 3, pairwise = TRUE, clustalg = "kmeans", fit = TRUE, ncore = NULL, verbose=TRUE, \dots) \method{geostas}{nma}(nma, m.inds = 7:11, verbose=TRUE, \dots) \method{geostas}{enma}(enma, pdbs = NULL, m.inds = 1:5, verbose=TRUE, \dots) \method{geostas}{pdb}(pdb, inds = NULL, verbose=TRUE, \dots) \method{geostas}{pdbs}(pdbs, verbose=TRUE, \dots) amsm.xyz(xyz, ncore = NULL) \method{print}{geostas}(x, \dots) } \arguments{ \item{...}{ arguments passed to and from functions, such as \code{\link{kmeans}}, and \code{\link{hclust}} which are called internally in \code{geostas.xyz}. } \item{xyz}{ numeric matrix of xyz coordinates as obtained e.g. by \code{\link{read.ncdf}}, \code{\link{read.dcd}}, or \code{\link{mktrj}}. } \item{amsm}{ a numeric matrix as obtained by \code{\link{amsm.xyz}} (convenient e.g. for re-doing only the clustering analysis of the \sQuote{AMSM} matrix). } \item{k }{ an integer scalar or vector with the desired number of groups. } \item{pairwise }{ logical, if TRUE use pairwise clustering of the atomic movement similarity matrix (AMSM), else columnwise. } \item{clustalg}{ a character string specifing the clustering algorithm. Allowed values are \sQuote{kmeans} and \sQuote{hclust}. } \item{fit}{ logical, if TRUE coordinate superposition on identified core atoms is performed prior to the calculation of the AMS matrix. } \item{ncore }{ number of CPU cores used to do the calculation. \code{ncore>1} requires package \sQuote{parallel} installed. } \item{verbose}{ logical, if TRUE details of the geostas calculations are printed to screen. } \item{nma}{ an \sQuote{nma} object as obtained from function \code{\link{nma}}. Function \code{\link{mktrj}} is used internally to generate a trajectory based on the normal modes. } \item{m.inds}{ the mode number(s) along which trajectory should be made (see function \code{\link{mktrj}}). } \item{enma}{ an \sQuote{enma} object as obtained from function \code{\link{nma.pdbs}}. Function \code{\link{mktrj}} is used internally to generate a trajectory based on the normal modes. } \item{pdbs}{ a \sQuote{pdbs} object as obtained from function \code{\link{pdbaln}} or \code{\link{read.fasta.pdb}}. } \item{pdb}{ a \sQuote{pdb} object as obtained from function \code{\link{read.pdb}}. } \item{inds}{ a \sQuote{select} object as obtained from function \code{\link{atom.select}} giving the atomic indices at which the calculation should be based. By default the function will attempt to locate C-alpha atoms using function \code{\link{atom.select}}. } \item{x}{ a \sQuote{geostas} object as obtained from function \code{\link{geostas}}. } } \details{ This function attempts to identify rigid domains in a protein (or nucleic acid) structure based on an structural ensemble, e.g. obtained from NMR experiments, molecular dynamics simulations, or normal mode analysis. The algorithm is based on a geometric approach for comparing pairwise traces of atomic motion and the search for their best superposition using a quaternion representation of rotation. The result is stored in a NxN atomic movement similarity matrix (AMSM) describing the correspondence between all pairs of atom motion. Rigid domains are obtained by clustering the elements of the AMS matrix (\code{pairwise=TRUE}), or alternatively, the columns similarity (\code{pairwise=FALSE}), using either K-means (\code{\link{kmeans}}) or hierarchical (\code{\link{hclust}}) clustering. Compared to the conventional cross-correlation matrix (see function \code{\link{dccm}}) the \dQuote{geostas} approach provide functionality to also detect domains involved in rotational motions (i.e. two atoms located on opposite sides of a rotating domain will appear as anti-correlated in the cross-correlation matrix, but should obtain a high similarity coefficient in the AMS matrix). See examples for more details. } \note{ The current implementation in Bio3D uses a different fitting and clustering approach than the original Java implementation. The results will therefore differ. } \value{ Returns a list object of type \sQuote{geostas} with the following components: \item{amsm }{ a numeric matrix of atomic movement similarity (AMSM). } \item{fit.inds }{ a numeric vector of xyz indices used for fitting. } \item{grps }{ a numeric vector containing the domain assignment per residue. } \item{atomgrps }{ a numeric vector containing the domain assignment per atom (only provided for \code{geostas.pdb}). } \item{inds }{ a list of atom \sQuote{select} objects with indices to corresponding to the identified domains. } } \references{ Romanowska, J. et al. (2012) \emph{JCTC} \bold{8}, 2588--2599. Skjaerven, L. et al. (2014) \emph{BMC Bioinformatics} \bold{15}, 399. Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Julia Romanowska and Lars Skjaerven } \seealso{ \code{\link{plot.geostas}}, \code{\link{read.pdb}}, \code{\link{mktrj}}, \code{\link{read.ncdf}}, \code{\link{read.dcd}}, \code{\link{nma}}, \code{\link{dccm}}. } \examples{ \donttest{ # PDB server connection required - testing excluded #### NMR-ensemble example ## Read a multi-model PDB file pdb <- read.pdb("1d1d", multi=TRUE) ## Find domains and write PDB gs <- geostas(pdb, fit=TRUE) ## Plot a atomic movement similarity matrix plot.geostas(gs, contour=FALSE) ## Fit all frames to the 'first' domain domain.inds <- gs$inds[[1]] xyz <- pdbfit(pdb, inds=domain.inds) #write.pdb(pdb, xyz=xyz, chain=gs$atomgrps) } \dontrun{ #### NMA example ## Fetch stucture pdb <- read.pdb("1crn") ## Calculate (vibrational) normal modes modes <- nma(pdb) ## Find domains gs <- geostas(modes, k=2) ## Write NMA trajectory with domain assignment mktrj(modes, mode=7, chain=gs$grps) ## Redo geostas domain clustering gs <- geostas(modes, amsm=gs$amsm, k=5) #### Trajectory example ## Read inn DCD trajectory file, fit coordinates dcdfile <- system.file("examples/hivp.dcd", package = "bio3d") trj <- read.dcd(dcdfile) xyz <- fit.xyz(trj[1,], trj) ## Find domains gs <- geostas(xyz, k=3, fit=FALSE) ## Principal component analysis pc.md <- pca.xyz(xyz) ## Visualize PCs with colored domains (chain ID) mktrj(pc.md, pc=1, chain=gs$grps) #### X-ray ensemble GroEL subunits # Define the ensemble PDB-ids ids <- c("1sx4_[A,B,H,I]", "1xck_[A-B]", "1sx3_[A-B]", "4ab3_[A-B]") # Download and split PDBs by chain ID raw.files <- get.pdb(ids, path = "raw_pdbs", gzip = TRUE) files <- pdbsplit(raw.files, ids, path = "raw_pdbs/split_chain/") # Align structures pdbs <- pdbaln(files) # Find domains gs <- geostas(pdbs, k=4, fit=TRUE) # Superimpose to core region pdbs$xyz <- pdbfit(pdbs, inds=gs$fit.inds) # Principal component analysis pc.xray <- pca(pdbs) # Visualize PCs with colored domains (chain ID) mktrj(pc.xray, pc=1, chain=gs$grps) ##- Same, but more manual approach gaps.pos <- gap.inspect(pdbs$xyz) # Find core region core <- core.find(pdbs) # Fit to core region xyz <- fit.xyz(pdbs$xyz[1, gaps.pos$f.inds], pdbs$xyz[, gaps.pos$f.inds], fixed.inds=core$xyz, mobile.inds=core$xyz) # Find domains gs <- geostas(xyz, k=4, fit=FALSE) # Perform PCA pc.xray <- pca.xyz(xyz) # Make trajectory mktrj(pc.xray, pc=1, chain=gs$grps) } } \keyword{ analysis } bio3d/man/vmd.cna.Rd0000644000176200001440000001155014046073105013644 0ustar liggesusers\name{vmd} \alias{vmd} \alias{vmd.cna} \alias{vmd.ecna} \alias{vmd.cnapath} \alias{vmd.ecnapath} \title{ View CNA Protein Structure Network Community Output in VMD } \description{ This function generates a VMD scene file and a PDB file that can be read and rendered by the VMD molecular viewer. Chose \sQuote{color by chain} to see corresponding regions of structure colored by community along with the community protein structure network. } \usage{ vmd(\dots) \method{vmd}{cna}(x, pdb, layout = layout.cna(x, pdb, k=3), col.sphere=NULL, col.lines = "silver", weights = NULL, radius = table(x$communities$membership)/5, alpha = 1, vmdfile = "network.vmd", pdbfile = "network.pdb", full = FALSE, launch = FALSE, exefile=NULL, \dots) \method{vmd}{ecna}(x, n=1, \dots) \method{vmd}{cnapath}(x, pdb, out.prefix = "vmd.cnapath", spline = FALSE, colors = c("blue", "red"), launch = FALSE, exefile=NULL, mag=1.0, \dots) \method{vmd}{ecnapath}(x, \dots) } \arguments{ \item{x}{A 'cna' or 'cnapath' class object, or a list of such objects, as obtained from functions \code{cna} or \code{cnapath}. } \item{n}{ The index to indicate which network or path to view with \code{vmd}. } \item{pdb}{A 'pdb' class object such as obtained from \sQuote{read.pdb} function. } \item{layout}{ A numeric matrix of Nx3 XYZ coordinate matrix, where N is the number of community spheres to be drawn. } \item{col.sphere}{ A numeric vector containing the sphere colors. } \item{col.lines}{ A character object specifying the color of the edges (default 'silver'). Must use VMD colors names. } \item{weights}{ A numeric vector specifying the edge width. Default is taken from E(x$community.network)$weight. } \item{radius}{ A numeric vector containing the sphere radii. Default is taken from the number of community members divided by 5. } \item{alpha}{ A single element numeric vector specifying the VMD alpha transparency parameter. Default is set to 1. } \item{vmdfile}{ A character element specifying the output VMD scene file name that will be loaded in VMD. } \item{pdbfile}{ A character element specifying the output pdb file name to be loaded in VMD. } \item{full}{ Logical, if TRUE the full all-atom network rather than the clustered community network will be drawn. Intra community edges are colored according to the community membership, while inter community edges are thicker and colored black. } \item{launch}{ Logical. If TRUE, a VMD session will be started with the output of \sQuote{vmd.cna}. } \item{out.prefix}{ Prefix for the names of output files, \sQuote{vmd.cnapath.vmd} and \sQuote{vmd.cnapath.pdb}. } \item{spline}{ Logical, if TRUE all paths are displayed as spline curves. } \item{colors}{ Character vector or integer scalar, define path colors. If a character vector, passed to \code{\link{colorRamp}} function to generate the color scales. If an integer, color all paths the same way with VMD color ID equal to the integer. } \item{exefile}{ file path to the \sQuote{VMD} program on your system (i.e. how is \sQuote{VMD} invoked). If \code{NULL}, use OS-dependent default path to the program. } \item{mag}{ A numeric factor to scale the maximal thickness of paths. } \item{\dots}{ additional arguments passed to the function \code{\link{colorRamp}} (in \code{vmd.cnapath}). } } \details{ This function generates a scaled sphere (communities) and stick (edges) representation of the community network along with the corresponding protein structure divided into chains, one chain for each community. The sphere radii are proportional to the number of community members and the edge widths correspond to network edge weights. } \value{ Two files are generated as output. A pdb file with the residue chains assigned according to the community and a text file containing The drawing commands for the community representation. } \references{ Humphrey, W., Dalke, A. and Schulten, K., ``VMD - Visual Molecular Dynamics'' J. Molec. Graphics 1996, 14.1, 33-38. } \author{ Barry Grant} \examples{ \dontrun{ if (!requireNamespace("igraph", quietly = TRUE)) { message('Need igraph installed to run this example') } else { # Load the correlation network from MD data attach(hivp) # Read the starting PDB file to determine atom correspondence pdbfile <- system.file("examples/hivp.pdb", package="bio3d") pdb <- read.pdb(pdbfile) # View cna vmd.cna(net, pdb, launch=FALSE) ## within VMD set 'coloring method' to 'Chain' and 'Drawing method' to Tube ##-- From NMA pdb.gdi = read.pdb("1KJY") pdb.gdi = trim.pdb(pdb.gdi, inds=atom.select(pdb.gdi, chain="A", elety="CA")) modes.gdi = nma(pdb.gdi) cij.gdi = dccm(modes.gdi) net.gdi = cna(cij.gdi, cutoff.cij=0.35) #vmd.cna(net.gdi, pdb.gdi, alpha = 0.7, launch=TRUE) detach(hivp) } } } \keyword{ utility } bio3d/man/pfam.Rd0000644000176200001440000000315414046073105013242 0ustar liggesusers\name{pfam} \alias{pfam} \title{ Download Pfam FASTA Sequence Alignment } \description{ Downloads FASTA sequence alignment from the Pfam database. } \usage{ pfam(id, alignment = "seed", verbose = FALSE) } \arguments{ \item{id}{ the Pfam familiy identifier (e.g \sQuote{Piwi}) or accession (e.g. \sQuote{PF02171}). } \item{alignment}{ the alignment type. Allowed values are: \sQuote{seed}, \sQuote{ncbi}, \sQuote{full}, \sQuote{metagenomics}. } \item{verbose}{ logical, if TRUE details of the download process is printed. } } \details{ This is a basic function to download a multiple sequence alignment for a protein family from the Pfam database. } \value{ A \sQuote{fasta} object with the following components: \item{ali }{ an alignment character matrix with a row per sequence and a column per equivalent aminoacid/nucleotide. } \item{ids }{ sequence names as identifiers. } \item{call }{ the matched call. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \note{ Full more information on the Pfam database:\cr \url{http://pfam.xfam.org} } \seealso{ \code{\link{read.fasta}}, \code{\link{hmmer}}, \code{\link{get.seq}}, \code{\link{uniprot}} } \examples{ \dontrun{ # PFAM server connection required - testing excluded aln <- pfam("piwi") aln <- pfam("PF02171") seq <- get.seq("1rx2_A", outfile = tempfile()) hmm <- hmmer(seq, type="hmmscan", db="pfam") aln <- pfam(hmm$hit.tbl$acc[1]) # Or much more simply for RCSB PDB entries: acc <- pdb.pfam("1rx2_A", compact=FALSE)$pfamAcc aln <- pfam(acc) } } \keyword{ utilities } bio3d/man/dssp.Rd0000644000176200001440000001324314046073105013270 0ustar liggesusers\name{dssp} \alias{dssp} \alias{dssp.pdb} \alias{dssp.pdbs} \alias{dssp.xyz} \alias{stride} \alias{print.sse} \title{ Secondary Structure Analysis with DSSP or STRIDE } \description{ Secondary structure assignment according to the method of Kabsch and Sander (DSSP) or the method of Frishman and Argos (STRIDE). } \usage{ dssp(\dots) \method{dssp}{pdb}(pdb, exefile = "dssp", resno=TRUE, full=FALSE, verbose=FALSE, \dots) \method{dssp}{pdbs}(pdbs, \dots) \method{dssp}{xyz}(xyz, pdb, \dots) stride(pdb, exefile = "stride", resno=TRUE) \method{print}{sse}(x, \dots) } \arguments{ \item{pdb}{ a structure object of class \code{"pdb"}, obtained from \code{\link{read.pdb}}. } \item{exefile}{ file path to the \sQuote{DSSP} or \sQuote{STRIDE} program on your system (i.e. how is \sQuote{DSSP} or \sQuote{STRIDE} invoked). } \item{resno}{ logical, if TRUE output is in terms of residue numbers rather than residue index (position in sequence). } \item{full}{ logical, if TRUE bridge pairs and hbonds columns are parsed. } \item{verbose}{ logical, if TRUE \sQuote{DSSP} warning and error messages are printed. } \item{pdbs}{ a list object of class \code{"pdbs"} (obtained with \code{\link{pdbaln}} or \code{\link{read.fasta.pdb}}). } \item{xyz}{ a trajectory object of class \code{"xyz"}, obtained from \code{\link{read.ncdf}}, \code{\link{read.dcd}}, \code{\link{read.crd}}. } \item{x}{ an \code{sse} object obtained from \code{\link{dssp.pdb}} or \code{\link{stride}}. } \item{...}{ additional arguments to and from functions. } } \details{ This function calls the \sQuote{DSSP} or \sQuote{STRIDE} program to define secondary structure and psi and phi torsion angles. } \value{ Returns a list with the following components: \item{helix}{ \sQuote{start}, \sQuote{end}, \sQuote{length}, \sQuote{chain} and \sQuote{type} of helix, where start and end are residue numbers or residue index positions depending on the value of \dQuote{resno} input argument. } \item{sheet}{ \sQuote{start}, \sQuote{end} and \sQuote{length} of E type sse, where start and end are residue numbers \dQuote{resno}. } \item{turn}{ \sQuote{start}, \sQuote{end} and \sQuote{length} of T type sse, where start and end are residue numbers \dQuote{resno}. } \item{phi}{ a numeric vector of phi angles. } \item{psi}{ a numeric vector of psi angles. } \item{acc}{ a numeric vector of solvent accessibility. } \item{sse}{ a character vector of secondary structure type per residue. } \item{hbonds}{ a 10 or 16 column matrix containing the bridge pair records as well as backbone NH-->O and O-->NH H-bond records. (Only available for \code{\link{dssp}} } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. \sQuote{DSSP} is the work of Kabsch and Sander: Kabsch and Sander (1983) \emph{Biopolymers.} \bold{12}, 2577--2637. For information on obtaining \sQuote{DSSP}, see:\cr \url{https://swift.cmbi.umcn.nl/gv/dssp/}. \sQuote{STRIDE} is the work of Frishman and Argos: Frishman and Argos (1995) \emph{Proteins.} \bold{3}, 566--579. For information on obtaining the \sQuote{STRIDE} program, see:\cr \url{http://webclu.bio.wzw.tum.de/stride/}, or copy it from an installation of VMD. } \author{ Barry Grant, Lars Skjaerven (dssp.pdbs) } \note{ A system call is made to the \sQuote{DSSP} or \sQuote{STRIDE} program, which must be installed on your system and in the search path for executables. See \url{http://thegrantlab.org/bio3d/articles/online/install_vignette/Bio3D_install.html} for instructions of how to install these programs. For the \code{hbonds} list component the column names can be used as a convenient means of data access, namely:\cr Bridge pair 1 \dQuote{BP1},\cr Bridge pair 2 \dQuote{BP2},\cr Backbone H-bond (NH-->O) \dQuote{NH-O.1},\cr H-bond energy of NH-->O \dQuote{E1},\cr Backbone H-bond (O-->NH) \dQuote{O-HN.1},\cr H-bond energy of O-->NH \dQuote{E2},\cr Backbone H-bond (NH-->O) \dQuote{NH-O.2},\cr H-bond energy of NH-->O \dQuote{E3},\cr Backbone H-bond (O-->NH) \dQuote{O-HN.2},\cr H-bond energy of O-->NH \dQuote{E4}.\cr If \sQuote{resno=TRUE} the following additional columns are included:\cr Chain ID of resno \dQuote{BP1}: \dQuote{ChainBP1},\cr Chain ID of resno \dQuote{BP2}: \dQuote{ChainBP2},\cr Chain ID of resno \dQuote{O-HN.1}: \dQuote{Chain1},\cr Chain ID of resno \dQuote{NH-O.2}: \dQuote{Chain2},\cr Chain ID of resno \dQuote{O-HN.1}: \dQuote{Chain3},\cr Chain ID of resno \dQuote{NH-O.2}: \dQuote{Chain4}. } \seealso{ \code{\link{read.pdb}}, \code{\link{torsion.pdb}}, \code{\link{torsion.xyz}}, \code{\link{plot.bio3d}}, \code{\link{read.ncdf}}, \code{\link{read.dcd}}, \code{\link{read.prmtop}}, \code{\link{read.crd}}, } \examples{ \dontrun{ ##- PDB example # Read a PDB file pdb <- read.pdb("1bg2") sse <- dssp(pdb) sse2 <- stride(pdb) ## Short summary sse sse2 # Helix data sse$helix # Precent SSE content sum(sse$helix$length)/sum(pdb$calpha) * 100 sum(sse$sheet$length)/sum(pdb$calpha) * 100 ##- PDBs example aln <- read.fasta( system.file("examples/kif1a.fa",package="bio3d") ) pdbs <- read.fasta.pdb( aln ) ## Aligned PDB defined secondary structure pdbs$sse ## Aligned DSSP defined secondary structure sse <- dssp(pdbs) ##- XYZ Trajectory pdb <- read.pdb("2mda", multi=TRUE) dssp.xyz(pdb$xyz, pdb) ## Note. for large MD trajectories you may want to skip some frames, e.g. xyz <- rbind(pdb$xyz, pdb$xyz) ## dummy trajectory frames <- seq(1, to=nrow(xyz), by=4) ## frame numbers to examine ss <- dssp.xyz(xyz[frames, ], pdb) ## matrix of sse frame x residue } } \keyword{ utilities } bio3d/man/setup.ncore.Rd0000644000176200001440000000115314046073105014561 0ustar liggesusers\name{setup.ncore} \alias{setup.ncore} \title{ Setup for Running Bio3D Functions using Multiple CPU Cores } \description{ Internally used in parallelized Bio3D functions. } \usage{ setup.ncore(ncore, bigmem = FALSE) } \arguments{ \item{ncore}{ User set (or default) value of \sQuote{ncore}. } \item{bigmem}{ logical, if TRUE also check the availability of \sQuote{bigmemory} package. } } \details{ Check packages and set correct value of \sQuote{ncore}. } \value{ The actual value of \sQuote{ncore}. } \examples{ setup.ncore(NULL) setup.ncore(1) # setup.ncore(2) } \keyword{ utilities } bio3d/man/sip.Rd0000644000176200001440000000334614046073105013115 0ustar liggesusers\name{sip} \alias{sip} \alias{sip.default} \alias{sip.nma} \alias{sip.enma} \title{ Square Inner Product } \description{ Calculate the correlation between two atomic fluctuation vectors. } \usage{ sip(...) \method{sip}{nma}(a, b, ...) \method{sip}{enma}(enma, ncore=NULL, ...) \method{sip}{default}(v, w, ...) } \arguments{ \item{enma}{ an object of class \code{"enma"} obtained from function \code{nma.pdbs}. } \item{ncore }{ number of CPU cores used to do the calculation. \code{ncore>1} requires package \sQuote{parallel} installed. } \item{a}{ an \sQuote{nma} object as object from function \code{nma} to be compared to \code{b}. } \item{b}{ an \sQuote{nma} object as object from function \code{nma} to be compared to \code{a}. } \item{v}{ a numeric vector containing the atomic fluctuation values. } \item{w}{ a numeric vector containing the atomic fluctuation values. } \item{\dots}{ arguments passed to associated functions. } } \details{ SIP is a measure for the similarity of atomic fluctuations of two proteins, e.g. experimental b-factors, theroetical RMSF values, or atomic fluctuations obtained from NMA. } \value{ Returns the similarity coefficient(s). } \references{ Skjaerven, L. et al. (2014) \emph{BMC Bioinformatics} \bold{15}, 399. Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. Fuglebakk, E. et al. (2013) \emph{JCTC} \bold{9}, 5618--5628. } \author{ Lars Skjaerven } \seealso{Other similarity measures: \code{\link{covsoverlap}}, \code{\link{bhattacharyya}}, \code{\link{rmsip}}. } \examples{ pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) a <- nma(pdb) b <- nma(pdb, ff="anm") sip(a$fluctuations, b$fluctuations) } \keyword{ utilities } bio3d/man/mktrj.Rd0000644000176200001440000000711314046073105013445 0ustar liggesusers\name{mktrj} \alias{mktrj} \alias{mktrj.pca} \alias{mktrj.nma} \alias{mktrj.enma} \title{ PCA / NMA Atomic Displacement Trajectory } \description{ Make a trajectory of atomic displacments along a given principal component / normal mode. } \usage{ mktrj(...) \method{mktrj}{pca}(pca = NULL, pc = 1, mag = 1, step = 0.125, file = NULL, pdb = NULL, rock=TRUE, ...) \method{mktrj}{nma}(nma = NULL, mode = 7, mag = 10, step = 1.25, file = NULL, pdb = NULL, rock=TRUE, ...) \method{mktrj}{enma}(enma = NULL, pdbs = NULL, s.inds = NULL, m.inds = NULL, mag = 10, step = 1.25, file = NULL, rock = TRUE, ncore = NULL, ...) } \arguments{ \item{pca}{ an object of class \code{"pca"} as obtained with function \code{\link{pca.xyz}} or \code{\link{pca}}.} \item{nma}{ an object of class \code{"nma"} as obtained with function \code{\link{nma.pdb}}.} \item{enma}{ an object of class \code{"enma"} as obtained with function \code{\link{nma.pdbs}}.} \item{pc}{ the PC number along which displacements should be made.} \item{mag}{ a magnification factor for scaling the displacements. } \item{step}{ the step size by which to increment along the pc/mode. } \item{file}{ a character vector giving the output PDB file name. } \item{pdb}{ an object of class \code{"pdb"} as obtained from \code{\link{read.pdb}} or class \code{"pdbs"} as obtained from \code{\link{read.fasta.pdb}}. If not NULL, used as reference to write the PDB file. } \item{rock}{ logical, if TRUE the trajectory rocks. } \item{mode}{ the mode number along which displacements should be made.} \item{pdbs}{ a list object of class \code{"pdbs"} (obtained with \code{\link{pdbaln}} or \code{\link{read.fasta.pdb}}) which corresponds to the \code{"enma"} object.} \item{s.inds}{ index or indices pointing to the structure(s) in the \code{enma} object for which the trajectory shall be generated. } \item{m.inds}{ the mode number(s) along which displacements should be made. } \item{ncore }{ number of CPU cores used to do the calculation. \code{ncore>1} requires package \sQuote{parallel} installed. } \item{\dots}{ additional arguments passed to and from functions (e.g. to function \code{\link{write.pdb}}). } } \details{ Trajectory frames are built from reconstructed Cartesian coordinates produced by interpolating from the mean structure along a given \code{pc} or \code{mode}, in increments of \code{step}. An optional magnification factor can be used to amplify displacements. This involves scaling by \code{mag}-times the standard deviation of the conformer distribution along the given \code{pc} (i.e. the square root of the associated eigenvalue). } \note{ Molecular graphics software such as VMD or PyMOL is useful for viewing trajectories see e.g: \cr \url{http://www.ks.uiuc.edu/Research/vmd/}. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant, Lars Skjaerven } \seealso{ \code{\link{pca}}, \code{\link{nma}}, \code{\link{nma.pdbs}}, \code{\link{pymol.modes}}. } \examples{ \dontrun{ ##- PCA example attach(transducin) # Calculate principal components pc.xray <- pca(pdbs, fit=TRUE) # Write PC trajectory of pc=1 outfile = tempfile() a <- mktrj(pc.xray, file = outfile) outfile detach(transducin) ##- NMA example ## Fetch stucture pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) ## Calculate (vibrational) normal modes modes <- nma(pdb) ## Visualize modes outfile = file.path(tempdir(), "mode_7.pdb") mktrj(modes, mode=7, pdb=pdb, file = outfile) outfile } } \keyword{ utilities } bio3d/man/print.cna.Rd0000644000176200001440000000360014046073105014207 0ustar liggesusers\name{print.cna} \alias{print.cna} \alias{summary.cna} \title{ Summarize and Print Features of a cna Network Graph } \description{ These functions attempt to summarize and print a cna network graph to the terminal in a human readable form. } \usage{ \method{print}{cna}(x, ...) \method{summary}{cna}(object, verbose=TRUE, ...) } \arguments{ \item{x}{ A cna network and community object as obtained from the function \sQuote{cna}.} \item{object}{ A cna network and community object as obtained from the function \sQuote{cna}.} \item{verbose}{ Logical, if TRUE a community summary table is prited to screen.} \item{\dots}{ Extra arguments passed to the \sQuote{write.table} function. } } \details{ Simple summary and print methods for protein dynamic networks. } \value{ The function summary.cna returns a list with the following components: \item{id}{ A community number/identifier vector with an element for each community. } \item{size}{ A numeric community size vector, with elements giving the number of nodes within each community. } \item{members}{ A lst detailing the nodes within each community. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Guido Scarabelli and Barry Grant } \seealso{ \code{\link{cna}}, \code{\link[igraph:print.igraph]{print.igraph}}, \code{\link[igraph:print.igraph]{str.igraph}}, \code{\link[igraph:plot.common]{igraph.plotting}} } \examples{ if (!requireNamespace("igraph", quietly = TRUE)) { message('Need igraph installed to run this example') } else { ## Load the correlation network attach(hivp) ## Read the starting PDB file to determine atom correspondence pdbfile <- system.file("examples/hivp.pdb", package="bio3d") pdb <- read.pdb(pdbfile) ## Examine network composition print(net) x<- summary(net) x$members[[2]] detach(hivp) } } \keyword{ utilities } bio3d/man/clean.pdb.Rd0000644000176200001440000000356214046073105014150 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/clean.pdb.R \name{clean.pdb} \alias{clean.pdb} \title{Inspect And Clean Up A PDB Object} \usage{ clean.pdb(pdb, consecutive = TRUE, force.renumber = FALSE, fix.chain = FALSE, fix.aa = FALSE, rm.wat = FALSE, rm.lig = FALSE, rm.h = FALSE, verbose = FALSE) } \arguments{ \item{pdb}{an object of class \code{pdb} as obtained from function \code{\link{read.pdb}}.} \item{consecutive}{logical, if TRUE renumbering will result in consecutive residue numbers spanning all chains. Otherwise new residue numbers will begin at 1 for each chain.} \item{force.renumber}{logical, if TRUE atom and residue records are renumbered even if no 'insert' code is found in the \code{pdb} object.} \item{fix.chain}{logical, if TRUE chains are relabeled based on chain breaks detected.} \item{fix.aa}{logical, if TRUE non-standard amino acid names are converted into equivalent standard names.} \item{rm.wat}{logical, if TRUE water atoms are removed.} \item{rm.lig}{logical, if TRUE ligand atoms are removed.} \item{rm.h}{logical, if TRUE hydrogen atoms are removed.} \item{verbose}{logical, if TRUE details of the conversion process are printed.} } \value{ a 'pdb' object with an additional \code{$log} component storing all the processing messages. } \description{ Inspect alternative coordinates, chain breaks, bad residue numbering, non-standard/unknow amino acids, etc. Return a 'clean' pdb object with fixed residue numbering and optionally relabeled chain IDs, corrected amino acid names, removed water, ligand, or hydrogen atoms. All changes are recorded in a log in the returned object. } \details{ call for its effects. } \examples{ \donttest{ # PDB server connection required - testing excluded pdb <- read.pdb("1a7l") clean.pdb(pdb) } } \author{ Xin-Qiu Yao & Barry Grant } \seealso{ \code{\link{read.pdb}} } bio3d/man/plot.cna.Rd0000644000176200001440000001102414046073105014030 0ustar liggesusers\name{plot.cna} \alias{plot.cna} \alias{plot.ecna} \title{ Protein Structure Network Plots in 2D and 3D. } \description{ Plot a protein dynamic network as obtained from the \emph{cna} function. } \usage{ \method{plot}{cna}(x, pdb = NULL, weights=NULL, vertex.size=NULL, layout=NULL, col=NULL, full=FALSE, scale=TRUE, color.edge = FALSE, interactive=FALSE, ...) \method{plot}{ecna}(x, \dots) } \arguments{ \item{x}{ A protein network graph object (or a list of such objects) as obtained from the \sQuote{cna} function. } \item{pdb}{ A PDB structure object obtained from \sQuote{read.pdb}. If supplied this will be used to guide the network plot \sQuote{layout}, see \sQuote{layout.cna} for details. } \item{weights}{ A numeric vector containing the edge weights for the network. } \item{vertex.size}{ A numeric vector of node/community sizes. If NULL the size will be taken from the input network graph object \sQuote{x}. Typically for \sQuote{full=TRUE} nodes will be of an equal size and for \sQuote{full=FALSE} community node size will be proportional to the residue membership of each community. } \item{layout}{ Either a function or a numeric matrix. It specifies how the vertices will be placed on the plot. See \sQuote{layout.cna}. } \item{col}{ A vector of colors used for node/vertex rendering. If NULL these values are taken from the input network \sQuote{V(x$community.network)$color}. } \item{full}{ Logical, if TRUE the full all-atom network rather than the clustered community network will be plotted. } \item{scale}{ Logical, if TRUE weights are scaled with respect to the network. } \item{color.edge}{ Logical, if TRUE edges are colored with respect to their weights. } \item{interactive}{ Logical, if TRUE interactive graph will be drawn where users can manually adjust the network (positions of vertices, colors of edges, etc.). Needs Tcl/Tk support in the installed R build. } \item{\dots}{ Additional graphical parameters for \sQuote{plot.igraph}. } } \details{ This function calls \sQuote{plot.igraph} from the igraph package to plot cna networks the way we like them. The plot layout is user settable, we like the options of: \sQuote{layout.cna}, \sQuote{layout.fruchterman.reingold}, \sQuote{layout.mds} or \sQuote{layout.svd}. Note that first of these uses PDB structure information to produce a more meaningful layout. Extensive plot modifications are possible by setting additional graphical parameters (\dots). These options are detailed in \sQuote{igraph.plotting}. Common parameters to alter include: \describe{ \item{vertex.label:}{Node labels, \code{V(x$network)$name}. Use NA to omit.} \item{vertex.label.color:}{Node label colors, see also \code{vertex.label.cex} etc. } \item{edge.color:}{Edge colors, \code{E(x$network)$color}. } \item{mark.groups:}{Community highlighting, a community list object, see also \code{mark.col} etc.} } } \value{ Produces a network plot on the active graphics device. Also returns the plot layout coordinates silently, which can be passed to the \sQuote{identify.cna} function. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant and Guido Scarabelli } \note{ Be sure to check the correspondence of your \sQuote{pdb} object with your network object \sQuote{x}, as few internal checks are currently performed by the \sQuote{layout.cna} function. } \seealso{ \code{\link[igraph:plot.igraph]{plot.igraph}}, \code{\link[igraph:communities]{plot.communities}}, \code{\link[igraph:plot.common]{igraph.plotting}} } \examples{ \donttest{ # PDB server connection required - testing excluded if (!requireNamespace("igraph", quietly = TRUE)) { message('Need igraph installed to run this example') } else { ##-- Build a CNA object pdb <- read.pdb("4Q21") modes <- nma(pdb) cij <- dccm(modes) net <- cna(cij, cutoff.cij=0.2) # Plot coarse grain network based on dynamically coupled communities xy <- plot.cna(net) #plot.dccm(cij, margin.segments=net$communities$membership) # Chose a different PDB informed layout for plot plot.cna(net, pdb) # Play with plot layout and colors... plot.cna(net, layout=igraph::layout.mds(net$community.network), col=c("blue","green") ) # Plot full residue network colored by communities - will be slow due to number of edges!! plot.cna(net, pdb, full=TRUE) # Alter plot settings plot.cna(net, pdb, full=TRUE, vertex.size=3, weights=1, vertex.label=NA) } } } \keyword{ hplot } bio3d/man/plot.rmsip.Rd0000644000176200001440000000246514046073105014432 0ustar liggesusers\name{plot.rmsip} \alias{plot.rmsip} \title{ Plot RMSIP Results } \description{ Produces a heat plot of RMSIP (Root mean square inner product) for the visualization of modes similarity. } \usage{ \method{plot}{rmsip}(x, xlab = NULL, ylab = NULL, col = gray(50:0/50), zlim=c(0,1), \dots) } \arguments{ \item{x}{ an object of class \code{rmsip}. } \item{xlab}{ a label for the x axis, defaults to \sQuote{a}. } \item{ylab}{ a label for the y axis, defaults to \sQuote{b}. } \item{col}{ a vector of colors for the RMSIP map (or overlap values). } \item{zlim}{ the minimum and maximum \sQuote{z} values for which colors should be plotted. } \item{\dots}{ additional arguments to function \code{image}. } } \details{ \code{plot.rmsip} produces a color image with the function \code{image}. } \value{ Called for its effect. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{rmsip}}, \code{\link{overlap}}, \code{\link{nma}}, \code{\link{image}}. } \examples{ ## Read PDB structure pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) ## Perform NMA modes.a <- nma(pdb, ff="calpha") modes.b <- nma(pdb, ff="anm") ## Calculate and plot RMSIP r <- rmsip(modes.a, modes.b) plot(r) } \keyword{ hplot } bio3d/man/torsion.pdb.Rd0000644000176200001440000000544614046073105014566 0ustar liggesusers\name{torsion.pdb} \alias{torsion.pdb} \title{ Calculate Mainchain and Sidechain Torsion/Dihedral Angles } \description{ Calculate all torsion angles for a given protein PDB structure object. } \usage{ torsion.pdb(pdb) } \arguments{ \item{pdb}{ a PDB structure object as obtained from function \code{read.pdb}. } } \details{ The conformation of a polypeptide chain can be usefully described in terms of angles of internal rotation around its constituent bonds. See the related \code{torsion.xyz} function, which is called by this function, for details. } \value{ Returns a list object with the following components: \item{phi}{ main chain torsion angle for atoms C,N,CA,C. } \item{psi}{ main chain torsion angle for atoms N,CA,C,N. } \item{omega}{ main chain torsion angle for atoms CA,C,N,CA. } \item{alpha}{ virtual torsion angle between consecutive C-alpha atoms. } \item{chi1}{ side chain torsion angle for atoms N,CA,CB,*G. } \item{chi2}{ side chain torsion angle for atoms CA,CB,*G,*D. } \item{chi3}{ side chain torsion angle for atoms CB,*G,*D,*E. } \item{chi4}{ side chain torsion angle for atoms *G,*D,*E,*Z. } \item{chi5}{ side chain torsion angle for atoms *D,*E,*Z, NH1. } \item{coords}{ numeric matrix of \sQuote{justified} coordinates. } \item{tbl}{ a numeric matrix of psi, phi and chi torsion angles. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \note{ For the protein backbone, or main-chain atoms, the partial double-bond character of the peptide bond between \sQuote{C=N} atoms severely restricts internal rotations. In contrast, internal rotations around the single bonds between \sQuote{N-CA} and \sQuote{CA-C} are only restricted by potential steric collisions. Thus, to a good approximation, the backbone conformation of each residue in a given polypeptide chain can be characterised by the two angles phi and psi. Sidechain conformations can also be described by angles of internal rotation denoted chi1 up to chi5 moving out along the sidechain. } \seealso{ \code{\link{torsion.xyz}}, \code{\link{read.pdb}}, \code{\link{dssp}}, \code{\link{stride}}. } \examples{ \donttest{ # PDB server connection required - testing excluded ##-- PDB torsion analysis pdb <- read.pdb( "1bg2" ) tor <- torsion.pdb(pdb) head(tor$tbl) ## basic Ramachandran plot plot(tor$phi, tor$psi) ## torsion analysis of a single coordinate vector #inds <- atom.select(pdb,"calpha") #tor.ca <- torsion.xyz(pdb$xyz[inds$xyz], atm.inc=1) ##-- Compare two PDBs to highlight interesting residues aln <- read.fasta(system.file("examples/kif1a.fa",package="bio3d")) m <- read.fasta.pdb(aln) a <- torsion.xyz(m$xyz[1,],1) b <- torsion.xyz(m$xyz[2,],1) d <- wrap.tor(a-b) plot(m$resno[1,],d, typ="h") } } \keyword{ utilities } bio3d/man/com.Rd0000644000176200001440000000513614046073105013077 0ustar liggesusers\name{com} \alias{com} \alias{com.pdb} \alias{com.xyz} \title{ Center of Mass } \description{ Calculate the center of mass of a PDB object. } \usage{ com(...) \method{com}{pdb}(pdb, inds=NULL, use.mass=TRUE, ...) \method{com}{xyz}(xyz, mass=NULL, ...) } \arguments{ \item{pdb}{ an object of class \code{pdb} as obtained from function \code{read.pdb}. } \item{inds}{ atom and xyz coordinate indices obtained from \code{atom.select} that selects the elements of \code{pdb} upon which the calculation should be based.} \item{use.mass}{ logical, if TRUE the calculation will be mass weighted (center of mass). } \item{...}{ additional arguments to \code{atom2mass}. } \item{xyz}{ a numeric vector or matrix of Cartesian coordinates (e.g. an object of type \code{xyz}). } \item{mass}{ a numeric vector containing the masses of each atom in \code{xyz}. } } \details{ This function calculates the center of mass of the provided PDB structure / Cartesian coordiantes. Atom names found in standard amino acids in the PDB are mapped to atom elements and their corresponding relative atomic masses. In the case of an unknown atom name \code{elety.custom} and \code{mass.custom} can be used to map an atom to the correct atomic mass. See examples for more details. Alternatively, the atom name will be mapped automatically to the element corresponding to the first character of the atom name. Atom names starting with character \code{H} will be mapped to hydrogen atoms. } \value{ Returns the Cartesian coordinates at the center of mass. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{read.pdb}}, \code{\link{atom2mass}} } \examples{ \donttest{ # PDB server connection required - testing excluded ## Stucture of PKA: pdb <- read.pdb("3dnd") ## Center of mass: com(pdb) ## Center of mass of a selection inds <- atom.select(pdb, chain="I") com(pdb, inds) ## using XYZ Cartesian coordinates xyz <- pdb$xyz[, inds$xyz] com.xyz(xyz) ## with mass weighting com.xyz(xyz, mass=atom2mass(pdb$atom[inds$atom, "elety"]) ) } \dontrun{ ## Unknown atom names pdb <- read.pdb("3dnd") inds <- atom.select(pdb, resid="LL2") mycom <- com(pdb, inds, rescue=TRUE) #warnings() ## Map atom names manually pdb <- read.pdb("3RE0") inds <- atom.select(pdb, resno=201) myelety <- data.frame(name = c("CL2","PT1","N1","N2"), symb = c("Cl","Pt","N","N")) mymasses <- data.frame(symb = c("Cl","Pt"), mass = c(35.45, 195.08)) mycom <- com(pdb, inds, elety.custom=myelety, mass.custom=mymasses) } } \keyword{ utilities } bio3d/man/hclustplot.Rd0000644000176200001440000000532514046073105014522 0ustar liggesusers\name{hclustplot} \alias{hclustplot} \title{ Dendrogram with Clustering Annotation } \description{ Draw a standard dendrogram with clustering annotation in the marginal regions and colored labels. } \usage{ hclustplot(hc, k = NULL, h = NULL, colors = NULL, labels = NULL, fillbox = FALSE, heights = c(1, .3), mar = c(1, 1, 0, 1), ...) } \arguments{ \item{hc}{ an object of the type produced by \code{hclust}. } \item{k}{ an integer scalar or vector with the desired number of groups. Redirected to function \code{cutree}. } \item{h}{ numeric scalar or vector with heights where the tree should be cut. Redirected to function \code{cutree}. At least one of \sQuote{k} or \sQuote{h} must be specified. } \item{colors}{ a numerical or character vector with the same length as \sQuote{hc} specifying the colors of the labels. } \item{labels}{ a character vector with the same length as \sQuote{hc} containing the labels to be written. } \item{fillbox}{ logical, if TRUE clustering annotation will be drawn as filled boxes below the dendrogram. } \item{heights}{ numeric vector of length two specifying the values for the heights of rows on the device. See function \code{layout}. } \item{mar}{ a numerical vector of the form \sQuote{c(bottom, left, top, right)} which gives the number of lines of margin to be specified on the four sides of the plot. If left at default the margins will be adjusted upon adding arguments \sQuote{main}, \sQuote{ylab}, etc. } \item{\dots}{ other graphical parameters passed to functions \code{plot.dendrogram}, \code{mtext}, and \code{par}. Note that certain arguments will be ignored. } } \details{ This function adds extended visualization of cluster membership to a standard dendrogram. If \sQuote{k} or \sQuote{h} is provided a call to \code{cutree} will provide cluster membership information. Alternatively a vector of colors or cluster membership information can be provided through argument \sQuote{colors}. See examples for further details on usage. } \note{ Argument \sQuote{horiz=TRUE} currently not supported. } \value{ Called for its effect. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{plot.hclust}}, \code{\link{plot.dendrogram}}, \code{\link{hclust}}, \code{\link{cutree}}. } \examples{ \donttest{ # Redundant testing excluded attach(transducin) ##- perform RMSD clustering rd <- rmsd(pdbs, fit=TRUE) hc <- hclust(as.dist(rd)) ##- draw dendrogram hclustplot(hc, k=3) ##- draw dendrogram with manual clustering annotation #hclustplot(hc, colors=annotation[, "color"], labels=pdbs$id) detach(transducin) } } \keyword{ hplot } bio3d/man/get.seq.Rd0000644000176200001440000000372014046077017013672 0ustar liggesusers\name{get.seq} \alias{get.seq} \title{ Download FASTA Sequence Files } \description{ Downloads FASTA sequence files from the NCBI nr, SWISSPROT/UNIPROT, OR RCSB PDB databases. } \usage{ get.seq(ids, outfile = "seqs.fasta", db = "nr", verbose = FALSE) } \arguments{ \item{ids}{ A character vector of one or more appropriate database codes/identifiers of the files to be downloaded. } \item{outfile}{ A single element character vector specifying the name of the local file to which sequences will be written. } \item{db}{ A single element character vector specifying the database from which sequences are to be obtained. } \item{verbose}{ logical, if TRUE URL details of the download process are printed. } } \details{ This is a basic function to automate sequence file download from the databases including NCBI nr, SWISSPROT/UNIPROT, and RCSB PDB. } \value{ If all files are successfully downloaded a list object with two components is returned: \item{ali }{ an alignment character matrix with a row per sequence and a column per equivalent aminoacid/nucleotide. } \item{ids }{ sequence names as identifiers.} This is similar to that returned by \code{\link{read.fasta}}. However, if some files were not successfully downloaded then a vector detailing which ids were not found is returned. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \note{ For a description of FASTA format see: \url{https://www.ncbi.nlm.nih.gov/BLAST/blastcgihelp.shtml}. When reading alignment files, the dash \sQuote{-} is interpreted as the gap character. } \seealso{ \code{\link{blast.pdb}}, \code{\link{read.fasta}}, \code{\link{read.fasta.pdb}}, \code{\link{get.pdb}} } \examples{ \dontrun{ ## Sequence identifiers (GI or PDB codes e.g. from blast.pdb etc.) get.seq( c("P01112", "Q61411", "P20171") ) #aa <-get.seq( c("4q21", "5p21") ) #aa$id #aa$ali } } \keyword{ IO } \keyword{ utilities } bio3d/man/sdENM.Rd0000644000176200001440000000225714046073105013270 0ustar liggesusers\name{sdENM} \alias{sdENM} \title{ Index for the sdENM ff } \description{ A dictonary of spring force constants for the sdENM force field. } \usage{ data(sdENM) } \format{ An array of 27 matrices containg the spring force constants for the \sQuote{sdENM} force field (see Dehouch et al for more information). Each matrix in the array holds the force constants for all amino acid pairs for a specific distance range. See examples for more details. } \source{ Dehouck Y. & Mikhailov A.S. (2013) \emph{PLoS Comput Biol} \bold{9}:e1003209. } \references{ Skjaerven, L. et al. (2014) \emph{BMC Bioinformatics} \bold{15}, 399. Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. Dehouck Y. et al. (2013) \emph{PLoS Comput Biol} \bold{9}:e1003209. } \examples{ ## Load force constant data data(sdENM) ## force constants for amino acids A, C, D, E, and F ## in distance range [4, 4.5) sdENM[1:5, 1:5, 1] ## and distance range [4.5, 5) sdENM[1:5, 1:5, 2] ## amino acid pair A-P, at distance 4.2 sdENM["A", "P", 1] \dontrun{ ## for use in NMA pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) modes <- nma(pdb, ff="sdenm") } } \keyword{datasets} bio3d/man/project.pca.Rd0000644000176200001440000000327014046073105014526 0ustar liggesusers\name{project.pca} \alias{project.pca} \alias{z2xyz.pca} \alias{xyz2z.pca} \title{ Project Data onto Principal Components } \description{ Projects data onto principal components. } \usage{ project.pca(data, pca, angular = FALSE, fit = FALSE, ...) z2xyz.pca(z.coord, pca) xyz2z.pca(xyz.coord, pca) } \arguments{ \item{data}{ a numeric vector or row-wise matrix of data to be projected. } \item{pca}{ an object of class \code{"pca"} as obtained from functions \code{pca.xyz} or \code{pca.tor}. } \item{angular}{ logical, if TRUE the data to be projected is treated as torsion angle data. } \item{fit}{ logical, if TRUE the data is first fitted to \code{pca$mean}. } \item{\dots}{ other parameters for \code{\link{fit.xyz}}. } \item{xyz.coord}{ a numeric vector or row-wise matrix of data to be projected. } \item{z.coord}{ a numeric vector or row-wise matrix of PC scores (i.e. the z-scores which are centered and rotated versions of the origional data projected onto the PCs) for conversion to xyz coordinates. } } \value{ A numeric vector or matrix of projected PC scores. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Karim ElSawy and Barry Grant} \seealso{ \code{\link{pca.xyz}}, \code{\link{pca.tor}}, \code{\link{fit.xyz}} } \examples{ \dontrun{ attach(transducin) gaps.pos <- gap.inspect(pdbs$xyz) #-- Do PCA without structures 2 and 7 pc.xray <- pca.xyz(pdbs$xyz[-c(2,7), gaps.pos$f.inds]) #-- Project structures 2 and 7 onto the PC space d <- project.pca(pdbs$xyz[c(2,7), gaps.pos$f.inds], pc.xray) plot(pc.xray$z[,1], pc.xray$z[,2],col="gray") points(d[,1],d[,2], col="red") detach(transducin) } } \keyword{ utilities } bio3d/man/read.mol2.Rd0000644000176200001440000001066314046073105014105 0ustar liggesusers\name{read.mol2} \alias{read.mol2} \alias{print.mol2} \title{ Read MOL2 File } \description{ Read a Tripos MOL2 file } \usage{ read.mol2(file, maxlines = -1L) \method{print}{mol2}(x, \dots) } \arguments{ \item{file}{ a single element character vector containing the name of the MOL2 file to be read. } \item{maxlines}{ the maximum number of lines to read before giving up with large files. Default is all lines. } \item{x}{ an object as obtained from \code{read.mol2}. } \item{...}{ additional arguments to \sQuote{print}. } } \details{ Basic functionality to parse a MOL2 file. The current version reads and stores \sQuote{@MOLECULE}, \sQuote{@ATOM}, \sQuote{@BOND} and \sQuote{@SUBSTRUCTURE} records. In the case of a multi-molecule MOL2 file, each molecule will be stored as an individual \sQuote{mol2} object in a list. Conversely, if the multi-molecule MOL2 file contains identical molecules in different conformations (typically from a docking run), then the output will be one object with an \code{atom} and \code{xyz} component (xyz in matrix representation; row-wise coordinates). See examples for further details. } \value{ Returns a list of molecules containing the following components: \item{atom}{ a data frame containing all atomic coordinate ATOM data, with a row per ATOM and a column per record type. See below for details of the record type naming convention (useful for accessing columns). } \item{bond}{ a data frame containing all atomic bond information. } \item{substructure}{ a data frame containing all substructure information. } \item{xyz}{ a numeric matrix of ATOM coordinate data. } \item{info}{ a numeric vector of MOL2 info data. } \item{name}{ a single element character vector containing the molecule name. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \note{ For \code{atom} list components the column names can be used as a convenient means of data access, namely: Atom serial number \dQuote{eleno}, Atom name \dQuote{elena}, Orthogonal coordinates \dQuote{x}, Orthogonal coordinates \dQuote{y}, Orthogonal coordinates \dQuote{z}, Reisude number \dQuote{resno}, Atom type \dQuote{elety}, Residue name \dQuote{resid}, Atom charge \dQuote{charge}, Status bit \dQuote{statbit}, For \code{bond} list components the column names are: Bond identifier \dQuote{id}, number of the atom at one end of the bond\dQuote{origin}, number of the atom at the other end of the bond \dQuote{target}, the SYBYL bond type \dQuote{type}. For \code{substructure} list components the column names are: substructure identifier \dQuote{id}, substructure name \dQuote{name}, the ID number of the substructure's root atom \dQuote{root_atom}, the substructure type \dQuote{subst_type}, the type of dictionary associated with the substructure \dQuote{dict_type}, the chain to which the substructre belongs \dQuote{chain}, the subtype of the chain \dQuote{sub_type}, the number of inter bonds \dQuote{inter_bonds}, status bit \dQuote{status}. See examples for further details. } \seealso{ \code{\link{write.mol2}}, \code{\link{atom.select.mol2}}, \code{\link{trim.mol2}}, \code{\link{as.pdb.mol2}} \code{\link{read.pdb}} } \examples{ cat("\n") \dontrun{ ## Read a single entry MOL2 file ## (returns a single object) mol <- read.mol2( system.file("examples/aspirin.mol2", package="bio3d") ) ## Short summary of the molecule print(mol) ## ATOM records mol$atom ## BOND records mol$bond ## Print some coordinate data head(mol$atom[, c("x","y","z")]) ## Or coordinates as a numeric vector #head(mol$xyz) ## Print atom charges head(mol$atom[, "charge"]) ## Convert to PDB pdb <- as.pdb(mol) ## Read a multi-molecule MOL2 file ## (returns a list of objects) #multi.mol <- read.mol2("zinc.mol2") ## Number of molecules described in file #length(multi.mol) ## Access ATOM records for the first molecule #multi.mol[[1]]$atom ## Or coordinates for the second molecule #multi.mol[[2]]$xyz ## Process output from docking (e.g. DOCK) ## (typically one molecule with many conformations) ## (returns one object, but xyz in matrix format) #dock <- read.mol2("dock.mol2") ## Reference PDB file (e.g. X-ray structure) #pdb <- read.pdb("dock_ref.pdb") ## Calculate RMSD of docking modes #sele <- atom.select(dock, "noh") #rmsd(pdb$xyz, dock$xyz, b.inds=sele$xyz) } } \keyword{ IO } bio3d/man/plot.fasta.Rd0000644000176200001440000000337314046073105014375 0ustar liggesusers\name{plot.fasta} \alias{plot.fasta} \title{ Plot a Multiple Sequence Alignment } \description{ Produces a schematic representation of a multiple sequence alignment. } \usage{ \method{plot}{fasta}(x, hc = TRUE, labels = x$id, cex.lab = 0.7, xlab = "Alignment index", main = "Sequence Alignment Overview", mar4 = 4, ...) } \arguments{ \item{x}{ multiple sequence alignement of class \sQuote{fasta} as obtained from \code{\link{seqaln}}. } \item{hc}{ logical, if TRUE plot a dendrogram on the left side. Alternatively, an object obtained from \code{\link{hclust}} can be provided. } \item{labels}{ labels corresponding to each row in the alignment. } \item{cex.lab}{ scaling factor for the labels. } \item{xlab}{ label for x-axis. } \item{main}{ a main title for the plot. } \item{mar4}{ margin size for the labels. } \item{\dots}{ additional arguments passed to function \code{\link{hclust}}. } } \details{ \code{plot.fasta} is a utility function for producting a schematic representation of a multiple sequence alignment. } \value{ Called for its effect. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{seqaln}}, \code{\link{read.fasta}}, \code{\link{entropy}}, \code{\link{aln2html}}. } \examples{ # Read alignment aln <- read.fasta(system.file("examples/kif1a.fa",package="bio3d")) ## alignment plot plot(aln, labels=basename.pdb(aln$id)) ## Works also for a 'pdbs' object attach(transducin) plot(pdbs) detach(transducin) \dontrun{ infile <- "http://pfam.xfam.org/family/PF00071/alignment/seed/format?format=fasta" aln <- read.fasta( infile ) plot(aln) } } \keyword{ hplot } bio3d/man/is.xyz.Rd0000644000176200001440000000131614046073105013561 0ustar liggesusers\name{is.xyz} \alias{is.xyz} \alias{as.xyz} \title{ Is an Object of Class \sQuote{xyz}? } \description{ Checks whether its argument is an object of class \sQuote{xyz}. } \usage{ is.xyz(x) as.xyz(x) } \arguments{ \item{x}{ an R object to be tested } } \details{ Tests if x is an object of class \sQuote{xyz}, i.e. if x has a \dQuote{class} attribute equal to \code{xyz}. } \value{ TRUE if x is an object of class \sQuote{xyz} and FALSE otherwise } \seealso{ \code{\link{read.pdb}}, \code{\link{read.ncdf}}, \code{\link{read.dcd}}, \code{\link{fit.xyz}} } \examples{ # Read a PDB file pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) is.xyz(pdb$xyz) } \keyword{ classes } bio3d/man/plot.nma.Rd0000644000176200001440000000300314046073105014040 0ustar liggesusers\name{plot.nma} \alias{plot.nma} \title{ Plot NMA Results } \description{ Produces eigenvalue/frequency spectrum plots and an atomic fluctuations plot. } \usage{ \method{plot}{nma}(x, pch = 16, col = par("col"), cex=0.8, mar=c(6, 4, 2, 2),...) } \arguments{ \item{x}{ the results of normal modes analysis obtained with \code{\link{nma}}. } \item{pch}{ a vector of plotting characters or symbols: see \code{\link{points}}. } \item{col}{ a character vector of plotting colors. } \item{cex}{ a numerical single element vector giving the amount by which plotting text and symbols should be magnified relative to the default. } \item{mar}{ A numerical vector of the form c(bottom, left, top, right) which gives the number of lines of margin to be specified on the four sides of the plot.} \item{\dots}{ extra plotting arguments passed to \code{\link{plot.bio3d}} that effect the atomic fluctuations plot only. } } \details{ \code{plot.nma} produces an eigenvalue (or frequency) spectrum plot together with a plot of the atomic fluctuations. } \value{ Called for its effect. } \references{ Skjaerven, L. et al. (2014) \emph{BMC Bioinformatics} \bold{15}, 399. Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{nma}}, \code{\link{plot.bio3d}} } \examples{ ## Fetch structure pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) ## Calculate modes modes <- nma(pdb) plot(modes, sse=pdb) } \keyword{ hplot } bio3d/man/pca.pdbs.Rd0000644000176200001440000000323214046073105014006 0ustar liggesusers\name{pca.pdbs} \alias{pca.pdbs} \title{ Principal Component Analysis } \description{ Performs principal components analysis (PCA) on an ensemble of PDB structures. } \usage{ \method{pca}{pdbs}(pdbs, core.find = FALSE, fit = FALSE, \dots) } \arguments{ \item{pdbs}{ an object of class \code{pdbs} as obtained from function \code{pdbaln} or \code{read.fasta.pdb}. } \item{core.find}{ logical, if TRUE core.find() function will be called to find core positions and coordinates of PDB structures will be fitted based on cores. } \item{fit}{ logical, if TRUE coordinates of PDB structures will be fitted based on all CA atoms. } \item{\dots}{ additional arguments passed to the method \code{pca.xyz}. } } \details{ The function \code{pca.pdbs} is a wrapper for the function \code{\link{pca.xyz}}, wherein more details of the PCA procedure are documented. } \value{ Returns a list with the following components: \item{L }{eigenvalues.} \item{U }{eigenvectors (i.e. the variable loadings).} \item{z.u }{scores of the supplied \code{data} on the pcs.} \item{sdev }{the standard deviations of the pcs.} \item{mean }{the means that were subtracted.} } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant, Lars Skjaerven and Xin-Qiu Yao} \seealso{ \code{\link{pca}}, \code{\link{pca.xyz}}, \code{\link{pdbaln}}, \code{\link{nma}}. } \examples{ attach(transducin) #-- Do PCA ignoring gap containing positions pc.xray <- pca(pdbs) # Plot results (conformer plots & scree plot) plot(pc.xray, col=annotation[, "color"]) detach(transducin) } \keyword{ utilities } \keyword{ multivariate } bio3d/man/dccm.enma.Rd0000644000176200001440000000432714046073105014147 0ustar liggesusers\name{dccm.enma} \alias{dccm.enma} \title{ Cross-Correlation for Ensemble NMA (eNMA) } \description{ Calculate the cross-correlation matrices from an ensemble of NMA objects. } \usage{ \method{dccm}{enma}(x, ncore = NULL, na.rm=FALSE, \dots) } \arguments{ \item{x}{ an object of class \code{enma} as obtained from function \code{nma.pdbs}. } \item{ncore }{ number of CPU cores used to do the calculation. \code{ncore>1} requires package \sQuote{parallel} installed. } \item{na.rm }{ logical, if FALSE the DCCM might containt NA values (applies only when the \code{enma} object is calculated with argument \sQuote{rm.gaps=FALSE}). } \item{\dots}{ additional arguments passed to \code{dccm.nma}. } } \details{ This is a wrapper function for calling \code{dccm.nma} on a collection of \sQuote{nma} objects as obtained from function \code{nma.pdbs}. See examples for more details. } \value{ Returns a list with the following components: \item{all.dccm }{ an array or list containing the correlation matrices for each \sQuote{nma} object. An array is returned when the \sQuote{enma} object is calculated with \sQuote{rm.gaps=TRUE}, and a list is used when \sQuote{rm.gaps=FALSE}. } \item{avg.dccm }{ a numeric matrix containing the average correlation matrix. The average is only calculated when the \sQuote{enma} object is calculated with \sQuote{rm.gaps=TRUE}. } } \references{ Wynsberghe. A.W.V, Cui, Q. \emph{Structure} \bold{14}, 1647--1653. Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{nma}}, \code{\link{dccm.nma}}, \code{\link{plot.dccm}} } \examples{ \donttest{ ## Needs MUSCLE installed - testing excluded if(check.utility("muscle")) { ## Fetch PDB files and split to chain A only PDB files ids <- c("1a70_A", "1czp_A", "1frd_A", "1fxi_A", "1iue_A", "1pfd_A") files <- get.pdb(ids, split = TRUE, path = tempdir()) ## Sequence/Structure Alignement pdbs <- pdbaln(files, outfile = tempfile()) ## Normal mode analysis on aligned data modes <- nma(pdbs) ## Calculate all 6 correlation matrices cij <- dccm(modes) ## Plot correlations for first structure plot.dccm(cij$all.dccm[,,1]) } } } \keyword{ analysis } bio3d/man/dccm.pca.Rd0000644000176200001440000000462614046073105013774 0ustar liggesusers\name{dccm.pca} \alias{dccm.pca} \title{ Dynamical Cross-Correlation Matrix from Principal Component Analysis } \description{ Calculate the cross-correlation matrix from principal component analysis (PCA). } \usage{ \method{dccm}{pca}(x, pc = NULL, method = c("pearson", "lmi"), ncore = NULL, \dots) } \arguments{ \item{x}{ an object of class \code{pca} as obtained from function \code{pca.xyz}. } \item{pc}{ numerical, indices of PCs to be included in the calculation. If all negative, PCs complementary to \code{abs(pc)} are included. } \item{method}{ method to calculate the cross-correlation. Currently supports Pearson and linear mutual information (LMI). } \item{ncore}{ number of CPU cores used to do the calculation. By default (\code{ncore = NULL}), use all available cores detected. } \item{\dots}{ Additional arguments to be passed (currently ignored). } } \details{ This function calculates the cross-correlation matrix from principal component analysis (PCA) obtained from \code{pca.xyz} of a set of protein structures. It is an alternative way to calculate correlation in addition to the conventional way from xyz coordinates directly. But, in this new way one can freely chooses the PCs to be included in the calculation (e.g. for filtering out PCs with small eigenvalues). } \value{ Returns a cross-correlation matrix with values in a range from -1 to 1 (Pearson) or from 0 to 1 (LMI). } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Xin-Qiu Yao} \seealso{ \code{\link{pca.xyz}}, \code{\link{plot.dccm}}, \code{\link{dccm}}, \code{\link{dccm.xyz}}, \code{\link{dccm.nma}}, \code{\link{dccm.enma}}. } \examples{ \donttest{ ##-- Read example trajectory file trtfile <- system.file("examples/hivp.dcd", package="bio3d") trj <- read.dcd(trtfile) ## Read the starting PDB file to determine atom correspondence pdbfile <- system.file("examples/hivp.pdb", package="bio3d") pdb <- read.pdb(pdbfile) ## Select residues 24 to 27 and 85 to 90 in both chains inds <- atom.select(pdb, resno=c(24:27,85:90), elety='CA') ## lsq fit of trj on pdb xyz <- fit.xyz(pdb$xyz, trj, fixed.inds=inds$xyz, mobile.inds=inds$xyz) ## Do PCA pca <- pca.xyz(xyz) ## DCCM: only use first 10 PCs cij <- dccm(pca, pc = c(1:10)) ## Plot DCCM plot(cij) ## DCCM: remove first 10 PCs cij <- dccm(pca, pc = -c(1:10)) ## Plot DCCM plot(cij) } } \keyword{ analysis } bio3d/man/core.find.Rd0000644000176200001440000001600714046073105014167 0ustar liggesusers\name{core.find} \alias{core.find} \alias{core.find.default} \alias{core.find.pdbs} \alias{core.find.pdb} \title{ Identification of Invariant Core Positions } \description{ Perform iterated rounds of structural superposition to identify the most invariant region in an aligned set of protein structures. } \usage{ core.find(\dots) \method{core.find}{pdbs}(pdbs, shortcut = FALSE, rm.island = FALSE, verbose = TRUE, stop.at = 15, stop.vol = 0.5, write.pdbs = FALSE, outpath="core_pruned", ncore = 1, nseg.scale = 1, progress = NULL, \dots) \method{core.find}{default}(xyz, \dots) \method{core.find}{pdb}(pdb, verbose=TRUE, \dots) } \arguments{ \item{pdbs}{ a numeric matrix of aligned C-alpha xyz Cartesian coordinates. For example an alignment data structure obtained with \code{\link{read.fasta.pdb}} or \code{\link{pdbaln}}. } \item{shortcut}{ if TRUE, remove more than one position at a time. } \item{rm.island}{ remove isolated fragments of less than three residues. } \item{verbose}{ logical, if TRUE a \dQuote{core\_pruned} directory containing \sQuote{core structures} for each iteraction is written to the current directory. } \item{stop.at}{ minimal core size at which iterations should be stopped. } \item{stop.vol}{ minimal core volume at which iterations should be stopped. } \item{write.pdbs}{ logical, if TRUE core coordinate files, containing only core positions for each iteration, are written to a location specified by \code{outpath}. } \item{outpath}{ character string specifying the output directory when \code{write.pdbs} is TRUE. } \item{ncore }{ number of CPU cores used to do the calculation. \code{ncore>1} requires package \sQuote{parallel} installed. } \item{nseg.scale }{ split input data into specified number of segments prior to running multiple core calculation. See \code{\link{fit.xyz}}.} \item{progress}{ progress bar for use with shiny web app. } \item{xyz}{ a numeric matrix of xyz Cartesian coordinates, e.g. obtained from \code{\link{read.dcd}} or \code{\link{read.ncdf}}. } \item{pdb}{ an object of type \code{pdb} as obtained from function \code{\link{read.pdb}} with multiple frames (>=4) stored in its \code{xyz} component. Note that the function will attempt to identify C-alpha and phosphate atoms (for protein and nucleic acids, respectively) in which the calculation should be based. } \item{\dots}{ arguments passed to and from functions. } } \details{ This function attempts to iteratively refine an initial structural superposition determined from a multiple alignment. This involves iterated rounds of superposition, where at each round the position(s) displaying the largest differences is(are) excluded from the dataset. The spatial variation at each aligned position is determined from the eigenvalues of their Cartesian coordinates (i.e. the variance of the distribution along its three principal directions). Inspired by the work of Gerstein \emph{et al.} (1991, 1995), an ellipsoid of variance is determined from the eigenvalues, and its volume is taken as a measure of structural variation at a given position. Optional \dQuote{core PDB files} containing core positions, upon which superposition is based, can be written to a location specified by \code{outpath} by setting \code{write.pdbs=TRUE}. These files are useful for examining the core filtering process by visualising them in a graphics program. } \value{ Returns a list of class \code{"core"} with the following components: \item{volume }{total core volume at each fitting iteration/round.} \item{length }{core length at each round.} \item{resno }{residue number of core residues at each round (taken from the first aligned structure) or, alternatively, the numeric index of core residues at each round.} \item{step.inds}{atom indices of core atoms at each round.} \item{atom }{atom indices of core positions in the last round.} \item{xyz }{xyz indices of core positions in the last round.} \item{c1A.atom }{atom indices of core positions with a total volume under 1 Angstrom\^3.} \item{c1A.xyz }{xyz indices of core positions with a total volume under 1 Angstrom\^3.} \item{c1A.resno }{residue numbers of core positions with a total volume under 1 Angstrom\^3.} \item{c0.5A.atom }{atom indices of core positions with a total volume under 0.5 Angstrom\^3.} \item{c0.5A.xyz }{xyz indices of core positions with a total volume under 0.5 Angstrom\^3.} \item{c0.5A.resno }{residue numbers of core positions with a total volume under 0.5 Angstrom\^3.} } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. Gerstein and Altman (1995) \emph{J. Mol. Biol.} \bold{251}, 161--175. Gerstein and Chothia (1991) \emph{J. Mol. Biol.} \bold{220}, 133--149. } \note{ The relevance of the \sQuote{core positions} identified by this procedure is dependent upon the number of input structures and their diversity. } \author{ Barry Grant } \seealso{ \code{\link{read.fasta.pdb}}, \code{\link{plot.core}}, \code{\link{fit.xyz}} } \examples{ \dontrun{ ##-- Generate a small kinesin alignment and read corresponding structures pdbfiles <- get.pdb(c("1bg2","2ncd","1i6i","1i5s"), URLonly=TRUE) pdbs <- pdbaln(pdbfiles) ##-- Find 'core' positions core <- core.find(pdbs) plot(core) ##-- Fit on these relatively invarient subset of positions #core.inds <- print(core, vol=1) core.inds <- print(core, vol=0.5) xyz <- pdbfit(pdbs, core.inds, outpath="corefit_structures") ##-- Compare to fitting on all equivalent positions xyz2 <- pdbfit(pdbs) ## Note that overall RMSD will be higher but RMSF will ## be lower in core regions, which may equate to a ## 'better fit' for certain applications gaps <- gap.inspect(pdbs$xyz) rmsd(xyz[,gaps$f.inds]) rmsd(xyz2[,gaps$f.inds]) plot(rmsf(xyz[,gaps$f.inds]), typ="l", col="blue", ylim=c(0,9)) points(rmsf(xyz2[,gaps$f.inds]), typ="l", col="red") } \dontrun{ ##-- Run core.find() on a multimodel PDB file pdb <- read.pdb('1d1d', multi=TRUE) core <- core.find(pdb) ##-- Run core.find() on a trajectory trtfile <- system.file("examples/hivp.dcd", package="bio3d") trj <- read.dcd(trtfile) ## Read the starting PDB file to determine atom correspondence pdbfile <- system.file("examples/hivp.pdb", package="bio3d") pdb <- read.pdb(pdbfile) ## select calpha coords from a manageable number of frames ca.ind <- atom.select(pdb, "calpha")$xyz frames <- seq(1, nrow(trj), by=10) core <- core.find( trj[frames, ca.ind], write.pdbs=TRUE ) ## have a look at the various cores "vmd -m core_pruned/*.pdb" ## Lets use a 6A^3 core cutoff inds <- print(core, vol=6) write.pdb(xyz=pdb$xyz[inds$xyz],resno=pdb$atom[inds$atom,"resno"], file="core.pdb") ##- Fit trj onto starting structure based on core indices xyz <- fit.xyz( fixed = pdb$xyz, mobile = trj, fixed.inds = inds$xyz, mobile.inds = inds$xyz) ##write.pdb(pdb=pdb, xyz=xyz, file="new_trj.pdb") ##write.ncdf(xyz, "new_trj.nc") } } \keyword{ utilities } bio3d/man/read.pdcBD.Rd0000644000176200001440000000702714046073105014210 0ustar liggesusers\name{read.pdcBD} \alias{read.pdcBD} \title{ Read PQR output from pdcBD File } \description{ Read a pdcBD PQR coordinate file. } \usage{ read.pdcBD(file, maxlines = 50000, multi = FALSE, rm.insert = FALSE, rm.alt = TRUE, verbose = TRUE) } \arguments{ \item{file}{ the name of the pdcBD PQR file to be read. } \item{maxlines}{ the maximum number of lines to read before giving up with large files. Default is 50,000 lines. } \item{multi}{ logical, if TRUE multiple ATOM records are read for all models in multi-model files. } \item{rm.insert}{ logical, if TRUE PDB insert records are ignored. } \item{rm.alt}{ logical, if TRUE PDB alternate records are ignored. } \item{verbose}{ print details of the reading process. } } \details{ \code{maxlines} may require increasing for some large multi-model files. The preferred means of reading such data is via binary DCD format trajectory files (see the \code{\link{read.dcd}} function). } \value{ Returns a list of class \code{"pdb"} with the following components: \item{atom}{ a character matrix containing all atomic coordinate ATOM data, with a row per ATOM and a column per record type. See below for details of the record type naming convention (useful for accessing columns). } \item{het }{ a character matrix containing atomic coordinate records for atoms within \dQuote{non-standard} HET groups (see \code{atom}). } \item{helix }{ \sQuote{start}, \sQuote{end} and \sQuote{length} of H type sse, where start and end are residue numbers \dQuote{resno}. } \item{sheet }{ \sQuote{start}, \sQuote{end} and \sQuote{length} of E type sse, where start and end are residue numbers \dQuote{resno}. } \item{seqres }{ sequence from SEQRES field. } \item{xyz }{ a numeric vector of ATOM coordinate data. } \item{calpha }{ logical vector with length equal to \code{nrow(atom)} with TRUE values indicating a C-alpha \dQuote{elety}. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. For a description of PDB format (version3.3) see:\cr \url{http://www.wwpdb.org/documentation/format33/v3.3.html}. } \author{ Barry Grant } \note{ For both \code{atom} and \code{het} list components the column names can be used as a convenient means of data access, namely: Atom serial number \dQuote{eleno} , Atom type \dQuote{elety}, Alternate location indicator \dQuote{alt}, Residue name \dQuote{resid}, Chain identifier \dQuote{chain}, Residue sequence number \dQuote{resno}, Code for insertion of residues \dQuote{insert}, Orthogonal coordinates \dQuote{x}, Orthogonal coordinates \dQuote{y}, Orthogonal coordinates \dQuote{z}, Occupancy \dQuote{o}, and Temperature factor \dQuote{b}. See examples for further details. } \seealso{ \code{\link{atom.select}}, \code{\link{write.pdb}}, \code{\link{read.dcd}}, \code{\link{read.fasta.pdb}}, \code{\link{read.fasta}} } \examples{ \donttest{ # PDB server connection required - testing excluded # Read a PDB file pdb <- read.pdb( "1bg2" ) # Print data for the first atom pdb$atom[1,] # Look at the first het atom pdb$het[1,] # Print some coordinate data pdb$atom[1:20, c("x","y","z")] # Print C-alpha coordinates (can also use 'atom.select') ##pdb$xyz[pdb$calpha, c("resid","x","y","z")] # Print SSE data (for helix and sheet) pdb$helix pdb$sheet$start # Print SEQRES data pdb$seqres # Renumber residues nums <- as.numeric(pdb$atom[,"resno"]) pdb$atom[,"resno"] <- nums - (nums[1] - 1) # Write out renumbered PDB file #write.pdb(pdb=pdb,file="eg.pdb") } } \keyword{ IO } bio3d/man/bwr.colors.Rd0000644000176200001440000000321714046073105014411 0ustar liggesusers\name{bwr.colors} \alias{bwr.colors} \alias{mono.colors} \title{ Color Palettes } \description{ Create a vector of \sQuote{n} \dQuote{contiguous} colors forming either a Blue-White-Red or a White-Gray-Black color palette. } \usage{ bwr.colors(n) mono.colors(n) } \arguments{ \item{n}{ the number of colors in the palette (>=1). } } \details{ The function \code{bwr.colors} returns a vector of \code{n} color names that range from blue through white to red. The function \code{mono.colors} returns color names ranging from white to black. Note: the first element of the returned vector will be NA. } \value{ Returns a character vector, \code{cv}, of color names. This can be used either to create a user-defined color palette for subsequent graphics with \code{palette(cv)}, or as a \code{col=} specification in graphics functions and \code{par}. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. The \code{bwr.colors} function is derived from the \code{gplots} package function \code{colorpanel} by Gregory R. Warnes. } \author{ Barry Grant } \seealso{ \code{\link{vmd_colors}}, \code{\link{cm.colors}}, \code{\link{colors}}, \code{\link{palette}}, \code{\link{hsv}}, \code{\link{rgb}}, \code{\link{gray}}, \code{\link{col2rgb}} } \examples{ \donttest{ # Redundant testing excluded # Color a distance matrix pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) d <- dm(pdb,"calpha") plot(d, color.palette=bwr.colors) plot(d, resnum.1 = pdb$atom[pdb$calpha,"resno"], color.palette = mono.colors, xlab="Residue Number", ylab="Residue Number") } } \keyword{ utilities } bio3d/man/seqidentity.Rd0000644000176200001440000000354014046073105014660 0ustar liggesusers\name{seqidentity} \alias{seqidentity} \title{ Percent Identity} \description{ Determine the percent identity scores for aligned sequences. } \usage{ seqidentity(alignment, normalize=TRUE, similarity=FALSE, ncore=1, nseg.scale=1) } \arguments{ \item{alignment}{ sequence alignment obtained from \code{\link{read.fasta}} or an alignment character matrix. } \item{normalize}{ logical, if TRUE output is normalized to values between 0 and 1 otherwise percent identity is returned. } \item{similarity}{ logical, if TRUE sequence similarity is calculated instead of identity. } \item{ncore}{ number of CPU cores used to do the calculation. \code{ncore>1} requires package \sQuote{parallel} installed. } \item{nseg.scale}{ split input data into specified number of segments prior to running multiple core calculation. See \code{\link{fit.xyz}}. } } \details{ The percent identity value is a single numeric score determined for each pair of aligned sequences. It measures the number of identical residues (\dQuote{matches}) in relation to the length of the alignment. } \value{ Returns a numeric matrix with all pairwise identity values. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \seealso{ \code{\link{read.fasta}}, \code{\link{filter.identity}}, \code{\link{entropy}}, \code{\link{consensus}} } \examples{ attach(kinesin) ide.mat <- seqidentity(pdbs) # Plot identity matrix plot.dmat(ide.mat, color.palette=mono.colors, main="Sequence Identity", xlab="Structure No.", ylab="Structure No.") # Histogram of pairwise identity values hist(ide.mat[upper.tri(ide.mat)], breaks=30,xlim=c(0,1), main="Sequence Identity", xlab="Identity") # Compare two sequences seqidentity( rbind(pdbs$ali[1,], pdbs$ali[15,]) ) detach(kinesin) } \keyword{ utilities } bio3d/man/is.pdb.Rd0000644000176200001440000000142114046073105013471 0ustar liggesusers\name{is.pdb} \alias{is.pdb} \alias{is.pdbs} \title{ Is an Object of Class \sQuote{pdb(s)}? } \description{ Checks whether its argument is an object of class \sQuote{pdb} or \sQuote{pdbs}. } \usage{ is.pdb(x) is.pdbs(x) } \arguments{ \item{x}{ an R object. } } \details{ Tests if the object \sQuote{x} is of class \sQuote{pdb} (\code{is.pdb}) or \sQuote{pdbs} (\code{is.pdbs}), i.e. if \sQuote{x} has a \dQuote{class} attribute equal to \code{pdb} or \code{pdbs}. } \value{ TRUE if x is an object of class \sQuote{pdb(s)} and FALSE otherwise } \seealso{ \code{\link{read.pdb}}, \code{\link{read.fasta.pdb}}, \code{\link{pdbaln}} } \examples{ # Read a PDB file pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) is.pdb(pdb) } \keyword{ classes } bio3d/man/read.crd.charmm.Rd0000644000176200001440000000431314046073105015245 0ustar liggesusers\name{read.crd.charmm} \alias{read.crd.charmm} \title{ Read CRD File } \description{ Read a CHARMM CARD (CRD) coordinate file. } \usage{ \method{read.crd}{charmm}(file, ext = TRUE, verbose = TRUE, ...) } \arguments{ \item{file}{ the name of the CRD file to be read. } \item{ext}{logical, if TRUE assume expanded CRD format. } \item{verbose}{ print details of the reading process. } \item{\dots}{ arguments going nowhere. } } \details{ See the function \code{\link{read.pdb}} for more details. } \value{ Returns a list with the following components: \item{atom}{ a character matrix containing all atomic coordinate data, with a row per atom and a column per record type. See below for details of the record type naming convention (useful for accessing columns). } \item{xyz }{ a numeric vector of coordinate data. } \item{calpha }{ logical vector with length equal to \code{nrow(atom)} with TRUE values indicating a C-alpha \dQuote{elety}. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. For a description of CHARMM CARD (CRD) format see:\cr \url{http://www.charmmtutorial.org/index.php/CHARMM:The_Basics}. } \author{ Barry Grant } \note{ Similar to the output of \code{\link{read.pdb}}, the column names of \code{atom} can be used as a convenient means of data access, namely: Atom serial number \dQuote{eleno}, Atom type \dQuote{elety}, Alternate location indicator \dQuote{alt}, Residue name \dQuote{resid}, Residue sequence number \dQuote{resno}, Code for insertion of residues \dQuote{insert}, Orthogonal coordinates \dQuote{x}, Orthogonal coordinates \dQuote{y}, Orthogonal coordinates \dQuote{z}, Weighting factor \dQuote{b}. See examples for further details. } \seealso{ \code{\link{write.crd}}, \code{\link{read.pdb}}, \code{\link{atom.select}}, \code{\link{write.pdb}}, \code{\link{read.dcd}}, \code{\link{read.fasta.pdb}}, \code{\link{read.fasta}} } \examples{ \dontrun{ pdb <- read.pdb("1bg2") crdfile <- paste(tempfile(), '.crd', sep='') write.crd(pdb, file=crdfile) crd <- read.crd(crdfile, ext=FALSE) ca.inds <- which(crd$calpha) crd$atom[ca.inds[1:20],c("x","y","z")] # write.pdb(crd, file=tempfile()) } } \keyword{ IO } bio3d/man/biounit.Rd0000644000176200001440000000406114046073105013766 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/biounit.R \name{biounit} \alias{biounit} \title{Biological Units Construction} \usage{ biounit(pdb, biomat = NULL, multi = FALSE, ncore = NULL) } \arguments{ \item{pdb}{an object of class \code{pdb} as obtained from function \code{\link{read.pdb}}.} \item{biomat}{a list object as returned by \code{read.pdb} (pdb$remark$biomat), containing matrices for symmetry operation on individual chains to build biological units. It will override the matrices stored in \code{pdb}.} \item{multi}{logical, if TRUE the biological unit is returned as a 'multi-model' \code{pdb} object with each symmetric copy a distinct structural 'MODEL'. Otherwise, all copies are represented as separated chains.} \item{ncore}{number of CPU cores used to do the calculation. By default (\code{ncore=NULL}), use all available CPU cores.} } \value{ a list of \code{pdb} objects with each representing an individual biological unit. } \description{ Construct biological assemblies/units based on a 'pdb' object. } \details{ A valid structural/simulation study should be performed on the biological unit of a protein system. For example, the alpha2-beta2 tetramer form of hemoglobin. However, canonical PDB files usually contain the asymmetric unit of the crystal cell, which can be: \enumerate{ \item One biological unit \item A portion of a biological unit \item Multiple biological units } The function performs symmetry operations to the coordinates based on the transformation matrices stored in a 'pdb' object returned by \code{\link{read.pdb}}, and returns biological units stored as a list of \code{pdb} objects. } \examples{ \donttest{ # PDB server connection required - testing excluded pdb <- read.pdb("2dn1") biounit <- biounit(pdb) pdb biounit } \dontrun{ biounit <- biounit(read.pdb("2bfu"), multi=TRUE) write.pdb(biounit[[1]], file="biounit.pdb") # open the pdb file in VMD to have a look on the biological unit } } \author{ Xin-Qiu Yao } \seealso{ \code{\link{read.pdb}} } bio3d/man/identify.cna.Rd0000644000176200001440000000514114046073105014670 0ustar liggesusers\name{identify.cna} \alias{identify.cna} \title{ Identify Points in a CNA Protein Structure Network Plot } \description{ \sQuote{identify.cna} reads the position of the graphics pointer when the (first) mouse button is pressed. It then searches the coordinates given in \sQuote{x} for the point closest to the pointer. If this point is close enough to the pointer, its index and community members will be returned as part of the value of the call and the community members will be added as labels to the plot. } \usage{ \method{identify}{cna}(x, labels=NULL, cna=NULL, ...) } \arguments{ \item{x}{ A numeric matrix with Nx2 dimensions, where N is equal to the number of objects in a 2D CNA plot such as obtained from the \sQuote{plot.cna} and various \sQuote{layout} functions. } \item{labels}{ An optional character vector giving labels for the points. Will be coerced using \sQuote{as.character}, and recycled if necessary to the length of \sQuote{x}. Excess labels will be discarded, with a warning. } \item{cna}{ A network object as returned from the \sQuote{cna} function. } \item{\dots}{ Extra options passed to \sQuote{identify} function. } } \details{ This function calls the \sQuote{identify} and \sQuote{summary.cna} functions to query and label 2D CNA protein structure network plots produced by the \sQuote{plot.cna} function. Clicking with the mouse on plot points will add the corresponding labels and them to the plot and returned list object. A click with the right mouse button will stop the function. } \value{ If \sQuote{labels} or \sQuote{cna} inputs are provided then a membership vector will be returned with the selected community ids and their members. Otherwise a vector with the ids of the selected communities will be returned. } \author{ Guido Scarabelli and Barry Grant } \seealso{ \code{\link{plot.cna}}, \code{\link{identify}}, \code{\link[igraph:plot.igraph]{plot.igraph}}, \code{\link[igraph:communities]{plot.communities}}, \code{\link[igraph:plot.common]{igraph.plotting}} } \examples{ \dontrun{ if (!requireNamespace("igraph", quietly = TRUE)) { message('Need igraph installed to run this example') } else { attach(hivp) # Read the starting PDB file to determine atom correspondence pdbfile <- system.file("examples/hivp.pdb", package="bio3d") pdb <- read.pdb(pdbfile) # Plot the network xy <- plot.cna(net) # Use identify.cna on the communities d <- identify.cna(xy, cna=net) # Right click to end the function... ## d <- identify(xy, summary(net)$members) detach(hivp) } } } \keyword{ utility } bio3d/man/plot.core.Rd0000644000176200001440000000514214046073105014223 0ustar liggesusers\name{plot.core} \alias{plot.core} \title{ Plot Core Fitting Progress } \description{ Plots the total ellipsoid volume of core positions versus core size at each iteration of the core finding process. } \usage{ \method{plot}{core}(x, y = NULL, type = "h", main = "", sub = "", xlim = NULL, ylim = NULL, xlab = "Core Size (Number of Residues)", ylab = "Total Ellipsoid Volume (Angstrom^3)", axes = TRUE, ann = par("ann"), col = par("col"), ...) } \arguments{ \item{x}{ a list object obtained with the function \code{\link{core.find}} from which the \sQuote{volume} component is taken as the x coordinates for the plot. } \item{y}{ the y coordinates for the plot. } \item{type}{ one-character string giving the type of plot desired. } \item{main}{ a main title for the plot, see also \sQuote{title}. } \item{sub}{ a sub-title for the plot. } \item{xlim}{ the x limits of the plot. } \item{ylim}{ the y limits of the plot. } \item{xlab}{ a label for the x axis. } \item{ylab}{ a label for the y axis. } \item{axes}{ a logical value indicating whether both axes should be drawn. } \item{ann}{ a logical value indicating whether the default annotation (title and x and y axis labels) should appear on the plot. } \item{col}{ The colors for lines and points. Multiple colours can be specified so that each point is given its own color. If there are fewer colors than points they are recycled in the standard fashion. } \item{\dots}{ extra plotting arguments. } } \value{ Called for its effect. } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Barry Grant } \note{ The produced plot can be useful for deciding on the core/non-core boundary. } \seealso{ \code{\link{core.find}}, \code{\link{print.core}}} \examples{ \dontrun{ ##-- Generate a small kinesin alignment and read corresponding structures pdbfiles <- get.pdb(c("1bg2","2ncd","1i6i","1i5s"), URLonly=TRUE) pdbs <- pdbaln(pdbfiles) ##-- Find 'core' positions core <- core.find(pdbs) plot(core) ##-- Fit on these relatively invarient subset of positions core.inds <- print(core) xyz <- pdbfit(pdbs, core.inds, outpath="corefit_structures") ##-- Compare to fitting on all equivalent positions xyz2 <- pdbfit(pdbs) ## Note that overall RMSD will be higher but RMSF will ## be lower in core regions, which may equate to a ## 'better fit' for certain applications gaps <- gap.inspect(pdbs$xyz) rmsd(xyz[,gaps$f.inds]) rmsd(xyz2[,gaps$f.inds]) plot(rmsf(xyz[,gaps$f.inds]), typ="l", col="blue", ylim=c(0,9)) points(rmsf(xyz2[,gaps$f.inds]), typ="l", col="red") } } \keyword{ hplot } bio3d/man/read.crd.amber.Rd0000644000176200001440000000305114046073105015062 0ustar liggesusers\name{read.crd.amber} \alias{read.crd.amber} \title{ Read AMBER Coordinate files } \description{ Read coordinate data from an AMBER coordinate / restart file. } \usage{ \method{read.crd}{amber}(file, ...) } \arguments{ \item{file}{ name of crd file to read. } \item{\dots}{ arguments passed to and from functions. } } \details{ Read a AMBER Coordinate format file. } \value{ A list object of type \sQuote{amber} and \sQuote{crd} with the following components: \item{xyz}{ a numeric matrix of class \sQuote{xyz} containing the Cartesian coordinates. } \item{velocities}{ a numeric vector containg the atom velocities. } \item{time}{ numeric, length of the simulation (applies to Amber restart coordinate files). } \item{natoms}{ total number of atoms in the coordinate file. } \item{box}{ dimensions of the box. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. \url{http://ambermd.org/FileFormats.php} } \author{ Lars Skjaerven } \note{ See AMBER documentation for Coordinate format description. } \seealso{ \code{\link{read.prmtop}}, \code{\link{read.ncdf}}, \code{\link{as.pdb}}, \code{\link{atom.select}}, \code{\link{read.pdb}}, \code{\link{read.crd.charmm}} } \examples{ \dontrun{ ## Read Amber PRMTOP and CRD files prm <- read.prmtop(system.file("examples/crambin.prmtop", package="bio3d")) crd <- read.crd(system.file("examples/crambin.inpcrd", package="bio3d")) ## Convert to PDB format pdb <- as.pdb(prm, crd) ## Atom selection ca.inds <- atom.select(prm, "calpha") } } \keyword{ IO } bio3d/man/cov.nma.Rd0000644000176200001440000000220114046073105013650 0ustar liggesusers\name{cov.nma} \alias{cov.nma} \alias{cov.enma} \title{ Calculate Covariance Matrix from Normal Modes } \description{ Calculate the covariance matrix from a normal mode object. } \usage{ \method{cov}{nma}(nma) \method{cov}{enma}(enma, ncore=NULL) } \arguments{ \item{nma}{ an \code{nma} object as obtained from function \code{nma.pdb}. } \item{enma}{ an \code{enma} object as obtained from function \code{nma.pdbs}. } \item{ncore }{ number of CPU cores used to do the calculation. \code{ncore>1} requires package \sQuote{parallel} installed. } } \details{ This function calculates the covariance matrix from a \code{nma} object as obtained from function \code{nma.pdb} or covariance matrices from a \code{enma} object as obtain from function \code{nma.pdbs}. } \value{ Returns the calculated covariance matrix (function \code{cov.nma}), or covariance matrices (function \code{cov.enma}). } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. Fuglebakk, E. et al. (2013) \emph{JCTC} \bold{9}, 5618--5628. } \author{ Lars Skjaerven } \seealso{ \code{\link{nma}} } \keyword{ utilities } bio3d/man/trim.pdbs.Rd0000644000176200001440000000403414046073105014217 0ustar liggesusers\name{trim.pdbs} \alias{trim.pdbs} \title{ Filter or Trim a PDBs Object } \description{ Trim residues and/or filter out structures from a PDBs object. } \usage{ \method{trim}{pdbs}(pdbs, row.inds=NULL, col.inds=NULL, \dots) } \arguments{ \item{pdbs}{ an object of class \code{pdbs} as obtained from function \code{pdbaln} or \code{read.fasta.pdb}; a xyz matrix containing the cartesian coordinates of C-alpha atoms. } \item{row.inds }{ a numeric vector of indices pointing to the PDB structures to keep (rows in the \code{pdbs$ali} matrix). } \item{col.inds }{ a numeric vector of indices pointing to the alignment columns to keep (columns in the \code{pdbs$ali} matrix). } \item{\dots}{ additional arguments passed to and from functions. } } \details{ Utility function to remove structures, or trim off columns, in a \sQuote{pdbs} object. } \value{ Returns an updated \sQuote{pdbs} object with the following components: \item{xyz}{numeric matrix of aligned C-alpha coordinates.} \item{resno}{character matrix of aligned residue numbers.} \item{b}{numeric matrix of aligned B-factor values.} \item{chain}{character matrix of aligned chain identifiers.} \item{id}{character vector of PDB sequence/structure names.} \item{ali}{character matrix of aligned sequences.} \item{call}{ the matched call. } } \references{ Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. } \author{ Lars Skjaerven } \seealso{ \code{\link{pdbaln}}, \code{\link{gap.inspect}}, \code{\link{read.fasta}},\code{\link{read.fasta.pdb}}, \code{\link{trim.pdb}}, } \examples{ \dontrun{ ## Fetch PDB files and split to chain A only PDB files ids <- c("1a70_A", "1czp_A", "1frd_A", "1fxi_A", "1iue_A", "1pfd_A") raw.files <- get.pdb(ids, path = "raw_pdbs") files <- pdbsplit(raw.files, ids, path = "raw_pdbs/split_chain") ## Sequence Alignement, and connectivity check pdbs <- pdbaln(files) cons <- inspect.connectivity(pdbs) ## omit files with missing residues trim.pdbs(pdbs, row.inds=which(cons)) } } \keyword{ utilities }bio3d/DESCRIPTION0000644000176200001440000000346614046425767013010 0ustar liggesusersPackage: bio3d Title: Biological Structure Analysis Version: 2.4-2 Authors@R: c(person("Barry", "Grant", role=c("aut", "cre"), email="bjgrant@ucsd.edu"), person("Xin-Qiu", "Yao", role="aut"), person("Lars", "Skjaerven", role="aut"), person("Julien", "Ide", role="aut")) Author: Barry Grant [aut, cre], Xin-Qiu Yao [aut], Lars Skjaerven [aut], Julien Ide [aut] VignetteBuilder: knitr LinkingTo: Rcpp Imports: Rcpp, parallel, grid, graphics, grDevices, stats, utils Suggests: XML, RCurl, lattice, ncdf4, igraph, bigmemory, knitr, rmarkdown, testthat (>= 0.9.1), httr, msa, Biostrings Depends: R (>= 3.1.0) LazyData: yes Description: Utilities to process, organize and explore protein structure, sequence and dynamics data. Features include the ability to read and write structure, sequence and dynamic trajectory data, perform sequence and structure database searches, data summaries, atom selection, alignment, superposition, rigid core identification, clustering, torsion analysis, distance matrix analysis, structure and sequence conservation analysis, normal mode analysis, principal component analysis of heterogeneous structure data, and correlation network analysis from normal mode and molecular dynamics data. In addition, various utility functions are provided to enable the statistical and graphical power of the R environment to work with biological sequence and structural data. Please refer to the URLs below for more information. Maintainer: Barry Grant License: GPL (>= 2) URL: http://thegrantlab.org/bio3d/, https://bitbucket.org/Grantlab/bio3d/ RoxygenNote: 7.1.1 NeedsCompilation: yes Packaged: 2021-05-10 03:59:25 UTC; xinqyao Repository: CRAN Date/Publication: 2021-05-11 07:02:15 UTC bio3d/build/0000755000176200001440000000000014046127635012361 5ustar liggesusersbio3d/build/vignette.rds0000644000176200001440000000031214046127635014714 0ustar liggesusersb```b`f@&0rH 'eėe祖妠)+Q)AA7!$7M !`>DXYs1 fwI-HK î?"5lP5,n90{C2K7(1 棸(\^o @hrNb1GRKҊAvbio3d/tests/0000755000176200001440000000000014046015221012407 5ustar liggesusersbio3d/tests/testthat/0000755000176200001440000000000014046425767014273 5ustar liggesusersbio3d/tests/testthat/test-read.all.R0000644000176200001440000001070614046015221017035 0ustar liggesuserscontext("Test reading aligned PDB structures") test_that("read.all() reads all/select PDB atoms properly", { ## Internet access required - test skipped skip_on_cran() skip_on_travis() ## Test with 4 G-alpha PDB structures pdbdir <- tempdir() suppressWarnings( invisible( capture.output(pdbfiles <- get.pdb(c("1TND_A", "1TAG", "1AS0", "1AS2"), path=pdbdir, split=TRUE)) ) ) invisible( capture.output(aln <- pdbaln(pdbfiles)) ) ## read with default options invisible( capture.output(pdbs <- read.all(aln, ncore=1)) ) expect_is(pdbs, "pdbs") expect_true(inherits(pdbs, "fasta")) expect_is(pdbs$xyz, "xyz") expect_is(pdbs$all, "xyz") expect_equal(length(pdbs$all.hetatm), 4) expect_is(pdbs$all.hetatm[[1]], 'pdb') expect_equal(nrow(pdbs$all.hetatm[[1]]$atom), 35) xyz0 <- rbind(c(30.074, 64.434, 42.910, 30.390, 68.173, 43.382), c(38.552, 16.715, 60.576, 41.952, 15.364, 59.564), c(NA, NA, NA, 8.994, -26.463, 7.153), c(NA, NA, NA, 55.761, 11.671, 39.809)) expect_equivalent(xyz0, pdbs$xyz[, 1:6]) all0 <- rbind(c(30.848, 63.431, 43.718, 30.074, 64.434, 42.910), c(38.238, 18.018, 61.225, 38.552, 16.715, 60.576), c(NA, NA, NA, NA, NA, NA), c(NA, NA, NA, NA, NA, NA)) expect_equivalent(all0, pdbs$all[, 1:6]) resno0 <- rbind(c(27, 28, 29, 30, 31, 32), c(27, 28, 29, 30, 31, 32), c(NA, 32, 33, 34, 35, 36), c(NA, 32, 33, 34, 35, 36)) expect_equivalent(resno0, pdbs$resno[, 1:6]) b0 <- rbind(c(48.05, 40.48, 38.06, 29.55, 25.63, 23.82), c(40.32, 31.04, 23.50, 15.42, 13.10, 13.73), c(NA, 51.59, 45.39, 31.58, 29.26, 22.08), c(NA, 88.56, 65.25, 44.64, 35.89, 25.72)) expect_equivalent(b0, pdbs$b[, 1:6]) chain0 <- rbind(rep('A', 6), rep('A', 6), c(NA, rep('A', 5)), c(NA, rep('A', 5))) expect_equivalent(chain0, pdbs$chain[, 1:6]) ali0 <- rbind(c('A', 'R', 'T', 'V', 'K', 'L'), c('A', 'R', 'T', 'V', 'K', 'L'), c('-', 'R', 'E', 'V', 'K', 'L'), c('-', 'R', 'E', 'V', 'K', 'L')) expect_equivalent(ali0, pdbs$ali[, 1:6]) sse0 <- rbind(c(' ', ' ', ' ', 'E', 'E', 'E'), c(' ', ' ', ' ', 'E', 'E', 'E'), c(NA, ' ', 'E', 'E', 'E', 'E'), c(NA, ' ', 'E', 'E', 'E', 'E')) expect_equivalent(sse0, pdbs$sse[, 1:6]) all.elety0 <- rbind(c('N', 'CA', 'C', 'O', 'CB', 'N'), c('N', 'CA', 'C', 'O', 'CB', 'N'), c(NA, NA, NA, NA, NA, 'N'), c(NA, NA, NA, NA, NA, 'N')) expect_equivalent(all.elety0, pdbs$all.elety[, 1:6]) all.grpby0 <- c(rep(1, 5), 2) expect_equivalent(all.grpby0, pdbs$all.grpby[1:6]) all.hetatm.xyz0 <- c(8.943, 83.379, 38.955, 2.309, 67.529, 27.056) expect_equivalent(all.hetatm.xyz0, pdbs$all.hetatm[[1]]$xyz[, 1:6]) ## read with multicore invisible( capture.output(pdbs.mc <- read.all(aln, ncore=NULL)) ) expect_equal(pdbs[!names(pdbs) %in% 'call'], pdbs.mc[!names(pdbs.mc) %in% 'call']) ## read protein only invisible( capture.output(pdbs.prot <- read.all(aln, rm.ligand=TRUE, ncore=NULL)) ) expect_true(is.null(pdbs.prot$all.hetatm)) expect_equal(pdbs[!names(pdbs) %in% c('call', 'all.hetatm')], pdbs.prot[!names(pdbs.prot) %in% c('call', 'all.hetatm')]) ## read with select atoms invisible( capture.output(pdbs.sel <- read.all(aln, sel=c('N', 'CA', 'C'), rm.ligand=TRUE, ncore=NULL)) ) all.elety0 <- rbind(c('N', 'CA', 'C', 'N', 'CA', 'C'), c('N', 'CA', 'C', 'N', 'CA', 'C'), c(NA, NA, NA, 'N', 'CA', 'C'), c(NA, NA, NA, 'N', 'CA', 'C')) expect_equivalent(all.elety0, pdbs.sel$all.elety[, 1:6]) ## Error handling expect_error(read.all('pdb_file_name_is_not_supported')) ## If one structure is not readable, print warning (ncore=1) and write NAs ## for the missing structure. taln <- aln; taln$id[1] <- 'dummy' expect_warning(capture.output(pdbs.missing <- read.all(taln, ncore=1))) expect_true(all(is.na(pdbs.missing$all[1,]))) ## If mismatch between structure and alignment, print proper error message taln <- aln; taln$ali[1, 16] <- 'A' expect_error(capture.output(read.all(taln, ncore=1))) }) bio3d/tests/testthat/test-atom.select.R0000644000176200001440000001042014046015221017562 0ustar liggesuserscontext("Testing atom.select function") test_that("atom.select() gets correct selections with various options", { # Use the curated test-purpose pdb file file <- system.file("examples/test.pdb", package="bio3d") # invisible(capture.output(pdb <- read.pdb(file, rm.alt = FALSE))) invisible(capture.output(pdb <- read.pdb(file))) # Select all atoms: omit 1 ALT capture.output(all.inds <- atom.select(pdb, "all")) expect_equal(length(all.inds$atom), 175) # Select chain A: return everything in chain A capture.output(a.inds <- atom.select(pdb, chain = "A")) expect_equal(a.inds$xyz, atom2xyz(a.inds$atom)) # self-consistent expect_equal(length(a.inds$atom), 98) expect_equal(a.inds$atom[1], 1) expect_equal(a.inds$atom[98], 170) # Select protein: omit 1 ALT # omit 2 'unknown' AA capture.output(pro.inds <- atom.select(pdb, "protein")$atom) expect_equal(length(pro.inds), 103) # Select C-alpha: omit 2 'unknown' AA # omit 1 with missing 'CA' capture.output(ca.inds <- atom.select(pdb, "calpha")$atom) expect_equal(length(ca.inds), 7) expect_equal(ca.inds[c(1, 5, 7)], c(3, 53, 110)) capture.output(ca2.inds <- atom.select(pdb, elety = "CA")$atom) expect_equal(length(ca2.inds), 10) # include calcium # Select 'N': return the number of all amino acids capture.output(cb.inds <- atom.select(pdb, elety = "N")$atom) expect_equal(length(cb.inds), 10) # Select 'unknown' AA capture.output(unk.inds <- atom.select(pdb, resid = "TES")$atom) expect_equal(length(unk.inds), 26) expect_equal(unk.inds[c(3, 13)], c(10, 94)) # Select 'ATOM' record: omit 1 'ALT' capture.output(ATOM.inds <- atom.select(pdb, type = "ATOM")$atom) expect_equal(length(ATOM.inds), 129) # Select first 5 CA atoms by 'eleno' capture.output(ca5.inds <- atom.select(pdb, eleno = c(3, 10, 20, 27, 42))$atom) expect_equal(length(ca5.inds), 5) expect_true(all(pdb$atom[ca5.inds, "elety"] == "CA")) # Select hydrogen/ligand/water capture.output(h.inds <- atom.select(pdb, "h")$atom) expect_equal(length(h.inds), 77) capture.output(lig.inds <- atom.select(pdb, "ligand")$atom) expect_equal(length(lig.inds), 67) # include "TES" capture.output(wat.inds <- atom.select(pdb, "water")$atom) expect_equal(length(wat.inds), 5) capture.output(ion.inds <- atom.select(pdb, resid = "CA")$atom) expect_equal(ion.inds, 170) capture.output(gdp.inds <- atom.select(pdb, resid = "GDP")$atom) expect_equal(length(gdp.inds), 40) # More string test capture.output(bb.inds <- atom.select(pdb, "backbone")$atom) capture.output(bb2.inds <- atom.select(pdb, "back")$atom) expect_equal(bb.inds, bb2.inds) expect_equal(length(bb.inds), 31) capture.output(cb2.inds <- atom.select(pdb, "cbeta")$atom) expect_equal(length(cb2.inds), 36) capture.output(npro.inds <- atom.select(pdb, "notprotein")$atom) capture.output(npro2.inds <- atom.select(pdb, "protein", inverse = TRUE)$atom) expect_equal(npro.inds, npro2.inds) expect_equal(length(intersect(pro.inds, npro.inds)), 0) expect_equal(length(pro.inds) + length(npro.inds), nrow(pdb$atom)) # omit ALT capture.output(nwat.inds <- atom.select(pdb, "notwater")$atom) capture.output(nwat2.inds <- atom.select(pdb, "water", inverse = TRUE)$atom) expect_equal(nwat.inds, nwat2.inds) expect_equal(length(intersect(wat.inds, nwat.inds)), 0) expect_equal(length(wat.inds) + length(nwat.inds), nrow(pdb$atom)) # omit ALT capture.output(noh.inds <- atom.select(pdb, "noh")$atom) capture.output(noh2.inds <- atom.select(pdb, "h", inverse = TRUE)$atom) expect_equal(noh.inds, noh2.inds) expect_equal(length(intersect(h.inds, noh.inds)), 0) expect_equal(length(h.inds) + length(noh.inds), nrow(pdb$atom)) # omit ALT # Test on combination of select capture.output(comb1.inds <- atom.select(pdb, chain = "B", resno = c(1,4))) expect_equal(length(comb1.inds$atom), 33) # omit ALT capture.output(comb2.inds <- atom.select(pdb, resid = "GDP", elety = "PA") ) expect_equal(comb2.inds$atom, 135) capture.output(comb3.inds <- atom.select(pdb, "noh", resid = "TES", chain = "A") ) expect_equal(comb3.inds$atom, c(8, 10, 12, 16, 17)) capture.output(comb4.inds <- atom.select(pdb, chain = "B", resid = "GDP", operator = "OR") ) expect_equal(length(comb4.inds$atom), 117) }) bio3d/tests/testthat/test-nma.pdbs.R0000644000176200001440000001303114046015221017047 0ustar liggesuserscontext("Testing nma.pdbs()") test_that("eNMA works", { skip_on_cran() "mysign" <- function(a,b) { if(all(sign(a)==sign(b))) return(1) else return(-1) } attach(transducin) inds <- unlist(lapply(c("1TND_A", "1TAG", "1AS0", "1AS2"), grep, pdbs$id)) pdbs <- trim.pdbs(pdbs, row.inds=inds) gaps <- gap.inspect(pdbs$xyz) ## Calc modes invisible(capture.output(modes <- nma.pdbs(pdbs, fit=TRUE, rm.gaps=TRUE, ncore=1))) ## check dimensions expect_that(dim(modes$U), equals(c(939, 933, 4))) expect_that(dim(modes$L), equals(c(4, 933))) expect_that(dim(modes$fluctuations), equals(c(4, 313))) ## structure 1- mode1: U1 <- c(-0.046380187, 0.007816393, 0.078933552, -0.041820111, 0.009819448, 0.047598954) nowU1 <- head(modes$U.subspace[,1,1], n=6) expect_that(nowU1 * mysign(U1, nowU1), equals(U1, tolerance=1e-6)) ## structure 1- mode2: U2 <- c(0.007819148, -0.005717370, -0.051933927, 0.002265788, -0.013386437, -0.039409712) nowU2 <- head(modes$U.subspace[,2,1], n=6) expect_that(nowU2 * mysign(U2, nowU2), equals(U2, tolerance=1e-6)) ## structure 4- mode3: U3 <- c(-0.13697744, -0.05401178, 0.09615700, -0.11026525, -0.01510157, 0.05796091) nowU3 <- head(modes$U.subspace[,3,4], n=6) expect_that(nowU3 * mysign(U3, nowU3), equals(U3, tolerance=1e-6)) ## structure 4-mode1 - tail: U1 <- c(0.009820174, 0.004566910, -0.055544781, 0.009938013, 0.006707436, -0.068154672) nowU1 <- tail(modes$U.subspace[,1,4], n=6) expect_that(nowU1 * mysign(U1, nowU1), equals(U1, tolerance=1e-6)) ## Fluctuations: f1 <- c(0.3657288, 0.2196504, 0.1449100, 0.1217517, 0.1130416, 0.1007862) f2 <- c(0.5295304, 0.3004094, 0.2011062, 0.1401276, 0.1205508, 0.1011349) f4 <- c(0.6488982, 0.3079024, 0.2166070, 0.1504672, 0.1282899, 0.1029634) expect_that(modes$fluctuations[1,1:6], equals(f1, tolerance=1e-6)) expect_that(modes$fluctuations[2,1:6], equals(f2, tolerance=1e-6)) expect_that(modes$fluctuations[4,1:6], equals(f4, tolerance=1e-6)) ## Orthognal expect_that(as.numeric(modes$U.subspace[,1,1] %*% modes$U.subspace[,1,1]), equals(1, tolerance=1e-6)) expect_that(as.numeric(modes$U.subspace[,1,1] %*% modes$U.subspace[,2,1]), equals(0, tolerance=1e-6)) ## RMSIP rmsips <- c(1.0000, 0.9174, 0.9441, 0.9251) expect_that(as.vector(modes$rmsip[1,]), equals(rmsips, tolerance=1e-6)) ## Multicore (same arguments as above!) skip_on_travis() invisible(capture.output(mmc <- nma.pdbs(pdbs, fit=TRUE, rm.gaps=TRUE, ncore=NULL))) expect_that(mmc$fluctuations, equals(modes$fluctuations, tolerance=1e-6)) expect_that(mmc$U.subspace, equals(modes$U.subspace, tolerance=1e-6)) ## Calc modes with rm.gaps=FALSE invisible(capture.output(modes <- nma.pdbs(pdbs, fit=TRUE, rm.gaps=FALSE, ncore=NULL))) ## structure 1-mode1 - tail: U1 <- c(0.04397369, -0.01400912, -0.02123377, 0.08124317, -0.02660929, -0.02619898) nowU1 <- tail(modes$U.subspace[,1,1], n=6) expect_that(nowU1 * mysign(U1, nowU1), equals(U1, tolerance=1e-6)) ## structure 1-mode1 - tail: U1 <- c(0.001300939, -0.053317847, 0.011292943, 0.003307034, -0.071684004, NA) nowU1 <- modes$U.subspace[938:943,1,2] U1[is.na(U1)] <- 0 nowU1[is.na(nowU1)] <- 0 expect_that(nowU1 * mysign(nowU1, U1), equals(U1, tolerance=1e-6)) ## fluctuations na.expected <- c(3, 4, 1258, 1259, 1262, 1263, 1266, 1267, 1268, 1270, 1271, 1272, 1274, 1275, 1276, 1278, 1279, 1280, 1282, 1283, 1284, 1286, 1287, 1288, 1290, 1291, 1292) expect_that(which(is.na(modes$fluctuations)), equals(na.expected)) f1 <- c(0.59967448, 0.34438649, 0.20382435, 0.13350449) f4 <- c(0.3335200, 0.4255609, 0.5941589, rep(NA, 7)) expect_that(modes$fluctuations[1,1:4], equals(f1, tolerance=1e-6)) expect_that(tail(modes$fluctuations[4,], n=10), equals(f4, tolerance=1e-6)) ## Calc modes with mass=FALSE and temp=NULL invisible(capture.output(modes <- nma.pdbs(pdbs, mass=FALSE, temp=NULL, ncore=NULL))) ## structure 1- mode1: U1 <- c(-0.04043330, 0.00730273, 0.07000757, -0.04520831, 0.01130271, 0.05337233) nowU1 <- head(modes$U.subspace[,1,1], n=6) expect_that(nowU1 * mysign(U1, nowU1), equals(U1, tolerance=1e-6)) ## structure 1- mode2: U2 <- c(-0.002813312, 0.005765808, 0.039807147, 0.001667637, 0.014587327, 0.038682763) nowU2 <- head(modes$U.subspace[,2,1], n=6) expect_that(nowU2 * mysign(U2, nowU2), equals(U2, tolerance=1e-6)) ## structure 5- mode3: U3 <- c(0.11324262, 0.04220159, -0.07597465, 0.10267147, 0.01483591, -0.05261675) nowU3 <- head(modes$U.subspace[,3,4], n=6) expect_that(nowU3 * mysign(U3, nowU3), equals(U3, tolerance=1e-6)) ## Calc modes with mass=FALSE and temp=NULL and ff="anm" invisible(capture.output(modes <- nma.pdbs(pdbs, mass=FALSE, temp=NULL, ff="anm", ncore=NULL))) ## structure 3- mode10: U1 <- c(0.03630660, 0.03078575, -0.02376714, 0.01906218, 0.01110582, -0.01361602) nowU1 <- head(modes$U.subspace[,10,3], n=6) expect_that(nowU1 * mysign(U1, nowU1), equals(U1, tolerance=1e-6)) ## structure 4- mode1: U1 <- c(-0.04113844, 0.01096919, 0.07368620, -0.04250786, 0.01320282, 0.05550216) nowU1 <- head(modes$U.subspace[,1,4], n=6) expect_that(nowU1 * mysign(U1, nowU1), equals(U1, tolerance=1e-6)) f1 <- c(0.3630744, 0.2768045, 0.1996179, 0.1766148) f2 <- c(0.5231570, 0.3519813, 0.2331503, 0.2003372) expect_that(modes$fluctuations[1,1:4], equals(f1, tolerance=1e-6)) expect_that(modes$fluctuations[2,1:4], equals(f2, tolerance=1e-6)) detach(transducin) }) bio3d/tests/testthat/test-get.pdb.R0000644000176200001440000000253414046015221016676 0ustar liggesuserscontext("Testing get.pdb()") test_that("get.pdb() works properly", { skip_on_cran() skip_on_travis() ids <- c("1tag", "1tnd") # Gt tmp <- tempdir() suppressWarnings( capture.output(files <- get.pdb(ids, tmp, verbose=FALSE)) ) expect_identical(files, paste(tmp, "/", ids, ".pdb", sep="")) expect_warning(get.pdb("3c7kxxx", tmp, verbose=FALSE)) expect_warning(get.pdb("1tag", tmp, verbose=FALSE)) suppressWarnings( capture.output(files <- get.pdb("1as0", tmp, verbose=FALSE, gzip=TRUE)) ) expect_identical(files, paste(tmp, "/1as0.pdb", sep="")) # expect_error(get.pdb("aaaa", tmp, verbose=FALSE)) }) test_that("get.pdb() with ncore>1 works properly", { skip_on_cran() skip_on_travis() ids <- c("1tag", "1tnd", "3v00", "1got") tmp1 <- paste(tempdir(), "1", sep="") tmp2 <- paste(tempdir(), "2", sep="") time1 <- system.time(r1 <- get.pdb(ids, tmp1, ncore=1, verbose=FALSE))["elapsed"] time2 <- system.time(r2 <- get.pdb(ids, tmp2, ncore=NULL, verbose=FALSE))["elapsed"] expect_identical(r2, paste(tmp2, "/", ids, ".pdb", sep="")) expect_identical(list.files(tmp1), list.files(tmp2)) # cat("Speed up by ", round((time1-time2)/time2*100, 1), "%", sep="") # if(getOption("cores") > 1) # expect_true(time1 > time2) unlink(tmp1, recursive=TRUE) unlink(tmp2, recursive=TRUE) }) bio3d/tests/testthat/test-read.cif.R0000644000176200001440000000437514046015221017033 0ustar liggesuserscontext("Testing relationship between read.cif and read.pdb") test_that("read.cif() reads a normal pdb file", { skip_on_cran() skip_on_travis() ## Simple testing file <- system.file("examples/1dpx.pdb",package="bio3d") invisible(capture.output(p1 <- read.pdb(file))) datdir <- tempdir() invisible(capture.output(get.pdb("1dpx", path=datdir, format="cif", overwrite = FALSE, verbose = FALSE))) suppressWarnings( invisible(capture.output(p2 <- read.cif(file.path(datdir, "1dpx.cif")))) ) expect_is(p2$atom, "data.frame") expect_true(inherits(p2, "pdb")) expect_true(inherits(p2$xyz, "xyz")) expect_identical(p2$xyz, p1$xyz) expect_equal(nrow(p2$atom), nrow(p1$atom)) expect_equal(sum(p2$calpha), sum(p1$calpha)) expect_identical(p2$xyz, p1$xyz) expect_identical(p2$atom$type, p1$atom$type) ## offset for eleno between pdb and cif format #expect_identical(p2$atom$eleno, p1$atom$eleno) expect_identical(p2$atom$resid, p1$atom$resid) expect_identical(p2$atom$resno, p1$atom$resno) expect_identical(p2$atom$o, p1$atom$o) expect_identical(p2$atom$b, p1$atom$b) expect_equal(sum(p2$atom$resid=="HOH"), sum(p1$atom$resid=="HOH")) expect_equal(sum(p2$atom$resid=="CL"), sum(p1$atom$resid=="CL")) expect_that(sum(p2$xyz), equals(44657.12, tolerance=1e-6)) expect_equal(sum(p2$atom$type=="ATOM"), sum(p1$atom$type=="ATOM")) expect_equal(sum(p2$atom$type=="HETATM"), sum(p1$atom$type=="HETATM")) }) test_that("read.cif() on a multimodel object", { skip_on_cran() skip_on_travis() datdir <- tempdir() invisible(capture.output(get.pdb(c("1L2Y"), path=datdir, overwrite = FALSE, verbose = FALSE))) invisible(capture.output(get.pdb(c("1L2Y"), path=datdir, format="cif", overwrite = FALSE, verbose = FALSE))) # multi-model structure invisible(capture.output(p1 <- read.pdb(file.path(datdir, "1L2Y.pdb"), multi=TRUE))) suppressWarnings( invisible(capture.output(p2 <- read.cif(file.path(datdir, "1L2Y.cif"), multi=TRUE))) ) expect_identical(dim(p1$xyz), dim(p2$xyz)) expect_identical(p1$atom$x, p2$atom$x) expect_identical(p1$atom$y, p2$atom$y) expect_identical(p1$atom$z, p2$atom$z) }) bio3d/tests/testthat/test-cmap.R0000644000176200001440000000171714046015221016275 0ustar liggesuserscontext("Testing cmap function") test_that("cmap() works properly", { ## Simple test with PDB ID 1HEL file <- system.file("examples/1hel.pdb",package="bio3d") invisible(capture.output(pdb <- read.pdb(file))) ## Calculate contact map on a small protein invisible(capture.output(inds <- atom.select(pdb, "protein"))) invisible(capture.output(cm <- cmap(pdb$xyz[, inds$xyz], grpby=pdb$atom[inds$atom, "resno"], ncore=1))) expect_equal(length(which(cm==1)), 285) expect_true(all(is.na(cm[1,1:3]))) expect_equal(cm[1,4], 0) expect_equal(cm[13,129], 1) ## Check multicore cmap skip_on_cran() skip_on_travis() trjfile <- system.file("examples/hivp.dcd", package="bio3d") invisible(capture.output(trj <- read.dcd(trjfile))) invisible(capture.output(cm <- cmap(trj, dcut=6, ncore=1))) invisible(capture.output(cm.mc <- cmap(trj, dcut=6, ncore=NULL))) expect_that(cm, equals(cm.mc, tolerance=1e-6)) }) bio3d/tests/testthat/test-atom2mass.R0000644000176200001440000000431614046015221017261 0ustar liggesuserscontext("Testing atom mass functions") test_that("atom to mass tests", { ## Simple test atom.names <- c("CA", "O", "N", "OXT") ##masses <- c(12.01, 16.00, 14.01, 16.00) masses <- c(12.0107, 15.9994, 14.0067, 15.9994) expect_that(atom2mass(atom.names), equals(masses, tolerance=1e-6)) ##masses <- c(42.02, 16.00) masses <- c(42.0168, 15.9994) expect_that(as.numeric(atom2mass(atom.names, grpby=c(1,1,1,2))), equals(masses, tolerance=1e-6)) ## Should end with error atom.names <- c("CA", "O", "N", "OXT", "CL2", "PT1") expect_that(atom2mass(atom.names, rescue=FALSE), throws_error()) expect_that(atom2mass(atom.names, rescue=TRUE), gives_warning()) ## Simple test with PDB ID 1HEL file <- system.file("examples/1hel.pdb",package="bio3d") invisible(capture.output(pdb <- read.pdb(file))) invisible(capture.output(prot.inds <- atom.select(pdb, "protein"))) invisible(capture.output(pdb.prot <- trim.pdb(pdb, prot.inds))) eletys <- pdb$atom$elety[ pdb$atom$type=="ATOM" ] expect_that(sum(atom2mass( eletys )), equals(13346.39, tolerance=1e-6)) expect_that(sum(atom2mass( eletys )), equals(sum(atom2mass(pdb.prot), tolerance=1e-6))) expect_that(sum(atom2mass( pdb.prot )), equals(13346.39, tolerance=1e-6)) ## Try center of mass at the same go coma <- c(-0.4991111, 20.5858389, 19.2604674) expect_that(c(com(pdb.prot)), equals(coma, tolerance=1e-6)) # coma <- c(-0.5829897, 20.5306061, 19.1081465) # expect_that(com(pdb), equals(coma, tolerance=1e-6)) ## Add custom masses atom.names <- c("CA", "O", "N", "OXT", "CL2", "PT1") masses <- c(12.0107, 15.9994, 14.0067, 15.9994, 35.4530, 195.0780) elety.cust <- data.frame(name = c("CL2","PT1"), symb = c("Cl","Pt")) ##mass.cust <- data.frame(symb = c("Cl","Pt"), mass = c(35.45, 195.08)) expect_that(atom2mass(atom.names, elety.custom=elety.cust), equals(masses, tolerance=1e-6)) ## mass from formula form <- "C5 H6 N O3" masses <- c(60.050, 6.048, 14.010, 48.000) masses <- c(60.05350, 6.04764, 14.00670, 47.99820) expect_that(formula2mass(form, sum.mass=FALSE), equals(masses, tolerance=1e-6)) form <- "C5H6" expect_that(formula2mass(form), throws_error()) } ) bio3d/tests/testthat/test-cna.R0000644000176200001440000000313314046015221016110 0ustar liggesuserscontext("Testing correlation network analysis") test_that("cna() and cnapath() work properly", { skip_on_cran() oops <- requireNamespace("igraph", quietly = TRUE) if (!oops) { skip('Need igraph installed to run this test') } ## Simple test with PDB ID 1HEL file <- system.file("examples/1hel.pdb",package="bio3d") capture.output(pdb <- read.pdb(file)) ## Normal modes and cross-correlation matrix capture.output(modes <- nma(pdb)) capture.output(cij <- dccm(modes)) ## network construction capture.output(cm <- cmap(pdb, dcut=4.5, scut=1)) suppressWarnings( capture.output(net <- cna(cij, cm=cm, cutoff.cij=0)) ) expect_equal(net$communities$vcount, 129) expect_equal(igraph::ecount(net$network), 608) expect_equal(max(net$communities$membership), 5) expect_equal(igraph::ecount(net$community.network), 9) ## and path analysis capture.output(pa <- cnapath(net, from=3, to=53, k=20, collapse=TRUE, ncore=1)) expect_equal(length(pa$path), 20) expect_equal(pa$path[[1]], c(3, 2, 39, 54, 53)) expect_equal(pa$path[[20]], c(3, 2, 39, 40, 84, 53)) expect_equal(pa$dist[1:6], c(3.427, 3.521, 3.821, 3.847, 3.868, 3.965), tolerance=1e-3) expect_equal(pa$epath[[10]], c(9, 13, 245, 253, 320)) ndg0 <- matrix(c(0.65, 1, 0.35, 0.8, 0.45, 0.1, 0.3, 1, 0.5, 0.35), nrow=1, dimnames = list(1, c(2, 3, 38, 39, 40, 41, 42, 53, 54, 55)) ) capture.output(ndg <- summary(pa)$degeneracy) expect_equal(ndg, ndg0) skip_on_travis() capture.output(pa2 <- cnapath(net, from=3, to=53, k=20, collapse=TRUE, ncore=NULL)) expect_equal(pa, pa2) }) bio3d/tests/testthat/test-dssp.R0000644000176200001440000000473314046015221016327 0ustar liggesuserscontext("Testing dssp()") test_that("SSE assignment still works", { skip_on_cran() skip_on_travis() if(!check.utility('dssp')) { skip('Need DSSP installed to run this test') } ## Simple test with PDB ID 1HEL invisible(capture.output(pdb <- read.pdb("3ERJ"))) sse <- dssp(pdb) ## helices sse.stored <- c(17, 37, 58, 101, 19, 37, 58, 101) expect_that(as.numeric(sse$helix$start), equals(sse.stored)) sse.stored <- c(18, 9, 14, 8, 16, 10, 13, 7) expect_that(as.numeric(sse$helix$length), equals(sse.stored)) ## sheet sse.stored <- c(3, 50, 75, 93, 3, 50, 75, 93 ) expect_that(as.numeric(sse$sheet$start), equals(sse.stored)) sse.stored <- c(8, 6, 4, 8, 8, 6, 4, 8) expect_that(as.numeric(sse$sheet$length), equals(sse.stored)) ## With RESNO=FALSE sse <- dssp(pdb, resno=FALSE) ## helices sse.stored <- c(16, 36, 57, 100, 134, 152, 173, 216) expect_that(as.numeric(sse$helix$start), equals(sse.stored)) sse.stored <- c(rep("A", 4), rep("B", 4)) expect_that(as.character(sse$helix$chain), equals(sse.stored)) ## sheet sse.stored <- c(2, 49, 74, 92, 118, 165, 190, 208) expect_that(as.numeric(sse$sheet$start), equals(sse.stored)) sse.stored <- c(rep("A", 4), rep("B", 4)) expect_that(as.character(sse$sheet$chain), equals(sse.stored)) ## With FULL=TRUE sse <- dssp(pdb, full=TRUE) expect_that(sum(as.numeric(sse$hbonds[,"BP1"]), na.rm=T), equals(2127)) expect_that(sum(as.numeric(sse$hbonds[,"BP2"]), na.rm=T), equals(1355)) expect_that(sum(as.numeric(sse$hbonds[,"NH-O.1"]), na.rm=T), equals(12017)) expect_that(sum(as.numeric(sse$hbonds[,"E1"]), na.rm=T), equals(-315.8)) expect_that(sum(as.numeric(sse$hbonds[,"O-HN.1"]), na.rm=T), equals(13347)) expect_that(sum(as.numeric(sse$hbonds[,"E2"]), na.rm=T), equals(-313.4)) expect_that(sum(as.numeric(sse$hbonds[,"NH-O.2"]), na.rm=T), equals(11859)) expect_that(sum(as.numeric(sse$hbonds[,"E3"]), na.rm=T), equals(-51.2)) expect_that(sum(as.numeric(sse$hbonds[,"O-HN.2"]), na.rm=T), equals(13076)) expect_that(sum(as.numeric(sse$hbonds[,"E4"]), na.rm=T), equals(-53.6)) expect_that(length(which(sse$hbonds[,"Chain1"]=="A")), equals(112)) expect_that(length(which(sse$hbonds[,"Chain1"]=="B")), equals(105)) expect_that(length(which(sse$hbonds[,"Chain2"]=="A")), equals(115)) expect_that(length(which(sse$hbonds[,"Chain3"]=="B")), equals(108)) expect_that(length(which(sse$hbonds[,"Chain4"]=="A")), equals(116)) } ) bio3d/tests/testthat/test-read.ncdf.R0000644000176200001440000000333214046015221017174 0ustar liggesuserscontext("Testing basic operation with NetCDF trajectory") test_that("read.ncdf() and write.ncdf() works properly", { skip_on_cran() ##- Prepare files trjfile <- tempfile() file <- system.file("examples/hivp.dcd", package="bio3d") invisible(capture.output(trj0 <- read.dcd(file))) time0 <- sort(round(runif(nrow(trj0), 0, 1000), digit=3)) cell0 <- matrix(rep(runif(6, 0, 100), nrow(trj0)), ncol=6, byrow=TRUE) rownames(trj0) <- time0 ##- Write out <- try(write.ncdf(trj0, trjfile, cell = cell0)) expect_false(inherits(out, "try-error")) ##- Read trj <- read.ncdf(trjfile, headonly = TRUE, verbose = FALSE) expect_output(str(trj), "frames: int 117" ) expect_output(str(trj), "atoms : int 198" ) trj <- read.ncdf(trjfile, cell = TRUE, verbose = FALSE) ##expect_equal(trj, as.data.frame(cell0, stringsAsFactors=FALSE), tolerance = 1e-6) expect_equal(trj, cell0, tolerance = 1e-6) trj <- read.ncdf(trjfile, verbose = FALSE, time = TRUE) expect_equal(as.numeric(rownames(trj)), time0, tolerance = 1e-6) expect_equivalent(trj, trj0) pdb <- read.pdb(system.file("examples/hivp.pdb", package="bio3d")) inds <- atom.select(pdb, chain="A", verbose=FALSE) trj <- read.ncdf(trjfile, verbose = FALSE, first=10, last=20, stride=2, at.sel = inds) expect_equivalent(trj, as.xyz(trj0[seq(10, 20, 2), inds$xyz])) # read single frame trj <- read.ncdf(trjfile, verbose = FALSE, first=1, last=1, at.sel = inds) expect_equivalent(trj, as.xyz(trj0[1, inds$xyz])) # multiple files files <- rep(trjfile, 4) txt <- capture.output(trj <- read.ncdf(files, headonly = TRUE)) expect_output(print(txt), "Frames: 468") expect_output(print(txt), "Atoms: 198") }) bio3d/tests/testthat/test-nma.R0000644000176200001440000002441714046015221016132 0ustar liggesuserscontext("Testing nma()") test_that("NMA", { "mysign" <- function(a,b) { if(all(sign(a)==sign(b))) return(1) else return(-1) } ## Simple test with PDB ID 1HEL file <- system.file("examples/1hel.pdb",package="bio3d") invisible(capture.output(pdb <- read.pdb(file))) ## Calculate modes with default arguments invisible(capture.output(modes <- nma(pdb, ff='calpha', mass=TRUE, temp=300.0))) ## Check first eigenvector U7 <- c(-0.05471209, -0.054333625, 0.001052514, -0.041171891, -0.049232935, -0.001588035) nowU7 <- head(modes$U[,7]) expect_that(nowU7 * mysign(U7, nowU7), equals(U7, tolerance=1e-6)) ## Check second eigenvector U8 <- c(0.064185522, 0.027349834, -0.024359816, 0.011493963, 0.029426825, -0.014397686) nowU8 <- head(modes$U[,8]) expect_that(nowU8 * mysign(U8, nowU8), equals(U8, tolerance=1e-6)) ## Check Mode vector mode7 <- c(-0.092579348, -0.091938941, 0.001780978, -0.079838481, -0.095470057, -0.003079439) nowMode7 <- head(modes$modes[,7]) expect_that(nowMode7 * mysign(mode7, nowMode7), equals(mode7, tolerance=1e-6)) ## Check eigenvalues eival <- c(0.013383, 0.013933, 0.022355, 0.025518, 0.029944, 0.033954) nowEival <- modes$L[7:12] expect_that(nowEival, equals(eival, tolerance=1e-6)) ## Check frequencies freqs <- c(0.018411826, 0.018786352, 0.023796192, 0.025423975, 0.027540704, 0.029326863) nowFreqs <- modes$frequencies[7:12] expect_that(nowFreqs, equals(freqs, tolerance=1e-6)) ## Dimensions expect_that(dim(modes$U), equals(c(387, 387))) expect_that(dim(modes$modes), equals(c(387, 387))) expect_that(length(modes$L), equals(387)) expect_that(length(modes$frequencies), equals(387)) expect_that(length(modes$mass), equals(129)) expect_that(modes$natoms, equals(129)) expect_that(modes$temp, equals(300)) ## Orthognals expect_that(as.numeric(modes$U[,7] %*% modes$U[,7]), equals(1, tolerance=1e-6)) expect_that(as.numeric(modes$U[,7] %*% modes$U[,8]), equals(0, tolerance=1e-6)) expect_that(all((round(c(modes$U[,7] %*% modes$U),6)==0)[-7]), equals(TRUE)) expect_that(all(round(c(modes$L[1:6]), 6)==0), equals(TRUE)) ################################################################### # # Test with ouput from MMTK # ################################################################### "calpha.mmtk" <- function(r, ...) { ## MMTK Units: kJ / mol / nm^2 a <- 128; b <- 8.6 * 10^5; c <- 2.39 * 10^5; ifelse( r<4.0, b*(r/10) - c, a*(r/10)^(-6) ) } ## Vibrational Modes invisible(capture.output(modes <- nma(pdb, pfc.fun=calpha.mmtk, mmtk=TRUE, addter=FALSE))) ## Mode vector 7 (mmtk: modes[6]) mmtk7 <- c(0.009399498664059314, 0.009162216956173577, -0.00018940255982217028, 0.008013487647313355, 0.009521462401750403, 0.000300410055738782, 0.006725323170414416, 0.00613075811499374, 0.0007167801244317134, 0.003911230038334056, 0.0031036402193391484, 0.00011224732577516142, 5.015756380626851e-05, 0.00122307913030356, 0.0005064454471294721, 0.0014876013838084666, -0.003968053761191632, 0.00020389385408319644) nowMmtk7 <- head(modes$modes[,7], n=18) expect_that(nowMmtk7 * mysign(mmtk7, nowMmtk7), equals(mmtk7, tolerance=1e-6)) ## Raw mode vector 7 (mmtk: modes.rawMode(6)) mmtk7 <- c(0.05535176862194779, 0.053954464078107375, -0.0011153538121951093, 0.04133856415826275, 0.049117637874840574, 0.0015497023155839553, 0.04227251082807122, 0.03853532867244931, 0.00450537391343214) nowMmtk7 <- head(modes$U[,7], n=9) expect_that(nowMmtk7 * mysign(mmtk7, nowMmtk7), equals(mmtk7, tolerance=1e-6)) ## Frequencies mmtkFreqs <- c(0.18417800523842359, 0.18804324107310424, 0.23820080688206749, 0.25592672017449125, 0.2798133442063071, 0.29367413814307064) nowMmtkFreqs <- modes$frequencies[7:12] expect_that(nowMmtkFreqs, equals(mmtkFreqs, tolerance=1e-6)) ## Fluctuations mmtk.flucts <- c(0.00195060853392, 0.00113764918589, 0.00167187530508, 0.00175346604072, 0.00151209078542, 0.00130098648001, 0.00133495588156, 0.00107978100112, 0.000924829566202, 0.00109689698409) nowFlucts <- modes$fluctuations[1:10] expect_that(nowFlucts, equals(mmtk.flucts, tolerance=1e-6)) ## Energetic Modes (mass=FALSE) invisible(capture.output(modes <- nma(pdb, pfc.fun=calpha.mmtk, mass=FALSE, mmtk=TRUE, addter=FALSE))) mmtk7 <- c(0.010350805923938345, 0.009267077807430083, -3.701643999426641e-05, 0.008268033266170226, 0.009606710315232818, 0.0003705525203545053, 0.006767227535558591, 0.005694101052352917, 0.001077079483122824) nowMmtk7 <- head(modes$modes[,7], n=9) expect_that(nowMmtk7 * mysign(mmtk7, nowMmtk7), equals(mmtk7, tolerance=1e-6)) mmtk7 <- c(0.05478481030376396, 0.04904884735365174, -0.00019592084498809212, 0.04376109816000157, 0.05084645641420892, 0.001961262696318724, 0.03581762420652206, 0.030137773647408828, 0.005700773021792685) nowMmtk7 <- head(modes$U[,7], n=9) expect_that(nowMmtk7 * mysign(mmtk7, nowMmtk7), equals(mmtk7, tolerance=1e-6)) ## Fluctuations mmtk.flucts <- c(0.00195600136572, 0.00114595965451, 0.00168855332538, 0.00175330685712, 0.00152428233485, 0.00130978174806, 0.00134381308059, 0.00108408194319, 0.000924316154921, 0.0010985505357) nowFlucts <- modes$fluctuations[1:10] expect_that(nowFlucts, equals(mmtk.flucts, tolerance=1e-6)) ## Energetic Modes (mass=FALSE, temp=NULL) invisible(capture.output(modes <- nma(pdb, pfc.fun=calpha.mmtk, mass=FALSE, temp=NULL))) mmtk7 <- c(0.05478481030376396, 0.04904884735365174, -0.00019592084498809212, 0.04376109816000157, 0.05084645641420892, 0.001961262696318724, 0.03581762420652206, 0.030137773647408828, 0.005700773021792685) nowMmtk7 <- head(modes$modes[,7], n=9) expect_that(nowMmtk7 * mysign(mmtk7, nowMmtk7), equals(mmtk7, tolerance=1e-6)) mmtk7 <- c(0.05478481030376396, 0.04904884735365174, -0.00019592084498809212, 0.04376109816000157, 0.05084645641420892, 0.001961262696318724, 0.03581762420652206, 0.030137773647408828, 0.005700773021792685) nowMmtk7 <- head(modes$U[,7], n=9) expect_that(nowMmtk7 * mysign(mmtk7, nowMmtk7), equals(mmtk7, tolerance=1e-6)) ## Fluctuations mmtk.flucts <- c(0.000784175524735, 0.000459423765829, 0.000676953612192, 0.000702913785645, 0.000611096147848, 0.000525101264027, 0.00053874467886, 0.000434616530213, 0.00037056523503, 0.000440417096776) nowFlucts <- modes$fluctuations[1:10] expect_that(nowFlucts, equals(mmtk.flucts, tolerance=1e-6)) ## ANM eigenvectors invisible(capture.output(modes <- nma(pdb, ff='anm', mass=FALSE, temp=NULL, cutoff=15))) anm7 <- c(0.041345308400364066, 0.03345000499525146, 0.008604839963113613, 0.03755854024944313, 0.036973377719312125, 0.008638534251932818, 0.033187347539802, 0.022779436981185324, 0.004702511702428035) nowAnm7 <- head(modes$modes[,7], n=9) expect_that(nowAnm7 * mysign(anm7, nowAnm7), equals(anm7, tolerance=1e-6)) ## ANM eigenvalues check eivalsANM <- c(0.84962016107196869, 1.0327718030407862, 1.3724207202555807, 1.7545168246132175, 1.9606866740784614, 2.2429459260702607) nowEivalANM <- modes$L[7:12] expect_that(nowEivalANM, equals(eivalsANM, tolerance=1e-6)) ################################################################### # # Test mass custom stuff # ################################################################### mc <- list(ALA=500, SER=1000) suppressWarnings( invisible(capture.output(modes <- nma(pdb, mass.custom=mc))) ) mass.expected <- c(500.000, 500.000, 500.000, 131.196, 129.180, 157.194) expect_that(modes$mass[9:14], equals(mass.expected, tolerance=1e-6)) sum.expected <- 28564.36 expect_that(sum(modes$mass), equals(sum.expected, tolerance=1e-6)) modes.expected <- c(-0.128550854, -0.069409382, 0.011821391, -0.056729257, -0.076231424, 0.004736013) nowMode7 <- modes$modes[1:6, 7] expect_that(nowMode7 * mysign(nowMode7, modes.expected), equals(modes.expected, tolerance=1e-6)) L.expected <- c(0.007375, 0.009036, 0.013007, 0.015084, 0.020111, 0.022608) expect_that(modes$L[7:12], equals(L.expected, tolerance=1e-6)) ################################################################### # # Test build.hessian # ################################################################### sele <- atom.select(pdb, chain="A", elety="CA") xyz <- pdb$xyz[sele$xyz] i <- 2; j <- 5; hessian <- build.hessian(xyz, pfc.fun=calpha.mmtk, fc.weights=NULL) subhess <- matrix(c(-79.568546, 80.648662, -19.298073, 80.648662, -81.743440, 19.560037, -19.298073, 19.560037, -4.680438), ncol=3, byrow=TRUE) expect_that(hessian[atom2xyz(j), atom2xyz(i)], equals(subhess, tolerance=1e-6)) ## Force constant weighting weight <- 0.5; fc.mat <- matrix(1, nrow=length(xyz)/3, ncol=length(xyz)/3) fc.mat[i, j] <- weight; fc.mat[j, i] <- weight; hessian2 <- build.hessian(xyz, pfc.fun=calpha.mmtk, fc.weights=fc.mat) expect_that(hessian[atom2xyz(j), atom2xyz(i)] * weight, equals(hessian2[atom2xyz(j), atom2xyz(i)], tolerance=1e-6)) ################################################################### # # Test extracting effective hessian with 'outmodes' argument # ################################################################### out.inds <- atom.select(pdb, 'calpha', resno=5:124) invisible(capture.output(modes <- nma(pdb, outmodes = out.inds))) U7 <- c(0.022538557, 0.016313285, -0.007462564, 0.024520684, -0.005453823, -0.015629021) nowU7 <- head(modes$U[,7]) expect_that(nowU7 * mysign(U7, nowU7), equals(U7, tolerance=1e-6)) eival <- c(0.013868, 0.015537, 0.024559, 0.030261, 0.039459, 0.043531) nowEival <- modes$L[7:12] expect_that(nowEival, equals(eival, tolerance=1e-6)) } ) bio3d/tests/testthat/test-gnm.R0000644000176200001440000000374014046015221016134 0ustar liggesuserscontext("Testing gnm()") test_that("GNM", { "mysign" <- function(a,b) { if(all(sign(a)==sign(b))) return(1) else return(-1) } ## Simple test with PDB ID 1HEL file <- system.file("examples/1hel.pdb",package="bio3d") invisible(capture.output(pdb <- read.pdb(file))) ## Calculate modes with default arguments invisible(capture.output(modes <- gnm.pdb(pdb) ) ) ## NOTE: all following reference results are from Prody ## Check first eigenvector U2 <- c( -0.020, 0.008, 0.026, 0.052, 0.069, 0.086) nowU2 <- round(head(modes$U[, 2]), 3) expect_that(nowU2 * mysign(U2, nowU2), equals(U2, tolerance=1e-6)) ## Check second eigenvector U3 <- c(0.050, 0.064, 0.084, 0.110, 0.105, 0.145) nowU3 <- round(head(modes$U[,3]), 3) expect_that(nowU3 * mysign(U3, nowU3), equals(U3, tolerance=1e-6)) ## Check eigenvalues eival <- c(0.342, 0.804, 1.108, 1.277, 1.416, 1.617) nowEival <- round(modes$L[2:7], 3) expect_that(nowEival, equals(eival, tolerance=1e-6)) ## Dimensions expect_that(dim(modes$U), equals(c(129, 129))) expect_that(length(modes$L), equals(129)) expect_that(modes$natoms, equals(129)) expect_that(modes$temp, equals(300)) ## Orthognals expect_that(as.numeric(modes$U[,2] %*% modes$U[,2]), equals(1, tolerance=1e-6)) expect_that(all(round(c(modes$U[,2] %*% modes$U[, 3:ncol(modes$U)]), 6)==0), equals(TRUE)) expect_that(all(round(c(modes$L[1]), 6)==0), equals(TRUE)) ## fluctuations (NOTE: Prody results are scaled here by the thermodynamic factor 3*k_B*T) flucts <- c( 1.379, 1.370, 1.108, 1.425, 1.044, 1.202, 1.315, 0.976, 0.855, 1.173 ) nowFlucts <- round(modes$fluctuations[1:10], 3) expect_that(nowFlucts, equals(flucts, tolerance=1e-6)) ## Covariance # vcov <- c( 0.368, 0.293, 0.118, 0.032, -0.019, 0.037, 0.032, -0.040, -0.039, -0.020 ) # nowVcov <- round(cov.nma(modes)[1, 2:11], 3) # expect_that(nowVcov, equals(vcov, tolerance=1e-6)) } ) bio3d/tests/testthat/test-dccm.R0000644000176200001440000000454414046015221016264 0ustar liggesuserscontext("Testing dccm functions") test_that("Correlation matrix from NMA", { ## Calculate correl mat on a small protein file <- system.file("examples/1hel.pdb",package="bio3d") invisible(capture.output(pdb <- read.pdb(file))) invisible(capture.output(modes <- nma(pdb))) invisible(capture.output(cm <- dccm.nma(modes, ncore=1))) expect_that(cm[1,1], equals(1, tolerance=1e-6)) expect_that(cm[1,2], equals(0.4380029, tolerance=1e-6)) expect_that(cm[1,3], equals(0.1407395, tolerance=1e-6)) expect_that(cm[1,3], equals(cm[3,1])) expect_that(sum(cm), equals(57.71768, tolerance=1e-6)) ## Check multicore DCCM invisible(capture.output(cm.mc <- dccm.nma(modes, ncore=NULL))) expect_that(cm, equals(cm.mc, tolerance=1e-6)) } ) test_that("Correlation matrix from XYZ (dccm.xyz)", { skip_on_cran() ## Calculate correl mat on a short HIV protease simulation trjfile <- system.file("examples/hivp.dcd", package="bio3d") invisible(capture.output(trj <- read.dcd(trjfile))) invisible(capture.output(cm <- dccm(trj, ncore=1))) expect_that(cm[1,1], equals(1, tolerance=1e-6)) expect_that(cm[1,2], equals(0.997, tolerance=1e-3)) expect_that(cm[1,3], equals(0.992, tolerance=1e-3)) expect_that(cm[1,3], equals(cm[3,1])) ## Check multicore DCCM skip_on_travis() invisible(capture.output(cm.mc <- dccm(trj, ncore=NULL))) expect_that(cm, equals(cm.mc, tolerance=1e-6)) }) test_that("Correlation matrix from PCA (dccm.pca)", { skip_on_cran() ## Calculate correl mat on a short HIV protease simulation trjfile <- system.file("examples/hivp.dcd", package="bio3d") invisible(capture.output(trj <- read.dcd(trjfile))) invisible(capture.output(xyz <- fit.xyz(trj[1, ], trj[1:20, ], 1:ncol(trj), 1:ncol(trj)) )) invisible(capture.output(pca <- pca.xyz(xyz))) invisible(capture.output(cm <- dccm(pca, ncore = 1))) pca$z <- NULL invisible(capture.output(cm2 <- dccm(pca, ncore = 1))) expect_that(cm[1,1], equals(1, tolerance=1e-6)) expect_that(cm[1,2], equals(0.627, tolerance=1e-3)) expect_that(cm[1,3], equals(0.632, tolerance=1e-3)) expect_that(cm[1,3], equals(cm[3,1])) expect_that(cm, equals(cm2, tolerance=1e-6)) ## Check multicore DCCM skip_on_travis() invisible(capture.output(cm.mc <- dccm(pca, ncore=NULL))) expect_that(cm, equals(cm.mc, tolerance=1e-6)) }) bio3d/tests/testthat/test-deformation.R0000644000176200001440000000374714046015221017671 0ustar liggesuserscontext("Testing deformation analysis") test_that("still works", { ## Simple test with PDB ID 1HEL file <- system.file("examples/1hel.pdb",package="bio3d") invisible(capture.output(pdb <- read.pdb(file))) invisible(capture.output(modes <- nma(pdb))) #sums0 <- c(59.89283, 141.39431, 109.09525, 122.52931, 172.63766, 317.01506) sums0 <- c(180.9078, 198.6242, 318.4639, 379.9139, 479.9795, 473.1810) defe <- deformation.nma(modes) expect_that(defe$sums[1:6], equals(sums0, tolerance=1e-6)) expect_that(defe$sums[1:6], equals(colSums(defe$ei[,1:6]), tolerance=1e-6)) }) test_that("fits with MMTK", { "calpha.mmtk" <- function(r, ...) { ## MMTK Units: kJ / mol / nm^2 a <- 128; b <- 8.6 * 10^5; c <- 2.39 * 10^5; ifelse( r<4.0, b*(r/10) - c, a*(r/10)^(-6) ) } ## Calc modes file <- system.file("examples/1hel.pdb",package="bio3d") invisible(capture.output(pdb <- read.pdb(file))) invisible(capture.output(modes <- nma(pdb, pfc.fun=calpha.mmtk, addter=FALSE, mmtk=TRUE))) ## deformation energies of mode 7 (using MMTK - with PDB id 1etl) #def.mmtk <- c(1306.17014108, 524.571239022, 66.6665951865, 820.62710645, # 154.703500149, 754.482784094, 382.993752804, 173.118373857, # 287.880418213, 205.968139938, 466.277540766, 814.845931887) def.mmtk <- c(38.416002, 9.468705, 36.652248, 23.372066, 28.379588, 22.746524, 35.267401, 58.006941, 48.556190, 46.155725, 92.189766, 75.059341) ## calc deformation energies defe <- deformation.nma(modes, mode.inds=seq(7,26), pfc.fun=calpha.mmtk) expect_that(defe$ei[1:12,1], equals(def.mmtk, tolerance=1e-6)) # mode 8 def.mmtk <- c(92.87263, 142.04833, 208.63627, 77.01778) expect_that(head(defe$ei[,2], n=4), equals(def.mmtk, tolerance=1e-6)) #mode 9 def.mmtk <- c(250.2483, 183.0401, 362.0342, 255.6288) expect_that(head(defe$ei[,3], n=4), equals(def.mmtk, tolerance=1e-6)) }) bio3d/tests/testthat/test-pdb.annotate.R0000644000176200001440000000502214046015221017723 0ustar liggesuserscontext("Testing pdb.annotate()") test_that("PDB annotation works", { skip_on_cran() skip_on_travis() expected <- c('3R1C_X', '3R1C_B', '3R1C_C', '3R1C_D', '3R1C_E', '3R1C_F', '3R1C_G', '3R1C_H', '3R1C_I', '3R1C_J', '3R1C_K', '3R1C_L', '3R1C_M', '3R1C_N', '3R1C_O', '3R1C_P', '3R1C_Q', '3R1C_R', '3R1C_S', '3R1C_Y', '3R1C_T', '3R1C_U', '3R1C_W', '3R1C_A', '3R1C_V', '3R1C_Z', '3R1C_a', '3R1C_b', '3R1C_c', '3R1C_d', '3R1C_e', '3R1C_f', '3R1C_g', '3R1C_h', '3R1C_i', '3R1C_j') invisible(capture.output(anno <- pdb.annotate(expected))) expect_identical(rownames(anno), expected) expected <- c('3R1C_A', '3R1C_a', '3R1C_B', '3R1C_b', '3R1C_C', '3R1C_c', '3R1C_D', '3R1C_d', '3R1C_E', '3R1C_e', '3R1C_F', '3R1C_f', '3R1C_G', '3R1C_g', '3R1C_H', '3R1C_h', '3R1C_I', '3R1C_i', '3R1C_J', '3R1C_j', '3R1C_K', '3R1C_L', '3R1C_M', '3R1C_N', '3R1C_O', '3R1C_P', '3R1C_Q', '3R1C_R', '3R1C_S', '3R1C_Y', '3R1C_T', '3R1C_U', '3R1C_W', '3R1C_X', '3R1C_V', '3R1C_Z') invisible(capture.output(anno <- pdb.annotate('3R1C'))) expect_identical(rownames(anno), expected) expected <- c('3R1C_A', '3R1C_a', '3R1C_B', '3R1C_b', '3R1C_C', '3R1C_c', '3R1C_D', '3R1C_d', '3R1C_E', '3R1C_e', '3R1C_F', '3R1C_f', '3R1C_G', '3R1C_g', '3R1C_H', '3R1C_h', '3R1C_I', '3R1C_i', '3R1C_J', '3R1C_j', '3R1C_K', '3R1C_L', '3R1C_M', '3R1C_N', '3R1C_O', '3R1C_P', '3R1C_Q', '3R1C_R', '3R1C_S', '3R1C_Y', '3R1C_T', '3R1C_U', '3R1C_W', '3R1C_X', '3R1C_V', '3R1C_Z', '1CDK_A', '1CDK_B', '1CDK_I', '1CDK_J') invisible(capture.output(anno <- pdb.annotate(c('3R1C', '1CDK')))) expect_identical(rownames(anno), expected) expect_warning( invisible(capture.output(anno <- pdb.annotate(c('3R1C_A', '3r1c_a', '3r1c_q')))) ) expect_identical(rownames(anno), expected[c(1, 2)]) invisible(capture.output(anno <- pdb.annotate(c('3R1C_A', '3r1c_a'), unique=TRUE))) expect_identical(rownames(anno), "3R1C") expect_identical(anno$chainId, "A;a") expected <- sort(rep(c("ANP", "MN (2)", "MYR"), 2)) invisible(capture.output(anno <- pdb.annotate(c('1cdk_A', '1cdk_B'), anno.terms="ligandId"))) expect_identical(sort(unlist(strsplit(anno$ligandId, ","))), expected) }) bio3d/tests/testthat/test-core.find.R0000644000176200001440000000152614046015221017222 0ustar liggesuserscontext("Testing core.find function") test_that("core.find() works properly", { skip_on_cran() attach(transducin) inds <- unlist(lapply(c("1TND_A", "1TAG", "1AS0", "1AS2"), grep, pdbs$id)) pdbs <- trim.pdbs(pdbs, row.inds=inds) invisible(capture.output(core <- core.find(pdbs, ncore=1))) resnos.1 <- c(202, 206, 209, 205, 203, 201) resnos.2 <- c(332, 334, 335, 336, 337, 340) expect_equal(length(core$resno), 313) expect_equal(resnos.1, as.numeric(core$resno[1:6])) expect_equal(resnos.2, as.numeric(tail(core$resno))) xyz <- c(16, 17, 18, 19, 20, 21, 25, 26, 27, 34) expect_equal(xyz, core$xyz[1:10]) expect_equal(sum(core$xyz), 234006) ## Check multicore skip_on_travis() invisible(capture.output(core.mc <- core.find(pdbs, ncore=NULL))) expect_identical(core, core.mc) detach(transducin) }) bio3d/tests/testthat/test-aa2mass.R0000644000176200001440000000137314046015221016702 0ustar liggesuserscontext("Testing aa2mass()") test_that("Amino acid mass tests", { ## Simple test sequ <- c("ALA", "LYS", "TPO") masses <- c(71.078, 129.180, 181.084) expect_that(aa2mass(sequ, addter=FALSE, mmtk=FALSE, mass.custom=NULL), equals(masses, tolerance=1e-6)) ## With Terminal atoms added masses <- c(72.08594, 129.18000, 198.09134) expect_that(aa2mass(sequ, addter=TRUE, mmtk=FALSE, mass.custom=NULL), equals(masses, tolerance=1e-6)) ## With 'custom' residues sequ <- c("MLY", "HMM", "UNK") masses <- c(156.225, 10.000, 20.001) expect_that(aa2mass(sequ, addter=FALSE, mmtk=FALSE, mass.custom=list(HMM=10, UNK=20.001)), equals(masses, tolerance=1e-6)) } ) bio3d/tests/testthat/test-seqaln.R0000644000176200001440000000243014046015221016631 0ustar liggesuserscontext("Testing seqaln") test_that("seqaln works", { skip_on_cran() skip_on_travis() ## seqaln with one sequence. should remove gaps seqs <- c("X", "-", "-", "A", "C", "A", "G", "K", "-") suppressWarnings( aln <- seqaln(seqs) ) expected <- c("X", "A", "C", "A", "G", "K") expect_identical(c(aln$ali), expected) ## align two sequences seqs <- seqbind(seqs, c("C", "A", "G", "G", "A", "G", "K")) aln <- seqaln(seqs) expected <- seqbind(c("-", "X", "A", "C", "A", "G", "K"), c("C", "A", "G", "G", "A", "G", "K")) expect_identical(aln$ali, expected$ali) ## add a sequence to the (profile) alignment seq <- c("G", "A", "G", "K", "-") aln <- seqaln(seq, profile=aln) rownames(aln$ali) <- paste0("seq", 1:3) expected <- seqbind(c("-", "X", "A", "C", "A", "G", "K", "-"), c("C", "A", "G", "G", "A", "G", "K", "-"), c("-", "-", "-", "G", "A", "G", "K", "-")) expect_identical(aln$ali, expected$ali) ## test 'msa' option capture.output( seqs <- get.seq(c("4q21_A", "1ftn_A"), outfile=tempfile()) ) aln <- seqaln(seqs, outfile=tempfile()) aln2 <- seqaln(seqs, outfile=tempfile(), exefile="msa") aln$call <- NULL; aln2$call <- NULL expect_identical(aln, aln2) }) bio3d/tests/testthat/test-overlap.R0000644000176200001440000000330414046015221017017 0ustar liggesusers context("Testing overlap functions") test_that("Overlap functions", { ## Simple test with PDB ID 1HEL file <- system.file("examples/1hel.pdb",package="bio3d") invisible(capture.output(pdb.a <- read.pdb(file))) file <- system.file("examples/1dpx.pdb",package="bio3d") invisible(capture.output(pdb.b <- read.pdb(file))) ## Calculate modes with default arguments invisible(capture.output(modes <- nma(pdb.a, inds=NULL, ff='calpha', mass=FALSE, temp=300.0))) ca.inds.a <- atom.select(pdb.a, "calpha", verbose=FALSE) ca.inds.b <- atom.select(pdb.b, "calpha", verbose=FALSE) ## Set new coordinates of pdb.b xyz.b <- fit.xyz(pdb.a$xyz, pdb.b$xyz, fixed.inds=ca.inds.a$xyz, mobile.inds=ca.inds.b$xyz) pdb.b$xyz <- xyz.b ## difference vector dv <- difference.vector(rbind(pdb.a$xyz[ca.inds.a$xyz], pdb.b$xyz[ca.inds.b$xyz])) o1 <- overlap(modes, dv, nmodes=(modes$natoms*3)-6) expect_that(o1$overlap.cum[(modes$natoms*3)-6], equals(1, tolerance=1e-6)) expect_that(o1$overlap.cum[1], equals(0.2786508, tolerance=1e-6)) o2 <- overlap(modes$U[,7:26], dv) expect_that(all((round(o1$overlap[1:20] - o2$overlap, 10)==0)), equals(TRUE)) ## Calculate modes with default arguments invisible(capture.output(modes.b <- nma(pdb.b, inds=NULL, ff='calpha', mass=FALSE, temp=300.0))) r <- rmsip(modes, modes.b) expect_that(r$overlap[1,1], equals(0.704, tolerance=1e-6)) expect_that(r$overlap[1,2], equals(0.286, tolerance=1e-6)) expect_that(r$overlap[2,1], equals(0.289, tolerance=1e-6)) } ) bio3d/tests/testthat/test-get.seq.R0000644000176200001440000001063414046015221016721 0ustar liggesuserscontext("Testing get.seq()") test_that("get.seq() works properly", { skip_on_cran() skip_on_travis() outfile <- tempfile() # NR # Use mixed RefSeq, Uniprot, and PDB Accession. ids <- c("NP_851365", "P62873", "1L3R_E", "5P21_A") capture.output( seqs <- get.seq(ids, outfile=outfile, db='nr') ) expect_equal(length(seqs$id), 4) expect_identical(head(seqs$ali[1,]), c('M','G','A','G','A','S')) expect_identical(head(seqs$ali[2,]), c('M','S','E','L','D','Q')) expect_identical(head(seqs$ali[3,]), c('G','N','A','A','A','A')) expect_identical(head(seqs$ali[4,]), c('M','T','E','Y','K','L')) unlink(outfile) Sys.sleep(5) # NR # Retrieved IDs may be different from the query; shoot warning # In the following, a GI number is converted to a PDB code. ids <- c("829581541") expect_warning( capture.output(seqs <- get.seq(ids, outfile=outfile, db='nr')) ) expect_equal(length(seqs$id), 1) expect_identical(seqs$id, c("pdb|4TND|A")) expect_identical(head(seqs$ali[1,]), c('M','E','L','E','N','I')) unlink(outfile) Sys.sleep(5) # NR # Another example that retrieved ID changes is when query ID is from # a different database. 5X3X has both "A" and "a" chains in PDB. # But in 'nr', they are coded as "A" and "AA". # But the server behaves weirdly in this case: # - input '5X3X_A' or '5X3X_a' (bio3d calls toupper() internally) # gives either A or AA randomly. # - input '5X3X_AA' does not work anymore. # # Comment out because of the random behavior #ids <- c("5X3X_A", "5X3X_a", "5X3X_AA") #expect_warning( seqs <- get.seq(ids, outfile=outfile, db='nr') ) #expect_equal(length(seqs$id), 1) #expect_identical(seqs$id, c("pdb|5X3X|AA")) #expect_identical(head(seqs$ali[1,]), c('M','T','P','I','L','A')) #unlink(outfile) #Sys.sleep(5) # NR # Some wrong IDs. # OK, wrong chain ID, typo ids <- c("4Q21_A", "1TND_E", "1L3_E") expect_warning( capture.output(seqs <- get.seq(ids, outfile=outfile, db='nr')) ) expect_true(is.logical(seqs)) expect_equivalent(seqs, c(FALSE, TRUE, TRUE)) unlink(outfile) Sys.sleep(5) # EBI - uniprot/swissprot ids <- c("P11488", "P62873", "TCPA_YEAST") capture.output( seqs <- get.seq(ids, outfile=outfile, db='uniprot') ) expect_equal(length(seqs$id), 3) expect_identical(head(seqs$ali[1, ]), c('M','G','A','G','A','S')) expect_identical(head(seqs$ali[2, ]), c('M','S','E','L','D','Q')) expect_identical(head(seqs$ali[3, ]), c('M','S','Q','L','F','N')) unlink(outfile) Sys.sleep(5) # EBI - pdb ids <- c("1TAG_A", "1TND_B", "3J3Q_0") capture.output( seqs <- get.seq(ids, outfile=outfile, db='pdb') ) expect_equal(length(seqs$id), 3) expect_identical(head(seqs$ali[1,]), c('A','R','T','V','K','L')) expect_identical(tail(seqs$ali[2,]), c('K','D','C','G','L','F')) expect_identical(head(seqs$ali[3,]), c('P','I','V','Q','N','L')) unlink(outfile) Sys.sleep(5) # EBI - pdb # Double-letter chain IDs are not supported. # So, for example, "3J3Q_10", "3J3Q_aA" etc. do not work. # # ids <- c("3J3Q_10", "3J3Q_aA", "3J3Q_0") # expect_warning( seqs <- get.seq(ids, outfile=outfile, db='pdb') ) # expect_true(is.logical(seqs)) # expect_equivalent(seqs, c(TRUE, TRUE, FALSE)) # # Smaller case chain IDs are not supported (because the internal # case conversion in get.seq(); Does the server supports smaller cases?) # # Not all chains are available from the server: # ids <- c("3J3Q_A") # expect_error( seqs <- get.seq(ids, outfile=outfile, db='pdb') ) # # In the following, the result will be constantly "A" (not random as NCBI) # ids <- c("5X3X_A") # seqs <- get.seq(ids, outfile=outfile, db='pdb') # # Returns all capital cases only # ids <- c("5X3X") # seqs <- get.seq(ids, outfile=outfile, db='pdb') # EBI - uniprot/swissprot # One of the ids is wrong. # Note: all sequences after the wrong id will not be retrieved. # The behavior for 'pdb' is different: only wrong ids are not retrieved. ids <- c("P11488", "P62873", "P999") expect_warning(capture.output(seqs <- get.seq(ids, outfile=outfile, db='uniprot'))) expect_true(is.logical(seqs)) expect_equivalent(seqs, c(FALSE, FALSE, TRUE)) unlink(outfile) Sys.sleep(5) # EBI # All ids are wrong - choose wrong database ids <- c("1TAG_A", "1TND_B") expect_error( capture.output(seqs <- get.seq(ids, outfile=outfile, db='uniprot')) ) unlink(outfile) }) bio3d/tests/testthat/test-aanma.R0000644000176200001440000001561714046015221016436 0ustar liggesuserscontext("Testing aanma()") test_that("aanma based all-atom NMA works", { skip_on_cran() # skip_on_travis() "mysign" <- function(a,b) { if(all(sign(a)==sign(b))) return(1) else return(-1) } ## Simple test with PDB ID 1HEL file <- system.file("examples/1hel.pdb",package="bio3d") invisible(capture.output(pdb <- read.pdb(file))) ## Calculate modes with default arguments invisible(capture.output(modes <- aanma(pdb, pfc.fun=load.enmff('aaenm2'), mass=TRUE, temp=300.0))) ## Check first eigenvector U7 <- c(-0.066793729, -0.053883268, 0.001891979, -0.036738304, -0.047565978, 0.001753576) nowU7 <- head(modes$U[,7]) expect_that(nowU7 * mysign(U7, nowU7), equals(U7, tolerance=1e-4)) ## Check second eigenvector U8 <- c(-0.0006820437, -0.0063015252, -0.0172583581, -0.0208773865, -0.0077078236, -0.0197741642) nowU8 <- head(modes$U[,8]) expect_that(nowU8 * mysign(U8, nowU8), equals(U8, tolerance=1e-4)) ## Check eigenvalues eival <- c(0.012147, 0.016651, 0.025490, 0.034212, 0.040073, 0.048434) nowEival <- modes$L[7:12] expect_that(nowEival, equals(eival, tolerance=1e-4)) ## Dimensions expect_that(dim(modes$U), equals(c(387, 387))) expect_that(dim(modes$modes), equals(c(387, 387))) expect_that(length(modes$L), equals(387)) expect_that(length(modes$frequencies), equals(387)) expect_that(length(modes$mass), equals(129)) expect_that(modes$natoms, equals(129)) expect_that(modes$temp, equals(300)) ## Orthognals tmpU <- crossprod(modes$U, modes$U) expect_true(all(round(diag(tmpU), 6)==1)) expect_true(all(round(tmpU[upper.tri(tmpU)], 6)==0)) expect_that(all(round(c(modes$L[1:6]), 6)==0), equals(TRUE)) ################################################################### # # Test with reduced = TRUE # ################################################################### ## Calculate modes invisible(capture.output(modes <- aanma(pdb, pfc.fun=load.enmff('aaenm2'), mass=TRUE, temp=300.0, reduced=TRUE))) ## Check first eigenvector U7 <- c(-0.059992473, -0.053860808, 0.002632462, -0.038492062, -0.060252657, 0.002212016) nowU7 <- head(modes$U[,7]) expect_that(nowU7 * mysign(U7, nowU7), equals(U7, tolerance=1e-4)) ## Check second eigenvector U8 <- c(-0.008837969, -0.003401558, 0.018160517, 0.018834639, -0.002279249, 0.022343009) nowU8 <- head(modes$U[,8]) expect_that(nowU8 * mysign(U8, nowU8), equals(U8, tolerance=1e-4)) ## Check eigenvalues eival <- c(0.005865, 0.007781, 0.010644, 0.015755, 0.019162, 0.020037) nowEival <- modes$L[7:12] expect_that(nowEival, equals(eival, tolerance=1e-4)) ## Orthognals tmpU <- crossprod(modes$U, modes$U) expect_true(all(round(diag(tmpU), 6)==1)) expect_true(all(round(tmpU[upper.tri(tmpU)], 6)==0)) expect_that(all(round(c(modes$L[1:6]), 6)==0), equals(TRUE)) ################################################################### # # Test with rtb = TRUE # ################################################################### ## Calculate modes invisible(capture.output(modes <- aanma(pdb, pfc.fun=load.enmff('aaenm2'), mass=TRUE, temp=300.0, rtb=TRUE))) ## Check first eigenvector U7 <- c(0.067011206, 0.053922543, -0.001093240, 0.036319837, 0.047227389, -0.001719102) nowU7 <- head(modes$U[,7]) expect_that(nowU7 * mysign(U7, nowU7), equals(U7, tolerance=1e-4)) ## Check second eigenvector U8 <- c(0.0007543764, 0.0061986220, 0.0164859315, 0.0207461840, 0.0078183773, 0.0195714639) nowU8 <- head(modes$U[,8]) expect_that(nowU8 * mysign(U8, nowU8), equals(U8, tolerance=1e-4)) ## Check eigenvalues eival <- c(0.012450, 0.017159, 0.026374, 0.037100, 0.041601, 0.050559) nowEival <- modes$L[7:12] expect_that(nowEival, equals(eival, tolerance=1e-4)) ## Orthognals tmpU <- crossprod(modes$U, modes$U) expect_true(all(round(diag(tmpU), 6)==1)) expect_true(all(round(tmpU[upper.tri(tmpU)], 6)==0)) expect_that(all(round(c(modes$L[1:6]), 6)==0), equals(TRUE)) ################################################################### # # Test with outmodes = 'noh' # ################################################################### ## Calculate modes invisible(capture.output(modes <- aanma(pdb, pfc.fun=load.enmff('aaenm2'), mass=TRUE, temp=300.0, outmodes='noh'))) ## Check first eigenvector U7 <- c(0.0218632, 0.02019693, -0.002396826, 0.01873891, 0.01699585, -0.001568454) nowU7 <- head(modes$U[,7]) expect_that(nowU7 * mysign(U7, nowU7), equals(U7, tolerance=1e-4)) ## Check second eigenvector U8 <- c(0.009318529, 0.001879826, -0.005183737, 0.007078334, 0.0008036141, -0.003830362) nowU8 <- head(modes$U[,8]) expect_that(nowU8 * mysign(U8, nowU8), equals(U8, tolerance=1e-4)) ## Check eigenvalues eival <- c(0.011278, 0.013931, 0.01582, 0.023749, 0.030427, 0.039051) nowEival <- modes$L[7:12] expect_that(nowEival, equals(eival, tolerance=1e-4)) ## Dimensions expect_that(dim(modes$U), equals(c(3003, 3003))) expect_that(dim(modes$modes), equals(c(3003, 3003))) expect_that(length(modes$L), equals(3003)) expect_that(length(modes$frequencies), equals(3003)) expect_that(length(modes$mass), equals(1001)) expect_that(modes$natoms, equals(1001)) expect_that(modes$temp, equals(300)) ## Orthognals tmpU <- crossprod(modes$U[, 1:300], modes$U[, 1:300]) expect_true(all(round(diag(tmpU), 6)==1)) expect_true(all(round(tmpU[upper.tri(tmpU)], 6)==0)) expect_that(all(round(c(modes$L[1:6]), 6)==0), equals(TRUE)) ################################################################### # # Test with outmodes = 'noh' and rtb = TRUE # ################################################################### ## Calculate modes invisible(capture.output(modes <- aanma(pdb, pfc.fun=load.enmff('aaenm2'), mass=TRUE, temp=300.0, outmodes='noh', rtb=TRUE))) ## Check first eigenvector U7 <- c(-0.0229911, -0.02044615, 0.002491489, -0.01944523, -0.01711079, 0.001397449) nowU7 <- head(modes$U[,7]) expect_that(nowU7 * mysign(U7, nowU7), equals(U7, tolerance=1e-4)) ## Check second eigenvector U8 <- c(-0.005763786, -8.247862e-06, 0.00534345, -0.003811432, 0.000763913, 0.003948311) nowU8 <- head(modes$U[,8]) expect_that(nowU8 * mysign(U8, nowU8), equals(U8, tolerance=1e-4)) ## Check eigenvalues eival <- c(0.011579, 0.014595, 0.016808, 0.024449, 0.032666, 0.040224) nowEival <- modes$L[7:12] expect_that(nowEival, equals(eival, tolerance=1e-4)) ## Orthognals tmpU <- crossprod(modes$U[, 1:300], modes$U[, 1:300]) expect_true(all(round(diag(tmpU), 6)==1)) expect_true(all(round(tmpU[upper.tri(tmpU)], 6)==0)) expect_that(all(round(c(modes$L[1:6]), 6)==0), equals(TRUE)) }) bio3d/tests/testthat/test-aanma.pdbs.R0000644000176200001440000001401014046015221017347 0ustar liggesuserscontext("Testing aanma.pdbs()") test_that("aanma based eNMA works", { ## commented lines: ## update after changing from ff=aaenm to ff=aaenm2 ## new mass weighting approach (~may 2016) ## test updated 24-08-16 skip_on_cran() skip_on_travis() "mysign" <- function(a,b) { if(all(sign(a)==sign(b))) return(1) else return(-1) } pdbdir <- tempdir() invisible( capture.output( capture.output(pdbfiles <- get.pdb(c("1TND_A", "1TAG", "1AS0", "1AS2"), path=pdbdir, split=TRUE), type="message") )) invisible( capture.output(aln <- pdbaln(pdbfiles)) ) invisible( capture.output(pdbs <- read.all(aln)) ) gaps <- gap.inspect(pdbs$xyz) ## Calc modes (use default forcefield aanma2) invisible(capture.output(modes <- aanma.pdbs(pdbs, pfc.fun=load.enmff("aaenm2"), ncore=1))) ## check dimensions expect_that(dim(modes$U), equals(c(939, 933, 4))) expect_that(dim(modes$L), equals(c(4, 933))) expect_that(dim(modes$fluctuations), equals(c(4, 313))) expect_that(dim(modes$rmsip), equals(c(4, 4))) ## structure 1- mode1: ## U1 <- c(0.04766153, -0.007993432, -0.06513697, 0.04313399, -0.008026397, -0.03755748) U1 <- c(0.04785697, -0.007613113, -0.063552590, 0.043594060, -0.007665827, -0.037405791) nowU1 <- head(modes$U.subspace[,1,1], n=6) expect_that(nowU1 * mysign(U1, nowU1), equals(U1, tolerance=1e-4)) ## structure 1- mode2: ## U2 <- c(0.01151413, -0.01098311, -0.05809988, 0.006112359, -0.0164621, -0.04298916) U2 <- c(-0.01051829, 0.01169047, 0.05700469, -0.00545407, 0.01683833, 0.04307286) nowU2 <- head(modes$U.subspace[,2,1], n=6) expect_that(nowU2 * mysign(U2, nowU2), equals(U2, tolerance=1e-4)) ## structure 4- mode3: ##U3 <- c(-0.1188249, -0.05850153, 0.02082409, -0.09123394, -0.02270938, 0.00987617) U3 <- c(0.113108253, 0.057547242, -0.013566069, 0.088356656, 0.025218140, -0.006994051) nowU3 <- head(modes$U.subspace[,3,4], n=6) expect_that(nowU3 * mysign(U3, nowU3), equals(U3, tolerance=1e-4)) ## structure 4-mode1 - tail: ## U1 <- c(0.009886232, -0.0006358995, -0.05189479, 0.009095127, 0.0005291993, -0.06936025) U1 <- c(1.008168e-02, -7.579627e-05, -5.113142e-02, 8.872045e-03, 1.126475e-03, -6.340656e-02) nowU1 <- tail(modes$U.subspace[,1,4], n=6) expect_that(nowU1 * mysign(U1, nowU1), equals(U1, tolerance=1e-4)) ## Fluctuations: ## f1 <- c(0.4259852, 0.3173786, 0.2339003, 0.2126361, 0.1965271, 0.1865991) ## f2 <- c(0.5467513, 0.4003687, 0.2712613, 0.2266669, 0.2006127, 0.1855429) ## f4 <- c(0.8295543, 0.4094441, 0.281545, 0.2527504, 0.2091488, 0.1931585) f1 <- c(0.2937191, 0.2410464, 0.1696626, 0.1553645, 0.1328955, 0.1237624) f2 <- c(0.4076411, 0.3114183, 0.2020671, 0.1662545, 0.1409823, 0.1274508) f4 <- c(0.6278258, 0.3151669, 0.2104897, 0.1819106, 0.1426998, 0.1333115) expect_that(modes$fluctuations[1,1:6], equals(f1, tolerance=1e-3)) expect_that(modes$fluctuations[2,1:6], equals(f2, tolerance=1e-3)) expect_that(modes$fluctuations[4,1:6], equals(f4, tolerance=1e-3)) ## Orthognal expect_that(as.numeric(modes$U.subspace[,1,1] %*% modes$U.subspace[,1,1]), equals(1, tolerance=1e-6)) expect_that(as.numeric(modes$U.subspace[,1,1] %*% modes$U.subspace[,2,1]), equals(0, tolerance=1e-6)) ## RMSIP ## rmsips <- c(1.0000, 0.8988234, 0.9627764, 0.915605) rmsips <- c(1.0000, 0.8927, 0.9600, 0.9158) expect_that(as.vector(modes$rmsip[1,]), equals(rmsips, tolerance=1e-3)) ## Multicore (same arguments as above!) invisible(capture.output(mmc <- aanma.pdbs(pdbs, pfc.fun=load.enmff("aaenm2"), ncore=NULL))) expect_that(mmc$fluctuations, equals(modes$fluctuations, tolerance=1e-6)) expect_that(mmc$U.subspace, equals(modes$U.subspace, tolerance=1e-6)) ## Calc modes with rm.gaps=FALSE invisible(capture.output(modes <- aanma.pdbs(pdbs, pfc.fun=load.enmff("aaenm2"), rm.gaps=FALSE, ncore=NULL))) ## structure 1-mode1 - tail: ## U1 <- c(-0.05024617, 0.009081938, 0.01764626, -0.09325497, 0.01754876, 0.01996309) U1 <- c(0.051308400, -0.008862397, -0.017957255, 0.085623903, -0.015406574, -0.018774554) nowU1 <- tail(modes$U.subspace[,1,1], n=6) expect_that(nowU1 * mysign(U1, nowU1), equals(U1, tolerance=1e-4)) ## structure 2-mode1 - tail: ## U1 <- c(0.008412425, -0.005413275, -0.06655021, NA, NA, NA) U1 <- c(0.007581776, -0.005342612, -0.060598339, NA, NA, NA) nowU1 <- modes$U.subspace[940:945,1,2] U1[is.na(U1)] <- 0 nowU1[is.na(nowU1)] <- 0 expect_that(nowU1 * mysign(nowU1, U1), equals(U1, tolerance=1e-4)) ## fluctuations na.expected <- c(3, 4, 1258, 1259, 1262, 1263, 1266, 1267, 1268, 1270, 1271, 1272, 1274, 1275, 1276, 1278, 1279, 1280, 1282, 1283, 1284, 1286, 1287, 1288, 1290, 1291, 1292) expect_that(which(is.na(modes$fluctuations)), equals(na.expected)) ## f1 <- c(0.9114199, 0.4010512, 0.2977837, 0.2202269) ## f4 <- c(0.4401748, 0.5743443, 0.6644086, rep(NA, 7)) f1 <- c(0.6954173, 0.2722280, 0.2242001, 0.1581307) f4 <- c(0.3369227, 0.4506579, 0.5365029, rep(NA, 7)) expect_that(modes$fluctuations[1,1:4], equals(f1, tolerance=1e-3)) expect_that(tail(modes$fluctuations[4,], n=10), equals(f4, tolerance=1e-3)) ## Calc modes with mass=FALSE and temp=NULL -- use aaenm (not default ff) invisible(capture.output(modes <- aanma.pdbs(pdbs, pfc.fun=load.enmff("aaenm"), mass=FALSE, temp=NULL, ncore=NULL))) ## structure 1- mode1: U1 <- c(0.04185427, -0.007185472, -0.05865138, 0.04704491, -0.009310229, -0.0432674) nowU1 <- head(modes$U.subspace[,1,1], n=6) expect_that(nowU1 * mysign(U1, nowU1), equals(U1, tolerance=1e-4)) ## structure 1- mode2: U2 <- c(-0.006541777, 0.01006403, 0.04607164, -0.00293836, 0.01800689, 0.043626) nowU2 <- head(modes$U.subspace[,2,1], n=6) expect_that(nowU2 * mysign(U2, nowU2), equals(U2, tolerance=1e-4)) ## structure 4- mode3: U3 <- c(-0.09327228, -0.04605804, 0.01065858, -0.08065877, -0.02255212, 0.005277435) nowU3 <- head(modes$U.subspace[,3,4], n=6) expect_that(nowU3 * mysign(U3, nowU3), equals(U3, tolerance=1e-4)) }) bio3d/tests/testthat/test-mol2.R0000644000176200001440000000514514046015221016225 0ustar liggesuserscontext("Testing basic PDB structure operation") test_that("read.mol2() reads a mol2 from zinc", { ## Simple test with aspirin file <- system.file("examples/aspirin.mol2",package="bio3d") invisible(capture.output(mol <- read.mol2(file))) expect_is(mol$atom, "data.frame") expect_true(inherits(mol, "mol2")) expect_true(inherits(mol$xyz, "xyz")) expect_equal(nrow(mol$atom), 20) expect_equal(nrow(mol$bond), 20) expect_equal(mol$info[1], 20) expect_equal(mol$info[2], 20) expect_equal(sum(mol$atom$elety=="H"), 7) elena <- c("C1", "C2", "O1", "O2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "O3", "O4", "H1", "H2", "H3", "H4", "H5", "H6", "H7") expect_equal(mol$atom$elena, elena) x <- c(-1.4238, -1.3441, -1.4532, -1.1519, -0.9822) y <- c(-2.5790, -3.9491, -4.7933, -4.2739, -2.8882) z <- c(0.6434, 0.0976, 0.0938, 0.0032, -0.0844) expect_equal(mol$atom$x[1:5], x) expect_equal(mol$atom$y[6:10], y) expect_equal(mol$atom$z[16:20], z) }) test_that("read.mol2() reads and stores data properly", { skip_on_cran() skip_on_travis() file <- system.file("examples/aspirin.mol2",package="bio3d") invisible(capture.output(mol <- read.mol2(file))) f <- tempfile() write.mol2(mol, file=f) mol2 <- read.mol2(f) expect_equal(mol, mol2) }) test_that("basic atom select and trim of mol2", { skip_on_cran() skip_on_travis() file <- system.file("examples/aspirin.mol2",package="bio3d") invisible(capture.output(mol <- read.mol2(file))) capture.output( sele <- atom.select(mol, "noh") ) expect_equal(length(sele$atom), 13) capture.output( sele <- atom.select(mol, elety="H") ) expect_equal(length(sele$atom), 7) capture.output( sele <- atom.select(mol, elena="C1") ) expect_equal(length(sele$atom), 1) capture.output( sele <- atom.select(mol, resno=1) ) expect_equal(length(sele$atom), 20) capture.output( sele <- atom.select(mol, "noh") ) mol2 <- trim(mol, sele) expect_equal(nrow(mol2$atom), 13) expect_equal(nrow(mol2$bond), 13) expect_equal(length(mol2$xyz), 39) xyz <- c(-1.4238, 1.4221, 1.2577, -1.3441, -0.0813) expect_equal(mol2$xyz[1:5], xyz) }) test_that("converting mol2 to pdb works", { skip_on_cran() skip_on_travis() file <- system.file("examples/aspirin.mol2",package="bio3d") invisible(capture.output(mol <- read.mol2(file))) capture.output( pdb <- as.pdb(mol) ) expect_equal(nrow(pdb$atom), nrow(mol$atom)) expect_equal(pdb$xyz, mol$xyz) expect_equal(mol$atom$elena, pdb$atom$elety) expect_equal(mol$atom$x, pdb$atom$x) expect_equal(mol$atom$charge, pdb$atom$charge) }) bio3d/tests/testthat/test-clean.pdb.R0000644000176200001440000000565414046015221017207 0ustar liggesuserscontext("Testing the utility function clean.pdb()") test_that("clean.pdb() does nothing for 'clean' pdb by default", { file <- system.file("examples/1dpx.pdb", package="bio3d") invisible(capture.output(pdb <- read.pdb(file))) suppressWarnings( invisible(capture.output(npdb <- clean.pdb(pdb))) ) expect_true(is.null(npdb$log)) npdb$call <- NULL npdb$log <- NULL pdb$call <- NULL expect_equal(pdb, npdb) }) test_that("clean.pdb() does renumbering properly", { skip_on_cran() skip_on_travis() suppressWarnings( invisible(capture.output(pdb <- read.pdb("1tag"))) ) invisible(capture.output(npdb <- clean.pdb(pdb, force.renumber = TRUE))) resno <- npdb$atom[npdb$calpha, "resno"] expect_equal(resno[1:10], 1:10) # A PDB with 'insert' residues: Should do automatic renumbering invisible(capture.output(pdb <- read.pdb("1a7l"))) invisible(capture.output(npdb <- clean.pdb(pdb))) resno <- npdb$atom[npdb$calpha, "resno"] expect_equal(resno[1:10], 1:10) # Renumbering for each chain invisible(capture.output(npdb <- clean.pdb(pdb, consecutive = FALSE))) resno <- npdb$atom[npdb$calpha, "resno"] chain <- npdb$atom[npdb$calpha, "chain"] expect_equal(resno[chain=="B"][1:10], 1:10) # Is SSE update correct? invisible(capture.output(ss <- pdb2sse(pdb))) invisible(capture.output(nss <- pdb2sse(npdb))) expect_equal(as.character(ss), as.character(nss)) } ) test_that("clean.pdb() relabels chains properly (fix.chain = TRUE)", { file <- system.file("examples/1dpx.pdb", package="bio3d") invisible(capture.output(pdb <- read.pdb(file))) # remove chain ID pdb$atom[, "chain"] <- as.character(NA) pdb$helix$chain <- "" pdb$sheet$chain <- "" suppressWarnings( invisible(capture.output(npdb <- clean.pdb(pdb, fix.chain = TRUE))) ) expect_equal(npdb$atom[npdb$calpha, "chain"], rep("A", sum(npdb$calpha))) # A case with wrong chain labels but consecutive residue numbering file <- system.file("examples/hivp.pdb", package="bio3d") invisible(capture.output(pdb0 <- read.pdb(file))) # Manually renumbering all residues pdb <- pdb0 pdb$atom[, "resno"] <- vec2resno(1:sum(pdb$calpha), paste(pdb$atom[, "resno"], pdb$atom[, "chain"], sep = "_") ) # Label both chains as "A" pdb$atom[, "chain"] <- "A" # Update SSE pdb$helix$start[pdb$helix$chain=='B'] <- pdb$helix$start[pdb$helix$chain=='B'] + 99 pdb$helix$end[pdb$helix$chain=='B'] <- pdb$helix$end[pdb$helix$chain=='B'] + 99 pdb$sheet$start[pdb$sheet$chain=='B'] <- pdb$sheet$start[pdb$sheet$chain=='B'] + 99 pdb$sheet$end[pdb$sheet$chain=='B'] <- pdb$sheet$end[pdb$sheet$chain=='B'] + 99 pdb$helix$chain[] <- 'A' pdb$sheet$chain[] <- 'A' suppressWarnings( invisible(capture.output(npdb <- clean.pdb(pdb, consecutive = FALSE, force.renumber = TRUE, fix.chain = TRUE))) ) pdb0$call <- NULL npdb$call <- NULL npdb$log <- NULL expect_equal(pdb0, npdb) } ) bio3d/tests/testthat/test-fitting.R0000644000176200001440000001063314046015221017016 0ustar liggesuserscontext("Testing fitting functions") test_that("Fitting still works", { ## Test fit.xyz / gap.inspect attach(transducin) inds <- unlist(lapply(c("1TAG", "1AS0", "1AS2"), grep, pdbs$id)) pdbs <- trim.pdbs(pdbs, row.inds=inds) gaps <- gap.inspect(pdbs$xyz) rmsd.mat <- matrix(c(0.000, 1.792, 1.903, 1.792, 0.000, 1.881, 1.903, 1.881, 0.000), ncol=3, byrow=TRUE) rownames(rmsd.mat) <- basename.pdb(pdbs$id) colnames(rmsd.mat) <- basename.pdb(pdbs$id) ## Test rmsd() expect_that(suppressWarnings(rmsd( pdbs )), equals(rmsd.mat, tolerance = 1e-6)) ## Test fit.xyz() xyz <- fit.xyz( fixed = pdbs$xyz[1,], mobile = pdbs$xyz, fixed.inds = gaps$f.inds, mobile.inds = gaps$f.inds ) x1.expected <- c(29.72513, 64.03389, 42.98273, 30.15516, 67.73641, 43.70090) x2.expected <- c(NA, NA, NA, 29.28225, 67.23703, 43.05571) x3.expected <- c(NA, NA, NA, 30.17547, 67.15645, 43.46491) expect_that(head(xyz[1,]), equals(x1.expected, tolerance = 1e-6)) expect_that(head(xyz[2,]), equals(x2.expected, tolerance = 1e-6)) expect_that(head(xyz[3,]), equals(x3.expected, tolerance = 1e-6)) rmsd.mat <- matrix(c(0.000, 1.659, 1.814, 1.659, 0.000, 1.697, 1.814, 1.697, 0.000), ncol=3, byrow=TRUE) rownames(rmsd.mat) <- basename.pdb(pdbs$id) colnames(rmsd.mat) <- basename.pdb(pdbs$id) expect_that(suppressWarnings(rmsd( xyz[, gaps$f.inds] )), equals(rmsd.mat, tolerance = 1e-6)) expect_that(suppressWarnings(rmsd( pdbs, fit=TRUE )), equals(rmsd.mat, tolerance = 1e-6)) xyz2 <- fit.xyz( fixed = pdbs$xyz[1,], mobile = pdbs, fixed.inds = gaps$f.inds, mobile.inds = gaps$f.inds ) expect_that(xyz2, equals(xyz)) detach(transducin) } ) test_that("struct.aln still works", { skip_on_cran() skip_on_travis() if(!check.utility('muscle')) { skip('Need MUSCLE installed to run this test') } ## Simple test with PDB ID 1HEL file.a <- system.file("examples/1hel.pdb",package="bio3d") file.b <- system.file("examples/1dpx.pdb",package="bio3d") invisible(capture.output(pdb.a <- read.pdb(file.a))) invisible(capture.output(pdb.b <- read.pdb(file.b))) invisible(capture.output(aln <- struct.aln(pdb.a, pdb.b, write.pdbs=FALSE, cutoff=0.1, max.cycles=2, extra.args="-quiet"))) rmsda <- c(0.293, 0.229, 0.200) expect_that(aln$rmsd, equals(rmsda, tolerance = 1e-6)) expect_that(length(aln$a.inds$atom), equals(112)) expect_that(length(aln$b.inds$atom), equals(112)) expect_that(length(aln$b.inds$xyz), equals(112*3)) expect_that(length(aln$b.inds$xyz), equals(112*3)) } ) # A little bit more tests... test_that("fit.xyz() gets the same results as VMD", { skip_on_cran() skip_on_travis() if(!check.utility('muscle')) { skip('Need MUSCLE installed to run this test') } invisible(capture.output( capture.output(pdbs <- pdbaln(c("1tag", "1as0")), type="message")) ) inds <- gap.inspect(pdbs$xyz)$f.inds expect_error(fit.xyz("string", pdbs$xyz, inds, inds)) expect_error(fit.xyz(pdbs$xyz, pdbs$xyz, inds, inds)) expect_error(fit.xyz(pdbs$xyz[1,], pdbs$xyz, inds, 1:4)) xyz <- fit.xyz(pdbs$xyz[1,], pdbs$xyz[2,], inds, inds) xyz <- xyz[!is.na(xyz)] xyz0 <- c(41.063, 15.667, 58.826, 43.041, 17.479, 56.113, 44.826, 15.317, 53.571) # VMD results expect_equal(round(xyz[1:9], 3), xyz0) }) test_that("fit.xyz() with ncore>1 works properly", { skip_on_cran() skip_on_travis() attach(transducin) inds <- unlist(lapply(c("1TAG", "1AS0", "1AS2"), grep, pdbs$id)) pdbs <- trim.pdbs(pdbs, row.inds=inds) #invisible(capture.output(pdbs <- pdbaln(c("1tag", "1as0", "1as2")))) #inds <- gap.inspect(pdbs$xyz)$f.inds # check if ncore > 1 is really faster time1 <- system.time(xyz1 <- fit.xyz(pdbs$xyz[1,], pdbs$xyz, inds, inds, ncore=1)) time2 <- system.time(xyz2 <- fit.xyz(pdbs$xyz[1,], pdbs$xyz, inds, inds, ncore=NULL)) time1 <- time1["elapsed"] time2 <- time2["elapsed"] expect_equivalent(xyz1, xyz2) # cat("Speed up by", round((time1-time2)/time2, 1)*100, "%", sep="") # if(getOption("cores") > 1) # expect_true(time1 > time2) detach(transducin) }) bio3d/tests/testthat/test-pdbsplit.R0000644000176200001440000000541614046015221017176 0ustar liggesuserscontext("Testing pdbsplit()") test_that("pdbsplit works", { skip_on_cran() skip_on_travis() path <- tempdir() invisible(capture.output( capture.output(rawfiles <- get.pdb("3R1C", path=path), type="message") )) invisible(capture.output(files <- pdbsplit(rawfiles, ids=NULL, path=path))) expected <- c('3R1C_A.pdb', '3R1C_B.pdb', '3R1C_C.pdb', '3R1C_D.pdb', '3R1C_E.pdb', '3R1C_F.pdb', '3R1C_G.pdb', '3R1C_H.pdb', '3R1C_I.pdb', '3R1C_J.pdb', '3R1C_K.pdb', '3R1C_L.pdb', '3R1C_M.pdb', '3R1C_N.pdb', '3R1C_O.pdb', '3R1C_P.pdb', '3R1C_Q.pdb', '3R1C_R.pdb', '3R1C_S.pdb', '3R1C_Y.pdb', '3R1C_T.pdb', '3R1C_U.pdb', '3R1C_W.pdb', '3R1C_X.pdb', '3R1C_V.pdb', '3R1C_Z.pdb', '3R1C_a.pdb', '3R1C_b.pdb', '3R1C_c.pdb', '3R1C_d.pdb', '3R1C_e.pdb', '3R1C_f.pdb', '3R1C_g.pdb', '3R1C_h.pdb', '3R1C_i.pdb', '3R1C_j.pdb') expect_that(expected, equals(basename(files))) ids <- c('3R1C') invisible(capture.output(files <- pdbsplit(rawfiles, ids=ids , path=path))) expect_that(expected, equals(basename(files))) ids <- c('3R1C_e', '3R1C_E') invisible(capture.output(files <- pdbsplit(rawfiles, ids=ids , path=path))) expected <- c("3R1C_e.pdb", "3R1C_E.pdb") expect_that(expected, equals(basename(files))) ## ID does not exist - expect warning ids <- c('3R1C_XX') expect_warning(capture.output(files <- pdbsplit(rawfiles, ids=ids , path=path))) expected <- NULL expect_that(expected, equals(files)) ## multi=TRUE invisible(capture.output( capture.output(rawfiles <- get.pdb("1UD7", path=path), type="message") )) invisible(capture.output(files <- pdbsplit(rawfiles, ids=NULL, path=path, multi=TRUE))) expected <- c('1UD7_A.01.pdb', '1UD7_A.02.pdb', '1UD7_A.03.pdb', '1UD7_A.04.pdb', '1UD7_A.05.pdb', '1UD7_A.06.pdb', '1UD7_A.07.pdb', '1UD7_A.08.pdb', '1UD7_A.09.pdb', '1UD7_A.10.pdb', '1UD7_A.11.pdb', '1UD7_A.12.pdb', '1UD7_A.13.pdb', '1UD7_A.14.pdb', '1UD7_A.15.pdb', '1UD7_A.16.pdb', '1UD7_A.17.pdb', '1UD7_A.18.pdb', '1UD7_A.19.pdb', '1UD7_A.20.pdb') expect_that(expected, equals(basename(files))) pdb <- read.pdb(files[1]) expect_that(nrow(pdb$atom), equals(1230)) ## non standard amino acids: invisible(capture.output( capture.output(rawfiles <- get.pdb("1cdk", path=path), type="message") )) invisible(capture.output(files <- pdbsplit(rawfiles, path=path))) invisible(capture.output(pdb <- read.pdb(files[1]))) invisible(capture.output(inds <- atom.select(pdb, resno=197)$atom)) inds.expected <- c(1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578) expect_that(inds, equals(inds.expected)) } ) bio3d/tests/testthat/test-pca.R0000644000176200001440000000231014046015221016106 0ustar liggesuserscontext("Testing pca()") test_that("pca functions works", { "mysign" <- function(a,b) { if(all(sign(a)==sign(b))) return(1) else return(-1) } attach(transducin) inds <- unlist(lapply(c("1TND_A", "1TAG", "1AS0", "1AS2"), grep, pdbs$id)) pdbs <- trim.pdbs(pdbs, row.inds=inds) gaps <- gap.inspect(pdbs$xyz) ## Calc modes invisible(capture.output(pc <- pca(pdbs))) ## check dimensions expect_that(dim(pc$U), equals(c(939, 939))) expect_that(length(pc$L), equals(939)) ## check eigenvalues Lexpected <- c(1.964689e+02, 1.715903e+02, 7.091482e+01) expect_that(head(pc$L, n=3), equals(Lexpected, tolerance=1e-6)) ## check atom-wise loadings AUexpected <- c(0.013422274, 0.023879443, 0.022779307, 0.023490288, 0.006308588, 0.010057694) expect_that(head(pc$au[,1], n=6), equals(AUexpected, tolerance=1e-6)) Z1expected <- c(-3.555218, -12.081135, -4.602888, 20.239240) Z1now <- as.numeric(head(pc$z[,1], n=4)) expect_that(Z1now * mysign(Z1expected, Z1now), equals(Z1expected, tolerance=1e-6)) Mexpected <- c(30.12193, 67.76449, 43.36594, 27.01919, 69.66411, 44.47434) expect_that(head(pc$mean, n=6), equals(Mexpected, tolerance=1e-6)) detach(transducin) }) bio3d/tests/testthat/test-rmsd.R0000644000176200001440000000333514046015221016320 0ustar liggesuserscontext("Testing RMSD function") test_that("rmsd() gets the same results as PyMOL", { file <- system.file(c("examples/1hel.pdb", "examples/1dpx.pdb"), package="bio3d") invisible(capture.output(pdb.a <- read.pdb(file[1]))) invisible(capture.output(pdb.b <- read.pdb(file[2]))) invisible(capture.output(inds.a <- atom.select(pdb.a, "calpha"))) invisible(capture.output(inds.b <- atom.select(pdb.b, "calpha"))) rd1 <- rmsd(a=pdb.a$xyz, b=pdb.b$xyz, a.inds=inds.a$xyz, b.inds=inds.b$xyz, fit=FALSE) rd2 <- rmsd(a=pdb.a$xyz, b=pdb.b$xyz, a.inds=inds.a$xyz, b.inds=inds.b$xyz, fit=TRUE) ## with pymol "pair_fit 1hel and name CA, 1dpx and name CA" = 0.293 rmsd1 <- 1.386 rmsd2 <- 0.293 expect_equal(round(rd1, 3), rmsd1) expect_equal(round(rd2, 3), rmsd2) }) test_that("rmsd() with ncore>1 works properly", { file <- system.file(c("examples/1hel.pdb", "examples/1dpx.pdb"), package="bio3d") invisible(capture.output(pdb.a <- read.pdb(file[1]))) invisible(capture.output(pdb.b <- read.pdb(file[2]))) invisible(capture.output(inds.a <- atom.select(pdb.a, "calpha"))) invisible(capture.output(inds.b <- atom.select(pdb.b, "calpha"))) ## check if ncore > 1 is really faster time1 <- system.time(rmsd1 <- rmsd(a=pdb.a$xyz, b=pdb.b$xyz, a.inds=inds.a$xyz, b.inds=inds.b$xyz, fit=TRUE, ncore=1)) time2 <- system.time(rmsd2 <- rmsd(a=pdb.a$xyz, b=pdb.b$xyz, a.inds=inds.a$xyz, b.inds=inds.b$xyz, fit=TRUE, ncore=NULL)) ##time1 <- time1["elapsed"] ##time2 <- time2["elapsed"] # expect_equivalent(rmsd1, rmsd2) expect_equal(rmsd1, rmsd2, tolerance=1e-6) # cat("Speed up by", round((time1-time2)/time2, 1)*100, "%", sep="") # if(getOption("cores") > 1) # expect_true(time1 > time2) }) bio3d/tests/testthat/test-vector-funs.R0000644000176200001440000000133114046015221017620 0ustar liggesuserscontext("Testing vector functions") test_that("Vector functions", { ## vector normalization x <- 1:3 x.norm <- c(0.2672612, 0.5345225, 0.8017837) expect_that(normalize.vector(x), equals(x.norm, tolerance = 1e-6)) y <- matrix(1:9, ncol = 3, nrow = 3) y.norm <- matrix(c(x.norm, 0.4558423, 0.5698029, 0.6837635, 0.5025707, 0.5743665, 0.6461623), ncol=3, byrow=F) expect_that(normalize.vector(y), equals(y.norm, tolerance = 1e-6)) ## Inner product x <- 1:3 y <- diag(x) z <- matrix(1:9, ncol = 3, nrow = 3) xy <- c(1, 4, 9) yz <- c(1, 10, 27) expect_that(inner.prod(x,y), equals(xy)) expect_that(inner.prod(y,z), equals(yz)) } ) bio3d/tests/testthat/test-read.pdb.R0000644000176200001440000002133114046015221017026 0ustar liggesuserscontext("Testing basic PDB structure operation") test_that("read.pdb() reads a normal pdb file", { ## Simple test with PDB ID 1HEL file <- system.file("examples/1dpx.pdb",package="bio3d") invisible(capture.output(pdb <- read.pdb(file))) expect_is(pdb$atom, "data.frame") expect_true(inherits(pdb, "pdb")) expect_true(inherits(pdb$xyz, "xyz")) expect_equal(nrow(pdb$atom), 1177) expect_equal(sum(pdb$calpha), 129) expect_equal(sum(pdb$atom$resid=="HOH"), 177) expect_equal(sum(pdb$atom$resid=="CL"), 2) expect_that(sum(pdb$xyz), equals(44657.12, tolerance=1e-6)) expect_equal(sum(pdb$atom$type=="ATOM"), 998) expect_equal(sum(pdb$atom$type=="HETATM"), 179) expect_equal(pdb$remark$biomat$num, 1) expect_equal(pdb$remark$biomat$chain[[1]], "A") true_mat <- matrix(c(1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0), nrow=3, byrow=TRUE) expect_equivalent(pdb$remark$biomat$mat[[1]][[1]], true_mat) invisible(capture.output(spdb <- read.pdb(file, ATOM.only=TRUE))) expect_equal(spdb$atom, pdb$atom) expect_equal(spdb$xyz, pdb$xyz) expect_equal(spdb$calpha, pdb$calpha) expect_true(is.null(spdb$helix)) expect_true(is.null(spdb$sheet)) expect_true(is.null(spdb$seqres)) expect_true(is.null(spdb$remark)) }) test_that("read.pdb() reads and stores data properly", { skip_on_cran() skip_on_travis() datdir <- tempdir() suppressWarnings( invisible(capture.output(get.pdb(c("3DRC", "1P3Q", "1SVK", "1L2Y"), path=datdir, overwrite = FALSE, verbose = FALSE))) ) # "3DRC" example PDB has a CA calcium ion and a CA containing ligand. expect_error(read.pdb("nothing")) invisible(capture.output(pdb <- read.pdb(file.path(datdir, "3DRC.pdb")))) expect_equal(nrow(pdb$atom), 2954) expect_equal(sum(pdb$calpha), 318) # expect_equivalent(aa321(pdb$seqres), pdbseq(pdb)) expect_equal(pdb$xyz[1:6], c(24.317, 59.447, 4.079, 25.000, 58.475, 4.908), tolerance=1e-6) expect_equal(length(pdb$helix$start), 8) expect_equal(length(pdb$sheet$start), 16) # "1SVK" example PDB has alternate location indicator invisible(capture.output(pdb <- read.pdb(file.path(datdir, "1SVK.pdb")))) expect_equal(sum(pdb$calpha), 313) expect_equal(sum(pdb$atom$resno==47), 6) expect_equal(sum(pdb$atom$resid=="GDP"), 28) # multi-model structure invisible(capture.output(pdb <- read.pdb(file.path(datdir, "1L2Y.pdb"), multi=TRUE))) expect_equal(dim(pdb$xyz), c(38, 912)) expect_equal(pdb$xyz[20, 1:6], c(-8.559, 6.374, -1.226, -7.539, 6.170, -0.168), tolerance=1e-6) # one atom cat("ATOM 1 N SER Q 398 48.435 21.981 -6.393 1.00 56.10 N\n", file=file.path(datdir, "t1a.pdb")) pdb <- read.pdb(file.path(datdir, "t1a.pdb")) expect_is(pdb$atom, "data.frame") ### write.pdb() invisible(capture.output(pdb <- read.pdb(file.path(datdir, "3DRC.pdb")))) write.pdb(pdb, file=file.path(datdir, "t1.pdb")) invisible(capture.output(pdb1 <- read.pdb(file.path(datdir, "t1.pdb")))) expect_identical(pdb$atom, pdb1$atom) expect_identical(pdb$xyz, pdb1$xyz) expect_identical(pdb$calpha, pdb1$calpha) # multi-model structure invisible(capture.output(pdb <- read.pdb(file.path(datdir, "1L2Y.pdb"), multi=TRUE))) write.pdb(pdb, file=file.path(datdir, "t2.pdb")) invisible(capture.output(pdb2 <- read.pdb(file.path(datdir, "t2.pdb"), multi=TRUE))) # SSE, SEQRES, and REMARK missing in write.pdb() pdb[c("seqres", "helix", "sheet", "remark", "call")] <- NULL pdb2[c("seqres", "helix", "sheet", "remark", "call")] <- NULL expect_identical(pdb, pdb2) ### trim.pdb() invisible(capture.output(pdb <- read.pdb(file.path(datdir, "1P3Q.pdb")))) pdb1 <- trim.pdb(pdb, inds = atom.select(pdb, "calpha", verbose=FALSE)) expect_is(pdb1, "pdb") expect_equal(nrow(pdb1$atom), 228) expect_equal(sum(pdb1$calpha), 228) expect_equivalent(pdb1$helix$start, pdb$helix$start) expect_equivalent(sort(pdb1$sheet$end), sort(pdb$sheet$end)) pdb2 <- trim.pdb(pdb, inds = atom.select(pdb, "protein", chain="U", verbose=FALSE)) expect_equal(nrow(pdb2$atom), 593) expect_equal(sum(pdb2$calpha), 74) expect_equivalent(pdb2$helix, list(start=c(22, 37, 56), end=c(35, 39, 60), chain=rep("U",3), type=c("1", "5", "5"))) expect_equivalent(pdb2$sheet, list(start=c(12,2,66,41,48), end=c(16,7,71,45,49), chain=rep("U",5), sense=c("0","-1","1","-1","-1"))) }) test_that("read.pdb() reads PDB with ' in atom names", { skip_on_cran() skip_on_travis() datdir <- tempdir() invisible(capture.output(get.pdb("1H5T", path=datdir, overwrite = FALSE, verbose = FALSE))) invisible(capture.output(pdb <- read.pdb(file.path(datdir, "1H5T.pdb")))) sele <- atom.select(pdb, "notprotein") expected <- c("TYD", "DAU", "SO4", "HOH") expect_equal(unique(pdb$atom$resid[sele$atom]), expected) sele <- atom.select(pdb, elety="C1'") expected <- "C1'" expect_equal(unique(pdb$atom$elety[sele$atom]), expected) }) test_that("read.pdb() (cpp) gives the same results as read.pdb2() (old R version)", { skip_on_cran() skip_on_travis() datdir <- tempdir() suppressWarnings( invisible(capture.output(get.pdb("1H5T", path=datdir, overwrite = FALSE, verbose = FALSE))) ) invisible(capture.output(pdb0 <- read.pdb(file.path(datdir, "1H5T.pdb")))) invisible(capture.output(pdb1 <- read.pdb2(file.path(datdir, "1H5T.pdb")))) expect_equal(pdb0$atom, pdb1$atom) expect_equal(pdb0$xyz, pdb1$xyz) expect_equal(pdb0$sheet, pdb1$sheet) expect_equal(pdb0$helix, pdb1$helix) expect_equal(pdb0$calpha, pdb1$calpha) expect_equal(pdb0$seqres, pdb1$seqres) expect_equal(pdb0$remark, pdb1$remark) ## 1TOH - more remarks suppressWarnings( invisible(capture.output(get.pdb("2TOH", path=datdir, overwrite = FALSE, verbose = FALSE))) ) invisible(capture.output(pdb0 <- read.pdb(file.path(datdir, "2TOH.pdb")))) invisible(capture.output(pdb1 <- read.pdb2(file.path(datdir, "2TOH.pdb")))) expect_equal(pdb0$atom, pdb1$atom) expect_equal(pdb0$xyz, pdb1$xyz) expect_equal(pdb0$sheet, pdb1$sheet) expect_equal(pdb0$helix, pdb1$helix) expect_equal(pdb0$calpha, pdb1$calpha) expect_equal(pdb0$seqres, pdb1$seqres) expect_equal(pdb0$remark, pdb1$remark) ## multi = TRUE invisible(capture.output(get.pdb("2EYB", path=datdir, overwrite = FALSE, verbose = FALSE))) invisible(capture.output(pdb0 <- read.pdb(file.path(datdir, "2EYB.pdb"), multi=TRUE))) invisible(capture.output(pdb1 <- read.pdb2(file.path(datdir, "2EYB.pdb"), multi=TRUE))) expect_equal(pdb0$xyz, pdb1$xyz) expect_equal(pdb0$atom, pdb1$atom) ## rm.insert = TRUE suppressWarnings( invisible(capture.output(get.pdb("1FUJ", path=datdir, overwrite = FALSE, verbose = FALSE))) ) invisible(capture.output(pdb0 <- read.pdb(file.path(datdir, "1FUJ.pdb"), rm.insert=TRUE))) invisible(capture.output(pdb1 <- read.pdb2(file.path(datdir, "1FUJ.pdb"), rm.insert=TRUE))) expect_equal(pdb0$xyz, pdb1$xyz) expect_equal(pdb0$atom, pdb1$atom) ## rm.alt = TRUE/FALSE invisible(capture.output(get.pdb("1RX2", path=datdir, overwrite = FALSE, verbose = FALSE))) invisible(capture.output(pdb0 <- read.pdb(file.path(datdir, "1RX2.pdb"), rm.alt=TRUE))) invisible(capture.output(pdb1 <- read.pdb2(file.path(datdir, "1RX2.pdb"), rm.alt=TRUE))) expect_equal(pdb0$xyz, pdb1$xyz) expect_equal(pdb0$atom, pdb1$atom) invisible(capture.output(pdb0 <- read.pdb(file.path(datdir, "1RX2.pdb"), rm.alt=FALSE))) invisible(capture.output(pdb1 <- read.pdb2(file.path(datdir, "1RX2.pdb"), rm.alt=FALSE))) expect_equal(pdb0$xyz, pdb1$xyz) expect_equal(pdb0$atom, pdb1$atom) ## ATOM.only = TRUE if(FALSE) { suppressWarnings( invisible(capture.output(get.pdb("1FUJ", path=datdir, overwrite = FALSE, verbose = FALSE))) ) invisible(capture.output(pdb0 <- read.pdb(file.path(datdir, "1FUJ.pdb"), ATOM.only=TRUE))) invisible(capture.output(pdb1 <- read.pdb2(file.path(datdir, "1FUJ.pdb"), ATOM.only=TRUE))) expect_equal(attributes(pdb0), attributes(pdb1)) } ## read PDB with 'insert' suppressWarnings( invisible(capture.output(get.pdb("1FUJ", path=datdir, overwrite = FALSE, verbose = FALSE))) ) invisible(capture.output(pdb0 <- read.pdb(file.path(datdir, "1FUJ.pdb")))) invisible(capture.output(pdb1 <- read.pdb2(file.path(datdir, "1FUJ.pdb")))) for(i in names(pdb1)) { if(i != 'call') { expect_equal(pdb0[[i]], pdb1[[i]]) } } }) bio3d/tests/testthat.R0000644000176200001440000000004614046015221014372 0ustar liggesuserslibrary(testthat) test_check("bio3d") bio3d/src/0000755000176200001440000000000014046127635012051 5ustar liggesusersbio3d/src/read_prmtop.cpp0000644000176200001440000000710014046015221015052 0ustar liggesusers#include #include #include #include #include #include #include #include "utils.h" #include "convert.h" using namespace std; using namespace Rcpp; struct dataformat { string fmt; string type; int length; int width; }; dataformat getFormatFromLine(std::string line) { dataformat out; string tmp; string fmt; string type; int length; int width; size_t type_pos, tmplast; // format e.g. (5E16.8) fmt = trim(line.substr(7)); // position of type definer type_pos = fmt.find_first_of("aEI"); // fetch the type character type = fmt[type_pos]; // length is imediately before the type char length = stringToInt(fmt.substr(1, type_pos-1)); // width is after type char tmp = fmt.substr(type_pos+1); tmplast = tmp.find_first_of(".)"); width = stringToInt(tmp.substr(0, tmplast)); out.fmt=fmt; out.type=type; out.length=length; out.width=width; return(out); } // [[Rcpp::export('.read_prmtop')]] List read_prmtop(std::string filename) { // out is a List object Rcpp::List out = Rcpp::List::create(); StringVector content_names; // temporary vectors vector< vector > str_data; vector< vector > int_data; vector< vector > dbl_data; // temp vectors vector tmp_svector; vector tmp_ivector; vector tmp_dvector; // temp variables int tmpi; string tmps; double tmpd; // keep track of current fields dataformat fmt; string current_flag; string previous_flag = ""; string current_format; string current_type; int current_width = 0; // for reading string line; ifstream myfile; // open file and iterate over each line myfile.open(filename.c_str()); if (myfile.is_open()) { while ( getline (myfile,line) ) { line = trim(line); if(line.substr(0, 5)=="%FLAG") { current_flag=trim(line.substr(6)); content_names.push_back(current_flag); // store the data if(tmp_svector.size()>0) { out.push_back(tmp_svector); tmp_svector.clear(); } if(tmp_dvector.size()>0) { out.push_back(tmp_dvector); tmp_dvector.clear(); } if(tmp_ivector.size()>0) { out.push_back(tmp_ivector); tmp_ivector.clear(); } continue; } else if(line.substr(0,7)=="%FORMAT"){ fmt = getFormatFromLine(line); current_type=fmt.type; current_width=fmt.width; continue; } else { stringstream ss(line); // string if(current_type=="a"){ while (ss >> std::setw(current_width) >> tmps) { tmp_svector.push_back(tmps); } if(tmp_svector.size()==0) tmp_svector.push_back(""); continue; } // double if(current_type=="E"){ while (ss >> std::setw(current_width) >> tmpd) { tmp_dvector.push_back(tmpd); } if(tmp_dvector.size()==0) tmp_dvector.push_back(NA_REAL); continue; } // integers if(current_type=="I"){ while (ss >> std::setw(current_width) >> tmpi) { tmp_ivector.push_back(tmpi); } if(tmp_ivector.size()==0) tmp_ivector.push_back(NA_INTEGER); continue; } } } myfile.close(); // store last round of data if(tmp_svector.size()>0) { out.push_back(tmp_svector); tmp_svector.clear(); } if(tmp_dvector.size()>0) { out.push_back(tmp_dvector); tmp_dvector.clear(); } if(tmp_ivector.size()>0) { out.push_back(tmp_ivector); tmp_ivector.clear(); } } else { out = Rcpp::List::create(Rcpp::Named("error")="error"); return(out); } out.attr("names") = content_names; return(out); } bio3d/src/init.c0000644000176200001440000000150514046015221013144 0ustar liggesusers#include #include #include // for NULL #include /* FIXME: * Check these declarations against the C/Fortran source code. * */ /* .Call calls */ extern SEXP _bio3d_read_cif(SEXP, SEXP, SEXP); extern SEXP _bio3d_read_crd(SEXP); extern SEXP _bio3d_read_pdb(SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP _bio3d_read_prmtop(SEXP); static const R_CallMethodDef CallEntries[] = { {"_bio3d_read_cif", (DL_FUNC) &_bio3d_read_cif, 3}, {"_bio3d_read_crd", (DL_FUNC) &_bio3d_read_crd, 1}, {"_bio3d_read_pdb", (DL_FUNC) &_bio3d_read_pdb, 5}, {"_bio3d_read_prmtop", (DL_FUNC) &_bio3d_read_prmtop, 1}, {NULL, NULL, 0} }; void R_init_bio3d(DllInfo *dll) { R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } bio3d/src/read_crd.cpp0000644000176200001440000000463114046015221014307 0ustar liggesusers#include #include #include #include #include #include #include #include "utils.h" #include "convert.h" using namespace std; using namespace Rcpp; // [[Rcpp::export('.read_crd')]] List read_crd(std::string filename) { // out is a List object Rcpp::List out = Rcpp::List::create(); StringVector content_names; // vectors vector coords; vector vels; vector box; // data string title; int natoms = NA_INTEGER; double simtime = NA_REAL; // temp variables int i = 0; string tmps; double tmpd; vector tmp_vec; // for reading string line; ifstream myfile; // open file and iterate over each line myfile.open(filename.c_str()); if (myfile.is_open()) { while ( getline (myfile,line) ) { i++; // title line if(i==1) { title=trim(line); continue; } // natoms and simtime if(i==2) { tmps = trim(line); tmp_vec = split(tmps, ' '); if(tmp_vec.size()>0) { natoms = stringToInt(tmp_vec[0]); } if(tmp_vec.size()>1) { simtime = stringToDouble(tmp_vec[1]); } continue; } // coords if(natoms*3 > (int)coords.size()) { stringstream ss(line); while (ss >> std::setw(12) >> tmpd) { coords.push_back(tmpd); } continue; } // velocities if((int)coords.size() == natoms*3 && (int)vels.size() < natoms*3) { stringstream ss(line); while (ss >> std::setw(12) >> tmpd) { vels.push_back(tmpd); } continue; } // box size if((int)coords.size() == natoms*3) { stringstream ss(line); while (ss >> std::setw(12) >> tmpd) { box.push_back(tmpd); } continue; } } myfile.close(); } else { out = Rcpp::List::create(Rcpp::Named("error")="error"); return(out); } // if velocities were not present, box info might be stored there if(vels.size()==6 && box.empty()) { box=vels; vels.clear(); } out.push_back(title); out.push_back(natoms); out.push_back(simtime); out.push_back(coords); out.push_back(vels); out.push_back(box); content_names.push_back("title"); content_names.push_back("natoms"); content_names.push_back("time"); content_names.push_back("xyz"); content_names.push_back("velocities"); content_names.push_back("box"); out.attr("names") = content_names; return(out); } bio3d/src/gzstream.h0000644000176200001440000001113514046015221014042 0ustar liggesusers// ============================================================================ // gzstream, C++ iostream classes wrapping the zlib compression library. // Copyright (C) 2001 Deepak Bandyopadhyay, Lutz Kettner // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // ============================================================================ // // File : gzstream.h // Revision : $Revision: 1.2 $ // Revision_date : $Date: 2009-09-03 18:28:38 $ // Author(s) : Deepak Bandyopadhyay, Lutz Kettner // // Standard streambuf implementation following Nicolai Josuttis, "The // Standard C++ Library". // // ============================================================================ // Modifications: Dominik Szczerba 2006 // added is_open() to igzstream and ogzstream // ============================================================================ // // This version is obtained 28.05.2015 from // https://github.com/Kitware/VTK/tree/master/ThirdParty/xdmf2/vtkxdmf2/libsrc // #ifndef GZSTREAM_H #define GZSTREAM_H 1 // standard C++ with new header file names and std:: namespace #include #include #ifdef XDMF_USE_VTK_ZLIB #include "vtkzlib/zlib.h" #else #include #endif #ifdef GZSTREAM_NAMESPACE namespace GZSTREAM_NAMESPACE { #endif // ---------------------------------------------------------------------------- // Internal classes to implement gzstream. See below for user classes. // ---------------------------------------------------------------------------- class gzstreambuf : public std::streambuf { private: static const int bufferSize = 47+256; // size of data buff // totals 512 bytes under g++ for igzstream at the end. gzFile file; // file handle for compressed file char buffer[bufferSize]; // data buffer char opened; // open/close state of stream int mode; // I/O mode int flush_buffer(); public: gzstreambuf() : opened(0) { setp( buffer, buffer + (bufferSize-1)); setg( buffer + 4, // beginning of putback area buffer + 4, // read position buffer + 4); // end position // ASSERT: both input & output capabilities will not be used together } int is_open() { return opened; } gzstreambuf* open( const char* name, int open_mode); gzstreambuf* close(); ~gzstreambuf() { close(); } virtual int overflow( int c = EOF); virtual int underflow(); virtual int sync(); }; class gzstreambase : virtual public std::ios { protected: gzstreambuf buf; public: gzstreambase() { init(&buf); } gzstreambase( const char* name, int open_mode); ~gzstreambase(); void open( const char* name, int open_mode); void close(); gzstreambuf* rdbuf() { return &buf; } }; // ---------------------------------------------------------------------------- // User classes. Use igzstream and ogzstream analogously to ifstream and // ofstream respectively. They read and write files based on the gz* // function interface of the zlib. Files are compatible with gzip compression. // ---------------------------------------------------------------------------- class igzstream : public gzstreambase, public std::istream { public: igzstream() : std::istream( &buf) {} igzstream( const char* name, int open_mode = std::ios::in) : gzstreambase( name, open_mode), std::istream( &buf) {} gzstreambuf* rdbuf() { return gzstreambase::rdbuf(); } void open( const char* name, int open_mode = std::ios::in) { gzstreambase::open( name, open_mode); } bool is_open(){return buf.is_open();}; }; class ogzstream : public gzstreambase, public std::ostream { public: ogzstream() : std::ostream( &buf) {} ogzstream( const char* name, int mode = std::ios::out) : gzstreambase( name, mode), std::ostream( &buf) {} gzstreambuf* rdbuf() { return gzstreambase::rdbuf(); } void open( const char* name, int open_mode = std::ios::out) { gzstreambase::open( name, open_mode); } bool is_open(){return buf.is_open();}; }; #ifdef GZSTREAM_NAMESPACE } // namespace GZSTREAM_NAMESPACE #endif #endif // GZSTREAM_H // ============================================================================ // EOF //1 bio3d/src/utils.h0000644000176200001440000000114714046015221013350 0ustar liggesusers//================================= // include guard #ifndef __UTILS_H_INCLUDED__ #define __UTILS_H_INCLUDED__ //================================= // included dependencies #include using namespace std; //================================= // the actual functions // trim from start string ltrim(string s); // trim from end string rtrim(string s); // trim from both ends string trim(string s); // function get hexadecimal int getHex(string hexstr); // split a string vector &split(const string &s, char delim, vector &elems); vector split(const string &s, char delim); #endif bio3d/src/Makevars0000644000176200001440000000006314046015221013527 0ustar liggesusersPKG_CPPFLAGS = -I. PKG_LIBS = -lz CXX_STD = CXX11 bio3d/src/read_cif.cpp0000644000176200001440000001545414046015221014305 0ustar liggesusers#include #include #include #include #include "gzstream.h" #include "utils.h" #include "convert.h" using namespace std; using namespace Rcpp; // [[Rcpp::export('.read_cif')]] List read_cif(std::string filename, int maxlines=-1, bool multi=false) { // out is a List object Rcpp::List out; // keep track of number of atoms and models in PDB int natoms = 0; int models = 0; // assign vectors for building final 'atom' object vector type; vector eleno; vector elety; vector alt; vector resid; vector chain; vector resno; vector entid; vector insert; vector x; vector y; vector z; vector o; vector b; vector segid; vector elesy; vector charge; vector model; // xyz object vector xyz; // store HELIX / SHEET records /** vector helix_chain; vector helix_resno_start; vector helix_resno_end; vector helix_type; vector helix_inserti; vector helix_inserte; vector sheet_chain; vector sheet_resno_start; vector sheet_resno_end; vector sheet_sense; vector sheet_inserti; vector sheet_inserte; */ // store SEQRES vector seqres; vector seqres_chain; // store REMARK 350 lines vector remark350; // temp variables string tmp; int counter = 0; int curr_model; int prev_model = -1; int colmap_size; string tmps; vector tmp_vec; // for reading vector raw_lines; string line; // section type string section_type = ""; // mapper for column field to index map columns_map; igzstream mystream; mystream.open(filename.c_str()); if (mystream.is_open()) { while ( getline (mystream, line) ) { //cout << line; //cout << "\n"; // break if user has provided maxlines argument counter++; if(maxlines != -1 && counter > maxlines) { break; } // reset section type if we run into "#" else if(line.substr(0,1)=="#") { section_type = ""; columns_map.clear(); continue; } // set section type if not set else if(line.substr(0, 11) == "_atom_site.") { section_type = "_atom_site"; colmap_size = columns_map.size(); columns_map[ trim(line) ] = colmap_size; } // store ATOM/HETATM records else if(section_type == "_atom_site" && (line.substr(0,4)=="ATOM" || line.substr(0,6)=="HETATM")) { tmps = trim(line); tmp_vec = split(tmps, ' '); // include here check for model number as in read_pdb.cpp curr_model = stringToInt(tmp_vec[ columns_map["_atom_site.pdbx_PDB_model_num"] ]); if(curr_model != prev_model) { models++; prev_model = curr_model; } if(!multi && models > 1) { models=1; break; } // read coordinates double tmpx = stringToDouble(tmp_vec[ columns_map["_atom_site.Cartn_x"] ]); double tmpy = stringToDouble(tmp_vec[ columns_map["_atom_site.Cartn_y"] ]); double tmpz = stringToDouble(tmp_vec[ columns_map["_atom_site.Cartn_z"] ]); // always store coords in xyz object xyz.push_back(tmpx); xyz.push_back(tmpy); xyz.push_back(tmpz); // only store other items for first MODEL if(models == 1) { natoms++; // x, y, z for 'atom' x.push_back(tmpx); y.push_back(tmpy); z.push_back(tmpz); //_atom_site.group_PDB type.push_back(tmp_vec[ columns_map["_atom_site.group_PDB"] ]); //_atom_site.id eleno.push_back(stringToInt(tmp_vec[ columns_map["_atom_site.id"] ])); //_atom_site.type_symbol elesy.push_back(tmp_vec[ columns_map["_atom_site.type_symbol"] ]); //_atom_site.label_atom_id //_atom_site.label_alt_id alt.push_back(tmp_vec[ columns_map["_atom_site.label_alt_id"] ]); //_atom_site.label_comp_id //_atom_site.label_asym_id //_atom_site.label_entity_id entid.push_back(stringToInt(tmp_vec[ columns_map["_atom_site.label_entity_id"] ])); //_atom_site.label_seq_id //_atom_site.pdbx_PDB_ins_code insert.push_back(tmp_vec[ columns_map["_atom_site.pdbx_PDB_ins_code"] ]); //_atom_site.Cartn_x //_atom_site.Cartn_y //_atom_site.Cartn_z //_atom_site.occupancy o.push_back(stringToDouble(tmp_vec[ columns_map["_atom_site.occupancy"] ])); //_atom_site.B_iso_or_equiv b.push_back(stringToDouble(tmp_vec[ columns_map["_atom_site.B_iso_or_equiv"] ])); //_atom_site.Cartn_x_esd //_atom_site.Cartn_y_esd //_atom_site.Cartn_z_esd //_atom_site.occupancy_esd //_atom_site.B_iso_or_equiv_esd //_atom_site.pdbx_formal_charge charge.push_back(tmp_vec[ columns_map["_atom_site.pdbx_formal_charge"] ]); //_atom_site.auth_seq_id resno.push_back(stringToInt(tmp_vec[ columns_map["_atom_site.auth_seq_id"] ])); //_atom_site.auth_comp_id resid.push_back(tmp_vec[ columns_map["_atom_site.auth_comp_id"] ]); //_atom_site.auth_asym_id chain.push_back(tmp_vec[ columns_map["_atom_site.auth_asym_id"] ]); //_atom_site.auth_atom_id elety.push_back(tmp_vec[ columns_map["_atom_site.auth_atom_id"] ]); //_atom_site.pdbx_PDB_model_num model.push_back(stringToInt(tmp_vec[ columns_map["_atom_site.pdbx_PDB_model_num"] ])); } } } // while ( getline (myfile,line) ) { mystream.close(); } // end if (myfile.is_open()) { else { out = Rcpp::List::create(Rcpp::Named("error")="Error when reading file"); return(out); } // add names to helix / sheet vector /** NumericVector helix_start_out = wrap(helix_resno_start); helix_start_out.names() = helix_inserti; NumericVector helix_end_out = wrap(helix_resno_end); helix_end_out.names() = helix_inserte; */ // build output List out = Rcpp::List::create(Rcpp::Named("atom")= Rcpp::DataFrame::create( Rcpp::Named("type")=type, Rcpp::Named("eleno")=eleno, Rcpp::Named("elety")=elety, Rcpp::Named("alt")=alt, Rcpp::Named("resid")=resid, Rcpp::Named("chain")=chain, Rcpp::Named("resno")=resno, Rcpp::Named("insert")=insert, Rcpp::Named("x")=x, Rcpp::Named("y")=y, Rcpp::Named("z")=z, Rcpp::Named("o")=o, Rcpp::Named("b")=b, Rcpp::Named("segid")=entid, Rcpp::Named("elesy")=elesy, Rcpp::Named("charge")=charge, Rcpp::Named("stringsAsFactors")=false ), /** Rcpp::Named("helix")= Rcpp::List::create( Rcpp::Named("start")=helix_start_out, Rcpp::Named("end")=helix_end_out, Rcpp::Named("chain")=helix_chain, Rcpp::Named("type")=helix_type ), */ Rcpp::Named("xyz")=xyz, Rcpp::Named("models")=models ); return(out); } bio3d/src/read_pdb.cpp0000644000176200001440000002354114046015221014305 0ustar liggesusers#include #include #include #include #include "gzstream.h" #include "utils.h" #include "convert.h" using namespace std; using namespace Rcpp; // [[Rcpp::export('.read_pdb')]] List read_pdb(std::string filename, bool multi=false, bool hex=false, int maxlines=-1, bool atoms_only=false) { // out is a List object Rcpp::List out; // keep track of number of atoms and models in PDB int natoms = 0; int models = 0; int nresi = 0; // reset this when reading MODEL, END, ENDMDL // bump models when this is 0 int natoms_model = 0; // assign vectors for building final 'atom' object vector type; vector eleno; vector elety; vector alt; vector resid; vector chain; vector resno; vector insert; vector x; vector y; vector z; vector o; vector b; vector segid; vector elesy; vector charge; // xyz object vector xyz; // store HELIX / SHEET records vector helix_chain; vector helix_resno_start; vector helix_resno_end; vector helix_type; vector helix_inserti; vector helix_inserte; vector sheet_chain; vector sheet_resno_start; vector sheet_resno_end; vector sheet_sense; vector sheet_inserti; vector sheet_inserte; // store SEQRES vector seqres; vector seqres_chain; // store REMARK 350 lines vector remark350; // store HEADER string header; // temp variables string tmp; int tmp_eleno; int tmp_resno; // counter for seqres while loop int i; // values from prev string curr_record_str; string prev_eleno_str; string curr_eleno_str; string prev_resno_str; string curr_resno_str; string prev_chain; string curr_chain; int counter = 0; bool hex_eleno = false; bool hex_resno = false; // for reading vector raw_lines; string line; igzstream mystream; mystream.open(filename.c_str()); if (mystream.is_open()) { // read line by line while ( getline (mystream, line) ) { // break if user has provided maxlines argument counter++; if(maxlines != -1 && counter > maxlines) { break; } curr_record_str = trim(line.substr(0,6)); //cout << curr_record_str; // reset 'natoms_model' when reading END, ENDMDL or MODEL if(curr_record_str == "END" || curr_record_str == "ENDMDL" || curr_record_str == "MODEL") { natoms_model = 0; } // output header only if verbose=true else if(curr_record_str=="HEADER") { header = line; } // store helix info else if(curr_record_str=="HELIX" && !atoms_only) { helix_chain.push_back(trim(line.substr(19,1))); helix_resno_start.push_back(stringToInt(line.substr(21,4))); helix_resno_end.push_back(stringToInt(line.substr(33,4))); //helix_resno_start.push_back(std::stoi(line.substr(21,4))); //helix_resno_end.push_back(std::stoi(line.substr(33,4))); helix_type.push_back(trim(line.substr(38,2))); helix_inserti.push_back(trim(line.substr(25,1))); helix_inserte.push_back(trim(line.substr(37,1))); } // store sheet info else if(curr_record_str=="SHEET" && !atoms_only) { sheet_chain.push_back(trim(line.substr(21,1))); sheet_resno_start.push_back(stringToInt(line.substr(22,4))); sheet_resno_end.push_back(stringToInt(line.substr(33,4))); //sheet_resno_start.push_back(std::stoi(line.substr(22,4))); //sheet_resno_end.push_back(std::stoi(line.substr(33,4))); sheet_sense.push_back(trim(line.substr(38,2))); sheet_inserti.push_back(trim(line.substr(26,1))); sheet_inserte.push_back(trim(line.substr(37,1))); } // store SEQRES info else if(curr_record_str=="SEQRES" && !atoms_only) { i=0; while(19+(i*4) < (int) line.length()) { tmp = trim(line.substr(19+(i*4), 3)); if(tmp != "") { seqres.push_back(tmp); seqres_chain.push_back(trim(line.substr(11,1))); } i++; } } // store REMARK 350 records (raw lines only) else if(line.substr(0,10)=="REMARK 350" && !atoms_only) { remark350.push_back(trim(line)); } // store ATOM/HETATM records else if(curr_record_str=="ATOM" || curr_record_str=="HETATM") { // number of atoms in current model natoms_model++; // bump 'models' when reading first atom in model if(natoms_model == 1) { models++; } // break out of loop when visiting 2nd model if(multi == false && models > 1) { models = 1; break; } // read coordinates double tmpx = stringToDouble(line.substr(30,8)); double tmpy = stringToDouble(line.substr(38,8)); double tmpz = stringToDouble(line.substr(46,8)); // always store coords in xyz object xyz.push_back(tmpx); xyz.push_back(tmpy); xyz.push_back(tmpz); // only store other items for first MODEL if(models < 2) { natoms++; // x, y, z for 'atom' x.push_back(tmpx); y.push_back(tmpy); z.push_back(tmpz); // read atom number curr_eleno_str = trim(line.substr(6,5)); // enable parsing hexadecimals (e.g. from VMD) // issue warning if hexdec found if(natoms > 99999 && !hex_eleno && curr_eleno_str == "186a0" && prev_eleno_str == "99999") { if(!hex) { Rf_warning("possible hexadecimal atom numbering. re-run with 'hex=TRUE'"); } else { Rf_warning("hexadecimal atom numbering used for eleno > 99.999"); } hex_eleno = true; } if(hex && hex_eleno) { tmp_eleno = getHex(curr_eleno_str); } else { try { tmp_eleno = stringToInt(curr_eleno_str); } catch (...) { tmp_eleno = NA_INTEGER; } } prev_eleno_str = curr_eleno_str; // read residue number and chain identifier curr_resno_str = trim(line.substr(22,4)); curr_chain = trim(line.substr(21,1)); // count number of residues if(curr_resno_str != prev_resno_str) { // reset nresi if chain change if(curr_chain != prev_chain) { nresi = 0; hex_resno = false; } prev_chain = curr_chain; nresi++; } // enable parsing hexadecimals (e.g. from VMD) // issue warning if hexdec found if(nresi > 9999 && !hex_resno && curr_resno_str == "2710" && prev_resno_str == "9999") { if(!hex) { Rf_warning("possible hexadecimal residue numbering. re-run with 'hex=TRUE'"); } else { Rf_warning("hexadecimal residue numbering used for resno > 9.999"); } hex_resno = true; } if(hex && hex_resno) { tmp_resno = getHex(curr_resno_str); } else { try { tmp_resno = stringToInt(curr_resno_str); } catch (...) { tmp_resno = NA_INTEGER; } } prev_resno_str = curr_resno_str; // store eleno resno chain to arrays eleno.push_back(tmp_eleno); resno.push_back(tmp_resno); chain.push_back(curr_chain); // read all others items as they are type.push_back(rtrim(line.substr(0,6))); elety.push_back(trim(line.substr(12,4))); alt.push_back(trim(line.substr(16,1))); resid.push_back(trim(line.substr(17,4))); insert.push_back(trim(line.substr(26,1))); try{ o.push_back(stringToDouble(trim(line.substr(54,6)))); } catch(...) { o.push_back(NA_REAL); } try{ b.push_back(stringToDouble(trim(line.substr(60,6)))); } catch(...) { b.push_back(NA_REAL); } try{ segid.push_back(trim(trim(line.substr(72,4)))); } catch(...) { segid.push_back(""); } try{ elesy.push_back(trim(line.substr(76,2))); } catch(...) { elesy.push_back(""); } try{ charge.push_back(trim(line.substr(78,2))); } catch(...) { charge.push_back(""); } } } } // while ( getline (myfile,line) ) { mystream.close(); } // end if (myfile.is_open()) { else { out = Rcpp::List::create(Rcpp::Named("error")="Error when reading file"); return(out); } // add names to helix / sheet vector NumericVector helix_start_out = wrap(helix_resno_start); helix_start_out.names() = helix_inserti; NumericVector helix_end_out = wrap(helix_resno_end); helix_end_out.names() = helix_inserte; NumericVector sheet_start_out = wrap(sheet_resno_start); sheet_start_out.names() = sheet_inserti; NumericVector sheet_end_out = wrap(sheet_resno_end); sheet_end_out.names() = sheet_inserte; // build output List out = Rcpp::List::create(Rcpp::Named("atom")= Rcpp::DataFrame::create( Rcpp::Named("type")=type, Rcpp::Named("eleno")=eleno, Rcpp::Named("elety")=elety, Rcpp::Named("alt")=alt, Rcpp::Named("resid")=resid, Rcpp::Named("chain")=chain, Rcpp::Named("resno")=resno, Rcpp::Named("insert")=insert, Rcpp::Named("x")=x, Rcpp::Named("y")=y, Rcpp::Named("z")=z, Rcpp::Named("o")=o, Rcpp::Named("b")=b, Rcpp::Named("segid")=segid, Rcpp::Named("elesy")=elesy, Rcpp::Named("charge")=charge, Rcpp::Named("stringsAsFactors")=false ), Rcpp::Named("xyz")=xyz, Rcpp::Named("models")=models, Rcpp::Named("seqres")=seqres, Rcpp::Named("seqres_chain")=seqres_chain, Rcpp::Named("helix")= Rcpp::List::create( Rcpp::Named("start")=helix_start_out, Rcpp::Named("end")=helix_end_out, Rcpp::Named("chain")=helix_chain, Rcpp::Named("type")=helix_type ), Rcpp::Named("sheet")= Rcpp::List::create( Rcpp::Named("start")=sheet_start_out, Rcpp::Named("end")=sheet_end_out, Rcpp::Named("chain")=sheet_chain, Rcpp::Named("sense")=sheet_sense, Rcpp::Named("inserti")=sheet_inserti ), Rcpp::Named("remark350")=remark350, Rcpp::Named("header")=header ); return(out); } bio3d/src/utils.cpp0000644000176200001440000000203414046015221013677 0ustar liggesusers#include #include #include #include #include "utils.h" using namespace std; // trim from start string ltrim(string s) { s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](int ch) { return !std::isspace(ch); })); return s; } // trim from end string rtrim(string s) { s.erase(std::find_if(s.rbegin(), s.rend(), [](int ch) { return !std::isspace(ch); }).base(), s.end()); return s; } // trim from both ends string trim(string s) { return ltrim(rtrim(s)); } // function get hexadecimal int getHex(string hexstr) { return (int)strtol(hexstr.c_str(), 0, 16); } std::vector &split(const std::string &s, char delim, std::vector &elems) { std::stringstream ss(s); std::string item; while (std::getline(ss, item, delim)) { if(!item.empty()) elems.push_back(item); } return elems; } std::vector split(const std::string &s, char delim) { std::vector elems; split(s, delim, elems); return elems; } bio3d/src/gzstream.cpp0000644000176200001440000001174514046015221014404 0ustar liggesusers// ============================================================================ // gzstream, C++ iostream classes wrapping the zlib compression library. // Copyright (C) 2001 Deepak Bandyopadhyay, Lutz Kettner // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // ============================================================================ // // File : gzstream.C // Revision : $Revision: 1.1 $ // Revision_date : $Date: 2009-08-31 14:46:54 $ // Author(s) : Deepak Bandyopadhyay, Lutz Kettner // // Standard streambuf implementation following Nicolai Josuttis, "The // Standard C++ Library". // ============================================================================ #include "gzstream.h" #include #include // for memcpy #ifdef GZSTREAM_NAMESPACE namespace GZSTREAM_NAMESPACE { #endif // ---------------------------------------------------------------------------- // Internal classes to implement gzstream. See header file for user classes. // ---------------------------------------------------------------------------- // -------------------------------------- // class gzstreambuf: // -------------------------------------- gzstreambuf* gzstreambuf::open( const char* name, int open_mode) { if ( is_open()) return (gzstreambuf*)0; mode = open_mode; // no append nor read/write mode if ((mode & std::ios::ate) || (mode & std::ios::app) || ((mode & std::ios::in) && (mode & std::ios::out))) return (gzstreambuf*)0; char fmode[10]; char* fmodeptr = fmode; if ( mode & std::ios::in) *fmodeptr++ = 'r'; else if ( mode & std::ios::out) *fmodeptr++ = 'w'; *fmodeptr++ = 'b'; *fmodeptr = '\0'; file = gzopen( name, fmode); if (file == 0) return (gzstreambuf*)0; opened = 1; return this; } gzstreambuf * gzstreambuf::close() { if ( is_open()) { sync(); opened = 0; if ( gzclose( file) == Z_OK) return this; } return (gzstreambuf*)0; } int gzstreambuf::underflow() { // used for input buffer only if ( gptr() && ( gptr() < egptr())) return * reinterpret_cast( gptr()); if ( ! (mode & std::ios::in) || ! opened) return EOF; // Josuttis' implementation of inbuf int n_putback = gptr() - eback(); if ( n_putback > 4) n_putback = 4; memcpy( buffer + (4 - n_putback), gptr() - n_putback, n_putback); int num = gzread( file, buffer+4, bufferSize-4); if (num <= 0) // ERROR or EOF return EOF; // reset buffer pointers setg( buffer + (4 - n_putback), // beginning of putback area buffer + 4, // read position buffer + 4 + num); // end of buffer // return next character return * reinterpret_cast( gptr()); } int gzstreambuf::flush_buffer() { // Separate the writing of the buffer from overflow() and // sync() operation. int w = pptr() - pbase(); if ( gzwrite( file, pbase(), w) != w) return EOF; pbump( -w); return w; } int gzstreambuf::overflow( int c) { // used for output buffer only if ( ! ( mode & std::ios::out) || ! opened) return EOF; if (c != EOF) { *pptr() = c; pbump(1); } if ( flush_buffer() == EOF) return EOF; return c; } int gzstreambuf::sync() { // Changed to use flush_buffer() instead of overflow( EOF) // which caused improper behavior with std::endl and flush(), // bug reported by Vincent Ricard. if ( pptr() && pptr() > pbase()) { if ( flush_buffer() == EOF) return -1; } return 0; } // -------------------------------------- // class gzstreambase: // -------------------------------------- gzstreambase::gzstreambase( const char* name, int mode) { init( &buf); open( name, mode); } gzstreambase::~gzstreambase() { buf.close(); } void gzstreambase::open( const char* name, int open_mode) { if ( ! buf.open( name, open_mode)) clear( rdstate() | std::ios::badbit); } void gzstreambase::close() { if ( buf.is_open()) if ( ! buf.close()) clear( rdstate() | std::ios::badbit); } #ifdef GZSTREAM_NAMESPACE } // namespace GZSTREAM_NAMESPACE #endif // ============================================================================ // EOF // bio3d/src/convert.h0000644000176200001440000000127014046015221013665 0ustar liggesusers#include #include #include #include class BadConversion : public std::runtime_error { public: BadConversion(const std::string& s) : std::runtime_error(s) { } }; inline double stringToDouble(const std::string& s) { if(s=="") { return(NA_REAL); } std::istringstream i(s); double x; if (!(i >> x)) throw BadConversion("Could not convert string to double (\"" + s + "\")"); return x; } inline int stringToInt(const std::string& s) { if(s=="") { return(NA_INTEGER); } std::istringstream i(s); int x; if (!(i >> x)) throw BadConversion("Could not convert string to int (\"" + s + "\")"); return x; } bio3d/src/RcppExports.cpp0000644000176200001440000000432614046015221015036 0ustar liggesusers// Generated by using Rcpp::compileAttributes() -> do not edit by hand // Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 #include using namespace Rcpp; // read_cif List read_cif(std::string filename, int maxlines, bool multi); RcppExport SEXP _bio3d_read_cif(SEXP filenameSEXP, SEXP maxlinesSEXP, SEXP multiSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< std::string >::type filename(filenameSEXP); Rcpp::traits::input_parameter< int >::type maxlines(maxlinesSEXP); Rcpp::traits::input_parameter< bool >::type multi(multiSEXP); rcpp_result_gen = Rcpp::wrap(read_cif(filename, maxlines, multi)); return rcpp_result_gen; END_RCPP } // read_crd List read_crd(std::string filename); RcppExport SEXP _bio3d_read_crd(SEXP filenameSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< std::string >::type filename(filenameSEXP); rcpp_result_gen = Rcpp::wrap(read_crd(filename)); return rcpp_result_gen; END_RCPP } // read_pdb List read_pdb(std::string filename, bool multi, bool hex, int maxlines, bool atoms_only); RcppExport SEXP _bio3d_read_pdb(SEXP filenameSEXP, SEXP multiSEXP, SEXP hexSEXP, SEXP maxlinesSEXP, SEXP atoms_onlySEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< std::string >::type filename(filenameSEXP); Rcpp::traits::input_parameter< bool >::type multi(multiSEXP); Rcpp::traits::input_parameter< bool >::type hex(hexSEXP); Rcpp::traits::input_parameter< int >::type maxlines(maxlinesSEXP); Rcpp::traits::input_parameter< bool >::type atoms_only(atoms_onlySEXP); rcpp_result_gen = Rcpp::wrap(read_pdb(filename, multi, hex, maxlines, atoms_only)); return rcpp_result_gen; END_RCPP } // read_prmtop List read_prmtop(std::string filename); RcppExport SEXP _bio3d_read_prmtop(SEXP filenameSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< std::string >::type filename(filenameSEXP); rcpp_result_gen = Rcpp::wrap(read_prmtop(filename)); return rcpp_result_gen; END_RCPP } bio3d/vignettes/0000755000176200001440000000000014046127635013272 5ustar liggesusersbio3d/vignettes/bio3d_vignettes.Rmd0000644000176200001440000000465514046077017017036 0ustar liggesusers--- title: "bio3d Vignettes" date: "Sep 22 2016" output: rmarkdown::html_vignette vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{bio3d Vignettes} \usepackage[utf8]{inputenc} --- We distribute a number of extended **Bio3D vignettes** that provide worked examples of using Bio3D to perform a particular type of structural bioinformatics analysis. An updated list of these can be found on-line. At the time of writing these include: - [Installing Bio3D](http://thegrantlab.org/bio3d/articles/online/install_vignette/Bio3D_install.html) - [Getting started with Bio3D](http://thegrantlab.org/bio3d/articles/online/intro_vignette/Bio3D_introduction.html) - [PDB structure manipulation and analysis with Bio3D](http://thegrantlab.org/bio3d/articles/online/pdb_vignette/Bio3D_pdb.html) - [Beginning trajectory analysis with Bio3D](http://thegrantlab.org/bio3d/articles/online/traj_vignette/Bio3D_md.html) - [Enhanced methods for Normal Mode Analysis with Bio3D](http://thegrantlab.org/bio3d/articles/online/nma_vignette/Bio3D_nma.html) - [Comparative sequence and structure analysis with Bio3D](http://thegrantlab.org/bio3d/articles/online/pca_vignette/Bio3D_pca.html) - [Ensemble NMA of E.coli DHFR structures](http://thegrantlab.org/bio3d/articles/online/enma_vignettes/Bio3D_nma-dhfr-partI.html) - [Ensemble NMA across multiple species of DHFR](http://thegrantlab.org/bio3d/articles/online/enma_vignettes/Bio3D_nma-dhfr-partII.html) - [Protein structure network analysis with Bio3D](http://thegrantlab.org/bio3d/articles/online/cna_vignette/cna_vignette.spin.html) - [Introduction to Ensemble Difference Distance Matrix (eDDM) Analysis](http://thegrantlab.org/bio3d/articles/online/eddm_vignette/Bio3D_eddm.spin.html) - Online protein structure analysis with the Bio3D WebApp ( [PDF](http://thegrantlab.org/bio3d_v2/download/webapp-tutorials?download=22:bio3d-webapp-pca)) - Online Normal Mode Analysis with Bio3D WebApps ( PDF | HTML ) There is also extensive [on-line documentation](http://thegrantlab.org/bio3d/reference/) with worked examples (and their output) for all functions and a package manual (in [PDF](https://CRAN.R-project.org/package=bio3d/bio3d.pdf) format) that is a concatenation of each functions documentation (without example output). Note that for information on Bio3D development status or to report a bug, please refer to: https://bitbucket.org/Grantlab/bio3d/ bio3d/NEWS0000644000176200001440000003113514046015221011747 0ustar liggesusersNEWS ==== v2.4 Version 2.4, released November 2019, provides a number of new features and enhancements including: new facilities for sequence alignment using the 'msa' package from Bioconductor or alternatively using the online server of the European Bioinformatics Institute (EMBL-EBI) (and so a local MUSCLE program is no longer a mandate), a more robust sequence fetching function supporting both the EMBL-EBI and NCBI (National Center for Biotechnology Information) servers, a new function for "core" detection using contact maps, new and improved functions for processing protein structures and doing structural network analysis, and more advanced system environment checking for automatically locating essential external programs. We have also updated online vignettes and other documentations. For a fine-grained list of changes, or to report a bug, please consult: * [The issues log](https://bitbucket.org/Grantlab/bio3d/issues) * [The commit log](https://bitbucket.org/Grantlab/bio3d/commits/all) For full install instructions see: Major new/enhanced functions include: * seqaln: Supports using 'msa' and the EMBL-EBI server to do sequence alignment * get.seq: More robust to fetch a large number of sequences and supports EMBL-EBI and NCBI servers * atom.select.pdbs: New function for atom selection of a 'pdbs' object * core.cmap: New function for "core" residues detection using contact maps * chain.pdb: Supports inspection on peptide bond (C-N) length * community.aln: Comparison of networks with different numbers of nodes * dccm.pca, dccm.xyz: Tidier interface by merging "lmi()" and providing a new argument "method" * core.find, dccm.nma, dm.xyz, nma.pdbs, pdbaln, pdbsplit, read.fasta.pdb: Improved progress bar * dssp.pdb, pdbaln, pymol.dccm, pymol.modes, pymol.pdbs, seqaln: Exefile argument with OS dependent defaults * rmsd, seqidentity: More sensible output by fetching row and column names from input Happy Bio3Ding! v2.3 Version 2.3, released September 2016, provides a number of new features and enhancements including: new facilities for ensemble normal mode analysis (NMA) with all-atom elastic network model (ENM) and Gaussian network model (GNM), enhanced NMA calculations with the rotation-translation block (RTB) method, new "4-bead" coarse-grained ENM, more efficient reading of large PDB files using Rcpp, PDB annotation from the PFAM database, and more supported I/O file formats. We have also updated online vignettes and other documentations. For a fine-grained list of changes, or to report a bug, please consult: * [The issues log](https://bitbucket.org/Grantlab/bio3d/issues) * [The commit log](https://bitbucket.org/Grantlab/bio3d/commits/all) For full install instructions see: Major new/enhanced functions include: * aanma: All-atom ENM normal mode analysis (with RTB and 4-bead ENM supported) * aanma.pdbs: Ensemble NMA with all-atom ENM * gnm: Gaussian network model (GNM) calculations * gnm.pdbs: Ensemble NMA with GNM * dccm.gnm: Dynamical cross-correlation for GNM * pdbs2sse: Retrieve SSE from pdbs object with appropriate residue numbers for plotting * mask.dccm: Produce a new DCCM object with selected atoms masked * pdb.pfam: Function for PFAM annotation of PDB IDs * pymol.pdbs: Builds a pymol session from a 'pdbs' object * read.cif: Read a Protein Data Bank (mmCIF) coordinate file * read.dssp: For reading existing DSSP output files * read.stride: For reading existing STRIDE output files * read.crd: Read a CHARMM CARD (CRD) or AMBER coordinate file * read.prmtop: Read parameter and topology data from an AMBER PrmTop file * read.pdb: Use Rcpp to (more rapidly) read and parse PDB files * read.pdb2: Renamed old read.pdb function * plot.matrix.loadings: For plotting loadings obtained from pca.array() * community.aln: To align communities from two or more related networks * atom.select: Supports 'insert' identifier * vmd.cna and vmd.cnapath: Renamed view.cna and view.cnapath * pymol.dccm, pymol.modes, pymol.nma, and pymol.pca: Renamed view.xxx functions * plot.fasta: Improved plotting function for multiple sequence alignment * read.mol2, write.mol2, atom.select, trim, as.pdb: Read, write and manipulate mol2 files with functions Happy Bio3Ding! v2.2 Version 2.2, released in Feb 2015, contains new facilities for sub-optimal path analysis of biomolecular correlation networks, constructing biological units, identification and tidying of malformed PDB files, and improved secondary structure annotation of 'pdbs' objects and various plots. We have also updated and enhanced atom selection functionality and developed a new vignette detailing PDB structure manipulation and analysis facilities. For a fine- grained list of changes, or to report a bug, please consult: * [The issues log](https://bitbucket.org/Grantlab/bio3d/issues) * [The commit log](https://bitbucket.org/Grantlab/bio3d/commits/all) Major new functions include: * cnapath: Suboptimal Path Analysis for Correlation Networks * biounit: Biological Unit Construction * clean.pdb: Inspect And Clean Up A PDB Object * cat.pdb: Concatenate Multiple PDB Objects * pdb2sse: Obtain An SSE Sequence Vector From A PDB Object * bounds.sse: Obtain A SSE Object From An SSE Sequence Vector * aa.table: Updated amino acid reference data that replaces older 'aa.mass' * as.fasta: Convert alignment/sequence in matrix/vector format to a FASTA object. * as.pdb: Convert coordinate data to PDB format * as.select: Convert atomic indices to a atom.select object * as.xyz: Convert vectors and matrices to 'xyz' class objects * atom.select.pdb: Atom selection from PDB objects has been extensively updated * basename.pdb: Utility for manipulation of PDB file names * check.utility: Check and Report on Missing Bio3D Utility Programs * cmapt: Update contact map methods for pdb and xyz objects * cna: Update correlation network analysis methods for dccm and ensmb objects" * cnapath: Suboptimal Path Analysis for Correlation Networks * com: Updated center of mass methods for pdb and xyz objects * combine.select: Combine atom.select objects, renamed from previous 'combine.sel' * cov.enma: New method to Calculate Covariance Matrix from Ensemble Normal Modes" * cov2dccm: Calculates the N-by-N cross-correlation matrix from a 3N-by-3N covariance matrix * covsoverlap: New methods for nma and enma objects * dm: Distance matrix gets new methods for pdb and xyz class objects * dssp: Secondary Structure Analysis with DSSP gets new methods for pdb, xyz and pdbs class objects * geostas: Geometrically stable domain finder gets new methods for nma, enma, pdb, pdbs and xyz objects. * is.pdbs: Is an Object of Class pdbs * mono.colors: New color palette * pdb2sse: Obtain An SSE Sequence Vector From A PDB Object * pdbfit: Coordinate superposition gets new methods for multi-model pdb objects and pdbs objects. * read.crd: Can Now Read Coordinate Data from Amber or CHARMM * read.prmtop: Read AMBER Parameter/Topology files * var.pdbs: Pairwise Distance Variance in Cartesian Coordinates * plot: New or updated plot methods for 'cmap', 'geostas', and 'pca' class objects as well as a new plot.fluct() function that expands on plot.bio3d() for plotting atomic fluctuations from MD and NMA results. * print: New print methods for cnapath, enma, geostas, mol2, nma, pca, pdb, prmtop, rle2, select and sse objects. v2.1 ---- Version 2.1, released in Sep 2014, contains new facilities for Correlation Network Analysis (cna) and Geometrically Stable Domain finding (geostas). We have also changed 'PDB object data' storage from a matrix to a data.frame format. Improved methods and functionality for ensemble NMA are now also included along with extensive improvements to package vignettes and function documentation. For a fine-grained list of changes, or to report a bug, please consult: * [The issues log](https://bitbucket.org/Grantlab/bio3d/issues) * [The commit log](https://bitbucket.org/Grantlab/bio3d/commits/all) Major new functions include: * cna: Protein Dynamic Correlation Network Construction and Community Analysis. * plot.cna: Protein Structure Network Plots in 2D and 3D. * print.cna: Summarize and Print Features of a cna Network Graph * identify.cna: Identify Points in a CNA Protein Structure Network Plot * layout.cna: Protein Structure Network Layout * view.cna: View CNA Protein Structure Network Community Output in VMD * prune.cna: Prune A cna Network Object * community.tree: Reconstruction of the Girvan-Newman Community Tree for a CNA Class Object. * network.amendment: Amendment of a CNA Network According To A Input Community Membership Vector. * lmi: Linear Mutual Information Matrix * dccm.pca: Dynamic Cross-Correlation from Principal Component Analysis * filter.dccm: Filter for Cross-correlation Matrices (Cij) * cmap.filter: Contact Map Consensus Filtering * geostas (amsm.xyz): GeoStaS Domain Finder * bhattacharyya Bhattacharyya Coefficient * covsoverlap: Covariance Overlap * sip: Square Inner Product * cov.nma: Calculate Covariance Matrix from Normal Modes * mktrj.enma: Ensemble NMA Atomic Displacement Trajectory * pca.array: Principal Component Analysis of an array of matrices * hmmer: HMMER Sequence Search * plot.hmmer: Plot a Summary of HMMER Hit Statistics. * uniprot: Fetch UniProt Entry Data. * pfam: Download Pfam FASTA Sequence Alignment * hclustplot: Dendrogram with Clustering Annotation * write.pir: Write PIR Formated Sequences * mustang: Structure-based Sequence Alignment with MUSTANG * pdbs.filter: Filter or Trim a pdbs PDBs Object * dssp.pdbs: Secondary Structure Analysis of Aligned PDB Structures with DSSP * plot.fasta: Plot a Multiple Sequence Alignment * print.fasta: Printing Sequence Alignments * inspect.connectivity: Check the Connectivity of Protein Structures * var.xyz: Pairwise Distance Variance in Cartesian Coordinates * is.xyz(as.xyz, print.xyz): Is an Object of Class * setup.ncore: Setup for Running Bio3D Functions using Multiple CPU Cores v2.0 ---- Version 2.0, released in Nov 2013, contains over 30 new functions including enhanced Normal Mode Analysis facilities as well extensive improvements to existing code and documentation. For a fine-grained list of changes or to report a bug, please consult: * [The issues log](https://bitbucket.org/Grantlab/bio3d/issues) * [The commit log](https://bitbucket.org/Grantlab/bio3d/commits/all) Major new functions include: * aa2mass: Amino Acid Residues to Mass Converter * atom.index: Index of Atomic Masses * atom2mass(atom2ele, formula2mass): Atom Names to Mass Converter * binding.site: Binding Site Residues * com(com.xyz): Center of Mass * combine.sel: Combine Atom Selections From PDB Structure * dccm.enma: Cross-Correlation for Ensemble NMA (eNMA) * dccm.mean: Filter DCCM matrices * dccm.nma: Dynamic Cross-Correlation from Normal Modes Analysis * dccm.xyz: DCCM: Dynamical Cross-Correlation Matrix * deformation.nma: Deformation Analysis * dssp.trj: Secondary Structure Analysis of Trajectories with DSSP * fluct.nma: NMA Fluctuations * inner.prod: Mass-weighted Inner Product * is.pdb: Is an Object of Class pdb * is.select: Is an Object of Class atom.select * load.enmff(ff.calpha, ff.calphax, ff.anm, ff.pfanm, ff.sdenm, ff.reach): ENM Force Field Loader * mktrj.nma: NMA Atomic Displacement Trajectory * nma(build.hessian, print.nma): Normal Mode Analysis * nma.pdbs(print.enma): Ensemble Normal Mode Analysis * normalize.vector: Mass-Weighted Normalized Vector * pdb.annotate: Get Customizable Annotations From PDB * pdb2aln: Align a PDB structure to an existing alignment * pdb2aln.ind: Mapping between PDB atomic indices and alignment positions * pdbfit: PDB File Coordinate Superposition * pdbs2pdb: PDBs to PDB Converter * plot.enma: Plot eNMA Results * plot.nma: Plot NMA Results * plot.rmsip: Plot RMSIP Results * read.mol2: Read MOL2 File * sdENM: Index for the sdENM ff * sse.bridges: SSE Backbone Hydrogen Bonding * struct.aln: Structure Alignment Of Two PDB Files * view.dccm: Visualization of Dynamic Cross-Correlation * view.modes: Vector Field Visualization of Modes * vmd.colors: Color as in VMD Molecular Viewer Versioning ---------- Releases will be numbered with the following semantic versioning format: .- E.g.: 2.0-1 And constructed with the following guidelines: * Breaking backward compatibility bumps the major (and resets the minor and patch) * New additions without breaking backward compatibility bumps the minor (and resets the patch) * Bug fixes and misc changes bumps the patch For more information on SemVer, please visit http://semver.org/. ----- For changes prior to v1.1-6 (Apr 2013) please see the bio3d wki: * [Whats new wki page](http://bio3d.pbworks.com/w/page/7824486/WhatsNew) bio3d/R/0000755000176200001440000000000014046015221011446 5ustar liggesusersbio3d/R/exefile.R0000644000176200001440000000765614046015221013230 0ustar liggesusers.get.exepath <- function(prg) { paths <- list( pymol = list( Linux = c("/usr/bin/pymol", "/usr/local/bin/pymol"), Darwin = c("/Applications/MacPyMOL.app/Contents/MacOS/MacPyMOL", "/usr/bin/pymol", "/usr/local/bin/pymol"), Windows = c("C:/python27/PyMOL/pymol.exe", "C:/Program Files/PyMOL/PyMOL/PymolWin.exe", "C:/Program Files/PyMOL/PymolWin.exe"), ver = "-cq" ), muscle = list( Linux = c("/usr/bin/muscle", "/usr/local/bin/muscle"), Darwin = c("/usr/bin/muscle", "/usr/local/bin/muscle"), Windows = c("C:/Program Files/muscle.exe", "C:/Program Files/muscle3.8.31_i86win32.exe", "C:/Program Files/muscle/muscle.exe", "C:/Program Files/Muscle/muscle.exe", "C:/Program Files/seaview/muscle.exe", "C:/Program Files/seaview4/muscle.exe"), ver = "-version" ), clustalo = list( Linux = c("/usr/bin/clustalo", "/usr/local/bin/clustalo"), Darwin = c("/usr/bin/clustalo", "/usr/local/bin/clustalo"), Windows = c("C:/Program Files/clustalo.exe", "C:/Program Files/clustalo/clustalo.exe", "C:/Program Files/Clustalo/clustalo.exe", "C:/Program Files/seaview/clustalo.exe", "C:/Program Files/seaview4/clustalo.exe"), ver = "--version" ), dssp = list( Linux = c("/usr/bin/dssp", "/usr/local/bin/dssp"), Darwin = c("/usr/bin/dssp", "/usr/local/bin/dssp", "/usr/bin/mkdssp", "/usr/local/bin/mkdssp"), Windows = c("C:/Program Files/dssp.exe", "C:/Program Files/dssp-2.0.4-win32.exe", "C:/Program Files/dssp/dssp.exe", "C:/Program Files/Dssp/dssp.exe"), ver = "--version" ) ) ## user provided full path if(file.exists(prg) & !dir.exists(prg)) { return(prg) } ## try to automatically determine path exefile <- Sys.which(prg) if(nchar(exefile) == 0) { if(prg %in% c("pymol", "muscle", "clustalo", "dssp")) { ## determine os os1 <- Sys.info()["sysname"] ## use guess-paths defined above exefiles <- paths[[prg]][[os1]] fe <- file.exists(exefiles) if(any(fe)) { exefile <- exefiles[which(fe)[1]] } else { exefile <- NULL } } else { exefile <- NULL } } if(is.null(exefile)) { stop(paste0("could not determine path to '", prg, "'")) } return(exefile) } .test.exefile <- function(exefile) { prg <- tolower(basename(exefile)) if(grepl("muscle", prg)) { ver <- "-version" } if(grepl("pymol", prg)) { ver <- "-cq" } if(grepl("clustalo", prg)) { ver <- "--version" } if(grepl("dssp", prg)) { ver <- "--version" } os1 <- Sys.info()["sysname"] if (os1 == "Windows") { success <- shell(paste(shQuote(exefile), ver)) } else { success <- system(paste(exefile, ver), ignore.stderr = TRUE, ignore.stdout = TRUE) } if(!(success %in% c(0,1))) { return(FALSE) } else { return(TRUE) } } bio3d/R/dssp.xyz.R0000644000176200001440000000076114046015221013377 0ustar liggesusersdssp.xyz <- function(xyz, pdb, ...) { if(!is.pdb(pdb)) stop("provide a pdb object as obtained from function 'read.pdb'") if(!is.xyz(xyz) && !is.matrix(xyz)) stop("provide an xyz object containing the trajectory coordinates") sse.mat <- NULL dims <- dim(xyz) for (i in 1:dims[1L]) { pdb.tmp <- pdb pdb.tmp$xyz <- as.xyz(xyz[i,]) sse <- dssp.pdb(pdb.tmp, ...)$sse sse.mat <- rbind(sse.mat, sse) } ##sse.mat[ sse.mat==" " ] <- "-" return(sse.mat) } bio3d/R/pca.pdbs.R0000644000176200001440000000072514046015221013267 0ustar liggesusers"pca.pdbs" <- function(pdbs, core.find=FALSE, fit=FALSE, ...) { ## Log the call cl <- match.call() if(core.find & fit) { warning("incompatible arguments- neglecting 'fit=TRUE'") fit=FALSE } if(core.find) { core <- core.find(pdbs) pdbs$xyz = pdbfit(pdbs, core$c0.5A.xyz) } else if(fit) { pdbs$xyz = pdbfit(pdbs) } gaps.pos <- gap.inspect(pdbs$xyz) pc <- pca.xyz(pdbs$xyz[,gaps.pos$f.inds], ...) pc$call=cl return(pc) } bio3d/R/prune.cna.R0000644000176200001440000000406114046015221013463 0ustar liggesusersprune.cna <- function(x, edges.min=1, size.min=1) { ##-- Prune nodes based on number of edges and number of members ## prune.cna(net) ## ## Check for presence of igraph package oops <- requireNamespace("igraph", quietly = TRUE) if (!oops) { stop("igraph package missing: Please install, see: ?install.packages") } if(inherits(x, "cna")) { y <- summary.cna(x) network=x$community.network } else { warning("Input should be a 'cna' class object as obtained from cna()") network=x y <- NULL } if((edges.min==0) & (size.min==0)){ stop("Must specify a number greater than 0 for edges.min and/or size.min") } ## Identify nodes with less than 'edges.min' to other nodes. nodes.inds <- which(igraph::degree(network) < edges.min) ## Identify nodes with size less than 'size.min' ## cant use V(net$network)$size as these can be scaled ## so we will use the summary information in 'y' nodes.inds <- c(nodes.inds, which(y$size < size.min)) nodes.inds <- unique(nodes.inds) if( length(nodes.inds) == 0 ) { cat( "No Nodes Will Removed based on edges.min and size.min values" ) output = x } else { rm.vs <- igraph::V(network)[nodes.inds] cat( paste("Removing Nodes:", paste(rm.vs, collapse=", ")),"\n") ## Print details of removed with edges if(!is.null(y)) { w <- cbind(y$tbl[rm.vs,c("id","size")], "edges"=igraph::degree(network)[rm.vs], "members"=y$tbl[rm.vs,c("members")]) w <- w[order(w$id),] write.table(w, row.names=FALSE, col.names=TRUE, quote=FALSE,sep="\t") ## Residue raw network res2rm <- as.numeric(unlist(y$members[rm.vs])) x$communities$membership[res2rm] = NA } d <- igraph::delete.vertices(network, rm.vs) ## Will probably want to keep an edited old community object !!! output <- list("community.network"=d, "network"= x$network, ## UNCHANGED!!! "communities"=x$communities) } class(output) = class(x) return(output) } bio3d/R/rmsf.R0000644000176200001440000000217414046015221012544 0ustar liggesusers"rmsf" <- function(xyz, grpby = NULL, average = FALSE) { if(is.null(dim(xyz))) stop("input 'xyz' has NULL dimension") if(!is.null(grpby)) { if(is.pdb(grpby)) grpby <- paste(grpby$atom$resno, grpby$atom$chain, sep="-") if(length(grpby) != ncol(xyz)/3) stop("Length of 'grpby' doesn't match 'xyz'") } ## Cov function changed ~ R.2.7 my.sd <- function (x, na.rm = FALSE) { if (is.matrix(x)) apply(x, 2, my.sd, na.rm = na.rm) else if (is.vector(x)) { if(na.rm) x <- x[!is.na(x)] if(length(x) == 0) return(NA) sqrt(var(x, na.rm = na.rm)) } else if (is.data.frame(x)) sapply(x, my.sd, na.rm = na.rm) else { x <- as.vector(x) my.sd(x,na.rm=na.rm) } } fluct = rowSums( matrix( my.sd(xyz, na.rm = TRUE), ncol=3, byrow=TRUE )^2, na.rm=TRUE ) if(average) { if(ncol(xyz) %% 3 == 0) d = ncol(xyz) / 3 else d = ncol(xyz) return( sqrt( sum(fluct)/d ) ) } else { if(is.null(grpby)) return( sqrt( fluct ) ) else return( as.vector(tapply(sqrt( fluct ), as.factor(grpby), mean)) ) } } bio3d/R/summary.cnapath.R0000644000176200001440000001456614046015221014717 0ustar liggesuserssummary.cnapath <- function(object, ..., pdb = NULL, label = NULL, col = NULL, plot = FALSE, concise = FALSE, cutoff = 0.1, normalize = TRUE, weight = FALSE) { pa <- list(object, ...) if(!all(sapply(pa, inherits, "cnapath"))) stop("Input should be object(s) of the 'cnapath' class") if(is.null(label)) label = 1:length(pa) if(is.null(col)) col = 1:length(pa) out <- list() # store node degeneracy if(weight) { node.deg <- lapply(pa, function(x) { wt <- exp(-x$dist) uniq.nodes <- sort(unique(unlist(x$path))) tbl <- rep(0, length(uniq.nodes)) names(tbl) <- uniq.nodes for(i in 1:length(x$path)) { tbl[as.character(x$path[[i]])] <- tbl[as.character(x$path[[i]])] + wt[i] } tbl } ) } else { # read node numbers on paths y <- lapply(pa, function(x) unlist(x$path)) node.deg <- lapply(y, table) } if(normalize) { node.deg <- lapply(node.deg, function(x) x/max(x)) } # find on-path node by the cutoff yy <- lapply(node.deg, function(x) x[x >= cutoff]) onpath.node <- unique(names(unlist(yy))) i <- as.numeric(onpath.node) onpath.node <- onpath.node[order(i)] # generate the node degeneracy table o <- lapply(node.deg, function(x) { x <- x[match(onpath.node, names(x))] x[is.na(x)] <- 0 names(x) <- onpath.node x } ) # replace node id with pdb resid and resno if(!is.null(pdb)) { ca.inds <- atom.select(pdb, elety="CA", verbose = FALSE) resno <- pdb$atom[ca.inds$atom, "resno"] resid <- pdb$atom[ca.inds$atom, "resid"] chain <- pdb$atom[ca.inds$atom, "chain"] lig.inds <- atom.select(pdb, "ligand", verbose = FALSE) islig <- paste(chain, resno, sep="_") %in% paste(pdb$atom[lig.inds$atom, "chain"], pdb$atom[lig.inds$atom, "resno"], sep="_") resid[!islig] <- aa321(resid[!islig]) o <- lapply(o, function(x) { node <- as.numeric(names(x)) if(length(unique(pdb$atom[, "chain"])) > 1) n <- paste(chain[node], paste(resid[node], resno[node], sep=""), sep="_") else n <- paste(resid[node], resno[node], sep="") names(x) <- n x } ) } names(o) <- label out$network <- label out$num.paths <- sapply(pa, function(x) length(x$path)) out$hist <- lapply(pa, function(x) table(cut(x$dist, breaks=5, include.lowest = TRUE))) if(length(out$hist)==1) out$hist = out$hist[[1]] out$degeneracy <- do.call(rbind, o) if(normalize) out$degeneracy <- round(out$degeneracy, digits=2) if(plot) { opar <- par(no.readonly = TRUE) on.exit(par(opar)) layout(matrix(1:2, nrow=1), respect = TRUE) rgbcolors <- sapply(col, col2rgb) / 255 rgbcolors <- rbind(rgbcolors, alpha = 0.6) ##- for path length distribution y1 <- lapply(pa, function(x) hist(x$dist, breaks = 20, plot = FALSE) ) par(mar=c(4, 4, 1, 1)) plot(y1[[1]], freq = FALSE, col = do.call(rgb, as.list(rgbcolors[,1])), border = col[1], main = "Path Length Distribution", xlim = range(unlist(lapply(y1, "[[", "breaks"))), ylim = c(0, max(unlist(lapply(y1, "[[", "density")))), xlab = "Path length", ylab = "Probability density") box() if(length(y1) > 1) for(i in 2:length(y1)) { plot(y1[[i]], freq = FALSE, col = do.call(rgb, as.list(rgbcolors[,i])), border = col[i], add = TRUE) } legend("topleft", legend = label, bty = "n", text.col = col) ##- for node degeneracy y2 <- lapply(pa, function(x) unlist(x$path)) if(!is.null(pdb)) y2 <- lapply(y2, function(x) resno[x]) if(concise) { # re-number node to get more concise plot ii <- sort(unique(unlist(y2))) y2 <- lapply(y2, match, ii) } y2 <- lapply(y2, function(x) hist(x, breaks = c(seq(min(x), max(x), 1) - 0.5, max(x) + 0.5), plot = FALSE) ) par(mar=c(4, 4, 1, 1)) plot(y2[[1]], freq = TRUE, col = do.call(rgb, as.list(rgbcolors[,1])), lty = 0, main = "Node Degeneracy", xlim = range(unlist(lapply(y2, "[[", "breaks"))), ylim = c(0, max(unlist(lapply(y2, "[[", "counts")))), xlab = "Node no", ylab = "Number of paths") box() if(length(y2) > 1) for(i in 2:length(y2)) plot(y2[[i]], freq = TRUE, col = do.call(rgb, as.list(rgbcolors[,i])), lty = 0, add = TRUE) } return(out) } print.cnapath <- function(x, ...) { dots = list(...) if(is.list(x) && all(sapply(x, inherits, "cnapath"))) { if(!"label" %in% names(dots) || is.null(dots$label)) dots$label = names(x) names(x) <- NULL args = c(x, dots) o <- do.call(summary, args) } else { o <- summary(x, ...) } if("plot" %in% names(dots)) plot = dots$plot else plot = FALSE if(!plot) { if("normalize" %in% names(dots)) normalize = dots$normalize else normalize = TRUE if(length(o$network) > 1) { cat("Number of networks: ", length(o$network), "(", paste(o$network, collapse=", "), ")\n") } cat("Number of paths in network(s):\n") if(length(o$network) > 1) { cat(paste(" ", o$network, ": ", o$num.paths, sep="", collapse="\n"), sep="\n") cat("\n") } else { cat(" ", o$num.paths, "\n\n") } cat("Path length distribution: \n") if(length(o$network) > 1) { for(i in 1:length(o$network)) { cat(" --- ", o$network[i], " ---") print(o$hist[[i]]) cat("\n") } } else { print(o$hist) cat("\n") } cat("Node degeneracy table: \n\n") if(length(o$network) == 1) rownames(o$degeneracy) = "" if(normalize) print(format(o$degeneracy, nsmall=2), quote=FALSE) else print(o$degeneracy) } } plot.cnapath <- function(x, ...) { arg.default <- list(plot=TRUE) args <- .arg.filter(arg.default, ...) do.call(print.cnapath, c(list(x=x), args)) } plot.ecnapath <- function(x, ...) { if(!inherits(x, "ecnapath")) { stop("The input 'x' must be an object of class 'ecnapath'.") } plot.cnapath(x, ...) } bio3d/R/read.pdb2.R0000644000176200001440000002266714046015221013347 0ustar liggesusers"read.pdb2" <- function (file, maxlines=-1, multi=FALSE, rm.insert=FALSE, rm.alt=TRUE, ATOM.only = FALSE, verbose=TRUE) { if(missing(file)) { stop("read.pdb: please specify a PDB 'file' for reading") } if(!is.numeric(maxlines)) { stop("read.pdb: 'maxlines' must be numeric") } if(!is.logical(multi)) { stop("read.pdb: 'multi' must be logical TRUE/FALSE") } ##- Check if file exists locally or on-line toread <- file.exists(file) if(substr(file,1,4)=="http") { toread <- TRUE } ## Check for 4 letter code and possible on-line file if(!toread) { if(nchar(file)==4) { file <- get.pdb(file, URLonly=TRUE) cat(" Note: Accessing on-line PDB file\n") } else { stop("No input PDB file found: check filename") } } cl <- match.call() ## PDB FORMAT v3.3: colpos, datatype, name, description atom.format <- matrix(c(6, 'character', "type", # type(ATOM) 5, 'numeric', "eleno", # atom_no -1, NA, NA, # (blank) 4, 'character', "elety", # atom_ty 1, 'character', "alt", # alt_loc 4, 'character', "resid", # res_na 1, 'character', "chain", # chain_id 4, 'numeric', "resno", # res_no 1, 'character', "insert", # ins_code -3, NA, NA, # (blank) 8, 'numeric', "x", # x 8, 'numeric', "y", # y 8, 'numeric', "z", # z 6, 'numeric', "o", # o 6, 'numeric', "b", # b -6, NA, NA, # (blank) 4, 'character', "segid", # seg_id 2, 'character', "elesy", # element_symbol 2, 'character', "charge" # atom_charge (should be 'numeric'] ), ncol=3, byrow=TRUE, dimnames = list(c(1:19), c("widths","what","name")) ) trim <- function(s) { ##- Remove leading and trailing spaces from character strings s <- sub("^ +", "", s) s <- sub(" +$", "", s) s[(s=="")]<-"" s } split.fields <- function(x) { ##- Split a character string for data.frame fwf reading ## First splits a string 'x' according to 'first' and 'last' ## then re-combines to new string with ";" as separator x <- trim( substring(x, first, last) ) paste(x,collapse=";") } is.character0 <- function(x){length(x)==0 & is.character(x)} ##- Find first and last (substr) positions for each field widths <- as.numeric(atom.format[,"widths"]) # fixed-width spec drop.ind <- (widths < 0) # cols to ignore (i.e. -ve) widths <- abs(widths) # absolute vales for later st <- c(1, 1 + cumsum( widths )) first <- st[-length(st)][!drop.ind] # substr start last <- cumsum( widths )[!drop.ind] # substr end names(first) = na.omit(atom.format[,"name"]) names(last) = names(first) ##- Read 'n' lines of PDB file raw.lines <- readLines(file, n = maxlines) type <- substring(raw.lines, first["type"], last["type"]) ##- Check number of END/ENDMDL records raw.end <- sort(c(which(type == "END"), which(type == "ENDMDL"))) ## Check if we want to store multiple model data if (length(raw.end) > 1) { cat(" PDB has multiple END/ENDMDL records \n") if (!multi) { cat(" multi=FALSE: taking first record only \n") } else { cat(" multi=TRUE: 'read.dcd/read.ncdf' will be quicker! \n") raw.lines.multi <- raw.lines type.multi <- type } raw.lines <- raw.lines[ (1:raw.end[1]) ] type <- type[ (1:raw.end[1]) ] } ##- Check for 'n' smaller than total lines in PDB file if ( length(raw.end) !=1 ) { if (length(raw.lines) == maxlines) { cat(" You may need to increase 'maxlines' \n") cat(" check you have all data in $atom \n") } } ##- Shortened records if ATOM.only = TRUE if(ATOM.only) { raw.lines <- raw.lines[type %in% c("HEADER", "ATOM ", "HETATM")] type <- substring(raw.lines, first["type"], last["type"]) } ##- Parse REMARK records for storing symmetry matrices to ## build biological unit by calling 'biounit()' remark <- .parse.pdb.remark350(raw.lines) ##- Split input lines by record type raw.header <- raw.lines[type == "HEADER"] raw.seqres <- raw.lines[type == "SEQRES"] raw.helix <- raw.lines[type == "HELIX "] raw.sheet <- raw.lines[type == "SHEET "] raw.atom <- raw.lines[type %in% c("ATOM ","HETATM")] if (verbose) { if (!is.character0(raw.header)) { cat(" ", raw.header, "\n") } } ## Edit from Baoqiang Cao Nov 29, 2009 ## Old version: ## seqres <- unlist(strsplit( trim(substring(raw.seqres,19,80))," +")) ## New version seqres <- unlist(strsplit( trim(substring(raw.seqres,19,80))," +")) if(!is.null(seqres)) { seqres.ch <- substring(raw.seqres, 12, 12) seqres.ln <- substring(raw.seqres, 13, 17) seqres.in <- ( !duplicated(seqres.ch) ) names(seqres) <- rep(seqres.ch[seqres.in], times=seqres.ln[seqres.in]) } ## End Edit from Baoqiang: ##- Secondary structure if(length(raw.helix) > 0) { helix <- list(start = as.numeric(substring(raw.helix,22,25)), end = as.numeric(substring(raw.helix,34,37)), chain = trim(substring(raw.helix,20,20)), type = trim(substring(raw.helix,39,40))) ##- insert code for initial and end residues of helices insert.i <- trim(substring(raw.helix,26,26)) insert.e <- trim(substring(raw.helix,38,38)) names(helix$start) <- insert.i names(helix$end) <- insert.e } else { helix <- NULL } if(length(raw.sheet) > 0) { sheet <- list(start = as.numeric(substring(raw.sheet,23,26)), end = as.numeric(substring(raw.sheet,34,37)), chain = trim(substring(raw.sheet,22,22)), sense = trim(substring(raw.sheet,39,40))) ##- insert code for initial and end residues of sheets insert.i <- trim(substring(raw.sheet,27,27)) insert.e <- trim(substring(raw.sheet,38,38)) names(sheet$start) <- insert.i names(sheet$end) <- insert.e ##- remove repeated records for the same strand (e.g. in 1NH0) pa <- paste(sheet$start, insert.i, sheet$chain, sep='_') keep.inds <- which(!duplicated(pa)) sheet <- lapply(sheet, '[', keep.inds) } else { sheet <- NULL } ## 2014-04-23 ## Update to use single data.frame for ATOM and HETATM records ## file="2RGF"; multi=TRUE; ## file="./4q21.pdb"; maxlines=-1; multi=FALSE; ## rm.insert=FALSE; rm.alt=TRUE; het2atom=FALSE; verbose=TRUE atom <- read.table(text=sapply(raw.atom, split.fields), stringsAsFactors=FALSE, sep=";", quote='', colClasses=unname(atom.format[!drop.ind,"what"]), col.names=atom.format[!drop.ind,"name"], comment.char="", na.strings="") ##-- End data.frame update ##- Coordinates only object ###xyz.models <- c(t(atom[,c("x","y","z")])) xyz.models <- matrix(as.numeric(c(t(atom[,c("x","y","z")]))), nrow=1) ##- Multi-model coordinate extraction if (length(raw.end) > 1 && multi) { raw.atom <- raw.lines.multi[ type.multi %in% c("ATOM ","HETATM") ] if( (length(raw.atom)/length(raw.end)) ==nrow(atom) ){ ## Only work with models with the same number of atoms) tmp.xyz=( rbind( substr(raw.atom, first["x"],last["x"]), substr(raw.atom, first["y"],last["y"]), substr(raw.atom, first["z"],last["z"]) ) ) ## Extract coords to nrow/frame * ncol/xyz matrix xyz.models <- matrix( as.numeric(tmp.xyz), ncol=nrow(atom)*3, nrow=length(raw.end), byrow=TRUE) rownames(xyz.models) = NULL } else { warning(paste("Unequal number of atoms in multi-model records:", file)) } rm(raw.lines.multi) } rm(raw.lines, raw.atom) ##- Possibly remove 'Alt records' (m[,"alt"] != NA) if (rm.alt) { if ( sum( !is.na(atom[,"alt"]) ) > 0 ) { first.alt <- sort( unique(na.omit(atom[,"alt"])) )[1] cat(paste(" PDB has ALT records, taking",first.alt,"only, rm.alt=TRUE\n")) alt.inds <- which( (atom[,"alt"] != first.alt) ) # take first alt only if(length(alt.inds)>0) { atom <- atom[-alt.inds,] xyz.models <- xyz.models[ ,-atom2xyz(alt.inds), drop=FALSE ] } } } ##- Possibly remove 'Insert records' if (rm.insert) { if ( sum( !is.na(atom[,"insert"]) ) > 0 ) { cat(" PDB has INSERT records, removing, rm.insert=TRUE\n") insert.inds <- which(!is.na(atom[,"insert"])) # rm insert positions atom <- atom[-insert.inds,] xyz.models <- xyz.models[ ,-atom2xyz(insert.inds), drop=FALSE ] } } output<-list(atom=atom, #het=atom[atom$type=="HETATM",], helix=helix, sheet=sheet, seqres=seqres, xyz=as.xyz(xyz.models), calpha = NULL, remark = remark, call=cl) class(output) <- c("pdb", "sse") ca.inds <- atom.select.pdb(output, string="calpha", verbose=FALSE) output$calpha <- seq(1, nrow(atom)) %in% ca.inds$atom return(output) } bio3d/R/plot.pca.scree.R0000644000176200001440000000235414046015221014415 0ustar liggesusers`plot.pca.scree` <- function(x, y=NULL, type="o", pch=18, main="", sub="", xlim=c(0,20), ylim=NULL, ylab="Proportion of Variance (%)", xlab="Eigenvalue Rank", axes=TRUE, ann=par("ann"), col=par("col"), lab=TRUE, ...) { if(is.list(x)) x=x$L # output from pca.xyz() PC <- c(1:length(x)) percent <- (x/sum(x))*100 cumv<-cumsum(percent) #xy <- xy.coords(x, y) xy <- xy.coords(percent, y=NULL) if (is.null(xlim)) xlim <- range(xy$x[is.finite(xy$x)]) if (is.null(ylim)) ylim <- range(xy$y[is.finite(xy$y)]) opar <- par(no.readonly=TRUE) on.exit(par(opar)) plot.new() plot.window(xlim, ylim)#, ...) points(xy$x, xy$y, col=col, type=type, pch=pch)#, ...) if (axes) { axis(1, at=c(1:8,max(xlim))) axis(2, at=c(round(percent[c(1:5)],1),0)) ##axis(1) ##axis(2) box() } if(lab) { text(c(1:4), percent[c(1:4)], labels=round(cumv[c(1:4)],1), pos=4) text(c(8,20), percent[c(8,20)], labels=round(cumv[c(8,20)],1), pos=3) } if (ann) { if(is.null(xlab)) xlab=xy$xlab if(is.null(ylab)) ylab=xy$ylab title(main=main, sub=sub, xlab=xlab, ylab=ylab, ...) } out<-list(pc=PC,percent=percent,cumv=cumv) } bio3d/R/project.pca.R0000644000176200001440000000231414046015221014001 0ustar liggesusers"project.pca" <- function(data, pca, angular=FALSE, fit=FALSE, ...) { if(angular) data <- wrap.tor(data) if(is.null(dim(data))) { if(ncol(pca$U) != length(data)) stop("Dimensionality mismatch: length(data)!=ncol(pca$U)") if(fit) data <- fit.xyz(pca$mean, data, ...) z <- (data - pca$mean) %*% pca$U } else { if(ncol(pca$U) != ncol(data)) stop("Dimensionality mismatch: ncol(data)!=ncol(pca$U)") if(fit) data <- fit.xyz(pca$mean, data, ...) z <- sweep(data, 2, pca$mean) %*% pca$U } return(z) } z2xyz.pca <- function(z.coord, pca) { if(is.null(nrow(z.coord))) { if( length(z.coord) > ncol(pca$U) ) stop("Dimension miss-match: length(z.coord) > ncol(pca$U)") xyz.coord <- (z.coord %*% t(pca$U[, c(1:length(z.coord)) ]) ) + pca$mean } else { if( ncol(z.coord) > ncol(pca$U) ) stop("Dimension miss-match: ncol(z.coord) > ncol(pca$U)") xyz.coord <- NULL for(i in 1:nrow(z.coord)) { xyz.coord <- rbind(xyz.coord, (z.coord[i,] %*% t(pca$U[, c(1:length(z.coord[i,])) ]) ) + pca$mean) } } return(xyz.coord) } xyz2z.pca <- function(xyz.coord, pca) { return(project.pca(xyz.coord, pca)) } bio3d/R/setup.ncore.R0000644000176200001440000000221714046015221014040 0ustar liggesuserssetup.ncore <- function(ncore, bigmem = FALSE) { if(is.null(ncore) || ncore > 1) { os1 <- .Platform$OS.type if(os1 == "windows") { if(is.null(ncore)) ncore = 1 else stop("Multicore is NOT supported in Windows (Set ncore = 1 or NULL)") } else { if(bigmem) { oops <- requireNamespace("bigmemory", quietly = TRUE) if(!oops) { if(is.null(ncore)) ncore <- 1 else stop("Please install the bigmemory package from CRAN for running with multicore") } } if(is.null(ncore)) ncore = parallel::detectCores() ## parallel::detectCores() returns 'NA' if the answer is unknown if(is.na(ncore)) ncore <- 1 # Following lines check R internal varible for potential limit on multicore usage # Normally it does nothing, but will be helpful in running `R CMD check --as-cran` if(ncore > 1) { chk <- tolower(Sys.getenv("_R_CHECK_LIMIT_CORES_", "")) if (nzchar(chk) && (chk != "false")) ncore = 1 } } } options(mc.cores = ncore) return(ncore) } bio3d/R/cmap.pdb.R0000644000176200001440000000310114046015221013250 0ustar liggesuserscmap.pdb <- function(pdb, inds=NULL, verbose=FALSE, ...) { if(!is.pdb(pdb)) stop("provide a pdb object as obtained from function 'pdb'") if(is.null(inds)) { inds <- atom.select(pdb, "notwater", verbose=verbose) } pdb <- trim.pdb(pdb, inds) xyz <- pdb$xyz grpby <- paste(pdb$atom$chain, pdb$atom$insert, pdb$atom$resno, sep="-") return(cmap.xyz(xyz, grpby, ...)) } cmap.pdbs <- function(pdbs, rm.gaps=FALSE, all.atom=FALSE, ...) { if(!is.pdbs(pdbs)) stop("Input should be a 'pdbs' object as obtained from 'read.fasta.pdb()' or 'read.all()'.") if(rm.gaps) { dots <- list(...) if("grpby" %in% names(dots) && !is.null(dots[["grpby"]])) { if(length(unique(dots[["grpby"]])) != ncol(pdbs$ali)) { stop("rm.gaps=TRUE not supported for non-residue wise grouping.") } } } if(!all.atom) { # set a new default value of dcut for CA-CA contact map cmap.default <- list(dcut=10.0, collapse=FALSE) cmap.args <- .arg.filter(cmap.default, cmap.xyz, ...) cm <- do.call("cmap.xyz", c(list(xyz=pdbs$xyz), cmap.args)) } else { # set a new default value of grpby for all-atom contact map cmap.default <- list(grpby=pdbs$all.grpby, collapse=FALSE) cmap.args <- .arg.filter(cmap.default, cmap.xyz, ...) cm <- do.call("cmap.xyz", c(list(xyz=pdbs$all), cmap.args)) } if(rm.gaps) { gaps.res <- gap.inspect(pdbs$ali) ndim <- length(dim(cm)) if(ndim>2) { cm <- cm[gaps.res$f.inds, gaps.res$f.inds, ] } else { cm <- cm[gaps.res$f.inds, gaps.res$f.inds] } } return(cm) } bio3d/R/core.cmap.R0000644000176200001440000000762014046015221013445 0ustar liggesusers"core.cmap" <- function(pdbs, write.pdb = FALSE, outfile = "core.pdb", cutoff = NULL, refine = FALSE, ncore = NULL, ...) { ## Quickly find core positions that have the largest number ## of contact with neighboring residues ncore <- setup.ncore(ncore) if(is.pdbs(pdbs)) { xyz=pdbs$xyz xyz.inds <- gap.inspect(xyz)$f.inds res.inds <- gap.inspect(pdbs$ali)$f.inds pdbseq = aa123(pdbs$ali[1,]); pdbnum = pdbs$resno[1,] } else if(is.xyz(pdbs)) { xyz <- pdbs xyz.inds <- gap.inspect(xyz)$f.inds res.inds <- xyz2atom(xyz.inds) pdbseq = rep("ALA",length(xyz.inds)/3) pdbnum = c(1:(length(xyz.inds)/3)) } else { stop("input 'pdbs' should either be: a 'pdbs' object as obtained from 'read.fasta.pdb' or a numeric 'xyz' matrix of aligned coordinates") } if(is.null(cutoff)) cutoff <- 1/sqrt(length(res.inds)) cmap.default <- list(dcut=10, scut=3, pcut=1, mask.lower=FALSE, ncore=ncore) cmap.args <- .arg.filter( cmap.default, FUN=cmap.xyz, ...) cm <- do.call(cmap.xyz, c(list(xyz=xyz[, xyz.inds]), cmap.args) ) cm[is.na(cm)] <- 0 dm.default <- list(scut=3, mask.lower=FALSE, ncore=ncore) dm.args <- .arg.filter( dm.default, FUN=dm.xyz, ... ) distmat <- do.call(dm.xyz, c(list(xyz=xyz[, xyz.inds]), dm.args) ) distmat[is.na(distmat)] <- 0 if(!is.na(dim(distmat)[3L])) lt <- apply(distmat, 3, function(x) x[lower.tri(x)]) else lt <- as.matrix(distmat[lower.tri(distmat)]) # mask <- apply(lt, 1, function(x) all(x==0)) # vars <- apply(lt, 1, var) m <- rowMeans(lt) vars <- rowSums((lt - m)^2)/(ncol(lt)-1) # vars[vars>0] <- 1/(vars[vars>0]) # normalize vars to solve numerical problems when some vars are very small vmin <- min(vars[cm[lower.tri(cm)]==1]) vmax <- max(vars[cm[lower.tri(cm)]==1]) if(vmax > vmin) vars <- (vmax - vars) / (vmax - vmin) else vars <- 1 # ignore weight # vars <- 0.5 * (cos(vars * pi ) + 1) * 100 varmat <- array(0, dim=dim(cm)) varmat[lower.tri(varmat)] <- vars varmat[!cm] <- 0 # calculate eigenvector centrality based on the weighted contact network ei <- eigen(varmat, symmetric=TRUE) if(refine) { # find all possible "core" positions in the top 10 PCs rsmall <- 0.01 U <- ei$vector[, 1:10] U[abs(U) < rsmall] <- 0 bcalc <- apply(U, 2, function(x) all(x>=0) | all(x<=0)) if(sum(bcalc)==0) stop('No valid eigenvector to define core atoms.') core.all <- apply(U[, bcalc, drop=FALSE], 2, function(x) { core <- list() core$atom <- res.inds[abs(x) > cutoff] core$xyz <- atom2xyz(core$atom) core }) error.ellipsoid<-function(pos.xyz) { S<-var(pos.xyz) prj <- eigen(S, symmetric = TRUE) prj$values[prj$values < 0 & prj$values >= -1.0E-12]<-1.0E-12 vol<-4/3*pi*prod( sqrt( prj$values ) ) out<-list(vol=vol, U=prj$vectors, L=prj$values) } if(length(core.all) > 1) { sv <- sapply(core.all, function(x) { if(length(x$atom) >=3) { xyz <- fit.xyz(pdbs$xyz[1, ], pdbs, x$xyz, x$xyz) xyz <- xyz[, xyz.inds] sum( sapply(1:(ncol(xyz)/3), function(i) error.ellipsoid(xyz[, atom2xyz(i)])$vol) ) } else { -1 } }) sv[sv==-1] <- max(sv) core <- core.all[[which.min(sv)]] } else { core <- core.all[[1]] } } else { core <- list() core$atom <- res.inds[abs(ei$vector[, 1]) > cutoff] core$xyz <- atom2xyz(core$atom) } if(length(core$atom) < 3) { warning('Too few core atoms to do a proper fitting.') core$atom <- res.inds[order(abs(ei$vector[, 1]), decreasing=TRUE)[1:3]] core$xyz <- atom2xyz(core$atom) } if(write.pdb) write.pdb(xyz=xyz[1, core$xyz], resno=pdbnum[core$atom], resid=pdbseq[core$atom], file=outfile) class(core) <- 'select' return(core) } bio3d/R/filter.cmap.R0000644000176200001440000000244614046015221014003 0ustar liggesusersfilter.cmap <- function(cm, cutoff.sims = NULL) { ## Convert list to array if(is.list(cm)) { dims <- dim(cm[[1]]) if(length(dims) != 2) stop("Input 'cm' should be a NxNxS 3d array or a list of NxN matrices, where N is the number of atoms and S is the number of simulations") if(length(unique(c(sapply(cm, dim)))) != 1) stop("Matrices in provided list have unequal dimensions") cm <- array(unlist(cm), dim = c(nrow(cm[[1]]), ncol(cm[[1]]), length(cm))) } ## Check input dims <- dim(cm) if(length(dims) != 3) { stop("Input 'cm' should be a NxNxS 3d array or a list of NxN matrices, where N is the number of atoms and S is the number of simulations") } if(dims[3L] < 2) stop("2 or more contact maps required") if(is.null(cutoff.sims)) cutoff.sims <- dims[3L] if(!is.numeric(cutoff.sims) | cutoff.sims > dims[3L] | cutoff.sims < 1) { stop(paste("Input 'cutoff.sims' should be a number between 1 and", dims[3L], "\n ", "(i.e. the number of simulations upon which filtering is based)")) } ## Sum across simulations and filter by cutoff.sims de cm.sum <- apply(cm, c(1:2), sum, na.rm = TRUE) return(array(as.numeric(cm.sum >= cutoff.sims), dim = dim(cm.sum))) } bio3d/R/layout.cna.R0000644000176200001440000000476514046015221013662 0ustar liggesuserslayout.cna <- function(x, pdb, renumber=TRUE, k=2, full=FALSE){ ## Return the coordinate centers of network communities ## as defined in "x$communities$membership" 'membership vector' ## using Calpha's in 'pdb'. ## ## If k=3 the xyz geometric centers are returned. if k<3 then ## multidimensional scaling is used for k space ordination. ## ## co2 <- layout.cna(net, pdb) ## co3 <- layout.cna(net, pdb, k=3) ## all2 <- layout.cna(net, pdb, k=2, full=TRUE) ## plot.cna(net, layout=co2) if( !inherits(pdb, "pdb") ) { stop("Input 'pdb' is not of class 'pdb' as obtained from 'read.pdb()'") } if(!k %in% c(1,2,3)) { stop("Input 'k' should have a value of 3, 2 or 1") } if(inherits(x, "cna") || is.list(x)) { if(!full) { ## We want community coords membership <- x$communities$membership } else { ## We want full all-atom/Calpha coords (check network for number) membership <- c(1:length(x$communities$membership)) } } else { if(full) { ## Assuming we want Calpha coords - this is a BIG assumption! membership <- c(1:sum(pdb$calpha)) } stop("Input object 'x' should be of class cna") } ## Renumber 'pdb' to match membership resno indices if(renumber) { pdb <- convert.pdb(pdb, renumber=TRUE, rm.h=FALSE, verbose=FALSE) } ##-- Check if the number of residues in 'pdb' equals ## the length of 'membership' vector notprotein.inds <- atom.select(pdb, "notprotein", verbose=FALSE) if(length(notprotein.inds$atom)>0){ num.res <- length(pdb$atom[pdb$calpha,"resno"]) + length(unique(pdb$atom[notprotein.inds$atom,7])) } if(length(notprotein.inds$atom)==0){ num.res <- length(pdb$atom[pdb$calpha,"resno"]) } ##-- Calculate the geometric center of each community n <- unique(membership[!is.na(membership)]) cent <- matrix(NA, nrow=length(n), ncol=3) a <- 1 for(i in n){ inds <- atom.select(pdb, resno=which(membership==i), elety="CA", verbose=FALSE) cent[a,] <- apply( matrix(pdb$xyz[inds$xyz], nrow=3), 1, mean) a <- a + 1 } if(k != 3) { ##-- Multidimensional scaling for 2D or 1D projection ## note. dist(centers) and dist.xyz(centers) give same answer if(nrow(cent) - 1 < k) { # e.g. only two communities cent <- cmdscale(dist(cent), k = nrow(cent) - 1) cent <- cbind(cent, matrix(0, nrow=nrow(cent), ncol=k-nrow(cent)+1)) } else { cent <- cmdscale(dist(cent),k=k) } } return(cent) } bio3d/R/plot.cna.R0000644000176200001440000001305314046015221013311 0ustar liggesusersplot.ecna <- function(x, ...) { if(!inherits(x, "ecna")) { stop("The input 'x' must be an object of class 'ecna'.") } n <- length(x) if(n == 1) { return( plot(x[[1]], ...) ) } if(n > 9) { stop("Plotting for more than 9 networks is not supported.") } opar <- par(no.readonly = TRUE) on.exit(par(opar)) if(n<=6) { # N x 2 nr <- floor( (n-1) / 2 ) + 1 layout(matrix(1:(nr*2), ncol=2, byrow=TRUE), respect = TRUE) } else { # 3 x 3 layout(matrix(1:9, ncol=3, byrow=TRUE), respect = TRUE) } par(mar=c(0,0,2,0)) invisible( sapply(1:n, function(i) { x <- x[[i]] arg.default <- list(main=paste("Network", i)) arg <- .arg.filter(arg.default, FUN=NULL, ...) do.call("plot", c(list(x=x), arg)) }) ) } plot.cna <- function(x, pdb=NULL, weights=NULL, vertex.size=NULL, layout=NULL, col=NULL, full=FALSE, scale = TRUE, color.edge = FALSE, interactive = FALSE, ...) { ##- Function for plotting cna networks the way we like them. ## Returns the plot layout coordinates silently. These can ## be passed to identify.cna() ## ##- Examples: ## plot.cna(net) ## plot.cna(net, pdb) ## plot.cna(net, layout=layout.cna(net,pdb)) ## plot.cna(net, layout=layout.cna(net,pdb, full=TRUE), full=TRUE) ## plot.cna(net, full=T, layout=layout.cna(net,pdb, full=T), vertex.size=3, weights=1, vertex.label=NA) ## ##- Other options: ## \dots can contain all ?igraph.plotting options, including: ## col=vmd_colors(), ## mark.groups=list() - A list of vertex id vectors ## mark.col=vmd_colors(alpha=0.3), ## mark.border=vmd_colors() ## etc... see ?plot.igraph ## AND ## vertex.size: Node sizes: V(x$network)$size ## vertex.color: Node colors: V(x$network)$color ## vertex.label: Node labels: V(x$network)$name - use NA to omit ## edge.width: Edge weights: E(x$network)$weight ## edge.color: Edge colors: E(x$network)$color ## (also vertex.label.color, vertex.label.cex etc. ## see ?igraph.plotting) ## ## Check for presence of igraph package oops <- requireNamespace("igraph", quietly = TRUE) if (!oops) { stop("igraph package missing: Please install, see: ?install.packages") } # if(color.edge) { # oops <- require(classInt) # if (!oops) { # warning("package classInt missing: color.edge is set to FALSE. # To make color.edge work, please install the missing package. See: ?install.packages") # color.edge = FALSE # } # } ##- Determine which network to plot along with node size if(full) { ## Plot the 'full' all-atom network y <- x$network if(is.null(vertex.size)) { ## Scale up the node size to something visible if(max(igraph::V(y)$size) < 10) { igraph::V(y)$size = igraph::V(y)$size + 13 } } } else { ## Plot the 'coarse-grained' community network y <- x$community.network ## here we will leave the node size as is } ##- Determine edge weights and scale values for plotting if(is.null(weights)){ ## Use weights defined in network weights <- igraph::E(y)$weight if(is.null(x$call$minus.log)){ ## If '$call$mins.log' is NULL => -log option was used in cna() ## so we we will revert back with exponential here weights <- exp(-weights) } else{ if(x$call$minus.log){ ## Again here we have 'minus.log=TRUE' weights <- exp(-weights) } } ## Lets scale the weights to lie between 1 and 5 # weights <- (weights - min(weights)) / max(weights - min(weights)) * (1 - 5) + 5 if(scale && (length(weights)>1)) weights <- (weights - min(weights)) / max(weights - min(weights)) * 4 + 1 else weights <- 10 * weights } ##- Obtain the plot layout coords if(!is.null(pdb) && is.null(layout)) { cat("Obtaining layout from PDB structure\n") layout = layout.cna(x, pdb, full=full) } if(is.null(pdb) && is.null(layout)) { cat("Obtaining estimated layout with fruchterman.reingold\n") layout <- igraph::layout.fruchterman.reingold(y, weights=weights) } if(dim(layout)[2] != 2){ stop("Input 'layout' must be an Nx2 matrix, where N is the number of communities") } if(color.edge) { # vec2color <- function(vec, pal=c("blue", "green", "red"), n=10) { # ##-- Define a color scale from a numeric vector # return( findColours(classIntervals(vec, n=n, style="equal"), pal) ) # } vec2color <- function(vec, pal=c("blue", "green", "red"), n=30) { col <- colorRampPalette(pal)(n) vec.cut <- cut(vec, seq(min(vec), max(vec), length.out=n), include.lowest = TRUE) levels(vec.cut) <- 1:length(col) return( col[vec.cut] ) } colors <- vec2color(weights) if(interactive) igraph::tkplot(y, edge.width=weights, edge.color = colors, layout=layout, vertex.color=col, vertex.size=vertex.size, ...) else igraph::plot.igraph(y, edge.width=weights, edge.color = colors, layout=layout, vertex.color=col, vertex.size=vertex.size, ...) } else { if(interactive) igraph::tkplot(y, edge.width=weights, layout=layout, vertex.color=col, vertex.size=vertex.size, ...) else igraph::plot.igraph(y, edge.width=weights, layout=layout, vertex.color=col, vertex.size=vertex.size, ...) } ## Silently return plot coordinates #class(layout) = "cna" layout <- layout } bio3d/R/cna.R0000644000176200001440000000030414046015221012327 0ustar liggesusers`cna` <- function(cij, ...) { if(inherits(cij, "matrix")) { class(cij) <- c("matrix", "dccm") UseMethod("cna", cij) } else { class(cij) <- c("ensmb") UseMethod("cna", cij) } } bio3d/R/print.geostas.R0000644000176200001440000000123514046015221014372 0ustar liggesusers"print.geostas" <- function(x, ...) { cn <- class(x) ndoms <- length(unique(x$grps)) dims <- dim(x$amsm) cat("\nCall:\n ", paste(deparse(x$call), sep = "\n", collapse = "\n"), "\n\n", sep = "") cat("Class:\n ", cn, "\n\n", sep = "") cat("Dimensions of AMSM:\n ", dims[1], "x", dims[2], "\n\n", sep="") cat("Number of domains:\n ", ndoms, "\n\n", sep="") cat("Domain size:\n") for(i in 1:ndoms) { cat(" #", i, ": ", length(x$inds[[i]]$atom), " atoms \n", sep="") } cat("\n") i <- paste( attributes(x)$names, collapse=", ") cat(strwrap(paste(" + attr:",i,"\n"),width=60, exdent=8), sep="\n") invisible(x) } bio3d/R/print.enma.R0000644000176200001440000000277514046015221013657 0ustar liggesusers"print.enma" <- function(x, ...) { cn <- class(x) nstruct <- nrow(x$fluctuations) dims <- dim(x$U.subspace) if(is.null(x$call$rm.gaps)) rm.gaps <- TRUE else if(x$call$rm.gaps=="T" || x$call$rm.gaps=="TRUE") rm.gaps <- TRUE else rm.gaps <- FALSE if(is.null(x$call$fit)) fit <- TRUE else if(x$call$fit=="T" || x$call$fit=="TRUE") fit <- TRUE else fit <- FALSE cat("\nCall:\n ", paste(deparse(x$call), sep = "\n", collapse = "\n"), "\n\n", sep = "") cat("Class:\n ", cn, "\n\n", sep = "") cat("Number of structures:\n ", nstruct, "\n\n", sep="") cat("Attributes stored:\n") if(!is.null(x$full.nma)) cat(" - Full 'nma' objects\n") if(!is.null(x$rmsip)) cat(" - Root mean square inner product (RMSIP)\n") if(!is.null(x$fluctuations)) cat(" - Aligned atomic fluctuations\n") if(rm.gaps) cat(" - Aligned eigenvectors (gaps removed)\n") else cat(" - Aligned eigenvectors (gaps not removed)\n") cat(" - Dimensions of x$U.subspace: ", dims[1L], "x", dims[2L], "x", dims[3L], sep="") cat("\n\n") if(fit) cat("Coordinates were aligned prior to NMA calculations") else cat("Coordinates were NOT aligned prior to NMA calculations") cat("\n\n") i <- paste( attributes(x)$names, collapse=", ") cat(strwrap(paste(" + attr:",i,"\n"),width=60, exdent=8), sep="\n") invisible(x) } bio3d/R/pca.xyz.R0000644000176200001440000000723714046015221013176 0ustar liggesusers"pca.xyz" <- function(xyz, subset = rep(TRUE, nrow(as.matrix(xyz))), use.svd = FALSE, rm.gaps=FALSE, mass = NULL, ...) { ## Performs principal components analysis on the given "xyz" numeric data ## matrix and return the results as an object of class "pca.xyz" ## Log the call cl <- match.call() xyz <- as.xyz(xyz) if (any(!is.finite(xyz))) { ## Check for GAP positions in input if(rm.gaps) { gapC <- colSums(is.na(xyz)) == 0 if (sum(gapC) > 3) { xyz <- xyz[,gapC] cat(paste("NOTE: Removing", sum(!gapC)/3, "gap positions with missing coordinate data\n", " retaining", sum(gapC)/3, "non-gap positions for analysis.\n")) } else { stop("No non-gap containing positions (cols) available for analysis.") } } else { stop( paste(" Infinite or missing values in 'xyz' input.", "\t Likely solution is to remove gap positions (cols) with rm.gaps=TRUE", "\t or remove gap containing structures (rows) from input.", sep="\n") ) } } dx <- dim(xyz) n <- dx[1]; p <- dx[2] if (!n || !p) stop("0 extent dimensions") # for mass-weighted PCA if(!is.null(mass)) { if(is.pdb(mass)) mass = aa2mass(mass) if(length(mass) != ncol(xyz)/3) stop("Input mass vector does not match xyz") q = t( t(xyz) * rep(sqrt(mass), each=3) ) # mass weighted xyz # re-do fitting: iteratively fit to the mean mean <- colMeans(q[subset, ]) tolerance = 1.0 # convergence check maxiter = 10 # maximum number of iteration iter = 0 repeat { q <- fit.xyz(mean, q, 1:ncol(q), 1:ncol(q), ...) mean.now <- colMeans(q[subset, ]) mean.diff <- rmsd(mean, mean.now, 1:ncol(q), 1:ncol(q)) mean = mean.now iter = iter + 1 if(iter >= maxiter || mean.diff <= tolerance) break } if(mean.diff > tolerance) warning("Iteration stops before convergent") xyz <- q } # mean <- apply(xyz[subset,],2,mean) ## mean structure mean <- colMeans(xyz[subset,]) ## Faster n <- sum(subset) # Check number of columns if(p > 3000 && n <= 0.4*p && !use.svd) { cat("NOTE: In input xyz (MxN), N > 3000 and M < N\n", " Singular Value Decomposition (SVD) approach is faster\n", " and is recommended (set 'use.svd = TRUE')\n\n", sep=" ") flush(stdout()) } if(!use.svd) { S <- var(xyz[subset,]) ## coverance matrix ## eigenvectors ("U") & eigenvalues ("L"): [ U'SU=L ] prj <- eigen(S, symmetric = TRUE) L <- prj$values U <- prj$vectors } else { if(n < p) warning(paste("In input xyz (MxN), M < N:\n", " Only",n,"eigenvalues and eigenvectors are returned!\n\n")) ## S = Q'Q, Q = UDV' Q <- t(t(xyz[subset,]) - mean) / sqrt(n-1) prj <- svd(Q) L <- prj$d^2 U <- prj$v } ## fix negative eigenvalues ## (these are very small numbers and should be zero) L[L<0]<-0 sdev <- sqrt(L) ## scores of "xyz" on the pc's [ z=U'[x-x.mean] ] z <- sweep(xyz,2,mean) %*% (U) ## atom-wise loadings (norm of xyz eigenvectors) ## Skip the calculation if the input is not xyz coordinates, ## e.g. for PCA over correlaiton matrices (see pca.array()). if(ncol(U) %% 3 == 0) { au <- apply(U, 2, function(x) { sqrt(colSums(matrix(x^2, nrow=3))) }) } else { au <- NULL } class(U)="pca.loadings" if(!is.null(mass)) { mean = mean / sqrt(rep(mass, each=3)) out <- list(L=L, U=U, z=z, au=au, sdev=sdev, mean=mean, mass=mass, call=cl) } else out <- list(L=L, U=U, z=z, au=au, sdev=sdev, mean=mean, call=cl) class(out)="pca"; out } bio3d/R/sse.bridges.R0000644000176200001440000000406714046015221014010 0ustar liggesusers"sse.bridges" <- function(sse, type="helix", hbond=TRUE, energy.cut=-1.0 ) { if(missing(sse)) stop("sse missing") if(is.null(sse$hbonds)) stop("sse$hbonds does not exists. run dssp with 'resno=FALSE' and 'full=TRUE'") natoms <- nrow(sse$hbonds) if(type=="helix") { sse2 <- sse$helix stype <- "H" lim <- 4 } if(type=="sheet") { sse2 <- sse$sheet stype <- "S" lim <- 2 } if(length(sse2$start)==0) return(NULL) ## character array of SSE membership simple.sse <- sse$sse simple.sse[ !(sse$sse %in% c("H", "E", "G", "I")) ] <- "L" simple.sse[ sse$sse %in% c("E") ] <- "S" simple.sse[ sse$sse %in% c("H", "I", "G") ] <- "H" inds <- NULL for ( i in 1:(natoms-lim) ) { if(simple.sse[i]!=stype) next; paired <- NULL if(type=="helix") { paired <- i+4 if(simple.sse[paired]!=stype) next; } if (type=="sheet") { ## bridge pair info paired <- sse$hbonds[i,c("BP1", "BP2")] paired <- paired[ !is.na(paired) ] if(length(paired)==0) next; } if(hbond) { ## H-bond info resid <- sse$hbonds[i, c(3,5,7,9)] energ <- sse$hbonds[i, c(4,6,8,10)] energ <- energ[ !is.na(resid) ] resid <- resid[ !is.na(resid) ] inds.tmp <- which(resid %in% paired) resid <- resid[inds.tmp] energ <- energ[inds.tmp] dups <- duplicated(resid) resid <- resid[ !dups ] energ <- energ[ !dups ] if(length(resid)==0) next; for( j in 1:length(resid) ) { if(energ[j] < energy.cut) inds <- c(inds, i, resid[j]) } } else { for ( j in 1:length(paired) ) { inds <- c(inds, i, paired[j]) } } } if(length(inds)==0) return(NULL) mat <- matrix(inds, ncol=2, byrow=T) mat <- t(apply(mat, 1, sort)) pair.ids <- apply(mat, 1, function(x) paste(x, collapse="-")) mat <- matrix(mat[!duplicated(pair.ids), ], ncol=2) return(mat) } bio3d/R/write.crd.R0000644000176200001440000000577614046015221013511 0ustar liggesusers"write.crd" <- function(pdb = NULL, xyz = pdb$xyz, resno = NULL, resid = NULL, eleno = NULL, elety = NULL, segid = NULL, resno2 = NULL, b = NULL, verbose = FALSE, file = "R.crd") { if (is.null(xyz) || !is.numeric(xyz)) stop("write.crd: please provide a 'pdb' object or numeric 'xyz' coordinates") if (any(is.na(xyz))) stop("write.crd: 'xyz' coordinates must have no NA's.") if (is.matrix(xyz) && nrow(xyz) == 1) xyz = as.vector(xyz) if (is.vector(xyz)) { natom <- length(xyz)/3 } else { stop("write.crd: 'xyz' or 'pdb$xyz' must contain only one structure") } if (!is.null(pdb)) { if (is.null(resno)) resno = pdb$atom[, "resno"] if (is.null(resid)) resid = pdb$atom[, "resid"] if (is.null(eleno)) eleno = pdb$atom[, "eleno"] if (is.null(elety)) elety = pdb$atom[, "elety"] if (is.null(segid)) segid = pdb$atom[, "chain"] if (is.null(resno2)) resno2 = pdb$atom[, "resno"] if (is.null(b)) b = pdb$atom[, "b"] } else { if (is.null(resno)) resno = c(1:natom) if (is.null(resno2)) resno2 = c(1:natom) if (is.null(resid)) resid = rep("ALA", natom) if (is.null(eleno)) eleno = c(1:natom) if (is.null(elety)) elety = rep("CA", natom) if (is.null(segid)) segid = rep("seg", natom) if (is.null(b)) b = rep("0.00", natom) } if (length(as.vector(xyz))%%3 != 0) { stop("write.crd: 'length(xyz)' must be divisable by 3.") } check.lengths <- sum(length(resno), length(resid), length(eleno), length(elety), length(resno2)) if (check.lengths%%natom != 0) { stop("write.crd: the lengths of all input vectors != 'length(xyz)/3'.") } b <- as.numeric(b) eleno <- as.character(eleno) resno <- as.character(resno) resno2 <- as.character(resno2) crd.print <- function(eleno, resno, resid, elety, x, y, z, segid="seg", resno2, b="0.00") { format <- "%5s%5s%4s %-4s%10.5f%10.5f%10.5f %-4s %-4s%10.5f" sprintf(format, eleno, resno, resid, elety, x, y, z, segid, resno2, b) } coords <- matrix(round(as.numeric(xyz), 3), ncol = 3, byrow = TRUE) if (verbose) cat(paste("Writing CRD file with", natom, "atoms ")) lines <- NULL for (i in 1:natom) { lines <- rbind(lines, crd.print( eleno = eleno[i], resno = resno[i], resid = resid[i], elety = elety[i], x = coords[i,1], y = coords[i, 2], z = coords[i, 3], segid = segid[i], resno2 = resno2[i], b = b[i])) } cat("* CRD from bio3d", file = file, "\n") cat("*", file = file, "\n", append = TRUE) cat(sprintf("%5g", natom), file = file, "\n", append = TRUE) cat(lines, file = file, sep = "\n", append = TRUE) if (verbose) cat(" DONE", "\n") } bio3d/R/rtb.R0000644000176200001440000001140514046015221012361 0ustar liggesusers.diag.rtb <- function(H, blocks, xyz, masses, ...) { ## mass weighted Hessian if(!all(masses == 1)) { m <- 1/sqrt(rep(masses, each=3)) H <- sapply(1:ncol(H), function(i) H[,i] * m[i]) H <- t( sapply(1:nrow(H), function(i) H[i,] * m[i]) ) } if(nlevels(blocks) == (nrow(H)/3)) return( eigen(H, ...) ) MASS <- tapply(masses, blocks, sum) # Block mass xyz <- matrix(xyz, ncol=3, byrow=TRUE) ## block center-of-mass Rc <- tapply(1:length(blocks), blocks, function(i) { colSums(xyz[i,, drop=FALSE ] * masses[i]) / MASS[blocks[i[1]]] } ) ## Gram-Schmidt process for orthonormalization schmidt <- function(p) { p[, 1] <- p[, 1] / sqrt(sum(p[, 1]^2)) for(i in 2:ncol(p)) { ov <- apply(p[, 1:(i-1), drop=FALSE], 2, function(x) as.vector(crossprod(p[, i], x)) * x ) ov <- rowSums(ov) p[, i] <- p[, i] - ov p[, i] <- p[, i] / sqrt(sum(p[, i]^2)) } return(p) } ## RTB projector building (can be parallelized) P.blocks <- lapply(1:nlevels(blocks), function(i) { myblock <- levels(blocks)[i] iatom <- which(blocks %in% myblock) natom <- length(iatom) m <- masses[iatom] M <- MASS[myblock] # equilibrium position relative to COM r0 <- t( t(xyz[iatom, ]) - Rc[[myblock]] ) ncol <- ifelse(natom>=3, 6, ifelse(natom>=2, 5, 3)) P <- matrix(0, nrow=natom*3, ncol=ncol) # translation P[seq(1, nrow(P), 3), 1] <- sqrt(m/M) #xx P[seq(2, nrow(P), 3), 2] <- sqrt(m/M) #yy P[seq(3, nrow(P), 3), 3] <- sqrt(m/M) #zz if(natom>=3) { # rotation rr <- rbind(0, -r0[, 3], r0[, 2]) P[, 4] <- 1/sqrt( sum(m * (r0[, 2]^2 + r0[, 3]^2)) ) * ( sqrt(rep(m, each=3)) * as.numeric(rr) ) ## x-axis rr <- rbind(r0[, 3], 0, -r0[, 1]) P[, 5] <- 1/sqrt( sum(m * (r0[, 1]^2 + r0[, 3]^2)) ) * ( sqrt(rep(m, each=3)) * as.numeric(rr) ) ## y-axis rr <- rbind(-r0[, 2], r0[, 1], 0) P[, 6] <- 1/sqrt( sum(m * (r0[, 1]^2 + r0[, 2]^2)) ) * ( sqrt(rep(m, each=3)) * as.numeric(rr) ) ## z-axis schmidt(P) # Orthonormalization } else if(natom==2) { # check the line direction and choose the least overlapped axes to rotate. ax <- rbind(c(2,3,1), c(3,1,2), c(1,2,3)) ax <- ax[which.max(abs(r0[1, ])), ] rr <- list(rbind(0, -r0[, 3], r0[, 2]), rbind(r0[, 3], 0, -r0[, 1]), rbind(-r0[, 2], r0[, 1], 0)) # rotation P[, 4] <- 1/sqrt( sum(m * (r0[, ax[2]]^2 + r0[, ax[3]]^2)) ) * ( sqrt(rep(m, each=3)) * as.numeric(rr[[ax[1]]]) ) ## first-axis P[, 5] <- 1/sqrt( sum(m * (r0[, ax[1]]^2 + r0[, ax[3]]^2)) ) * ( sqrt(rep(m, each=3)) * as.numeric(rr[[ax[2]]]) ) ## second-axis schmidt(P) # Orthonormalization } else { P } } ) ## effective reduced Hessian (can be parallelized) # H <- t(P) %*% H %*% P H <- lapply(1:nlevels(blocks), function(i) { myblock <- unique(blocks)[i] iatom <- which(blocks %in% myblock) P <- P.blocks[[myblock]] crossprod( P, H[atom2xyz(iatom), ] ) } ) H <- do.call(rbind, H) H <- lapply(1:nlevels(blocks), function(i) { myblock <- unique(blocks)[i] iatom <- which(blocks %in% myblock) P <- P.blocks[[myblock]] crossprod( t(H[, atom2xyz(iatom)]), P ) }) H <- do.call(cbind, H) ei <- eigen(H, ...) ## map eigenvector to 3N space block.bounds <- c(1, cumsum(sapply(P.blocks[unique(blocks)], ncol))+1) vecs <- lapply(1:nlevels(blocks), function(i) { myblock <- unique(blocks)[i] # iblock <- which(unique(blocks) %in% myblock) P <- P.blocks[[myblock]] crossprod( t(P), ei$vectors[(block.bounds[i]):(block.bounds[i+1]-1), ] ) }) ei$vectors <- do.call(rbind, vecs) ei } #' @param verbose logical, if TRUE print detailed processing message #' @inheritParams aanma.pdb #' @rdname aanma.pdb rtb <- function(hessian, pdb, mass=TRUE, nmer=1, verbose=TRUE) { H <- hessian res <- paste( pdb$atom[, 'chain'], pdb$atom[, 'resno'], pdb$atom[, 'insert'], sep='_' ) if(nmer > 1) { rl <- rle(res) g <- rep(1:ceiling(length(rl$lengths)/nmer), each=nmer) tosum <- split(rl$lengths, g[1:length(rl$lengths)]) rl$lengths <- sapply(tosum, sum) rl$values <- rl$values[seq(1, length(g), nmer)] res <- inverse.rle(rl) } blocks <- as.factor(res) ## atom mass if(isTRUE(mass)) { m <- atom2mass(pdb) } else if(is.numeric(mass)) { m <- mass } else { m <- rep(1, nrow(pdb$atom)) } if(verbose) { cat(" Diagonalizing Hessian with RTB...") ptm <- proc.time() } ei <- .diag.rtb(H, blocks, pdb$xyz, m, symmetric=TRUE) if(verbose) { t <- proc.time() - ptm cat("\t\tDone in", t[[3]], "seconds.\n") } return( ei ) } bio3d/R/dccm.gnm.R0000644000176200001440000000435114046015221013262 0ustar liggesusers#' Dynamic Cross-Correlation from Gaussian Network Model #' #' Calculate the cross-correlation matrix from Gaussian network model normal #' modes analysis. #' #' This function calculates the cross-correlation matrix from Gaussian network #' model (GNM) normal modes analysis (NMA) obtained from \code{gnm}. It returns #' a matrix of residue-wise cross-correlations whose elements, Cij, may be #' displayed in a graphical representation frequently termed a dynamical #' cross-correlation map, or DCCM. (See more details in \code{help(dccm.nma)}). #' #' @param x an object of class \sQuote{gnm} or \sQuote{egnm} as obtained from #' \code{\link{gnm}}. #' @param ... additional arguments (currently ignored). #' #' @return Returns a cross-correlation matrix. #' #' @seealso \code{\link{gnm}}, \code{\link{dccm.nma}}, \code{\link{dccm.enma}}, #' \code{\link{plot.dccm}}. #' #' @author Xin-Qiu Yao & Lars Skjaerven #' #' @references #' Bahar, I. et al. (1997) \emph{Folding Des.} \bold{2}, 173. #' #' @examples #' ## Fetch stucture #' pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) #' #' ## Calculate normal modes #' modes <- gnm(pdb) #' #' ## Calculate correlation matrix #' cm <- dccm(modes) #' #' ## Plot correlation map #' plot(cm, sse = pdb, contour = FALSE, col.regions = bwr.colors(20), #' at = seq(-1, 1, 0.1)) #' #' @keywords analysis "dccm.gnm" <- function(x, ...) { if (missing(x) || !inherits(x, 'gnm')) stop("dccm.gnm: must supply a 'gnm' object, i.e. from 'gnm.pdb()'") # variance-covariance matrix vcov <- cov.nma(x) # DCCM corr.mat <- vcov * 1/( sqrt(diag(vcov)) %*% t(sqrt(diag(vcov))) ) class(corr.mat) <- c("matrix", "dccm") return(corr.mat) } #' @rdname dccm.gnm "dccm.egnm" <- function(x, ...) { if (missing(x) || !inherits(x, 'egnm')) stop("dccm.egnm: must supply a 'egnm' object, i.e. from 'gnm.pdbs()'") # variance-covariance matrix vcovs <- cov.enma(x) # DCCM all.dccm <- apply(vcovs, 3, function(vcov) vcov * 1/( sqrt(diag(vcov)) %*% t(sqrt(diag(vcov))) ) ) all.dccm <- array(all.dccm, dim=dim(vcovs)) avg.dccm <- rowMeans(all.dccm, dims=2) class(avg.dccm) <- c("matrix", "dccm") out <- list(all.dccm = all.dccm, avg.dccm = avg.dccm) return( out ) } bio3d/R/deformation.nma.R0000644000176200001440000000420214046015221014650 0ustar liggesusers"deformation.nma" <- function(nma, mode.inds=NULL, pfc.fun=NULL, ncore=NULL) { if(!inherits(nma, "nma")) stop("provide input of class 'nma' as obtained from function 'nma'") if(is.null(mode.inds)) { nmodes <- 20 if(length(nma$L) < (nmodes+nma$triv.modes)) nmodes <- length(nma$L) - nma$triv.modes mode.inds <- seq(nma$triv.modes+1, nma$triv.modes+nmodes) } else { if(length(nma$L) < (length(mode.inds)+nma$triv.modes)) { nmodes <- length(nma$L) - nma$triv.modes mode.inds <- seq(nma$triv.modes+1, nma$triv.modes+nmodes) warning("'mode.inds' was modified to include all modes") } } ## Check for multiple cores ncore <- setup.ncore(ncore) ## calcualte deformation energies for a specific mode def.mode <- function(mode.id, nma, xyz, ff, natoms) { mode.vec <- nma$modes[,mode.id] ## for normalization norm <- sqrt(sum(mode.vec**2) / natoms) ## better work with a matrix mode.vec <- matrix(mode.vec, ncol=3, byrow=T) def.e <- rep(0, length=natoms) for ( i in 1:(natoms)) { ## distance vectors between a and b rs <- t(apply(xyz, 1, "-", xyz[i,])) ## differences mode vectors vs <- t(apply(mode.vec, 1, "-", mode.vec[i,])) ##rl <- apply(rs, 1, function(x) sqrt(sum(x^2))) rsq <- rowSums(rs^2) rl <- sqrt(rsq) ##l <- inner.prod(t(rs), t(vs)) / norm l <- colSums(t(rs)*t(vs)) / norm k <- ff(rl) l2 <- k*l*l / rsq l2[i] <- 0 def.e <- def.e + (0.5*l2) } return(def.e) } if(is.null(pfc.fun)) ff <- load.enmff("calpha") else { if (!is.function(pfc.fun)) stop("'pfc.fun' must be a function") ff <- pfc.fun } natoms <- length(nma$xyz)/3 xyz <- matrix(nma$xyz, ncol=3, byrow=T) if(ncore>1) hm <- mclapply(mode.inds, def.mode, nma, xyz, ff, natoms, mc.cores=ncore) else hm <- lapply(mode.inds, def.mode, nma, xyz, ff, natoms) ## Collect results and make a matrix to store results hm <- t(do.call(rbind, hm)) sums <- colSums(hm) out <- list(ei=hm, sums=sums) return(out) } bio3d/R/print.pca.R0000644000176200001440000000156714046015221013500 0ustar liggesusers"print.pca" <- function(x, nmodes=6, ...) { cn <- class(x) cat("\nCall:\n ", paste(deparse(x$call), sep = "\n", collapse = "\n"), "\n\n", sep = "") cat("Class:\n ", cn, "\n\n", sep = "") cat("Number of eigenvalues:\n ", length(x$L), "\n\n", sep="") inds <- 1:nmodes e <- round(x$L[inds], 3) p <- (x$L[inds]/sum(x$L)) * 100 d <- data.frame( "Eigenvalue"=e, "Variance"=round(p,3), "Cumulative"=round(cumsum(p),3), row.names = paste(" PC",inds)) #cat("Eigenvalues:\n", sep="") print(d) cat("\n",paste(" (Obtained from", nrow(x$z), "conformers with", ncol(x$z), "xyz input values).")) i <- paste( attributes(x)$names, collapse=", ") cat("\n",strwrap(paste(" + attr:",i,"\n"),width=60, exdent=8), sep="\n") invisible(d) } bio3d/R/com.R0000644000176200001440000000005214046015221012344 0ustar liggesusers"com" <- function(...) UseMethod("com") bio3d/R/dssp.R0000644000176200001440000000005414046015221012541 0ustar liggesusers"dssp" <- function(...) UseMethod("dssp") bio3d/R/get.pdb.R0000644000176200001440000000640114046015221013115 0ustar liggesusers"get.pdb" <- function (ids, path = ".", URLonly = FALSE, overwrite = FALSE, gzip = FALSE, split = FALSE, format = "pdb", verbose = TRUE, ncore = 1, ... ) { if(.Platform$OS.type=="windows") gzip <- FALSE # Parallelized by parallel package (Tue Oct 15 15:23:36 EDT 2013) ncore <- setup.ncore(ncore) if(ncore > 1) { # To avoid too frequent access to PDB server if(!split) { warning("Multiple-core access to PDB server is not allowed. Reset ncore=1") ncore <- setup.ncore(ncore = 1) } else { setup.ncore(ncore = 1) } } if(!tolower(format) %in% c("pdb", "cif")) { stop("'format' must be either 'pdb' or 'cif'") } if(inherits(ids, "blast")) ids = ids$pdb.id if (any(nchar(ids) < 4)) stop("ids should be standard 4 character PDB-IDs or 6 character PDB-ID_Chain-IDs") ids4 = ids if (any(nchar(ids) > 4)) { ids4 <- unlist(lapply(strsplit(ids, "_"), function(x) x[1])) if (any(nchar(ids4) > 4)) warning("ids should be standard 4 character PDB-IDs: trying first 4 characters...") ids4 <- substr(basename(ids), 1, 4) } ids4 <- unique(ids4) pdb.files <- paste(ids4, ".", format, ifelse(gzip, ".gz", ""), sep = "") get.files <- file.path("https://files.rcsb.org/download", pdb.files) if (URLonly) return(get.files) put.files <- file.path(path, pdb.files) if(!file.exists(path)) dir.create(path) rtn <- rep(NA, length(pdb.files)) if(ncore > 1) { rtn <- unlist(mclapply(1:length(pdb.files), function(k) { if (!file.exists(sub(".gz$", "", put.files[k])) | overwrite ) { rtn <- try(download.file(get.files[k], put.files[k], quiet = !verbose), silent = TRUE) if(inherits(rtn, "try-error")) { rtn <- 1 file.remove(put.files[k]) } else if(gzip) { cmd <- paste("gunzip -f", put.files[k]) system(cmd) } } else { rtn <- put.files[k] warning(paste(put.files[k], " exists. Skipping download")) } return(rtn) })) } else { for (k in 1:length(pdb.files)) { if (!file.exists(sub(".gz$", "", put.files[k])) | overwrite ) { rt <- try(download.file(get.files[k], put.files[k], quiet = !verbose), silent=TRUE) rtn[k] <- rt if(inherits(rt, "try-error")) { rtn[k] <- 1 file.remove(put.files[k]) } else if(gzip) { cmd <- paste("gunzip -f", put.files[k]) system(cmd) } } else { rtn[k] <- put.files[k] warning(paste(put.files[k], " exists. Skipping download")) } gc() } } rtn <- as.character(rtn) names(rtn) <- file.path(path, paste(ids4, ".", format, sep = "")) if (any(rtn == '1')) { warning("Some files could not be downloaded, check returned value") return(rtn) } else { if(split) { rtn = pdbsplit(pdb.files = names(rtn), ids = ids, path = file.path(path, "split_chain"), ncore = ncore, ...) return(rtn) } else { return(names(rtn)) } } } bio3d/R/as.pdb.prmtop.R0000644000176200001440000000412414046015221014261 0ustar liggesusersas.pdb.prmtop <- function(prmtop, crd=NULL, inds=NULL, inds.crd=inds, ncore=NULL, ...) { ncore <- setup.ncore(ncore, bigmem=FALSE) if(ncore>1) mylapply <- mclapply else mylapply <- lapply if(!inherits(prmtop, "prmtop")) stop("provide a prmtop object as obtained from function read.prmtop") natoms.prmtop <- prmtop$POINTERS[1] if(is.null(crd)) { warning("producing PDB object with no XYZ coordinates") crd <- as.numeric(rep(NA, natoms.prmtop*3)) } if(!inherits(crd, "amber")) { new <- list() new$xyz <- as.xyz(crd) new$natoms <- ncol(new$xyz)/3 crd <- new } natoms.crd <- crd$natoms if( any(c(!is.null(inds), !is.null(inds.crd))) ) { if(is.null(inds)) { inds$atom = seq(1, natoms.prmtop) inds$xyz = atom2xyz(inds$atom) class(inds) = "select" } if(is.null(inds.crd)) { inds.crd$atom = seq(1, natoms.crd) inds.crd$xyz = atom2xyz(inds.crd$atom) class(inds.crd)="select" } natoms.prmtop = length(inds$atom) natoms.crd = length(inds.crd$atom) } if(natoms.prmtop != natoms.crd) stop(paste("atom number mismatch:", natoms.prmtop, "(prmtop) vs", natoms.crd, "(crds)")) resmap <- function(i, type='resid') { if(i==length(prmtop$RESIDUE_POINTER)) j <- prmtop$POINTERS[1] - prmtop$RESIDUE_POINTER[i] + 1 else j <- prmtop$RESIDUE_POINTER[i+1] - prmtop$RESIDUE_POINTER[i] if(type=='resno') return(rep(i,j)) if(type=='resid') return(rep(prmtop$RESIDUE_LABEL[i], j)) } resno <- unlist(mylapply(1:length(prmtop$RESIDUE_POINTER), resmap, 'resno')) resid <- unlist(mylapply(1:length(prmtop$RESIDUE_POINTER), resmap, 'resid')) if(any(c(!is.null(inds), !is.null(inds.crd)))) { pdb <- as.pdb.default(xyz=crd$xyz[,inds.crd$xyz], elety=prmtop$ATOM_NAME[inds$atom], resno=resno[inds$atom], chain=as.character(NA), resid=resid[inds$atom]) } else { pdb <- as.pdb.default(xyz=crd$xyz, elety=prmtop$ATOM_NAME, resno=resno, chain=as.character(NA), resid=resid) } pdb$call = match.call() return(pdb) } bio3d/R/seqaln.pair.R0000644000176200001440000000075314046015221014013 0ustar liggesusers`seqaln.pair` <- function(aln, ...) { cl <- match.call() dots <- list(...) dots$extra.args = paste("-matrix", system.file("matrices/custom.mat", package="bio3d"), "-gapopen -3.0 ", "-gapextend -0.5", "-center 0.0", dots$extra.args) args <- c(list(aln=aln), dots) l <- do.call(seqaln, args) if(!all((seqidentity(l))==1)) { warning("Sequences are not identical, use seqaln()") } l$call <- cl return(l) } bio3d/R/pymol.dccm.R0000644000176200001440000001572414046015221013647 0ustar liggesuserspymol.dccm <- function(dccm, pdb, file=NULL, step=0.2, omit=0.2, radius = 0.15, type="script", exefile = "pymol", ...) { allowed <- c("session", "script", "launch", "pdb") if(!type %in% allowed) { stop(paste("input argument 'type' must be either of:", paste(allowed, collapse=", "))) } if(type %in% "pdb") pymol <- FALSE else pymol <- TRUE ## Check if the program is executable if(type %in% c("session", "launch")) { ## determine path to exefile exefile1 <- .get.exepath(exefile) ## Check if the program is executable success <- .test.exefile(exefile1) if(!success) { stop(paste("Launching external program failed\n", " make sure '", exefile, "' is in your search path", sep="")) } exefile <- exefile1 } if(is.pdb(pdb)) { ca.inds <- atom.select(pdb, 'calpha', verbose=FALSE) bb.inds <- atom.select(pdb, 'backbone', verbose=FALSE) xyz <- pdb$xyz[ca.inds$xyz] ## If more than CA atoms are provided, assume its enough to draw cartoon in pymol if(length(pdb$xyz[bb.inds$xyz])==length(xyz)) ca.pdb <- TRUE else ca.pdb <- FALSE } else { xyz <- pdb } if(missing(dccm)) stop("correlation matrix must be provided") if(missing(xyz)) stop("cartesian coordinates missing") if(is.matrix(radius)) { if(!all(dim(dccm) == dim(radius))) stop("dimension mismatch. provide a 'radius' matrix with the same dimensions as 'dccm'") } dims <- dim(dccm) if((length(xyz)/3)!=dims[1L]) stop("unequal vector lengths") if(is.null(file)) { if(type=="session") file <- "R.pse" if(type=="script") file <- "R.py" if(type=="pdb") file <- "R.pdb" } ## use temp-dir unless we output a PML script if(type %in% c("session", "launch")) tdir <- tempdir() else tdir <- "." psefile <- tempfile(tmpdir=tdir, fileext=".pse") pyfile <- tempfile(tmpdir=tdir, fileext=".py") pdbfile <- tempfile(tmpdir=tdir, fileext=".pdb") ## Build the new PDB or pymol script in a vector scr <- c() if(pymol) { ## start pymol script scr <- c("from pymol import cmd") scr <- c(scr, "from pymol.cgo import *") scr <- c(scr, paste("cmd.load('", normalizePath(pdbfile, winslash='/', mustWork=FALSE), "', 'prot')", sep="")) scr <- c(scr, "cmd.show('cartoon')") if(!is.pdb(pdb) || ca.pdb) scr <- c(scr, "cmd.set('cartoon_trace_atoms', 1)") ## define color range blues <- colorRamp(c("white", "blue")) reds <- colorRamp(c("white", "red")) w <- radius } else { m <- 0 } ## mask lower tri of correlation matrix dccm[lower.tri(dccm, diag=TRUE)] <- NA lims <- c(-1, 1) intervals <- seq(lims[1], lims[2], by=step) ## get rid of interval around 0 if(!is.null(omit)) { i <- which(intervals>(omit-0.001)) j <- which(intervals<(-omit+0.001)) inds <- sort(c(i,j)) intervals <- sort(intervals[inds]) } for ( i in 1:(length(intervals)-1) ) { lower <- intervals[i] upper <- intervals[i+1] if(lower<0 && upper>0) next ## make the positive and negative distributions symmetric if(lower<0) sele <- intersect( which(dccm>=lower), which(dccmlower), which(dccm<=upper) ) if(length(sele)==0) next f <- matrix(FALSE, ncol(dccm), nrow(dccm)) f[sele] <- TRUE inds <- which(f, arr.ind=TRUE) if(pymol) { scr <- c(scr, "obj=[]") } else { m <- m+1 chain <- LETTERS[m] } for ( j in 1:nrow(inds) ) { x <- inds[j,1]; y <- inds[j,2]; if(x==y) next val <- dccm[x,y] ## corr coeff k <- atom2xyz(inds[j,1]) ## resi 1 l <- atom2xyz(inds[j,2]) ## resi 2 if(is.matrix(w)) w2 <- abs(w[x, y]) else w2 <- w if(pymol) { a <- paste(xyz[k], collapse=",") b <- paste(xyz[l], collapse=",") if(val<=0) col <- blues( abs(val) ) else col <- reds( abs(val) ) col <- round(col/256,4) col <- paste(col, collapse=", ") str <- paste("obj.extend([CYLINDER", a, b, w2, col, col, "])", sep=", ") scr <- c(scr, str) } else { a <- paste(format(xyz[k], justify="right", width=8), collapse="") b <- paste(format(xyz[l], justify="right", width=8), collapse="") val <- format(round(val,2), justify="right", width=6) res.str <- format(x, justify="right", width=4) str <- paste("ATOM ", res.str, " CA ALA ", chain, res.str, " ", a, " 0.00", val, sep="") scr <- c(scr, str) res.str <- format(y, justify="right", width=4) str <- paste("ATOM ", res.str, " CA ALA ", chain, res.str, " ", b, " 0.00", val, sep="") scr <- c(scr, str) str <- paste("CONECT", format(x, justify="right", width=5), format(y, justify="right", width=5), sep="") scr <- c(scr, str) } } if(pymol) { tmpa <- gsub("\\.", "", as.character(lower)) tmpb <- gsub("\\.", "", as.character(upper)) name <- paste("cor_", tmpa, "_", tmpb, sep="") str <- paste("cmd.load_cgo(obj, '", name, "')", sep="") scr <- c(scr, str) } else { str <- "TER" scr <- c(scr, str) } } if(type == "session") { scr <- c(scr, paste0("cmd.save('", normalizePath(psefile, winslash='/', mustWork=FALSE), "')")) } ## Write python script or PDB with conect records if(pymol) { write(scr, file=pyfile, sep="\n") ## Write PDB structure file if(is.pdb(pdb)) write.pdb(pdb, file=pdbfile) else write.pdb(xyz=xyz, file=pdbfile) } else { write(scr, file=pdbfile, sep="\n") } if(type %in% c("session", "launch")) { if(type == "session") args <- "-cq" else args <- "" ## Open pymol cmd <- paste(exefile, args, pyfile) os1 <- Sys.info()["sysname"] if (os1 == "Windows") { status <- shell(paste(shQuote(exefile), args, pyfile)) } else { status <- system(cmd) } if(!(status %in% c(0,1))) { stop(paste("An error occurred while running command\n '", exefile, "'", sep="")) } } if(type == "session") { file.copy(psefile, file, overwrite=TRUE) message(paste("PyMOL session written to file", file)) invisible(file) } if(type == "script") { file.copy(pyfile, file, overwrite=TRUE) unlink(pyfile) message(paste("PyMOL script written to file", file)) invisible(file) } if(type == "pdb") { file.copy(pdbfile, file, overwrite=TRUE) unlink(pdbfile) message(paste("PDB written to file", file)) invisible(file) } } bio3d/R/vmd.R0000644000176200001440000000005014046015221012352 0ustar liggesusersvmd <- function(...) UseMethod("vmd") bio3d/R/convert.pdb.R0000644000176200001440000001276614046015221014031 0ustar liggesusers"convert.pdb" <- function(pdb, type = c("original", "pdb", "charmm", "amber", "gromacs"), renumber=FALSE, first.resno=1, first.eleno=1, consecutive=TRUE, rm.h=TRUE, rm.wat=FALSE, verbose=TRUE) { ##-- Check the requested output format is one of 'type.options' type <- match.arg(type) ##-- Water and hydrogen removal inds <- NULL if(rm.wat) { inds <- atom.select(pdb, "notwater", verbose=FALSE) if(verbose){ cat(paste("\t Retaining", length(inds$atom),"non-water atoms\n")) } } if(rm.h) { inds <- combine.select(inds, atom.select(pdb, "noh", verbose=FALSE), verbose=FALSE) if(verbose){ cat(paste("\t Retaining", length(inds$atom),"non-hydrogen atoms\n")) } } if(!is.null(inds)){ nrm <- nrow(pdb$atom) - length(inds$atom) if( nrm > 0) { if(verbose){ cat(paste("\t Removing a total of", nrm," atoms\n")) } pdb <- trim.pdb(pdb, inds) } } ##-- Renumbering of residues and atoms if(renumber) { if(verbose){ cat(paste("\t Renumbering residues ( from",first.resno,") and atoms ( from",first.eleno,")\n")) } ## Assign consecutive atom numbers pdb$atom[,"eleno"] <- seq(first.eleno, length=nrow(pdb$atom)) ## Determine chain start and end indices s.ind <- which(!duplicated(pdb$atom[,"chain"])) e.ind <- c(s.ind[-1]-1, nrow(pdb$atom)) ##- Assign new (consecutive) residue numbers for each chain prev.chain.res = 0 ## Number of residues in previous chain for (i in 1:length(s.ind)) { ## Combination of resno and insert code define a residue (wwpdb.org) insert = pdb$atom[s.ind[i]:e.ind[i], "insert"] insert[is.na(insert)] = "" resno0 <- paste0(pdb$atom[s.ind[i]:e.ind[i], "resno"], insert) ## Ordered table of residue occurrences tbl <- table(resno0)[unique(resno0)] n.chain.res <- length(tbl) new.nums <- (first.resno+prev.chain.res):(first.resno+n.chain.res-1+prev.chain.res) pdb$atom[s.ind[i]:e.ind[i],"resno"] <- rep(new.nums, tbl) ## SSE if(length(pdb$helix)>0) { chs = unique(pdb$helix$chain) t.inds = match(pdb$helix$start[pdb$helix$chain %in% chs[i]], unique(resno0)) pdb$helix$start[pdb$helix$chain %in% chs[i]] = new.nums[t.inds] t.inds = match(pdb$helix$end[pdb$helix$chain %in% chs[i]], unique(resno0)) pdb$helix$end[pdb$helix$chain %in% chs[i]] = new.nums[t.inds] } if(length(pdb$sheet)>0) { chs = unique(pdb$sheet$chain) t.inds = match(pdb$sheet$start[pdb$sheet$chain %in% chs[i]], unique(resno0)) pdb$sheet$start[pdb$sheet$chain %in% chs[i]] = new.nums[t.inds] t.inds = match(pdb$sheet$end[pdb$sheet$chain %in% chs[i]], unique(resno0)) pdb$sheet$end[pdb$sheet$chain %in% chs[i]] = new.nums[t.inds] } if(consecutive) { ## Update prev.chain.res for next iteration prev.chain.res = prev.chain.res + n.chain.res } } } ##-- Format conversion if(type != "original") { if(verbose){ cat(paste0("\t Converting to '", type, "' format\n")) } ## residue and atom types from PDB restype <- unique(pdb$atom[,"resid"]) #eletype <- unique(pdb$atom[,"elety"]) ## In future could determine 'input type' based on resid/elety ##- Check for non-standard residue names if(verbose){ not.prot.inds <- atom.select(pdb, "notprotein", verbose=FALSE)$atom if(length(not.prot.inds) > 0) { not.prot.res <- paste(unique(pdb$atom[not.prot.inds, "resid"]), collapse = " ") cat(paste("\t Non-standard residue names present (",not.prot.res,")\n") ) } } ##- Convert HIS resid his <- matrix( c("HIS", "HSD", "HID","HISA", "HIS", "HSE", "HIE","HISB", "HIS", "HSP", "HIP","HISH"), nrow=3, byrow=TRUE, dimnames = list(c("d","e","b"), c("pdb","charmm","amber","gromacs")) ) type.inds <- (colnames(his) %in% type) conv.inds <- !(colnames(his) %in% c(type,"pdb")) his.d.ind <- (pdb$atom[,"resid"] %in% his["d", !type.inds ]) his.e.ind <- (pdb$atom[,"resid"] %in% his["e", conv.inds ]) his.b.ind <- (pdb$atom[,"resid"] %in% his["b", conv.inds ]) pdb$atom[his.d.ind,"resid"] <- his["d", type.inds ] pdb$atom[his.e.ind,"resid"] <- his["e", type.inds ] pdb$atom[his.b.ind,"resid"] <- his["b", type.inds ] ##- Convert ILE CD1 to CD elety and remove chainID if (type=="charmm") { ile.ind <- atom.select(pdb, resid="ILE", elety="CD1", verbose=FALSE)$atom pdb$atom[ile.ind,"elety"] <- "CD" pdb$atom[,"chain"]=NA ## strip chain ID ## Could also add a SEGID via call to chain.pdb() function pdb$atom[,"segid"] <- chain.pdb(pdb) } else { ile.ind <- atom.select(pdb, resid="ILE", elety="CD", verbose=FALSE)$atom pdb$atom[ile.ind,"elety"] <- "CD1" } } ## END type != "original" (conversion) ##-- Convert hydrogen atom types (unfinished!) if(!rm.h) { if(type=="pdb") { pdb$atom[ pdb$atom[,"elety"]=="HN", "elety"] = "H" ###!!! ADD Many MORE ATOM TYPE CONVERSIONS HERE !!!### } if(verbose){ warning(paste("\t Additional hydrogen elety names may need converting.", "\t N.B. It is often best to remove hydrogen (rm.h=TRUE)", "\t before building systems for simulation",sep="\n")) } ## Add other atom name conversions here as the need arises... } return(pdb) } bio3d/R/plotb3.R0000644000176200001440000001036114046015221012775 0ustar liggesusersplotb3 <- function(x, resno=NULL, rm.gaps = FALSE, type="h", main="", sub="", xlim=NULL, ylim=NULL, ylim2zero=TRUE, xlab = "Residue", ylab = NULL, axes=TRUE, ann=par("ann"), col=par("col"), sse=NULL, sse.type="classic", sse.min.length=5, top=TRUE, bot=TRUE, helix.col="gray20", sheet.col="gray80", sse.border=FALSE, ...) { ## Check for gap positions gaps.pos = gap.inspect(x) if(rm.gaps && length(gaps.pos$f.inds)==0) stop('No data to plot (all positions of "x" have gaps).') if(is.matrix(x)) x = x[1, ] ## should support matrix in future if(!is.vector(x)) stop('Input x should be a numeric vector') if(!is.null(resno)) { if(is.pdb(resno)) { ## Take Calpha residue numbers from PDB input ca.inds <- atom.select(resno, "calpha", verbose = FALSE) resno <- resno$atom$resno[ca.inds$atom] } ## Allow "gapped resno" input if(any(is.na(resno))) resno <- resno[!is.na(resno)] if(any(is.na(x))) { tmp.resno <- rep(NA, length(x)) tmp.resno[!is.na(x)] = resno resno = tmp.resno } if(length(resno) != length(x)) { warning("Length of input 'resno' does not equal the length of input 'x'; Ignoring 'resno'") resno=NULL } } if(!is.null(sse)) { ## Obtain SSE vector from PDB or DSSP results input if(is.pdb(sse) || inherits(sse, 'sse')) { if(is.pdb(sse)) sse <- pdb2sse(sse) else sse <- sse$sse } ## Allow "gapped sse" input if(any(is.na(sse))) sse <- sse[!is.na(sse)] if(any(is.na(x))) { tmp.sse = rep(' ', length(x)) tmp.sse[!is.na(x)] <- sse sse <- tmp.sse } if(length(sse) != length(x)) { warning("Length of input 'sse' does not equal the length of input 'x'; Ignoring 'sse'") sse=NULL } } if(rm.gaps) { xy <- xy.coords(x[gaps.pos$f.inds]) if(!is.null(resno)) resno <- resno[gaps.pos$f.inds] if(!is.null(sse)) sse <- sse[gaps.pos$f.inds] } else xy <- xy.coords(x) if (is.null(xlim)) xlim <- range(xy$x[is.finite(xy$x)]) if (is.null(ylim)) ylim <- range(xy$y[is.finite(xy$y)]) if(ylim2zero) ylim[1]=0 plot.new() plot.window(xlim, ylim, ...) points(xy$x, xy$y, col=col, type=type, ...) if(!is.null(sse)) { h <- bounds( which(sse == "H") ) e <- bounds( which(sse == "E") ) ## Remove short h and e elements that can crowd plots if(length(h) > 0) { h <- h[h[,"length"] >= sse.min.length,,drop=FALSE] } else { h <- NULL } if(length(e) > 0) { e <- e[e[,"length"] >= sse.min.length,,drop=FALSE] } else { e <- NULL } if(sse.type != "classic") warning("Only sse.type='classic' is currently available, 'fancy' coming soon") if(top) { ## Determine bottom and top of margin region bo <- max(ylim) + (diff(ylim)*0.001) # 0.1% to <- max(ylim) + (diff(ylim)*0.04) # 4% if(length(h) > 0) rect(xleft=h[,"start"], xright=h[,"end"], ybottom=bo, ytop=to, col=helix.col, border=sse.border) if(length(e) > 0) rect(xleft=e[,"start"], xright=e[,"end"], ybottom=bo, ytop=to, col=sheet.col, border=sse.border) } if(bot){ to <- min(ylim) - (diff(ylim)*0.001) bo <- min(ylim) - (diff(ylim)*0.04) if(length(h) > 0) rect(xleft=h[,"start"], xright=h[,"end"], ybottom=bo, ytop=to, col=helix.col, border=sse.border) if(length(e) > 0) rect(xleft=e[,"start"], xright=e[,"end"], ybottom=bo, ytop=to, col=sheet.col, border=sse.border) } } if(axes) { axis(2) box() at <- axTicks(1); at[1] = 1 if(is.null(resno)) { axis(1, at) } else { labels <- resno[at] labels[is.na(labels)] <- "" # for gaps, no label axis(1, at=at, labels=labels) } } if(ann) { if(is.null(xlab)) xlab=xy$xlab if(is.null(ylab)) ylab=xy$ylab title(main=main, sub=sub, xlab=xlab, ylab=ylab, ...) } } plot.bio3d <- function(...) { plotb3(...) } bio3d/R/print.core.R0000644000176200001440000000124314046015221013654 0ustar liggesusersprint.core <- function(x, vol=NULL, ...) { cv <- x$volume; cv[is.na(cv)]=min(cv,na.rm=TRUE) cl <- x$length; cl[is.na(cl)]=min(cl,na.rm=TRUE) ca <- NULL; cx <- NULL; cr <- NULL if(is.null(vol)) vol <- 1 ind <- (cv<=vol) ca <- sort(x$step.inds[ind]) cx <- atom2xyz(ca) cr <- sort(x$resno[ind]) nc <- length(ca) cat(paste("#",nc, "positions (cumulative volume <=", vol,"Angstrom^3)"),"\n") if(nc==0) { cat(paste("# Min volume is",round(min(cv),3)),"\n") } else { print(bounds(as.numeric(cr)), ...) } ##NextMethod("print", x, quote = FALSE, right = TRUE, ...) invisible(list(atom=ca, xyz=cx, resno=cr)) } bio3d/R/aa2index.R0000644000176200001440000000366114046015221013272 0ustar liggesusers"aa2index" <- function (aa, index = "KYTJ820101", window = 1) { if (!is.vector(aa)) stop("aa2index: non vector argument") if (!is.numeric(window) || window < 1) stop("aa2index: 'window' must be numeric and positive") if (window >= length(aa)) stop("aa2index: 'window' must be smaller than the sequence length") # Use LazyData to import data - changed Jul 23, 2013 # if (!exists("aa.index")) # data(aa.index) aa.index = bio3d::aa.index if (is.numeric(index)) { if (index > length(names(aa.index))) { stop("aa2index: 'index' number does not exist") } } else { if (!is.element(index, names(aa.index))) { stop("aa2index: 'index' name does not exist") } } x <- aa.index[[index]]$I[aa] if (window == 1) { y <- x } else { n <- length(x) y <- rep(NA, n) w <- ceiling(window/2) if ( (window %% 2) == 0 ) { from <- w to <- n - w y[from:to] <- sapply(from:to, function(i) mean(x[(i - (w-1)):(i+w)], na.rm=TRUE)) if (from-1 > 0) { y[1:(from-1)] <- sapply(1:(from-1), function(i) mean(x[1: (i + w)], na.rm=TRUE)) } y[(to+1):n] <- sapply((to+1):n, function(i) mean(x[(i- (w-1)): n], na.rm=TRUE)) } else { from <- w to <- n - (w-1) y[from:to] <- sapply(from:to, function(i) mean(x[(i - (w-1)):(i + (w-1))], na.rm=TRUE)) y[1:(from-1)] <- sapply(1:(from-1), function(i) mean(x[1: (i + (w-1))], na.rm=TRUE)) y[(to+1):n] <- sapply((to+1):n, function(i) mean(x[(i - (w-1)): n], na.rm=TRUE)) } y <- round(y,2) names(y) <- aa } return(y) } bio3d/R/pdbseq.R0000644000176200001440000000100514046015221013043 0ustar liggesusers`pdbseq` <- function(pdb, inds=NULL, aa1=TRUE) { ## b.inds <- atom.select(pdb, "//B////CA/") ## seq.pdb(pdb, b.inds) if(is.null(inds)) inds <- atom.select(pdb, "calpha", verbose=FALSE) # inds <- which(pdb$calpha) # inds <- atom.select(pdb, "//////CA/", verbose=FALSE)$atom if(is.list(inds)) inds <- inds$atom if(aa1) { aa <- aa321(pdb$atom[inds,"resid"]) } else { aa <- pdb$atom[inds,"resid"] } if(length(aa) > 0) { names(aa) <- pdb$atom[inds,"resno"] } return(aa) } bio3d/R/pdbs2pdb.R0000644000176200001440000000623014046015221013272 0ustar liggesusers"pdbs2pdb" <- function(pdbs, inds=NULL, rm.gaps=FALSE, all.atom=FALSE, ncore=NULL) { if(!inherits(pdbs, "pdbs")) { stop("Input 'pdbs' should be of class 'pdbs', e.g. from pdbaln() or read.fasta.pdb()") } if(is.null(inds)) inds <- seq(1, length(pdbs$id)) ncore <- setup.ncore(ncore) ## Set indicies gaps.res <- gap.inspect(pdbs$ali) gaps.pos <- gap.inspect(pdbs$xyz) if(all.atom) { if(is.null(pdbs$all)) { # check file paths saved in pdbs$id if(all(file.exists(pdbs$id[inds]))) { tpdbs <- read.all(trim(pdbs, row.inds=inds, col.inds=1:ncol(pdbs$ali)), verbose=FALSE) if(rm.gaps) { tpdbs <- trim(tpdbs, col.inds=gaps.res$f.inds) } else { tpdbs <- trim(tpdbs) } return(pdbs2pdb(tpdbs, inds=NULL, rm.gaps=rm.gaps, all.atom=TRUE, ncore=ncore)) } else { stop("With 'all.atom=TRUE', input 'pdbs' must be obtained from read.all() or pdbs$id refers to existing files") } } } all.pdbs <- mclapply(inds, function(j) { ## Temporaray file fname <- tempfile(fileext = "pdb") ## Set indices for this structure only f.inds <- NULL if(rm.gaps) { f.inds$res <- gaps.res$f.inds f.inds$pos <- gaps.pos$f.inds } else { f.inds$res <- which(gaps.res$bin[j,]==0) f.inds$pos <- atom2xyz(f.inds$res) } if(length(f.inds$res) > 0) { ## Make a temporary PDB object if(all.atom){ f.inds$res <- which( (pdbs$all.grpby %in% f.inds$res) & !is.gap(pdbs$all.elety[j, ]) ) f.inds$pos <- atom2xyz(f.inds$res) all.chain <- vec2resno(pdbs$chain[j, ], pdbs$all.grpby) if(!is.null(pdbs$insert)) { all.insert <- vec2resno(pdbs$insert[j, ], pdbs$all.grpby) insert <- all.insert[f.inds$res] } else { insert <- rep('', length(f.inds$res)) } xyz <- pdbs$all[j,f.inds$pos] resno <- pdbs$all.resno[j,f.inds$res] resid <- pdbs$all.resid[j,f.inds$res] chain <- all.chain[f.inds$res] elety <- pdbs$all.elety[j,f.inds$res] het <- pdbs$all.hetatm[[j]] if(!is.null(het)) { xyz <- c(xyz, het$xyz) resno <- c(resno, het$atom[, 'resno']) resid <- c(resid, het$atom[, 'resid']) chain <- c(chain, het$atom[, 'chain']) elety <- c(elety, het$atom[, 'elety']) insert <- c(insert, rep('', nrow(het$atom))) } write.pdb(pdb=NULL, xyz=xyz, resno=resno, resid=resid, chain=chain, insert=insert, elety=elety, file=fname) } else { if(!is.null(pdbs$insert)) { insert <- pdbs$insert[j, f.inds$res] } else { insert <- rep('', length(f.inds$res)) } write.pdb(pdb=NULL, xyz =pdbs$xyz[j,f.inds$pos], resno=pdbs$resno[j,f.inds$res], resid=pdbs$resid[j,f.inds$res], chain=pdbs$chain[j,f.inds$res], insert=insert, file=fname) } read.pdb(fname) } else { NULL } }, mc.cores=ncore ) names(all.pdbs) <- sub(".pdb$", "", basename(pdbs$id[inds])) return(all.pdbs) } bio3d/R/geostas.R0000644000176200001440000001156314046015221013244 0ustar liggesusers geostas <- function(...) UseMethod("geostas") geostas.nma <- function(nma, m.inds=7:11, verbose=TRUE, ...) { if(verbose) cat(" .. generating trajectory from", length(m.inds), "modes\n") trj <- NULL for(i in m.inds) { trj <- rbind(trj, mktrj(nma, mode=i, rock=FALSE)) } gs <- geostas.xyz(trj, verbose=verbose, ...) return(gs) } geostas.enma <- function(enma, pdbs=NULL, m.inds=1:5, verbose=TRUE, ...) { if(!inherits(enma, "enma")) stop("provide an 'enma' object as obtained by function 'nma.pdbs()'") if(!inherits(pdbs, "pdbs")) stop("provide an 'pdbs' object as obtained by function 'pdbaln' or 'read.fasta.pdb'") if(verbose) cat(" .. generating trajectory from", length(m.inds), "modes\n") trj <- mktrj(enma, pdbs, m.inds=m.inds, rock=FALSE, ...) gs <- geostas.xyz(trj, verbose=verbose, ...) return(gs) } geostas.pdb <- function(pdb, inds=NULL, verbose=TRUE, ...) { if(!is.pdb(pdb)) stop("provide a 'pdb' object as obtained from function 'read.pdb'") if(!nrow(pdb$xyz)>2) stop("provide a multi-model (>2) 'pdb' with more than ") if(is.null(inds)) { inds <- atom.select(pdb, "calpha") if(verbose) cat(" ..", length(inds$atom), "'calpha' atoms selected\n") } xyz <- pdb$xyz[,inds$xyz] gs <- geostas.xyz(xyz, verbose=verbose, ...) ## map back so that indices matches input 'pdb' if(verbose) { cat(" .. converting indices to match input 'pdb' object \n") cat(" (additional attribute 'atomgrps' generated) \n") } gs$fit.inds <- inds$xyz[gs$fit.inds] resid <- paste(pdb$atom$resid, pdb$atom$resno, pdb$atom$chain, sep="-") grps <- rep(NA, nrow(pdb$atom)) for(i in 1:length(gs$inds)) { gs$inds[[i]] <- as.select(inds$atom[gs$inds[[i]]$atom]) gs$inds[[i]]$call <- NA tmp.inds <- which(resid %in% resid[ gs$inds[[i]]$atom ]) grps[ tmp.inds ] <- i } gs$atomgrps <- grps return(gs) } geostas.pdbs <- function(pdbs, verbose=TRUE, ...) { if(!inherits(pdbs, "pdbs")) stop("provide an 'pdbs' object as obtained by function 'pdbaln' or 'read.fasta.pdb'") ## identify non-gap regions gaps.res <- gap.inspect(pdbs$ali) gaps.pos <- gap.inspect(pdbs$xyz) if(verbose) cat(" ..", length(gaps.pos$f.inds), "non-gap positions selected\n") xyz <- pdbs$xyz[, gaps.pos$f.inds] gs <- geostas.xyz(xyz, verbose=verbose, ...) ## map back so that indices matches input 'pdbs' gs$fit.inds <- gaps.pos$f.inds[gs$fit.inds] grps <- rep(NA, ncol(pdbs$ali)) for(i in 1:length(gs$inds)) { gs$inds[[i]] <- as.select(gaps.res$f.inds[ gs$inds[[i]]$atom ]) gs$inds[[i]]$call <- NA grps[ gs$inds[[i]]$atom ] <- i } return(gs) } geostas.default <- function(...) geostas.xyz(...) geostas.xyz <- function(xyz, amsm=NULL, k=3, pairwise=TRUE, clustalg="kmeans", fit=TRUE, ncore=NULL, verbose=TRUE, ...) { cl <- match.call() xyz <- as.xyz(xyz) if(!nrow(xyz)>2) stop("provide a trajectory (e.g xyz object) with multiple (>2) frames") if(verbose) cat(" .. 'xyz' coordinate data with", nrow(xyz), "frames \n") if(!clustalg %in% c("hclust", "kmeans")) stop("'clustalg' should be 'kmeans' or 'hclust'") if(k<2) stop("provide 'k>1'") if(fit & is.null(amsm)) { if(verbose) cat(" .. 'fit=TRUE': running function 'core.find'\n") invisible(capture.output( core <- core.find(xyz) )) fit.inds <- core$xyz xyz <- fit.xyz(xyz[1,], xyz, fixed.inds=fit.inds, mobile.inds=fit.inds, ncore=ncore) if(is.null(fit.inds)) warning("core indices not found. fitting to all atoms") if(verbose) cat(" .. coordinates are superimposed to core region\n") } else { if(verbose) cat(" .. coordinates are not superimposed prior to geostas calculation\n") fit.inds <- NULL } if(is.null(amsm)) { if(verbose) cat(" .. calculating atomic movement similarity matrix ('amsm.xyz()') \n") amsm <- amsm.xyz(xyz, ncore=ncore) dims <- dim(amsm) if(verbose) cat(" .. dimensions of AMSM are ", dims[1], "x", dims[2], "\n", sep="") } else { if(!all(dim(amsm)==ncol(xyz)/3)) stop("dimension mismatch ('xyz' and 'amsm')") } if(pairwise) { cm <- 1-amsm } else { cm.tmp <- normalize.vector(amsm) cm <- 1 - apply(cm.tmp, 2, function(x,y) x %*% y, cm.tmp) } ## hierarchical clustering if(clustalg=="hclust") { if(verbose) cat(" .. clustering AMSM using 'hclust' \n") dis <- as.dist(cm) hc <- hclust(dis, ...) grps <- cutree(hc, k=k) } ## k-means clustering if(clustalg=="kmeans") { if(verbose) cat(" .. clustering AMSM using 'kmeans' \n") grps <- kmeans(cm, centers=k, ...)$cluster } ## return indices for the identified domains inds <- list() for(i in 1:length(unique(grps))) { inds[[i]] <- as.select(grps==i) } out <- list(call=cl, amsm=amsm, fit.inds=fit.inds, grps=grps, inds=inds) class(out) <- "geostas" return(out) } bio3d/R/filter.identity.R0000644000176200001440000000222714046015221014711 0ustar liggesusersfilter.identity <- function(aln=NULL, ide=NULL, cutoff=0.6, verbose=TRUE, ...) { #k<-filter.identity(aln,cutoff=0.4) #aln$id[k$ind] #k<-filter.identity(ide=k$ide,cutoff=0.6) #plot(k$tree, axes = FALSE, ylab="%identity") #axis(2,labels =c(1,0.8,0.6,0.4)) #abline(h=0.6) if(is.null(ide)) { if(is.null(aln)) stop("Must provide either an alignment 'aln' or identity matrix 'ide'") ide <- seqidentity(aln, ...) } i.d <- as.dist(1-ide) tree <- hclust(i.d) h <- 1 - cutoff n <- nrow(tree$merge) + 1 k <- integer(length(h)) k <- n + 1 - apply(outer(c(tree$height, Inf), h, ">"),2, which.max) if(verbose) cat("filter.identity(): N clusters @ cutoff = ", k, "\n") #ans <- as.vector(.Call("R_cutree", tree$merge, k, PACKAGE = "stats")) ans <- as.vector(cutree(tree, k)) cluster.rep <- NULL for(i in 1:k) { ind <- which(ans==i) if (length(ind) == 1) { cluster.rep <- c(cluster.rep, ind) } else { cluster.rep <- c(cluster.rep, ind[ which.max( colSums(ide[ind,ind]) ) ]) # max similarity } } return(list(ind=cluster.rep, tree=tree, ide=ide)) } bio3d/R/read.mol2.R0000644000176200001440000002243014046015221013355 0ustar liggesusersprint.mol2 <- function(x, ...) { cat(paste("... Name:", x$name, "\n")) cat(paste("...", nrow(x$atom), "atoms in molecule", "\n")) cat(paste("...", nrow(x$bond), "bonds in molecule", "\n")) cat(paste("...", nrow(x$xyz), "frame(s) stored", "\n")) cat("\n") i <- paste( attributes(x)$names, collapse=", ") cat(strwrap(paste(" + attr:",i,"\n"),width=60, exdent=8), sep="\n") cat("\n") } "read.mol2" <- function (file, maxlines = -1L) { if (missing(file)) { stop("read.mol2: please specify a MOL2 'file' for reading") } if (!is.numeric(maxlines)) { stop("read.mol2: 'maxlines' must be numeric") } toread <- file.exists(file) if (!toread) { stop("No input MOL2 file found: check filename") } atom.format <- matrix(c("eleno", 'numeric', "elena", 'character', "x", 'numeric', "y", 'numeric', "z", 'numeric', "elety", 'character', "resno", 'numeric', "resid", 'character', "charge", 'numeric', "statbit", 'character'), ncol=2, byrow=TRUE, dimnames = list(c(1:10), c("name","what")) ) bond.format <- matrix( c("id", 'numeric', "origin", 'numeric', "target", 'numeric', "type", 'character', "statbit", 'character'), ncol=2, byrow=TRUE, dimnames = list(c(1:5), c("name","what")) ) substr.format <- matrix( c("id", 'numeric', "name", 'character', "root_atom", 'numeric', "subst_type", 'character', "dict_type", 'character', "chain", 'character', "sub_type", 'character', "inter_bonds", 'numeric', "status", 'character'), ncol=2, byrow=TRUE, dimnames = list(c(1:9), c("name","what")) ) trim <- function(s) { s <- sub("^ +", "", s) s <- sub(" +$", "", s) s[(s == "")] <- NA s } split.line <- function(x, collapse=TRUE, ncol=NULL) { tmp <- unlist(strsplit(x, split=" ")) inds <- which(tmp!="") if(!collapse) return(tmp[inds]) else { tmp <- tmp[inds] if(length(tmp) < ncol) tmp <- c(tmp, "") return(paste(tmp, collapse=";")) } } ## Read and parse mol2 file raw.lines <- readLines(file, n = maxlines) mol.start <- grep("@MOLECULE", raw.lines) atom.start <- grep("@ATOM", raw.lines) bond.start <- grep("@BOND", raw.lines) subs.start <- grep("@SUBSTRUCTURE", raw.lines) num.mol <- length(mol.start) if (!num.mol>0) { stop("read.mol2: mol2 file contains no molecules") } ## Fetch molecule names and info mol.names <- raw.lines[mol.start+1] mol.info <- trim( raw.lines[mol.start+2] ) mol.info <- as.numeric(unlist(lapply(mol.info, split.line, collapse=FALSE))) if(length(mol.info) < 5) mol.info <- c(mol.info, rep(NA, 5-length(mol.info))) ## mol.info should contain num_atoms, num_bonds, num_subs, num_feat, num_sets mol.info <- matrix(mol.info, nrow=num.mol, byrow=T) num.atoms <- as.numeric(mol.info[,1]) num.bonds <- as.numeric(mol.info[,2]) atom.end <- atom.start + num.atoms bond.end <- bond.start + num.bonds subs.end <- subs.start + mol.info[,3] ## Build a list containing ATOM record indices if(length(atom.start) > 0) { se <- matrix(c(atom.start, atom.end), nrow=length(atom.start)) atom.indices <- lapply(1:num.mol, function(d) seq(se[d,1]+1, se[d,2])) } else { stop("No ATOM records found") } if(length(bond.start) > 0) { se <- matrix(c(bond.start, bond.end), nrow=length(bond.start)) bond.indices <- lapply(1:num.mol, function(d) seq(se[d,1]+1, se[d,2])) } else { bond.indices <- NULL warning("No BOND records found") } if(length(subs.start) > 0) { se <- matrix(c(subs.start, subs.end), nrow=length(subs.start)) subs.indices <- lapply(1:num.mol, function(d) seq(se[d,1]+1, se[d,2])) } else { subs.indices <- NULL } ## Check if file consist of identical molecules same.mol <- TRUE mol.first <- NULL mols <- list() for ( i in 1:num.mol ) { raw.atom <- raw.lines[ atom.indices[[i]] ] if(!is.null(bond.indices)) raw.bond <- raw.lines[ bond.indices[[i]] ] else raw.bond <- NULL if(!is.null(subs.indices)) raw.subs <- raw.lines[ subs.indices[[i]] ] else raw.subs <- NULL ## Read atoms - split by space txt <- unlist(lapply(raw.atom, split.line, ncol=10, collapse=TRUE)) ncol <- length(unlist(strsplit(txt[1], ";"))) if(ncol==9) { txt[1]=paste0(txt[1], ";") ncol <- length(unlist(strsplit(txt[1], ";"))) } atom <- read.table(text=txt, stringsAsFactors=FALSE, sep=";", quote='', colClasses=unname(atom.format[1:ncol,"what"]), col.names=atom.format[1:ncol,"name"], comment.char="", na.strings="", fill=TRUE) ## Read bond - split by space if(!is.null(raw.bond)) { txt <- unlist(lapply(raw.bond, split.line, ncol=5, collapse=TRUE)) ncol <- length(unlist(strsplit(txt[1], ";"))) if(ncol==4) { txt[1]=paste0(txt[1], ";") ncol <- length(unlist(strsplit(txt[1], ";"))) } bond <- read.table(text=txt, stringsAsFactors=FALSE, sep=";", quote='', colClasses=unname(bond.format[1:ncol,"what"]), col.names=bond.format[1:ncol,"name"], comment.char="", na.strings="", fill=TRUE) } else { bond <- NULL } ## Read substructure info - split by space subs <- NULL if(!is.null(raw.subs)) { txt <- unlist(lapply(raw.subs, split.line, ncol=5, collapse=TRUE)) ncol <- length(unlist(strsplit(txt[1], ";"))) if(ncol==4) { txt[1]=paste0(txt[1], ";") ncol <- length(unlist(strsplit(txt[1], ";"))) } subs <- try(read.table(text=txt, stringsAsFactors=FALSE, sep=";", quote='', colClasses=unname(substr.format[1:ncol,"what"]), col.names=substr.format[1:ncol,"name"], comment.char="", na.strings="", fill=TRUE), silent=TRUE) if(inherits(subs, "try-error")) { subs <- try(read.table(text=txt, stringsAsFactors=FALSE, sep=";", quote='', comment.char="", na.strings="", fill=TRUE), silent=TRUE) if(inherits(subs, "try-error")) { warning("error reading SUBSTRUCTURE records. check format.") subs <- NULL } else { ncol <- ncol(subs) if(ncol < 3) { warning("insufficent fields in SUBSTRUCTURE. check format.") } else { warning("could not determine field type of SUBSTRUCTURE records. check format.") if(ncol > 3) colnames(subs) <- c(substr.format[1:3], colnames(subs[4:ncol])) else colnames(subs) <- c(substr.format[1:3]) } } } } ## Same molecules as the previous ones? mol.str <- paste(atom$elena, collapse="") if ( i==1 ) { mol.first <- mol.str } else if (mol.str != mol.first) { same.mol <- FALSE } ## Store data xyz <- as.xyz(as.numeric(t(atom[, c("x", "y", "z")]))) out <- list("atom" = atom, "bond" = bond, "xyz" = xyz, "substructure" = subs, "info" = mol.info[i,], "name" = mol.names[i]) class(out) <- "mol2" mols[[i]] <- out } ## If identical molecules if ( length(unique(num.atoms)) == 1 && same.mol == TRUE ) { atom <- mols[[1]]$atom bond <- mols[[1]]$bond xyz <- t(sapply(lapply(mols, function(x) x$xyz), rbind)) xyz <- as.xyz(xyz) out <- list("atom" = atom, "bond" = bond, "substructure" = subs, "xyz" = xyz, "info" = mol.info[1,], "name" = mol.names[1]) class(out) <- "mol2" } else { out <- mols ##class(out) <- "mol2s" } return(out) } bio3d/R/dist.xyz.R0000644000176200001440000000476714046015221013403 0ustar liggesusers`dist.xyz` <- function(a, b=NULL, all.pairs=TRUE, ncore=1, nseg.scale=1){ ## if 'a' is a vector (or matrix) and ## 'b' is a matrix ## compare (each row of) 'a' to all rows in 'b' ## if 'a' is a matrix and 'b' is NULL ## call 'dist' on 'a' ## if 'a' is a vector and 'b' is NULL ## make 'a' a 3 col matrix and call 'dist' # Parallelized by parallel package (Fri Jul 5 19:58:32 EDT 2013) ncore <- setup.ncore(ncore) if(ncore > 1) { # Issue of serialization problem # Maximal number of cells of a double-precision matrix # that each core can serialize: (2^31-1-61)/8 R_NCELL_LIMIT_CORE = 2.68435448e8 R_NCELL_LIMIT = ncore * R_NCELL_LIMIT_CORE if(nseg.scale < 1) { warning("nseg.scale should be 1 or a larger integer\n") nseg.scale=1 } } if(is.xyz(a) && nrow(a)==1) a <- as.vector(a) if(is.xyz(b) && nrow(b)==1) b <- as.vector(b) if(is.vector(a)) { a <- matrix(a, ncol=3, byrow=TRUE) } else { a <- as.matrix(a) } if(ncol(a) != 3) message(paste('ncol(a) is not 3.\n', 'General n-dimension Euclidean distance ', 'between rows will be calculated.', sep='')) if(is.null(b)) { return(as.matrix(dist(a))) } else { if(is.vector(b)) { b <- matrix(b, ncol=3, byrow=TRUE) } else { b <- as.matrix(b) } } dima <- ncol(a) dimb <- ncol(b) if(dima != dimb) stop("Dimension miss-match of input 'a' and 'b'") if(dima != 3) { warning(paste("input does not have three columns: assuming you want", dima, "dimensional distances")) } if(!all.pairs) { ## distance between coresponding rows d <- rep( NA, max(nrow(a), nrow(b)) ) ind <- 1:min(nrow(a), nrow(b)) d[ind] <- sqrt( rowSums((a[ind,] - b[ind,])^2) ) ## return( sqrt( rowSums((a - b)^2) ) ) return(d) } else { if(ncore > 1) { RLIMIT = floor(R_NCELL_LIMIT / nrow(b)) nDataSeg = floor((nrow(a)-1)/RLIMIT) + 1 nDataSeg = floor(nDataSeg * nseg.scale) lenSeg = floor(nrow(a)/nDataSeg) d.l <- NULL for(i in 1:nDataSeg) { istart = (i-1)*lenSeg + 1 iend = if(i rr[i1, i2]) { rr[i1, i2] = rr[i2, i1] = r col.mat[i1, i2] = col.mat[i2, i1] = col } } } rownames(conn) <- res colnames(conn) <- res rownames(rr) <- res colnames(rr) <- res k = 0 for(i in 1:(nrow(conn)-1)) { for(j in (i+1):ncol(conn)) { if(conn[i, j] == 1) { if(!is.numeric(colors)) { # col = as.numeric(col2rgb(col.mat[i, j]))/255 col = unlist(col.mat[i, j]) / 255 cat("color change rgb [expr ", k, " + $color_start] ", paste(col, collapse=" "), "\n", sep="", file=file, append=TRUE) cat("graphics top color [expr ", k, " + $color_start]\n", sep="", file=file, append=TRUE) } else { cat("graphics top color ", colors, "\n", sep="", file=file, append=TRUE) } cat("draw cylinder {", pdb$xyz[atom2xyz(ca.inds$atom[res[i]])], "} {", pdb$xyz[atom2xyz(ca.inds$atom[res[j]])], "} radius", rr[i, j], " resolution 6 filled 0\n", sep=" ", file=file, append=TRUE) k = k + 1 } } } } else { k = 0 for(j in 1:length(x$path)) { # get spline coordinates # interpolate at 10 points evenly distributed between two nodes xyz = matrix(pdb$xyz[atom2xyz(ca.inds$atom[x$path[[j]]])], nrow=3) spline.x = spline(xyz[1, ], n = ncol(xyz)+(ncol(xyz)-1)*10)$y spline.y = spline(xyz[2, ], n = ncol(xyz)+(ncol(xyz)-1)*10)$y spline.z = spline(xyz[3, ], n = ncol(xyz)+(ncol(xyz)-1)*10)$y # spline radius r = rad(x$dist[j], rmin, rmax, radmax=0.5*mag) # spline color ic = (rmax - x$dist[j]) / (rmax - rmin) if(is.list(cols)) { col = cols[[x$grp[j]]](ic)[1:3] / 255 } else { col = cols(ic)[1:3] / 255 } if(!is.numeric(colors)) { cat("color change rgb [expr ", k, " + $color_start] ", paste(col, collapse=" "), "\n", sep="", file=file, append=TRUE) cat("graphics top color [expr ", k, " + $color_start]\n", sep="", file=file, append=TRUE) } else { cat("graphics top color ", colors, "\n", sep="", file=file, append=TRUE) } for(i in 1:(length(spline.x) - 1)) { cat("draw cylinder {", spline.x[i], spline.y[i], spline.z[i], "} {", spline.x[i+1], spline.y[i+1], spline.z[i+1], "} radius", r, " resolution 6 filled 0\n", sep=" ", file=file, append=TRUE) } k = k + 1 } } # turn on display update cat("display update on\n", file=file, append=TRUE) write.pdb(pdb, file=pdbfile) if(launch) { ## Find default path to external program if(is.null(exefile)) { exefile <- 'vmd' if(nchar(Sys.which(exefile)) == 0) { os1 <- Sys.info()["sysname"] exefile <- switch(os1, Windows = 'vmd.exe', # to be updated Darwin = '/Applications/VMD\\ 1.9.*app/Contents/MacOS/startup.command', 'vmd' ) } } if(nchar(Sys.which(exefile)) == 0) stop(paste("Launching external program failed\n", " make sure '", exefile, "' is in your search path", sep="")) cmd <- paste(exefile, "-e", file) os1 <- .Platform$OS.type if (os1 == "windows") { shell(shQuote(cmd)) } else{ system(cmd) } } } vmd.ecnapath <- function(x, ...) { if(!inherits(x, "ecnapath")) { stop("The input 'x' must be an object of class 'ecnapath'.") } vmd.cnapath(x, ...) } bio3d/R/pdbs2sse.R0000644000176200001440000001331214046015221013316 0ustar liggesusers"pdbs2sse" <- function(pdbs, ind=NULL, rm.gaps=TRUE, resno=TRUE, pdb=FALSE, ...) { ## Log the call cl <- match.call() by.resno <- resno if(is.null(ind)) ind <- 1:length(pdbs$id) gaps.res <- gap.inspect(pdbs$ali) ## Use SSE information from pdbs object if(!is.null(pdbs$sse) & !pdb) { message("Extracting SSE from pdbs$sse attribute") if(rm.gaps) { sse <- pdbs$sse[ind, gaps.res$f.inds, drop=FALSE] resno <- pdbs$resno[ind[1], gaps.res$f.inds] chain <- pdbs$chain[ind[1], gaps.res$f.inds] } else { sse <- pdbs$sse[ind,, drop=FALSE] resno <- pdbs$resno[ind[1], ] chain <- pdbs$chain[ind[1], ] } if(nrow(sse) > 1) { h.inds <- which(apply(sse, 2, function(x) sum(x=="H")) == length(ind)) e.inds <- which(apply(sse, 2, function(x) sum(x=="E")) == length(ind)) } else { h.inds <- which(sse == "H") e.inds <- which(sse == "E") } if(by.resno) { h <- bounds( resno[h.inds], pre.sort=FALSE ) e <- bounds( resno[e.inds], pre.sort=FALSE ) } else { h <- bounds( h.inds, pre.sort=FALSE ) e <- bounds( e.inds, pre.sort=FALSE ) } sse2 <- rep(NA, ncol(sse)) if(length(h.inds)>0) sse2[ h.inds ] <- "H" if(length(e.inds)>0) sse2[ e.inds ] <- "E" sse2[ is.na(sse2) ] <- " " names(sse2) <- paste(resno, chain, sep="_") out <- list() out$sse <- sse2 if(length(h.inds)>0) { out$helix$start <- h[, "start"] out$helix$end <- h[, "end"] out$helix$length <- h[, "length"] out$helix$chain <- chain[ bounds(h.inds)[, "start"] ] } else { out$helix$start <- NULL out$helix$end <- NULL out$helix$length <- NULL out$helix$chain <- NULL } if(length(e.inds)>0) { out$sheet$start <- e[, "start"] out$sheet$end <- e[, "end"] out$sheet$length <- e[, "length"] out$sheet$chain <- chain[ bounds(e.inds)[, "start"] ] } else { out$sheet$start <- NULL out$sheet$end <- NULL out$sheet$length <- NULL out$sheet$chain <- NULL } out$call <- cl class(out) <- "sse" return(out) } ind <- ind[1] message(paste("Re-reading PDB (", basename.pdb(pdbs$id[ind]), ") to extract SSE", sep="")) if(file.exists(pdbs$id[ind])) id <- pdbs$id[ind] sse.aln <- NULL pdb.ref <- try(read.pdb(id), silent=TRUE) if(inherits(pdb.ref, "try-error")) pdb.ref <- try(read.pdb(substr(basename(id), 1, 4)), silent=TRUE) sse.ref <- NULL if(!inherits(pdb.ref, "try-error")) sse.ref <- try(dssp(pdb.ref, ...), silent=TRUE) if(!inherits(sse.ref, "try-error") & !inherits(pdb.ref, "try-error")) { if(rm.gaps) { resno <- pdbs$resno[ind, gaps.res$f.inds] chain <- pdbs$chain[ind, gaps.res$f.inds] } else { resno <- pdbs$resno[ind, ] chain <- pdbs$chain[ind, ] } resid <- paste0(resno, chain) resid[ resid == "NANA" ] = NA ## Helices if(length(sse.ref$helix$start) > 0) { resid.helix <- unbound(sse.ref$helix$start, sse.ref$helix$end) resid.helix <- paste0(resid.helix, rep(sse.ref$helix$chain, sse.ref$helix$length)) h.inds <- which(resid %in% resid.helix) ## inds points to the position in the alignment where the helices are if(by.resno) { resno.sse <- resno[ h.inds ] new.sse <- bounds(resno.sse, pre.sort=FALSE) } else { sids <- 1:length(resid) resno.sse <- sids[h.inds] new.sse <- bounds(resno.sse, pre.sort=FALSE) } chain.sse <- chain[ bounds(h.inds, pre.sort=FALSE)[, "start"] ] if(length(new.sse) > 0) { sse.aln$helix$start <- new.sse[,"start"] sse.aln$helix$end <- new.sse[,"end"] sse.aln$helix$length <- new.sse[,"length"] sse.aln$helix$chain <- chain.sse } } else { h.inds <- NULL sse.aln$helix$start <- NULL sse.aln$helix$end <- NULL sse.aln$helix$length <- NULL sse.aln$helix$chain <- NULL } ## Sheets if(length(sse.ref$sheet$start) > 0) { resid.sheet <- unbound(sse.ref$sheet$start, sse.ref$sheet$end) resid.sheet <- paste0(resid.sheet, rep(sse.ref$sheet$chain, sse.ref$sheet$length)) e.inds <- which(resid %in% resid.sheet) if(by.resno) { resno.sse <- resno[ e.inds ] new.sse <- bounds(resno.sse, pre.sort=FALSE) } else { sids <- 1:length(resid) resno.sse <- sids[e.inds] new.sse <- bounds(resno.sse, pre.sort=FALSE) } chain.sse <- chain[ bounds(e.inds, pre.sort=FALSE)[, "start"] ] if(length(new.sse) > 0) { sse.aln$sheet$start <- new.sse[,"start"] sse.aln$sheet$end <- new.sse[,"end"] sse.aln$sheet$length <- new.sse[,"length"] sse.aln$sheet$chain <- chain.sse } } else { e.inds <- NULL sse.aln$sheet$start <- NULL sse.aln$sheet$end <- NULL sse.aln$sheet$length <- NULL sse.aln$sheet$chain <- NULL } ## SSE vector sse2 <- rep(NA, length(resid)) names(sse2) <- resid if(length(h.inds)>0) sse2[ h.inds ] <- "H" if(length(e.inds)>0) sse2[ e.inds ] <- "E" sse2[ is.na(sse2) ] <- " " sse.aln$sse <- sse2 } else { msg <- NULL if(inherits(pdb.ref, "try-error")) msg = c(msg, paste("File not found:", pdbs$id[1])) if(inherits(sse.ref, "try-error")) msg = c(msg, "Launching external program 'DSSP' failed") warning(paste("SSE failed, ", msg, sep="\n ")) } sse.aln$call <- cl class(sse.aln) <- "sse" return(sse.aln) } bio3d/R/pdb2sse.R0000644000176200001440000000516414046015221013141 0ustar liggesusers#' Obtain An SSE Sequence Vector From A PDB Object #' #' Results are similar to that returned by stride(pdb)$sse and dssp(pdb)$sse. #' #' @details call for its effects. #' #' @param pdb an object of class \code{pdb} as obtained from #' function \code{\link{read.pdb}}. #' @param verbose logical, if TRUE warnings and other messages will be printed. #' #' @return a character vector indicating SSE elements for each amino acide residue. #' The 'names' attribute of the vector contains 'resno', 'chain', 'insert', and #' 'SSE segment number', seperated by the character '_'. #' #' @seealso \code{\link{dssp}}, \code{\link{stride}}, \code{\link{bounds.sse}} #' #' @author Barry Grant & Xin-Qiu Yao #' #' @examples #' \donttest{ #' #PDB server connection required - testing excluded #' #' pdb <- read.pdb("1a7l") #' sse <- pdb2sse(pdb) #' sse #' } pdb2sse <- function(pdb, verbose = TRUE) { ##- Function to obtain an SSE sequence vector from a PDB object ## Result similar to that returned by stride(pdb)$sse and dssp(pdb)$sse ## This could be incorporated into read.pdb() if found to be more generally useful ## if(is.null(pdb$helix) & is.null(pdb$sheet)) { if(verbose) warning("No helix and sheet defined in input 'sse' PDB object: try using dssp()") ##ss <- try(dssp(pdb)$sse) ## Probably best to get user to do this separately due to possible 'exefile' problems etc.. return(NULL) } ## An empty full length SSE vector ref <- pdb$atom[pdb$calpha, c("resno", "chain", "insert")] ref <- paste(ref$resno, ref$chain, ref$insert, sep="_") ss <- rep(" ", length(ref)) names(ss) <- ref ## loop over 'Helix' and 'Sheet' symbol <- c(helix="H", sheet="E") for(i in names(symbol)) { sse <- pdb[[i]] if(length(sse$start) > 0) { for(j in 1:length(sse$start)) { chain <- ifelse(sse$chain[j]=="", NA, sse$chain[j]) insert0 <- ifelse(names(sse$start[j])=="", NA, names(sse$start[j])) sse.ref0 <- paste(sse$start[j], chain, insert0, sep = "_") insert1 <- ifelse(names(sse$end[j])=="", NA, names(sse$end[j])) sse.ref1 <- paste(sse$end[j], chain, insert1, sep = "_") ii <- match(sse.ref0, ref); jj <- match(sse.ref1, ref) if(any(is.na(c(ii, jj)))) { if(verbose) warning(paste("The", i, "No.", j, "start/end with non-protein residue.")) } else { inds <- seq(ii, jj) ss[inds] <- symbol[i] names(ss)[inds] <- paste(names(ss)[inds], "_", j, sep="") } } } } return(ss) } bio3d/R/plot.matrix.loadings.R0000644000176200001440000001411114046015221015647 0ustar liggesusers#' Plot Residue-Residue Matrix Loadings #' #' Plot residue-residue matrix loadings of a particular PC that is obtained from a #' principal component analysis (PCA) of cross-correlation or distance matrices. #' #' The function plots loadings (the eigenvectors) of PCA performed on a set of matrices #' such as distance matrices from an ensemble of crystallographic structures #' and residue-residue cross-correlations or covariance matrices derived from #' ensemble NMA or MD simulation replicates (See \code{\link{pca.array}} for detail). #' Loadings are displayed as a matrix with dimension the same as the input matrices #' of the PCA. Each element of loadings represents the proportion that the corresponding #' residue pair contributes to the variance in a particular PC. The plot can be used #' to identify key regions that best explain the variance of underlying matrices. #' #' @param x the results of PCA as obtained from \code{\link{pca.array}}. #' @param pc the principal component along which the loadings will be shown. #' @param resno numerical vector or \sQuote{pdb} object as obtained from \code{\link{read.pdb}} #' to show residue number on the x- and y-axis. #' @param sse a \sQuote{sse} object as obtained from \code{\link{dssp}} or \code{\link{stride}}, #' or a \sQuote{pdb} object as obtained from \code{\link{read.pdb}} to show secondary #' structural elements along x- and y-axis. #' @param mask.n the number of elements from the diagonal to be masked from output. #' @param plot logical, if FALSE no plot will be shown. #' @param ... additional arguments passed to \code{\link{plot.dccm}}. #' #' @return Plot and also returns a numeric matrix containing the loadings. #' #' @seealso #' \code{\link{plot.dccm}}, \code{\link{pca.array}} #' #' @author Xin-Qiu Yao #' #' @references #' Skjaerven, L. et al. (2014) \emph{BMC Bioinformatics} \bold{15}, 399. #' Grant, B.J. et al. (2006) \emph{Bioinformatics} \bold{22}, 2695--2696. #' #' @examples #' \dontrun{ #' attach(transducin) #' gaps.res <- gap.inspect(pdbs$ali) #' sse <- pdbs$sse[1, gaps.res$f.inds] #' #' # calculate modes #' modes <- nma(pdbs, ncore=NULL) #' #' # calculate cross-correlation matrices from the modes #' cijs <- dccm(modes, ncore=NULL)$all.dccm #' #' # do PCA on cross-correlation matrices #' pc <- pca.array(cijs) #' #' # plot loadings #' l <- plot.matrix.loadings(pc, sse=sse) #' l[1:10, 1:10] #' #' # plot loadings with elements 10-residue separated from diagonal masked #' plot.matrix.loadings(pc, sse=sse, mask.n=10) #' #' } plot.matrix.loadings <- function(x, pc=1, resno=NULL, sse=NULL, mask.n=0, plot=TRUE, ...) { if(!inherits(x, 'pca') && grepl('pca.array', x$call)) stop('Input x must be a "pca" object obtained from "pca.array()".') args.plot.dccm <- formals(plot.dccm) dots <- list(...) # args <- dots[names(dots) %in% names(args.plot.dccm)] args <- dots if('segment.min' %in% names(dots)) segment.min <- dots$segment.min else segment.min <- args.plot.dccm$segment.min if('show' %in% names(dots)) show <- dots$show else show <- as.character(args.plot.dccm$show)[2] if(is.na(show)) show <- 'full' if(!'main' %in% names(args)) args$main <- paste('Loadings of PC ', pc, ' (', round(x$L[pc]/sum(x$L)*100, 1), '%)', sep='') ## compute the dim of matrix M <- nrow(x$U) N <- (1 + sqrt(1 + 8*M)) / 2 is.wholenumber <- function(x, tol = .Machine$double.eps^0.5) abs(x - round(x)) < tol if(!is.wholenumber(N)) stop('Wrong dimension of eigenvectors detected. Check the input x.') if(is.null(resno)) resno <- 1:N if(is.pdb(sse)) { sse <- unname(pdb2sse(sse)) } else if(inherits(sse, 'sse')) { if(!is.null(sse$sse)) sse <- unname(sse$sse) } if(is.character(sse)) sse <- bounds.sse(sse) args$resno <- resno args$sse <- sse ## normalize x$U[, pc] <- x$U[, pc] / max(abs(x$U[, pc])) lmat <- matrix(0, N, N) lmat[upper.tri(lmat)] <- x$U[, pc] lmat[lower.tri(lmat)] <- t(lmat)[lower.tri(lmat)] ## mask diag tmat <- matrix(1, N, N) tmat[diag.ind(tmat, n=mask.n)] <- 0 tmat[lower.tri(tmat)] <- t(tmat)[lower.tri(tmat)] lmat <- lmat * as.vector(tmat) args$x <- lmat if(plot) { do.call(plot.dccm, args) ## add grids draw.sse.grid <- function(sse) { # vertical grid.segments( x0 = sse$start, y0 = switch(show, full=1, upper=N, lower=1), x1 = sse$start, y1 = switch(show, full=N, upper=sse$start, lower=sse$start), gp=gpar(col="gray80", lty=2, lwd=0.3), default.units = "native", vp=vpPath("plot_01.toplevel.vp", "plot_01.panel.1.1.vp") ) # horizental grid.segments( x0 = switch(show, full=1, upper=1, lower=N), y0 = sse$start, x1 = switch(show, full=N, upper=sse$start, lower=sse$start), y1 = sse$start, gp=gpar(col="gray80", lty=2, lwd=0.3), default.units = "native", vp=vpPath("plot_01.toplevel.vp", "plot_01.panel.1.1.vp") ) } if(!is.null(sse)) { if(length(sse$helix$start) > 0) { ## dont have a pdb$helix$length if( is.null(sse$helix$length) ) sse$helix$length <- (sse$helix$end+1)-sse$helix$start inds <- which(sse$helix$length >= segment.min) # sse$helix$start <- match(sort(sse$helix$start[inds]), resno) # sse$helix$end <- match(sort(sse$helix$end[inds]), resno) draw.sse.grid(sse$helix) } if(length(sse$sheet$start) > 0) { ## dont have a pdb$sheet$length if( is.null(sse$sheet$length) ) sse$sheet$length <- (sse$sheet$end+1)-sse$sheet$start inds <- which(sse$sheet$length >= segment.min) # sse$sheet$start <- match(sort(sse$sheet$start[inds]), resno) # sse$sheet$end <- match(sort(sse$sheet$end[inds]), resno) draw.sse.grid(sse$sheet) } } } invisible( lmat ) } bio3d/R/diag.ind.R0000644000176200001440000000027214046015221013247 0ustar liggesusers`diag.ind` <- function (x, n=1, diag = TRUE) { x <- as.matrix(x) if (diag) { !(row(x) > col(x)) + (row(x) <= col(x)-n) } else { !(row(x) >= col(x)) + (row(x) <= col(x)-n) } } bio3d/R/pb.R0000644000176200001440000000231714046015221012175 0ustar liggesusers.init.pb <- function(ncore, min=0, max=1) { if(ncore == 1) { return ( txtProgressBar(min=min, max=max, style=3) ) } else if(ncore > 1) { mcparallel <- get("mcparallel", envir = getNamespace("parallel")) mccollect <- get("mccollect", envir = getNamespace("parallel")) fpb <- fifo(tempfile(), open = "w+b", blocking = T) # spawn a child process for message printing child <- mcparallel({ pb <- txtProgressBar(min=min, max=max, style=3) progress <- 0.0 while(progress < max && !isIncomplete(fpb)) { msg <- readBin(fpb, "double") progress <- progress + as.numeric(msg) setTxtProgressBar(pb, progress) } close(pb) } ) names(fpb) <- child$pid return(fpb) } } .update.pb <- function(pb, step=1) { if(inherits(pb, "txtProgressBar")) { i <- getTxtProgressBar(pb) setTxtProgressBar(pb, i+step) } else { if(inherits(pb, "fifo")) writeBin(step, pb) } } .close.pb <- function(pb) { if(inherits(pb, "fifo")) { mccollect <- get("mccollect", envir = getNamespace("parallel")) mccollect(as.numeric(names(pb))) # mccollect(as.numeric(names(pb))) } close(pb) } bio3d/R/pymol.modes.R0000644000176200001440000001164314046015221014044 0ustar liggesuserspymol.nma <- function(...) pymol.modes(...) pymol.pca <- function(...) pymol.modes(...) pymol.modes <- function(modes, mode=NULL, file=NULL, scale=5, dual=FALSE, type="script", exefile = "pymol", ...) { if(! (inherits(modes, "nma") || inherits(modes,"pca")) ) stop("must supply a 'nma' or 'pca' object, i.e. from 'nma()' or 'pca.xyz()'") allowed <- c("session", "script", "launch") if(!type %in% allowed) { stop(paste("input argument 'type' must be either of:", paste(allowed, collapse=", "))) } ## Check if the program is executable if(type %in% c("session", "launch")) { ## determine path to exefile exefile1 <- .get.exepath(exefile) ## Check if the program is executable success <- .test.exefile(exefile1) if(!success) { stop(paste("Launching external program failed\n", " make sure '", exefile, "' is in your search path", sep="")) } exefile <- exefile1 } if(inherits(modes, "nma")) { if(is.null(mode)) mode <- 7 xyz <- modes$xyz mode.vecs <- matrix(modes$modes[,mode], ncol=3, byrow=T) } else { if(is.null(mode)) mode <- 1 xyz <- modes$mean mode.vecs <- matrix(modes$U[,mode], ncol=3, byrow=T) } ## calc all vec lengths (for coloring later) all.lens <- apply(mode.vecs, 1, function(x) sqrt(sum(x**2))) ## output file name if(is.null(file)) { if(type=="session") file <- "R.pse" if(type=="script") file <- "R.py" } ## use temp-dir unless we output a PML script if(type %in% c("session", "launch")) tdir <- tempdir() else tdir <- "." pyfile <- tempfile(tmpdir=tdir, fileext=".py") psefile <- tempfile(tmpdir=tdir, fileext=".pse") pdbfile <- tempfile(tmpdir=tdir, fileext=".pdb") ## start building pymol script scr <- c("from pymol import cmd") scr <- c(scr, "from pymol.cgo import *") scr <- c(scr, paste("cmd.load('", normalizePath(pdbfile, winslash='/', mustWork=FALSE), "', 'prot')", sep="")) scr <- c(scr, "cmd.show('cartoon')") scr <- c(scr, "cmd.set('cartoon_trace_atoms', 1)") ## define color range blues <- colorRamp(c("blue", "white", "red")) ## Arrow widths w.body <- 0.15; w.head <- 0.2 scr <- c(scr, "obj=[]") for ( i in 1:nrow(mode.vecs)) { inds <- atom2xyz(i) coords <- xyz[inds] ## For coloring (longest vec has length=1) tmp.len <- sqrt(sum((mode.vecs[i,]/max(all.lens))**2)) if(tmp.len>1) tmp.len <- 1 col <- blues(tmp.len) col <- round(col/256,4) col <- paste(col, collapse=", ") ## Main vector tmp.vec <- mode.vecs[i,] * scale ## For arrow head if(sqrt(sum(tmp.vec**2))<1) norm.vec <- tmp.vec else norm.vec <- normalize.vector(mode.vecs[i,]) ## Set vectors arrow.vec.a <- (coords + tmp.vec) head.vec.a <- (arrow.vec.a + (norm.vec)) arrow.vec.b <- (coords - tmp.vec) head.vec.b <- (arrow.vec.b - (norm.vec)) a <- paste(coords, collapse=",") b1 <- paste(arrow.vec.a, collapse=",") c1 <- paste(head.vec.a, collapse=",") b2 <- paste(arrow.vec.b, collapse=",") c2 <- paste(head.vec.b, collapse=",") ## Arrow body scr <- c(scr, paste("obj.extend([CYLINDER", a, b1, w.body, col, col, "])", sep=", ")) if(dual) scr <- c(scr, paste("obj.extend([CYLINDER", a, b2, w.body, col, col, "])", sep=", ")) ## Arrow heads scr <- c(scr, paste("obj.extend([CONE", b1, c1, w.head, 0.0, col, col, 1.0, 1.0,"])", sep=", ")) if(dual) scr <- c(scr, paste("obj.extend([CONE", b2, c2, w.head, 0.0, col, col, 1.0, 1.0,"])", sep=", ")) } name <- "vecs" scr <- c(scr, paste("cmd.load_cgo(obj, '", name, "')", sep="")) if(type == "session") scr <- c(scr, paste0("cmd.save('", normalizePath(psefile, winslash='/', mustWork=FALSE), "')")) ## Write PDB structure file write.pdb(xyz=xyz, file=pdbfile) ## Write python script or PDB with conect records write(scr, file=pyfile, sep="\n") if(type %in% c("session", "launch")) { if(type == "session") args <- "-cq" else args <- "" ## Open pymol cmd <- paste(exefile, args, pyfile) os1 <- Sys.info()["sysname"] if (os1 == "Windows") { status <- shell(paste(shQuote(exefile), args, pyfile)) } else { status <- system(cmd) } if(!(status %in% c(0,1))) { stop(paste("An error occurred while running command\n '", exefile, "'", sep="")) } } if(type == "session") { file.copy(psefile, file, overwrite=TRUE) message(paste("PyMOL session written to file", file)) invisible(file) } if(type == "script") { file.copy(pyfile, file, overwrite=TRUE) unlink(pyfile) message(paste("PyMOL script written to file", file)) invisible(file) } } bio3d/R/get.blast.R0000644000176200001440000000564014046015221013461 0ustar liggesusersget.blast <- function(urlget, time.out = NULL, chain.single=TRUE) { if(substr(urlget, 1, 5) == "https" && grep("Blast.cgi", urlget) && grep("RID[[:space:]]*=", urlget)) { rid <- sub("^.*RID[[:space:]]*=[[:space:]]*", "", urlget) names(urlget)=rid } else { stop("Illegal link for retrieving BLAST results") } cat(paste(" Searching ... please wait (updates every 5 seconds) RID =",rid,"\n ")) ##- Retrieve results via RID code and check for job completion ## (completion is based on retrieving HTML or CSV output) html <- 1 t.count <- 0 repeat { raw <- try(read.csv(urlget, header = FALSE, sep = ",", quote="", dec=".", fill = TRUE, comment.char="", stringsAsFactors=FALSE), silent=TRUE) if(class(raw)=="try-error") { stop("No hits found: thus no output generated") } html <- grep("DOCTYPE", raw[1,]) if(!is.null(time.out) && (t.count > time.out) || (length(html) != 1)) break; cat("."); Sys.sleep(5) t.count <- t.count + 5 } if(length(html) == 1) { warning("\nTime out (", time.out, "s): Retrieve results with returned link\n", urlget, "\n", sep="") return(urlget) } colnames(raw) <- c("queryid", "subjectids", "identity", "alignmentlength", "mismatches", "gapopens", "q.start", "q.end", "s.start", "s.end", "evalue", "bitscore", "positives") ##- Expand 'raw' for each hit in 'subjectids' (i.e. split on ";") eachsubject <- strsplit(raw$subjectids, ";") subjectids <- unlist(eachsubject) n.subjects <- sapply(eachsubject, length) df <- raw[rep(row.names(raw), times=n.subjects), ] df$subjectids <- subjectids row.names(df) <- 1:nrow(df) ##- Parse ids #all.ids <- strsplit(subjectids, "\\|") #gi.id <- sapply(all.ids, '[', 2) gi.id <- subjectids all.ids <- strsplit(subjectids, "_") pdb.4char <- sapply(all.ids, '[', 1) pdb.chain <- sapply(all.ids, '[', 2) ## Catch long chain IDs as in hits from "P12612" (e.g "1WF4_GG" => "1WF4_g") if(chain.single) { chain.ind <- which(nchar(pdb.chain) > 1 & nchar(pdb.4char)==4) if(length(chain.ind) > 0) { pdb.chain[ chain.ind ] <- tolower( substr(pdb.chain[ chain.ind ],1,1 ) ) } } pdb.id <- rep(NA, length(pdb.4char)) tinds <- !is.na(pdb.chain) & nchar(pdb.4char)==4 pdb.id[tinds] <- paste(pdb.4char[tinds],"_",pdb.chain[tinds],sep="") ##- Map zero evalues to arbitrarily high value for -log(evalue) df$mlog.evalue <- -log(df$evalue) df$mlog.evalue[is.infinite(df$mlog.evalue)] <- -log(1e-308) df$pdb.id <- pdb.id df$acc <- gi.id cat(paste("\n Reporting",length(pdb.id),"hits\n")) # sort hit table according to mlog.evalue df <- df[order(df$mlog.evalue, decreasing = TRUE), ] output <- list(hit.tbl = df, raw = raw, url = urlget) class(output) <- "blast" return(output) } bio3d/R/atom2ele.R0000644000176200001440000000576414046015221013315 0ustar liggesusersatom2ele <- function(...) UseMethod("atom2ele") atom2ele.default <- function(x, elety.custom=NULL, rescue=TRUE, ...){ if(!is.null(elety.custom)) { if(!all(c("name","symb") %in% names(elety.custom))) stop("'elety.custom' must contains 'name' and 'symb' components") inds <- unlist(lapply(elety.custom, is.factor)) elety.custom[inds] <- lapply(elety.custom[inds], as.character) } atom.index <- rbind(elety.custom[,c("name","symb")], bio3d::atom.index[,c("name","symb")]) # Why atom names starting by "H" are directly converted to "H" as follow? # x[substr(x,1,1) == "H"] <- "H" symb <- atom.index[match(x, atom.index[,"name"]), "symb"] is.unknown <- is.na(symb) if(any(is.unknown)) { if(rescue) { ## vector of unknown elements unknowns <- unique(x[is.unknown]) symb2 <- rep(NA, length(unknowns)) names(symb2) <- unknowns ## format element names before matching spl <- strsplit(unknowns, "") totest <- lapply(spl, function(b) { ## remove numbering from atom name (e.g. FE2, C4A) inds <- grep("[^0-9]", b) if(length(inds) == 0) return(b) j <- bounds(inds)[1, c("start", "end")] b <- b[j[1]:j[2]] ## First char to upper, remaining to lower case new <- NULL for(i in 1:length(b)){ new <- c(new, ifelse(i==1, toupper(b[i]), tolower(b[i]))) } return(paste(new, collapse="")) }) ## match with bio3d::elements$symb totest <- unlist(totest) if(any(totest %in% bio3d::elements$symb)) { symb2[unknowns[totest %in% bio3d::elements$symb]] <- totest[totest %in% bio3d::elements$symb] } ## try with first character to see if it matches elements$symb if(any(is.na(symb2))) { na.inds <- which(is.na(symb2)) totest <- toupper(substr(names(symb2[na.inds]), 1, 1)) if(any(totest %in% bio3d::elements$symb)) { rplc <- names(symb2[na.inds])[totest %in% bio3d::elements$symb] symb2[rplc] <- totest[totest %in% bio3d::elements$symb] } } ## stop with error in case of un-mapped elements if(any(is.na(symb2))) { stop("\telements could not be determined for: ", paste(names(symb2)[is.na(symb2)], collapse=", ")) } ## inform user on mapped elements warning(paste("\n\tmapped element ", names(symb2), " to ", symb2, sep="")) ## include matched elements to original symbol vector symb[is.unknown] <- symb2[ x[is.unknown] ] } else { stop("\telements could not be determined for: ", paste(unique(x[is.unknown]), collapse=", ")) } } symb <- unlist(symb) return(symb) } atom2ele.pdb <- function(pdb, inds=NULL, ...){ if(!is.null(inds)) pdb <- trim(pdb, inds) atom.names <- pdb$atom[,"elety"] return(atom2ele.default(atom.names, ...)) } bio3d/R/write.pdb.R0000644000176200001440000002701614046015221013475 0ustar liggesusers"write.pdb" <- function (pdb = NULL, file = "R.pdb", xyz = pdb$xyz, type = NULL, resno = NULL, resid = NULL, eleno = NULL, elety = NULL, chain = NULL, insert= NULL, alt = NULL, o = NULL, b = NULL, segid = NULL, elesy = NULL, charge = NULL, append = FALSE, verbose =FALSE, chainter = FALSE, end = TRUE, sse = FALSE, print.segid = FALSE) { if(is.null(xyz) || !is.numeric(xyz)) stop("write.pdb: please provide a 'pdb' object or numeric 'xyz' coordinates") if(any(is.na(xyz))) stop("write.pdb: 'xyz' coordinates must have no NA's.") if ( is.null(nrow(xyz)) ) { natom <- length(xyz)/3 nfile <- 1 } else if (is.matrix(xyz)) { natom <- ncol(xyz)/3 nfile <- nrow(xyz) if (verbose) { cat("Multiple rows in 'xyz' will be interperted as multimodels/frames\n") } } else { stop("write.pdb: 'xyz' or 'pdb$xyz' must be either a vector or matrix") } # card <- rep("ATOM", natom) card <- type if (!is.null(pdb)) { if (is.null(card)) card <- pdb$atom$type else if(length(card) == 1) card = rep(card, natom) if (is.null(resno)) resno = pdb$atom[, "resno"] if (is.null(resid)) resid = pdb$atom[, "resid"] if (is.null(eleno)) eleno = pdb$atom[, "eleno"] if (is.null(elety)) elety = pdb$atom[, "elety"] if (is.null(chain)) chain = pdb$atom[, "chain"] else if(length(chain) == 1) chain = rep(chain, natom) if (is.null(insert)) insert = pdb$atom[, "insert"] if (is.null(alt)) alt = pdb$atom[, "alt"] if (is.null(o)) o = pdb$atom[, "o"] if (is.null(b)) b = pdb$atom[, "b"] if (any(is.na(o))) { o = rep("1.00", natom) } if (any(is.na(b))) { b = rep("0.00", natom) } #if (any(is.na(chain))) { chain = rep(" ", natom) } chain[is.na(chain)]= "" insert[is.na(insert)] = "" alt[is.na(alt)] = "" if (is.null(segid)) segid = pdb$atom[, "segid"] segid[is.na(segid)] = "" if (is.null(elesy)) elesy = pdb$atom[, "elesy"] elesy[is.na(elesy)] = "" if (is.null(charge)) charge = pdb$atom[, "charge"] } else { if (is.null(card)) card = rep("ATOM", natom) else if(length(card) == 1) card = rep(card, natom) if (is.null(resno)) resno = c(1:natom) if (is.null(resid)) resid = rep("ALA", natom) if (is.null(eleno)) eleno = c(1:natom) if (is.null(elety)) elety = rep("CA", natom) if (is.null(chain)) chain = rep("", natom) else if (length(chain) == 1) chain = rep(chain, natom) ##if(any(is.na(chain))) chain[is.na(chain)]= "" if (is.null(insert)) insert=rep("", natom) if (is.null(alt)) alt=rep("", natom) if (is.null(o)) o = rep("1.00",natom) if (is.null(b)) b = rep("0.00", natom) if (is.null(segid)) segid = rep("", natom) if (is.null(elesy)) elesy = rep("", natom) if (is.null(charge)) charge = rep("", natom) chain[is.na(chain)]= "" insert[is.na(insert)] = "" alt[is.na(alt)] = "" } if (!is.logical(append)) stop("write.pdb: 'append' must be logical TRUE/FALSE") if (length(as.vector(xyz))%%3 != 0) { stop("write.pdb: 'length(xyz)' must be divisable by 3.") } check.lengths <- sum(length(card), length(resno), length(resid), length(eleno), length(elety), length(chain), length(insert), length(alt), length(o), length(b), length(segid), length(elesy), length(charge)) if (check.lengths%%natom != 0) { stop("write.pdb: the lengths of all input vectors != 'length(xyz)/3'.") } o <- as.numeric(o) b <- as.numeric(b) eleno <- as.character(eleno) resno <- as.character(resno) charge <- as.character(charge) charge[is.na(charge)] = "" if(!print.segid) segid = rep("", natom) ## Inserted Jul 8th 2008 for adding TER between chains ter.lines <- (which(!duplicated(chain))[-1] - 1) atom.print <- function(card = "ATOM", eleno, elety, alt = "", resid, chain = "", resno, insert = "", x, y, z, o = "1.00", b = "0.00", segid = "", elesy = "", charge = "") { format <- "%-6s%5s %-3s%1s%3s %1s%4s%1s%3s%8.3f%8.3f%8.3f%6.2f%6.2f%6s%-4s%2s%2s" if (nchar(elety) > 3 || (is.character(elesy) && nchar(elesy)>1)) { # if (nchar(elety) >= 3) { # if ((substr(elety, 2, 2) == "H") | (substr(elety, 1, 1) == "H")) { format <- "%-6s%5s %-4s%1s%3s %1s%4s%1s%3s%8.3f%8.3f%8.3f%6.2f%6.2f%6s%-4s%2s%2s" # } } sprintf(format, card, eleno, elety, alt, resid, chain, resno, insert, "", x, y, z, o, b, "", segid, elesy, charge) } ##### To write SSE annotations ##### format.sse <- function(pdb) { # format 'sse' component in a pdb object to include resid and length lapply(c(helix='helix', sheet='sheet'), function(x) { sse <- pdb[[x]] if(length(sse$start) > 0) { ref <- pdb$atom[pdb$calpha, c("resno", "chain", "insert", "resid")] refkey <- paste(ref$resno, ref$chain, ref$insert, sep = "_") insert <- sub(' +', '', names(sse$start)) insert[insert == ''] <- NA skey <- paste(sse$start, sse$chain, insert, sep="_") insert <- sub(' +', '', names(sse$end)) insert[insert == ''] <- NA ekey <- paste(sse$end, sse$chain, insert, sep="_") resno = data.frame(start = sse$start, end = sse$end) resid = data.frame(start = ref$resid[match(skey, refkey)], end = ref$resid[match(ekey, refkey)]) insert = data.frame(start= names(sse$start), end = names(sse$end)) type = ifelse(x=='helix', 'type', 'sense') length = match(ekey, refkey) - match(skey, refkey) + 1 return(list(resno=resno, resid=resid, chain=sse$chain, insert=insert, type=sse[[type]], length=length)) } else { return (NULL) } } ) } if(!is.null(pdb) && sse) { lines <- NULL new.sse <- format.sse(pdb) if(!is.null(new.sse$helix)) { xx <- new.sse$helix format <- "%-6s %3d %3s %3s %1s %4d%1s %3s %1s %4d%1s%2s%30s %5d" for(i in 1:nrow(xx$resno)) lines <- rbind(lines, sprintf(format, 'HELIX', i, i, xx$resid$start[i], xx$chain[i], xx$resno$start[i], xx$insert$start[i], xx$resid$end[i], xx$chain[i], xx$resno$end[i], xx$insert$end[i], xx$type[i], '', xx$length[i])) } if(!is.null(new.sse$sheet)) { xx <- new.sse$sheet format <- "%-6s %3d %3s%2d %3s %1s%4d%1s %3s %1s%4d%1s%2s" for(i in 1:nrow(xx$resno)) lines <- rbind(lines, sprintf(format, 'SHEET', i, 'S1', nrow(xx$resno), xx$resid$start[i], xx$chain[i], xx$resno$start[i], xx$insert$start[i], xx$resid$end[i], xx$chain[i], xx$resno$end[i], xx$insert$end[i], xx$type[i]) ) } if(!is.null(lines)) { write.table(lines, file = file, quote = FALSE, row.names = FALSE, col.names = FALSE, append = append) if(!append) append = TRUE } } ##################################### if(nfile==1) { coords <- matrix(round(as.numeric(xyz), 3), ncol = 3, byrow = TRUE) if (verbose) { cat(paste("Writing 1 frame with",natom,"atoms ")) } lines <- NULL ii = 0 teleno <- as.numeric(eleno) for (i in 1:natom) { lines <- rbind(lines, atom.print( card = card[i], eleno = as.character(teleno[i] + ii), elety = elety[i], alt = alt[i], resid = resid[i], chain = chain[i], resno = resno[i], insert = insert[i], x = coords[i, 1], y = coords[i, 2], z = coords[i, 3], o = o[i], b = b[i], segid = segid[i], elesy = elesy[i], charge = charge[i])) ## Inserted Jul 8th 2008 for adding TER between chains ## Modified to be consistent to PDB format v3.3 if(chainter) { if(i %in% ter.lines) { # lines <- rbind(lines, "TER ") ii = ii + 1 lines <- rbind(lines, sprintf("%-6s%5s%6s%3s%1s%1s%4s%1s", "TER", as.character(teleno[i] + ii), "", resid[i], "", chain[i], resno[i], insert[i])) } } } ## Changed cat() for write.table() as sugested by Joao Martins ##cat(lines, file = file, sep = "\n", append = append) write.table(lines, file = file, quote = FALSE, row.names = FALSE, col.names = FALSE, append = append) if(chainter) { ii = ii + 1 cat(sprintf("%-6s%5s%6s%3s%1s%1s%4s%1s\n", "TER", as.character(teleno[i] + ii), "", resid[i], "", chain[i], resno[i], insert[i]), file = file, append = TRUE) } if(end) { cat("END \n", file = file, append = TRUE) } } else { if (verbose) { cat(paste("Writing",nfile,"frames with",natom,"atoms"),"\n") cat("Frame Progress (x50) ") } if(!append) unlink(file) for (j in 1:nfile) { coords <- matrix(round(as.numeric(xyz[j,]), 3), ncol = 3, byrow = TRUE) lines <- NULL ii = 0 teleno <- as.numeric(eleno) for (i in 1:natom) { lines <- rbind(lines, atom.print( eleno = as.character(teleno[i] + ii), elety = elety[i], alt = alt[i], resid = resid[i], chain = chain[i], resno = resno[i], insert = insert[i], x = coords[i, 1], y = coords[i, 2], z = coords[i, 3], o = o[i], b = b[i], segid = segid[i], elesy = elesy[i], charge = charge[i])) ## Inserted Jul 8th 2008 for adding TER between chains (untested) ## Modified to be consistent to PDB format v3.3 if(chainter) { if(i %in% ter.lines) { # lines <- rbind(lines, "TER ") ii = ii + 1 lines <- rbind(lines, sprintf("%-6s%5s%6s%3s%1s%1s%4s%1s", "TER", as.character(teleno[i] + ii), "", resid[i], "", chain[i], resno[i], insert[i])) } } } if (verbose) { if (j%%50 == 0) cat(".") } ##cat(lines, file = file, sep = "\n", append = TRUE) cat(sprintf("%-6s%4s%4d\n", "MODEL", " ", j), file = file, append = TRUE) write.table(lines, file = file, quote = FALSE, row.names = FALSE, col.names = FALSE, append = TRUE) if(chainter) { ii = ii + 1 cat(sprintf("%-6s%5s%6s%3s%1s%1s%4s%1s\n", "TER", as.character(teleno[i] + ii), "", resid[i], "", chain[i], resno[i], insert[i]), file=file, append=TRUE) } cat(sprintf("%-6s\n", "ENDMDL"), file = file, append = TRUE) } if(end) { cat("END \n", file = file, append = TRUE) } } if (verbose) cat(" DONE","\n") } bio3d/R/get.seq.R0000644000176200001440000001121114046015221013133 0ustar liggesusers`get.seq` <- function(ids, outfile="seqs.fasta", db="nr", verbose=FALSE) { ## Download FASTA format sequences from the NCBI nr, ## SWISSPROT/UNIPROT, or RCSB PDB databases via their gi, ## SWISSPROT identifer number, or PDB ids. oops <- requireNamespace("httr", quietly = TRUE) if(!oops) stop("Please install the httr package from CRAN") db <- tolower(db) if( !(db %in% c("nr", "swissprot", "uniprot", "pdb")) ) stop("Option database should be one of nr, swissprot/uniprot, or pdb") db <- switch(db, nr='nr', swissprot='uniprotkb', uniprot='uniprotkb', pdb='pdb') ids <- toupper(ids) ids <- unique(ids) if(db == "nr") { baseUrl <- 'https://www.ncbi.nlm.nih.gov/sviewer/viewer.fcgi?db=protein' } else { baseUrl <- 'https://www.ebi.ac.uk/Tools/dbfetch/dbfetch' # check if API works url <- paste(baseUrl, '/dbfetch.databases', sep='') resp <- httr::GET(url) if(httr::http_error(resp)) stop('Access to EMBL-EBI server failed.') } # fetch sequences ## Remove existing file if(file.exists(outfile)) { warning(paste("Removing existing file:",outfile)) unlink(outfile) } if(verbose) { cat("Fetching sequences from\n\t", baseUrl, "\n\nPlease wait", sep="") } else { cat("Fetching... Please wait") } ## do multiple requests if # of sequences > nmax if(grepl('ebi', baseUrl)) { nmax = 100 } else { nmax = 500 } errorCount=0 checkInterval = 3 checkInterval2 = 300 # wait longer if blocked by servers n <- floor( (length(ids)-1)/nmax) + 1 for(i in 1:n) { if(i>1) Sys.sleep(10) # sleep 10s before sending another request i1 <- (i-1)*nmax+ 1 i2 <- ifelse(i*nmax>length(ids), length(ids), i*nmax) ids1 <- ids[i1:i2] if(db=="nr") { url <- paste(baseUrl, "&val=", paste(ids1, collapse=','), "&report=fasta&retmode=text&page_size=",nmax, sep='') } else { url <- paste(baseUrl, db, paste(ids1, collapse=','), 'fasta?style=raw', sep='/') } resp <- try(httr::GET(url), silent=TRUE) if(inherits(resp, 'try-error')) { text <- 'LOST CONNECTION' } else { text <- httr::content(resp, 'text', encoding='utf-8') } retry=0 while((grepl('^LOST CONNECTION', text) || httr::http_error(resp) || grepl('^ERROR', text) || grepl('Nothing has been found', text)) && retry<3) { retry = retry + 1 if(grepl('^LOST CONNECTION', text)) { if(verbose) { cat('\nLost connection to the URL:\n\t', url, '\n\nRetry ', retry, ' in ', as.integer(checkInterval2*retry/60), ' minutes...', sep='') } else { cat('\nLost connection. Retry ', retry, ' in ', as.integer(checkInterval2*retry/60), 'min...', sep='') } Sys.sleep(checkInterval2 * retry) } else { if(verbose) { cat('\nFetching sequences failed from the URL:\n\t', url, '\n\nRetry ', retry, '...', sep='') } else { cat('\nFailed. Retry ', retry, '...', sep='') } Sys.sleep(checkInterval) } resp <- try(httr::GET(url), silent=TRUE) if(inherits(resp, 'try-error')) { text <- 'LOST CONNECTION' } else { text <- httr::content(resp, 'text', encoding='utf-8') } } if(grepl('^LOST CONNECTION', text) || httr::http_error(resp) || grepl('^ERROR', text) || grepl('Nothing has been found', text)) { errorCount = errorCount + 1 if(errorCount==n) stop('No sequence found. Check the ID(s).') } else { ## BUGFIX: remove the space between uniprot ID and acc. no. ## and so both will be read via read.fasta() for checking below. if(db == "uniprotkb") { text <- gsub("(>[^ ]*) ", "\\1|", text) } cat(text, file=outfile, append=TRUE) } cat('.') } cat(' Done.\n') # check if all sequences are downloaded successfully. seqs <- read.fasta(outfile) if(db=="nr") { myids <- strsplit(seqs$id, split='\\|') myids <- sapply(myids, function(x) { ii <- match('pdb', x) if(!is.na(ii)) { x[ii+1] <- paste(x[ii+1], x[ii+2], sep='_') } paste(x, collapse='|') }) rtn <- sapply(ids, function(x) !any(grepl(x, myids))) if(length(seqs$id) == length(ids)) { if(any(rtn)) { warning("Returned sequence IDs may be different from query.") } rtn = FALSE } } else { rtn <- sapply(ids, function(x) !any(grepl(x, seqs$id))) } if(all(!rtn)) { return(seqs) } else { warning("Not all downloads were successful. See returned values (TRUE=possibly failed).") return(rtn) } } bio3d/R/plot.pca.score.R0000644000176200001440000000264114046015221014426 0ustar liggesusers"plot.pca.score" <- function(x, inds=NULL, col=rainbow(nrow(x)), lab="", ... ) { # Produces a z-score plot for PC1 vs PC2, # PC3 vs PC2 and PC1 vs PC3 if given a # matrix "z"that contains the column wise # scores obtained from PCA 'pca.xyz' if(is.list(x)) x=x$z # output from pca.xyz() if(is.null(inds)) inds <- 1:nrow(x) op <- par(no.readonly=TRUE) on.exit(par(op)) par(mfrow=c(2,2));par(pty="s") limits<-max(abs(c(range(x[,1]),range(x[,2]),range(x[,3])))) print(paste("axes limits: ",round(limits,2),sep="")) text.offset<-limits/19 plot(x[,1], x[,2], # pc1 vs pc2 xlim=c(-limits,limits), ylim=c(-limits,limits), xlab="PC1", ylab="PC2",col=col, ...) abline(h=0,col="gray",lty=2);abline(v=0,col="gray",lty=2) text(x[inds,1]+text.offset, x[inds,2]+text.offset, labels = lab[inds]) plot(x[,3], x[,2], # pc3 vs pc3 xlim=c(-limits,limits), ylim=c(-limits,limits), xlab="PC3", ylab="PC2", col=col, ...) abline(h=0,col="gray",lty=2);abline(v=0,col="gray",lty=2) text(x[inds,3]+text.offset, x[inds,2]+text.offset, labels = lab[inds]) plot(x[,1], x[,3], # pc1 vs pc3 xlim=c(-limits,limits), ylim=c(-limits,limits), xlab="PC1", ylab="PC3",col=col, ...) abline(h=0,col="gray",lty=2);abline(v=0,col="gray",lty=2) text(x[inds,1]+text.offset, x[inds,3]+text.offset, labels = lab[inds]) } bio3d/R/wrap.tor.R0000644000176200001440000000251314046015221013346 0ustar liggesusers"wrap.tor" <- function(data,wrapav=TRUE,avestruc=NULL){ wrap180 <- function(x) { x[which(x > 180, arr.ind=TRUE)] <- x[which(x > 180, arr.ind=TRUE)] - 360 x[which(x < -180, arr.ind=TRUE)] <- x[which(x < -180, arr.ind=TRUE)] + 360 x } if(!wrapav && is.null(avestruc)) stop("Average structure is missing") if(is.vector(data)) { data <- matrix(data,ncol=1) return.vec = TRUE } else { return.vec = FALSE } avestruc.i<-avestruc datawrap <- NULL for(i in 1:ncol(data)) { struc <- data[,i] if(all(is.na(struc))) { struc <- rep(NA, length(struc)) } else { if(wrapav){ avestruc <- wrap180( mean(struc, na.rm=TRUE) ) } else { avestruc<-avestruc.i[i] } difvar <- avestruc - struc while (length(difvar[ as.vector(na.omit(abs(difvar)>180)) ]) > 0) { struc[which(difvar > 180, arr.ind=TRUE)] <- struc[which(difvar > 180, arr.ind=TRUE)] + 360 struc[which(difvar < -180, arr.ind=TRUE)] <- struc[which(difvar < -180, arr.ind=TRUE)] - 360 if(wrapav){avestruc <- wrap180( mean(struc, na.rm=TRUE) %% 360 )} difvar <- avestruc - struc } } datawrap <- cbind(datawrap,struc) } if(return.vec) datawrap = as.vector(datawrap) return(datawrap) } bio3d/R/nma.R0000644000176200001440000000005714046015221012346 0ustar liggesusers"nma" <- function(...) { UseMethod("nma") } bio3d/R/aa123.R0000644000176200001440000000151514046015221012402 0ustar liggesusers"aa123" <- function (aa) { if(any(nchar(aa)!=1)) stop("Provide a character vector of individual 1-letter aminoacid codes") # convert one-letter IUPAC amino-acid code into # three-letter PDB style, for instance "A" into "ALA". aa1 <- c("-","X", "A","C","D","E","F","G", "H","I","K","L","M","N","P","Q", "R","S","T","V","W","Y") aa3 <- c("---","UNK", "ALA", "CYS", "ASP", "GLU", "PHE", "GLY", "HIS", "ILE", "LYS", "LEU", "MET", "ASN", "PRO", "GLN", "ARG", "SER", "THR", "VAL", "TRP", "TYR") convert <- function(x) { if(is.na(x)) return(NA) if (all(x != aa1)) { warning("Unknown one letter code for aminoacid") return("UNK") } else { return(aa3[which(x == aa1)]) } } return(as.vector(unlist(sapply(aa, convert)))) } bio3d/R/filter.rmsd.R0000644000176200001440000000237714046015221014033 0ustar liggesusersfilter.rmsd <- function(xyz=NULL, rmsd.mat=NULL, cutoff=0.5, fit=TRUE, verbose=TRUE, inds=NULL, method="complete", ...) { # k<-filter.rmsd(xyz=pdbs$xyz, cutoff=0.5) # k<-filter.rmsd(rmsd.mat=k$rmsd.mat, cutoff=2.0) if(is.null(rmsd.mat)) { if(is.null(xyz)) stop("Must provide either a 'xyz' matrix or RMSD matrix 'rmsd.mat'") if(is.list(xyz)) xyz=xyz$xyz if(is.null(inds)) { gaps <- gap.inspect(xyz) inds <- gaps$f.inds } rmsd.mat <- rmsd( xyz, a.inds=inds, fit=fit, ... ) } r.d <- as.dist(rmsd.mat) tree <- hclust(r.d, method=method) h <- cutoff n <- nrow(tree$merge) + 1 k <- integer(length(h)) k <- n + 1 - apply(outer(c(tree$height, Inf), h, ">"),2, which.max) if(verbose) cat("filter.rmsd(): N clusters @ cutoff = ", k, "\n") #ans <- as.vector(.Call("R_cutree", tree$merge, k, PACKAGE = "stats")) ans <- as.vector(cutree(tree, k)) cluster.rep <- NULL for(i in 1:k) { ind <- which(ans==i) if (length(ind) == 1) { cluster.rep <- c(cluster.rep, ind) } else { cluster.rep <- c(cluster.rep, ind[ which.min( colSums(rmsd.mat[ind,ind]) ) ]) } } return(list(ind=cluster.rep, tree=tree, rmsd.mat=rmsd.mat)) } bio3d/R/atom.select.pdbs.R0000644000176200001440000000446414046015221014746 0ustar liggesusersatom.select.pdbs <- function(pdbs, string = NULL, resno = NULL, chain = NULL, resid = NULL, operator="AND", inverse = FALSE, value = FALSE, verbose=FALSE, ...) { ## verbose message output if(verbose) cat("\n") .verboseout <- function(M, type) { cat(" .. ", sprintf("%08s", length(which(M))), " atom(s) from '", type, "' selection \n", sep="") } ## combine logical vectors .combinelv <- function(L, M, operator) { if(operator=="AND") M <- L & M if(operator=="OR") M <- L | M return(M) } cl <- match.call() if(operator=="AND") M <- rep(TRUE, ncol(pdbs$ali)) if(operator=="OR") M <- rep(FALSE, nrow(pdbs$ali)) if(!is.null(string)) { gaps <- gap.inspect(pdbs$ali) M <- switch(string, all = M <- rep(TRUE, ncol(pdbs$ali)), gap = apply(pdbs$ali, 2, function(x) any(x %in% "-")), gaps = apply(pdbs$ali, 2, function(x) any(x %in% "-")), nongap = !apply(pdbs$ali, 2, function(x) any(x %in% "-")), allgap = apply(pdbs$ali, 2, function(x) all(x %in% "-")) ) if(verbose) { .verboseout(M, 'string') } } if(!is.null(resno)) { L <- apply(pdbs$resno, 2, function(x) any(x %in% resno)) if(verbose) .verboseout(L, 'resno') M <- .combinelv(L, M, operator) } if(!is.null(chain)) { L <- apply(pdbs$chain, 2, function(x) any(x %in% chain)) if(verbose) .verboseout(L, 'chain') M <- .combinelv(L, M, operator) } if(!is.null(resid)) { L <- apply(pdbs$resid, 2, function(x) any(x %in% resid)) if(verbose) .verboseout(L, 'resid') M <- .combinelv(L, M, operator) } if(inverse) { if(verbose) { cat(" ..", sprintf("%08s", length(which(!M))), "atom(s) in inversed selection \n") } sele <- as.select(which(!M)) } else sele <- as.select(which(M)) sele$call <- cl if(verbose) cat("\n") if(value) return(trim(pdbs, col.inds=sele$atom)) else return(sele) } bio3d/R/summary.cna.R0000644000176200001440000000322014046015221014023 0ustar liggesuserssummary.cna <- function(object, verbose=TRUE, ...) { ## summary.cna(net) ## y <- summary.cna(net, file="tmp.tbl", col.names=FALSE, append=T) ## or just write 'y' to file! if( !"cna" %in% class(object) ) { stop("Input should be a cna network object") } size <- table(object$communities$membership) id <- names(size) memb <- sapply(id, function(i) { which(object$communities$membership==i) } ) ## NOTE: Perhaps the memb should be names() of which inds ## rather than the inds themselves as it is curently? ##memb <- sapply(id, function(i) { names(which(object$membership==i)) } ) ##- Format as condensed vector for printing if( is.numeric(unlist(memb)) ) { members <- rep(NA, length(id)) for(i in 1:length(id)) { b <- bounds(memb[[i]])[,c("start","end"),drop=FALSE] single.member <- NULL for(a in 1:dim(b)[1]){ if(b[a,1] != b[a,2]){ single.member[a] <- paste0(b[a,1], ":", b[a,2]) } else{ single.member[a] <- b[a,1] } } if(length(single.member)>1){ members[i] <- paste0("c(", paste0(single.member, collapse=", "), ")") } else{ members[i] <- single.member } } } else{ ##- non numeric vectors can not be condensed members <- unlist(lapply(memb, paste, collapse=", ")) } ## Output silently as a list tbl <- data.frame( id=as.numeric(id), size=as.numeric(size), members=members, stringsAsFactors=FALSE ) y <- list("id"=id, "size"=size, "members"=memb, "tbl"=tbl) if(verbose) { print.data.frame(tbl, row.names=FALSE) } return(y) } bio3d/R/plot.cmap.R0000644000176200001440000000523714046015221013475 0ustar liggesusersplot.cmap <- function(x, col=2, pch=16, main="Contact map", sub="", xlim=NULL, ylim=NULL, xlab = "Residue index", ylab = xlab, axes=TRUE, ann=par("ann"), sse=NULL, sse.type="classic", sse.min.length=5, bot=TRUE, left=TRUE, helix.col="gray20", sheet.col="gray80", sse.border=FALSE, add=FALSE, ...) { dims <- dim(x) if(is.null(xlim)) xlim <- c(1, dims[1]) if(is.null(ylim)) ylim <- c(1, dims[2]) if(!add) { plot.new() } else { axes <- FALSE xlab <- NA; ylab <- NA; main <- NA; sub <- NA; sse <- NULL; } plot.window(xlim=xlim, ylim=ylim, ...) inds <- which(x==1, arr.ind=TRUE) points(inds, pch=pch, col=col) if(!is.null(sse)) { ## Obtain SSE vector from PDB input 'sse' if(is.pdb(sse)) sse$sse <- pdb2sse(sse) h <- bounds( which(sse$sse == "H") ) e <- bounds( which(sse$sse == "E") ) ## Remove short h and e elements that can crowd plots if(length(h) > 0) { inds <- which(h[,"length"]>=sse.min.length) h <- h[inds,,drop=FALSE] } else { h <- NULL } if(length(e) > 0) { inds <- which(e[,"length"]>=sse.min.length) e <- e[inds,,drop=FALSE] } else { e <- NULL } if(sse.type != "classic") warning("Only sse.type='classic' is currently available, 'fancy' coming soon") off <- c(0.006, 0.039) if(left) { ## Determine bottom and top of margin region bo <- min(xlim) - (diff(xlim)*off[1]) to <- min(xlim) - (diff(xlim)*off[2]) if(length(h) > 0) rect(xleft=bo, xright=to, ybottom=h[,"start"], ytop=h[,"end"], col=helix.col, border=sse.border) if(length(e) > 0) rect(xleft=bo, xright=to, ybottom=e[,"start"], ytop=e[,"end"], col=sheet.col, border=sse.border) } if(bot){ to <- min(ylim) - (diff(ylim)*off[1]) bo <- min(ylim) - (diff(ylim)*off[2]) if(length(h) > 0) rect(xleft=h[,"start"], xright=h[,"end"], ybottom=bo, ytop=to, col=helix.col, border=sse.border) if(length(e) > 0) rect(xleft=e[,"start"], xright=e[,"end"], ybottom=bo, ytop=to, col=sheet.col, border=sse.border) } } if(axes) { box() at <- axTicks(1); at[1] = 1 axis(1, at) axis(2, at) } if(ann) { # if(is.null(xlab)) xlab=xy$xlab # if(is.null(ylab)) ylab=xy$ylab title(main=main, sub=sub, xlab=xlab, ylab=ylab, ...) } } bio3d/R/inspect.connectivity.R0000644000176200001440000000215314046015221015754 0ustar liggesusers## Useful for checking the connectivity in a pdb(s) object "inspect.connectivity" <- function(pdbs, cut=4.) { xyz <- NULL; ids <- NULL; if(inherits(pdbs, "pdbs")) { xyz <- pdbs$xyz n <- length(pdbs$id) ids <- pdbs$id } else if(is.pdb(pdbs)) { ca.inds <- atom.select(pdbs, 'calpha', verbose=FALSE) xyz <- as.xyz(pdbs$xyz)[1, ca.inds$xyz, drop=FALSE] n <- 1 } else if(inherits(pdbs, "xyz")) { xyz <- pdbs n <- nrow(xyz) } else { stop("Please provide coordinates as a \n 'pdbs', 'pdb', or xyz matrix format") } if(length(xyz)<6) { warning("Insufficient C-alpha atoms in structure to determine connectivity") return(FALSE) } is.connected <- function(xyz) { xyz <- matrix(xyz[!is.na(xyz)], ncol=3, byrow=T) for(i in 1:(nrow(xyz)-1)) { d <- sqrt((xyz[i,1]-xyz[i+1,1])**2 + (xyz[i,2]-xyz[i+1,2])**2 + (xyz[i,3]-xyz[i+1,3])**2 ) if(d>cut) return(FALSE) } return(TRUE) } cons <- rep(NA, length=n) for(i in 1:n) { cons[i] <- is.connected(xyz[i,]) } names(cons) <- ids return(cons) } bio3d/R/mktrj.R0000644000176200001440000000005614046015221012721 0ustar liggesusers"mktrj" <- function(...) UseMethod("mktrj") bio3d/R/print.sse.R0000644000176200001440000000340014046015221013513 0ustar liggesusers"print.sse" <- function(x, ...) { cn <- class(x) cat("\n") cat("Call:\n ", paste(deparse(x$call), sep = "\n", collapse = "\n"), "\n\n", sep = "") cat("Class:\n ", cn, "\n\n", sep = "") cat("Helices: ", length(x$helix$start), "") if(length(x$helix$start)>0) { j <- 0 for(i in 1:length(x$helix$start)) { if(j%%5==0) cat("\n ") tmpout <- paste(x$helix$start[i], "-", x$helix$end[i], " (", x$helix$chain[i], ")", sep="") cat(format(tmpout, justify="right", width=15)) j <- j+1 } } cat("\n\n") cat("Sheets: ", length(x$sheet$start), "") if(length(x$sheet$start)>0) { j <- 0 for(i in 1:length(x$sheet$start)) { if(j%%5==0) cat("\n ") tmpout <- paste(x$sheet$start[i], "-", x$sheet$end[i], " (", x$sheet$chain[i], ")", sep="") cat(format(tmpout, justify="right", width=15)) j <- j+1 } } cat("\n\n") cat("Turns: ", length(x$turn$start), "") if(length(x$turn$start)>0) { j <- 0 for(i in 1:length(x$turn$start)) { if(j%%5==0) cat("\n ") tmpout <- paste(x$turn$start[i], "-", x$turn$end[i], " (", x$turn$chain[i], ")", sep="") cat(format(tmpout, justify="right", width=15)) j <- j+1 } } cat("\n\n") if(is.null(x$call$resno)) resno <- TRUE else if(x$call$resno=="T" || x$call$resno=="TRUE") resno <- TRUE else resno <- FALSE if(resno) cat("Output is provided in residue numbers") else cat("Output is provided in residue (sequential) identifiers") cat("\n\n") invisible(x) } bio3d/R/mask.dccm.R0000644000176200001440000000216614046015221013436 0ustar liggesusersmask <- function(...) UseMethod("mask") mask.dccm <- function(dccm, pdb=NULL, a.inds=NULL, b.inds=NULL, ...) { x <- dccm dims <- dim(x) if(is.null(a.inds)) stop("'a.inds' must be provided") if(is.null(b.inds)) b.inds <- 1:nrow(dccm) if(!is.null(pdb)) { if(!is.pdb(pdb)) stop("If provided, 'pdb' must be a pdb object as obtained from 'read.pdb'") if(nrow(pdb$atom) != dims[1]) stop("If provided, 'pdb' must match the dimensions of 'x'") if(!all(pdb$atom$elety == "CA")) warning("Non all-CA pdb detected. Ensure that provided 'pdb' match 'x'") if(is.select(a.inds)) a.inds = a.inds$atom if(is.select(b.inds)) b.inds = b.inds$atom } else { if(is.select(a.inds) | is.select(b.inds)) stop("a.inds/b.inds should only be a 'select' object(s) when 'pdb' is provided") } if(!is.null(a.inds)) { tmp <- x tmp[ a.inds, b.inds ] = 666 tmp[ b.inds, a.inds ] = 666 inds.rm <- which(tmp != 666) x[inds.rm] = 0 } return(x) } bio3d/R/arg_filter.R0000644000176200001440000000253014046015221013707 0ustar liggesusers.arg.filter <- function(new.args, FUN=NULL, ...) { ##-- Simple list filtering for duplicate ## function input argument removal and validation. ## ## new.args = The new default args that can be overwritten ## by those in 'dots' (i.e. user supplied "...") ## E.G. "new.args=list(col=mydefualtcol, lwd=3)" ## ## FUN = Function name from which allowed arguments are checked ## and used to limit output of this function. ## This is typically only required if there are multiple ## (sub)functions to be called each with other specific ## things in /dots. ## E.G. allowed=names(formals( mysubfunction2call )) ## ## dots = Full user supplied updated values typically ## this is the extra /dots values, i.e. list(...) ## ## sse.default <- list(coil="gray", helix="purple", sheet="yellow") ## sse.args <- arg.filter( sse.default, FUN=sse.vector ) ## col <- do.call('sse.vector', c(list(pdb=pdb), sse.args) ) ## ## Returns entries of 'dots' updated with those in 'new.args' ## that intersect with allowed FUN input args. dots <- list(...) ans <- c(dots, new.args[!names(new.args) %in% names(dots)]) if(!is.null(FUN)) { ans <- ans[names(ans) %in% names(formals(FUN))] } return(ans) } bio3d/R/pdbfit.R0000644000176200001440000000224214046015221013041 0ustar liggesuserspdbfit <- function(...) UseMethod("pdbfit") pdbfit.pdb <- function(pdb, inds=NULL, ...) { if(!is.pdb(pdb)) stop("Input 'pdb' should be of class 'pdb', e.g. from read.pdb()") if(nrow(pdb$xyz)<2) stop("nothing to fit. < 2 frames in pdb object") if(is.null(inds)) { inds <- atom.select(pdb, "calpha") cat(" no indices provided. using all", length(inds$atom), "calpha atoms\n") } if(length(inds$xyz)<3) stop("insufficent atoms to superimpose") return(fit.xyz( fixed=pdb$xyz[1,], mobile=pdb$xyz, fixed.inds=inds$xyz, mobile.inds=inds$xyz)) } pdbfit.pdbs <- function(pdbs, inds=NULL, outpath=NULL, ...) { ## ## Quick Fit Fitter for PDBs ## was called 'fit.pdbs()' in model.R ## if(!inherits(pdbs, "pdbs")) { stop("Input 'pdbs' should be of class 'pdbs', e.g. from pdbaln() or read.fasta.pdb()") } full <- ifelse(is.null(outpath), FALSE, TRUE) if(is.null(inds)) { inds <-gap.inspect(pdbs$xyz)$f.inds } if(is.list(inds)){ inds=inds$xyz } invisible( fit.xyz( fixed=pdbs$xyz[1,], mobile=pdbs, fixed.inds=inds, mobile.inds=inds, outpath=outpath, full.pdbs=full, ... )) } bio3d/R/rmsip.R0000644000176200001440000000576114046015221012734 0ustar liggesusersrmsip <- function(...) UseMethod("rmsip") rmsip.enma <- function(enma, ncore=NULL, subset=10, ...) { if(!inherits(enma, "enma")) stop("provide a 'enma' object as obtain from function 'nma.pdbs()'") if(any(is.na(enma$fluctuations))) stop("provide 'enma' object calculated with argument 'rm.gaps=TRUE'") ncore <- setup.ncore(ncore, bigmem = FALSE) if(ncore>1) mylapply <- mclapply else mylapply <- lapply dims <- dim(enma$fluctuations) m <- dims[1] mat <- matrix(NA, m, m) ##inds <- pairwise(m) inds <- rbind(pairwise(m), matrix(rep(1:m,each=2), ncol=2, byrow=T)) mylist <- mylapply(1:nrow(inds), function(row) { i <- inds[row,1]; j <- inds[row,2]; r <- rmsip.default(enma$U.subspace[,,i], enma$U.subspace[,,j], subset=subset) out <- list(val=r$rmsip, i=i, j=j) cat(".") return(out) }) for ( i in 1:length(mylist)) { tmp <- mylist[[i]] mat[tmp$i, tmp$j] <- tmp$val } mat[ inds[,c(2,1)] ] = mat[ inds ] ##diag(mat) <- rep(1, n) colnames(mat) <- basename(rownames(enma$fluctuations)) rownames(mat) <- basename(rownames(enma$fluctuations)) cat("\n") return(round(mat, 6)) } rmsip.default <- function(modes.a, modes.b, subset = 10, row.name="a", col.name="b", ...) { if(missing(modes.a)) stop("rmsip: 'modes.a' must be prodivded") if(missing(modes.b)) stop("rmsip: 'modes.b' must be prodivded") m1 <- .fetchmodes(modes.a, subset=subset) m2 <- .fetchmodes(modes.b, subset=subset) dims.a <- dim(m1$U) dims.b <- dim(m2$U) subset <- dims.a[2] if( dims.a[1] != dims.b[1] ) stop("dimension mismatch") if( dims.a[2] != dims.b[2] ) stop("dimension mismatch") mass.a <- NULL; mass.b <- NULL; x <- normalize.vector(m1$U, mass.b) y <- normalize.vector(m2$U, mass.b) if(is.null(mass.a)) o <- ( t(x) %*% y ) **2 else o <- t(apply(x, 2, inner.prod, y, mass.a) **2) if (!is.null(row.name)) { rownames(o) <- paste(row.name, c(1:subset), sep="") } if (!is.null(col.name)) { colnames(o) <- paste(col.name, c(1:subset), sep="") } rmsip <- sqrt(sum(o)/subset) out <- list(overlap=round(o,3), rmsip=rmsip) class(out) <- "rmsip" return( out ) } .fetchmodes <- function(x, subset=NULL) { if (inherits(x, "pca")) { U <- x$U; L <- x$L; first.mode <- 1 } else if (inherits(x, "nma")) { U <- x$U; L <- x$L; mass <- x$mass first.mode <- x$triv.modes+1 } else { if( !(inherits(x, "matrix") | inherits(x, "pca.loadings")) ) stop("provide an object of type 'pca', 'nma', or 'matrix'") U <- x; L <- NULL; first.mode <- 1 } dims <- dim(U) if(is.null(subset)) { n <- dims[2] } else { n <- subset + first.mode - 1 if(n>dims[2]) n <- dims[2] } U <- U[, first.mode:n, drop=FALSE] L <- L[first.mode:n] out <- list(U=U, L=L, mass=NULL) return(out) } bio3d/R/rle2.R0000644000176200001440000000146414046015221012442 0ustar liggesusersrle2 <- function (x) { ## This is a modified version of base function "rle()" if (!is.vector(x) && !is.list(x)) stop("'x' must be an atomic vector") n <- length(x) if (n == 0L) return(structure(list(lengths = integer(), values = x, inds=integer), class = "rle2")) y <- x[-1L] != x[-n] i <- c(which(y | is.na(y)), n) structure(list(lengths = diff(c(0L, i)), values = x[i], inds=i), class = "rle2") } print.rle2 <- function(x, digits = getOption("digits"), prefix = "", ...) { if (is.null(digits)) digits <- getOption("digits") cat("", "Run Length Encoding\n", " lengths:", sep = prefix) utils::str(x$lengths) cat("", " values :", sep = prefix) utils::str(x$values, digits.d = digits) cat("", " indices:", sep = prefix) utils::str(x$inds, digits.d = digits) invisible(x) } bio3d/R/cmap.R0000644000176200001440000000705314046015221012516 0ustar liggesuserscmap <- function(...) UseMethod("cmap") cmap.default <- function(...) return(cmap.xyz(...)) cmap.xyz <- function(xyz, grpby=NULL, dcut=4, scut=3, pcut=1, binary=TRUE, mask.lower = TRUE, collapse=TRUE, gc.first = FALSE, ncore=1, nseg.scale=1, ...) { # Parallelized by parallel package (Mon Apr 22 16:32:19 EDT 2013) ncore <- setup.ncore(ncore, bigmem = TRUE) if(ncore > 1) { # Issue of serialization problem # Maximal number of cells of a double-precision matrix # that each core can serialize: (2^31-1-61)/8 R_NCELL_LIMIT_CORE = 2.68435448e8 R_NCELL_LIMIT = ncore * R_NCELL_LIMIT_CORE if(nseg.scale < 1) { warning("nseg.scale should be 1 or a larger integer\n") nseg.scale=1 } } if (!(is.numeric(pcut) && pcut >= 0 && pcut <= 1)) { stop("Input 'pcut' should a number between 0 and 1") } xyz=as.xyz(xyz) nxyz =nrow(xyz) if(nrow(xyz)>1) { pb <- txtProgressBar(min=0, max=nrow(xyz), style=3) if(is.null(grpby)) { nres <- ncol(xyz)/3 } else { inds <- bounds(grpby, dup.inds = TRUE) nres <- nrow(inds) } if(ncore > 1) { ## shared memory to follow progress bar iipb <- bigmemory::big.matrix(1, nrow(xyz), init=NA) ni = nrow(xyz) RLIMIT = floor(R_NCELL_LIMIT/(0.5*nres*(nres+1))) nDataSeg = floor((ni-1)/RLIMIT)+1 nDataSeg = floor(nDataSeg * nseg.scale) lenSeg = floor(ni/nDataSeg) cmap.list <- NULL for(i in 1:nDataSeg) { istart = (i-1)*lenSeg + 1 iend = if(i= pcut ) cont.map <- matrix(NA, nrow=nres, ncol=nres) cont.map[!lower.tri(cont.map)] <- cmap.t if(!mask.lower) cont.map[lower.tri(cont.map)] <- t(cont.map)[lower.tri(cont.map)] } else { cont.map <- array(NA, dim=c(nres, nres, nxyz)) cmap.t <- matrix(NA, nres, nres) for(i in 1:nxyz) { cmap.t[!lower.tri(cmap.t)] <- cmap.list[[i]] if(!mask.lower) cmap.t[lower.tri(cmap.t)] <- t(cmap.t)[lower.tri(cmap.t)] cont.map[,,i] <- cmap.t } rm(cmap.list) if(gc.first) gc() } rm(cmap.t) if(gc.first) gc() close(pb) } else { ## Distance matrix (all-atom) dmat <- dm.xyz( xyz, grpby, scut, mask.lower = mask.lower, ncore=ncore) ## Contact map return(matrix(as.numeric(dmat < dcut), ncol = ncol(dmat), nrow = nrow(dmat))) } return (cont.map) } bio3d/R/filter.dccm.R0000644000176200001440000001434114046015221013766 0ustar liggesusersfilter.dccm <- function(x, cutoff.cij = NULL, cmap = NULL, xyz = NULL, fac = NULL, cutoff.sims = NULL, collapse = TRUE, extra.filter = NULL, ...) { # check cij format cij <- x if("all.dccm" %in% names(cij)) { cij <- cij$all.dccm } else if(is.list(cij)) { cij <- array(unlist(cij), dim = c(dim(cij[[1]]), length(cij))) } else if(is.matrix(cij)) { cij <- array(cij, dim = c(dim(cij), 1)) } else if(!is.array(cij)) { stop("Input x should be an array/list containing correlation matrices") } ## Check input is built of simmetric matrices if (dim(cij)[1] != dim(cij)[2]) { stop("Input 'x' should contain symmetric matrices.") } ## Check xyz and set cmap if(is.null(cmap)) { if(is.null(xyz)) cmap = FALSE else cmap = TRUE } ## Check dimension if cmap is matrix if(is.matrix(cmap) && !all.equal(dim(cmap), dim(cij)[1L:2L])) stop("Input 'cmap' does not match x") ## Check cutoff.cij if(is.null(cutoff.cij)) { cutoff.cij <- .cij.cutoff.guess(cij, p = 0.95) } ## Inspect cij values with respect to cutoff.cij and contact map if(is.matrix(cmap) || isTRUE(cmap)) { # check factor vector for multiple networks construction if(!is.null(fac)) { if(!is.factor(fac)) fac = as.factor(fac) } else { fac = factor(rep("a", dim(cij)[3L])) } # check for calculating cmap if(isTRUE(cmap)) { if(is.null(xyz)) stop("xyz coordinates or a 'pdbs' object must be provided for contact map calculation") cmap.args <- list(...) if(inherits(xyz, "pdbs")) { gaps.pos <- gap.inspect(xyz$xyz) xyz <- xyz$xyz[, gaps.pos$f.inds] cmap.default <- list(dcut=10.0) cmap.args <- .arg.filter(cmap.default, cmap.xyz, ...) } if(nrow(xyz) != dim(cij)[3L] && nlevels(fac) > 1) stop(paste("Input 'xyz' doesn't match 'x'", "\tSet fac=NULL for single network construction", sep='\n')) } # convert cij to upper.tri matrix for internal use pcij <- apply(cij, 3, function(x) x[upper.tri(x)]) ncij <- tapply(1:dim(cij)[3L], fac, function(i) { # contact map if(isTRUE(cmap)) { if(nlevels(fac) > 1) cm <- do.call("cmap.xyz", c(list(xyz=xyz[i, ]), cmap.args)) else cm <- do.call("cmap.xyz", c(list(xyz=xyz), cmap.args)) } else { cm <- cmap } cm[is.na(cm)] <- 0 cij.min = apply(abs(pcij[, i, drop=FALSE]), 1, min) cij.max = apply(abs(pcij[, i, drop=FALSE]), 1, max) filter <- (cij.min >= cutoff.cij) | (cij.max >= cutoff.cij & cm[upper.tri(cm)]==1) if(!is.null(extra.filter)) filter <- filter * extra.filter[upper.tri(extra.filter)] ncij <- array(NA, dim=c(dim(cij[,,1]), length(i))) for(j in 1:dim(ncij)[3L]) { tcij <- cij[,,i[j]] tcij[upper.tri(tcij)] <- pcij[, i[j]] * filter tcij[lower.tri(tcij)] <- t(tcij)[lower.tri(tcij)] ncij[,,j] <- tcij } # if(length(i) == 1) ncij <- ncij[,,1] return(ncij) } ) if(collapse) ncij <- lapply(ncij, rowMeans, dims = 2) if(nlevels(fac)==1) ncij <- ncij[[1]] if(is.matrix(ncij)) class(ncij) = c("dccm", "matrix") if(is.list(ncij)) { ncij <- lapply(ncij, function(x) { class(x) <- c("dccm", "matrix") x }) } return(ncij) } else { # Filter cijs with cutoff.sims and return mean dccm (dccm.mean()) if(is.null(cutoff.sims)) cutoff.sims = dim(cij)[3L] if (cutoff.sims > dim(cij)[3L] || cutoff.sims < 0) { stop("The cutoff.sims should be a number between 0 and N, where N is the the number of simulations in the input matrix") } ## Filter by cutoff.cij and sum across simulations cut.cij.inds <- (abs(cij) < cutoff.cij) count <- array(NA, dim = dim(cij)) count[!cut.cij.inds] = 1 cij.sum <- apply(count, c(1:2), sum, na.rm = TRUE) ## Mask cij values below cutoff and average across simulations cij[cut.cij.inds] = NA cij.ave <- apply(cij, c(1:2), mean, na.rm = TRUE) ## Mask average values if below cutoff.sims cut.sims.inds <- (cij.sum < cutoff.sims) cij.ave[cut.sims.inds] = 0 ## Could use NA here if(!is.null(extra.filter)) cij.ave <- cij.ave * extra.filter class(cij.ave) = c("dccm", "matrix") return(cij.ave) } } # Estimate cij.cutoff as quantile Pr(cij<=cij.cutoff) = p .cij.cutoff.guess <- function(cij, p = NULL, cmap = NULL, collapse = TRUE, collapse.method=c('max', 'median', 'mean')) { collapse.method <- match.arg(collapse.method) if(is.null(p)) p = seq(0.900, 0.995, 0.005) cijs <- cij if("all.dccm" %in% names(cijs)) cijs <- cijs$all.dccm if(is.array(cijs)) { if(length(dim(cijs))==3) cijs <- do.call("c", apply(cijs, 3, list)) else cijs <- list(cijs) } if(!is.list(cijs)) stop("cijs should be matrix, array(dim=3), or list") if(!is.null(cmap)) { cijs <- lapply(cijs, function(x) x*cmap) } # return quantile Pr(cij <= cij.cutoff) = p out <- sapply(cijs, function(x) quantile(abs(x[upper.tri(x)]), probs = p)) out <- matrix(out, ncol=length(cijs)) c0 <- seq(0, 1, 0.05) if(collapse) { out <- switch(collapse.method, 'mean' = # sapply(rowMeans(out), function(x) c0[which.min(abs(x-c0))]) , sapply(rowMeans(out), function(x) c0[sum(x>=c0)]), 'median' = sapply(apply(out, 1, median), function(x) c0[sum(x>=c0)]), # sapply(apply(out, 1, median), function(x) c0[which.min(abs(x-c0))]), 'max' = sapply(apply(out, 1, max), function(x) c0[sum(x>=c0)]) # sapply(apply(out, 1, max), function(x) c0[which.min(abs(x-c0))]) ) names(out) <- paste("Cutoff (p=", round(p, digits=3), ")", sep="") } else { dimnames(out) <- list(paste("Cutoff (p=", round(p, digits=3), ")", sep=""), paste("Matrix", 1:length(cijs))) } return(out) } bio3d/R/binding.site.R0000644000176200001440000001030514046015221014145 0ustar liggesusers"binding.site" <- function(a, b = NULL, a.inds = NULL, b.inds = NULL, cutoff=5, hydrogens=TRUE, byres=TRUE, verbose=FALSE) { cl <- match.call() sep <- "_" trim <- function(s, leading=TRUE, trailing=TRUE) { if(leading) s <- sub("^ +", "", s) if(trailing) s <- sub(" +$", "", s) s[(s=="")]<-"" s } if (!is.pdb(a)) stop("must supply an input 'pdb' object 'a', i.e. from 'read.pdb'") ## workaround for NA chains if(any(is.na(a$atom$chain))) a$atom$chain[is.na(a$atom$chain)] <- " " ## backup of the original pdb provided a.orig <- a ## two PDBs provided if(!is.null(b)) { if(!is.pdb(b)) stop("'b' should be a 'pdb' object as obtained from 'read.pdb'") if ( hydrogens ) { if(is.null(a.inds)) a.inds <- atom.select(a, "all", verbose=verbose) if(is.null(b.inds)) b.inds <- atom.select(b, "all", verbose=verbose) } else { if(is.null(a.inds)) a.inds <- atom.select(a, string='noh', verbose=verbose) if(is.null(b.inds)) b.inds <- atom.select(b, string='noh', verbose=verbose) } } ## one PDB object is provided else { if(is.null(a.inds) & is.null(b.inds)) { a.inds <- atom.select(a, "protein", verbose=verbose) b.inds <- atom.select(a, "ligand", verbose=verbose) if(!length(a.inds$atom)>0) stop("insufficent 'protein' atoms in structure") if(!length(b.inds$atom)>0) stop("insufficent 'ligand' atoms in structure") } b <- trim.pdb(a, b.inds) a <- trim.pdb(a, a.inds) if ( hydrogens ) { a.inds <- atom.select(a, "all", verbose=verbose) b.inds <- atom.select(b, "all", verbose=verbose) } else { a.inds <- atom.select(a, string='noh', verbose=verbose) b.inds <- atom.select(b, string='noh', verbose=verbose) } } if(!(length(a.inds$atom)>0 | length(b.inds$atom)>0)) stop("insufficent atoms in selection(s)") ## omit hydrogens if any a <- trim.pdb(a, a.inds) b <- trim.pdb(b, b.inds) ## Calcuate pair-wise distances dmat <- dist.xyz(matrix(a$xyz, ncol=3, byrow=TRUE), matrix(b$xyz, ncol=3, byrow=TRUE)) ## atoms of a in contact with b cmap <- apply(dmat, 1, function(x) any(x <= cutoff)) atom.inds <- which(cmap) ## return NULL if no atoms are closer than cutoff if(length(atom.inds)<1) { cat(" no atoms found within", cutoff, "A\n") return(NULL) } ## get rid of any trailing and leading spaces a$atom$resid <- trim(a$atom$resid) a$atom$resno <- trim(a$atom$resno) a$atom$elety <- trim(a$atom$elety) a.orig$atom$resno <- trim(a.orig$atom$resno) a.orig$atom$elety <- trim(a.orig$atom$elety) ## return all atoms in a contacting residue, otherwise, just the atoms if(byres) { resno.map <- apply(a$atom[atom.inds, c("resno", "chain")], 1, paste, collapse=sep) all.resno <- apply(a.orig$atom[, c("resno", "chain")], 1, paste, collapse=sep) atom.inds2 <- which(all.resno %in% resno.map) } else { resno.map <- apply(a$atom[atom.inds, c("elety", "resno", "chain")], 1, paste, collapse=sep) all.resno <- apply(a.orig$atom[, c("elety", "resno", "chain")], 1, paste, collapse=sep) atom.inds2 <- which(all.resno %in% resno.map) } xyz.inds <- atom2xyz(atom.inds2) ## check for chain IDs tmp <- unique(paste(a$atom[atom.inds, "resid"], a$atom[atom.inds, "resno"], a$atom[atom.inds, "chain"], sep=sep)) resno <- as.numeric(unlist(lapply(strsplit(tmp, sep), function(x) x[2]))) chain <- unlist(lapply(strsplit(tmp, sep), function(x) x[3])) chain[chain==" "] <- NA if(all(is.na(chain))) { resnames <- unique(paste(a$atom[atom.inds, "resid"], " ", a$atom[atom.inds, "resno"], sep="")) } else { resnames <- unique(paste(a$atom[atom.inds, "resid"], " ", a$atom[atom.inds, "resno"], " (", a$atom[atom.inds, "chain"], ")", sep="")) } sele <- list(atom=atom.inds2, xyz=xyz.inds) class(sele) <- "select" out <- list(inds=sele, resnames=resnames, resno=resno, chain=chain, call=cl) return(out) } bio3d/R/pdbaln.R0000644000176200001440000000767614046015221013051 0ustar liggesuserspdbaln <- function(files, fit=FALSE, pqr=FALSE, ncore=1, nseg.scale=1, progress=NULL, ...) { ## Log the call cl <- match.call() ##- Quick and dirty alignment of pdb sequences ## pdbs <- pdbaln(files) ## ## ## 'files' should be a character vector of input PDB file names ## '...' extra arguments for seqaln ## ## Improvements to include 'atom.select' arguments (chain ## spliting etc), formalisation of 'pdb.list' into a specific ## bio3d object of multiple structures like 'pdbs'. ## ## pdb.list[[1]]$atom[1:3,] # Parallelized by parallel package (Fri Apr 26 19:24:18 EDT 2013) ncore <- setup.ncore(ncore) if(ncore > 1) { # Issue of serialization problem # Maximal number of cells of a double-precision matrix # that each core can serialize: (2^31-1-61)/8 R_NCELL_LIMIT_CORE = 2.68435448e8 R_NCELL_LIMIT = ncore * R_NCELL_LIMIT_CORE if(nseg.scale < 1) { warning("nseg.scale should be 1 or a larger integer\n") nseg.scale=1 } } if(!is.list(files)) { ## Check if input PDB files exist localy or online toread.local <- file.exists(files) toread.online <- (substr(files,1,4)=="http") toread.id <- rep(FALSE, length(files)) toread <- as.logical(toread.local + toread.online) ## Check for 4 letter code and possible online file if(any(!toread)) { toread.id <- ((nchar(files)==4) + (!toread) == 2) files[toread.id] <- get.pdb(files[toread.id], URLonly=TRUE) cat(" Note: Accessing online PDB files using 4 letter PDBID\n") } ## Exit if we still have missing files missing <- !as.logical(toread + toread.id) if(any(missing)) { stop(paste(" ** Missing files: check filenames\n", paste( files[c(missing)], collapse="\n"),"\n",sep="") ) } ## Avoid multi-thread downloading if(any(toread.online | toread.id)) { ncore = 1 # options(cores = ncore) } cat("Reading PDB files:",files, sep="\n") pdb.list <- mclapply(1:length(files), function(i) { if(pqr) { pdb <- read.pqr(files[i]) } else { pdb <- read.pdb(files[i]) } cat(".") ## edit for shiny version if(!is.null(progress)) { progress$inc(1/length(files)/2) } ## edit end return( pdb ) } , mc.cores = ncore) } else { if(!all(sapply(files, is.pdb))) stop("'files' must be a vector of file names, or a list of pdb objects") pdb.list <- files #ids <- sapply(files, function(x) x$call$file) #print(ids) } cat("\n\nExtracting sequences\n") s <- mclapply(pdb.list, pdbseq, mc.cores=ncore) ## check for NULL in pdbseq output ## (this would indicate no amino acid sequence in PDB) tmpcheck <- unlist(lapply(s, is.null)) if(any(tmpcheck)) { if(!is.list(files)) { err <- paste( "Could not align PDBs due to missing amino acid sequence in files:\n ", paste(files[tmpcheck], collapse=", ") ) } else { err <- paste( "Could not align PDBs due to missing amino acid sequence in PDB:\n ", paste(tmpcheck, collapse=", ") ) } stop(err) } s <- t(sapply(s, `[`, 1:max(sapply(s, length)))) s[is.na(s)] <- "-" if(!is.list(files)) { s <- seqaln(s, id=files, ...) files <- NULL } else { id <- unlist(lapply(files, function(x) { if(!is.null(x$call$file)) x$call$file else NA })) if(!is.character(id)) id <- rep(NA, length(id)) nams <- paste("seq", 1:length(id), sep="") id[is.na(id)] <- nams[is.na(id)] if(any(duplicated(id))) id <- NULL s <- seqaln(s, id=id, ...) } cat("\n") ## added progress argument for shiny version s <- read.fasta.pdb(s, prefix = "", pdbext = "", pdblist=files, ncore=ncore, nseg.scale=nseg.scale, progress=progress) ## edit end s$call=cl if(fit) s$xyz <- pdbfit(s) return(s) } bio3d/R/read.crd.charmm.R0000644000176200001440000000306414046015221014524 0ustar liggesusers"read.crd.charmm" <- function(file, ext=TRUE, verbose = TRUE, ...) { split.string <- function(x) { x <- substring(x, first, last) x[nchar(x) == 0] <- as.character(NA) x } trim <- function(s) { s <- sub("^ +", "", s) s <- sub(" +$", "", s) s[(s == "")] <- NA s } if(ext) atom.format <- c(10, 10, 8, 8, -4, 20,20,20, -1, 8, -1, 8, 20) else atom.format <- c(5, 5, 4, 5, -1, 10,10,10, -1, 4, -1, 4, 10) atom.names <- c("eleno", "resno", "resid", "elety", "blank", "x", "y", "z", "blank", "segid", "blank", "resno2", "b") widths <- abs(atom.format) drop.ind <- (atom.format < 0) st <- c(1, 1 + cumsum(widths)) first <- st[-length(st)][!drop.ind] last <- cumsum(widths)[!drop.ind] raw.lines <- readLines(file) head.ind <- which(substr(raw.lines,1,1)=="*") head.ind <- c(head.ind, (head.ind[length(head.ind)]+1) ) if(length(head.ind)>0) { raw.lines <- raw.lines[-head.ind] if(verbose) cat(raw.lines[head.ind],sep="\n") } atom <- matrix(trim(sapply(raw.lines, split.string)), byrow = TRUE, ncol = length(atom.format[!drop.ind]), dimnames = list(NULL, atom.names[!drop.ind]) ) output <- list(atom = atom, xyz = as.numeric(t(atom[, c("x", "y", "z")])), calpha = as.logical(atom[, "elety"] == "CA")) class(output) <- c("charmm", "crd") return(output) } bio3d/R/atom.select.prmtop.R0000644000176200001440000000051014046015221015323 0ustar liggesusers"atom.select.prmtop" <- function(prmtop, ...) { if(!inherits(prmtop, "prmtop")) stop("provide a PRMTOP object as obtained from read.prmtop()") cl <- match.call() tmp.pdb <- as.pdb.prmtop(prmtop, crd=as.numeric(rep(NA, prmtop$POINTERS[1]*3))) sele <- atom.select.pdb(tmp.pdb, ...) sele$call <- cl return(sele) } bio3d/R/store.atom.R0000644000176200001440000000376414046015221013676 0ustar liggesusers"store.atom" <- function(pdb=NULL) { atom.names <- c("N", "CA", "C", "O", "CB", "*G", "*G1", "*G2", "*D", "*D1", "*D2", "*E", "*E1", "*E2", "*E3", "*Z", "*Z1", "*Z2", "*Z3", "*H", "*H1", "*H2") ## atom.greek <- c("N", "CA", "C", "O", "CB", "G", "G1", "G2", "D", "D1", "D2", "E", "E1", "E2", "E3", "Z", "Z1", "Z2", "Z3", "H", "H1", "H2") if(is.null(pdb)) return(atom.names) colpaste <- function(x, col.names = colnames(x)) { apply(x, 1, function(row) paste(row[col.names], collapse = ".")) } getinds <- function(atoms, ref = atom.names) { sort(atom2xyz(charmatch(atoms, ref))) } repadd <- function(num, nrep = nres, toadd = nxyz) { c(num, rep(num, (nrep - 1)) + rep(cumsum(rep(toadd, (nrep - 1))), each = length(num))) } atom.data <- colpaste(pdb$atom, c("elety", "resno", "insert", "chain")) atom.list <- matrix(unlist(strsplit(atom.data, "\\.")), ncol = 4, byrow = TRUE) res.data <- colpaste(pdb$atom, c("resno", "insert", "chain")) res.list <- unique(res.data) coords <- NULL # Changed for PDB format v3.3 # blank <- matrix(NA, nrow = 13, ncol = length(atom.names)) blank <- matrix(NA, nrow = ncol(pdb$atom), ncol = length(atom.names)) for (i in 1:length(res.list)) { res.blank <- blank res.ind <- which(res.list[i] == res.data) blank.ind <- charmatch(atom.list[res.ind, 1], atom.names, nomatch = 0) + charmatch(substr(atom.list[res.ind,1], 2, 4), atom.greek, nomatch = 0) res.blank[, blank.ind[blank.ind != 0]] <- t( pdb$atom[(res.ind[blank.ind != 0]),] ) coords <- cbind(coords, res.blank) } natm <- length(atom.names) # PDB format v3.3 nxyz <- ncol(pdb$atom) * natm # nxyz <- 13 * natm nres <- length(coords)/(nxyz) dim(coords) <- c(ncol(pdb$atom), natm, nres) # dim(coords) <- c(13, natm, nres) dimnames(coords) = list(atom = colnames(pdb$atom), type = atom.names, res = res.list) return(coords) } bio3d/R/print.cna.R0000644000176200001440000000147414046015221013473 0ustar liggesusersprint.cna <- function(x, ...) { ## Check for presence of igraph package oops <- requireNamespace("igraph", quietly = TRUE) if (!oops) { stop("igraph package missing: Please install, see: ?install.packages") } ## y <- summary.cna(x, ...) l1 <- paste( "\n - NETWORK NODES#: ", x$communities$vcount, "\tEDGES#:", igraph::ecount(x$network)) l2 <- paste( "\n - COMMUNITY NODES#:", max(x$communities$membership), "\tEDGES#:", igraph::ecount(x$community.network)) cat("\nCall:\n ", paste(deparse(x$call), sep = "\n", collapse = "\n"), "\n", sep = "") cat("\nStructure:",l1,l2,"\n\n ") i <- paste( attributes(x)$names, collapse=", ") cat(strwrap(paste(" + attr:",i,"\n"),width=60, exdent=8), sep="\n") #print.igraph(x$network) #print.igraph(x$community.network) } bio3d/R/rmsd.R0000644000176200001440000001402014046015221012533 0ustar liggesusers"rmsd" <- function(a, b=NULL, a.inds=NULL, b.inds=NULL, fit=FALSE, ncore=1, nseg.scale=1) { # Calculate the RMSD between all rows of 'a' or between # the single structure 'a' and the one or more structures # contained in 'b' # Parallelized by parallel package -Wed Dec 12 11:15:20 EST 2012 # nseg.scale - to resolve the memory problem of using multicore ncore <- setup.ncore(ncore) if(ncore > 1) { # Issue of serialization problem # Maximal number of cells of a double-precision matrix # that each core can serialize: (2^31-1-61)/8 R_NCELL_LIMIT_CORE = 2.68435448e8 R_NCELL_LIMIT = ncore * R_NCELL_LIMIT_CORE if(nseg.scale < 1) { warning("nseg.scale should be 1 or a larger integer\n") nseg.scale=1 } } ## from 'select' object to indices if(is.select(a.inds)) a.inds <- a.inds$xyz if(is.select(b.inds)) b.inds <- b.inds$xyz ## function to fetch xyz and ids from input getxyz <- function(x) { xyz <- NULL; ids <- NULL; if(is.pdbs(x)) { ids <- basename.pdb(as.character(x$id)) xyz <- x$xyz } if(is.pdb(x)) { xyz <- x$xyz if(!is.null(rownames(xyz))) ids <- rownames(xyz) } if(is.matrix(x) | is.vector(x)) { xyz <- x if(!is.null(rownames(xyz))) ids <- basename.pdb(as.character(rownames(xyz))) } return(list(xyz=xyz, ids=ids)) } ## set xyz and ids for a ax <- getxyz(a) a=ax$xyz; ids <- ax$ids; ## set xyz and ids for a if(!is.null(b)) { bx <- getxyz(b) b=bx$xyz; ids <- bx$ids; } if( is.null(a.inds) && is.null(b.inds) ) { a.inds <- gap.inspect(a)$f.inds if(!is.null(b)) { a.inds <- intersect(a.inds, gap.inspect(b)$f.inds) } b.inds <- a.inds if(length(a.inds) != length(a)) { warning(paste("No indices provided, using the", length(a.inds)/3, "non NA positions\n")) } } if (is.null(a.inds)) a.inds <- gap.inspect(a)$f.inds if (is.null(b.inds) && !is.null(b)) b.inds <- gap.inspect(b)$f.inds if(is.vector(a) || nrow(a)==1) { if(is.null(b)) { stop("No comparison can be made, input was only a single vector 'a'") } } else { if(is.null(b)) { # Pair Wise Matrix 'a' if( any(is.na(a[,a.inds])) ) { stop("error: NA elements present in selected set") } nseq=nrow(a) inds=pairwise(nseq) ni <- nrow(inds) if(ncore > 1){ # Parallelized RLIMIT = R_NCELL_LIMIT nDataSeg = floor((ni-1)/RLIMIT)+1 nDataSeg = floor(nDataSeg * nseg.scale) lenSeg = floor(ni/nDataSeg) s = vector("list", nDataSeg) for(i in 1:nDataSeg) { istart = (i-1)*lenSeg + 1 iend = if(i 1)) { if (length(a.inds) != length(b.inds)) { stop("dimension mismatch: a[a.inds] and b[,b.inds] should be the same length") } if( any(is.na(a[a.inds])) || any(is.na(b[,b.inds])) ) { stop("error: NA elements present in selected set") } if(fit) { # Parallelized / single version b <- fit.xyz(fixed=a, mobile=b, fixed.inds=a.inds, mobile.inds=b.inds, ncore=ncore, nseg.scale=nseg.scale) } if(ncore > 1){ # Parallelized RLIMIT = R_NCELL_LIMIT nDataSeg = floor((nrow(b)-1)/RLIMIT)+1 nDataSeg = floor(nDataSeg * nseg.scale) lenSeg = floor(nrow(b)/nDataSeg) irmsd = vector("list", nDataSeg) for(i in 1:nDataSeg) { istart = (i-1)*lenSeg + 1 iend = if(i1) warning(paste("Alignment with multiple sequences detected. Using only the first sequence")) seq <- as.vector(seq[1,!is.gap(seq[1,])]) } else seq <- as.vector(seq[!is.gap(seq)]) return(paste(seq, collapse="")) } alnToStr <- function(seq) { if(!inherits(seq, "fasta")) stop("seq must be of type 'fasta'") tmpfile <- tempfile() write.fasta(seq, file=tmpfile) rawlines <- paste(readLines(tmpfile), collapse="\n") unlink(tmpfile) return(rawlines) } types.allowed <- c("phmmer", "hmmscan", "hmmsearch", "jackhmmer") if(! type%in%types.allowed ) stop(paste("Input type should be either of:", paste(types.allowed, collapse=", "))) ## PHMMER (protein sequence vs protein sequence database) ## seq is a sequence if(type=="phmmer") { seq <- seqToStr(seq) if(is.null(db)) db="pdb" db.allowed <- c("env_nr", "nr", "refseq", "pdb", "rp15", "rp35", "rp55", "rp75", "swissprot", "unimes", "uniprotkb", "uniprotrefprot", "pfamseq") db <- tolower(db) if(!db%in%db.allowed) stop(paste("db must be either:", paste(db.allowed, collapse=", "))) seqdb <- db hmmdb <- NULL iter <- NULL rcurl <- TRUE } ## HMMSCAN (protein sequence vs profile-HMM database) ## seq is a sequence if(type=="hmmscan") { seq <- seqToStr(seq) if(is.null(db)) db="pfam" db.allowed <- tolower(c("pfam", "gene3d", "superfamily", "tigrfam")) db <- tolower(db) if(!db%in%db.allowed) stop(paste("db must be either:", paste(db.allowed, collapse=", "))) seqdb <- NULL hmmdb <- db iter <- NULL rcurl <- TRUE } ## HMMSEARCH (protein alignment/profile-HMM vs protein sequence database) ## seq is an alignment if(type=="hmmsearch") { if(!inherits(seq, "fasta")) stop("please provide 'seq' as a 'fasta' object") ##alnfile <- tempfile() ##seq <- write.fasta(seq, file=alnfile) seq <- alnToStr(seq) if(is.null(db)) db="pdb" db.allowed <- tolower(c("pdb", "swissprot")) db <- tolower(db) if(!db%in%db.allowed) stop(paste("db must be either:", paste(db.allowed, collapse=", "))) seqdb <- db hmmdb <- NULL iter <- NULL rcurl <- TRUE } ## JACKHMMER (iterative search vs protein sequence database) ## seq can be sequence, HMM, or multiple sequence alignment ## HMM not implemented here yet if(type=="jackhmmer") { if(!inherits(seq, "fasta")) stop("please provide 'seq' as a 'fasta' object") ##alnfile <- tempfile() ##seq <- write.fasta(seq, file=alnfile) seq <- alnToStr(seq) if(is.null(db)) db="pdb" db.allowed <- tolower(c("pdb", "swissprot")) db.allowed <- c("env_nr", "nr", "refseq", "pdb", "rp15", "rp35", "rp55", "rp75", "swissprot", "unimes", "uniprotkb", "uniprotrefprot", "pfamseq") db <- tolower(db) if(!db%in%db.allowed) stop(paste("db must be either:", paste(db.allowed, collapse=", "))) seqdb <- db hmmdb <- NULL iter <- NULL rcurl <- TRUE } ## Make the request to the HMMER website ##url <- paste('http://hmmer.janelia.org/search/', type, sep="") url <- paste("https://www.ebi.ac.uk/Tools/hmmer/search/", type, sep="") curl.opts <- list(httpheader = "Expect:", httpheader = "Accept:text/xml", verbose = verbose, followlocation = TRUE ) hmm <- RCurl::postForm(url, hmmdb=hmmdb, seqdb=seqdb, seq=seq, style = "POST", .opts = curl.opts, .contentEncodeFun=RCurl::curlPercentEncode, .checkParams=TRUE ) ## check results from the server if(!grepl("results", hmm)) { if(verbose) { message("Content from HMMER server:") message(" ", hmm) } stop("Request to HMMER server failed") } add.pdbs <- function(x, ...) { hit <- XML::xpathSApply(x, '@*') pdbs <- unique(XML::xpathSApply(x, 'pdbs', XML::xmlToList)) new <- as.matrix(hit, ncol=1) if(length(pdbs) > 1) { for(i in 1:length(pdbs)) { hit["acc"]=pdbs[i] new=cbind(new, hit) } colnames(new)=NULL } return(new) } ##fetch.pdbs <- function(x) { ## unique(XML::xpathSApply(x, 'pdbs', XML::xmlToList)) ##} ## workaround for 'act_site' tags that can not be parsed ## XML Parsing Error: not well-formed, e.g. for 1h1h_A ## type = hmmscan and pdb = pfam if(grepl("act_site", hmm)) { lines <- unlist(strsplit(hmm, "\n")) actsite.inds <- grep("act_site", lines) actlen <- length(actsite.inds) if(actlen>2) { if(actlen%%2 != 0) { stop("Bad XML format") } rm.inds <- NULL for(i in seq(1, actlen, 2)) { rm.inds <- c(rm.inds, seq(actsite.inds[i], actsite.inds[i+1])) } hmm <- paste(lines[-rm.inds], collapse="\n") } else { hmm <- paste(lines[-seq(actsite.inds[1], actsite.inds[2])], collapse="\n") } } xml <- XML::xmlParse(hmm) resurl <- XML::xpathSApply(xml, '//data', XML::xpathSApply, '@*') resurl <- paste0("http://www.ebi.ac.uk/Tools/hmmer/results/", resurl["uuid", 1]) data <- XML::xpathSApply(xml, '///hits', XML::xpathSApply, '@*') pdb.ids <- NULL if(db=="pdb") { tmp <- XML::xpathSApply(xml, '///hits', add.pdbs) data <- as.data.frame(tmp, stringsAsFactors=FALSE) colnames(data) <- NULL } data <- as.data.frame(t(data), stringsAsFactors=FALSE) data <- data[!duplicated(data$acc), ] ##rownames(data) <- data[, "acc"] ## convert to numeric fieldsToNumeric <- c("evalue", "pvalue", "score", "archScore", "ndom", "nincluded", "niseqs", "nregions", "nreported", "bias", "dcl", "hindex") inds <- which(names(data) %in% fieldsToNumeric) for(i in 1:length(inds)) { tryCatch({ data[[inds[i]]] = as.numeric(data[[inds[i]]]) }, warning = function(w) { #print(w) return(data[[inds[i]]]) }, error = function(e) { #print(e) return(data[[inds[i]]]) } ) } data$pdb.id <- data$acc data$bitscore <- data$score data$mlog.evalue <- -log(data$evalue) data$mlog.evalue[is.infinite(data$mlog.evalue)] <- -log(.Machine$double.xmin) out <- list(hit.tbl = data, url = resurl) ##class(data) <- c("hmmer", type, "data.frame") class(out) <- c("hmmer", type) return(out) } bio3d/R/print.fasta.R0000644000176200001440000001147614046015221014033 0ustar liggesusersprint.fasta <- function(x, alignment=TRUE, ...) { if ( (inherits(x, "fasta") | inherits(x, "pdbs")) ){ id <- x$id ali <- as.matrix(x$ali) call <- paste(deparse(x$call), sep = "\n", collapse = "\n") } else { ali <- as.matrix(x) id <- rownames(ali) call <- NA } if(inherits(x, "pdbs")) row.desc <- "structures" else row.desc <- "sequences" cn <- class(x) nstruct <- length(id) dims <- dim(ali) gaps <- gap.inspect(ali) dims.nongap <- dim(ali[, gaps$f.inds, drop=FALSE]) dims.gap <- dim(ali[, gaps$t.inds, drop=FALSE]) if(alignment) .print.fasta.ali(ali, id=id, ...) #width=width, #col.inds=col.inds, numbers=numbers) else cat("\n") if(!is.na(call)) { cat("Call:\n ", call, "\n\n", sep = "") cat("Class:\n ", paste(cn, collapse=", "), "\n\n", sep = "") } ##cat("Number of ", row.desc, ":\n ", nstruct, ## "\n\n", sep="") cat("Alignment dimensions:\n ", dims[1L], " sequence rows; ", dims[2L], " position columns", " (", dims.nongap[2L], " non-gap, ", dims.gap[2L], " gap) ", "\n", sep="") cat("\n") ## Attribute summary j <- paste(attributes(x)$names, collapse = ", ") cat(strwrap(paste(" + attr:",j,"\n"),width=60, exdent=8), sep="\n") } .print.fasta.ali <- function(x, ##limit.out=NULL, width=NULL, col.inds=NULL, numbers=TRUE, conservation=TRUE, ...) { ##-- Print sequence alignment in a nice formated way ## source("print.aln.R") ## x<-read.fasta("poo.fa") ## print.aln(x) ## ## file <- system.file("examples/kif1a.fa",package="bio3d") ## aln <- read.fasta(file) ## print.aln(aln, width=40) ## print.aln(aln, width=60) ## print.aln(aln, col=c(10,12,14,22,90:100), numbers=F) ## ToDo: ## Does not work if alignment contains only one position (one seq?) ## y=x; y$ali=x$ali[,1] if ( (inherits(x, "fasta") | inherits(x, "pdbs")) ){ id <- x$id ali <- as.matrix(x$ali) } else { ali <- as.matrix(x) id <- rownames(x) } ## remove any NA values ali[is.na(ali)] <- "-" ##- Trim to 'col.inds' if provided if(!is.null(col.inds)) { ali <- ali[,col.inds, drop=FALSE] } if(nrow(ali)<2) conservation <- FALSE ##- conservation cons <- NULL if(conservation) { tmp1 <- conserv(ali, method="entropy10") tmp2 <- conserv(ali, method="identity") cons <- rep(" ", ncol(ali)) cons[ tmp1==1 ] <- "^" cons[ tmp2==1 ] <- "*" } ## Check and truncate possilbe long ids if(any(nchar(id) > 20)) { id <- basename(id) if(any(nchar(id) > 17)) { id <- substr(id,1,10) } id <-paste0("[Truncated_Name:", 1:length(id),"]",id) } ##- Format sequence identifiers ids.nchar <- max(nchar(id))+3 ## with a gap of 3 spaces btwn id and sequence ids.format <- paste0("%-",ids.nchar,"s") ids <- sprintf(ids.format, id) ## Format for annotation printing (see below) pad.format <- paste0("%+",(ids.nchar+1),"s") ## Format for conservation annotation printing (see below) pad.format2 <- paste0("%+",(ids.nchar),"s") ##- Scale 'width' of output if not specified in input call tput.col <- 85 ## typical terminal width from system("tput cols") if(is.null(width)) { width <- tput.col - ids.nchar - 4 } ## Make sure we end on a 10 block width <- floor(width/10)*10 ##- Work out sequence block widths nseq <- length(ids) nres <- ncol(ali) block.start <- seq(1, nres, by=width) if(nres < width) { block.end <- nres } else { block.end <- unique(c( seq(width, nres, by=width), nres)) } nblocks <- length(block.start) block.annot <- rep(" ", width) block.annot[ c(1,seq(10, width, by=10)) ] = "." blocks <- matrix(NA, ncol=nblocks, nrow=nseq) for(i in 1:nblocks) { ##- Sequence block positions <- block.start[i]:block.end[i] blocks[,i] <- paste0(ids, apply(ali[, positions, drop=FALSE], 1, paste, collapse="")) ##-- Formated Printing of annotations (numbers & ticks) and sequence blocks if(numbers) { ##- Annotations for each sequence block annot = block.annot[1:length(positions)] annot[length(annot)] = block.end[i] annot[1] = sprintf(pad.format, block.start[i]) cat(paste(annot, collapse=""),"\n") } ##- Sequence block cat(blocks[,i], sep="\n") ##- Formated Printing of conservation (stars for conserved columns) if(conservation) { annot2 <- c("", cons[positions]) annot2[1] = sprintf(pad.format2, "") cat(paste(annot2, collapse=""),"\n") } ##- Ticks + numbers again if(numbers) { cat(paste(annot, collapse=""),"\n\n") } else{ cat("\n") } } ##invisible(blocks) ## Can be useful for plot.fasta() later!! } bio3d/R/trim.mol2.R0000644000176200001440000000366514046015221013426 0ustar liggesuserstrim.mol2 <- function(mol, ..., inds=NULL) { if(!is.mol2(mol)) stop("input should be of class 'mol2' as obtained by 'read.mol2'") cl <- match.call() extra.args <- list(...) if(length(extra.args)>0) { if(!is.null(inds)) warning("Multiple atom selection terms provided. Using only argument 'inds'") else if(is.select(extra.args[[1]])) ## to be back-compatible with the habit calling trim.pdb(pdb, inds) inds = extra.args[[1]] else inds = atom.select(mol, ...) } if(is.null(inds)) stop("no selection indices provided") if(!is.list(inds)) stop("selection indices must be provided i.e. from 'atom.select'") if(is.null(inds$atom) || is.null(inds$xyz)) stop("selection indices must be provided i.e. from 'atom.select'") new <- mol rownames(new$atom) <- new$atom$eleno new$atom <- new$atom[inds$atom,,drop=FALSE] new$atom$eleno <- 1:nrow(new$atom) new$bond <- mol$bond[inds$bond, ] xyz <- as.xyz(mol$xyz) new$xyz <- as.xyz(mol$xyz[, inds$xyz, drop=FALSE]) new$info[1] <- nrow(new$atom) new$info[2] <- nrow(new$bond) new$info[3] <- length(unique(new$atom$resid)) new$bond$origin = new$atom[ as.character(new$bond$origin), "eleno" ] new$bond$target = new$atom[ as.character(new$bond$target), "eleno" ] ## substrucutre if(!is.null(mol$substructure)) { new$substructure <- mol$substructure[ mol$substructure$root_atom %in% mol$atom$eleno[ inds$atom], ] if(nrow(new$substructure) > 0) { new$substructure$root_atom <- new$atom[ as.character(new$substructure$root_atom), "eleno" ] new$substructure$id <- 1:nrow(new$substructure) } } ## new ids and rownames new$bond$id <- 1:nrow(new$bond) rownames(new$bond) <- 1:nrow(new$bond) rownames(new$atom) <- 1:nrow(new$atom) return(new) } bio3d/R/check.utility.R0000644000176200001440000000174114046015221014353 0ustar liggesuserscheck.utility <- function(x = c("muscle", "clustalo", "dssp", "stride", "mustang", "makeup"), quiet = TRUE) { utilities <- match.arg(x, several.ok = TRUE) ##- Check on missing utility programs if('dssp' %in% utilities) { utilities <- c(utilities, 'mkdssp') missing.util <- nchar(Sys.which(utilities)) == 0 missing.util['dssp'] <- all(missing.util[c('dssp', 'mkdssp')]) missing.util <- missing.util[-length(missing.util)] } else { missing.util <- nchar(Sys.which(utilities)) == 0 } if( any(missing.util) ) { if(!quiet) { warning(paste0(" Checking for external utility programs failed\n", " Please make sure '", paste(names(missing.util[missing.util]), collapse="', '"), "' is in your search path, see:\n", " http://thegrantlab.org/bio3d/tutorials/installing-bio3d#utilities")) } pass = FALSE } else { if(!quiet) cat("External utility programs found\n") pass = TRUE } invisible(pass) } bio3d/R/normalize.vector.R0000644000176200001440000000062314046015221015073 0ustar liggesusers"normalize.vector" <- function(x, mass=NULL) { x <- as.matrix(x); dx <- dim(x); if(dx[2]==1) x <- as.numeric(x) if(!is.null(mass)) { if (dx[1] != (length(mass)*3)) stop("normalize.vector: incorrect length of mass") } if(is.matrix(x)) return(t( t(x) / sqrt(inner.prod(x,x,mass)))) else return(x / sqrt(inner.prod(x,x,mass))) } bio3d/R/cna.dccm.R0000644000176200001440000001773614046015221013255 0ustar liggesuserscna.dccm <- function(cij, cutoff.cij=0.4, cm=NULL, vnames=colnames(cij), cluster.method="btwn", collapse.method="max", cols=vmd_colors(), minus.log=TRUE, ...){ ## Check for presence of igraph package oops <- requireNamespace("igraph", quietly = TRUE) if (!oops) { stop("igraph package missing: Please install, see: ?install.packages") } if (dim(cij)[1] != dim(cij)[2]) { stop("Input 'cij' should be a square matrix as obtained from the 'dccm()' function") } ## Check vnames/colnames if present. These are used to name nodes if( is.null( vnames ) ) { vnames <- 1:ncol(cij) } if( length(vnames) != ncol(cij) ) { stop("Length of input 'vnames' and number of cols in input 'cij' do not match") } colnames(cij) <- vnames ## Check 'cm' contact map if present. if(!is.null(cm)){ if (dim(cm)[1] != dim(cm)[2]) { stop("Input 'cm' should be a square contact matrix as obtained from the 'cmap()' function") } if (any(range(cm, na.rm=T) != c(0,1))) { stop("Input 'cm' should be a binary contact matrix as obtained from the 'cmap()' function") } if (dim(cm)[1] != dim(cij)[1]) { stop("Inputs 'cij' and 'cm' should have the same dimensions") } # convert NAs to 0 cm[is.na(cm)] = 0 } ##-- Functions for later cluster.network <- function(network, cluster.method="btwn", ...){ ## Passing arguments to different community detection functions btwn.names <- names(formals( igraph::edge.betweenness.community )) walk.names <- names(formals( igraph::walktrap.community )) greed.names <- names(formals( igraph::fastgreedy.community )) infomap.names <- names(formals( igraph::infomap.community )) dots <- list(...) btwn.args <- dots[names(dots) %in% btwn.names] walk.args <- dots[names(dots) %in% walk.names] greed.args <- dots[names(dots) %in% greed.names] infomap.args <- dots[names(dots) %in% infomap.names] btwn.args$directed <- FALSE ## Function to define community clusters from network, ## cluster methods can be one of of 'cluster.options' cluster.options=c("btwn", "walk", "greed", "infomap") cluster.method <- match.arg(tolower(cluster.method), cluster.options) comms <- switch( cluster.method, btwn = do.call(igraph::edge.betweenness.community, c(list(network), btwn.args)), walk = do.call(igraph::walktrap.community, c(list(network), walk.args)), greed = do.call(igraph::fastgreedy.community, c(list(network), greed.args)), infomap = do.call(igraph::infomap.community, c(list(network), infomap.args)) ) names(comms$membership) <- igraph::V(network)$name return(comms) } contract.matrix <- function(cij.network, membership,## membership=comms$membership, collapse.method="max", minus.log=minus.log){ ## Changed from minus.log=TRUE ## Function to collapse a NxN matrix to an mxm matrix ## where m is the communities of N. The collapse method ## can be one of the 'collapse.options' below ## convert to the original cij values if "-log" was used if(minus.log){ cij.network[cij.network>0] <- exp(-cij.network[cij.network>0]) } collapse.options=c("max", "median", "mean", "trimmed") collapse.method <- match.arg(tolower(collapse.method), collapse.options) ## Fill a 'collapse.cij' nxn community by community matrix node.num <- max(membership) if(node.num > 1){ collapse.cij <- matrix(0, nrow=node.num, ncol=node.num) inds <- pairwise(node.num) for(i in 1:nrow(inds)) { comms.1.inds <- which(membership==inds[i,1]) comms.2.inds <- which(membership==inds[i,2]) submatrix <- cij.network[comms.1.inds, comms.2.inds] ## Use specified "collapse.method" to define community couplings collapse.cij[ inds[i,1], inds[i,2] ] = switch(collapse.method, max = max(submatrix), median = median(submatrix), mean = mean(submatrix), trimmed = mean(submatrix, trim = 0.1)) } if(minus.log){ collapse.cij[collapse.cij>0] <- -log(collapse.cij[collapse.cij>0]) } ## Copy values to lower triangle of matrix and set colnames collapse.cij[ inds[,c(2,1)] ] = collapse.cij[ inds ] colnames(collapse.cij) <- 1:ncol(collapse.cij) } else{ warning("There is only one community in the $communities object. $community.cij object will be set to 0 in the contract.matrix() function.") collapse.cij <- 0 } class(collapse.cij) <- c("dccm", "matrix") return(collapse.cij) } ## Store the command used to submit the calculation cl <- match.call() ##- Take absolute value of 'cij' cij.abs <- abs(cij) ## Filter: set to 0 all values below the cutoff cij.abs[cij.abs < cutoff.cij] = 0 if(minus.log){ ##-- Calculate the -log of cij ## change cij >= 0.9999 to 0.9999 to avoid numerical problems ## (-log is too close to zero) cij.network <- cij.abs cij.network[cij.network >= 0.9999] = 0.9999 cij.network <- -log(cij.network) ## remove infinite values cij.network[is.infinite(cij.network)] = 0 } else{ cij.network <- cij.abs } if(!is.null(cm)){ ##-- Filter cij by contact map cij.network <- cij.network * cm } ## cij.network contains either the -log(abs.cij) or just abs.cij. ## (the default is minus.log=TRUE) ##-- Make an igraph network object network <- igraph::graph.adjacency(cij.network, mode="undirected", weighted=TRUE, diag=FALSE) ##-- Calculate the first set of communities communities <- cluster.network(network, cluster.method, ...) ##-- Coarse grain the cij matrix to a new cluster/community matrix community.cij <- contract.matrix(cij.network, communities$membership, collapse.method, minus.log) ##-- Generate a coarse grained network --## if(sum(community.cij)>0){ community.network <- igraph::graph.adjacency(community.cij, mode="undirected", weighted=TRUE, diag=FALSE) ##-- Cluster the community network to obtain super-communities -- OLD VERSION ## clustered.communities <- cluster.network(community.network, cluster.method) ##-- Annotate the two networks with community information ## Check for duplicated colors if(max(communities$membership) > length(unique(cols)) ) { warning("The number of communities is larger than the number of unique 'colors' provided as input. Colors will be recycled") } ## Set node colors igraph::V(network)$color <- cols[communities$membership] igraph::V(community.network)$color <- cols[ 1:max(communities$membership)] ## Set node sizes igraph::V(network)$size <- 1 igraph::V(community.network)$size <- table(communities$membership) } else{ warning("The $communities structure does not allow a second clustering (i.e. the collapsed community.cij matrix contains only 0). 'community.network' object will be set to NA") community.network <- NA clustered.communities <- NA if(max(communities$membership) > length(unique(cols)) ) { warning("The number of communities is larger than the number of unique 'colors' provided as input. Colors will be recycled") } ## Set node colors igraph::V(network)$color <- cols[communities$membership] ## Set node sizes igraph::V(network)$size <- 1 } ## Output output <- list("network"=network, "communities"=communities, "community.network"=community.network, "community.cij"=community.cij, "cij"=cij.network, call = cl) class(output)="cna" return(output) } bio3d/R/mustang.R0000644000176200001440000000446314046015221013256 0ustar liggesusers"mustang" <- function(files, exefile="mustang", outfile="aln.mustang.fa", cleanpdb=FALSE, cleandir="mustangpdbs", verbose=TRUE) { ## Check if the program is executable os1 <- .Platform$OS.type status <- system(paste(exefile, "--version"), ignore.stderr = TRUE, ignore.stdout = TRUE) if(!(status %in% c(0,1))) stop(paste("Launching external program failed\n", " make sure '", exefile, "' is in your search path", sep="")) if(!all(file.exists(files))) stop(paste("Missing files:", paste(files[ !file.exists(files) ], collapse=", "))) ## produce cleaned CA pdb files for mustang if(cleanpdb) { if(!file.exists(cleandir)) dir.create(cleandir) newfiles <- c() for(i in 1:length(files)) { tmpout <- paste(cleandir, basename(files[i]), sep="/") pdb <- read.pdb(files[i]) sele <- atom.select(pdb, "calpha", verbose=verbose) new <- trim.pdb(pdb, sele) seq1 <- aa321(new$atom$resid) seq3 <- aa123(seq1) new$atom$type <- "ATOM" new$atom$resid <- seq3 write.pdb(new, file=tmpout) newfiles <- c(newfiles, tmpout) } files <- newfiles } infile <- tempfile() tmpout <- tempfile() dirn <- unique(dirname(files)) if(length(dirn)>1) stop("All files must be in one directory") files <- basename(files) rawlines <- NULL rawlines <- c(rawlines, paste(">", dirn)) for ( i in 1:length(files) ) rawlines <- c(rawlines, paste("+", files[i], sep="")) write.table(rawlines, file=infile, quote=FALSE, row.names=FALSE, col.names=FALSE) cmd <- paste(exefile, "-f", infile, "-o", tmpout, "-F fasta") if(verbose) cat("Running command\n", cmd, "\n") if (os1 == "windows") success <- shell(shQuote(cmd), ignore.stderr = !verbose, ignore.stdout = !verbose) else success <- system(cmd, ignore.stderr = !verbose, ignore.stdout = !verbose) if(success!=0) stop(paste("An error occurred while running command\n '", exefile, "'", sep="")) aln <- read.fasta(paste(tmpout, ".afasta", sep="")) rownames(aln$ali) <- paste(dirn, rownames(aln$ali), sep="/") aln$id <- rownames(aln$ali) unlink(infile); unlink(tmpout); if(!is.null(outfile)) write.fasta(aln, file=outfile) return(aln) } bio3d/R/cna.ensmb.R0000644000176200001440000000101414046015221013431 0ustar liggesusers# ensemble CNA calculation optimized with multicore cna.ensmb <- function(cij, ..., ncore = NULL) { ncore <- setup.ncore(ncore) cijs <- cij if("all.dccm" %in% names(cijs)) cijs <- cijs$all.dccm if(is.array(cijs) && length(dim(cijs))==3) cijs <- do.call("c", apply(cijs, 3, list)) if(is.list(cijs)) { net <- mclapply(cijs, cna.dccm, ...) class(net) <- c("ecna", class(net)) } else { warning("cijs should be matrix, array(dim=3), or list") net <- NULL } return(net) } bio3d/R/lbio3d.R0000644000176200001440000000006114046015221012742 0ustar liggesusers"lbio3d" <- function () { ls("package:bio3d") } bio3d/R/pca.tor.R0000644000176200001440000000045414046015221013142 0ustar liggesusers"pca.tor" <- function(data, ... ) { data[data < 0] <- data[data < 0] + 360 data[data < -180] <- data[data < -180] + 360 data[data > 180] <- data[data > 180] - 360 ##cat("Rescaled (-180 to 180) and corrected for periodicity\n") data <- wrap.tor(data) return( pca.xyz(data, ...) ) } bio3d/R/combine.select.R0000644000176200001440000000245114046015221014465 0ustar liggesuserscombine.select <- function(sel1=NULL, sel2=NULL, ..., operator="AND", verbose=TRUE) { cl <- match.call() sels <- list(sel1, sel2, ...) if(any(sapply(sels, function(x) !is.null(x) && !inherits(x, "select")))) stop("Invalid atom select(s)") rm.inds = sapply(sels, is.null) sels = sels[!rm.inds] if(length(sels) == 0) return(NULL) else if(length(sels) == 1) return(sels[[1]]) op.tbl <- c(rep("AND",3), rep("OR",4), rep("NOT",4)) operator <- op.tbl[match(operator, c("AND","and","&","OR","or","|","+","NOT","not","!","-"))] # Print message if(verbose) { msg <- switch(operator, AND = " Intersect of selects", OR = " Union of selects", NOT = " Select 2 (, 3, ...) is subtracted from select 1", stop("Unknown operation") ) cat(msg, "\n", sep="") } sel <- sels[[1]]$atom for(i in 2:length(sels)) { sel <- switch(operator, "AND" = intersect(sel, sels[[i]]$atom), "OR" = sort(union(sel, sels[[i]]$atom)), "NOT" = setdiff(sel, sels[[i]]$atom), stop("Unknown operation") ) } sel <- list(atom = sel, xyz = atom2xyz(sel), call=cl) if(verbose) { cat(paste(" * Selected a total of:", length(sel$atom), "atoms *\n")) } class(sel) = "select" return(sel) } bio3d/R/trim.xyz.R0000644000176200001440000000054314046015221013377 0ustar liggesusers"trim.xyz" <- function(xyz, row.inds=NULL, col.inds=NULL, ...) { xyz <- as.xyz(xyz) if(is.select(row.inds)) row.inds <- row.inds$xyz if(is.select(col.inds)) col.inds <- col.inds$xyz if(!is.null(row.inds)) xyz <- xyz[row.inds, , drop=FALSE] if(!is.null(col.inds)) xyz <- xyz[, col.inds, drop=FALSE] return(as.xyz(xyz)) } bio3d/R/conserv.R0000644000176200001440000000656714046015221013266 0ustar liggesusers`conserv` <- function(x, method=c("similarity","identity","entropy22","entropy10"), sub.matrix=c("bio3d","blosum62","pam30","other"), matrix.file=NULL, normalize.matrix = TRUE) { method <- match.arg(method) sub.matrix <- match.arg(sub.matrix) ## cat(paste("Options are, method=",method,", matrix=",sub.matrix, ## ", norm=",normalize.matrix),"\n" ) if(is.list(x)) x=x$ali aa <- c("V","I","L","M", "F","W","Y", "S","T", "N","Q", "H","K","R", "D","E", "A","G", "P", "C", "-","X") composition <- table(x) unk <- composition[!names( composition ) %in% aa] if(length(unk) > 0) { warning(paste("non standard residue code:",names(unk),"mapped to X\n ")) for(i in 1:length(unk)) x[x==names(unk[i])]="X" } if(method == "entropy10") { return(entropy(x)$H.10.norm) } if(method == "entropy22") { return(entropy(x)$H.norm) } if(method == "identity") { ## Identity (exact matchs score 1) freq.aa <- apply(x,2, function(i){ i.freq <- table(i[i!="-"]) if(length(i.freq)==0) { return(0) } else { return( max(table(i[i!="-"])) ) } } ) return( freq.aa/nrow(x) ) } if(method == "similarity") { #####cat(sub.matrix) ## Pairwise matches are assigned score from a 'similarity matrix' if(sub.matrix=="other") { if(is.null(matrix.file)) stop("Missing argument: similarity requires a 'matrix.file'") mat.file <- matrix.file } else { ##mat.file <- system.file("matrices/similarity.mat", package="bio3d") mat.file <- system.file(paste("matrices/",sub.matrix,".mat",sep=""), package="bio3d") ##mat.file <- paste("matrices/",sub.matrix,".mat",sep="") } mat <- read.table(mat.file) colnames(mat)[24]="-" if(normalize.matrix) { ## Karlin Normalize o.mat <- mat n <- nrow(o.mat) for(a.ind in 1:n) { for(b.ind in 1:n) { ab <- o.mat[a.ind,b.ind] aa <- o.mat[a.ind,a.ind] bb <- o.mat[b.ind,b.ind] aabb <- aa*bb if(ab==0 && aabb==0) { mat[a.ind,b.ind] <- 0 } else { if(aabb<0) { mat[a.ind,b.ind] <- ab / -sqrt(abs(aabb)) } else { mat[a.ind,b.ind] <- ab / sqrt(aabb) } } } } } scorecol <- function(col, mat) { freq.aa <- table(col) unique.aa <- names(freq.aa) missing.aa <- unique.aa[!unique.aa %in% colnames(mat)] count <- 0; score <- 0 for(i in 1:length(unique.aa)) { aa.i <- unique.aa[i]; freq.i <- freq.aa[i] for(j in i:length(unique.aa)) { aa.j <- unique.aa[j]; freq.j <- freq.aa[j] ##sim <- mat[aa.i,aa.j] if(length(missing.aa)>0) { if(i==missing.aa || j==missing.aa) { sim <- 0 } else { sim <- mat[aa.i,aa.j] } } else { sim <- mat[aa.i,aa.j] } ## number of comparisons if(aa.i == aa.j) { ncmp <- freq.i * (freq.i - 1)/2 } else { ncmp <- freq.i * freq.j } count <- count + ncmp score <- score + (ncmp * sim) } } return(score/count) } return( apply(x, 2, scorecol, mat=mat) ) } } bio3d/R/cnapath.R0000644000176200001440000001350114046015221013207 0ustar liggesusers# Correlation network suboptimal path analysis # # Reference # Yen, J.Y. (1971) Finding the K Shortest Loopless Paths in a Network. # Management Science. 17(11):712-716. cnapath <- function(cna, from, to=NULL, k=10, collapse=TRUE, ncore=NULL, ...) { oops <- requireNamespace("igraph", quietly = TRUE) if (!oops) stop("igraph package missing: Please install, see: ?install.packages") if(!inherits(cna, "cna")) { if(is.list(cna)) { paths <- lapply(cna, cnapath, from=from, to=to, k=k, collapse=collapse, ncore=ncore, ...) class(paths) <- c("ecnapath", class(paths)) return( paths ) } stop("Input cna is not a 'cna' object") } ncore = setup.ncore(ncore) pairs <- NULL if(is.null(to)) { if(is.matrix(from)) { pairs <- apply(from, 1, function(x) list(from=x[1], to=x[2])) } else { # all other nodes as sink to <- setdiff(seq_along(igraph::V(cna$network)), from) } } if(is.null(pairs)) { from <- unique(from); to <- unique(to) for(i in 1:length(from)) for(j in 1:length(to)) pairs <- c(pairs, list(list(from=from[i], to=to[j]))) } ## Initialize progress bar pb <- .init.pb(ncore, min=0, max=k*length(pairs)) ## optimize ncore partition ncore.out <- ifelse(ncore < length(pairs), ncore, length(pairs)) ncore.in <- as.integer(floor(ncore / ncore.out)) paths <- mclapply(pairs, function(x) .cnapath.core(cna=cna, from=x$from, to=x$to, k=k, ncore=ncore.in, pb=pb, ...), mc.cores=ncore.out) rm.inds <- sapply(paths, is.null) if(sum(rm.inds) == length(paths)) { warning(paste(" No path found.\n", " Please check if the network contains isolated parts!\n\n", sep="")) paths <- NULL } else { if(collapse) { paths <- paths[!rm.inds] cls <- class(paths[[1]]) coms <- names(paths[[1]]) paths <- lapply(coms, function(x) do.call(c, lapply(paths, "[[", x)) ) names(paths) <- coms class(paths) <- cls } if(sum(rm.inds)>0) { warning(paste(" No path found for some source/sink pairs.\n", " Please check if the network contains isolated parts!\n\n", sep="")) } } ## Finish progress bar .close.pb(pb) return(paths) } .cnapath.core <- function(cna, from, to, k=1, ncore=1, pb=NULL, ...) { graph = cna$network # which path from the list is the shortest? select.shortest.path <- function(variants){ return( which.min( unlist( lapply( variants, function(x){x$dist} ) ) ) ) } # does a list contain this path? contains.path <- function(variants, variant){ return( any( unlist( lapply( variants, function(x){ isTRUE(all.equal(x$path, variant)) } ) ) ) ) } # first shortest path k0 <- suppressWarnings( igraph::get.shortest.paths(graph, from, to, output='both', ...) ) # if no shortest path found, network contains isolated parts. if(length(k0$vpath[[1]]) <= 1) { # cat(" No path found.\n", # " Please check if the network contains isolated parts!\n\n", sep="") if(!is.null(pb)) .update.pb(pb, step=k) return(NULL) } # number of currently found shortest paths kk <- 1 if(!is.null(pb)) .update.pb(pb) # All shortest paths are stored in container A in order dist = sum(igraph::E(graph)$weight[k0$epath[[1]]]) A <- list(list(path=as.integer(k0$vpath[[1]]), epath=as.integer(k0$epath[[1]]), dist=dist)) # All candidates are stored in container B B <- list() # until k shortest paths are found while(kk < k){ # take last found shortest path last.path <- A[[length(A)]] tmpB <- mclapply(1:(length(last.path$path)-1), function(i) { spurNode <- last.path$path[i] rootPath <- last.path$path[1:i] if(i==1) rootePath = NULL else rootePath = last.path$epath[1:(i-1)] # Remove edges that coincide with the next step from the spur node on # those shortest paths stored in A that share the same root path here g <- graph for(j in 1:length(A)) { if(length(A[[j]]$path) > i && isTRUE(all.equal(rootPath, A[[j]]$path[1:i]))) { nn = A[[j]]$path[i+1] ee = igraph::E(g)[igraph::'%--%'(spurNode, nn)] if(length(ee)>0) g <- igraph::delete.edges(g, ee) } } # Remove all edges that link to nodes on the root path (excluding the spur node) if(i > 1) { for(j in rootPath[-(length(rootPath))]) { ee = igraph::E(g)[from(j)] if(length(ee)>0) g <- igraph::delete.edges(g, ee) } } # Suppress warnings because some nodes are intentionally isolated spurPath <- suppressWarnings(igraph::get.shortest.paths(g, spurNode, to, output='both'), ...) if(length(spurPath$vpath[[1]]) > 1 ) { vpath = c(rootPath, as.integer(spurPath$vpath[[1]][-1])) if(!contains.path(B, vpath)) { spurPath$epath <- as.integer(igraph::E(graph, path=as.integer(spurPath$vpath[[1]]))) epath = c(rootePath, spurPath$epath) return (list(path=vpath, epath = epath, dist = sum(igraph::E(graph)$weight[epath])) ) } } NULL }, mc.cores = ncore ) tmpB <- tmpB[ !sapply(tmpB, is.null) ] B <- c(B, tmpB) if(length(B) == 0) break # find shortest candidate sp <- select.shortest.path(B) # add to A, increase kk, remove shortest path from list of B A <- c(A, B[sp]) kk <- kk + 1 B <- B[-sp] if(!is.null(pb)) .update.pb(pb) } # stopped before reaching k paths if(kk < k) { if(!is.null(pb)) .update.pb(pb, k-kk) warning("Reaching maximal number of possible paths (", kk, ")") } out <- list(path=lapply(A, "[[", "path"), epath = lapply(A, "[[", "epath"), dist = sapply(A, "[[", "dist")) class(out) <- "cnapath" return(out) } bio3d/R/aanma.R0000644000176200001440000000010714046015221012644 0ustar liggesusers#' @rdname aanma.pdb "aanma" <- function(...) { UseMethod("aanma") } bio3d/R/is.gap.R0000644000176200001440000000041214046015221012747 0ustar liggesusers`is.gap` <- function(x, gap.char=c("-",".")) { if(is.pdbs(x) || inherits(x, "fasta")) { return( colSums( matrix( as.logical(is.na(x$ali)+(x$ali %in% gap.char)), ncol=ncol(x$ali)) ) > 0 ) } else { return( as.logical( is.na(x) + (x %in% gap.char) ) ) } } bio3d/R/aa2mass.R0000644000176200001440000000576614046015221013136 0ustar liggesusers"aa2mass" <- function(pdb, inds=NULL, mass.custom=NULL, addter=TRUE, mmtk=FALSE) { if (missing(pdb)) stop("must supply 'pdb' object or vector of amino acid residue names") if(is.pdb(pdb)) { if(!is.null(inds)) { pdb <- trim.pdb(pdb, inds) } sequ <- pdb$atom[pdb$calpha,"resid"] } else { if(!is.null(inds)) warning("'inds' has no effect when 'pdb' is vector") sequ <- pdb if(any(nchar(sequ)==1)) sequ <- aa123(sequ) if(any(nchar(sequ)!=3)) stop("must supply 'pdb' object or vector of amino acid residue names") } ## Define residues masses if(mmtk) { ## MMTK (for reproduction purposes!) w <- c( 71.079018, 157.196106, 114.104059, 114.080689, 103.143407, 128.131048, 128.107678, 57.05203, 137.141527, 113.159985, 113.159985, 129.18266, 131.197384, 147.177144, 97.117044, 87.078323, 101.105312, 186.213917, 163.176449, 99.132996) aa <- c("ALA", "ARG", "ASN", "ASP", "CYS", "GLN", "GLU", "GLY", "HIS", "ILE", "LEU", "LYS", "MET", "PHE", "PRO", "SER", "THR", "TRP", "TYR", "VAL") mat <- data.frame(aa3=aa, aa1=aa321(aa), mass=w, formula=NA, name=NA) rownames(mat) <- aa } else { ## Read data matrix mat <- bio3d::aa.table } ## Data frame with column names: aa3, aa1, mass, formula, name if (!is.null(mass.custom)) { if(class(mass.custom) != "list") stop("'mass.custom' must be of class 'list'") new.aas <- names(mass.custom) if(any(duplicated(new.aas))) { mass.custom[duplicated(new.aas)] <- NULL warning("duplicate residue name(s) in 'mass.custom'. using first occurrence(s) only.") } new.aas <- names(mass.custom) if(any(new.aas %in% mat$aa3)) { dups <- paste(unique(new.aas[new.aas %in% mat$aa3]), collapse=", ") warning(paste("residue name(s)", dups, "exists in 'aa.table'. overwriting with provided value(s).")) } for(new.aa in new.aas) { if( new.aa %in% rownames(mat) ) { ## Replace residue mass mat[new.aa, "mass"] = mass.custom[[ new.aa ]] } else { ## Add new residue to data frame (aa.table) nr <- data.frame(list(aa3=new.aa, aa1="X", mass=mass.custom[[ new.aa ]], formula=NA, name=NA)) rownames(nr) <- new.aa mat <- rbind(mat, nr) } } } ## Fetch mass from data frame wts <- mat[sequ, "mass"] ## Check for missing masses if(NA %in% wts) { inds <- which(wts %in% NA) unknown <- paste(unique(sequ[inds]), collapse=" ") stop(paste("Unknown amino acid identifier: ", unknown, sep="")) } if(addter) { wts[1] <- wts[1] + atom2mass("H") wts[length(wts)] <- wts[length(wts)] + atom2mass("O") + atom2mass("H") } return(wts) } bio3d/R/plot.core.R0000644000176200001440000000173514046015221013504 0ustar liggesusers`plot.core` <- function(x, y=NULL, type="h", main="", sub="", xlim=NULL, ylim=NULL, xlab = "Core Size (Number of Residues)", ylab = "Total Ellipsoid Volume (Angstrom^3)", axes=TRUE, ann=par("ann"), col=par("col"), ...) { if(is.list(x)) { len <- x$length ## hack!! fix later x <- x$volume } else{ len <- rev(1:length(x)) } xy <- xy.coords(x, y) if (is.null(xlim)) xlim <- range(xy$x[is.finite(xy$x)]) if (is.null(ylim)) ylim <- range(xy$y[is.finite(xy$y)]) ## opar <- par(no.readonly=TRUE) ## on.exit(par(opar)) plot.new() plot.window(xlim, ylim, ...) points(xy$x, xy$y, col=col, type=type, ...) if (axes) { ax.ind <- c(1,seq(10,length(x),by=10)) axis(1, at=ax.ind, labels = len[ax.ind]) axis(2) box() } if (ann) { if(is.null(xlab)) xlab=xy$xlab if(is.null(ylab)) ylab=xy$ylab title(main=main, sub=sub, xlab=xlab, ylab=ylab, ...) } } bio3d/R/mktrj.enma.R0000644000176200001440000000672614046015221013652 0ustar liggesusers"mktrj.enma" <- function(enma=NULL, # enma data structure pdbs=NULL, # pdbs object s.inds=NULL, # structure ids m.inds=NULL, # modes ids mag=10, # magnification factor step=1.25, # step size file=NULL, # output pdb file rock=TRUE, ncore=NULL, ... ) { # args for write.pdb ## make a trjactory of atomic displacments along a given mode if(!inherits(enma, "enma")) stop("mktrj.enma: must supply 'enma' object, i.e. from 'nma.pdbs'") if(!is.null(pdbs)) { if(!inherits(pdbs, "pdbs")) stop("input 'pdbs' should be a list object as obtained from 'read.fasta.pdb'") } ## Parallelized by parallel package ncore <- setup.ncore(ncore, bigmem = FALSE) if(ncore>1) mylapply <- mclapply else mylapply <- lapply if(is.null(s.inds)) s.inds <- 1:nrow(enma$fluctuations) if(is.null(m.inds)) m.inds <- 1:5 if(is.null(file) & length(s.inds)==1 & length(m.inds)==1) file <- paste("mode_", m.inds+6, "-s", s.inds, ".pdb", sep="") ## check dimensions to determine rm.gaps if(any(is.gap(enma$xyz)) & (dim(enma$U.subspace)[1] == dim(enma$xyz)[2])) { rm.gaps <- FALSE } else { rm.gaps <- TRUE } if(!rm.gaps & length(s.inds)>1) stop(paste("enma object must be calculated with argument rm.gaps=TRUE", "\n", "for trajectory generation of multiple structures and modes")) if(any(enma$L[s.inds, m.inds]<=0)) warning("Mode with eigenvalue <=0 detected. Check 'mode' index.") nstep <- c(seq(step, to=mag, by=step)) zcoor <- cbind(1) %*% nstep scor <- function(x,u,m) { return(x*u+m) } myMktrj <- function(i) { coor <- NULL ind <- s.inds[i] for(j in 1:length(m.inds)) { mode <- m.inds[j] u.inds <- which(!is.na(enma$U.subspace[,mode,ind])) if(rm.gaps) xyz.inds <- gap.inspect(enma$xyz)$f.inds else xyz.inds <- u.inds plus <- sapply(c(zcoor), scor, u=enma$U.subspace[u.inds,mode,ind], m=enma$xyz[ind,xyz.inds]) minus <- sapply(c(-zcoor), scor, u=enma$U.subspace[u.inds,mode,ind], m=enma$xyz[ind,xyz.inds]) if(rock) { tmp <- cbind(enma$xyz[ind,xyz.inds], plus, plus[,rev(1:ncol(plus))], enma$xyz[ind,xyz.inds], minus, minus[,rev(1:ncol(minus))]) } else { tmp <- cbind(plus[,rev(1:ncol(plus))], enma$xyz[ind,xyz.inds], minus) } coor <- rbind(coor, t(tmp)) } return(coor) } ## do the calc coor <- mylapply(1:length(s.inds), myMktrj) coor <- do.call(rbind, coor) class(coor) <- "xyz" if(!is.null(file)) { if(rm.gaps) xyz.inds <- gap.inspect(enma$xyz)$f.inds else xyz.inds <- which(!is.na(enma$U.subspace[,m.inds[1],s.inds[1]])) if(is.null(pdbs)) write.pdb(xyz=coor, file=file, ...) else { write.pdb(xyz=coor, file=file, chain=pdbs$chain[s.inds[1], xyz2atom(xyz.inds)], resno=pdbs$resno[s.inds[1], xyz2atom(xyz.inds)], resid=pdbs$resid[s.inds[1], xyz2atom(xyz.inds)], b=enma$fluctuations[s.inds[1], !is.gap(enma$fluctuations[s.inds[1],])], ...) } invisible(coor) } else { return(coor) } } bio3d/R/read.pdb.R0000644000176200001440000001674014046015221013260 0ustar liggesusersread.pdb <- function(file, maxlines = -1, multi=FALSE, rm.insert=FALSE, rm.alt=TRUE, ATOM.only=FALSE, hex=FALSE, verbose=TRUE) { cl <- match.call() if(missing(file)) { stop("read.pdb: please specify a PDB 'file' for reading") } if(!is.logical(multi)) { stop("read.pdb: 'multi' must be logical TRUE/FALSE") } ##- Check if file exists locally or on-line putfile <- NULL if(substr(file,1,4)=="http") { ## cpp function can not read from http putfile <- tempfile(fileext=".pdb") rt <- try(download.file(file, putfile, quiet = !verbose), silent=TRUE) if(inherits(rt, "try-error")) { file.remove(putfile) stop("File not found at provided URL") } else { file <- putfile } } toread <- file.exists(file) if(toread & basename(file) != file) { file <- normalizePath(file) } ## Check for 4 letter code and possible on-line file if(!toread) { if(nchar(file)==4) { cat(" Note: Accessing on-line PDB file\n") file <- get.pdb(file, path=tempdir(), verbose=FALSE) } else { stop("No input PDB file found: check filename") } } ## parse PDB file with cpp function pdb <- .read_pdb(file, multi=multi, hex=hex, maxlines=maxlines, atoms_only=ATOM.only) ## remove temp file if we downloaded it above if(!is.null(putfile)) { file.remove(putfile) } # if(verbose) # cat(" ", pdb$header, "\n") pdb$header <- NULL if(!is.null(pdb$error)) stop(paste("Error in reading PDB file", file)) else class(pdb) <- c("pdb", "sse") ## convert xyz to matrix if(pdb$models > 1) pdb$xyz <- matrix(pdb$xyz, nrow=pdb$models, byrow=TRUE) pdb$xyz <- as.xyz(pdb$xyz) pdb$models <- NULL ## set empty strings to NA pdb$atom[pdb$atom==""] <- NA ## give names to seqres names(pdb$seqres) <- pdb$seqres_chain pdb$seqres_chain <- NULL ## fix stuff that should be NULL instead of empty vectors if(length(pdb$helix$start) > 0) { ## names are set in cpp func ## names(pdb$helix$start) <- pdb$helix$inserti ## names(pdb$helix$end) <- pdb$helix$inserte } else { pdb$helix <- NULL } if(length(pdb$sheet$start) > 0) { ## names(pdb$sheet$start) <- pdb$sheet$inserti ## names(pdb$sheet$end) <- pdb$sheet$inserte ##- remove repeated records for the same strand (e.g. in 1NH0) pa <- paste(pdb$sheet$start, pdb$sheet$inserti, pdb$sheet$chain, sep='_') keep.inds <- which(!duplicated(pa)) pdb$sheet <- lapply(pdb$sheet, '[', keep.inds) pdb$sheet$inserti <- NULL } else { pdb$sheet <- NULL } if(!length(pdb$seqres) > 0) pdb$seqres <- NULL if(!length(pdb$remark350) > 0) pdb$remark350 <- NULL ## Remove 'Alt records' if (rm.alt) { if ( sum( !is.na(pdb$atom$alt) ) > 0 ) { first.alt <- sort( unique(na.omit(pdb$atom$alt)) )[1] cat(paste(" PDB has ALT records, taking",first.alt,"only, rm.alt=TRUE\n")) alt.inds <- which( (pdb$atom$alt != first.alt) ) # take first alt only if(length(alt.inds)>0) { pdb$atom <- pdb$atom[-alt.inds,] pdb$xyz <- trim.xyz(pdb$xyz, col.inds=-atom2xyz(alt.inds)) } } } ## Remove 'Insert records' if (rm.insert) { if ( sum( !is.na(pdb$atom$insert) ) > 0 ) { cat(" PDB has INSERT records, removing, rm.insert=TRUE\n") insert.inds <- which(!is.na(pdb$atom$insert)) # rm insert positions pdb$atom <- pdb$atom[-insert.inds,] pdb$xyz <- trim.xyz(pdb$xyz, col.inds=-atom2xyz(insert.inds)) } } if(any(duplicated(pdb$atom$eleno))) warning("duplicated element numbers ('eleno') detected") if(any(is.na(pdb$atom$resno))) { warning("NA values for residue numbers ('resno') detected") } ## construct c-alpha attribute ca.inds <- atom.select.pdb(pdb, string="calpha", verbose=FALSE) pdb$calpha <- seq(1, nrow(pdb$atom)) %in% ca.inds$atom ##- Parse REMARK records for storing symmetry matrices to ## build biological unit by calling 'biounit()' remark <- .parse.pdb.remark350(pdb$remark350) pdb$remark350 <- NULL pdb$remark <- remark ## set call pdb$call <- cl ## finished return(pdb) } ##- parse REMARK records for building biological unit ('biounit()') .parse.pdb.remark350 <- function(x) { raw.lines <- x # How many lines of REMARK 350? remark350 <- grep("^REMARK\\s+350", raw.lines) nlines <- length(remark350) # How many distinct biological unit? biolines <- grep("^REMARK\\s+350\\s+BIOMOLECULE", raw.lines) nbios <- length(biolines) if(nbios == 0) { # warning("REMARK 350 is incomplete.") return(NULL) } # End line number of each biological unit biolines2 <- c(biolines[-1], remark350[nlines]) # How the biological unit was determined? method <- sapply(1:nbios, function(i) { author <- intersect(grep("^REMARK\\s+350\\s+AUTHOR DETERMINED BIOLOGICAL UNIT", raw.lines), biolines[i]:biolines2[i]) if(length(author) >= 1) return("AUTHOR") else return("SOFTWARE") } ) # Get chain IDs to apply the transformation chain <- lapply(1:nbios, function(i) { chlines <- intersect(grep("^REMARK\\s+350\\s+APPLY THE FOLLOWING TO CHAINS", raw.lines), biolines[i]:biolines2[i]) if(length(chlines) >= 1) { chs <- gsub("\\s*", "", sub("^.*:", "", raw.lines[chlines])) chs <- unlist(strsplit(chs, split=",")) } else { # warning(paste("Can't determine chain IDs from REMARK 350 for biological unit", # i, sep="")) chs = NA } return(chs) } ) if(any(is.na(chain))) return(NULL) mat <- lapply(1:nbios, function(i) { # Get transformation matrices mtlines <- intersect(grep("^REMARK\\s+350\\s+BIOMT", raw.lines), biolines[i]:biolines2[i]) # Get chain ID again: different trans matrices may be applied to different chains chlines <- intersect(grep("^REMARK\\s+350\\s+APPLY THE FOLLOWING TO CHAINS", raw.lines), biolines[i]:biolines2[i]) chs <- gsub("\\s*", "", sub("^.*:", "", raw.lines[chlines])) chs <- strsplit(chs, split=",") if(length(mtlines) == 0 || length(mtlines) %% 3 != 0) { # warning("Incomplete transformation matrix") mat <- NA } else { mat <- lapply(seq(1, length(mtlines), 3), function(j) { mt <- matrix(NA, 3, 4) for(k in 1:3) { vals <- sub("^REMARK\\s+350\\s+BIOMT[123]\\s*", "", raw.lines[mtlines[j+k-1]]) vals <- strsplit(vals, split="\\s+")[[1]] mt[k, ] <- as.numeric(vals[-1]) } mt } ) chs.pos <- findInterval(mtlines[seq(1, length(mtlines), 3)], chlines) names(mat) <- sapply(chs[chs.pos], paste, collapse=" ") ## apply each mat to specific chains } return(mat) } ) if(any(is.na(mat))) return(NULL) out <- list(biomat = list(num=nbios, chain=chain, mat=mat, method=method)) return(out) } bio3d/R/atom.select.pdb.R0000644000176200001440000001661714046015221014566 0ustar liggesusers".is.protein" <- function(pdb, byres=TRUE) { if(byres) { return(.is.protein1(pdb)) } else { ## possible option to issue a warning when the two methods diverge sel1 <- .is.protein1(pdb) sel2 <- .is.protein2(pdb) if(!(identical(sel1, sel2))) { sel <- cbind(sel1, sel2) sums <- apply(sel, 1, sum) inds <- which(sums==1) unq <- paste(unique(pdb$atom$resid[inds]), collapse=",") warning(paste("possible protein residue(s) with non-standard residue name(s) \n (", unq, ")")) } return(sel1) } } ".is.protein1" <- function(pdb) { aa <- bio3d::aa.table$aa3 return(pdb$atom$resid %in% aa) } ".is.protein2" <- function(pdb) { resid <- paste(pdb$atom$chain, pdb$atom$insert, pdb$atom$resno, sep="-") at.ca <- resid[ pdb$atom$elety == "CA"] at.o <- resid[ pdb$atom$elety == "O" ] at.c <- resid[ pdb$atom$elety == "C" ] at.n <- resid[ pdb$atom$elety == "N" ] common <- intersect(intersect(intersect(at.ca, at.o), at.n), at.c) return(resid %in% common) } ".is.nucleic" <- function(pdb) { nuc.aa <- c("A", "U", "G", "C", "T", "I", "DA", "DU", "DG", "DC", "DT", "DI") return(pdb$atom$resid %in% nuc.aa) } ".is.water" <- function(pdb) { hoh <- c("H2O", "OH2", "HOH", "HHO", "OHH", "SOL", "WAT", "TIP", "TIP2", "TIP3", "TIP4") return(pdb$atom$resid %in% hoh) } ".is.hydrogen" <- function(pdb) { return(substr( gsub("^[123]", "",pdb$atom$elety) , 1, 1) %in% "H") } .match.type <- function(pdb, t) { if(!is.character(t)) stop("'type' must be a character vector") pdb$atom$type %in% t } .match.eleno <- function(pdb, eleno) { if(!is.numeric(eleno)) stop("'eleno' must be a numeric vector") pdb$atom$eleno %in% eleno } .match.elety <- function(pdb, elety) { if(!is.character(elety)) stop("'elety' must be a character vector") pdb$atom$elety %in% elety } .match.resid <- function(pdb, resid) { if(!is.character(resid)) stop("'resid' must be a character vector") pdb$atom$resid %in% resid } .match.chain <- function(pdb, chain) { if(!is.character(chain)) stop("'chain' must be a character vector") pdb$atom$chain %in% chain } .match.resno <- function(pdb, resno) { if(!is.numeric(resno)) stop("'resno' must be a numeric vector") pdb$atom$resno %in% resno } .match.insert <- function(pdb, insert) { # insert should be NA or a character vector if(!all(is.na(insert))) { if(!is.character(insert[ !is.na(insert) ])) stop("'insert' must be a character vector") } ## NA and '' are treated the same if(any(insert=="", na.rm=TRUE)) insert[ insert == "" ] = NA if(any(pdb$atom$insert == "", na.rm=TRUE)) pdb$atom$insert[ pdb$atom$insert == "" ] = NA pdb$atom$insert %in% insert } .match.segid <- function(pdb, segid) { # segid should be NA or a character vector if(!all(is.na(segid))) { if(!is.character(segid[ !is.na(segid) ])) stop("'segid' must be a character vector") } ## NA and '' are treated the same if(any(segid=="", na.rm=TRUE)) segid[ segid == "" ] = NA if(any(pdb$atom$segid == "", na.rm=TRUE)) pdb$atom$segid[ pdb$atom$segid == "" ] = NA pdb$atom$segid %in% segid } atom.select.pdb <- function(pdb, string = NULL, type = NULL, eleno = NULL, elety = NULL, resid = NULL, chain = NULL, resno = NULL, insert = NULL, segid = NULL, operator = "AND", inverse = FALSE, value = FALSE, verbose=FALSE, ...) { if(!is.pdb(pdb)) stop("'pdb' must be an object of class 'pdb'") ## check input operator op.tbl <- c(rep("AND",3), rep("OR",4)) operator <- op.tbl[match(operator, c("AND","and","&","OR","or","|","+"))] if(!operator %in% c("AND", "OR")) stop("Allowed values for 'operator' are 'AND' or 'OR'") ## check input string if(!is.null(string)) { str.allowed <- c("all", "protein", "notprotein", "nucleic", "notnucleic", "water", "notwater", "calpha", "cbeta", "backbone", "back", "side", "sidechain", "ligand", "h", "noh") if(!(string %in% str.allowed)) stop("Unknown 'string' keyword. See documentation for allowed values") } ## verbose message output if(verbose) cat("\n") .verboseout <- function(M, type) { cat(" .. ", sprintf("%08s", length(which(M))), " atom(s) from '", type, "' selection \n", sep="") } ## combine logical vectors .combinelv <- function(L, M, operator) { if(operator=="AND") M <- L & M if(operator=="OR") M <- L | M return(M) } cl <- match.call() if(operator=="AND") M <- rep(TRUE, nrow(pdb$atom)) if(operator=="OR") M <- rep(FALSE, nrow(pdb$atom)) if(!is.null(string)) { M <- switch(string, all = M <- rep(TRUE, nrow(pdb$atom)), protein = .is.protein(pdb), notprotein = !.is.protein(pdb), nucleic = .is.nucleic(pdb), notnucleic = !.is.nucleic(pdb), water = .is.water(pdb), notwater = !.is.water(pdb), calpha = .is.protein(pdb) & .match.elety(pdb, "CA"), cbeta = .is.protein(pdb) & .match.elety(pdb, c("CA", "N", "C", "O", "CB")), backbone = .is.protein(pdb) & .match.elety(pdb, c("CA", "N", "C", "O")), back = .is.protein(pdb) & .match.elety(pdb, c("CA", "N", "C", "O")), sidechain = .is.protein(pdb) & !.match.elety(pdb, c("CA", "N", "C", "O")), side = .is.protein(pdb) & !.match.elety(pdb, c("CA", "N", "C", "O")), ligand = !.is.protein(pdb) & !.is.nucleic(pdb) & !.is.water(pdb), h = .is.hydrogen(pdb), noh = !.is.hydrogen(pdb), NA ) if(verbose) { .verboseout(M, 'string') } } if(!is.null(type)) { L <- .match.type(pdb, type) if(verbose) .verboseout(L, 'type') M <- .combinelv(L, M, operator) } if(!is.null(eleno)) { L <- .match.eleno(pdb, eleno) if(verbose) .verboseout(L, 'eleno') M <- .combinelv(L, M, operator) } if(!is.null(elety)) { L <- .match.elety(pdb, elety) if(verbose) .verboseout(L, 'elety') M <- .combinelv(L, M, operator) } if(!is.null(resid)) { L <- .match.resid(pdb, resid) if(verbose) .verboseout(L, 'resid') M <- .combinelv(L, M, operator) } if(!is.null(chain)) { L <- .match.chain(pdb, chain) if(verbose) .verboseout(L, 'chain') M <- .combinelv(L, M, operator) } if(!is.null(resno)) { L <- .match.resno(pdb, resno) if(verbose) .verboseout(L, 'resno') M <- .combinelv(L, M, operator) } if(!is.null(insert)) { L <- .match.insert(pdb, insert) if(verbose) .verboseout(L, 'insert') M <- .combinelv(L, M, operator) } if(!is.null(segid)) { L <- .match.segid(pdb, segid) if(verbose) .verboseout(L, 'segid') M <- .combinelv(L, M, operator) } if(verbose) cat(" ..", sprintf("%08s", length(which(M))), "atom(s) in final combined selection \n") if(inverse) { if(verbose) { cat(" ..", sprintf("%08s", length(which(!M))), "atom(s) in inversed selection \n") } sele <- as.select(which(!M)) } else sele <- as.select(which(M)) sele$call <- cl if(verbose) cat("\n") if(value) return(trim.pdb(pdb, sele)) else return(sele) } bio3d/R/difference.vector.R0000644000176200001440000000134314046015221015165 0ustar liggesusers"difference.vector" <- function(xyz, xyz.inds=NULL, normalize=FALSE) { xyz <- as.matrix(xyz) if (dim(xyz)[1L] < 2) stop("xyz must be a matrix with two rows") if (dim(xyz)[2L] < 6) stop("xyz does not contain sufficient coordinates") if (dim(xyz)[1L] > 2) { xyz <- xyz[1:2,] warning("xyz has more than two rows - using only the two first") } if ( is.null(xyz.inds) ) xyz.inds <- seq(1, ncol(xyz)) if ( length(which(is.na(xyz[,xyz.inds]))) > 0 ) stop("xyz has NA values") a <- xyz[1, xyz.inds] b <- xyz[2, xyz.inds] if (length(a)!=length(b)) stop("unequal lengths of the two coordinate sets") diff <- b-a if(normalize) diff <- normalize.vector(diff) return( diff ) } bio3d/R/plot.fasta.R0000644000176200001440000000474214046015221013653 0ustar liggesusers"plot.fasta" <- function(x, hc = TRUE, labels = x$id, cex.lab = 0.7, xlab = "Alignment index", main = "Sequence Alignment Overview", mar4 = 4, ... ) { if(!(inherits(x, "fasta") | inherits(x, "pdbs"))) stop("input 'x' should be a list object as obtained from 'read.fasta'") if(is.logical(hc)) { if(hc) { ide <- seqidentity(x) hc <- hclust(as.dist(1-ide)) } else { hc <- NULL } } else { if(!is.null(hc)) { if(!inherits(hc, "hclust")) stop("'hc' must be logical, NULL or a 'hclust' object.") } } ##- Setup plot arangment opar <- par(no.readonly = TRUE) on.exit(par(opar)) if(!is.null(hc)) { layout(matrix(c(4,2,3,1), ncol=2), heights = c(.1, 1), widths = c(0.3, 1)) par(mar=c(4, 0.1, 0.1, mar4)) } else { layout(matrix(c(2, 1), nrow=2), heights = c(.1, 1)) par(mar=c(4, 2, 0.1, mar4)) } ## 1: gap, 0: non-gap gaps <- gap.inspect(x$ali) mat <- gaps$bin if(any(mat==1)) { mat[ mat == 1 ] <- -1 mat[ mat == 0 ] <- 1 mat[ mat == -1 ] <- 0 } else { mat <- mat+1 } ## re-order matrix if(!is.null(hc)) mat <- mat[ hc$order, ] else mat <- mat[ seq(nrow(mat), 1), ] if(any(mat==0)) col <- c("#FFFFFF", "#9F9F9F") else col <- c("#9F9F9F") image(t(mat), col = col, axes=FALSE) by <- pretty(0:ncol(x$ali), n = 6) by <- by[2] labs.x <- seq(0, ncol(x$ali), by=by) labs.x[1] <- 1 at <- labs.x / labs.x[length(labs.x)] at[1] <- 0 axis(1, at=at, labels=labs.x) mtext(xlab, 1, line=2.5, cex=1.0) at <- seq(0, 1, length.out=length(x$id)) #labs <- x$id if(!is.null(hc)) labels <- labels[hc$order] mtext(labels, side=4, line=2-1.25, at=at, cex=cex.lab, las=2) ## cluster dendrogram if(!is.null(hc)) { par(mar=c(4, 0.1, 0.1, 0.1)) ddr <- as.dendrogram(hc) plot(ddr, horiz = TRUE, axes = FALSE, yaxs = "i", leaflab = "none") } ## conservation bar on top of alignment cons <- conserv(x$ali) ng <- rep(0, length(cons)) ng[gaps$f.inds] <- 1 if(!is.null(hc)) par(mar=c(.1, 0.1, 2, mar4)) else par(mar=c(.1, 2, 2, mar4)) #if(all(c(0,1) %in% cons)) # col <- c("#FFFFFF", "#FF0000") #else col <- colorRampPalette(c("white", "red"))( 10 ) image(as.matrix(cons), col = col, axes=FALSE) #if(!is.null(hc)) # at <- 0.4 #else at <- NA mtext(main, side = 3, line = 0.5, cex = 1.25, at=at) } bio3d/R/plot.enma.R0000644000176200001440000000601614046015221013471 0ustar liggesusers"plot.enma" <- function(x, pdbs=NULL, xlab=NULL, ylab="Fluctuations", ...) { if(!(inherits(x, "enma"))) stop("provide a enma object as obtained from 'nma.pdbs'") yval <- x$fluctuations ## SSE information sse.aln <- NULL dots <- list(...) ## reference structure for SSE and resno if("ind" %in% names(dots)) { ref.ind <- dots[["ind"]] dots[["ind"]] <- NULL ## Note - plot.fluct use plotb3(yval[1,]) for base plotting ## Lines 54-61 checks for NAs in yval[1,] to trim SSE ## SSE must therefore correspond to yval[1,] ## ref.ind != 1 might give wrong sse annotation in plot warning("reference structure can not be set") ref.ind <- 1 } else { ref.ind <- 1 } ## use first non-NA in col as ref.ind if("col" %in% names(dots)) { col <- dots[["col"]] if(length(col) != nrow(yval)) stop("length of col doesn't match dimension of x") if(any(is.na(col))) { ref.ind <- which(!is.na(col))[1] } } ## check for gaps gaps <- gap.inspect(yval) if(any(gaps$col>0)) rm.gaps <- FALSE else rm.gaps <- TRUE ## check if pdbs match enma object gaps.pdbs <- NULL if(!is.null(pdbs)) { if(!inherits(pdbs, "pdbs")) { warning("argument 'pdbs' is not a 'pdbs' object (as obtained from pdbaln())") pdbs <- NULL } else { gaps.pdbs <- gap.inspect(pdbs$ali) if(rm.gaps) dims.pdbs <- dim(pdbs$ali[, gaps.pdbs$f.inds, drop=FALSE]) else dims.pdbs <- dim(pdbs$ali) if(!identical(dim(yval), dims.pdbs)) { warning("dimenension mismatch between modes and pdbs object") pdbs <- NULL } } } ## trim pdbs object if rm.gaps=TRUE if(!is.null(pdbs)) { if(rm.gaps) pdbs <- trim(pdbs, col.inds=gaps.pdbs$f.inds) } if(!is.null(pdbs)) { resno <- pdbs$resno[ref.ind, ] if(is.null(xlab)) { xlab <- paste0('Residue number (reference PDB: ', basename.pdb(pdbs$id[ref.ind]), ')') } } else { resno <- NULL if(is.null(xlab)) xlab <- "Alignment Position" } if( "sse" %in% names(dots) ) { sse.aln <- dots$sse dots$sse <- NULL } if(!is.null(pdbs) & is.null(sse.aln)) { sse.aln <- pdbs2sse(pdbs, ind=ref.ind, rm.gaps=rm.gaps, resno=TRUE) sse.aln$sse[ is.na(yval[ref.ind,]) ] <- NA ## see lines 54-61 in plotb3.R } if( "rm.gaps" %in% names(dots) ) { warning("'rm.gaps=TRUE' might result in incorrect SSE annotation") } ## Plot fluctuations do.call('plot.fluct', c(list(x=yval, resno=resno, sse=sse.aln, xlab=xlab, ylab=ylab), dots)) } bio3d/R/is.pdb.R0000644000176200001440000000013214046015221012744 0ustar liggesusersis.pdb <- function(x) inherits(x, "pdb") is.pdbs <- function(x) inherits(x, "pdbs") bio3d/R/dccm.pca.R0000644000176200001440000000430314046015221013241 0ustar liggesusers"dccm.pca" <- function(x, pc = NULL, method=c("pearson", "lmi"), ncore = NULL, ...) { if (missing(x) || !"pca" %in% class(x)) stop("dccm.pca: must supply a 'pca' object, i.e. from 'pca.xyz'") method = match.arg(method) modes = pc ## Check for multiple cores ncore = setup.ncore(ncore) ## Set modes to be included if(is.null(modes)) modes <- 1:length(x$L) ## If modes are negative, take modes complementary to them if( any(!is.numeric(modes)) || any(!(abs(modes) %in% c(1:length(x$L)))) || !(all(modes>0) || all(modes<0)) ) stop("Incorrect mode index") if(all(modes < 0)) { modes <- setdiff(c(1:length(x$L)), abs(modes)) if(length(modes) == 0) stop("No mode is selected") } modes <- unique(modes) nmodes <- length(modes) ## Calc variance-covariance matrix over a subset of modes vcovmat <- function(r.inds, pca, vcov.mat = 0) { for ( i in seq_along(r.inds) ) { vcov.mat <- vcov.mat + (pca$U[, r.inds[i]] %o% pca$U[, r.inds[i]]) * pca$L[r.inds[i]] .update.pb(pb) } return(vcov.mat) } ## Calculate variance-covariance matrix first ## ## If contain $z, straightforward if(!is.null(x$z)) { q = x$z[, modes] %*% t(x$U[, modes]) vcov = cov(q) } else { ## Initialize progress bar pb <- .init.pb(ncore, min=0, max=nmodes) if(ncore > 1) { # Parallel jobid <- rep(1:ncore, ceiling(nmodes/ncore)) jobid <- jobid[1:nmodes] ltv <- mclapply(1:ncore, function(i) { j <- which(jobid %in% i) if(length(j) > 0) { m <- vcovmat(modes[j], x) m <- m[lower.tri(m, diag = TRUE)] } else { m = 0 } return(m) } ) ltv <- colSums(do.call(rbind, ltv)) vcov <- matrix(0, nrow(x$U), nrow(x$U)) vcov[lower.tri(vcov, diag = TRUE)] <- ltv vcov <- vcov + t(vcov) diag(vcov) <- diag(vcov) / 2 } else { # Serial vcov <- vcovmat(modes, x) } .close.pb(pb) } corr.mat <- .cov2dccm(vcov, method = method, ncore = ncore) return(corr.mat) } bio3d/R/community.aln.R0000644000176200001440000001606314046015221014374 0ustar liggesusers#' Align communities from two or more networks #' #' Find equivalent communities from two or more networks and re-assign colors #' to them in a consistent way across networks. A \sQuote{new.membership} vector is #' also generated for each network, which maps nodes to community IDs that are #' renumbered according to the community equivalency. #' #' This function facilitates the inspection on the variance of the community #' partition in a group of similar networks. The original community numbering #' (and so the colors of communities in the output of \code{plot.cna} and #' \code{vmd.cna}) can be inconsistent across networks, i.e. equivalent #' communities may display different colors, impeding network comparison. #' The function calculates the dissimilarity between all communities and #' clusters communities with \sQuote{hclust} funciton. In each cluster, 0 or #' 1 community per network is included. The color attribute of communities is #' then re-assigned according to the clusters through all networks. In addition, #' a \sQuote{new.membership} vector is generated for each network, which mapps #' nodes to new community IDs that are numbered consistently across networks. #' #' @param x,... two or more objects of class \code{cna} (if the numbers of #' nodes are different, an alignment \sQuote{fasta} object is required for #' the \code{aln} argument; See below) as obtained from function \code{\link{cna}}. #' Alternatively, a list of \code{cna} objects can be given to \code{x}. #' @param aln alignment for comparing networks with different numbers of nodes. #' #' @return Returns a list of updated \code{cna} objects. #' #' @seealso \code{\link{cna}}, \code{\link{plot.cna}}, \code{\link{vmd.cna}} #' #' @examples #' \donttest{ #' # Needs MUSCLE installed - testing excluded #' if(check.utility("muscle")) { #' #' if (!requireNamespace("igraph", quietly = TRUE)) { #' message('Need igraph installed to run this example') #' } else { #' #' ## Fetch PDB files and split to chain A only PDB files #' ids <- c("1tnd_A", "1tag_A") #' files <- get.pdb(ids, split = TRUE, path = tempdir()) #' #' ## Sequence Alignement #' pdbs <- pdbaln(files, outfile = tempfile()) #' #' ## Normal mode analysis on aligned data #' modes <- nma(pdbs, rm.gaps=TRUE) #' #' ## Dynamic Cross Correlation Matrix #' cijs <- dccm(modes)$all.dccm #' #' ## Correlation Network #' nets <- cna(cijs, cutoff.cij=0.3) #' #' ## Align network communities #' nets.aln <- community.aln(nets) #' #' ## plot all-residue and coarse-grained (community) networks #' pdb <- pdbs2pdb(pdbs, inds=1, rm.gaps=TRUE)[[1]] #' op <- par(no.readonly=TRUE) #' #' # before alignment #' par(mar=c(0.1, 0.1, 0.1, 0.1), mfrow=c(2,2)) #' invisible( lapply(nets, function(x) #' plot(x, layout=layout.cna(x, pdb=pdb, k=3, full=TRUE)[, 1:2], #' full=TRUE)) ) #' invisible( lapply(nets, function(x) #' plot(x, layout=layout.cna(x, pdb=pdb, k=3)[, 1:2])) ) #' #' # after alignment #' par(mar=c(0.1, 0.1, 0.1, 0.1), mfrow=c(2,2)) #' invisible( lapply(nets.aln, function(x) #' plot(x, layout=layout.cna(x, pdb=pdb, k=3, full=TRUE)[, 1:2], #' full=TRUE)) ) #' invisible( lapply(nets.aln, function(x) #' plot(x, layout=layout.cna(x, pdb=pdb, k=3)[, 1:2])) ) #' #' par(op) #' #' } #' } #' } #' @keywords analysis community.aln <- function(x, ..., aln=NULL) { ## Check for presence of igraph package oops <- requireNamespace("igraph", quietly = TRUE) if (!oops) { stop("igraph package missing: Please install from CRAN") } dots <- list(...) if(inherits(x, 'cna')) x <- list(x) nets <- c(x, dots) if(length(nets)==1) stop('Provide at least two networks.') ## Construct dissimilarity matrix raw.mat <- lapply(1:length(nets), function(j, aln) { net <- nets[[j]] ids <- unique(net$communities$membership) mat <- NULL for(i in ids) { r <- t(as.numeric(net$communities$membership==i)) if(inherits(aln, "fasta")) { r2 <- rep(0, ncol(aln$ali)) r2[!is.gap(aln$ali[j, ])] <- r mat <- rbind(mat, r2) } else { mat <- rbind(mat, r) } } rownames(mat) <- ids return(mat) }, aln) raw.mat <- do.call(rbind, raw.mat) ncomms <- sapply(nets, function(net) length(unique(net$communities$membership))) r <- rep(1:length(nets), ncomms) rownames(raw.mat) <- paste(r, ".", rownames(raw.mat), sep="") dismat <- dist(raw.mat, method="binary") ## Clustering hc <- hclust(dismat) grps <- cutree(hc, h=0.99) #plot(hc) str <- strsplit(names(grps), "\\.") ## check if two or more communities from the same network are in one cluster chk <- tapply(str, grps, function(x) sum(duplicated(sapply(x, '[', 1)))>0) if(any(unlist(chk))) stop('Two or more communities from the same network are in one cluster.') ## rename grps to make sure the group number is assigned based on the rank of ## the network in the network list in which the group appears for the first time. ni <- as.numeric(sapply(str, "[[", 1)) ci <- as.numeric(sapply(str, "[[", 2)) minc <- tapply(1:length(grps), grps, function(i){ ind <- order(ni[i], ci[i])[1] c(ni[i[ind]], ci[i[ind]]) }, simplify=FALSE) minc <- do.call(rbind, minc) inds <- order(minc[, 1], minc[, 2]) rl <- rle(grps) rl$values[] <- match(rl$values, inds) grps <- inverse.rle(rl) ## Renumber communities and update 'nets' col <- vmd_colors() ## use vmd colors for(i in 1:length(nets)) { net <- nets[[i]] inds <- which(sapply(str, '[[', 1) %in% i) mycommid <- as.numeric(sapply(str, '[[', 2))[ inds ] mygrps <- grps[inds] names(mygrps) <- mycommid mygrps <- mygrps[order(mycommid)] # sort new grps according to old commun id # update node color membership <- as.character(net$communities$membership) igraph::V(net$network)$color[] <- as.character(col[mygrps[membership]]) # generate renumbered membership new.membership <- as.numeric(mygrps[membership]) names(new.membership) <- names(net$communities$membership) net$new.membership <- new.membership # update community network if(!is.null(net$community.network)) { # community.cij <- net$community.cij # rownames(community.cij) <- mygrps # colnames(community.cij) <- mygrps ## community.cij <- community.cij[order(mygrps), order(mygrps)] # community.network <- igraph::graph.adjacency(community.cij, # mode="undirected", # weighted=TRUE, # diag=FALSE) igraph::V(net$community.network)$color <- col[mygrps] # igraph::V(community.network)$size <- table(net$communities$membership) # net$community.cij <- community.cij # net$community.network <- community.network } nets[[i]] <- net } # return(list(dismat=dismat, hc=hc, grps=grps, nets=new.nets)) return( nets ) } bio3d/R/uniprot.R0000644000176200001440000000444214046015221013275 0ustar liggesusersuniprot <- function(accid) { oops <- requireNamespace("XML", quietly = TRUE) if(!oops) stop("Please install the XML package from CRAN") url <- paste('http://www.uniprot.org/uniprot/', accid, '.xml', sep="") tmpfile <- tempfile() download.file(url, tmpfile) ##, method="wget") xml <- XML::xmlRoot(XML::xmlParse(tmpfile)) node.names <- XML::xmlSApply(xml[[1]], XML::xmlName) ## acession inds <- which(node.names=="accession") accession <- NULL for(i in 1:length(inds)) accession <- c(accession, XML::xmlValue(xml[[1]][[inds[i]]])) ## and name inds <- which(node.names=="name") name <- NULL for(i in 1:length(inds)) name <- c(name, XML::xmlValue(xml[[1]][[inds[i]]])) ## sequence inds <- which(node.names=="sequence") sequence <- gsub("\n", "", XML::xmlValue(xml[[1]][[inds]])) ## organism inds <- which(node.names=="organism") node <- xml[[1]][[inds]] organism <- NULL tmpl <- unlist(XML::xmlApply(node, XML::xmlAttrs)) if("scientific" %in% tmpl) organism <- XML::xmlValue(node[[which(tmpl %in% "scientific")]]) if("common" %in% tmpl) organism <- c(organism, XML::xmlValue(node[[which(tmpl %in% "common")]])) ## taxon inds <- which(node.names=="organism") node <- xml[[1]][[inds]] taxon <- NULL for ( i in 1:XML::xmlSize(node[['lineage']]) ) { taxon <- c(taxon, XML::xmlValue(node[['lineage']][[i]])) } ## protein node <- xml[[1]][['protein']] fullName <- XML::xmlValue(node[['recommendedName']][['fullName']]) shortName <- XML::xmlValue(node[['recommendedName']][['shortName']]) ## gene node <- xml[[1]][['gene']] gene <- XML::xmlValue(node[[1]]) ## dbReference inds <- which(node.names=="dbReference") dbref <- list() for(i in 1:length(inds)) { node <- xml[[1]][[inds[i]]] dbref[[i]] <- XML::xmlAttrs(node) } dbref <- unlist(dbref) type.inds <- names((dbref)) == "type" id.inds <- names((dbref)) == "id" dbref <- data.frame(type=dbref[type.inds], id=dbref[id.inds], stringsAsFactors=FALSE) out <- list(accession = accession, name = name, fullName = fullName, shortName = shortName, sequence = sequence, gene = gene, organism = organism, taxon = taxon, dbref=dbref) return(out) } bio3d/R/inner.prod.R0000644000176200001440000000132714046015221013652 0ustar liggesusers"inner.prod" <- function(x,y,mass=NULL) { x <- as.matrix(x); y <- as.matrix(y); dx <- dim(x); dy <- dim(y); if(dx[1]!=dy[1]) stop("inner.prod: unequal vector lengths") if(dx[2]>1 && dy[2]>1) { if(dx[2]!=dy[2]) stop("inner.prod: unequal vector lengths") } if(dx[2]==1) x <- as.numeric(x) if(dy[2]==1) y <- as.numeric(y) if(!is.null(mass)) { if (dx[1] != (length(mass)*3)) stop("inner.prod: incorrect length of mass") } if(is.null(mass)) mass <- 1 else mass <- rep(mass,each=3) if(is.matrix(x) || is.matrix(y)) return(colSums((x*y)*mass^2)) else return(sum(x*y*mass^2)) } bio3d/R/pdb2aln.ind.R0000644000176200001440000000125014046015221013662 0ustar liggesusers"pdb2aln.ind" <- function(aln, pdb, inds = NULL, ...) { # get the new alignment; also check arguments internally naln <- pdb2aln(aln=aln, pdb=pdb, ...) if(is.null(inds)) inds <- gap.inspect(aln$ali)$f.inds ninds <- which(naln$ref["ali.pos",] %in% inds) ca.inds <- naln$ref["ca.inds", ninds] if(any(is.na(ca.inds))) { warning("Gaps are found in equivalent positions in PDB") } inds.a = inds[!is.na(ca.inds)] inds.b = ca.inds[!is.na(ca.inds)] a = list(atom=inds.a, xyz=atom2xyz(inds.a)) class(a) = "select" b = list(atom=inds.b, xyz=atom2xyz(inds.b)) class(b) = "select" out = list(a = a, b = b) return(out) } bio3d/R/chain.pdb.R0000644000176200001440000000756614046015221013435 0ustar liggesusers`chain.pdb` <- function(pdb, ca.dist=4, bond=TRUE, bond.dist=1.5, blank="X", rtn.vec=TRUE) { ##- Find possible chian breaks ## i.e. Concetive Caplpa's that are further than 'ca.dist' apart, ## print basic chain info and rtn a vector of chain ids ## consisting of the 26 upper-case letters of the Roman ## alphabet ## ## chn <- chain.pdb(pdb) ## pdb$atom[,"chain"] <- chain.pdb(pdb) ## ## Distance between concetive C-alphas ca <- atom.select(pdb, "calpha", verbose=FALSE) if(length(ca$atom) <=1) { d <- 0 } else { if(bond) { nn <- atom.select(pdb, "protein", elety="N", verbose=FALSE) cc <- atom.select(pdb, "protein", elety="C", verbose=FALSE) ca.labs <- paste(pdb$atom$chain[ca$atom], pdb$atom$resno[ca$atom], pdb$atom$insert[ca$atom], sep="_") nn.labs <- paste(pdb$atom$chain[nn$atom], pdb$atom$resno[nn$atom], pdb$atom$insert[nn$atom], sep="_") cc.labs <- paste(pdb$atom$chain[cc$atom], pdb$atom$resno[cc$atom], pdb$atom$insert[cc$atom], sep="_") # Check if N-C is available; if not, use CA-CA distance hasN <- rep(FALSE, length(ca.labs)) hasC <- rep(FALSE, length(ca.labs)) hasN[ca.labs %in% nn.labs] <- TRUE hasC[ca.labs %in% cc.labs] <- TRUE hasNC <- hasC[-length(hasC)] & hasN[-1] useC.labs <- ca.labs[which(hasNC)] useN.labs <- ca.labs[which(hasNC)+1] sel1 <- as.select( sort( c(ca$atom[which(!hasNC)], cc$atom[cc.labs %in% useC.labs]) ) ) sel2 <- as.select( sort( c(ca$atom[which(!hasNC)+1], nn$atom[nn.labs %in% useN.labs]) ) ) if(sum(!hasNC) > 0) { # Use mixed distance cutoff values bond.dist <- rep(bond.dist, length(hasNC)) bond.dist[!hasNC] <- ca.dist } else if(sum(hasNC) == 0) { warning("No valid N-C bond to check; Use CA-CA distances") bond.dist <- ca.dist } # if(length(ca$atom) != length(nn$atom) || # length(ca$atom) != length(cc$atom)) { # warning("Peptide bond atoms (N/C) and C-alpha atoms mismatch. Switch to bond=FALSE.") # bond <- FALSE # } else { xyz1 <- pdb$xyz[sel1$xyz] xyz2 <- pdb$xyz[sel2$xyz] d <- dist.xyz(xyz1, xyz2, all.pairs=FALSE) # d <- d[!is.na(d)] # } } if(!bond) { xyz <- matrix(pdb$xyz[ca$xyz], nrow=3) if(length(ca$atom) == 2) d <- sqrt( sum( apply(xyz , 1, diff)^2 ) ) else d <- sqrt( rowSums( apply(xyz , 1, diff)^2 ) ) } } ## Chain break distance check if(bond) { ind <- which(d > bond.dist) } else { ind <- which(d > ca.dist) } len <- diff( c(1,ind,length(d)) ) cat(paste("\t Found",length(ind), "possible chain breaks\n")) if(length(ind) > 0) { cat(paste("\t After resno(s):", paste( pdb$atom[ca$atom,"resno"][(ind)], collapse=", " ),"\n" )) cat(paste("\t Chain length(s):", paste(len+1, collapse=", " ),"\n" )) } ## Make a chain id vector if(rtn.vec) { resno.ind <- as.numeric(c(1, sort(as.numeric(c(ind,(ind+1)))), (length(d)+1) )) ## Renumber residues first, in case that original resnos are not ## consecutive crossing multiple chains res <- paste(pdb$atom[, "chain"], pdb$atom[, "resno"], pdb$atom[, "insert"], sep="_") pdb$atom[, "resno"] <- vec2resno(1:length(unique(res)), res) resno.val <- pdb$atom[ca$atom,"resno"][resno.ind] resno.val <- matrix(as.numeric(resno.val),nrow=2) vec <- rep(blank, nrow(pdb$atom)) if(is.na(resno.val[1])) { return(vec) } else if(is.na(resno.val[2])) { resno.val[2] <- resno.val[1] } for(i in 1:(length(resno.val)/2)) { sel.ind <- atom.select(pdb, resno=c(resno.val[1,i]:resno.val[2,i]), verbose=FALSE) vec[sel.ind$atom]=LETTERS[i] } return(vec) } } bio3d/R/hclustplot.R0000644000176200001440000001004214046015221013767 0ustar liggesusers"hclustplot" <- function(hc, k=NULL, h=NULL, colors=NULL, labels=NULL, fillbox=FALSE, heights = c(1, .3), mar = c(1, 1, 0, 1), ...) { if(!inherits(hc, "hclust")) stop("hc must be of type 'hclust'") if(is.null(k) & is.null(h) & is.null(colors)) stop("provide either k or h to function 'cutree', or colors for manual coloring") mtext.names <- names(formals( mtext )) plot.dendrogram <- get("plot.dendrogram", envir = getNamespace("stats")) plot.names <- c(names(formals( plot.dendrogram )), names(formals( plot.default ))) dots <- list(...) mtext.args <- dots[names(dots) %in% mtext.names] plot.args <- dots[names(dots) %in% plot.names] par.args <- dots[!(names(dots) %in% unique(c(names(mtext.args), names(plot.args))))] mtext.args <- c(mtext.args, par.args) plot.args <- c(plot.args, par.args) ## set default and allowed mtext arguments if(!any(names(mtext.args)=="line")) { if( fillbox ) mtext.args$line <- 0.5 else mtext.args$line <- -0.25 } if(!any(names(mtext.args)=="side")) mtext.args$side <- 1 if(!any(names(mtext.args)=="las")) mtext.args$las <- 2 if(any(names(mtext.args)=="col")) mtext.args$col <- NULL if(any(names(mtext.args)=="at")) mtext.args$at <- NULL ## set default and allowed plot.dendrogram arguments if(any(names(plot.args)=="axes")) { axes <- plot.args$axes plot.args$axes <- NULL } else { axes <- TRUE } if(any(names(plot.args)=="xaxs")) plot.args$xaxs <- NULL if(any(names(plot.args)=="leaflab")) plot.args$leaflab <- NULL if(any(names(plot.args)=="xlab")) plot.args$xlab <- NULL if(any(names(plot.args)=="horiz")) plot.args$horiz <- NULL ## print(mtext.args) ## print(par.args) ## print(plot.args) plot.labels <- TRUE if(is.logical(labels)) { if(labels) plot.labels <- TRUE else plot.labels <- FALSE labels <- NULL } if(is.null(labels)) { labels <- hc$labels if(is.null(labels)) labels <- seq(1, length(hc$order)) } else { if( length(hc$order) != length(labels) ) stop("labels must be of same length as hc") } if(!is.null(colors)) { unq.cols <- unique(colors) grps <- unlist(lapply(colors, function(x) which(x==unq.cols))) labelColors <- unq.cols } else { grps <- cutree(hc, k=k, h=h) labelColors <- seq(1, length(unique(grps))) } hcd <- as.dendrogram(hc) cols <- labelColors[grps][hc$order] ## set margins mar.default <- c(1, 1, 0, 1) if(all(mar==mar.default)) { mar <- mar.default mar[1] <- mar[1] + ifelse(plot.labels, 3, 0) mar[1] <- mar[1] + ifelse(fillbox, 2, 0) mar[2] <- mar[2] + ifelse(!is.null(plot.args$ylab), 2, 0) mar[2] <- mar[2] + ifelse(axes, 2, 0) mar[3] <- ifelse(!is.null(plot.args$ylab), 4, 2) } ## colored filled boxes below the dendrogram if( fillbox ) { ##| plot.labels ) { layout(as.matrix(c(2,1)), heights = heights) dev.hold() on.exit(dev.flush()) op <- par(no.readonly = TRUE) on.exit(par(op), add = TRUE) par(mar=c(mar[1], mar[2], 0, mar[4])) if( fillbox ) image(cbind(1:length(grps)), col = cols, axes = FALSE) else frame() if(plot.labels) { do.call('mtext', c(list(text=labels[ hc$order ], at=seq(0, 1, length.out=length(grps)), col=cols), mtext.args)) } } else { layout(1) } ## dendrogram par(mar = c(ifelse(fillbox, 0, mar[1]), mar[2], mar[3], mar[4])) do.call('plot', c(list(x=hcd, axes=FALSE, leaflab="none", xaxs="i"), plot.args)) if(axes) axis(2) ## labels when filled boxes are not drawn if(plot.labels & !fillbox ) { do.call('mtext', c(list(text=labels[ hc$order ], at=seq(1, length(grps)), col=cols), mtext.args)) } ##if(!is.null(sub)) { ## mtext(sub, side=3, line=-0.5) ##} } bio3d/R/mono.colors.R0000644000176200001440000000024014046015221014035 0ustar liggesusers"mono.colors" <- function (n) { if(n<2) stop("need to ask for at least 2 colors") n=n-1 col <- rev(gray(0:(n) / (n))) col[1] = NA return(col) } bio3d/R/aanma.pdb.R0000644000176200001440000002701614046015221013420 0ustar liggesusers#' All Atom Normal Mode Analysis #' #' Perform all-atom elastic network model normal modes calculation of a protein #' structure. #' #' @details This function builds an elastic network model (ENM) based on all #' heavy atoms of input \code{pdb}, and performs subsequent normal mode #' analysis (NMA) in various manners. By default, the \sQuote{aaenm2} force #' field (defining of the spring constants between atoms) is used, which was #' obtained by fitting to a local energy minimum of a crambin model #' derived from the AMBER99SB force field. It employs a pair force constant #' function which falls as r^-6, and specific force constants for #' covalent and intra-residue atom pairs. See also \code{\link{load.enmff}} #' for other force field options. #' #' The \code{outmodes} argument controls the type of output modes. There are #' two standard types of output modes: \sQuote{noh} and \sQuote{calpha}. #' \code{outmodes='noh'} invokes regular all-atom based ENM-NMA. When #' \code{outmodes='calpha'}, an effective Hessian with respect to all C-alpha #' atoms will be first calculated using the same formula as in Hinsen et al. #' NMA is then performed on this effective C-alpha based Hessian. In addition, #' users can provide their own atom selection (see \code{\link{atom.select}}) #' as the value of \code{outmodes} for customized output modes generation. #' #' When \code{reduced=TRUE}, only a selection of all heavy atoms is used #' to build the ENM. More specifically, three to five atoms per residue #' constitute the model. Here the N, CA, C atoms represent the protein #' backbone, and zero to two selected side chain atoms represent the side chain #' (selected based on side chain size and the distance to CA). This #' coarse-grained ENM has significantly improved computational efficiency and #' similar prediction accuracy with respect to the all-atom ENM. #' #' When \code{rtb=TRUE}, rotation-translation block (RTB) based approximate #' modes will be calculated. In this method, each residue is assumed to be a #' rigid body (or \sQuote{block}) that has only rotational and translational #' degrees of freedom. Intra-residue deformation is thus ignored. #' (See Durand et al 1994 and Tama et al. 2000 for more details). N residues per #' block is also supported, where N=1, 2, 3, etc. (See argument \code{nmer}). #' The RTB method has significantly improved computational efficiency and #' similar prediction accuracy with respect to the all-atom ENM. #' #' By default the function will diagonalize the mass-weighted Hessian matrix. #' The resulting mode vectors are moreover scaled by the thermal fluctuation #' amplitudes. #' #' @param pdb an object of class \code{pdb} as obtained from function #' \code{\link{read.pdb}}. #' @param pfc.fun customized pair force constant (\sQuote{pfc}) function. The #' provided function should take a vector of distances as an argument to #' return a vector of force constants. If NULL, the default function #' \sQuote{aaenm2} will be employed. (See details below). #' @param mass logical, if TRUE the Hessian will be mass-weighted. #' @param temp numerical, temperature for which the amplitudes for scaling the #' atomic displacement vectors are calculated. Set \sQuote{temp=NULL} to #' avoid scaling. #' @param keep numerical, final number of modes to be stored. Note that all #' subsequent analyses are limited to this subset of modes. This option is #' useful for very large structures and cases where memory may be limited. #' @param hessian hessian matrix as obtained from \code{\link{build.hessian}}. #' For internal purposes and generally not intended for public use. #' @param outmodes either a character (\sQuote{calpha} or \sQuote{noh}) or atom #' indices as obtained from \code{\link{atom.select}} specifying the atoms to #' include in the resulting mode object. (See details below). #' @param rm.wat logical, if TRUE water molecules will be removed before #' calculation. #' @param reduced logical, if TRUE the coarse-grained (\sQuote{4-bead}) ENM will #' be employed. (See details below). #' @param rtb logical, if TRUE the rotation-translation block based #' approximate modes will be calculated. (See details below). #' @param nmer numerical, defines the number of residues per block (used only #' when \code{rtb=TRUE}). #' @param ... additional arguments to \code{\link{build.hessian}} and #' \code{\link{aa2mass}}. One useful option here for dealing with #' unconventional residues is \sQuote{mass.custom}, see the #' \code{\link{aa2mass}} function for details. #' #' @return Returns an object of class \sQuote{nma} with the following #' components: #' \item{modes}{ numeric matrix with columns containing the normal mode #' vectors. Mode vectors are converted to unweighted Cartesian #' coordinates when \code{mass=TRUE}. Note that the 6 first trivial #' eigenvectos appear in columns one to six. } #' \item{frequencies}{ numeric vector containing the vibrational #' frequencies corresponding to each mode (for \code{mass=TRUE}). } #' \item{force.constants}{ numeric vector containing the force constants #' corresponding to each mode (for \code{mass=FALSE)}). } #' \item{fluctuations}{ numeric vector of atomic fluctuations. } #' \item{U}{ numeric matrix with columns containing the raw #' eigenvectors. Equals to the \code{modes} component when #' \code{mass=FALSE} and \code{temp=NULL}. } #' \item{L}{ numeric vector containing the raw eigenvalues. } #' \item{xyz}{ numeric matrix of class \code{xyz} containing the #' Cartesian coordinates in which the calculation was performed. } #' \item{mass}{ numeric vector containing the residue masses used for the #' mass-weighting. } #' \item{temp}{ numerical, temperature for which the amplitudes for #' scaling the atomic displacement vectors are calculated. } #' \item{triv.modes}{ number of trivial modes. } #' \item{natoms}{ number of C-alpha atoms. } #' \item{call}{ the matched call. } #' #' @seealso #' \code{\link{nma.pdb}} for C-alpha based NMA, \code{\link{aanma.pdbs}} for #' ensemble all-atom NMA, \code{\link{load.enmff}} for available ENM force #' fields, and \code{\link{fluct.nma}}, \code{\link{mktrj.nma}}, and #' \code{\link{dccm.nma}} for various post-NMA calculations. #' #' @author Lars Skjaerven & Xin-Qiu Yao #' #' @references #' Hinsen, K. et al. (2000) \emph{Chem. Phys.} \bold{261}, 25. #' Durand, P. et al. (1994) \emph{Biopolymers} \bold{34}, 759. #' Tama, F. et al. (2000) \emph{Proteins} \bold{41}, 1. #' #' @examples #' \dontrun{ #' # All-atom NMA takes relatively long time - Don't run by default. #' #' ## Fetch stucture #' pdb <- read.pdb( system.file("examples/1hel.pdb", package="bio3d") ) #' #' ## Calculate all-atom normal modes #' modes.aa <- aanma(pdb, outmodes='noh') #' #' ## Calculate all-atom normal modes with RTB approximation #' modes.aa.rtb <- aanma(pdb, outmodes='noh', rtb=TRUE) #' #' ## Compare the two modes #' rmsip(modes.aa, modes.aa.rtb) #' #' ## Calculate C-alpha normal modes. #' modes <- aanma(pdb) #' #' ## Calculate C-alpha normal modes with reduced ENM. #' modes.cg <- aanma(pdb, reduced=TRUE) #' #' ## Calculate C-alpha normal modes with RTB approximation #' modes.rtb <- aanma(pdb, rtb=TRUE) #' #' ## Compare modes #' rmsip(modes, modes.cg) #' rmsip(modes, modes.rtb) #' #' ## Print modes #' print(modes) #' #' ## Plot modes #' plot(modes) #' #' ## Visualize modes #' #m7 <- mktrj.nma(modes, mode=7, file="mode_7.pdb", pdb=pdb) #' } "aanma.pdb" <- function(pdb, pfc.fun=NULL, mass=TRUE, temp=300.0, keep=NULL, hessian=NULL, outmodes='calpha', rm.wat=TRUE, reduced=FALSE, rtb=FALSE, nmer=1, ... ) { ## Log the call cl <- match.call() if(!is.select(outmodes) && !outmodes %in% c("calpha", "noh")) stop("outmodes must be 'calpha', 'noh', or an atom selection by 'atom.select()'") if(!is.pdb(pdb)) stop("please provide a 'pdb' object as obtained from 'read.pdb()'") ## store the original input PDB pdb0 <- pdb ## Define force field if (is.null(pfc.fun)) { pfc.fun <- load.enmff("aaenm2") } else { ## Use customized force field if(!is.function(pfc.fun)) stop("'pfc.fun' must be a function") } ## Parse additional arguments args <- .nma.args(pfc.fun=pfc.fun, ...) ## check and prepare input PDB if(!is.null(hessian)) { pdb.in <- pdb dims <- dim(hessian) if(dims[1]!=dims[2] | dims[1]!=length(pdb.in$xyz)) stop("dimension mismatch") } else { if(rm.wat) pdb <- trim.pdb(pdb, "notwater", verbose=FALSE) pdb.in <- trim.pdb(pdb, "noh", verbose=FALSE) lig.inds <- atom.select(pdb.in, "ligand") if(length(lig.inds$atom)>0) { ligs <- paste(unique(pdb.in$atom$resid[ lig.inds$atom ]), sep=", ") warning(paste("ligands", paste(ligs, collapse=", "), "included in normal modes calculation")) } } ## reduced aaENM if(reduced) { pdb.in <- .nma.reduce.pdb(pdb.in) } ## Indices for effective hessian ## (selection, calphas, or all (noh) atoms) if(!is.select(outmodes)) { if(outmodes=="calpha") { outmodes <- atom.select(pdb0, "calpha") } else if(outmodes=="noh") { outmodes <- atom.select(pdb0, "noh") } } if(is.select(outmodes)) { ## since pdb might have changed, we need to re-select 'outmodes' ## outmodes points to original input 'pdb' object ## inc.inds points to modified 'pdb.in' object inc.inds <- .match.sel(pdb0, pdb.in, outmodes) pdb.out <- trim(pdb.in, inc.inds) } natoms.in <- nrow(pdb.in$atom) natoms.out <- nrow(pdb.out$atom) if (natoms.in<3 | natoms.out<3) stop("aanma: insufficient number of atoms") ## Masses for weighting the hessian ## Note that mass weighting is done in rtb() for rtb=TRUE, ## and in .nma.mwhessian() when rtb=FALSE if (mass) { masses.in <- atom2mass(pdb.in) ## for residue mass resids <- paste(pdb.in$atom$resno, pdb.in$atom$chain, pdb.in$atom$insert, sep="_") ## group masses if outmodes contains only one atom per residue if(!any(duplicated(resids[ inc.inds$atom ]))) { masses.out <- unlist(lapply(split(masses.in, resids), sum)) masses.out <- masses.out[ resids[ inc.inds$atom ] ] } ## else, use indivdual atom masses else { if(length(resids[ inc.inds$atom]) == length(masses.in)) { masses.out <- masses.in } else { warning("mass weighting could not be grouped by residues") masses.out <- masses.in[ inc.inds$atom ] } } } else { ## No mass-weighting masses.out <- NULL; } ## build full hessian H <- .nma.hess(pdb.in$xyz, pfc.fun=pfc.fun, args=args, hessian=hessian, pdb=pdb.in) ## extract effective hessian and diagonalize if(rtb) { ## effective hessian H <- .nma.trim.hessian.rtb(H, inc.inds=inc.inds, pdb=pdb.in, nmer=nmer) ## mass weighting + diagonalize using RTB ei <- rtb(H, pdb=pdb.out, mass=masses.out, nmer=nmer) } else { ## effective hessian H <- .nma.trim.hessian(H, inc.inds=inc.inds) ## mass weight hessian if(!is.null(masses.out)) H <- .nma.mwhessian(H, masses=masses.out) ## diagaonalize and obtain eigenvectors ei <- .nma.diag(H) } ## make NMA object m <- .nma.finalize(ei, xyz=pdb.out$xyz, temp=temp, masses=masses.out, natoms=natoms.out, keep=keep, call=cl) return(m) } bio3d/R/write.ncdf.R0000644000176200001440000000730514046015221013641 0ustar liggesusers`write.ncdf` <- function(x, trjfile="R.ncdf", cell=NULL){ ##- Load ncdf4 package oops <- requireNamespace("ncdf4", quietly = TRUE) if(!oops) stop("Please install the ncdf4 package from CRAN") ## Error checking if(!is.matrix(x)) stop("input x should be a natom by nframe numeric matrix of coordinates") if(!is.null(cell)) { if(!is.matrix(cell)) stop("input cell should be a 6 by nframe numeric matrix") } nframe <- nrow(x) natom <- ncol(x)/3 ## Define dimensions frame <- ncdf4::ncdim_def(name="frame", units="", vals=c(1:nframe), unlim=TRUE, create_dimvar=FALSE) spatial <- ncdf4::ncdim_def(name="spatial", units="", vals=1:3, #c(1:3),#"xyz", unlim=FALSE, create_dimvar=TRUE) atom <- ncdf4::ncdim_def(name="atom", units="", vals=c(1:natom), unlim=FALSE, create_dimvar=FALSE) if(!is.null(cell)) { label <- ncdf4::ncdim_def(name="label", units="", vals=1:5, unlim=FALSE, create_dimvar=FALSE) cell_spatial <- ncdf4::ncdim_def(name="cell_spatial", units="", vals=1:3, unlim=FALSE, create_dimvar=TRUE) cell_angular <- ncdf4::ncdim_def(name="cell_angular", units="", vals=1:3, unlim=FALSE, create_dimvar=TRUE) } ## label <- dim.def.ncdf(name="label", units="", vals=1:5, ##??? ## unlim=FALSE, create_dimvar=FALSE) ## cells <- dim.def.ncdf(name="cell_spatial", units="", vals=1:3,# "abc", ## unlim=FALSE, create_dimvar=TRUE) ## cella <- dim.def.ncdf(name="cell_angular", units="", vals=1:3, ## #vals=c("alpha", "beta", "gamma"), ## unlim=FALSE, create_dimvar=TRUE) ## Define variables time <- ncdf4::ncvar_def(name="time", units="picosecond", dim=frame, missval=1e+30, prec="float") #"single" float coor <- ncdf4::ncvar_def(name="coordinates", units="angstrom", missval=1e+30, dim=list(spatial,atom,frame), prec="float")#"single" float if(!is.null(cell)) { cell_lengths <- ncdf4::ncvar_def(name="cell_lengths", units="angstrom", missval=1e+30, dim=list(cell_spatial, frame), prec="double") cell_angles <- ncdf4::ncvar_def(name="cell_angles", units="degree", missval=1e+30, dim=list(cell_angular, frame), prec="double") } ## cell.len <- var.def.ncdf(name="cell_lengths", units="angstrom", missval=1e+30, ## dim=list(cells,frame), prec="double") ## cell.ang <- var.def.ncdf(name="cell_angles", units="degrees", missval=1e+30, ## dim=list(cella,frame), prec="double") ## Create the file if(!is.null(cell)) { ncw <- ncdf4::nc_create( trjfile, list(time, coor, cell_lengths, cell_angles)) } else { ncw <- ncdf4::nc_create( trjfile, list(time, coor))#, cell.len, cell.ang) ) } ## Write data to file if(is.null(rownames(x))) ncdf4::ncvar_put(ncw, time, c(1:nframe), start=1, count=nframe) else ncdf4::ncvar_put(ncw, time, as.numeric(rownames(x)), start=1, count=nframe) ncdf4::ncvar_put( ncw, coor, t(x), start=c(1,1,1), count=c(3,natom,nframe)) if(!is.null(cell)) { ncdf4::ncvar_put( ncw, cell_lengths, t(cell[,1:3]), start=c(1,1), count=c(3,nframe)) ncdf4::ncvar_put( ncw, cell_angles, t(cell[,4:6]), start=c(1,1), count=c(3,nframe)) } ## Define Required Attributes ncdf4::ncatt_put(ncw, varid=0, attname="Conventions", attval="AMBER") ncdf4::ncatt_put(ncw, varid=0, attname="ConventionVersion", attval="1.0") ncdf4::ncatt_put(ncw, varid=0, attname="program",attval="bio3d") ncdf4::ncatt_put(ncw, varid=0, attname="programVersion", attval="1.2") null <- ncdf4::nc_close(ncw) } bio3d/R/fluct.nma.R0000644000176200001440000000207414046015221013463 0ustar liggesusers"fluct.nma" <- function(nma, mode.inds=NULL) { kb <- 0.00831447086363271 pi <- 3.14159265359 if(!"nma" %in% class(nma)) stop("fluct.nma: must supply 'nma' object, i.e. from 'nma'") if("VibrationalModes" %in% class(nma)) mass <- TRUE else mass <- FALSE if(is.null(mode.inds)) mode.inds <- seq(nma$triv.modes+1, length(nma$L)) if(min(mode.inds)<=nma$triv.modes) stop("'mode.inds' should not contain indices to trivial modes") f <- apply(nma$U, 2, function(x) { rowSums(matrix(x, ncol=3, byrow=TRUE)**2) }) if(mass) freq <- nma$frequencies**2 else freq <- nma$force.constants for ( i in mode.inds ) { f[,i] <- f[,i] / freq[i] } if(length(mode.inds)>1) f <- rowSums(f[,mode.inds]) else f <- f[,mode.inds] if(mass) { f <- f / nma$mass s <- 1/(2*pi)**2 if(!is.null(nma$temp)) s <- s*kb*nma$temp f <- f*s } else { if(!is.null(nma$temp)) f <- f*kb*nma$temp } return(f) } bio3d/R/read.prmtop.R0000644000176200001440000000101714046015221014023 0ustar liggesusers read.prmtop <- function(file) { cl <- match.call() if(missing(file)) { stop("read.pdb: please specify a PDB 'file' for reading") } ##- Check if file exists locally or on-line if(!file.exists(file)) { stop("No input PDB file found: check filename") } ## parse PRMTOP file with cpp function prmtop <- .read_prmtop(file) if(!is.null(prmtop$error)) stop(paste("Could not read", file)) else class(prmtop) <- c("amber", "prmtop") prmtop$call <- cl ## finished return(prmtop) } bio3d/R/dccm.xyz.R0000644000176200001440000001003114046015221013323 0ustar liggesusers`dccm.xyz` <- function(x, reference=NULL, grpby=NULL, method=c("pearson", "lmi"), ncore=1, nseg.scale=1, ... ) { method = match.arg(method) xyz <- x # Parallelized by parallel package (Wed Dec 12 18:36:39 EST 2012) ncore <- setup.ncore(ncore) if(is.null(reference)) { ref = colMeans(xyz) } else { ref = reference } dxyz <- sweep(xyz, 2, ref) covmat <- cov(dxyz) if(!is.null(reference)) { # moment instead of covariance mxyz <- colMeans(dxyz) covmat <- covmat + outer(mxyz, mxyz) } ccmat <- .cov2dccm(covmat, method = method, ncore = ncore) if(is.null(grpby)) { return(ccmat) } else { ##- Group by concetive numbers in 'grpby' if( ncol(xyz) != (length(grpby)*3) ) stop("dimension miss-match in 'xyz' and 'grpby', check lengths") ##- Bounds of 'grpby' numbers inds <- bounds(grpby, dup.inds=TRUE) nres <- nrow(inds) ##- Per-residue matrix m <- matrix(, ncol=nres, nrow=nres) ij <- pairwise(nres) ##- Max (absolute value) per residue for(k in 1 : nrow(ij) ) { m[ij[k,1],ij[k,2]] <- min( ccmat[ (inds[ij[k,1],"start"]:inds[ij[k,1],"end"]), (inds[ij[k,2],"start"]:inds[ij[k,2],"end"])], na.rm=TRUE ) tmax <- max( ccmat[ (inds[ij[k,1],"start"]:inds[ij[k,1],"end"]), (inds[ij[k,2],"start"]:inds[ij[k,2],"end"])], na.rm=TRUE ) if(tmax > abs(m[ij[k,1],ij[k,2]])) m[ij[k,1],ij[k,2]] = tmax } # if( !mask.lower ) m[lower.tri(m)] = t(m)[lower.tri(m)] diag(m) <- 1 class(m)=c("dccm","matrix") return(m) } } # This internal function calculates the N-by-N cross-correlation matrix # directly from a 3N-by-3N variance-covariance matrix. .cov2dccm <- function(vcov, method = c("pearson", "lmi"), ncore = NULL) { method = match.arg(method) ncore = setup.ncore(ncore) if(ncore == 1) mclapply = lapply x <- vcov ccmat = switch(method, pearson = { n <- nrow(x) np <- pairwise(n/3) d <- sqrt(colSums(matrix(diag(x), nrow=3))) ltv <- mclapply(1:nrow(np), function(i) { i1 <- (np[i, 2] - 1) * 3 + 1 i2 <- (np[i, 1] - 1) * 3 + 1 sum(diag(x[i1:(i1+2), i2:(i2+2)]))/ # sum of diagnol of submatrix (d[np[i, 2]] * d[np[i, 1]]) # divided by product of standard deviations } ) ccmat <- matrix(0, n/3, n/3) ccmat[lower.tri(ccmat)] <- unlist(ltv) # make full matrix ccmat <- ccmat + t(ccmat) diag(ccmat) <- 1 ccmat }, lmi = { # rm:r-value matrix cm <- x l <- dim(cm)[1]/3 rm <- matrix(nrow=l, ncol=l) d <- 3 ij <- pairwise(l) # list1: marginal-covariance list1 <- mclapply(1:l, function(i) det(cm[(3*i-2):(3*i), (3*i-2):(3*i)]) ) dm <- unlist(list1) # list2: pair-covariance list2 <- mclapply(1:nrow(ij), function(i) { x <- det(cm[c((3*ij[i,1]-2):(3*ij[i,1]),(3*ij[i,2]-2):(3*ij[i,2])), c((3*ij[i,1]-2):(3*ij[i,1]),(3*ij[i,2]-2):(3*ij[i,2]))]) y <- 1/2 * (log(dm[ij[i,1]]) + log(dm[ij[i,2]]) - log(x)) (1 - exp(-2 * y / d))^(1/2) } ) list2 <- unlist(list2) for (k in 1:nrow(ij)) { rm[ij[k, 1], ij[k, 2]] <- list2[k] } rm[lower.tri(rm)] = t(rm)[lower.tri(rm)] diag(rm) <- 1 rm } ) class(ccmat)=c("dccm","matrix") return(ccmat) } bio3d/R/com.pdb.R0000644000176200001440000000133614046015221013116 0ustar liggesusers"com.pdb" <- function(pdb, inds=NULL, use.mass=TRUE, ... ) { if (missing(pdb)) stop("Please supply an input 'pdb' object, i.e. from 'read.pdb()'") if(!is.pdb(pdb)) stop("Input 'pdb' must be of type 'pdb'") if(is.null(inds)) { xyz <- pdb$xyz at <- pdb$atom[, "elety"] } else { if(!is.select(inds)) stop("provide a select object as obtained from 'atom.select'") if(length(inds$xyz)<3) stop("insufficient atoms in selection") xyz <- pdb$xyz[,inds$xyz] at <- pdb$atom[inds$atom, "elety"] } if(use.mass) { m <- atom2mass(at, ...) } else { m <- NULL } com <- com.xyz(xyz, m) return(com) } bio3d/R/plot.pca.R0000644000176200001440000000304614046015221013314 0ustar liggesusers`plot.pca` <- function(x, pc.axes=NULL, pch=16, col=par("col"), cex=0.8, mar=c(4, 4, 1, 1), ...) { opar <- par(no.readonly=TRUE) par(pty="s", cex=cex, mar=mar) if(is.null(pc.axes)) { ##-- Overview plot has been requested par(mfrow=c(2, 2)) pc.axes <- 1:3 ## Variance per PC for axis label annotation p <- paste0("PC",1:3," (", round((x$L[1:3]/sum(x$L)) * 100, 2),"%)") plot(x$z[,1],x$z[,2], type="p", pch=pch, xlab=p[1], ylab=p[2], col=col, ...) abline(h=0,col="gray",lty=2); abline(v=0,col="gray",lty=2) plot(x$z[,3],x$z[,2], type="p", pch=pch, xlab=p[3], ylab=p[2], col=col,...) abline(h=0,col="gray",lty=2); abline(v=0,col="gray",lty=2) plot(x$z[,1],x$z[,3], type="p", pch=pch, xlab=p[1], ylab=p[3], col=col,... ) abline(h=0,col="gray",lty=2); abline(v=0,col="gray",lty=2) plot.pca.scree(x$L, ...) par(opar) ##- Reset par for subsequent plot to this device } else { ##-- Score plot of an individual PC pair (e.g. 1 vs 2) has been requested if(length(pc.axes) != 2) { stop("Input 'pc.axes' should be NULL (for overview plots) or numeric and of length two (for individual score plot)") } ## Variance for axis labels p <- paste0("PC",pc.axes," (", round((x$L[pc.axes]/sum(x$L)) * 100, 2),"%)") par(cex=cex+0.2) ## Make axis legend text a little larger plot(x$z[,pc.axes[1]],x$z[,pc.axes[2]], type="p", pch=pch, xlab=p[1], ylab=p[2], col=col, ...) abline(h=0,col="gray",lty=2);abline(v=0,col="gray",lty=2) } invisible(x$z[,pc.axes, drop=FALSE]) } bio3d/R/as.xyz.R0000644000176200001440000000035114046015221013024 0ustar liggesusers"as.xyz" <- function(x) { if(is.vector(x)) x = matrix(x, nrow=1) dims <- dim(x) if(!(dims[2L]%%3==0)) warning("number of cartesian coordinates not a multiple of 3") class(x) <- c("xyz", "matrix") return(x) } bio3d/R/RcppExports.R0000644000176200001440000000122314046015221014060 0ustar liggesusers# Generated by using Rcpp::compileAttributes() -> do not edit by hand # Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 .read_cif <- function(filename, maxlines = -1L, multi = FALSE) { .Call('_bio3d_read_cif', PACKAGE = 'bio3d', filename, maxlines, multi) } .read_crd <- function(filename) { .Call('_bio3d_read_crd', PACKAGE = 'bio3d', filename) } .read_pdb <- function(filename, multi = FALSE, hex = FALSE, maxlines = -1L, atoms_only = FALSE) { .Call('_bio3d_read_pdb', PACKAGE = 'bio3d', filename, multi, hex, maxlines, atoms_only) } .read_prmtop <- function(filename) { .Call('_bio3d_read_prmtop', PACKAGE = 'bio3d', filename) } bio3d/R/motif.find.R0000644000176200001440000000037514046015221013633 0ustar liggesusers`motif.find` <- function(motif, sequence) { ## return indices of motif within sequence position <- regexpr( paste(motif, collapse=""), paste(sequence,collapse="")) inds <- c(position):c(position+attr(position, "match.length")-1) return(inds) } bio3d/R/read.pqr.R0000644000176200001440000002003614046015221013306 0ustar liggesusers`read.pqr` <- function (file, maxlines=-1, multi=FALSE, rm.insert=FALSE, rm.alt=TRUE, verbose=TRUE) { if(missing(file)) { stop("read.pqr: please specify a PQR 'file' for reading") } if(!is.numeric(maxlines)) { stop("read.pqr: 'maxlines' must be numeric") } if(!is.logical(multi)) { stop("read.pqr: 'multi' must be logical TRUE/FALSE") } cl <- match.call() ## PDB FORMAT v3.3: colpos, datatype, name, description atom.format <- matrix(c(6, 'character', "type", # type(ATOM) 5, 'numeric', "eleno", # atom_no -1, NA, NA, # (blank) 4, 'character', "elety", # atom_ty 1, 'character', "alt", # alt_loc 4, 'character', "resid", # res_na 1, 'character', "chain", # chain_id 4, 'numeric', "resno", # res_no 1, 'character', "insert", # ins_code -3, NA, NA, # (blank) 8, 'numeric', "x", # x 8, 'numeric', "y", # y 8, 'numeric', "z", # z 8, 'numeric', "o", # o ### 6 for pdb 8, 'numeric', "b", # b ### 6 for pdb -6, NA, NA, # (blank) 4, 'character', "segid", # seg_id 2, 'character', "elesy", # element symbol 2, 'character', "charge" # atom_charge (should be 'numeric'] ), ncol=3, byrow=TRUE, dimnames = list(c(1:19), c("widths","what","name")) ) trim <- function(s) { ##- Remove leading and trailing spaces from character strings s <- sub("^ +", "", s) s <- sub(" +$", "", s) s[(s=="")]<-"" s } split.fields <- function(x) { ##- Split a character string for data.frame fwf reading ## First splits a string 'x' according to 'first' and 'last' ## then re-combines to new string with ";" as separator x <- trim( substring(x, first, last) ) paste(x,collapse=";") } is.character0 <- function(x){length(x)==0 & is.character(x)} ##- Find first and last (substr) positions for each field widths <- as.numeric(atom.format[,"widths"]) # fixed-width spec drop.ind <- (widths < 0) # cols to ignore (i.e. -ve) widths <- abs(widths) # absolute vales for later st <- c(1, 1 + cumsum( widths )) first <- st[-length(st)][!drop.ind] # substr start last <- cumsum( widths )[!drop.ind] # substr end names(first) = na.omit(atom.format[,"name"]) names(last) = names(first) ##- Read 'n' lines of PDB file raw.lines <- readLines(file, n = maxlines) type <- substring(raw.lines, first["type"], last["type"]) ##- Check number of END/ENDMDL records raw.end <- sort(c(which(type == "END"), which(type == "ENDMDL"))) ## Check if we want to store multiple model data if (length(raw.end) > 1) { print("PDB has multiple END/ENDMDL records") if (!multi) { print("multi=FALSE: taking first record only") } else { print("multi=TRUE: 'read.dcd/read.ncdf' will be quicker!") raw.lines.multi <- raw.lines type.multi <- type } raw.lines <- raw.lines[ (1:raw.end[1]) ] type <- type[ (1:raw.end[1]) ] } ##- Check for 'n' smaller than total lines in PDB file if ( length(raw.end) !=1 ) { if (length(raw.lines) == maxlines) { print("You may need to increase 'maxlines'") print("check you have all data in $atom") } } ##- Split input lines by record type raw.header <- raw.lines[type == "HEADER"] raw.seqres <- raw.lines[type == "SEQRES"] raw.helix <- raw.lines[type == "HELIX "] raw.sheet <- raw.lines[type == "SHEET "] raw.atom <- raw.lines[type %in% c("ATOM ","HETATM")] if (verbose) { if (!is.character0(raw.header)) { cat(" ", raw.header, "\n") } } ## Edit from Baoqiang Cao Nov 29, 2009 ## Old version: ## seqres <- unlist(strsplit( trim(substring(raw.seqres,19,80))," +")) ## New version seqres <- unlist(strsplit( trim(substring(raw.seqres,19,80))," +")) if(!is.null(seqres)) { seqres.ch <- substring(raw.seqres, 12, 12) seqres.ln <- substring(raw.seqres, 13, 17) seqres.in <- ( !duplicated(seqres.ch) ) names(seqres) <- rep(seqres.ch[seqres.in], times=seqres.ln[seqres.in]) } ## End Edit from Baoqiang: ##- Secondary structure helix <- list(start = as.numeric(substring(raw.helix,22,25)), end = as.numeric(substring(raw.helix,34,37)), chain = trim(substring(raw.helix,20,20)), type = trim(substring(raw.helix,39,40))) sheet <- list(start = as.numeric(substring(raw.sheet,23,26)), end = as.numeric(substring(raw.sheet,34,37)), chain = trim(substring(raw.sheet,22,22)), sense = trim(substring(raw.sheet,39,40))) ## 2014-04-23 ## Update to use single data.frame for ATOM and HETATM records ## file="2RGF"; multi=TRUE; ## file="./4q21.pdb"; maxlines=-1; multi=FALSE; ## rm.insert=FALSE; rm.alt=TRUE; het2atom=FALSE; verbose=TRUE atom <- read.table(text=sapply(raw.atom, split.fields), stringsAsFactors=FALSE, sep=";", quote='', colClasses=unname(atom.format[!drop.ind,"what"]), col.names=atom.format[!drop.ind,"name"], comment.char="", na.strings="") ##-- End data.frame update ##- Coordinates only object ###xyz.models <- c(t(atom[,c("x","y","z")])) xyz.models <- matrix(as.numeric(c(t(atom[,c("x","y","z")]))), nrow=1) ##- Multi-model coordinate extraction if (length(raw.end) > 1 && multi) { raw.atom <- raw.lines.multi[ type.multi %in% c("ATOM ","HETATM") ] if( (length(raw.atom)/length(raw.end)) ==nrow(atom) ){ ## Only work with models with the same number of atoms) tmp.xyz=( rbind( substr(raw.atom, first["x"],last["x"]), substr(raw.atom, first["y"],last["y"]), substr(raw.atom, first["z"],last["z"]) ) ) ## Extract coords to nrow/frame * ncol/xyz matrix xyz.models <- matrix( as.numeric(tmp.xyz), ncol=nrow(atom)*3, nrow=length(raw.end), byrow=TRUE) rownames(xyz.models) = NULL } else { warning(paste("Unequal number of atoms in multi-model records:", file)) } rm(raw.lines.multi) } rm(raw.lines, raw.atom) ##- Possibly remove 'Alt records' (m[,"alt"] != NA) if (rm.alt) { if ( sum( !is.na(atom[,"alt"]) ) > 0 ) { first.alt <- sort( unique(na.omit(atom[,"alt"])) )[1] cat(paste(" PDB has ALT records, taking",first.alt,"only, rm.alt=TRUE\n")) alt.inds <- which( (atom[,"alt"] != first.alt) ) # take first alt only if(length(alt.inds)>0) { atom <- atom[-alt.inds,] xyz.models <- xyz.models[ ,-atom2xyz(alt.inds), drop=FALSE ] } } } ##- Possibly remove 'Insert records' if (rm.insert) { if ( sum( !is.na(atom[,"insert"]) ) > 0 ) { cat(" PDB has INSERT records, removing, rm.insert=TRUE\n") insert.inds <- which(!is.na(atom[,"insert"])) # rm insert positions atom <- atom[-insert.inds,] xyz.models <- xyz.models[ ,-atom2xyz(insert.inds), drop=FALSE ] } } ##- Vector of Calpha positions ## check for calcium resid and restrict to ATOM records only # calpha = (atom[,"elety"]=="CA") & (atom[,"resid"]!="CA") & (atom[,"type"]=="ATOM") output<-list(atom=atom, #het=atom[atom$type=="HETATM",], helix=helix, sheet=sheet, seqres=seqres, xyz=as.xyz(xyz.models), calpha = NULL, call=cl) class(output) <- c("pdb", "sse") ca.inds <- atom.select.pdb(output, string="calpha", verbose=FALSE) output$calpha <- seq(1, nrow(atom)) %in% ca.inds$atom return(output) } bio3d/R/com.xyz.R0000644000176200001440000000073714046015221013207 0ustar liggesusers"com.xyz" <- function(xyz, mass=NULL, ...) { xyz <- as.xyz(xyz) natoms <- ncol(xyz)/3 if(is.null(mass)) mass <- rep(1, times=natoms) if (natoms != length(mass)) stop("com.xyz: length of input vector 'mass' uequal to number of atoms (ncol(xyz)/3)") com1 <- function(x) { xyz <- matrix(x, ncol=3, byrow=T) com <- colSums(xyz * mass) / sum(mass) return(com) } com <- t(apply(xyz, 1, com1)) colnames(com) <- c("x", "y", "z") return(com) } bio3d/R/seqbind.R0000644000176200001440000000173214046015221013221 0ustar liggesusersseqbind <- function(..., blank = "-") { cl <- match.call() objs <- list(...) are.null <- unlist(lapply(objs, is.null)) objs <- objs[!are.null] if(length(objs)==0) stop("Incompatible input") if(length(objs)==1) return(unlist(objs)) is.fasta <- function(x) return(inherits(x, "fasta")) are.fas <- unlist(lapply(objs, is.fasta)) are.vec <- unlist(lapply(objs, is.vector)) are.mat <- unlist(lapply(objs, is.matrix)) if(!all(are.vec | are.mat | are.fas)) stop("'Can combine only vectors and/or matrices'") objs[are.fas] <- lapply(objs[are.fas], function(x) x$ali) objs[are.vec] <- lapply(objs[are.vec], matrix, nrow = 1) max.col <- max(unlist(lapply(objs, ncol))) extend <- function(x, n, add) cbind(x, matrix(add, nrow=nrow(x), ncol=n-ncol(x))) objs <- lapply(objs, extend, n = max.col, add = blank) objs <- do.call(rbind, objs) out <- as.fasta(objs, id=rownames(objs)) out$call <- cl return(out) } bio3d/R/pca.array.R0000644000176200001440000000323314046015221013452 0ustar liggesusers"pca.array" <- function(x, use.svd=TRUE, rm.gaps=TRUE, ...) { if(!is.array(x)) stop("provide an array of matrices") ## Log the call cl <- match.call() ## Construct the input matrix for PCA x <- t(apply(x, 3, function(y) y[upper.tri(y)])) if (any(!is.finite(x))) { ## Check for GAP positions in input if(rm.gaps) { gapC <- colSums(is.na(x)) == 0 if (sum(gapC) > 1) { x <- x[,gapC] cat(paste("NOTE: Removing", sum(!gapC), "upper triangular gap cells with missing data\n", " retaining", sum(gapC), "upper triangular non-gap cells for analysis.\n")) } else { stop("No non-gap containing cell available for analysis.") } } else { stop( paste(" Infinite or missing values in 'x' input.", "\t Likely solution is to remove gap cells with rm.gaps=TRUE", "\t or remove gap containing matrices from input.", sep="\n") ) } } dx <- dim(x) n <- dx[1]; p <- dx[2] mean <- colMeans(x) if(!use.svd) { ## coverance matrix S <- var(x) ## eigenvectors ("U") & eigenvalues ("L"): [ U'SU=L ] prj <- eigen(S, symmetric = TRUE) L <- prj$values U <- prj$vectors } else { ## S = Q'Q, Q = UDV' Q <- t(t(x) - mean) / sqrt(n-1) prj <- svd(Q) L <- prj$d^2 U <- prj$v } ## fix negative eigenvalues ## (these are very small numbers and should be zero) L[L<0]<-0 sdev <- sqrt(L) ## scores of "xyz" on the pc's [ z=U'[x-x.mean] ] z <- sweep(x,2,mean) %*% (U) class(U)="pca.loadings" out <- list(L=L, U=U, z=z, sdev=sdev, mean=mean, call=cl) class(out)="pca" return(out) } bio3d/R/dssp.pdbs.R0000644000176200001440000000274614046015221013502 0ustar liggesusers"dssp.pdbs" <- function(pdbs, ...) { if(!is.pdbs(pdbs)) stop("provide a pdbs object as obtained from pdbaln()") dots <- list(...) if(any(c("resno", "full") %in% names(dots))) stop("arguments resno and full not allowed in dssp.pdbs()") gaps.res <- gap.inspect(pdbs$ali) sse <- matrix(NA, ncol=ncol(pdbs$resno), nrow=nrow(pdbs$resno)) for ( i in 1:length(pdbs$id) ) { ##- Check for local and/or online PDB file to run dssp on file <- pdbs$id[i] toread <- file.exists(file) if ((substr(file, 1, 4) == "http") | (nchar(file) == 4)) { toread <- TRUE } if (!toread) { stop(paste("Corresponding PDB file could not be found for entry:\n\t-", pdbs$id[i])) } tmp.pdb = read.pdb(pdbs$id[i]) tmp.sse = dssp.pdb(tmp.pdb, resno=FALSE, full=FALSE, ...) ##sse[i, which(gaps.res$bin[i,]==0)] = tmp.sse$sse ##- this old way (line 30) will have problems if alignment contains ## only a portion of the full PDB structure read on line 27 above. ## Thus the edit below uses residue number and chain id from the ## alignment (ali.names) as a reference to populate the sse matrix ## from the PDB dssp result (pdb.names) ali.names <- paste(pdbs$resno[i,], pdbs$chain[i,], sep="_") pdb.names <- paste(tmp.pdb$atom$resno[tmp.pdb$calpha], tmp.pdb$atom$chain[tmp.pdb$calpha], sep="_") names(tmp.sse$sse) <- pdb.names sse[i,] <- tmp.sse$sse[ ali.names ] } return(sse) } bio3d/R/aln2html.R0000644000176200001440000001104314046015221013311 0ustar liggesusers`aln2html` <- function(aln, file = "alignment.html", Entropy = 0.5, append = TRUE, caption.css = "color: gray; font-size: 9pt", caption = "Produced by Bio3D", fontsize = "11pt", bgcolor = TRUE, colorscheme="clustal") { if(is.list(aln)) { x=aln$ali id=aln$id } else { x=aln id=dimnames(x)[[1]] } if(is.null(id)) stop("No $id list component or rownames for the alignment object") back <- ""; bold <- "" #bold <- "font-weight: bold" if (bgcolor) { back <- "background-"; bold <- "" } head <- paste("\n\n \n \n \n", collapse="",sep="" ) body <- paste("