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