8a75f8b98316f72a4539944c73e840126411a426 kate Thu Sep 13 12:49:04 2018 -0700 Initial work for pack mode display of interactions as linked features. Doesn't recognize pack mode, and doesn't display as linked features (just as bed3). refs #21917 diff --git src/hg/lib/interact.c src/hg/lib/interact.c index 78bbbcc..ff6f3c1 100644 --- src/hg/lib/interact.c +++ src/hg/lib/interact.c @@ -359,15 +359,121 @@ ret->value = sqlDouble(row[5]); ret->exp = cloneString(row[6]); ret->color = bedParseColor(row[7]); ret->sourceChrom = cloneString(row[8]); ret->sourceStart = sqlUnsigned(row[9]); ret->sourceEnd = sqlUnsigned(row[10]); ret->sourceName = cloneString(row[11]); ret->sourceStrand = cloneString(row[12]); ret->targetChrom = cloneString(row[13]); ret->targetStart = sqlUnsigned(row[14]); ret->targetEnd = sqlUnsigned(row[15]); ret->targetName = cloneString(row[16]); ret->targetStrand = cloneString(row[17]); return ret; } + +#ifdef DEBUG +struct bed *interactBedLoad(char **row) +/* Load an interact from row fetched with select * from interact + * from database, as a BED12. Dispose of this with bedFree(). */ +// TODO: more validating, and consider bed12Source (can include exp field for mouseover) +{ +struct bed *ret; + +AllocVar(ret); +ret->chrom = cloneString(row[0]); +ret->chromStart = sqlUnsigned(row[1]); +ret->chromEnd = sqlUnsigned(row[2]); +ret->name = cloneString(row[3]); +ret->score = sqlUnsigned(row[4]); +ret->thickStart = ret->chromStart; +ret->thickEnd = ret->chromEnd; +ret->itemRgb = sqlUnsigned(row[7]); + +char *sourceChrom = row[8]; +int sourceStart = sqlUnsigned(row[9]); +int sourceEnd = sqlUnsigned(row[10]); +char *targetChrom = row[13]; +int targetStart = sqlUnsigned(row[14]); +int targetEnd = sqlUnsigned(row[15]); +char *strand = "+"; +if (differentString(sourceChrom, targetChrom)) + { + // inter-chromosomal + if sameString(ret->chrom, targetChrom) + strand = "-"; + } +else + { + ret->blockCount = 2; + AllocArray(ret->blockSizes, 2); + AllocArray(ret->chromStarts, 2); + if (targetStart < sourceStart) + { + strand = "-"; + ret->blockSizes[1] = sourceEnd - sourceStart; + ret->blockSizes[0] = targetEnd - targetStart; + ret->chromStarts[1] = sourceStart; + ret->chromStarts[0] = targetStart; + } + else + { + ret->blockSizes[0] = sourceEnd - sourceStart; + ret->blockSizes[1] = targetEnd - targetStart; + ret->chromStarts[0] = sourceStart; + ret->chromStarts[1] = targetStart; + } + } +strcpy(ret->strand, strand); +bed->label = bed->name; +return ret; +} +#endif + +struct bed *interactToBed(struct interact *inter) +/* Convert an interact to a BED12 */ +{ +struct bed *bed = NULL; +AllocVar(bed); + +bed->chrom = inter->chrom; +bed->chromStart = inter->chromStart; +bed->chromEnd = inter->chromEnd; +bed->name = inter->name; +bed->score = inter->score; +bed->thickStart = inter->chromStart; +bed->thickEnd = inter->chromEnd; +bed->itemRgb = inter->color; + +char *strand = "+"; +if (differentString(inter->sourceChrom, inter->targetChrom)) + { + // inter-chromosomal + if sameString(bed->chrom, inter->targetChrom) + strand = "-"; + } +else + { + bed->blockCount = 2; + AllocArray(bed->blockSizes, 2); + AllocArray(bed->chromStarts, 2); + if (inter->targetStart < inter->sourceStart) + { + strand = "-"; + bed->blockSizes[1] = inter->sourceEnd - inter->sourceStart; + bed->blockSizes[0] = inter->targetEnd - inter->targetStart; + bed->chromStarts[1] = inter->sourceStart; + bed->chromStarts[0] = inter->targetStart; + } + else + { + bed->blockSizes[0] = inter->sourceEnd - inter->sourceStart; + bed->blockSizes[1] = inter->targetEnd - inter->targetStart; + bed->chromStarts[0] = inter->sourceStart; + bed->chromStarts[1] = inter->targetStart; + } + } +strcpy(bed->strand, strand); +bed->label = bed->name; +return bed; +}