871b54b7f7262469495a2db7bc064d3322ff9fa3
angie
  Wed Oct 12 13:45:51 2022 -0700
Auspice config: added entropy panel and filters for sample type, country, lineage/clade.  HT @corneliusroemer

diff --git src/hg/hgPhyloPlace/treeToAuspiceJson.c src/hg/hgPhyloPlace/treeToAuspiceJson.c
index dcea69f..9aa310d 100644
--- src/hg/hgPhyloPlace/treeToAuspiceJson.c
+++ src/hg/hgPhyloPlace/treeToAuspiceJson.c
@@ -143,69 +143,85 @@
     else if (sameString(col->name, "pango_lineage"))
         auspiceMetaColoringCategorical(jw, col->name, "Pango lineage");
     else if (sameString(col->name, "pango_lineage_usher"))
         auspiceMetaColoringCategorical(jw, col->name, "Pango lineage assigned by UShER");
     else if (sameString(col->name, "Nextstrain_lineage"))
         auspiceMetaColoringCategorical(jw, col->name, "Nextstrain lineage");
     else if (sameString(col->name, "country"))
         auspiceMetaColoringCategorical(jw, col->name, "Country");
     else
         auspiceMetaColoringCategorical(jw, col->name, col->name);
     }
 jsonWriteListEnd(jw);
 }
 
 static void writeAuspiceMeta(struct jsonWrite *jw, struct slName *subtreeUserSampleIds, char *source,
-                             struct slName *colorFields, struct geneInfo *geneInfoList,
+                             char *db, struct slName *colorFields, struct geneInfo *geneInfoList,
                              uint genomeSize)
 /* Write metadata to configure Auspice display. */
 {
 jsonWriteObjectStart(jw, "meta");
 // Title
 struct dyString *dy = dyStringCreate("Subtree with %s", subtreeUserSampleIds->name);
 int sampleCount = slCount(subtreeUserSampleIds);
 if (sampleCount > 10)
     dyStringPrintf(dy, " and %d other uploaded samples", sampleCount - 1);
 else
     {
     struct slName *sln;
     for (sln = subtreeUserSampleIds->next;  sln != NULL;  sln = sln->next)
         dyStringPrintf(dy, ", %s", sln->name);
     }
 jsonWriteString(jw, "title", dy->string);
 // Description
 jsonWriteStringf(jw, "description", "Dataset generated by [UShER web interface]"
                  "(%shgPhyloPlace) using the "
                  "[usher](https://github.com/yatisht/usher/) program.  "
 //#*** TODO: describe input from which tree was generated: user sample, version of tree, etc.
                  "If you have metadata you wish to display, you can now drag on a CSV file and "
                  "it will be added into this view, [see here]("NEXTSTRAIN_DRAG_DROP_DOC") "
                  "for more info."
                  , hLocalHostCgiBinUrl());
-// Panels: just the tree (no map, entropy etc.)
+// Panels: just the tree and  entropy (no map)
 jsonWriteListStart(jw, "panels");
 jsonWriteString(jw, NULL, "tree");
+jsonWriteString(jw, NULL, "entropy");
 jsonWriteListEnd(jw);
 // Default label & color
 jsonWriteObjectStart(jw, "display_defaults");
-jsonWriteString(jw, "branch_label", "none");
+jsonWriteString(jw, "branch_label", "aa mutations");
 jsonWriteString(jw, "color_by", getDefaultColor(colorFields));
 jsonWriteObjectEnd(jw);
 // Colorings: userOrOld, gt and whatever we got from metadata
 auspiceMetaColorings(jw, source, colorFields);
 // Filters didn't work when I tried them a long time ago... revisit someday.
 jsonWriteListStart(jw, "filters");
+jsonWriteString(jw, NULL, "userOrOld");
+jsonWriteString(jw, NULL, "country");
+//#*** FIXME: TODO: either pass in along with sampleMetadata, or better yet, compute while building
+//#*** tree object and then write the header object.
+if (sameString(db, "wuhCor1"))
+    {
+    jsonWriteString(jw, NULL, "pango_lineage_usher");
+    jsonWriteString(jw, NULL, "pango_lineage");
+    jsonWriteString(jw, NULL, "Nextstrain_clade_usher");
+    jsonWriteString(jw, NULL, "Nextstrain_clade");
+    }
+else
+    {
+    jsonWriteString(jw, NULL, "Nextstrain_lineage");
+    }
 jsonWriteListEnd(jw);
 // Annotations for coloring/filtering by base
 writeAuspiceMetaGenomeAnnotations(jw, geneInfoList, genomeSize);
 jsonWriteObjectEnd(jw);
 }
 
 static void jsonWriteObjectValueUrl(struct jsonWrite *jw, char *name, char *value, char *url)
 /* Write an object with member "value" set to value, and if url is non-empty, "url" set to url. */
 {
 jsonWriteObjectStart(jw, name);
 jsonWriteString(jw, "value", value);
 if (isNotEmpty(url))
     jsonWriteString(jw, "url", url);
 jsonWriteObjectEnd(jw);
 }
@@ -700,31 +716,31 @@
 struct slName *colorFields = NULL;
 if (sameString(db, "wuhCor1"))
     {
     slNameAddHead(&colorFields, "country");
     slNameAddHead(&colorFields, "Nextstrain_clade_usher");
     slNameAddHead(&colorFields, "pango_lineage_usher");
     slNameAddHead(&colorFields, "Nextstrain_clade");
     slNameAddHead(&colorFields, "pango_lineage");
     }
 else
     {
     slNameAddHead(&colorFields, "country");
     slNameAddHead(&colorFields, "Nextstrain_lineage");
     }
 //#*** END FIXME
-writeAuspiceMeta(jw, sti->subtreeUserSampleIds, source, colorFields, geneInfoList,
+writeAuspiceMeta(jw, sti->subtreeUserSampleIds, source, db, colorFields, geneInfoList,
                  gSeqWin->end);
 jsonWriteObjectStart(jw, "tree");
 int nodeNum = 10000; // Auspice.us starting node number for newick -> json
 int depth = 0;
 
 // Add an extra root node because otherwise Auspice won't draw branch from big tree root to subtree
 struct phyloTree *root = phyloTreeNewNode("wrapper");
 phyloAddEdge(root, tree);
 tree = root;
 struct auspiceJsonInfo aji = { jw, sti->subtreeUserSampleIds, geneInfoList, gSeqWin,
                                sampleMetadata, sampleUrls, nodeNum, source };
 rTreeToAuspiceJson(tree, depth, &aji, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
 jsonWriteObjectEnd(jw); // tree
 jsonWriteObjectEnd(jw); // top-level object
 fputs(jw->dy->string, outF);