src/lib/metaWig.c 1.2
1.2 2010/06/03 17:09:12 kent
Removing parameter to metaWigOpen.
Index: src/lib/metaWig.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/lib/metaWig.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -b -B -U 1000000 -r1.1 -r1.2
--- src/lib/metaWig.c 3 Jun 2010 16:51:55 -0000 1.1
+++ src/lib/metaWig.c 3 Jun 2010 17:09:12 -0000 1.2
@@ -1,184 +1,185 @@
#include "common.h"
#include "hash.h"
#include "linefile.h"
#include "localmem.h"
#include "bigWig.h"
#include "bwgInternal.h"
#include "metaWig.h"
static struct hash *hashSectionChroms(struct bwgSection *sectionList)
/* Return hash keyed by chromosome name with values that are the
* first section in the chromosome. */
{
struct hash *hash = hashNew(0);
struct bwgSection *section;
for (section = sectionList; section != NULL; section = section->next)
{
if (!hashLookup(hash, section->chrom))
hashAdd(hash, section->chrom, section);
}
return hash;
}
-struct metaWig *metaWigOpen(char *fileName, struct lm *lm)
+struct metaWig *metaWigOpen(char *fileName)
/* Wrap self around file. Read all of it if it's wig, just header if bigWig. */
{
struct metaWig *mw;
-lmAllocVar(lm, mw);
+AllocVar(mw);
if (isBigWig(fileName))
{
mw->type = mwtBigWig;
mw->bwf = bigWigFileOpen(fileName);
}
else
{
- mw->sectionList = bwgParseWig(fileName, FALSE, NULL, 512, lm);
+ mw->lm = lmInit(0);
+ mw->sectionList = bwgParseWig(fileName, FALSE, NULL, 512, mw->lm);
mw->chromHash = hashSectionChroms(mw->sectionList);
mw->type = mwtSections;
}
return mw;
}
void metaWigClose(struct metaWig **pMw)
/* Close up metaWig file */
{
struct metaWig *mw = *pMw;
if (mw != NULL)
{
bigWigFileClose(&mw->bwf);
- *pMw = NULL;
- /* note mw is in local memory. */
+ lmCleanup(&mw->lm);
+ freez(pMw);
}
}
struct slName *metaWigChromList(struct metaWig *mw)
/* Return list of chromosomes covered in wig. */
{
struct slName *list = NULL;
switch (mw->type)
{
case mwtSections:
{
struct hashEl *chrom, *chromList = hashElListHash(mw->chromHash);
for (chrom = chromList; chrom != NULL; chrom = chrom->next)
slNameAddHead(&list, chrom->name);
hashElFreeList(&chromList);
break;
}
case mwtBigWig:
{
struct bbiChromInfo *chrom, *chromList = bbiChromList(mw->bwf);
for (chrom = chromList; chrom != NULL; chrom = chrom->next)
slNameAddHead(&list, chrom->name);
bbiChromInfoFreeList(&chromList);
break;
}
}
slSort(&list, slNameCmpStringsWithEmbeddedNumbers);
return list;
}
static void bedGraphSectionToIntervals(struct bwgSection *section, struct lm *lm,
struct bbiInterval **pList)
/* Convert bedGraph section to interval format. */
{
struct bwgBedGraphItem *item;
for (item = section->items.bedGraphList; item != NULL; item = item->next)
{
struct bbiInterval *el;
lmAllocVar(lm, el);
el->start = item->start;
el->end = item->end;
el->val = item->val;
slAddHead(pList, el);
}
}
static void varStepSectionToIntervals(struct bwgSection *section, struct lm *lm,
struct bbiInterval **pList)
/* Convert bedGraph section to interval format. */
{
struct bwgVariableStepPacked *array = section->items.variableStepPacked;
int i, count = section->itemCount;
bits32 span = section->itemSpan;
for (i=0; i<count; ++i)
{
struct bwgVariableStepPacked *item = &array[i];
struct bbiInterval *el;
lmAllocVar(lm, el);
el->start = item->start;
el->end = item->start + span;
el->val = item->val;
slAddHead(pList, el);
}
}
static void fixedStepSectionToIntervals(struct bwgSection *section, struct lm *lm,
struct bbiInterval **pList)
/* Convert bedGraph section to interval format. */
{
struct bwgFixedStepPacked *array = section->items.fixedStepPacked;
int i, count = section->itemCount;
bits32 span = section->itemSpan;
bits32 step = section->itemStep;
bits32 start = section->start;
for (i=0; i<count; ++i)
{
struct bwgFixedStepPacked *item = &array[i];
struct bbiInterval *el;
lmAllocVar(lm, el);
el->start = start;
el->end = start + span;
el->val = item->val;
start += step;
slAddHead(pList, el);
}
}
static void addIntervals(struct bwgSection *section, struct lm *lm, struct bbiInterval **pList)
/* Convert section to list of allocated in lm */
{
switch (section->type)
{
case bwgTypeBedGraph:
bedGraphSectionToIntervals(section, lm, pList);
break;
case bwgTypeVariableStep:
varStepSectionToIntervals(section, lm, pList);
break;
case bwgTypeFixedStep:
fixedStepSectionToIntervals(section, lm, pList);
break;
default:
errAbort("unknown section type %d in addIntervals", section->type);
break;
}
}
struct bbiInterval *metaIntervalsForChrom(struct metaWig *mw, char *chrom, struct lm *lm)
/* Get sorted list of all intervals with data on chromosome. */
{
struct bbiInterval *list = NULL;
switch (mw->type)
{
case mwtSections:
{
struct bwgSection *section, *sectionList = hashFindVal(mw->chromHash, chrom);
for (section = sectionList; section != NULL; section = section->next)
{
if (!sameString(section->chrom, chrom))
break;
addIntervals(section, lm, &list);
}
slReverse(&list);
break;
}
case mwtBigWig:
{
list = bigWigIntervalQuery(mw->bwf, chrom, 0, bbiChromSize(mw->bwf, chrom), lm);
break;
}
}
return list;
}