aboutsummaryrefslogtreecommitdiff
path: root/gn2/wqflask/gsearch.py
diff options
context:
space:
mode:
Diffstat (limited to 'gn2/wqflask/gsearch.py')
-rw-r--r--gn2/wqflask/gsearch.py62
1 files changed, 62 insertions, 0 deletions
diff --git a/gn2/wqflask/gsearch.py b/gn2/wqflask/gsearch.py
new file mode 100644
index 00000000..cad6db94
--- /dev/null
+++ b/gn2/wqflask/gsearch.py
@@ -0,0 +1,62 @@
+from urllib.parse import urlencode, urljoin
+
+from pymonad.maybe import Just, Maybe
+from pymonad.tools import curry
+import requests
+
+from gn3.monads import MonadicDict
+from gn2.utility.hmac import hmac_creation
+from gn2.utility.tools import GN3_LOCAL_URL
+from gn2.base import webqtlConfig
+
+# KLUDGE: Due to the lack of pagination, we hard-limit the maximum
+# number of search results.
+MAX_SEARCH_RESULTS = 10000
+
+class GSearch:
+ def __init__(self, kwargs):
+ if ("type" not in kwargs) or ("terms" not in kwargs):
+ raise ValueError
+ self.type = kwargs["type"]
+ self.terms = kwargs["terms"]
+
+ # FIXME: Handle presentation (that is, formatting strings for
+ # display) in the template rendering, not when retrieving
+ # search results.
+ chr_mb = curry(2, lambda chr, mb: f"Chr{chr}: {mb:.6f}")
+ format3f = lambda x: f"{x:.3f}"
+ hmac = curry(3, lambda trait_name, dataset, data_hmac: f"{trait_name}:{dataset}:{data_hmac}")
+ convert_lod = lambda x: x / 4.61
+ self.trait_list = []
+ for i, trait in enumerate(requests.get(
+ urljoin(GN3_LOCAL_URL, "/api/search?" + urlencode({"query": self.terms,
+ "type": self.type,
+ "per_page": MAX_SEARCH_RESULTS}))).json()):
+ trait = MonadicDict(trait)
+ trait["index"] = Just(i)
+ trait["location_repr"] = (Maybe.apply(chr_mb)
+ .to_arguments(trait.pop("chr"), trait.pop("mb")))
+ trait["LRS_score_repr"] = trait.pop("lrs").map(convert_lod).map(format3f)
+ trait["additive"] = trait["additive"].map(format3f)
+ trait["mean"] = trait["mean"].map(format3f)
+ trait["max_lrs_text"] = (Maybe.apply(chr_mb)
+ .to_arguments(trait.pop("geno_chr"), trait.pop("geno_mb")))
+ if self.type == "gene":
+ trait["hmac"] = (Maybe.apply(hmac)
+ .to_arguments(trait['name'], trait['dataset'], Just(hmac_creation(f"{trait['name']}:{trait['dataset']}"))))
+ elif self.type == "phenotype":
+ trait["display_name"] = trait["name"]
+ inbredsetcode = trait.pop("inbredsetcode")
+ if inbredsetcode.map(len) == Just(3):
+ trait["display_name"] = (Maybe.apply(
+ curry(2, lambda inbredsetcode, name: f"{inbredsetcode}_{name}"))
+ .to_arguments(inbredsetcode, trait["name"]))
+
+ trait["hmac"] = (Maybe.apply(hmac)
+ .to_arguments(trait['name'], trait['dataset'], Just(hmac_creation(f"{trait['name']}:{trait['dataset']}"))))
+ trait["authors_display"] = (trait.pop("authors").map(
+ lambda authors:
+ ", ".join(authors[:2] + ["et al."] if len(authors) >=2 else authors)))
+ trait["pubmed_text"] = trait["year"].map(str)
+ self.trait_list.append(trait.data)
+ self.trait_count = len(self.trait_list)