4a8ae7aa07f62b9b598b16648f260496b34d7005
galt
  Fri Dec 18 20:12:14 2015 -0800
Handle when the emGeneTable has poor coverage for a chromosome, leaving regionList empty. Gives the user a warning and returns to default view.

diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index 6ca5c8f..8913633 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -4181,30 +4181,35 @@
 		knownToTag = "knownToTag";
 		}
 	    }
 
 	}
     if (sameString(emGeneTable, "refGene"))
 	{
 	char varName[SMALLBUF];
 	safef(varName, sizeof(varName), "%s.hideNoncoding", emGeneTable);
 	showNoncoding = !cartUsualBoolean(cart, varName, FALSE);
 	//DISGUISE makes obsolete dySaveCartSetting(dy, varName);
 	}
 
     initVirtRegionsFromEMGeneTableExons(showNoncoding, knownCanonical, knownToTag, geneMostly);
     //warn("slCount(virtRegionList)=%d", slCount(virtRegionList));  // DEBUG REMOVE
+    if (!virtRegionList)
+	{
+	warn("No genes found on chrom %s for track %s, returning to default view", chromName, emGeneTrack->shortLabel);
+	return FALSE;   // regionList is empty, nothing found.
+	}
     if (geneMostly)
 	virtModeShortDescr = "genes";
     else
 	virtModeShortDescr = "exons";
     // DISGUISE makes obsolete dyStringPrintf(dy," %s %s", dy->string, knownCanonical, knownToTag);
     }
 else if (sameString(virtModeType, "kcGenes")) // TODO obsolete
     {
     //warn("demo KnownCanonical gene regions genome-wide."); // DEBUG REMOVE
     initVirtRegionsFromKnownCanonicalGenes("knownCanonical"); 
     virtModeShortDescr = "genes";
     }
 else if (sameString(virtModeType, "customUrl"))
     {
     //warn("custom regions from BED URL."); // DEBUG REMOVE
@@ -4296,30 +4301,33 @@
     {
     //warn("demo SOD1\n"
 	//"Shows zoomed in exon-exon junction from SOD1 gene, between exon1 and exon2."); // DEBUG REMOVE
 
     initVirtRegionsFromSOD1Hardwired();
 
     }
 else
     {
     //warn("unrecognized virtModeType = %s", virtModeType);
     return FALSE; // return to default mode
     }
 
 virtModeExtraState = dyStringCannibalize(&dy);
 
+if (!virtRegionList)
+    return FALSE;   // regionList is empty, nothing found.
+
 return TRUE;
 
 }
 
 boolean isLimitedVisHiddenForAllWindows(struct track *track)
 /* Check if track limitedVis == hidden for all windows. 
  * Return true if all are hidden */
 {
 boolean result = TRUE;
 for(;track;track=track->nextWindow)
     if (track->limitedVis != tvHide)
 	result = FALSE;
 return result;
 }