d772009c6a70cb89a5baa33bc58499f1286827cb
kate
  Fri Jan 8 09:21:34 2021 -0800
Add padding to multi-region view and custom track generated by multiRegionBedUrl setting. refs #26385

diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index 8927d88..01854d6 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -429,34 +429,37 @@
 boolean doLightColor = TRUE;
 
 int id = 1;
 char name[100];
 char userColor[10];
 struct bed *region;
 
 struct tempName mrTn;
 trashDirFile(&mrTn, "hgt", "custRgn_track", ".bed");
 FILE *f = fopen(mrTn.forCgi, "w");
 if (f == NULL)
     errAbort("can't create temp file %s", mrTn.forCgi);
 char regionInfo[1024];
 char *regionFile = cloneString(mrTn.forCgi);
 
-#ifdef LATER
+// TODO: trackDb setting ?
+#define MULTI_REGION_BED_DEFAULT_PADDING        1000
+int padding = MULTI_REGION_BED_DEFAULT_PADDING;
 safef(regionInfo, sizeof regionInfo, "#padding %d\n", padding);
 mustWrite(f, regionInfo, strlen(regionInfo));
 
+#ifdef LATER
 safef(regionInfo, sizeof regionInfo, "#shortDesc %s\n", name);
 mustWrite(f, regionInfo, strlen(regionInfo));
 #endif
 
 // write to trash file and custom track
 while (lineFileChopNext(lf, words, bedSize))
     {
     region = bedLoadN(words, bedSize);
     if (bedSize < 9)
         {
         // assign alternating light/dark color
         color = doLightColor ? colorLight : colorDark;
         doLightColor = !doLightColor;
         }
     else
@@ -473,34 +476,36 @@
     if (bedSize < 4)
         {
         // region label based on chrom and an item number
         safef(name, sizeof name, "r%d/%s", id++, region->chrom);
         }
     else
         {
         strcpy(name, region->name);
         }
     // write to trash file
     safef(regionInfo, sizeof regionInfo, "%s\t%d\t%d\n",
                     region->chrom, region->chromStart, region->chromEnd);
     mustWrite(f, regionInfo, strlen(regionInfo));
 
     // write to custom track
+    int start = max(region->chromStart - padding, 0);
+    int end = min(region->chromEnd + padding, hChromSize(db, region->chrom));
     dyStringPrintf(dsCustomText, "%s\t%d\t%d\t%s\t"
                         "0\t.\t%d\t%d\t%s\n",
-                            region->chrom, region->chromStart, region->chromEnd,  name,
-                            region->chromStart, region->chromEnd, color);
+                            region->chrom, start, end,  name,
+                            start, end, color);
     }
 lineFileClose(&lf);
 fclose(f);
 
 // create SHA1 file; used to see if file has changed
 unsigned char hash[SHA_DIGEST_LENGTH];
 SHA1((const unsigned char *)regionInfo, strlen(regionInfo), hash);
 char newSha1[(SHA_DIGEST_LENGTH + 1) * 2];
 hexBinaryString(hash, SHA_DIGEST_LENGTH, newSha1, (SHA_DIGEST_LENGTH + 1) * 2);
 char sha1File[1024];
 safef(sha1File, sizeof sha1File, "%s.sha1", mrTn.forCgi);
 f = mustOpen(sha1File, "w");
 mustWrite(f, newSha1, strlen(newSha1));
 carefulClose(&f);