6e9453c2d801b2b3997cff07da444afebc810fc7
tdreszer
  Mon Dec 13 10:32:27 2010 -0800
Fixed type=ld2 form remine #1333.4.  Didn't work with ClosestToHome logic which caused rightClick weirdnesses.
diff --git src/hg/hgTracks/variation.c src/hg/hgTracks/variation.c
index 61e316a..8a3e09b 100644
--- src/hg/hgTracks/variation.c
+++ src/hg/hgTracks/variation.c
@@ -1150,36 +1150,33 @@
 /*******************************************************************/
 
 /* Declare our color gradients and the the number of colors in them */
 Color ldShadesPos[LD_DATA_SHADES];
 Color ldHighLodLowDprime; /* pink */
 Color ldHighDprimeLowLod; /* blue */
 int colorLookup[256];
 
 void ldShadesInit(struct track *tg, struct hvGfx *hvg, boolean isDprime)
 /* Allocate the LD for positive and negative values, and error cases */
 {
 static struct rgbColor white = {255, 255, 255};
 static struct rgbColor red   = {255,   0,   0};
 static struct rgbColor green = {  0, 255,   0};
 static struct rgbColor blue  = {  0,   0, 255};
-char var[512];
 char *ldPos = NULL;
 
-char *track = tg->tdb->parent ? tg->tdb->parent->track : tg->tdb->track;
-safef(var, sizeof(var), "%s_pos", track);
-ldPos = cartUsualString(cart, var, ldPosDefault);
+ldPos = cartUsualStringClosestToHome(cart, tg->tdb, FALSE, "_pos", ldPosDefault);
 ldHighLodLowDprime = hvGfxFindColorIx(hvg, 255, 224, 224); /* pink */
 ldHighDprimeLowLod = hvGfxFindColorIx(hvg, 192, 192, 240); /* blue */
 if (sameString(ldPos,"red"))
     hvGfxMakeColorGradient(hvg, &white, &red,   LD_DATA_SHADES, ldShadesPos);
 else if (sameString(ldPos,"blue"))
     hvGfxMakeColorGradient(hvg, &white, &blue,  LD_DATA_SHADES, ldShadesPos);
 else if (sameString(ldPos,"green"))
     hvGfxMakeColorGradient(hvg, &white, &green, LD_DATA_SHADES, ldShadesPos);
 else
     errAbort("LD fill color must be 'red', 'blue', or 'green'; '%s' is not recognized", ldPos);
 }
 
 void bedLoadLdItemByQuery(struct track *tg, char *table,
 			char *query, ItemLoader loader)
 /* LD specific tg->item loader, as we need to load items beyond
@@ -1375,35 +1372,31 @@
 return; /* mapDiamondUI is working well, but there is a bug with
 	   AREA=POLY on the Mac browsers, so this will be
 	   postponed for now by not using this code */
 	/* also, since it only goes to hgTrackUi, it is redundant with mapTrackBackground.
 	 * so keep this disabled until there is something more specific like an hgc
 	 * handler for diamonds. */
 if (drawMap && xt-xl>5 && xb-xl>5)
     mapDiamondUi(hvg, xl, yl, xt, yt, xr, yr, xb, yb, name, tg->track,
 		 tg->tdb->parent ? tg->tdb->parent->track : tg->tdb->track);
 }
 
 Color getOutlineColor(struct track *tg, int itemCount)
 /* get outline color from cart and set outlineColor*/
 {
 char *outColor = NULL;
-char var[512];
-
-char *track = tg->tdb->parent ? tg->tdb->parent->track : tg->tdb->track;
-safef(var, sizeof(var), "%s_out", track);
-outColor = cartUsualString(cart, var, ldOutDefault);
+outColor = cartUsualStringClosestToHome(cart, tg->tdb, FALSE, "_out", ldOutDefault);
 if (winEnd-winStart > 100000)
     return 0;
 if (sameString(outColor,"yellow"))
     return MG_YELLOW;
 else if (sameString(outColor,"red"))
     return MG_RED;
 else if (sameString(outColor,"blue"))
     return MG_BLUE;
 else if (sameString(outColor,"green"))
     return MG_GREEN;
 else if (sameString(outColor,"white"))
     return MG_WHITE;
 else if (sameString(outColor,"black"))
     return MG_BLACK;
 else
@@ -1537,34 +1530,31 @@
 /* Draw dynamically computed dense LD values */
 {
 struct hashEl *hashEl, *stats=hashElListHash(ldHash);
 for (hashEl=stats; hashEl!=NULL; hashEl=hashEl->next)
     ldDrawDenseValue(hvg, tg, xOff, yOff, scale, outlineColor, hashEl->val);
 hashElFreeList(&stats);
 }
 
 void ldDrawDense(struct hvGfx *hvg, struct track *tg, int xOff, int yOff,
 		 double scale, Color outlineColor,
 		 boolean isLod, boolean isRsquared)
 /* Draw precomputed dense LD values from ld2 table. */
 {
 static struct ldStats lds;
 struct ld2 *dPtr;
-char var[512];
-char *track = tg->tdb->parent ? tg->tdb->parent->track : tg->tdb->track;
-safef(var, sizeof(var), "%s_gap", track);
-boolean useTInt = cartUsualBoolean(cart, var, ldGapDefault);
+boolean useTInt = cartUsualBooleanClosestToHome(cart, tg->tdb, FALSE, "_gap", ldGapDefault);
 for (dPtr = tg->items;  dPtr != NULL;  dPtr = dPtr->next)
     {
     lds.chromStart = dPtr->chromStart;
     if (isLod)
 	lds.sumValues = ldIndexCharToInt(dPtr->avgLod);
     else if (isRsquared)
 	lds.sumValues = ldIndexCharToInt(dPtr->avgRsquared);
     else
 	lds.sumValues = ldIndexCharToInt(dPtr->avgDprime);
     lds.n = (lds.sumValues < 0) ? 0 : 1;
     if (useTInt &&
 	dPtr->tInt >= 'c' && dPtr->tInt <= 'h' &&
 	dPtr->next != NULL && dPtr->next->chromStart > winStart)
 	{
 	/* Use tInt to color the spaces between SNPs. */
@@ -1575,46 +1565,43 @@
 	int x2 = round((dPtr->next->chromStart-winStart)*scale) + xOff;
 	int w  = x2 - x1;
 	hvGfxBox(hvg, x1, yOff, w, tg->heightPer-1, shade);
 	}
     ldDrawDenseValue(hvg, tg, xOff, yOff, scale, outlineColor, &lds);
     }
 }
 
 void ldDrawLeftLabels(struct track *tg, int seqStart, int seqEnd,
 	struct hvGfx *hvg, int xOff, int yOff, int width, int height,
 	boolean withCenterLabels, MgFont *font,
 	Color color, enum trackVisibility vis)
 /* Draw left labels. */
 {
 char  label[17];
-char  var[512];
 char *ldVal;
 int   yVisOffset;
 if (vis == tvDense)
     {
     if (withCenterLabels && !tdbIsComposite(tg->tdb))
 	yVisOffset = tg->heightPer;
     else
 	yVisOffset = 0;
     }
 else
     yVisOffset = tg->heightPer + height/2;
 
-char *track = tg->tdb->parent ? tg->tdb->parent->track : tg->tdb->track;
-safef(var, sizeof(var), "%s_val", track);
-ldVal = cartUsualString(cart, var, ldValDefault);
+ldVal = cartUsualStringClosestToHome(cart, tg->tdb, FALSE, "_val", ldValDefault);
 if (sameString(ldVal, "lod"))
     ldVal = cloneString("LOD");
 else if (sameString(ldVal, "rsquared"))
     ldVal = cloneString("R^2");
 else if (sameString(ldVal, "dprime"))
     ldVal = cloneString("D'");
 else
     errAbort("%s values are not recognized", ldVal);
 
 if (isNotEmpty(tg->shortLabel) && strlen(tg->shortLabel) <= 12)
     safef(label, sizeof(label), "%s %s", tg->shortLabel, ldVal);
 else
     {
     char *pop = cloneString(tg->table);
     char *ptr = strstr(pop, "ChbJpt");
@@ -1672,40 +1659,35 @@
 		 MgFont *font, Color color, enum trackVisibility vis)
 /* Draw item list, one per track. */
 {
 struct ld2  *dPtr = NULL, *sPtr = NULL; /* pointers to 5' and 3' ends */
 boolean      isLod     = FALSE, isRsquared = FALSE, isDprime = FALSE;
 double       scale     = scaleForPixels(insideWidth);
 int          itemCount = slCount((struct slList *)tg->items);
 Color        shade     = 0, outlineColor = getOutlineColor(tg, itemCount);
 int          a, b, c, d, i; /* chromosome coordinates and counter */
 boolean      drawMap   = FALSE; /* ( itemCount<1000 ? TRUE : FALSE ); */
 struct hash *ldHash    = newHash(20);
 Color        yellow    = hvGfxFindRgb(hvg, &undefinedYellowColor);
 char        *ldVal     = NULL;
 boolean      ldTrm;
 boolean      ldInv;
-char         var[512];
 boolean dynamicDense = FALSE;
 
-safef(var, sizeof(var), "%s_inv", tg->tdb->track);
-ldInv = cartUsualBoolean(cart, var, ldInvDefault);
-char *track = tg->tdb->parent ? tg->tdb->parent->track : tg->tdb->track;
-safef(var, sizeof(var), "%s_val", track);
-ldVal = cartUsualString( cart, var, ldValDefault);
-safef(var, sizeof(var), "%s_trm", track);
-ldTrm = cartUsualBoolean(cart, var, ldTrmDefault);
+ldInv = cartUsualBooleanClosestToHome(cart, tg->tdb, FALSE, "_inv", ldInvDefault);
+ldVal = cartUsualStringClosestToHome( cart, tg->tdb, FALSE, "_val", ldValDefault);
+ldTrm = cartUsualBooleanClosestToHome(cart, tg->tdb, FALSE, "_trm", ldTrmDefault);
 
 if (tg->limitedVisSet)
     vis = tg->limitedVis;
 if (vis != tvDense && vis != tvFull)
     errAbort("Visibility '%s'(%d) is not supported for the LD track yet.",
 	     hStringFromTv(vis), vis);
 if (vis == tvDense)
     {
     if (tg->tdb && sameString(tg->tdb->type, "ld2"))
 	dynamicDense = FALSE;
     else
 	dynamicDense = TRUE;
     }
 if (vis == tvDense)
     hvGfxBox(hvg, insideX, yOff, insideWidth, tg->height-1, yellow);