c72b4b4412c574336911c4eb7135a9677c2773ef braney Wed Apr 25 14:07:45 2012 -0700 ongoing #6152. Added support for variants longer than 1 in CDS. diff --git src/hg/lib/variant.c src/hg/lib/variant.c index 90555b0..fcbefbf 100644 --- src/hg/lib/variant.c +++ src/hg/lib/variant.c @@ -1,21 +1,67 @@ /* variant.c -- routines to convert other variant formats to a generic * variant structure */ #include "common.h" #include "variant.h" +struct allele *alleleClip(struct allele *allele, int sx, int ex) +/* clip allele to be inside region defined by sx..ex. Returns + * pointer to new allele which should be freed by alleleFree, or variantFree + */ +{ +struct variant *oldVariant = allele->variant; +int start = oldVariant->chromStart; +int end = oldVariant->chromEnd; +int oldVariantWidth = end - start; +int delFront = 0; +int delRear = 0; + +if (start < sx) + { + if (oldVariantWidth != allele->length) /* FIXME */ + errAbort("cannot clip alleles that are a different length than variant region"); + delFront = sx - start; + start = sx; + } + +if (end > ex) + { + if (oldVariantWidth != allele->length) /* FIXME */ + errAbort("cannot clip alleles that are a different length than variant region"); + delRear = end - ex; + end = ex; + } + +struct variant *newVariant; +AllocVar(newVariant); +newVariant->chrom = cloneString(oldVariant->chrom); +newVariant->chromStart = start; +newVariant->chromEnd = end; +newVariant->numAlleles = 1; +struct allele *newAllele; +AllocVar(newAllele); +newVariant->alleles = newAllele; +newAllele->variant = newVariant; +newAllele->length = allele->length - delRear - delFront; +assert(newAllele->length > 0); +newAllele->sequence = cloneString(&allele->sequence[delFront]); +newAllele->sequence[newAllele->length] = 0; // cut off delRear part + +return newAllele; +} + 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; variant->numAlleles = pgSnp->alleleCount;