48b920782dcf3eff2151fa74078be1622ecbb9f4
kate
  Wed Aug 28 15:22:22 2019 -0700
Avoid duplicating regions when nested. refs #22422

diff --git src/hg/hgc/interactClick.c src/hg/hgc/interactClick.c
index 3005f75..b34f784 100644
--- src/hg/hgc/interactClick.c
+++ src/hg/hgc/interactClick.c
@@ -179,49 +179,53 @@
 struct hash *uniqRegions = hashNew(0);
 for (inter = inters; inter != NULL; inter = inter->next)
     {
     char buf[256];
     //safef(buf, sizeof buf, "%s:%d-%d", region1->chrom, region1->chromStart, region1->chromEnd);
     safef(buf, sizeof buf, "%s:%d-%d", inter->sourceChrom, inter->sourceStart, inter->sourceEnd);
     if (!hashLookup(uniqRegions, buf))
         {
         hashAdd(uniqRegions, cloneString(buf), NULL);
         AllocVar(region);
         region->chrom = inter->sourceChrom;
         region->chromStart = inter->sourceStart;
         region->chromEnd = inter->sourceEnd;
         slAddHead(&regions, region);
         }
-    //safef(buf, sizeof buf, "%s:%d-%d", region2->chrom, region2->chromStart, region2->chromEnd);
     safef(buf, sizeof buf, "%s:%d-%d", inter->targetChrom, inter->targetStart, inter->targetEnd);
     if (!hashLookup(uniqRegions, buf))
         {
         hashAdd(uniqRegions, cloneString(buf), NULL);
         AllocVar(region);
         region->chrom = inter->chrom;
         region->chromStart = inter->targetStart;
         region->chromEnd = inter->targetEnd;
         slAddHead(&regions, region);
         }
     }
 slSort(&regions, bedCmp);
+struct bed *prevRegion = NULL;
 for (region = regions; region != NULL; region = region->next)
     {
+    // filter out nested regions
+    if (prevRegion == NULL || region->chromStart >=  prevRegion->chromEnd)
+        {
         safef(regionInfo, sizeof regionInfo, "%s\t%d\t%d\n",
                     region->chrom, region->chromStart, region->chromEnd);
         mustWrite(f, regionInfo, strlen(regionInfo));
-    //warn("%s", regionInfo);
+        }
+    prevRegion = region;
     }
 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);
 return cloneString(mrTn.forCgi);
 }