From 0794f6835ef636577d1bb581f423ac937246586b Mon Sep 17 00:00:00 2001 From: "cmzmasek@gmail.com" Date: Tue, 27 Mar 2012 23:42:43 +0000 Subject: [PATCH] in progress --- .../src/org/forester/archaeopteryx/AptxUtil.java | 4 +- .../org/forester/archaeopteryx/Configuration.java | 21 +++-- .../src/org/forester/archaeopteryx/Constants.java | 1 + .../org/forester/archaeopteryx/ControlPanel.java | 26 +++--- .../src/org/forester/archaeopteryx/TreePanel.java | 42 +++++---- .../org/forester/archaeopteryx/tools/Blast.java | 92 ++++++++++++++++++-- 6 files changed, 139 insertions(+), 47 deletions(-) diff --git a/forester/java/src/org/forester/archaeopteryx/AptxUtil.java b/forester/java/src/org/forester/archaeopteryx/AptxUtil.java index 5d8c854..ba95034 100644 --- a/forester/java/src/org/forester/archaeopteryx/AptxUtil.java +++ b/forester/java/src/org/forester/archaeopteryx/AptxUtil.java @@ -678,7 +678,7 @@ public final class AptxUtil { } } - final static void launchWebBrowser( final URI uri, + final public static void launchWebBrowser( final URI uri, final boolean is_applet, final JApplet applet, final String frame_name ) throws IOException { @@ -835,7 +835,7 @@ public final class AptxUtil { } } - final static void showErrorMessage( final Component parent, final String error_msg ) { + final public static void showErrorMessage( final Component parent, final String error_msg ) { printAppletMessage( Constants.PRG_NAME, error_msg ); JOptionPane.showMessageDialog( parent, error_msg, "[" + Constants.PRG_NAME + " " + Constants.VERSION + "] Error", JOptionPane.ERROR_MESSAGE ); diff --git a/forester/java/src/org/forester/archaeopteryx/Configuration.java b/forester/java/src/org/forester/archaeopteryx/Configuration.java index f5532e9..882e1b8 100644 --- a/forester/java/src/org/forester/archaeopteryx/Configuration.java +++ b/forester/java/src/org/forester/archaeopteryx/Configuration.java @@ -133,13 +133,13 @@ public final class Configuration { final static int color_subtree = 5; final static int open_seq_web = 6; final static int open_tax_web = 7; - final static int cut_subtree = 8; - final static int copy_subtree = 9; - final static int paste_subtree = 10; - final static int delete_subtree_or_node = 11; - final static int add_new_node = 12; - final static int edit_node_data = 13; - final static int blast = 14; + final static int blast = 8; + final static int cut_subtree = 9; + final static int copy_subtree = 10; + final static int paste_subtree = 11; + final static int delete_subtree_or_node = 12; + final static int add_new_node = 13; + final static int edit_node_data = 14; final static int sort_descendents = 15; // --------------------------- // Display options for trees @@ -166,9 +166,9 @@ public final class Configuration { final static String clickto_options[][] = { { "Display Node Data", "display" }, { "Collapse/Uncollapse", "display" }, { "Root/Reroot", "display" }, { "Sub/Super Tree", "display" }, { "Swap Descendants", "display" }, { "Colorize Subtree", "display" }, - { "Open Sequence Web", "display" }, { "Open Taxonomy Web", "display" }, { "Cut Subtree", "display" }, + { "Open Sequence Web", "display" }, { "Open Taxonomy Web", "display" }, { "Blast", "display" }, { "Cut Subtree", "display" }, { "Copy Subtree", "display" }, { "Paste Subtree", "display" }, { "Delete Subtree/Node", "display" }, - { "Add New Node", "display" }, { "Edit Node Data", "display" }, { "Blast", "nodisplay" }, + { "Add New Node", "display" }, { "Edit Node Data", "display" }, { "Sort Descendants", "display" } }; // This option is selected in the dropdown int default_clickto = Configuration.display_node_data; @@ -379,6 +379,9 @@ public final class Configuration { else if ( name.equals( "open_tax_web" ) ) { index = Configuration.open_tax_web; } + else if ( name.equals( "blast" ) ) { + index = Configuration.blast; + } else if ( name.equals( "cut_subtree" ) ) { index = Configuration.cut_subtree; } diff --git a/forester/java/src/org/forester/archaeopteryx/Constants.java b/forester/java/src/org/forester/archaeopteryx/Constants.java index 4650f9c..c7f8414 100644 --- a/forester/java/src/org/forester/archaeopteryx/Constants.java +++ b/forester/java/src/org/forester/archaeopteryx/Constants.java @@ -40,6 +40,7 @@ public final class Constants { public final static boolean __RELEASE = false; // TODO remove me public final static boolean __SNAPSHOT_RELEASE = true; // TODO remove me public final static boolean __SYNTH_LF = false; // TODO remove me + public final static boolean ALLOW_DDBJ_BLAST = false; public final static String PRG_NAME = "Archaeopteryx"; final static String VERSION = "0.969 NM"; final static String PRG_DATE = "2012.03.05"; diff --git a/forester/java/src/org/forester/archaeopteryx/ControlPanel.java b/forester/java/src/org/forester/archaeopteryx/ControlPanel.java index 419f2c5..ad88f3b 100644 --- a/forester/java/src/org/forester/archaeopteryx/ControlPanel.java +++ b/forester/java/src/org/forester/archaeopteryx/ControlPanel.java @@ -1162,9 +1162,9 @@ final class ControlPanel extends JPanel implements ActionListener { setActionWhenNodeClicked( NodeClickAction.SORT_DESCENDENTS ); } else if ( action == _blast_item ) { - if ( !Constants.__RELEASE && !Constants.__SNAPSHOT_RELEASE ) { + setActionWhenNodeClicked( NodeClickAction.BLAST ); - } + } else if ( action == _open_tax_web_item ) { setActionWhenNodeClicked( NodeClickAction.OPEN_TAX_WEB ); @@ -1368,6 +1368,15 @@ final class ControlPanel extends JPanel implements ActionListener { } cb_index++; } + if ( _configuration.doDisplayClickToOption( Configuration.blast ) ) { + _blast_item = cb_index; + addClickToOption( Configuration.blast, _configuration.getClickToTitle( Configuration.blast ) ); + if ( default_option == Configuration.blast ) { + selected_index = cb_index; + } + cb_index++; + } + if ( getOptions().isEditable() ) { if ( _configuration.doDisplayClickToOption( Configuration.cut_subtree ) ) { _cut_subtree_item = cb_index; @@ -1422,16 +1431,9 @@ final class ControlPanel extends JPanel implements ActionListener { } cb_index++; } - if ( !Constants.__RELEASE && !Constants.__SNAPSHOT_RELEASE ) { - if ( _configuration.doDisplayClickToOption( Configuration.blast ) ) { - _blast_item = cb_index; - addClickToOption( Configuration.blast, _configuration.getClickToTitle( Configuration.blast ) ); - if ( default_option == Configuration.blast ) { - selected_index = cb_index; - } - cb_index++; - } - } + + + } // Set default selection and its action _click_to_combobox.setSelectedIndex( selected_index ); diff --git a/forester/java/src/org/forester/archaeopteryx/TreePanel.java b/forester/java/src/org/forester/archaeopteryx/TreePanel.java index 52d4bfb..36afa04 100644 --- a/forester/java/src/org/forester/archaeopteryx/TreePanel.java +++ b/forester/java/src/org/forester/archaeopteryx/TreePanel.java @@ -346,10 +346,10 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } final public void actionPerformed( final ActionEvent e ) { - int index; + boolean done = false; final JMenuItem node_popup_menu_item = ( JMenuItem ) e.getSource(); - for( index = 0; ( index < _node_popup_menu_items.length ) && !done; index++ ) { + for( int index = 0; ( index < _node_popup_menu_items.length ) && !done; index++ ) { // NOTE: index corresponds to the indices of click-to options // in the control panel. if ( node_popup_menu_item == _node_popup_menu_items[ index ] ) { @@ -465,29 +465,34 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return; } if ( node.getNodeData().isHasSequence() ) { - String name = ""; - if ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getName() ) ) { - name = node.getNodeData().getSequence().getName(); - } - else if ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getSymbol() ) ) { - name = node.getNodeData().getSequence().getSymbol(); - } - else if ( node.getNodeData().getSequence().getAccession() != null ) { - name = node.getNodeData().getSequence().getAccession().getValue(); - } - if ( !ForesterUtil.isEmpty( name ) ) { + String query = Blast.obtainQueryForBlast( node ); + if ( !ForesterUtil.isEmpty( query ) ) { + + JApplet applet = null; + if ( isApplet() ) { + applet = obtainApplet(); + } + Blast.NcbiBlastWeb( query, applet, this ); + + + + + if ( Constants.ALLOW_DDBJ_BLAST ) { try { - System.out.println( "trying: " + name ); + System.out.println( "trying: " + query ); final Blast s = new Blast(); - s.go( name ); + s.ddbjBlast( query ); } catch ( final Exception e ) { e.printStackTrace(); } + } } } } + + final void calcMaxDepth() { if ( _phylogeny != null ) { _circ_max_depth = PhylogenyMethods.calculateMaxDepth( _phylogeny ); @@ -1444,7 +1449,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return ( node.getNodeData().isHasSequence() && ( ( ( node.getNodeData().getSequence().getAccession() != null ) && !ForesterUtil .isEmpty( node.getNodeData().getSequence().getAccession().getValue() ) ) || !ForesterUtil.isEmpty( node.getNodeData().getSequence().getName() ) || !ForesterUtil.isEmpty( node - .getNodeData().getSequence().getSymbol() ) ) ); + .getNodeData().getSequence().getSymbol() ) || !ForesterUtil.isEmpty( node + .getNodeData().getSequence().getMolecularSequence() )) ); } final boolean isCanCollapse() { @@ -1743,9 +1749,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _node_popup_menu_items[ i ].setEnabled( isCanOpenTaxWeb( node ) ); } else if ( title.equals( Configuration.clickto_options[ Configuration.blast ][ 0 ] ) ) { - if ( Constants.__RELEASE || Constants.__SNAPSHOT_RELEASE ) { - continue; - } + _node_popup_menu_items[ i ].setEnabled( isCanBlast( node ) ); } else if ( title.equals( Configuration.clickto_options[ Configuration.delete_subtree_or_node ][ 0 ] ) ) { diff --git a/forester/java/src/org/forester/archaeopteryx/tools/Blast.java b/forester/java/src/org/forester/archaeopteryx/tools/Blast.java index 5bfc31e..d3ea4cc 100644 --- a/forester/java/src/org/forester/archaeopteryx/tools/Blast.java +++ b/forester/java/src/org/forester/archaeopteryx/tools/Blast.java @@ -25,30 +25,112 @@ package org.forester.archaeopteryx.tools; + import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; import java.util.Arrays; import java.util.Enumeration; import java.util.Hashtable; import java.util.Vector; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.swing.JApplet; +import org.forester.archaeopteryx.AptxUtil; +import org.forester.archaeopteryx.TreePanel; +import org.forester.phylogeny.PhylogenyNode; +import org.forester.util.ForesterUtil; import org.forester.ws.wabi.RestUtil; public class Blast { + final static Pattern identifier_pattern_1 = Pattern.compile ("^([A-Za-z]{2,5})[|=:]([0-9A-Za-z\\.]{4,40})\\s*$"); + final static Pattern identifier_pattern_2 = Pattern.compile ("^([A-Za-z]{2,5})[|=:]([0-9A-Za-z\\.]{4,40})[|,; ].*$"); + public Blast() { } - public void go( final String geneName ) { + + public static void NcbiBlastWeb( String query, JApplet applet, TreePanel p ) { + + //http://www.ncbi.nlm.nih.gov/blast/Blast.cgi?CMD=Web&PAGE=Proteins&DATABASE=swissprot&QUERY=gi|163848401 + + + StringBuilder uri_str = new StringBuilder(); + uri_str.append( "http://www.ncbi.nlm.nih.gov/blast/Blast.cgi?CMD=Web&DATABASE=nr&PAGE=Proteins&QUERY=" ); + uri_str.append( query ); + try { + + AptxUtil.launchWebBrowser( new URI( uri_str.toString() ), applet != null, applet, "_aptx_blast" ); + } + catch ( final IOException e ) { + AptxUtil.showErrorMessage( p, e.toString() ); + e.printStackTrace(); + } + catch ( final URISyntaxException e ) { + AptxUtil.showErrorMessage( p, e.toString() ); + e.printStackTrace(); + } + + } + public static String obtainQueryForBlast( final PhylogenyNode node ) { + String query = ""; + if ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getMolecularSequence() ) ) { + query = node.getNodeData().getSequence().getMolecularSequence(); + } + else if ( node.getNodeData().getSequence().getAccession() != null && !ForesterUtil.isEmpty( node.getNodeData().getSequence().getAccession().getValue() ) ) { + if ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getAccession().getSource() ) ) { + query = node.getNodeData().getSequence().getAccession().getSource() + "%7C"; + } + query += node.getNodeData().getSequence().getAccession().getValue(); + } + else if ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getName() ) ) { + String name = node.getNodeData().getSequence().getName(); + final Matcher matcher1 = identifier_pattern_1.matcher( name ); + final Matcher matcher2 = identifier_pattern_2.matcher( name ); + String group1 = ""; + String group2 = ""; + + if ( matcher1.matches() ) { + group1 = matcher1.group( 1 ); + group2 = matcher1.group( 2 ); + System.out.println( "1 1=" + group1 ); + + System.out.println( "1 2=" + group2 ); + } + if ( matcher2.matches() ) { + group1 = matcher2.group( 1 ); + group2 = matcher2.group( 2 ); + System.out.println( "2 1=" + group1 ); + + System.out.println( "2 2=" + group2 ); + } + if (!ForesterUtil.isEmpty( group1 ) && !ForesterUtil.isEmpty( group2 )) { + query = group1 + "%7C" + group2; + } + + } + + + System.out.println( query ); + + return query; + } + + + public void ddbjBlast( final String geneName ) { // Retrieve accession number list which has specified gene name from searchByXMLPath of ARSA. Please click here for details of ARSA. /*target: Sequence length is between 300bp and 1000bp. Feature key is CDS. Gene qualifire is same as specified gene name.*/ String queryPath = "/ENTRY/DDBJ/division=='HUM' AND (/ENTRY/DDBJ/length>=300 AND " - + "/ENTRY/DDBJ/length<=1000) "; + + "/ENTRY/DDBJ/length<=1000) "; queryPath += "AND (/ENTRY/DDBJ/feature-table/feature{/f_key = 'CDS' AND "; queryPath += "/f_quals/qualifier{/q_name = 'gene' AND /q_value=='" + geneName + "'}})"; String query = "service=ARSA&method=searchByXMLPath&queryPath=" + queryPath - + "&returnPath=/ENTRY/DDBJ/primary-accession&offset=1&count=100"; + + "&returnPath=/ENTRY/DDBJ/primary-accession&offset=1&count=100"; //Execute ARSA String arsaResult = null; try { @@ -82,7 +164,7 @@ public class Blast { //Execute blastn by using searchParam of Blast with step2's sequence. Specified option is -e 0.0001 -m 8 -b 50 -v 50. It means "Extract top 50 hit which E-value is more than 0.0001.". The reference databases are specified as follows. ddbjpri(primates) ddbjrod(rodents) ddbjmam(mammals) ddbjvrt(vertebrates ) ddbjinv(invertebrates). //Execute blastn with step3's sequence query = "service=Blast&method=searchParam&program=blastn&database=ddbjpri ddbjrod ddbjmam ddbjvrt " - + "ddbjinv&query=" + dnaSeq + "¶m=-m 8 -b 50 -v 50 -e 0.0001"; + + "ddbjinv&query=" + dnaSeq + "¶m=-m 8 -b 50 -v 50 -e 0.0001"; String blastResult = null; try { blastResult = RestUtil.getResult( query ); @@ -108,7 +190,7 @@ public class Blast { for( int i = 0; i < parsedBlastResult.size(); i++ ) { final String[] parsed = parsedBlastResult.elementAt( i ); query = "service=ARSA&method=searchByXMLPath&queryPath=/ENTRY/DDBJ/primary-accession=='" + parsed[ 0 ] - + "'&returnPath=/ENTRY/DDBJ/organism&offset=1&count=100"; + + "'&returnPath=/ENTRY/DDBJ/organism&offset=1&count=100"; String organism = null; try { organism = RestUtil.getResult( query ); -- 1.7.10.2