cabb4fa228289aadbaf6a1a16461646fcb7aa774 braney Tue Apr 10 18:55:38 2012 -0700 interim check-in for #6152. Adding variant structure and setup that allows maintaing multiple variants in one gp. diff --git src/hg/lib/variant.c src/hg/lib/variant.c new file mode 100644 index 0000000..8719d12 --- /dev/null +++ src/hg/lib/variant.c @@ -0,0 +1,56 @@ +#include "common.h" +#include "variant.h" + +struct variant *variantFromPgSnp(struct pgSnp *pgSnp) +/* convert pgSnp record to variant record */ +{ +struct variant *variant; + +// this is probably the wrong way to do this. Alleles in +// variant should be their size in query bases +int alleleLength = pgSnp->chromEnd - pgSnp->chromStart; + +// We have a new variant! +AllocVar(variant); +variant->chrom = cloneString(pgSnp->chrom); +variant->chromStart = pgSnp->chromStart; +variant->chromEnd = pgSnp->chromEnd; + +// get the alleles. +char *nextAlleleString = pgSnp->name; +int alleleNumber = 0; +for( ; alleleNumber < pgSnp->alleleCount; alleleNumber++) + { + if (nextAlleleString == NULL) + errAbort("number of alleles in pgSnp doesn't match number in name"); + + char *thisAlleleString = nextAlleleString; + + // advance pointer to next variant string + // probably there's some kent routine to do this behind the curtain + nextAlleleString = strchr(thisAlleleString, '/'); + if (nextAlleleString) // null out '/' and move to next char + { + *nextAlleleString = 0; + nextAlleleString++; + } + + // this check probably not right, could be different per allele + int alleleStringLength = strlen(thisAlleleString); + if (alleleStringLength != alleleLength) + errAbort("length of allele number %d is %d, should be %d", + alleleNumber, alleleStringLength, alleleLength); + + // we have a new allele! + struct allele *allele; + AllocVar(allele); + slAddHead(&variant->alleles, allele); + allele->length = alleleStringLength; + allele->sequence = cloneString(thisAlleleString); + } + +slReverse(&variant->alleles); + +return variant; +} +