bea3a22e1454e8fee62a026ffcec8c57af4005be
markd
  Sat Jun 6 13:46:13 2026 -0700
added -tsv option blastToPsl and blastXmlToPsl to allow parsing scores with other programs

diff --git src/hg/blastToPsl/pslBuild.c src/hg/blastToPsl/pslBuild.c
index 2d7c2da001a..b1efa9cd6a3 100644
--- src/hg/blastToPsl/pslBuild.c
+++ src/hg/blastToPsl/pslBuild.c
@@ -258,35 +258,37 @@
 
 // construct psl
 int pslSpace = 8;
 char strand[3];
 safef(strand, sizeof(strand), "%c%c", qStrand, tStrand);
 struct psl *psl = pslNew(qName, blk.qCoordMult * qSize, blk.qCoordMult * qStart, blk.qCoordMult * qEnd,
                          tName, blk.tCoordMult * tSize, blk.tCoordMult * tStart, blk.tCoordMult * tEnd,
                          strand, pslSpace, ((flags & bldPslx) ? PSL_XA_FORMAT : 0));
 
 // fill in psl
 hspToBlocks(psl, &pslSpace, &blk, flags);
 finishPsl(psl, flags);
 return psl;
 }
 
-FILE *pslBuildScoresOpen(char *scoreFile, boolean inclDefs)
+FILE *pslBuildScoresOpen(char *scoreFile, boolean inclDefs, boolean isTsv)
 /* open score file and write headers */
 {
+char *header = "#strand\tqName\tqStart\tqEnd\ttName\ttStart\ttEnd\tbitScore\teVal";
 FILE *fh = mustOpen(scoreFile, "w");
-fputs("#strand\tqName\tqStart\tqEnd\ttName\ttStart\ttEnd\tbitScore\teVal", fh);
+// skip # for real TSV
+fputs(header + (isTsv ? 1 : 0) , fh);
 if (inclDefs)
     fputs("\tqDef\ttDef", fh);
 fputc('\n', fh);
 return fh;
 }
 
 static void writeBasicScores(FILE* scoreFh, struct psl *psl, double bitScore, double eValue)
 /* write first part of row */
 {
 fprintf(scoreFh, "%s\t%s\t%d\t%d\t%s\t%d\t%d\t%g\t%g", psl->strand,
         psl->qName, psl->qStart, psl->qEnd, psl->tName, psl->tStart, psl->tEnd,
         bitScore, eValue);
 }
 
 void pslBuildScoresWrite(FILE* scoreFh, struct psl *psl, double bitScore, double eValue)