From 13c7ff6e49c760ec282c3bc79094edc57733aaa7 Mon Sep 17 00:00:00 2001 From: carlosp420 Date: Sat, 17 Jan 2015 00:15:57 +0200 Subject: [PATCH] backend blast new almost ready --- voseq/blast_new/utils.py | 46 ++++++++++++++++++++++++++++++++++++++++ voseq/blast_new/views.py | 33 +++++++++++++++++++++++++--- 2 files changed, 76 insertions(+), 3 deletions(-) diff --git a/voseq/blast_new/utils.py b/voseq/blast_new/utils.py index a7d98a75..e63347ff 100644 --- a/voseq/blast_new/utils.py +++ b/voseq/blast_new/utils.py @@ -4,6 +4,7 @@ from Bio import SeqIO from Bio.Seq import Seq from Bio.SeqRecord import SeqRecord +from django.db.models import Q from blast_local.utils import BLAST from public_interface.models import Sequences @@ -47,3 +48,48 @@ def __init__(self, blast_type, name, sequence, gene_codes, mask=None): 'db', 'output_' + uuid.uuid4().hex + '.xml', ) + + def save_seqs_to_file(self): + """ + Query sequences for each gene from our database and save them to local + disk. + + Sets attribute `self.seq_file` containing necessary sequences from our + database. + """ + if self.blast_type == 'new': + self.seq_file = os.path.join(self.cwd, + 'db', + '_'.join(self.gene_codes) + "_seqs.fas", + ) + if self.gene_codes != '': + # Taken from http://stackoverflow.com/a/1239602 + Qr = None + for gene_code in self.gene_codes: + q = Q(gene_code=gene_code) + if Qr: + Qr = Qr | q + else: + Qr = q + queryset = Sequences.objects.filter(Qr) + else: + queryset = Sequences.objects.all() + + my_records = [] + for i in queryset: + id = i.code_id + '|' + i.gene_code + seq = self.strip_question_marks(i.sequences) + if seq != '': + seq_record = SeqRecord(Seq(seq), + id=id) + my_records.append(seq_record) + SeqIO.write(my_records, self.seq_file, "fasta") + + def save_query_to_file(self): + this_id = self.name + seq = self.strip_question_marks(self.sequence) + + if seq != '': + seq_record = SeqRecord(Seq(seq), + id=this_id) + SeqIO.write(seq_record, self.query_file, "fasta") diff --git a/voseq/blast_new/views.py b/voseq/blast_new/views.py index 6369712d..383bca4b 100644 --- a/voseq/blast_new/views.py +++ b/voseq/blast_new/views.py @@ -2,6 +2,7 @@ from django.conf import settings from django.http import HttpResponseRedirect +from .utils import BLASTNew from stats.models import Stats from .forms import BLASTNewForm @@ -24,11 +25,37 @@ def index(request): def results(request): + VERSION = settings.VERSION + try: + STATS = Stats.objects.get(pk=1) + except Stats.DoesNotExist: + STATS = '' + if request.method == 'POST': form = BLASTNewForm(request.POST) + if form.is_valid(): - print(request.POST) - return render(request, - 'blast_new/results.html') + cleaned_data = form.cleaned_data + + # tmp, remove after fixing form + cleaned_data['gene_codes'] = '' + blast = BLASTNew('new', cleaned_data['name'], cleaned_data['sequence'], + cleaned_data['gene_codes']) + blast.save_seqs_to_file() + + if blast.is_blast_db_up_to_date() is False: + blast.create_blast_db() + + blast.save_query_to_file() + blast.do_blast() + result = blast.parse_blast_output() + blast.delete_query_output_files() + return render(request, 'blast_new/results.html', + { + 'result': result, + 'version': VERSION, + 'stats': STATS, + }, + ) return HttpResponseRedirect('/blast_new/')