7f4b0407604a1cb9a879c0e3c6eacfdb0ad7827f
angie
  Thu Dec 5 11:00:10 2013 -0800
In annoGratorQueryExecute, if we're searching a specific region andthe primary source's first item comes from some later chromosome,
that simply means that the primary source has no items on the
specified chrom.  So instead of passing it to the grators, just
quit.  Also when searching a specific region, if there are no rows
from the primary source, add a comment to the output(s).
fixes #12278

diff --git src/lib/annoGratorQuery.c src/lib/annoGratorQuery.c
index 4262c2f..99aba40 100644
--- src/lib/annoGratorQuery.c
+++ src/lib/annoGratorQuery.c
@@ -1,18 +1,19 @@
 /* annoGratorQuery -- framework for integrating genomic annotations from many sources */
 
 #include "annoGratorQuery.h"
+#include "dystring.h"
 #include "errabort.h"
 #include "obscure.h"
 
 struct annoGratorQuery
 /* Representation of a complex query: multiple sources, each with its own filters,
  * output data and means of integration, aggregated and output by a formatter. */
     {
     struct annoAssembly *assembly;	// Genome assembly to which annotations belong
     struct annoStreamer *primarySource;	// Annotations to be integrated with other annos.
     struct annoGrator *integrators;	// Annotations & methods for integrating w/primary
     struct annoFormatter *formatters;	// Writers of output collected from primary & intg's
     };
 
 struct annoGratorQuery *annoGratorQueryNew(struct annoAssembly *assembly,
 					   struct annoStreamer *primarySource,
@@ -62,54 +63,74 @@
 }
 
 void annoGratorQueryExecute(struct annoGratorQuery *query)
 /* For each annoRow from query->primarySource, invoke integrators and pass their annoRows
  * to formatters. */
 {
 struct annoStreamer *primarySrc = query->primarySource;
 struct annoStreamRows *primaryData = annoStreamRowsNew(primarySrc);
 struct annoStreamRows *gratorData = NULL;
 int gratorCount = slCount(query->integrators);
 if (gratorCount > 0)
     {
     struct annoStreamer *gratorStreamList = (struct annoStreamer *)query->integrators;
     gratorData = annoStreamRowsNew(gratorStreamList);
     }
+char *regionChrom = primarySrc->chrom;
 struct annoRow *primaryRow = NULL;
 struct lm *lm = lmInit(0);
+boolean gotPrimaryData = FALSE;
 while ((primaryRow = primarySrc->nextRow(primarySrc, NULL, 0, lm)) != NULL)
     {
+    if (regionChrom != NULL && strcmp(primaryRow->chrom, regionChrom) > 0)
+	{
+	// primarySrc's first row is on some chromosome past regionChrom, i.e. it has no
+	// items on regionChrom.
+	break;
+	}
     if (primaryRow->rightJoinFail)
 	continue;
+    gotPrimaryData = TRUE;
     primaryData->rowList = primaryRow;
     boolean rjFilterFailed = FALSE;
     int i;
     for (i = 0;  i < gratorCount;  i++)
 	{
 
 	struct annoGrator *grator = (struct annoGrator *)gratorData[i].streamer;
 	gratorData[i].rowList = grator->integrate(grator, primaryData, &rjFilterFailed, lm);
 	if (rjFilterFailed)
 	    break;
 	}
     struct annoFormatter *formatter = NULL;
     for (formatter = query->formatters;  formatter != NULL;  formatter = formatter->next)
 	if (!rjFilterFailed)
 	    formatter->formatOne(formatter, primaryData, gratorData, gratorCount);
     lmCleanup(&lm);
     lm = lmInit(0);
     }
+if (!gotPrimaryData)
+    {
+    struct dyString *dy = dyStringCreate("No data from %s", primarySrc->name);
+    if (regionChrom != NULL)
+	dyStringPrintf(dy, " in range %s:%d-%d; try changing 'region to annotate' to 'genome'",
+		       regionChrom, primarySrc->regionStart, primarySrc->regionEnd);
+    struct annoFormatter *formatter = NULL;
+    for (formatter = query->formatters;  formatter != NULL;  formatter = formatter->next)
+	formatter->comment(formatter, dy->string);
+    dyStringFree(&dy);
+    }
 freez(&primaryData);
 freez(&gratorData);
 lmCleanup(&lm);
 }
 
 void annoGratorQueryFree(struct annoGratorQuery **pQuery)
 /* Close and free all inputs and outputs; free self. */
 {
 if (pQuery == NULL)
     return;
 struct annoGratorQuery *query = *pQuery;
 query->primarySource->close(&(query->primarySource));
 struct annoStreamer *grator = (struct annoStreamer *)(query->integrators), *nextGrator;
 for (;  grator != NULL;  grator = nextGrator)
     {