917b546813930bf7583bdb7e2b34c46c70729942
angie
  Tue Mar 30 16:34:10 2021 -0700
Add option to label branches by only Spike mutations in Nextstrain/Auspice.

diff --git src/hg/hgPhyloPlace/treeToAuspiceJson.c src/hg/hgPhyloPlace/treeToAuspiceJson.c
index f91244c..cc432d1 100644
--- src/hg/hgPhyloPlace/treeToAuspiceJson.c
+++ src/hg/hgPhyloPlace/treeToAuspiceJson.c
@@ -254,43 +254,55 @@
 if (node->priv != NULL)
     {
     struct singleNucChange *sncList = node->priv;
     struct slPair *geneAaMutations = getAaMutations(sncList, geneInfoList, gSeqWin);
     jsonWriteObjectStart(jw, "branch_attrs");
     if (node->numEdges > 0)
         {
         jsonWriteObjectStart(jw, "labels");
         struct singleNucChange *snc = sncList;
         struct dyString *dy = dyStringCreate("%c%d%c",
                                              snc->parBase, snc->chromStart+1, snc->newBase);
         for (snc = sncList->next;  snc != NULL;  snc = snc->next)
             dyStringPrintf(dy, ",%c%d%c", snc->parBase, snc->chromStart+1, snc->newBase);
         jsonWriteString(jw, "nuc mutations", dy->string);
         dyStringClear(dy);
+        struct dyString *dyS = dyStringNew(0);
         struct slPair *geneAaMut;
         for (geneAaMut = geneAaMutations;  geneAaMut != NULL;  geneAaMut = geneAaMut->next)
             {
             struct slName *aaMut;
             for (aaMut = geneAaMut->val;  aaMut != NULL;  aaMut = aaMut->next)
                 {
                 dyStringAppendSep(dy, ",");
                 dyStringPrintf(dy, "%s:%s", geneAaMut->name, aaMut->name);
                 }
+            if (sameString("S", geneAaMut->name))
+                {
+                for (aaMut = geneAaMut->val;  aaMut != NULL;  aaMut = aaMut->next)
+                    {
+                    dyStringAppendSep(dyS, ",");
+                    dyStringPrintf(dyS, "%s:%s", geneAaMut->name, aaMut->name);
+                    }
+                }
             }
         if (isNotEmpty(dy->string))
             jsonWriteString(jw, "aa mutations", dy->string);
+        if (isNotEmpty(dyS->string))
+            jsonWriteString(jw, "Spike mutations", dyS->string);
         dyStringFree(&dy);
+        dyStringFree(&dyS);
         jsonWriteObjectEnd(jw);
         }
     jsonWriteObjectStart(jw, "mutations");
     struct slPair *geneAaMut;
     for (geneAaMut = geneAaMutations;  geneAaMut != NULL;  geneAaMut = geneAaMut->next)
         {
         jsonWriteListStart(jw, geneAaMut->name);
         struct slName *aaMut;
         for (aaMut = geneAaMut->val;  aaMut != NULL;  aaMut = aaMut->next)
             jsonWriteString(jw, NULL, aaMut->name);
         jsonWriteListEnd(jw);
         }
     jsonWriteListStart(jw, "nuc");
     struct singleNucChange *snc;
     for (snc = sncList;  snc != NULL;  snc = snc->next)