834653e22227fcea282e12a48910bb73068b34df
angie
  Mon Apr 29 15:33:06 2024 -0700
Don't depend on having a PSL alignment for the results table, precompute the same values whether aligning with gf/blat or nextclade.

diff --git src/hg/hgPhyloPlace/phyloPlace.c src/hg/hgPhyloPlace/phyloPlace.c
index b3c2da1..37c94d7 100644
--- src/hg/hgPhyloPlace/phyloPlace.c
+++ src/hg/hgPhyloPlace/phyloPlace.c
@@ -1992,57 +1992,49 @@
                     dyStringAppendSep(dy, ", ");
                     dyStringPrintf(dy, "%c%d%c", snc->refBase, snc->chromStart+1, snc->newBase);
                     alignedAmbigCount++;
                     }
                 }
             if (isEmpty(dy->string))
                 dyStringAppend(dy, "(Masked or not aligned to reference)");
             else if (alignedAmbigCount != si->ambigCount)
                 dyStringPrintf(dy, " (%d masked or not aligned to reference)",
                                si->ambigCount - alignedAmbigCount);
             printTooltip(dy->string);
             }
         printf("</td>");
         if (isFasta)
             {
-            struct psl *psl = si->psl;
-            if (psl)
-                {
-                int aliCount = psl->match + psl->misMatch + psl->repMatch;
-                printf("<td class='%s'>%d ", qcClassForLength(aliCount), aliCount);
+            printf("<td class='%s'>%d ", qcClassForLength(si->basesAligned), si->basesAligned);
             dyStringClear(dy);
-                dyStringPrintf(dy, "bases %d - %d align to reference bases %d - %d",
-                               psl->qStart+1, psl->qEnd, psl->tStart+1, psl->tEnd);
+            dyStringPrintf(dy, "aligned to reference bases %d - %d",
+                           si->tStart+1, si->tEnd);
             printTooltip(dy->string);
             printf("</td><td class='%s'>%d ",
                    qcClassForIndel(si->insBases), si->insBases);
             if (si->insBases)
                 {
                 printTooltip(si->insRanges);
                 }
             printf("</td><td class='%s'>%d ",
                    qcClassForIndel(si->delBases), si->delBases);
             if (si->delBases)
                 {
                 printTooltip(si->delRanges);
                 }
             printf("</td>");
             }
-            else
-                printf("<td colspan=3 class='%s'> not alignable </td>",
-                       qcClassForLength(0));
-            }
         int snvCount = slCount(si->sncList) - alignedAmbigCount;
         printf("<td class='%s'>%d", qcClassForSNVs(snvCount), snvCount);
         if (snvCount > 0)
             {
             dyStringClear(dy);
             struct singleNucChange *snc;
             for (snc = si->sncList;  snc != NULL;  snc = snc->next)
                 {
                 if (!isIupacAmbiguous(snc->newBase))
                     {
                     dyStringAppendSep(dy, ", ");
                     dyStringPrintf(dy, "%c%d%c", snc->refBase, snc->chromStart+1, snc->newBase);
                     }
                 }
             printTooltip(dy->string);
@@ -2541,43 +2533,36 @@
         {
         if (bv != info->imputedBases)
             fputc(',', f);
         fprintf(f, "%d%s", bv->chromStart+1, bv->val);
         }
     fputc('\t', f);
     // path through tree to sample
     printVariantPathNoNodeNames(f, info->variantPath);
     // number of equally parsimonious placements
     fprintf(f, "\t%d", info->bestNodeCount);
     // parsimony score
     fprintf(f, "\t%d", info->parsimonyScore);
     struct seqInfo *si = hashFindVal(seqInfoHash, sampleId);
     if (si)
         {
-        if (si->psl)
-            {
         // length
         fprintf(f, "\t%d", si->seq->size);
-            struct psl *psl = si->psl;
         // aligned bases, indel counts & ranges
-            int aliCount = psl->match + psl->misMatch + psl->repMatch;
         fprintf(f, "\t%d\t%d\t%s\t%d\t%s",
-                    aliCount, si->insBases, emptyForNull(si->insRanges),
+                si->basesAligned, si->insBases, emptyForNull(si->insRanges),
                 si->delBases, emptyForNull(si->delRanges));
-            }
-        else
-            fprintf(f, "\tn/a\tn/a\tn/a\tn/a\tn/a\tn/a");
         // SNVs that were masked (Problematic Sites track), not used in placement
         fputc('\t', f);
         struct singleNucChange *snc;
         for (snc = si->maskedSncList;  snc != NULL;  snc = snc->next)
             {
             if (snc != si->maskedSncList)
                 fputc(',', f);
             fprintf(f, "%c%d%c", snc->refBase, snc->chromStart+1, snc->newBase);
             }
         }
     else
         {
         warn("writeOneTsvRow: no sequenceInfo for sample '%s'", sampleId);
         fprintf(f, "\tn/a\tn/a\tn/a\tn/a\tn/a\tn/a\tn/a");
         }