1d18a5cec479c93bf7ed00b37582a8ad37d9be15 braney Fri Jan 31 12:03:19 2014 -0800 some changes from danile to make it a bit more obvious what overlappingmeans wrt bigWigCat. diff --git src/utils/bigWigCat/bigWigCat.c src/utils/bigWigCat/bigWigCat.c index dda9e1f..2d001aa 100644 --- src/utils/bigWigCat/bigWigCat.c +++ src/utils/bigWigCat/bigWigCat.c @@ -556,32 +556,45 @@ char filesOverlap(struct bbiFile * A, struct bbiFile * B) { if (A->unzoomedCir->endChromIx < B->unzoomedCir->startChromIx) return 0; else if (A->unzoomedCir->endChromIx > B->unzoomedCir->startChromIx) return 1; else return A->unzoomedCir->endBase >= B->unzoomedCir->startBase; } void checkOverlaps(char ** inNames, struct bbiFile ** inFiles, int inNamesCount) { int index; for (index = 1; index < inNamesCount; index++) - if (filesOverlap(inFiles[index-1], inFiles[index])) - errAbort("Files %s and %s overlap, cannot continue!\n", inNames[index-1], inNames[index]); + if (filesOverlap(inFiles[index-1], inFiles[index])) { + struct cirTreeFile * ct1 = inFiles[index-1]->unzoomedCir; + struct cirTreeFile * ct2 = inFiles[index]->unzoomedCir; + char chrom1[100], chrom2[100], chrom3[100], chrom4[100]; + bbiCachedChromLookup(inFiles[index-1], ct1->startChromIx, -1, chrom1, 100); + bbiCachedChromLookup(inFiles[index-1], ct1->endChromIx, -1, chrom2, 100); + bbiCachedChromLookup(inFiles[index], ct2->startChromIx, -1, chrom3, 100); + bbiCachedChromLookup(inFiles[index], ct2->endChromIx, -1, chrom4, 100); + errAbort("Files %s and %s overlap, cannot continue!\n" + "%s spans from %s:%i to %s:%i\n" + "%s spans from %s:%i to %s:%i\n", + inNames[index-1], inNames[index], + inNames[index-1], chrom1, ct1->startBase, chrom2, ct1->endBase, + inNames[index], chrom3, ct2->startBase, chrom4, ct2->endBase); + } } void checkFileSettings(char ** inNames, struct bbiFile ** inFiles, int inNamesCount) { checkCompression(inNames, inFiles, inNamesCount); checkBlockSize(inNames, inFiles, inNamesCount); checkChromosomes(inNames, inFiles, inNamesCount); sortFilesByCoords(inNames, inFiles, inNamesCount); checkOverlaps(inNames, inFiles, inNamesCount); checkReductions(inNames, inFiles, inNamesCount); } void bigWigCat( char **inNames, /* Input files in big wig format. */ int inNamesCount, /* Number of input files */ @@ -614,30 +627,31 @@ void usage() /* Explain usage and exit. */ { errAbort( "bigWigCat v %d - merge non-overlapping bigWig files\n" "directly into bigWig format\n" "usage:\n" " bigWigCat out.bw in1.bw in2.bw ...\n" "Where in*.bw is in big wig format\n" "and out.bw is the output indexed big wig file.\n" "options:\n" " -itemsPerSlot=N - Number of data points bundled at lowest level. Default %d\n" "\n" "Note: must use wigToBigWig -fixedSummaries -keepAllChromosomes (perhaps in parallel cluster jobs) to create the input files.\n" + "Note: By non-overlapping we mean the entire span of each file, from first data point to last data point, must not overlap with that of other files.\n" , bbiCurrentVersion, itemsPerSlot ); } int main(int argc, char *argv[]) { optionInit(&argc, argv, options); /* Process command line. */ optionInit(&argc, argv, options); itemsPerSlot = optionInt("itemsPerSlot", itemsPerSlot); if (argc < 4) usage(); char * outName = argv[1]; char ** inNames = argv + 2;