f6154dbb0025a2308f28e584a8cfacf1a68735bd
hiram
  Wed Jul 26 11:34:04 2017 -0700
correct outage when endsAG was introduced as a filter during rangeScan refs #18969

diff --git src/utils/crisprKmers/crisprKmers.c src/utils/crisprKmers/crisprKmers.c
index 2a4ea99..74ff601 100644
--- src/utils/crisprKmers/crisprKmers.c
+++ src/utils/crisprKmers/crisprKmers.c
@@ -347,57 +347,60 @@
 register long long v = (val ^ fortySixBits) << 18;
 v = ((v & high32bits) >> 32) | ((v & low32bits) << 32);
 v = ((v & high16bits) >> 16) | ((v & low16bits) << 16);
 v = ((v & high8bits) >> 8) | ((v & low8bits) << 8);
 v = ((v & high4bits) >> 4) | ((v & low4bits) << 4);
 v = ((v & high2bits) >> 2) | ((v & low2bits) << 2);
 return v;
 }	//	static long long revComp(long long val)
 
 static void copyToArray(struct crisprList *list)
 /* copy the crispr list data into arrays */
 {
 long startTime = clock1000();
 struct crisprList *cl;
 long long itemsCopied = 0;
+long long chromsCopied = 0;
 
 for (cl = list; cl; cl = cl->next)
     {
+    ++chromsCopied;
     size_t memSize = cl->crisprCount * sizeof(long long);
     cl->sequence = (long long *)needLargeMem(memSize);
     cl->start = (long long *)needLargeMem(memSize);
     memSize = 5 * sizeof(int *);
     cl->offBy = (int **)needLargeMem(memSize);
     memSize = cl->crisprCount * sizeof(int);
     int r;
     for (r = 0; r < 5; ++r)
         cl->offBy[r] = (int *)needLargeZeroedMem(memSize);
     memSize = cl->crisprCount * sizeof(float);
     cl->mitSum = (float *)needLargeMem(memSize);
 
     long long i = 0;
     struct crispr *c;
     for (c = cl->chromCrisprs; c; c = c->next)
         {
 	++itemsCopied;
         cl->sequence[i] = c->sequence;
         cl->start[i] = c->start;
         cl->mitSum[i] = 0.0;
 	++i;
         }
     }
 
+verbose(1, "# copyToArray: copied %lld chromosome lists\n", chromsCopied);
 timingMessage("copyToArray", itemsCopied, "items copied", startTime,
     "items/sec", "seconds/item");
 
 }	//	static void copyToArray(struct crisprList *list)	*/
 
 static struct crisprList *generateKmers(struct dnaSeq *seq)
 {
 struct crispr *crisprSet = NULL;
 struct crisprList *returnList = NULL;
 AllocVar(returnList);
 returnList->chrom = cloneString(seq->name);
 returnList->size = seq->size;
 int i;
 DNA *dna;
 long long chromPosition = 0;
@@ -605,31 +608,34 @@
     {
     nextList = list->next;	// remember before perhaps lost
     long long beforeCrisprCount = list->crisprCount;
     examinedCrisprCount += list->crisprCount;
     struct binKeeper *bk = hashFindVal(rangesHash, list->chrom);
     struct crispr *newCrispr = NULL;
     if (bk != NULL)
         {
 	struct crispr *prevCrispr = NULL;
 	struct crispr *next = NULL;
 	struct crispr *c;
         for (c = list->chromCrisprs; c; c = next)
             {
 	    next = c->next;	// remember before perhaps lost
 	    if (endsAG == (c->sequence & 0xf))
+		{
+		prevCrispr = c;	// remains on 'all' list
 		continue;	// only check guides endsGG
+		}
             struct binElement *hitList = NULL;
 	    // select any guide that is at least half contained in any range
 	    int midPoint = c->start + ((pamSize + guideSize) >> 1);
 //            if (negativeStrand & c->sequence)
 //                start += 2;
 //            int end = midPoint + 1;
             hitList = binKeeperFind(bk, midPoint, midPoint + 1);
             if (hitList)
 		{
 		if (prevCrispr)	// remove this one from the 'all' list
 		    prevCrispr->next = next;
                 else
                     list->chromCrisprs = next;	// removing the first one
 		c->next = NULL;			// new item for new list
 		slAddHead(&newCrispr, c);	// constructing new list