1279043d2cb8d519a1ef0a7d1b80f6ab721d4b1f
markd
  Sun Nov 14 15:10:36 2021 -0800
make TSV header work on other output files

diff --git src/hg/pslStats/pslStats.c src/hg/pslStats/pslStats.c
index 2032f52..c5ed7b8 100644
--- src/hg/pslStats/pslStats.c
+++ src/hg/pslStats/pslStats.c
@@ -348,53 +348,55 @@
     fprintf(fh, alnStatsFmt, psl->qName, psl->qSize, psl->tName, psl->tStart, psl->tEnd,
             calcIdent(psl), calcQCover(psl), calcRepMatch(psl), calcTCover(psl));
     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 */
-static char *queryStatsHdr = "#qName\t" "qSize\t" "alnCnt\t" "minIdent\t" "maxIdent\t" "meanIdent\t"
+static char *queryStatsHdr = "qName\t" "qSize\t" "alnCnt\t" "minIdent\t" "maxIdent\t" "meanIdent\t"
 "minQCover\t" "maxQCover\t" "meanQCover\t" "minRepMatch\t" "maxRepMatch\t" "meanRepMatch\t"
 "minTCover\t" "maxTCover\n";
 
 static void queryStatsOutput(FILE *fh, struct sumStats *qs)
 /* output statistic on a query */
 {
 fprintf(fh, "%s\t%d\t%d\t" "%0.4f\t%0.4f\t%0.4f\t"
         "%0.4f\t%0.4f\t%0.4f\t"  "%0.4f\t%0.4f\t%0.4f\t" "%0.4f\t%0.4f\n",
         qs->qName, qs->minQSize, qs->alnCnt,
         qs->minIdent, qs->maxIdent, calcMeanIdent(qs),
         qs->minQCover, qs->maxQCover, calcMeanQCover(qs),
         qs->minRepMatch, qs->maxRepMatch, calcMeanRepMatch(qs),
         qs->minTCover, qs->maxTCover);
 }
 
 static void outputQueryStats(struct hash *queryStatsTbl, char *statsFile)
 /* output statistics on queries */
 {
 struct hashCookie cookie = hashFirst(queryStatsTbl);
 FILE *fh = mustOpen(statsFile, "w");
 struct hashEl *hel;
 
+if (!tsvHeader)
+    fputc('#', fh);
 fputs(queryStatsHdr, fh);
 while ((hel = hashNext(&cookie)) != NULL)
     queryStatsOutput(fh, hel->val);
 
 carefulClose(&fh);
 }
 
 static struct hash *collectQueryStats(char *pslFile, char *querySizeFile)
 /* collect per-query statistics */
 {
 struct hash *queryStatsTbl = (querySizeFile != NULL)
     ? sumStatsLoad(querySizeFile)
     : hashNew(queryHashPowTwo);
 
 struct lineFile *pslLf = pslFileOpen(pslFile);
@@ -406,39 +408,41 @@
     sumStatsAccumulateQuery(ss, psl);
     pslFree(&psl);
     }
 lineFileClose(&pslLf);
 return queryStatsTbl;
 }
 
 static void pslQueryStats(char *pslFile, char *statsFile, char *querySizeFile)
 /* collect and output per-query stats */
 {
 struct hash *queryStatsTbl = collectQueryStats(pslFile, querySizeFile);
 outputQueryStats(queryStatsTbl, statsFile);
 }
 
 /* header for overall statistics */
-static char *overallStatsHdr = "#queryCnt\t" "minQSize\t" "maxQSize\t" "meanQSize\t"
+static char *overallStatsHdr = "queryCnt\t" "minQSize\t" "maxQSize\t" "meanQSize\t"
 "alnCnt\t" "minIdent\t" "maxIdent\t" "meanIdent\t"
 "minQCover\t" "maxQCover\t" "meanQCover\t" "minRepMatch\t" "maxRepMatch\t" "meanRepMatch\t"
 "minTCover\t" "maxTCover\t" "aligned\t" "aligned1\t" "alignedN\t" "totalAlignedSize\n";
 
 static void outputOverallStats(char *statsFile, struct sumStats *os, int aligned1, int alignedN)
 /* output overall statistic */
 {
 FILE *fh = mustOpen(statsFile, "w");
+if (!tsvHeader)
+    fputc('#', fh);
 fputs(overallStatsHdr, fh);
 fprintf(fh, "%d\t%d\t%d\t%d\t%d\t" "%0.4f\t%0.4f\t%0.4f\t"
         "%0.4f\t%0.4f\t%0.4f\t"  "%0.4f\t%0.4f\t%0.4f\t" "%0.4f\t%0.4f\t"
         "%d\t%d\t%d\t%lld\n",
         os->queryCnt, os->minQSize, os->maxQSize, calcMeanQSize(os),
         os->alnCnt,
         os->minIdent, os->maxIdent, calcMeanIdent(os),
         os->minQCover, os->maxQCover, calcMeanQCover(os),
         os->minRepMatch, os->maxRepMatch, calcMeanRepMatch(os),
         os->minTCover, os->maxTCover, aligned1+alignedN, aligned1, alignedN,
         os->totalAlign);
 carefulClose(&fh);
 }
 
 static struct sumStats sumOverAllStats(struct hash *queryStatsTbl, int *aligned1, int *alignedN)