0384fa0a17672e37966d89532192e9f61352c7cd kate Tue Jul 11 10:57:36 2017 -0700 Restore order of linked feature components after codon translation. Fixes bug with label display of split codons in pack mode. refs #19634 diff --git src/hg/hgTracks/peptideAtlasTrack.c src/hg/hgTracks/peptideAtlasTrack.c index f4db865..c480766 100644 --- src/hg/hgTracks/peptideAtlasTrack.c +++ src/hg/hgTracks/peptideAtlasTrack.c @@ -1,93 +1,94 @@ /* peptideAtlasTracks - Peptide identifications from tandem MS mapped to the genome, * from PeptideAtlas (peptideatlas.org) */ /* Copyright (C) 2014 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "hgTracks.h" struct dnaBuf /* Hold DNA sequence for translating to peptide */ { DNA *dna; int chromStart; int chromEnd; }; static DNA *dnaForLinkedFeature(struct linkedFeatures *lf, struct dnaBuf *dnaBuf) /* Return DNA string for all simple features in a linked feature using buffer of * genomic sequence in the browser window */ { struct dyString *dna = dyStringNew(0); struct simpleFeature *sf; // NOTE: odd this is needed slReverse(&lf->components); for (sf = lf->components; sf != NULL; sf = sf->next) { dyStringAppendN(dna, dnaBuf->dna + sf->start - dnaBuf->chromStart, sf->end - sf->start); } +slReverse(&lf->components); if (lf->orientation == -1) { reverseComplement(dna->string, strlen(dna->string)); } return dyStringCannibalize(&dna); } void linkedFeaturesRange(struct track *tg, int *minStart, int *maxEnd) /* Return minimum chromStart and maximum chromEnd for linked features in the track */ { if (minStart == NULL || maxEnd == NULL) errAbort("Internal error: peptideAtlas feature comparison (hide this track)"); *minStart = hChromSize(database, chromName); *maxEnd = 0; struct linkedFeatures *lf; for (lf = (struct linkedFeatures *)tg->items; lf != NULL; lf = lf->next) { *minStart = min(*minStart, lf->start); *maxEnd = max(*maxEnd, lf->end); } } static char *peptideAtlasItemName(struct track *tg, void *item) /* Display peptide sequence translated from genome as item name. * This suffices since all PeptideAtlas peptide mappings (in Aug 2014 human build) * are perfect matches to genome */ { struct dnaSeq *dnaSeq; if (tg->customPt == NULL) { int minStart, maxEnd; linkedFeaturesRange(tg, &minStart, &maxEnd); struct dnaBuf *dnaBuf; AllocVar(dnaBuf); dnaSeq = hDnaFromSeq(database, chromName, minStart, maxEnd, dnaLower); dnaBuf->dna = dnaSeq->dna; dnaBuf->chromStart = minStart; dnaBuf->chromEnd = maxEnd; tg->customPt = dnaBuf; } struct linkedFeatures *lf = (struct linkedFeatures *)item; DNA *dna = dnaForLinkedFeature(lf, (struct dnaBuf *)tg->customPt); /* Too bad this lib function fails here, so a bit more code needed */ //AA *peptide = needMem(size); //dnaTranslateSome(dna, peptide, size); AllocVar(dnaSeq); dnaSeq->dna = dna; dnaSeq->size = (int)strlen(dna); dnaSeq->name = ""; aaSeq *peptide = translateSeqN(dnaSeq, 0, 0, FALSE); return peptide->dna; } void peptideAtlasMethods(struct track *tg) /* Item label is peptide sequence translated from genome */ { tg->itemName = peptideAtlasItemName; }