d08b94fcff0787dd853676e631364945c4986bfe max Sun Jun 14 09:21:03 2026 -0700 ading p. notation to mouseover, no redmine yet diff --git src/hg/hgTracks/simpleTracks.c src/hg/hgTracks/simpleTracks.c index c2fc00ab771..3203fa63434 100644 --- src/hg/hgTracks/simpleTracks.c +++ src/hg/hgTracks/simpleTracks.c @@ -2996,38 +2996,38 @@ int w = ex - sx; // w could be negative, but we'll skip drawing if it is int exonIntronNumber; char *exonIntronText; int numExonIntrons = numExons; if (isExon) { exonIntronText = exonText; } else { exonIntronText = intronText; --numExonIntrons; // introns are one fewer than exons } - char strandChar; + char* strandStr; if (!revStrand) { exonIntronNumber = exonIx; - strandChar = '+'; + strandStr = "Forw"; } else { exonIntronNumber = numExonIntrons-exonIx+1; - strandChar = '-'; + strandStr = "Rev"; } // we still need to show the existing mouseover text char* existingText = lf->mouseOver; if (isEmpty(existingText)) existingText = lf->name; // construct a string that tells the user about the codon frame situation of this exon // char *frameText = ""; // for coding exons, determine the start and end phase of the exon and an English text describing both: // if transcript is on + strand, the start phase is the exonFrame value, and the end phase is the next exonFrame (3' on DNA) value // if transcript is on - strand, the start phase is the previous (=3' on DNA) exonFrame and the end phase is the exonFrame int startPhase = -1; int endPhase = -1; char phaseText[EXONTEXTLEN]; @@ -3074,59 +3074,65 @@ codonex = (codonex > picEnd) ? picEnd : codonex; int w = codonex - codonsx; if (w > 0) { // temporarily remove the mouseOver from the lf, since linkedFeatureMapItem will always // prefer a lf->mouseOver over the itemName char *oldMouseOver = lf->mouseOver; lf->mouseOver = NULL; dyStringClear(codonDy); // if you change this text, make sure you also change hgTracks.js:mouseOverToLabel if (!isEmpty(existingText)) dyStringPrintf(codonDy, "<b>Transcript: </b> %s<br>", existingText); int codonHgvsIx = (codon->codonIndex - 1) * 3; if (codonHgvsIx >= 0) - dyStringPrintf(codonDy, "<b>Codons: </b> c.%d-%d<br>", codonHgvsIx + 1, codonHgvsIx + 3); + { + int cStart = codonHgvsIx + 1; + int cEnd = codonHgvsIx + 3; + int pStart = codonHgvsIx / 3; + dyStringPrintf(codonDy, "<b>Codons: </b> c.%d-%d (p.%d-%d)<br>", + cStart, cEnd, pStart, pStart+1); + } // if you change the text below, also change hgTracks:mouseOverToExon - dyStringPrintf(codonDy, "<b>Strand: </b> %c <b>Length: </b>%dbp<br><b>Exon: </b>%s %d of %d<br>%s", - strandChar, e - s, exonIntronText, exonIntronNumber, numExonIntrons, phaseText); + dyStringPrintf(codonDy, "<b>Strand: </b> %s <b>Length: </b>%dbp<br><b>Exon: </b>%s %d of %d<br>%s", + strandStr, e - s, exonIntronText, exonIntronNumber, numExonIntrons, phaseText); tg->mapItem(tg, hvg, item, codonDy->string, tg->mapItemName(tg, item), sItem, eItem, codonsx, y, w, heightPer); // and restore the mouseOver lf->mouseOver = oldMouseOver; } } } } } else // either an intron, or else an exon zoomed out too far for codons (or no codons) { // if you change this text, make sure you also change hgTracks.js:mouseOverToLabel // if you change the text below, also change hgTracks:mouseOverToExon char *posNote = ""; char *exonOrIntron = "Intron"; if (isExon) { posNote = "<b>Codons:</b> Zoom in to show cDNA position<br>"; exonOrIntron = "Exon"; } safef(mouseOverText, sizeof(mouseOverText), "<b>Transcript:</b> %s<br>%s" - "<b>Strand:</b> %c<br><b>%s:</b> %s %d of %d <b>Length:</b> %d bp<br>%s", - existingText, posNote, strandChar, exonOrIntron, exonIntronText, + "<b>Strand:</b> %s<br><b>%s:</b> %s %d of %d <b>Length:</b> %d bp<br>%s", + existingText, posNote, strandStr, exonOrIntron, exonIntronText, exonIntronNumber, numExonIntrons, e - s, phaseText); // temporarily remove the mouseOver from the lf, since linkedFeatureMapItem will always // prefer a lf->mouseOver over the itemName char *oldMouseOver = lf->mouseOver; lf->mouseOver = NULL; tg->mapItem(tg, hvg, item, mouseOverText, tg->mapItemName(tg, item), sItem, eItem, sx, y, w, heightPer); // and restore the old mouseOver lf->mouseOver = oldMouseOver; picStart = ex; // prevent pileups. is this right? add 1? does it work? // JC: Why do we care about pileups? First mapbox drawn wins. } }