void gdfRcGene(struct gdfGene *gene, int size) /* Flip gene to other strand. Assumes dataPoints are already * moved into range from 0-size */ { struct gdfDataPoint *s = gene->dataPoints, *e, temp; int count = gene->dataCount; int i; int halfCount = count/2; for (i=0; i<count; ++i) { s->start = reverseOffset(s->start, size) + 1; ++s; } s = gene->dataPoints; e = s + gene->dataCount-1; for (i=0; i<halfCount; i += 1) { memcpy(&temp, s, sizeof(temp)); memcpy(s, e, sizeof(temp)); memcpy(e, &temp, sizeof(temp)); s += 1; e -= 1; } }
static void fixDirectionAndOffsets(struct gffGene *gene, char *dna, long dnaSize, int newStart) /* Reverse complement DNA if gene is on negative strand. * Update offsets of exons and introns in gene to * make them point into dna, rather than into gff->dna. */ { long oldStart; long offset; GffIntron *intron; GffExon *exon; long temp; oldStart = gene->start; offset = oldStart - newStart; gene->start -= offset; gene->end -= offset; for (intron = gene->introns; intron != NULL; intron = intron->next) { intron->start -= offset; intron->end -= offset; } for (exon = gene->exons; exon != NULL; exon = exon->next) { exon->start -= offset; exon->end -= offset; } if (gene->strand == '-') { reverseComplement(dna, dnaSize); temp = reverseOffset(gene->start, dnaSize); gene->start = reverseOffset(gene->end, dnaSize); gene->end = temp; for (intron = gene->introns; intron != NULL; intron = intron->next) { temp = reverseOffset(intron->start, dnaSize); intron->start = reverseOffset(intron->end, dnaSize); intron->end = temp; } for (exon = gene->exons; exon != NULL; exon = exon->next) { temp = reverseOffset(exon->start, dnaSize); exon->start = reverseOffset(exon->end, dnaSize); exon->end = temp; } slReverse(&gene->introns); slReverse(&gene->exons); gene->strand = '+'; } }
void aliTrack(char *bacAcc, char *wholeName, char *partsName, struct memGfx *mg, int x, int y, FILE *mapFile, int trim, char *repeatMask) /* Write out one alignment track. */ { struct dnaSeq *whole, *partList, *part; bits16 contig; int maxBlockSize = 5000; int wholeSize; struct patSpace *ps; DNA *wholeDna; whole = faReadAllDna(wholeName); if (slCount(whole) > 1) warn("%d sequences in %s, only using first", slCount(whole), wholeName); wholeDna = whole->dna; wholeSize = whole->size; ps = makePatSpace(&whole, 1, oocFile, 5, 500); partList = faReadAllDna(partsName); printf("%d contigs in %s\n\n", slCount(partList), partsName); for (part = partList, contig = 0; part != NULL; part = part->next, ++contig) { DNA *dna = part->dna; int dnaSize = part->size; int start, size; int subIx = 0; char numText[12]; Color color = blockColors[contig%ArraySize(blockColors)]; sprintf(numText, "%d", contig+1); for (start = trim; start < dnaSize-trim; start += size) { struct ffAli *left, *right; boolean rc; int score; size = dnaSize - start-trim; if (size > maxBlockSize) size = maxBlockSize; if (!fastFind(dna+start, size, ps, &left, &rc, &score) ) { printf("Contig %d.%d:%d-%d of %d UNALIGNED\n", contig+1, subIx, start, start+size, dnaSize); } else { int x1, x2; int xo, w; double quality; int qStart, qSize, tStart,tSize; char qualityString[40]; right = left; while (right->right != NULL) right = right->right; qStart = left->nStart - dna; qSize = right->nEnd - left->nStart; if (rc) { int rcEnd = right->nEnd - (dna+start) - 1; qStart = reverseOffset(rcEnd, size) + start; } tStart = left->hStart - wholeDna; tSize = right->hEnd - left->hStart; quality = 100.0 * score / qSize; if (quality >= 25.0) sprintf(qualityString, "%4.1f%%", quality); else sprintf(qualityString, "<50%%"); printf("<A HREF=\"../cgi-bin/chkGlue.exe?bacAcc=%s&contig=%d&qStart=%d&qSize=%d&tStart=%d&tSize=%d&repeatMask=%s\">", bacAcc, contig, qStart, qSize, tStart, tSize, repeatMask); printf("Contig %d.%d:%d-%d %c of %d aligned %d-%d of %d aliSize %d quality %s</A>\n", contig+1, subIx, qStart, qStart+qSize, (rc ? '-' : '+'), dnaSize, tStart, tStart + tSize, wholeSize, qSize, qualityString); x1 = roundingScale(trackWidth, left->hStart - wholeDna, wholeSize); x2 = roundingScale(trackWidth, right->hEnd - wholeDna, wholeSize); xo = x1+x; w = x2-x1; mapWriteBox(mapFile, mtBlock, xo, y, w, trackHeight, bacAcc, contig, qStart, qSize, tStart, tSize); mgDrawBox(mg, xo, y, w, trackHeight, color); mgTextCentered(mg, xo, y, w, trackHeight, MG_WHITE, font, numText); ffFreeAli(&left); } ++subIx; } } freePatSpace(&ps); freeAllSeq(&whole); freeAllSeq(&partList); }