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;
 		}