From 9e77d948e96ffc3777d86e20d86d8b2f0cda957a Mon Sep 17 00:00:00 2001 From: hyginn Date: Tue, 29 Sep 2020 14:12:11 +1000 Subject: [PATCH] return ChimeraX response invisibly and provide example of using the data for a plot --- .utilities.R | 33 ++++++++++++++------------------- RPR-ChimeraX_remote.R | 42 +++++++++++++++++++++++++++++------------- 2 files changed, 43 insertions(+), 32 deletions(-) diff --git a/.utilities.R b/.utilities.R index 2ec6e0f..d05fb13 100644 --- a/.utilities.R +++ b/.utilities.R @@ -20,7 +20,7 @@ #TOC> ========================================================================== -#TOC> +#TOC> #TOC> Section Title Line #TOC> ----------------------------------------------------------- #TOC> 1 SCRIPTS TO SOURCE 51 @@ -44,7 +44,7 @@ #TOC> 5.03 selectPDBrep() 560 #TOC> 5.04 selectChi2() 596 #TOC> 5.05 selectENSP() 609 -#TOC> +#TOC> #TOC> ========================================================================== @@ -481,36 +481,35 @@ H <- function(x, N) { # == 4.11 CX() (ChimeraX remote command) =================================== -CX <- function(cmd, port = CXPORT, quietly = FALSE, capture = FALSE) { +CX <- function(cmd, port = CXPORT, quietly = FALSE) { # send a command to ChimeraX listening on port CXPORT via its REST # interface. # Parameters: # cmd char a ChireaX commandline command # port int the portnumber on which ChimeraX is listening # quietly logical if FALSE, cat() the contents of the response - # capture logical if TRUE, return the contents of the response # - # Value: the reply by ChineraX, or invisible(NULL) + # Value: the reply by ChimeraX, invisibly. CXREST <- sprintf("http://127.0.0.1:%s/run?", CXPORT) cmd <- gsub("(^\\s+)|(\\s+$)", "", cmd) # trim whitespace # percent encode reserved characters - cmd <- gsub("%", "%25", cmd) # % - cmd <- gsub("#", "%23", cmd) # # - cmd <- gsub("/", "%2F", cmd) # / - cmd <- gsub(":", "%3A", cmd) # : - cmd <- gsub("@", "%40", cmd) # @ - cmd <- gsub(",", "%2C", cmd) # , + cmd <- gsub("%", "%25", cmd) # % + cmd <- gsub("#", "%23", cmd) # # + cmd <- gsub("/", "%2F", cmd) # / + cmd <- gsub(":", "%3A", cmd) # : + cmd <- gsub("@", "%40", cmd) # @ + cmd <- gsub(",", "%2C", cmd) # , cmd <- gsub("\\*", "%2A", cmd) # * cmd <- gsub("\\?", "%3F", cmd) # ? - cmd <- gsub("!", "%21", cmd) # ! - cmd <- gsub("=", "%3D", cmd) # = + cmd <- gsub("!", "%21", cmd) # ! + cmd <- gsub("=", "%3D", cmd) # = cmd <- gsub("\\(", "%28", cmd) # ( cmd <- gsub("\\)", "%29", cmd) # ) cmd <- gsub("\\[", "%5B", cmd) # [ cmd <- gsub("\\]", "%5D", cmd) # ] - cmd <- gsub("&", "%26", cmd) # & + cmd <- gsub("&", "%26", cmd) # & cmd <- gsub("\\+", "%2B", cmd) # + cmd <- gsub("\\s+", "+", cmd) # whitespace to "+" @@ -533,11 +532,7 @@ CX <- function(cmd, port = CXPORT, quietly = FALSE, capture = FALSE) { cat(reply) } - if (capture == TRUE) { - return(reply) - } else { - return(invisible(NULL)) - } + return(invisible(reply)) } diff --git a/RPR-ChimeraX_remote.R b/RPR-ChimeraX_remote.R index fb16601..cdb8ec8 100644 --- a/RPR-ChimeraX_remote.R +++ b/RPR-ChimeraX_remote.R @@ -32,7 +32,7 @@ #TOC> 1 ChimeraX REMOTE SCRIPTING 40 #TOC> 1.1 Defining a Port 58 #TOC> 1.2 Open ChimeraX 80 -#TOC> 2 WORKED EXAMPLE: SUPERPOSITION 100 +#TOC> 2 WORKED EXAMPLE: SUPERPOSITION 112 #TOC> #TOC> ========================================================================== @@ -96,6 +96,18 @@ CX("camera sbs") CX("lighting soft") CX("color sequential #1 & protein target abc palette powderblue:orchid:white") +# The command echos Chimera's response if the parameter "quietly" is +# FALSE (default), and we can silence output with quietly = TRUE : +CX("info models #1 attribute num_residues") +CX("info models #1 attribute num_residues", quietly = TRUE) + +# Either way, the command also returns Chimera's responses "invisibly"; +# i.e. we can use the results by assigning the output to a variable: +hBonds <- CX("hbonds #1 & protein makePseudobonds false log true", quietly=TRUE) +x <- read.table(file = textConnection(hBonds), skip = 9, + blank.lines.skip = TRUE, fill = TRUE) +hist(x[,13], main="H-bonds", xlab="D···A (Å)", ylab="counts", col="#c9dcff") + # = 2 WORKED EXAMPLE: SUPERPOSITION ======================================= @@ -103,31 +115,35 @@ CX("color sequential #1 & protein target abc palette powderblue:orchid:white") # to explore possible DNA binding regions in 1BM8 # The model for 1BM8 is already open as model 1 (#1) -CX("hide #1 cartoons") # hide chain a cartoon representation -CX("open 1DUX") +CX("hide #1 cartoons") # hide model 1 cartoon representation +CX("open 1DUX") # assume this is opened as model #2 CX("hide #2") # hide everything ... -CX("show #2/a,b,c cartoons") # ... and show cartoons of chains a, b (DNA) and c -CX("view #2/c") # re-center the display -CX("select #2/a,b") # select the DNA chains -CX("color sel lightblue") -CX("surface sel enclose sel") # joint surface of both chains +CX("select #2/C") # chain c (protein) +CX("show sel cartoons") # ... and show cartoons of chain c (protein) +CX("color sequential sel target c palette steelblue:darkmagenta") +CX("view #2/C") # re-center the display +CX("cofr #2/C:62@CA") # set pivot to an interface residue +CX("select #2/A,B & nucleic-acid") # chains A, B are the cognate DNA +CX("style sel stick") +CX("show sel target ab") # show atoms/bonds +CX("color sequential #2/A & nucleic-acid target ab palette teal:lightcyan") +CX("color sequential #2/B & nucleic-acid target ab palette teal:lightcyan") +CX("surface sel enclose sel") # compute joint accessible surface of both chains CX("transparency 50") -CX("select #2/c") # select the protein chain -CX("color sequential sel target c palette palegreen:lightblue") +CX("select clear") # Now superimpose the 1BM8 chain onto 1DUX chain C CX("show #1 cartoons") CX("matchmaker #1/A to #2/C pairing ss") # the actual superposition -CX("select clear") # study the general layout, and the position of the 1mb8 secondary structure # elements relative to 1DUX # Let's examine side chain orientations in more detail -CX("hide #2/c cartoons") # hide the 1DUX protein +CX("hide #2/C cartoons") # hide the 1DUX protein # select all residues in 1BM8 that are within 3.5 A of the DNA chains (a, b) -CX("select zone #2/a,b 3.5 #1 & protein residues true") +CX("select zone #2/A,B 3.5 #1 & protein residues true") CX("~select sel & H") # de-select H atoms CX("show sel target ab") CX("size stickRadius 0.4")