918ed323bb2a24640f3f08b61a7431a5f1fa6c6c kate Tue Sep 3 15:58:03 2019 -0700 Fix problem with interchromosomal multi-region. refs #22422 diff --git src/hg/hgc/interactClick.c src/hg/hgc/interactClick.c index b34f784..92b75e9 100644 --- src/hg/hgc/interactClick.c +++ src/hg/hgc/interactClick.c @@ -153,73 +153,74 @@ *retStart = minStart; *retEnd = maxEnd; // consider sorting on score or position return filtered; } static char *makeInteractRegionFile(char *name, struct interact *inters) /* Create bed file in trash directory with end coordinates for multi-region mode */ { struct tempName mrTn; trashDirFile(&mrTn, "hgt", "custRgn_interact", ".bed"); FILE *f = fopen(mrTn.forCgi, "w"); if (f == NULL) errAbort("can't create temp file %s", mrTn.forCgi); char regionInfo[1024]; -int padding = 200; +int padd safef(regionInfo, sizeof regionInfo, "#padding %d\n", padding); mustWrite(f, regionInfo, strlen(regionInfo)); //warn("%s", regionInfo); safef(regionInfo, sizeof regionInfo, "#shortDesc %s\n", name); mustWrite(f, regionInfo, strlen(regionInfo)); //warn("%s", regionInfo); struct interact *inter = NULL; struct bed *region, *regions = NULL; 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(®ions, region); } 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->chrom = inter->targetChrom; region->chromStart = inter->targetStart; region->chromEnd = inter->targetEnd; slAddHead(®ions, region); } } slSort(®ions, bedCmp); struct bed *prevRegion = NULL; for (region = regions; region != NULL; region = region->next) { // filter out nested regions - if (prevRegion == NULL || region->chromStart >= prevRegion->chromEnd) + if (prevRegion == NULL || differentString(region->chrom, prevRegion->chrom) || + 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)); } 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];