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;