492f14378114d5b9c65e36137ad953b631fd7572 galt Fri Feb 27 13:00:13 2026 -0800 Fixes issue found while investigating user question about multi-region. Since brian added automatic filtering of the users last search, the gene reading routine in multi-region exon code also needs to support it, otherwise mysterious differences appear between EV and DV modes. The searched gene will appear in the output to the screen regardless of other settings for KG like geneset of sliceVariants checkbox. refs #37175 diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c index 9f82195148d..d40bfc7873c 100644 --- src/hg/hgTracks/hgTracks.c +++ src/hg/hgTracks/hgTracks.c @@ -3820,31 +3820,31 @@ //" where chrom not like '%%_hap_%%' and chrom not like '%%_random'" , knownCanonical); if (virtualSingleChrom()) sqlDyStringPrintf(query, " where chrom='%s'", chromName); kcHash = newHash(10); sr = sqlGetResult(conn, dyStringContents(query)); while ((row = sqlNextRow(sr)) != NULL) { hashAdd(kcHash, row[0], NULL); } sqlFreeResult(&sr); dyStringFree(&query); } // knownToTag basic hash struct hash *ktHash = NULL; -if (knownToTag) // filter out all but Basic +if (knownToTag) // filter out all but Basic or Mane { // load up hash of canonical transcriptIds query = sqlDyStringCreate("select name from knownToTag where value='%s'", knownToTag); ktHash = newHash(10); sr = sqlGetResult(conn, dyStringContents(query)); while ((row = sqlNextRow(sr)) != NULL) { hashAdd(ktHash, row[0], NULL); } sqlFreeResult(&sr); dyStringFree(&query); } setEMGeneTrack(); if (!emGeneTable) errAbort("Unexpected error, emGeneTable=NULL in initVirtRegionsFromEMGeneTableExons"); @@ -3910,50 +3910,54 @@ if (geneMostly) convertGenePredGeneToExon(gene); if (!sameString(lastChromSizeChrom, gene->chrom)) { chromSize = hChromSize(database, gene->chrom); safecpy(lastChromSizeChrom, sizeof lastChromSizeChrom, gene->chrom); } if (padding > 0) padExons(gene, chromSize, padding); // handle padding } else { isEOF = TRUE; } } + if (gene && hgFindMatches && !hashLookup(hgFindMatches, gene->name)) + // whitelist anything in search hash + { if (gene && !showNoncoding && (gene->cdsStart == gene->cdsEnd)) { //skip non-coding gene genePredFree(&gene); } if (gene && knownCanonical && !hashLookup(kcHash, gene->name)) { //skip gene not in knownCanonical hash genePredFree(&gene); } if (gene && knownToTag && !hashLookup(ktHash, gene->name)) { // skip gene not in knownToTag Basic hash genePredFree(&gene); } if (gene && !showPseudo && hashLookup(kpHash, gene->name)) { //skip gene in knownPseudo hash genePredFree(&gene); } + } boolean transferIt = FALSE; if (gene && !kceList) { transferIt = TRUE; } else if (gene && kceList) { // TODO need to check the chrom equality first int best = findBestKce(kceList, &bestKce, &prevKce); if (sameString(gene->chrom, chrom)) { if (gene->exonStarts[0] < best) transferIt = TRUE; }