diff options
author | Pjotr Prins | 2020-10-28 16:19:38 +0000 |
---|---|---|
committer | Pjotr Prins | 2020-10-28 16:19:38 +0000 |
commit | e9ea11c5332668af16c0497bf2b578433b05b32f (patch) | |
tree | 3f2207588efb35977e09af0c7a4165c41161a967 | |
parent | 89ccd3ce507ea2abad408a9df559aa3bbcc0e377 (diff) | |
download | bh20-seq-resource-e9ea11c5332668af16c0497bf2b578433b05b32f.tar.gz bh20-seq-resource-e9ea11c5332668af16c0497bf2b578433b05b32f.tar.lz bh20-seq-resource-e9ea11c5332668af16c0497bf2b578433b05b32f.zip |
List by country and added to map
-rw-r--r-- | bh20simplewebuploader/main.py | 44 | ||||
-rw-r--r-- | bh20simplewebuploader/static/main.js | 8 | ||||
-rw-r--r-- | bh20simplewebuploader/static/map.js | 4 | ||||
-rw-r--r-- | bh20simplewebuploader/templates/list.html | 42 |
4 files changed, 82 insertions, 16 deletions
diff --git a/bh20simplewebuploader/main.py b/bh20simplewebuploader/main.py index 92cea2e..0be9d9f 100644 --- a/bh20simplewebuploader/main.py +++ b/bh20simplewebuploader/main.py @@ -668,6 +668,7 @@ def contact_page(): ## sparqlURL='http://sparql.genenetwork.org/sparql/' + ## # Example http://covid19.genenetwork.org/resource/MT326090.1 # Example http://host/resource/SRR11621868 @@ -716,6 +717,30 @@ select distinct ?sample ?geoname ?date ?source ?geo ?sampletype ?institute ?sequ institute=sample['institute']['value'] return render_template('permalink.html',id=id,menu='',uri=f"http://covid19.genenetwork.org/resource/{id}",sequenceuri=sequenceuri,locationuri=locationuri,location=location,date=date,source=source,sampletype=sampletype,institute=institute,collectionuri=collectionuri,metauri=metauri) +# http://covid19.genenetwork.org/location?label=http://www.wikidata.org/entity/Q114 +# http://localhost:5067/location?label=http://www.wikidata.org/entity/Q114 +@app.route('/location', methods=['GET']) +def location(): + """Show country resource""" + loc = request.args.get('label') + logging.info(loc) + logging.info("^^^^^^^^^^^^^^^^^^^^^^^^^^^^") + query = f""" + PREFIX pubseq: <http://biohackathon.org/bh20-seq-schema#MainSchema/> + PREFIX sio: <http://semanticscience.org/resource/> + select distinct ?name ?date where + {{ + ?sample <http://purl.obolibrary.org/obo/GAZ_00000448> <{loc}> . + ?sample <http://semanticscience.org/resource/SIO_000115> ?name . + ?sample <http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl#C25164> ?date . + }} order by ?name + """ + payload = {'query': query, 'format': 'json'} + r = requests.get(sparqlURL, params=payload) + result = r.json()['results']['bindings'] + logging.info(result) + return render_template('list.html',id=loc,menu='',h=['name','date'],l=result) + ## Dynamic API functions starting here ## This is quick and dirty for now, just to get something out and demonstrate the queries ## Feel free to rename the functions/endpoints, feel free to process result so we get nicer JSON @@ -753,7 +778,12 @@ def getCountDB(): @app.route('/api/getAllaccessions', methods=['GET']) def getAllaccessions(): - query="""SELECT DISTINCT ?fasta ?value WHERE {?fasta ?x[ <http://edamontology.org/data_2091> ?value ]}""" + query=""" + SELECT DISTINCT ?fasta ?value WHERE + { + ?fasta ?x[ <http://edamontology.org/data_2091> ?value ] + } + """ payload = {'query': query, 'format': 'json'} r = requests.get(sparqlURL, params=payload) result = r.json()['results']['bindings'] @@ -780,11 +810,13 @@ def getDetailsForSeq(): # Endpoint should provide all necessary information to draw a map (!) @app.route('/api/getCountByGPS', methods=['GET']) def getCountByGPS(): - query="""SELECT DISTINCT ?location ?location_label ?GPS (count(?fasta) as ?fastaCount) WHERE { - ?fasta ?x[ <http://purl.obolibrary.org/obo/GAZ_00000448> ?location] . - ?location <http://www.wikidata.org/prop/direct/P625> ?GPS . - OPTIONAL { ?location rdfs:label ?key_tmp_label } - BIND(IF(BOUND(?key_tmp_label),?key_tmp_label, ?location) as ?location_label) + query=""" + SELECT DISTINCT ?location ?location_label ?GPS (count(?fasta) as ?fastaCount) WHERE + { + ?fasta ?x[ <http://purl.obolibrary.org/obo/GAZ_00000448> ?location] . + ?location <http://www.wikidata.org/prop/direct/P625> ?GPS . + OPTIONAL { ?location rdfs:label ?key_tmp_label } + BIND(IF(BOUND(?key_tmp_label),?key_tmp_label, ?location) as ?location_label) } GROUP BY ?location ?location_label ?GPS """ diff --git a/bh20simplewebuploader/static/main.js b/bh20simplewebuploader/static/main.js index 6e63ed3..89bc603 100644 --- a/bh20simplewebuploader/static/main.js +++ b/bh20simplewebuploader/static/main.js @@ -66,13 +66,6 @@ function fetchHTMLTable(apiEndPoint) { .then(data => { console.log(data) htmlString="<table>" - - // Depending on what we want to explore we'd have to call a different function ....? But how to Include that? - /* - for (var i=0; i<data.length;i++) { - htmlString=htmlString+"<tr><td><a href='#' onclick='fetchSEQByLocation(\""+data[i]["key"]+"\");'>"+data[i]["label"]+"</a></td><td>"+data[i]["count"]+"<td></tr>" - } - */ for (var i=0; i<data.length;i++) { let url = data[i]["key"]; let label = data[i]["label"]; @@ -97,7 +90,6 @@ function fetchHTMLTable(apiEndPoint) { } ] - */ let searchGlobal = (toHTML) => { let m = document.getElementById('search-input').value; diff --git a/bh20simplewebuploader/static/map.js b/bh20simplewebuploader/static/map.js index cabb63d..c01659f 100644 --- a/bh20simplewebuploader/static/map.js +++ b/bh20simplewebuploader/static/map.js @@ -86,7 +86,7 @@ function buildMapMarkers(data) { }}}); // ---- Build the marker list for (let i = 0; i < data.length; i++) { - let {"count": fastaCount, GPS, LocationLabel: label } = data[i]; + let {"count": fastaCount, GPS, Location: location, LocationLabel: label } = data[i]; let countSeq = Number(fastaCount); let coordinates = GPS.split(" "); @@ -95,7 +95,7 @@ function buildMapMarkers(data) { [lon, lat] = coordinates.map(parseFloat); let point = L.point() marker = new seqMarker([lat, lon],markerOptions={title: fastaCount+" sequences",sequences: countSeq}); - marker.bindPopup("<b>" + label + "</b><br/>" + "SARS-CoV-2<br/>sequences: " +fastaCount); + marker.bindPopup("<b>" + label + "</b><br/>" + "SARS-CoV-2<br/><a href=\"/location?label="+location+"\">sequences: " +fastaCount + "</a>"); markers.addLayer(marker); } } diff --git a/bh20simplewebuploader/templates/list.html b/bh20simplewebuploader/templates/list.html new file mode 100644 index 0000000..d50a045 --- /dev/null +++ b/bh20simplewebuploader/templates/list.html @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<html> + {% include 'header.html' %} + <body> + {% include 'banner.html' %} + {% include 'menu.html' %} + + <hr> + + <h1>{{id}}</h1> + + <div class="content"> + <section class="blog-entries"> + <div class="blog-table"> + {% for row in l: %} + <div class="blog-table-body"> + <div class="blog-table-row"> + {% for col in h: %} + <div class="blog-table-cell"> + {% if col == 'name': %} + <a href="/resource/{{row[col]['value']}}">{{ row[col]['value'] }}</a> + {% else %} + {{ row[col]['value'] }} + {% endif %} + </div> + {% endfor %} + </div> + </div> + {% endfor %} + </div> + </section> + + </div> + + {% include 'footer.html' %} + + <script type="text/javascript"> + let scriptRoot = {{ request.script_root|tojson|safe }}; // examples + </script> + </body> + +</html> |