57f2a4a958e5a6432829e33deaaf7b0475971188 braney Thu Sep 17 09:52:34 2026 -0700 quickLift: keep the target strand a reverse complemented protein just got quickLiftPslBackToProtein turns the alignment over when pslTransMap hands back strand[0] == '-', because a protein psl is only ever "++" or "+-". pslRc does that and makes the target strand explicit as it goes, so the psl comes out "+-". The assignment at the end of the function then set strand[1] to '+' regardless and undid it, leaving "++" over blocks that are in minus strand target coordinates. pslIsProtein wants strand[1] plus the three to one relation between the last block and the target end, so it answered no. pslTrack.c then passed a size multiplier of one to lfFromPslx and every block was drawn at a third of its length at a mirrored position, which is the symptom the reverse complement was added to prevent. The assignment is now the else branch of the same test. hg/lib/tests/quickLiftTester.c covers this. It goes through the public quickLiftPsl rather than the static function, builds its chains in memory in the shape quickLiftSourceRanges leaves them, and needs no database. Six cases: a protein over a same strand chain and over an opposite strand chain, a chain that gaps only the reference, a chain that drops a source base and so splits a codon, an mRNA over both chains, and an alignment with no chain under it. Each one runs pslCheck2, which is what notices a strand that disagrees with the blocks. With this fix backed out, only the opposite strand case changes and it reports three errors placing the blocks outside the target range. Found in the v504 code review, refs #38349. refs #38249 diff --git src/hg/lib/tests/makefile src/hg/lib/tests/makefile index 2add88858d5..f63df5ab613 100644 --- src/hg/lib/tests/makefile +++ src/hg/lib/tests/makefile @@ -1,69 +1,74 @@ kentSrc = ../../.. include ../../../inc/common.mk L += ${MYSQLLIBS} -lm MYLIBDIR = ../../../lib/${MACHTYPE} MYLIBS = ${MYLIBDIR}/jkhgap.a ${MYLIBDIR}/jkweb.a BIN_DIR = bin/${MACHTYPE} all: ${BIN_DIR}/genePredTester \ ${BIN_DIR}/pslReaderTester \ + ${BIN_DIR}/quickLiftTester \ ${BIN_DIR}/sessionDataTester \ # ${BIN_DIR}/annoGratorTester \ ${BIN_DIR}/binTest \ ${BIN_DIR}/customTrackTester \ ${BIN_DIR}/hgvsTester \ ${BIN_DIR}/sqlCheck ${BIN_DIR}/%: %.c ${MYLIBS} @${MKDIR} ${BIN_DIR} ${CC} ${CC_PROG_OPTS} -o $@ $*.c ${MYLIBS} $L #test: binTest spDbTest hdbTest genePredTest pslReaderTest annoGratorTest customTrackTest hgvsTest -test: binTest sessionDataTest spDbTest hdbTest genePredTest pslReaderTest customTrackTest hgvsTest +test: binTest quickLiftTest sessionDataTest spDbTest hdbTest genePredTest pslReaderTest customTrackTest hgvsTest rm -r output echo tested all mkdirs: @${MKDIR} output ${BIN_DIR} loaders: ln -sf ${CGI_BIN}/loader . spDbTest: ${BIN_DIR}/spDbTest mkdirs ${BIN_DIR}/spDbTest sp121210 Q9FFH7 > output/spDbTest ${BIN_DIR}/spDbTest sp121210 P29312 >> output/spDbTest diff expected/spDbTest output/spDbTest hdbTest: ${BIN_DIR}/hdbTest mkdirs ${BIN_DIR}/hdbTest > output/hdbTest diff expected/hdbTest output/hdbTest genePredTest: ${BIN_DIR}/genePredTester mkdirs ${MAKE} -f genePredTests.mk test pslReaderTest: ${BIN_DIR}/pslReaderTester mkdirs ${MAKE} -f pslReaderTests.mk test #annoGratorTest: ${BIN_DIR}/annoGratorTester mkdirs # ${MAKE} -f annoGratorTests.mk test customTrackTest: ${BIN_DIR}/customTrackTester loaders mkdirs ${MAKE} -f customTrackTests.mk test BIN_DIR=${BIN_DIR} OUT_DIR=output hgvsTest: ${BIN_DIR}/hgvsTester mkdirs ${MAKE} -f hgvsTests.mk test binTest: mkdirs ${BIN_DIR}/binTest @./binTest.sh +quickLiftTest: ${BIN_DIR}/quickLiftTester mkdirs + ${BIN_DIR}/quickLiftTester > output/quickLiftTest + diff expected/quickLiftTest output/quickLiftTest + sessionDataTest: ${BIN_DIR}/sessionDataTester mkdirs ${BIN_DIR}/sessionDataTester output/sessionData > output/sessionDataTest diff expected/sessionDataTest output/sessionDataTest sqlCheck: ${BIN_DIR}/sqlCheck mkdirs ${MAKE} -f sqlCheck.mk test BIN_DIR=${BIN_DIR} OUT_DIR=output clean: rm -rf *.o bin output *.tmp loader udcCache