from Bio.Blast import NCBIWWW
from Bio.Blast import NCBIXML
from Bio import Fasta
from sys import *
import csv

def searchAndStoreBlastSearch(query, matrix_id, filename):
    # Creates handle to store the results sent by NCBI website
    results_handle = NCBIWWW.qblast("blastp", "swissprot", query, expect=10,
                   descriptions=2000, alignments=2000, hitlist_size=2000,
                   matrix_name=matrix_id)
    # Reads results into memory
    blast_results = results_handle.read()

    # Creates and opens a file in filesystem for writing
    save_file = open(filename, 'w')

    # Store results from memory into the filesystem
    save_file.write(blast_results)

    #Close the file handler
    save_file.close()

def xmlToCSV(xmlFilename, csvFilename, matrix_id):
    # Create file handler
    blast_fileptr=open(xmlFilename)
    # Parse xml file into biopython object
    record=NCBIXML.parse(blast_fileptr).next()
    # Create csv file writer
    csvFileWriter = csv.writer(open(csvFilename,'wb'))
    # Iterate over record alignments
    for alignment in record.alignments:
         # Extract high score pairwise alignment object
         hsp=alignment.hsps[0]
         # Create record vector
         record = [hsp.expect, hsp.score, matrix_id, alignment.accession, alignment.title,]
         # Store record vector into csv file
         csvFileWriter.writerow( record )
    # Close file handler
    blast_fileptr.close()

MatrixName=['PAM70','BLOSUM80']
TableName=['PAM70','BLOSUM80']
FileName=['TestPAM70.xml','TestBLOSUM80.xml']
CsvFileName=['TestPAM70.csv','TestBLOSUM80.csv']

def doIt():
    query_file = open('P00624.fasta')
    fasta = Fasta.Iterator(query_file)
    query = fasta.next()
    query_file.close()
    for i in range(0,len(MatrixName)):
        searchAndStoreBlastSearch(query, MatrixName[i], FileName[i])
        xmlToCSV(FileName[i], CsvFileName[i], MatrixName[i])
