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)
示例#8
0
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]