feeb7ee7651d3a85ebc34c4fb32243a841eacdf2 braney Mon Apr 16 16:23:04 2012 -0700 on-going work on annoGrator (#6152). Started using Sequence Ontology numbers from EBI, and added a generic variant structure as input to gpFx library diff --git src/hg/lib/gpFx.c src/hg/lib/gpFx.c index b30cd05..dc93d33 100644 --- src/hg/lib/gpFx.c +++ src/hg/lib/gpFx.c @@ -1,157 +1,174 @@ #include "common.h" #include "genePred.h" #include "gpFx.h" struct gpFx *gpFxInCodingExon(struct variant *variant, struct genePred *pred, int exonNum, char **returnTranscript, char **returnCoding) { //if ((pred->optFields & genePredExonFramesFld) == 0) // genePredAddExonFrames(pred); return NULL; } struct gpFx *gpFxInExon(struct variant *variant, struct genePred *pred, int exonNum, char **returnTranscript, char **returnCoding) { struct gpFx *effectsList = NULL; if (positiveRangeIntersection(pred->cdsStart, pred->cdsEnd, variant->chromStart, variant->chromEnd)) { // we're in CDS effectsList = slCat(effectsList, gpFxInCodingExon(variant, pred, exonNum, returnTranscript, returnCoding)); } if (positiveRangeIntersection(pred->txStart, pred->cdsStart, variant->chromStart, variant->chromEnd)) { // we're in 5' UTR ( or UTR intron ) } if (positiveRangeIntersection(pred->txStart, pred->cdsStart, variant->chromStart, variant->chromEnd)) { // we're in 3' UTR } return effectsList; } static struct gpFx *gpFxCheckExons(struct variant *variant, struct genePred *pred, char **returnTranscript, char **returnCoding) // check to see if the variant is in an exon { int ii; struct gpFx *effectsList = NULL; for(; variant ; variant = variant->next) { for(ii=0; ii < pred->exonCount; ii++) { // check if in an exon if (positiveRangeIntersection(pred->exonStarts[ii], pred->exonEnds[ii], variant->chromStart, variant->chromEnd)) { // we know we've changed the transcript, start to track it effectsList = slCat(effectsList, gpFxInExon(variant, pred, ii, returnTranscript, returnCoding)); } } } return effectsList; } static struct gpFx *gpFxCheckIntrons(struct variant *variant, struct genePred *pred) // check to see if a single variant is in an exon or an intron { int ii; struct gpFx *effectsList = NULL; for(ii=0; ii < pred->exonCount - 1; ii++) { // check if in intron if (positiveRangeIntersection(pred->exonEnds[ii], pred->exonStarts[ii+1], variant->chromStart, variant->chromEnd)) { struct gpFx *effects; AllocVar(effects); - effects->gpFxType = gpFxIntron; - effects->gpFxNumber = ii; + effects->so.soNumber = intron_variant; + effects->so.sub.intron.transcript = cloneString(pred->name); + effects->so.sub.intron.intronNumber = ii; slAddHead(&effectsList, effects); } } return effectsList; } static struct gpFx *gpFxCheckBackground(struct variant *variant, struct genePred *pred) // check to see if the variant is up or downstream or in intron of the gene { struct gpFx *effectsList = NULL, *effects; for(; variant ; variant = variant->next) { // is this variant in an intron effectsList = slCat(effectsList, gpFxCheckIntrons(variant, pred)); if (positiveRangeIntersection(pred->txStart - GPRANGE, pred->txStart, variant->chromStart, variant->chromEnd)) { AllocVar(effects); if (*pred->strand == '+') - effects->gpFxType = gpFxUpstream; + ;//effects->gpFxType = gpFxUpstream; else - effects->gpFxType = gpFxDownstream; + ;//ffects->gpFxType = gpFxDownstream; effectsList = slCat(effectsList, effects); } if (positiveRangeIntersection(pred->txEnd, pred->txEnd + GPRANGE, variant->chromStart, variant->chromEnd)) { AllocVar(effects); if (*pred->strand == '+') - effects->gpFxType = gpFxDownstream; + ;//ffects->gpFxType = gpFxDownstream; else - effects->gpFxType = gpFxUpstream; + ;//ffects->gpFxType = gpFxUpstream; effectsList = slCat(effectsList, effects); } } return effectsList; } +static void checkVariantList(struct variant *variant) +// check to see that we either have one variant (possibly with multiple +// alleles) or that if we have a list of variants, they only have +// one allele a piece. +{ +if (variant->next == NULL) // just one variant + return; + +for(; variant; variant = variant->next) + if (variant->numAlleles != 1) + errAbort("gpFxPredEffect needs either 1 variant, or only 1 allele in all variants"); +} + struct gpFx *gpFxPredEffect(struct variant *variant, struct genePred *pred, char **returnTranscript, char **returnCoding) // return the predicted effect(s) of a variation list on a genePred { struct gpFx *effectsList = NULL; +// make sure we can deal with the variants that are coming in +checkVariantList(variant); + // check to see if SNP is up or downstream in intron effectsList = slCat(effectsList, gpFxCheckBackground(variant, pred)); // check to see if SNP is in the transcript effectsList = slCat(effectsList, gpFxCheckExons(variant, pred, returnTranscript, returnCoding)); if (effectsList != NULL) return effectsList; // default is no effect struct gpFx *noEffect; AllocVar(noEffect); noEffect->next = NULL; -noEffect->gpFxType = gpFxNone; +;//oEffect->gpFxType = gpFxNone; return noEffect; }