/*
Copyright (c) 2009 The Regents of the University of California.
All rights reserved.
Permission is hereby granted, without written agreement and without
license or royalty fees, to use, copy, modify, and distribute this
software and its documentation for any purpose, provided that the above
copyright notice and the following two paragraphs appear in all copies
of this software.
IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
ENHANCEMENTS, OR MODIFICATIONS..
*/
package org.clothocore.util.blast;
import java.io.DataInputStream;
import java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.net.MalformedURLException;
import java.util.UUID;
import org.clothocore.api.data.NucSeq;
import org.clothocore.util.basic.FileUtils;
import org.clothocore.util.basic.ReaderInputStream;
import org.clothocore.util.xml.XMLParser;
import org.concordia.cs.common.ncbi.qblast.GetCommand;
import org.concordia.cs.common.ncbi.qblast.PutCommand;
import org.concordia.cs.common.ncbi.qblast.Runner;
/**
*
* @author J. Christopher Anderson
*/
public class BlastNCBIQuery {
/**
* Initiate a protein-input blast to get best match
*
* @param protSeq the protein seq to query (in form of MSGQRIV...)
* @param DB the database(s) to query
*/
public BlastNCBIQuery(String protSeq, database DB, BlastRequester myRequester) {
_myQueriedDatabase = DB;
_myRequester = myRequester;
querySeq = protSeq;
queryType = "blastp";
}
/**
* Initiate a nucleotide-input blast to get best match
*
* @param seq the NucSeq to query (in form of ATGACGATGC)
* @param DB the database(s) to query
*/
public BlastNCBIQuery(NucSeq seq, database DB, BlastRequester myRequester) {
_myQueriedDatabase = DB;
_myRequester = myRequester;
querySeq = seq.toString();
switch(_myQueriedDatabase) {
case PDB:
queryType = "blastx";
break;
case SWISSPROT:
queryType = "blastx";
break;
case NR:
queryType = "blastx";
break;
case NRNT:
queryType = "blastn";
break;
default:
queryType = "blastn";
break;
}
}
public void go() {
//Put in the put command for blast
PutCommand put_command = new PutCommand();
put_command.setQuery(querySeq);
put_command.setProgram(queryType);
put_command.setIdentityPrecision(90);
switch(_myQueriedDatabase) {
case PDB:
put_command.setDatabase("pdb");
break;
case NR:
put_command.setDatabase("nr");
break;
case SWISSPROT:
put_command.setDatabase("swissprot");
break;
case NRNT:
System.out.println("nrnt working on " + querySeq);
put_command.setDatabase("nr");
break;
default:
break;
}
put_command.setHitListSize(1);
//formulate the Get returner of data for Blast
GetCommand get_command = new GetCommand() {
@Override
public void parseResults(Reader reader) throws Exception {
returnBlast(reader, queryID);
}
};
get_command.setFormatType("XML");
//Submit the query
Runner runner = new Runner(put_command, get_command);
runner.start();
}
@SuppressWarnings("deprecation")
private void returnBlast(Reader reader, String queryID) {
if(reader==null) {
System.out.println("Error occurred");
return;
}
XMLParser myParser=null;
StringBuffer tempXMLFileStr= new StringBuffer();
ReaderInputStream RIS = new ReaderInputStream(reader);
DataInputStream dis = new DataInputStream(RIS);
String inputLine;
try {
inputLine = dis.readLine();
while (inputLine != null) {
if(inputLine.equals("")) {
break;
}
if(inputLine.startsWith("<?xml")) {
inputLine = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
}
if(inputLine.startsWith("<!DOCTYPE")) {
inputLine = "";
}
tempXMLFileStr.append(inputLine);
tempXMLFileStr.append("\n");
}
dis.close();
} catch (MalformedURLException me) {
System.out.println("MalformedURLException: " + me);
} catch (IOException ioe) {
System.out.println("IOException: " + ioe);
}
String filename = queryID + ".xml";
FileUtils.writeFile(tempXMLFileStr.toString(), filename);
//Read the file and access it in an xmlParser, then close it
File xmlfile = new File(filename);
myParser = new XMLParser(xmlfile, "BlastOutput" );
String scoreString = myParser.getFirstTag("Hsp_score");
if(scoreString.equals("")) {
_wasSuccessful = false;
_myRequester.receiveBlastResults((this));
xmlfile.delete();
return;
}
scoreInt = Integer.parseInt(scoreString);
//From here down is specific to the particular database
switch(_myQueriedDatabase) {
case PDB:
String hitid = myParser.getFirstTag("Hit_id");
String[] pbdArray = hitid.split("\\|");
bestHitID = pbdArray[3];
break;
default:
bestHitID= myParser.getFirstTag("Hit_accession");
break;
}
//If it was a blastx, get the frame etc.
if(queryType.equals("blastx")) {
String frame = myParser.getFirstTag("Hsp_query-frame");
hitFrame = Integer.parseInt(frame);
}
String start = myParser.getFirstTag("Hsp_query-from");
hitStartOnQuery = Integer.parseInt(start)-1;
String end = myParser.getFirstTag("Hsp_query-to");
hitEndOnQuery = Integer.parseInt(end);
start = myParser.getFirstTag("Hsp_hit-from");
hitStartOnHit = Integer.parseInt(start);
end = myParser.getFirstTag("Hsp_hit-to");
hitEndOnHit = Integer.parseInt(end);
System.out.println("Score: " + scoreInt + " Code: " + bestHitID);
myParser = null;
xmlfile.delete();
_wasSuccessful = true;
_myRequester.receiveBlastResults((this));
}
public String getBestHitID() {
return bestHitID;
}
public int getBestScore() {
return scoreInt;
}
public String getQueryUUID() {
return queryID;
}
public database getDatabaseQueried() {
return _myQueriedDatabase;
}
public boolean wasSuccessful() {
return _wasSuccessful;
}
public int getFrame() {
return hitFrame;
}
public int getStartOnQuery() {
return hitStartOnQuery;
}
public int getEndOnQuery() {
return hitEndOnQuery;
}
public int getStartOnHit() {
return hitStartOnHit;
}
public int getEndOnHit() {
return hitEndOnHit;
}
/*-----------------
variables
-----------------*/
final String queryID = UUID.randomUUID().toString();
public enum database {NRNT, SWISSPROT, PDB, NR};
private String querySeq="";
private String queryType="";
private String bestHitID="";
private int scoreInt=0;
private int hitFrame;
private int hitStartOnQuery;
private int hitEndOnQuery;
private int hitStartOnHit;
private int hitEndOnHit;
private database _myQueriedDatabase;
private BlastRequester _myRequester;
private boolean _wasSuccessful;
}