0bdb0e42b90052c0ffd7c710ceb8d603cf27db48
galt
  Wed Jan 27 10:31:04 2016 -0800
Requested changes to multi-region config see # 16666 note 21

diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index 7fd2b16..bee1e8d 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -3456,44 +3456,42 @@
 int best = -1;
 struct kce *e, *prev = NULL;
 for(e=list; e; prev=e, e=e->next)
     {
     int start = e->gene->exonStarts[e->exonNumber];
     if ((start < best) || (best == -1))
 	{
 	best = start;
 	*pBestKce = e;
 	*pPrevKce = prev;
 	}
     }
 return best;
 }
 
-static void padExons(struct genePred *gene, int chromSize)
+static void padExons(struct genePred *gene, int chromSize, int padding)
 /* pad all of the exons */
 {
 int i;
 for(i=0; i < gene->exonCount; ++i)
     {
-    // padding
-    gene->exonStarts[i] -= emPadding;
+    gene->exonStarts[i] -= padding;
     if (gene->exonStarts[i] < 0)
 	gene->exonStarts[i] = 0;
-    gene->exonEnds[i] += emPadding;
+    gene->exonEnds[i] += padding;
     if (gene->exonEnds[i] > chromSize)
 	gene->exonEnds[i] = chromSize;
-
     }
 }
 
 static void convertGenePredGeneToExon(struct genePred *gene)
 /* convert gene into a gene with just one exon that spans the entire gene */
 {
 if (gene->exonCount < 1)
     errAbort("unexpected input in convertGenePredGeneToExon(), gene->exonCount=%d < 1", gene->exonCount);
 gene->exonEnds[0] = gene->exonEnds[gene->exonCount - 1];
 gene->exonCount = 1;
 }
 
 void initVirtRegionsFromEMGeneTableExons(boolean showNoncoding, char *knownCanonical, char *knownToTag, boolean geneMostly)
 /* Create a regionlist from knownGene exons. */
 // Merge exon regions that overlap. 
@@ -3511,30 +3509,33 @@
 // which is slow, or trying to read one chrom at a time in the sorted order which is also slow, we can instead
 // just fetch them in their native order, and then create a duplicate array and copy the contents
 // to it in memory, one chunk per chrom, which would be very fast, but temporarily require duplicate vchrom array mem.
 // Not sure what to do about assemblies with many scaffolds.
 //
 // Adding support for extra options from Gencode hg38 so we can filter for
 // comprehensive, splice-variants, non-coding subsets.
 
 {
 struct sqlConnection *conn = hAllocConn(database);
 virtRegionList = NULL;
 struct sqlResult *sr;
 char **row;
 int rowOffset = 0;
 char query[256];
+int padding = emPadding;
+if (sameString(virtModeType, "geneMostly"))
+    padding = gmPadding;
 // knownCanonical Hash
 struct hash *kcHash = NULL;
 if (knownCanonical) // filter out alt splicing variants
     {
     // load up hash of canonical transcriptIds
     sqlSafef(query, sizeof(query), "select transcript from %s"
 	//" where chrom not like '%%_hap_%%' and chrom not like '%%_random'"
 	, knownCanonical);
     if (virtualSingleChrom())
 	sqlSafefAppend(query, sizeof(query), " where chrom='%s'", chromName);
     //warn("query = [%s]", query); // DEBUG REMOVE
     kcHash = newHash(10);
     sr = sqlGetResult(conn, query);
     while ((row = sqlNextRow(sr)) != NULL)
 	{
@@ -3596,32 +3597,32 @@
 	    readIt = FALSE;
 	if (readIt)
 	    {
 	    row = sqlNextRow(sr);
 	    if (row)
 		{
 		gene = genePredLoad(row+rowOffset);
 		//warn("GALT loaded gene %s\n", gene->name); // DEBUG REMOVE
 		if (geneMostly)
 		    convertGenePredGeneToExon(gene);
 		if (!sameString(lastChromSizeChrom, gene->chrom))
 		    {
 		    chromSize = hChromSize(database, gene->chrom);
 		    safecpy(lastChromSizeChrom, sizeof lastChromSizeChrom, gene->chrom);
 		    }
-		if (emPadding > 0)
-		    padExons(gene, chromSize); // handle padding
+		if (padding > 0)
+		    padExons(gene, chromSize, padding); // handle padding
 		}
 	    else
 		{
 		isEOF = TRUE;
 		}
 	    }
 	if (gene && !showNoncoding && (gene->cdsStart == gene->cdsEnd))
 	    {
 	    //warn("GALT skip non-coding gene %s cdsStart==cdsEnd", gene->name); // DEBUG REMOVE
 	    genePredFree(&gene);
 	    }
 	if (gene && knownCanonical && !hashLookup(kcHash, gene->name))
 	    {
 	    //warn("GALT skip not in knownCanonical hash gene %s", gene->name); // DEBUG REMOVE
 	    genePredFree(&gene);
@@ -8437,30 +8438,31 @@
 withLeftLabels = cartUsualBoolean(cart, "leftLabels", TRUE);
 withCenterLabels = cartUsualBoolean(cart, "centerLabels", TRUE);
 withGuidelines = cartUsualBoolean(cart, "guidelines", TRUE);
 if (!cartUsualBoolean(cart, "hgt.imageV1", FALSE))
     {
     withNextItemArrows = cartUsualBoolean(cart, "nextItemArrows", FALSE);
     withNextExonArrows = cartUsualBoolean(cart, "nextExonArrows", TRUE);
     }
 withExonNumbers = cartUsualBoolean(cart, "exonNumbers", TRUE);
 emAltHighlight = cartUsualBoolean(cart, "emAltHighlight", FALSE);
 if (!hIsGsidServer())
     {
     revCmplDisp = cartUsualBooleanDb(cart, database, REV_CMPL_DISP, FALSE);
     }
 emPadding = cartUsualInt(cart, "emPadding", emPadding);
+gmPadding = cartUsualInt(cart, "gmPadding", gmPadding);
 withPriorityOverride = cartUsualBoolean(cart, configPriorityOverride, FALSE);
 fullInsideX = trackOffsetX();
 fullInsideWidth = tl.picWidth-gfxBorder-fullInsideX;
 }
     
 void parseVirtPosition(char *position)
 /* parse virtual position 
  *  TODO this is just temporary */
 {
 if (!position)
     {
     errAbort("position NULL");
     }
 char *vPos = cloneString(position);
 char *colon = strchr(vPos, ':');