about summary refs log tree commit diff
diff options
context:
space:
mode:
-rwxr-xr-xserver.py40
-rw-r--r--templates/create-ontology.html27
2 files changed, 66 insertions, 1 deletions
diff --git a/server.py b/server.py
index a20d388..626179a 100755
--- a/server.py
+++ b/server.py
@@ -359,6 +359,38 @@ def create_ontology():
         "numbering. Add abbreviations and aliases as a list with each term, "
         "separated by commas")
     if request.method == "POST":
+        action = request.form.get("action", "generate")
+
+        if action == "search":
+            # Build a temporary .onto file from the result terms and redirect to /progress
+            result_text = request.form.get("result", "")
+            query = request.form.get("query", "")
+            search_types = request.form.getlist("type")
+            # Build onto dict: each term is its own category with aliases as pipe-separated keywords
+            dict_onto = {}
+            for line in result_text.strip().split("\n"):
+                line = line.strip()
+                if not line:
+                    continue
+                parts = [p.strip() for p in line.split(",")]
+                category = parts[0]
+                keywords = "|".join(parts)
+                dict_onto[category] = {category: {keywords}}
+            # Save to a temp .onto file
+            onto_path = os.path.join(tempfile.gettempdir(), "gemini_ontology")
+            with open(onto_path + ".onto", "w") as f:
+                f.write(repr(dict_onto))
+            session['namecat'] = onto_path
+            print(f"  Created ontology: {onto_path}.onto with {len(dict_onto)} categories")
+            print(f"  Gene query: '{query}', search_types: {search_types}")
+            # Build the redirect URL with type and query params
+            from urllib.parse import urlencode
+            params = [("query", query)]
+            for t in search_types:
+                params.append(("type", t))
+            return redirect("/progress?" + urlencode(params))
+
+        # action == "generate"
         prompt = request.form.get("prompt", default_prompt)
         try:
             result = gemini_query(prompt)
@@ -830,6 +862,11 @@ def progress():
         if (search_type == []):
             search_type = ['GWAS', 'function', 'addiction', 'drug', 'brain', 'stress', 'psychiatric', 'cell']
         session['search_type'] = search_type
+        # Use default addiction ontology unless redirected from /create-ontology
+        if request.referrer and '/create-ontology' in request.referrer:
+            pass  # keep session['namecat'] set by /create-ontology
+        elif 'namecat' in session:
+            del session['namecat']
     genes_session = ''
 
     for gen in genes:
@@ -873,8 +910,10 @@ def search():
     if 'namecat' in session:
         namecat_flag=1
         ses_namecat = session['namecat']
+        print(f"  /search: namecat={ses_namecat}, search_type={search_type}")
         onto_cont = open(session['namecat']+".onto","r").read()
         dict_onto=ast.literal_eval(onto_cont)
+        print(f"  /search: onto categories={list(dict_onto.keys())[:10]}")
 
         for ky in dict_onto.keys():
             nodecolor[ky] = "hsl("+str((n_num+1)*int(360/len(dict_onto.keys())))+", 70%, 80%)"
@@ -935,6 +974,7 @@ def search():
                     all_d = all_d+'|'+all_d_ls
             if all_d: # Check if all_d is not empty
                 all_d=all_d[1:]
+            print(f"  /search generate: all_d={all_d[:200] if all_d else '(empty)'}, search_type={search_type}")
 
             if ("GWAS" in search_type):
                 datf = pd.read_csv('./utility/gwas_used.csv',sep='\t')
diff --git a/templates/create-ontology.html b/templates/create-ontology.html
index 44d8ef1..627bc86 100644
--- a/templates/create-ontology.html
+++ b/templates/create-ontology.html
@@ -5,6 +5,7 @@
   <h3>Create Ontology with Gemini AI</h3>
 
   <form method="POST" action="/create-ontology">
+    <input type="hidden" name="action" value="generate">
     <div class="form-group">
       <label for="prompt">Prompt:</label>
       <textarea class="form-control" id="prompt" name="prompt" rows="6">{{ prompt }}</textarea>
@@ -15,8 +16,32 @@
   {% if result %}
   <div class="form-group mt-4">
     <label for="result">Result ({{ count }} terms):</label>
-    <textarea class="form-control" id="result" rows="20" readonly>{{ result }}</textarea>
+    <textarea class="form-control" id="result" name="result" rows="20" form="search-form">{{ result }}</textarea>
   </div>
+
+  <form id="search-form" method="POST" action="/create-ontology" class="mt-3">
+    <input type="hidden" name="action" value="search">
+    <div class="form-group">
+      <label for="query">Gene symbols (space or comma separated):</label>
+      <textarea class="form-control" id="query" name="query" rows="2"></textarea>
+    </div>
+    <div id="check_selection_onto"></div>
+    <button type="submit" class="btn btn-primary">Search</button>
+  </form>
+
+  <script>
+    var lines = document.getElementById('result').value.split('\n');
+    var checkbox = '';
+    for (var i = 0; i < lines.length; i++) {
+      var term = lines[i].trim();
+      if (term) {
+        var label = term.split(',')[0].trim();
+        checkbox += '<strong><input type="checkbox" name="type" value="' + label + '" checked form="search-form"> ' + label + '&nbsp;&nbsp;</strong>';
+      }
+    }
+    checkbox += '<br><strong><input type="checkbox" onClick="var c=document.querySelectorAll(\'input[name=type]\');for(var i=0;i<c.length;i++)c[i].checked=this.checked;"/> (Un)select all</strong>';
+    document.getElementById('check_selection_onto').innerHTML = checkbox;
+  </script>
   {% endif %}
 </div>