}
}
- 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 {
}
}
- 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 );
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
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;
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;
}
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";
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 );
}
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;
}
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 );
}
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 ] ) {
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 );
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() {
_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 ] ) ) {
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 {
//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 );
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 );