# Public API for PubSeq
import os
import requests
import sys
from flask import Flask, request, redirect, send_file, send_from_directory, render_template, jsonify
from bh20simplewebuploader.main import app, baseURL
# Helper functions
def fetch_sample_metadata(id):
query = """
PREFIX pubseq:
PREFIX sio:
PREFIX edam:
PREFIX efo:
PREFIX evs:
PREFIX obo:
select distinct ?id ?seq ?date ?info ?specimen ?sequencer ?mapper
{
?sample sio:SIO_000115 "%s" ;
sio:SIO_000115 ?id ;
evs:C25164 ?date .
?seq pubseq:technology ?tech ;
pubseq:sample ?sample .
?tech efo:EFO_0002699 ?mapper ;
obo:OBI_0600047 ?sequencer .
optional { ?sample edam:data_2091 ?info } .
optional { ?sample obo:OBI_0001479 ?specimen } .
} limit 5
""" % id
payload = {'query': query, 'format': 'json'}
r = requests.get(baseURL, params=payload)
return r.json()['results']['bindings']
# Main API routes
@app.route('/api/version')
def version():
return jsonify({ 'service': 'PubSeq', 'version': 0.10 })
@app.route('/api/sample/.json')
def sample(id):
# metadata = file.name(seq)+"/metadata.yaml"
meta = fetch_sample_metadata(id)
print(meta)
return jsonify([{
'id': x['id']['value'],
'fasta': x['seq']['value'],
'collection': os.path.dirname(x['seq']['value']),
'date': x['date']['value'],
'info': x['info']['value'],
'specimen': x['specimen']['value'],
'sequencer': x['sequencer']['value'],
'mapper': x['mapper']['value'],
} for x in meta])
@app.route('/api/ebi/sample-.xml', methods=['GET'])
def ebi_sample(id):
meta = fetch_sample_metadata(id)[0]
page = render_template('ebi-sample.xml',sampleid=id,sequencer=meta['sequencer']['value'],date=meta['date']['value'],specimen=meta['specimen']['value'])
return page
@app.route('/api/search', methods=['GET'])
def search():
"""
Execute a 'global search'
"""
s = request.args.get('s')
if s == "":
s = "MT326090.1"
query = """
PREFIX pubseq:
PREFIX sio:
PREFIX edam:
select distinct ?id ?seq ?info
{
?sample sio:SIO_000115 "%s" .
?sample sio:SIO_000115 ?id .
?seq pubseq:sample ?sample .
?sample edam:data_2091 ?info .
} limit 100
""" % s
payload = {'query': query, 'format': 'json'}
r = requests.get(baseURL, params=payload)
result = r.json()['results']['bindings']
# metadata = file.name(seq)+"/metadata.yaml"
print(result)
return jsonify([{
'id': x['id']['value'],
'fasta': x['seq']['value'],
'collection': os.path.dirname(x['seq']['value']),
'info': x['info']['value'],
} for x in result])