a44421a79fb36cc2036fe116b97ea3bc9590cd0c braney Fri Dec 2 09:34:39 2011 -0800 removed rcsid (#295) diff --git src/lib/gdf.c src/lib/gdf.c index d662af8..df8e767 100644 --- src/lib/gdf.c +++ src/lib/gdf.c @@ -1,154 +1,153 @@ /* gdf - Intronerator Gene Description File. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "gdf.h" -static char const rcsid[] = "$Id: gdf.c,v 1.4 2003/05/06 07:33:42 kate Exp $"; struct gdfGene *newGdfGene(char *name, int nameSize, int exonCount, char strand, UBYTE chromIx) /* Return a new gene. */ { struct gdfGene *gene = needMem(sizeof *gene); gene->name = cloneStringZ(name, nameSize); gene->dataCount = exonCount*2; if (exonCount > 0) { gene->dataPoints = needMem(gene->dataCount * sizeof(gene->dataPoints[0])); } gene->strand = strand; gene->chromIx = chromIx; return gene; } void gdfFreeGene(struct gdfGene *gene) /* Free a gene. */ { if (gene != NULL) { freeMem(gene->name); freeMem(gene->dataPoints); freeMem(gene); } } void gdfFreeGeneList(struct gdfGene **pList) /* Free a whole list of genes. */ { struct gdfGene *gene, *next; gene = *pList; while (gene != NULL) { next = gene->next; gdfFreeGene(gene); gene = next; } *pList = NULL; } struct gdfGene *gdfReadOneGene(FILE *f) /* Read one entry from a Gdf file. Assumes that the file pointer * is in the right place. */ { short pointCount; char strand; UBYTE geneNameSize, chromIx; char geneNameBuf[128]; struct gdfGene *gene; mustReadOne(f, geneNameSize); mustRead(f, geneNameBuf, geneNameSize); geneNameBuf[geneNameSize] = 0; mustReadOne(f, chromIx); mustReadOne(f, strand); mustReadOne(f, pointCount); gene = newGdfGene(geneNameBuf, geneNameSize, pointCount>>1, strand, chromIx); mustRead(f, gene->dataPoints, sizeof(gene->dataPoints[0]) * pointCount); return gene; } void gdfGeneExtents(struct gdfGene *gene, long *pMin, long *pMax) /* Figure out first and last base in gene. */ { int i; long x; long min=0x7000000; long max = -min; for (i=0; i<gene->dataCount; i+=1) { x = gene->dataPoints[i].start; if (x < min) min = x; if (x > max) max = x; } *pMin = min; *pMax = max; } void gdfOffsetGene(struct gdfGene *gene, int offset) /* Add offset to each point in gene */ { struct gdfDataPoint *dp = gene->dataPoints; int count = gene->dataCount; int i; for (i=0; i<count; ++i) dp[i].start += offset; } 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; } } void gdfUpcExons(struct gdfGene *gene, int geneOffset, DNA *dna, int dnaSize, int dnaOffset) /* Uppercase exons in DNA. */ { struct gdfDataPoint *dp = gene->dataPoints; int count = gene->dataCount; int start, end; long gffStart, gffEnd; int combinedOffset; int i; gdfGeneExtents(gene, &gffStart, &gffEnd); combinedOffset = -gffStart + geneOffset - dnaOffset; for (i=0; i<count; i += 2) { start = dp[i].start + combinedOffset; end = dp[i+1].start + combinedOffset; if (end <= 0 || start >= dnaSize) continue; if (start < 0) start = 0; if (end > dnaSize) end = dnaSize; toUpperN(dna+start, end-start); } }