def post(self): parser = reqparse.RequestParser() parser.add_argument('forward', type=str, help='The sequence of the forward primer') parser.add_argument('reverse', type=str, help='The sequence of the reverse primer') args = parser.parse_args() args['sequence'] = args['forward'] + '_' + args['reverse'] job = BlastJob() job_id = job.get_job_id() cmd = ( "INSERT INTO jobs VALUES ('{}', '{}', '{}', '{}', '{}', '{}', '{}')" .format(job_id, args['sequence'], 0000, time.time(), 'submitted', '', '', '')) conn = sqlite3.connect(job.result_db) c = conn.cursor() c.execute(cmd) conn.commit() conn.close() args['job_id'] = job_id print(args, file=sys.stderr) args = job.set_arguments_for_primer_blast(args) print(str(args) + '#' * 20, file=sys.stderr) job.future = executor.submit( functools.partial(job.run, parameters=args)) jobs[job_id] = job return job_id
def get(self): args = parser.parse_args() args['accession'] = args['accession'][0] if args['format'] == 'txt': return RestNucleotideMinimal().get(args['accession']) else: job = BlastJob() acc = job.get_accession(args['accession']) return jsonify({'response': acc})
def post(self): args = parser.parse_args() job = BlastJob() resp = {} for acc in args['accession']: resp[acc] = job.get_accession(acc) if args['format'] == 'txt': return resp else: return jsonify(resp)
def post(self): parser = reqparse.RequestParser() parser.add_argument('sequence', type=str, help='Sequence') parser.add_argument('number_of_pairs', type=int, required=False, default=5, help='Number of pairs to design') args = parser.parse_args() # TODO default filename = os.path.join(os.getcwd(), '..', 'input', BlastJob.get_job_id() + '.fa') resp = {'error': False, 'primers': [], 'message': ''} with open(filename, 'w') as f: f.write(args['sequence']) try: primers = design_primers(filename, args['number_of_pairs']) except ValueError as e: resp['error'] = True resp['message'] = str(e) return jsonify(resp) for p, primer in enumerate(primers): primers[p] = str(primer) resp['primers'] = primers if len(primers) == 0: resp[ 'message'] = 'Failed to design primers for the target sequence' else: resp['message'] = 'Successfully designed primers' return jsonify(resp)
def post(self): parser = reqparse.RequestParser() parser.add_argument('sequence', type=str, help='Sequence') args = parser.parse_args() job = BlastJob() job_id = job.get_job_id() cmd = ( "INSERT INTO jobs VALUES ('{}', '{}', '{}', '{}', '{}', '{}', '{}')" .format(job_id, args['sequence'], 0000, time.time(), 'submitted', '', '')) conn = sqlite3.connect(job.result_db) c = conn.cursor() c.execute(cmd) conn.commit() conn.close() args['job_id'] = job_id job.future = executor.submit( functools.partial(job.run, parameters=args)) jobs[job_id] = job return job_id
def get(self, accession): job = BlastJob() acc = job.get_accession(accession) return flask.Response(acc, mimetype='txt')
def get(self, blast_id): if blast_id is None or len(blast_id) == 0 or blast_id not in jobs: return flask.abort(404) if not jobs[blast_id].finished: return flask.abort(404) return BlastJob.extract_hits_from_blast(jobs[blast_id].stdout)
def design_primers(filename, number_of_primers, database='nt', primer_pairs_to_screen=3200): make_directories() # get target sequence if filename.startswith('>') and not os.path.isfile(filename): filename = write_sequence_to_file(filename) try: record = SeqIO.read(filename, 'fasta') except ValueError as e: raise e # run BLAST in the background blast = BlastJob(blast_db=database) blast.run(parameters={'sequence': record.format('fasta')}) while not blast.finished: time.sleep(0.1) if blast.stderr is None or blast.stderr != '': raise RuntimeError('BLAST failed with error: {}'.format(blast.stderr)) # get BLAST sequences executor = concurrent.futures.ThreadPoolExecutor(4) future_blast = executor.submit(functools.partial(blast.extract_hits_from_blast, blast.stdout)) acc_hits = future_blast.result(timeout=120) # TODO default filename_hits = os.path.join(os.path.dirname(__file__), 'data', 'input', blast.get_job_id() + '.fa') with open(filename_hits, 'w') as f: f.write(blast.get_accession(acc_hits)) primer_pairs = [] valid_pairs = [] primers = {} while len(valid_pairs) < number_of_primers: old_len = primers.get('PRIMER_LEFT_NUM_RETURNED', 0) future_primers = executor.submit(functools.partial(create_primers, record, number_of_primers=primer_pairs_to_screen)) primers = future_primers.result(timeout=120) for i in range(old_len, primers['PRIMER_LEFT_NUM_RETURNED']): pp = PrimerPair.parse_primer3(primers, index=i) primer_pairs.append(pp) valid_pairs = list(set(validate_primerpairs(primer_pairs, filename=filename_hits))) primer_pairs_to_screen = primer_pairs_to_screen * 2 with open('optimal_pairs.txt', 'a') as f: f.write(str(primer_pairs_to_screen)) f.write('\n') blast_outputs = [] for v, valid in enumerate(valid_pairs): # run against all nucleotides for orientation in ('forward', 'reverse'): sequence = '>{}_{}\n{}'.format(orientation, v, valid.__getattribute__(orientation).seq) blast.run(parameters={'sequence': sequence}) while not blast.finished: time.sleep(0.1) blast_outputs.extend(blast.extract_hits_from_blast(blast.stdout)) # collect new sequences # print(blast_outputs, file=sys.stderr) # add new sequences to initial pass #acc_hits = blast.get_accessions_from_list(blast_outputs) #print(acc_hits, file=sys.stderr) return valid_pairs[0:number_of_primers]