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"); }