c46e05f162d1eaefe16a84d7df9d2afcaa2dd4bb
markd
  Mon Jun 16 14:54:58 2025 -0700
output BAM alignment type in hgc page

diff --git src/hg/hgc/bamClick.c src/hg/hgc/bamClick.c
index f80a35f4ff0..53e6c45826f 100644
--- src/hg/hgc/bamClick.c
+++ src/hg/hgc/bamClick.c
@@ -67,50 +67,62 @@
  * to do it right, we would need to reverse the CIGAR string for display. */
 static boolean useStrand = FALSE;
 static boolean skipQualityScore = FALSE;
 
 static void singleBamDetails(const bam1_t *bam)
 /* Print out the properties of this alignment. */
 {
 const bam1_core_t *core = &bam->core;
 char *itemName = bam1_qname(bam);
 int tLength = bamGetTargetLength(bam);
 int tStart = core->pos, tEnd = tStart+tLength;
 boolean isRc = useStrand && bamIsRc(bam);
 printPosOnChrom(seqName, tStart, tEnd, NULL, FALSE, itemName);
 if (!skipQualityScore)
     printf("<B>Alignment Quality: </B>%d<BR>\n", core->qual);
+
+// alignment type
+char *alnType = NULL;
+if (bam->core.flag & BAM_FSECONDARY)
+    alnType = "Secondary";
+else if (bam->core.flag & BAM_FSUPPLEMENTARY)
+    alnType = "Supplementary";
+else
+    alnType = "Primary";
+printf("<B>Alignment type:</B> %s</BR>\n", alnType);
+
+// clipping
+int clippedBases[4];
+getClippedBases(bam, clippedBases);
+printf("<B>Start clipping:</B> hard: %d  soft: %d</BR>\n", clippedBases[0], clippedBases[1]);
+printf("<B>End clipping:</B> hard: %d  soft: %d</BR> \n", clippedBases[3], clippedBases[2]);
+
 if (core->n_cigar > 50)
     printf("<B>CIGAR string: </B> Cannot show long CIGAR string, more than 50 operations. Contact us if you need to see the full CIGAR string here.<BR>\n");
 else
     {
     printf("<B>CIGAR string: </B><tt>%s</tt>", bamGetCigar(bam));
     printf("<BR>\n");
     //bamShowCigarEnglish(bam);
     printf("<p><B>CIGAR Legend:</B><BR>"
             "<b>M</b> : alignment match (seq. match or mismatch), <b>I</b> : insert from genome, <b>D</b> : deletion from genome, "
             "<b>N</b> : skipped from genome, <BR>"
             "<b>S</b> : soft clipping, <b>H</b> : hard clipping, <b>P</b> : padding, "
             "<b>=</b> : sequence match, <b>X</b> : sequence mismatch\n");
     printf("</p>\n");
     }
 
-int clippedBases[4];
-getClippedBases(bam, clippedBases);
-printf("<B>Start clipping:</B> hard: %d  soft: %d</BR>\n", clippedBases[0], clippedBases[1]);
-printf("<B>End clipping:</B> hard: %d  soft: %d</BR> \n", clippedBases[3], clippedBases[2]);
-
 printf("<B>Tags:</B>");
 bamShowTags(bam);
 puts("<BR>");
 printf("<B>Flags: </B><tt>0x%02x:</tt><BR>\n &nbsp;&nbsp;", core->flag);
 bamShowFlagsEnglish(bam);
 puts("<BR>");
 if (bamIsRc(bam))
     printf("<em>Note: although the read was mapped to the reverse strand of the genome, "
 	   "the sequence and CIGAR in BAM are relative to the forward strand.</em><BR>\n");
 puts("<BR>");
 struct dnaSeq *genoSeq = hChromSeq(database, seqName, tStart, tEnd);
 char *qSeq = bamGetQuerySequence(bam, FALSE);
 if (core->l_qseq > 5000)
     printf("<B>Alignment not shown, query sequence is %d bp long &gt; 5000bp</B><BR>\n", core->l_qseq);
 else