12fba0b2e8b85a7f3351a05dc0257211bcbb990d
markd
  Sat Jan 17 23:00:43 2026 -0800
add strand to pslStats output

diff --git src/hg/pslStats/pslStats.c src/hg/pslStats/pslStats.c
index c2977f2419a..d91aa34db8c 100644
--- src/hg/pslStats/pslStats.c
+++ src/hg/pslStats/pslStats.c
@@ -300,64 +300,64 @@
     ss->maxQCover = max(ss->maxQCover, ss2->maxQCover);
     ss->minTCover = min(ss->minTCover, ss2->minTCover);
     ss->maxTCover = max(ss->maxTCover, ss2->maxTCover);
     ss->minRepMatch = min(ss->minRepMatch, ss2->minRepMatch);
     ss->maxRepMatch = max(ss->maxRepMatch, ss2->maxRepMatch);
     }
 ss->queryCnt += ss2->queryCnt;
 ss->totalQSize += ss2->totalQSize;
 ss->totalAlign += ss2->totalAlign;
 ss->totalMatch += ss2->totalMatch;
 ss->totalRepMatch += ss2->totalRepMatch;
 ss->alnCnt += ss2->alnCnt;
 }
 
 /* header for alignment statistics */
-static char *alnStatsHdr = "qName\t" "qSize\t" "tName\t" "tStart\t" "tEnd\t"
+static char *alnStatsHdr = "qName\t" "qSize\t" "tName\t" "tStart\t" "tEnd\t" "strand\t"
     "ident\t" "qCover\t" "repMatch\t" "tCover\t" "alnSize\t" "alnSpan\n";
 
 /* format for alignStats output */
-static char *alnStatsFmt = "%s\t%d\t%s\t%d\t%d\t%0.4f\t%0.4f\t%0.4f\t%0.4f\t%d\t%d\n";
+static char *alnStatsFmt = "%s\t%d\t%s\t%d\t%d\t%s\t%0.4f\t%0.4f\t%0.4f\t%0.4f\t%d\t%d\n";
 
 static void alignStatsOutputUnaligned(FILE *fh, struct hash* querySizesTbl)
 /* output stats on unaligned */
 {
 struct hashCookie cookie = hashFirst(querySizesTbl);
 struct hashEl *hel;
 while ((hel = hashNext(&cookie)) != NULL)
     {
     struct querySizeCnt *qs = hel->val;
     if (qs->alnCnt == 0)
-        fprintf(fh, alnStatsFmt, hel->name, qs->qSize, "", 0, 0, 0.0, 0.0, 0.0, 0.0, 0, 0);
+        fprintf(fh, alnStatsFmt, hel->name, qs->qSize, "", 0, 0, "", 0.0, 0.0, 0.0, 0.0, 0, 0);
     }
 }
 
 static void pslAlignStats(char *pslFile, char *statsFile, char *querySizeFile)
 /* collect and output per-alignment stats */
 {
 struct hash* querySizesTbl = (querySizeFile != NULL)
     ? querySizeCntLoad(querySizeFile) : NULL;
 struct lineFile *pslLf = pslFileOpen(pslFile);
 FILE *fh = mustOpen(statsFile, "w");
 struct psl* psl;
 
 if (!tsvHeader)
     fputc('#', fh);
 fputs(alnStatsHdr, fh);
 while ((psl = pslNext(pslLf)) != NULL)
     {
-    fprintf(fh, alnStatsFmt, psl->qName, psl->qSize, psl->tName, psl->tStart, psl->tEnd,
+    fprintf(fh, alnStatsFmt, psl->qName, psl->qSize, psl->tName, psl->tStart, psl->tEnd, psl->strand,
             calcIdent(psl), calcQCover(psl), calcRepMatch(psl), calcTCover(psl),
             calcAligned(psl), psl->tEnd - psl->tStart);
     if (querySizesTbl != NULL)
         querySizeCntGet(querySizesTbl, psl->qName, psl->qSize)->alnCnt++;
     pslFree(&psl);
     }
 lineFileClose(&pslLf);
 
 if (querySizesTbl != NULL)
     alignStatsOutputUnaligned(fh, querySizesTbl);
 
 carefulClose(&fh);
 }
 
 /* header for query statistics */