6d0767201f8e33546c1174395806ff2948477c84 giardine Fri Mar 16 10:56:37 2012 -0700 Edits to pgSnp detail page format, the coding sequence displays inresponse to redmine #7054. Includes computing frameshifts on size of deletion rather than count of '-', treating multiple substitutions that affect length of sequence as indels, hr between genes, and skipping reference matches. diff --git src/hg/lib/pgSnp.c src/hg/lib/pgSnp.c index a58bc24..e5b07b5 100644 --- src/hg/lib/pgSnp.c +++ src/hg/lib/pgSnp.c @@ -436,66 +436,82 @@ char b[512]; safef(b, sizeof(b), "<B>%s</B>", old); char *bold = replaceString(cod->seq, (cod->regStart - cod->cdStart), (cod->regEnd - cod->cdStart), b); char *nameCopy = cloneString(item->name); char *allele[8]; (void) chopByChar(nameCopy, '/', allele, item->alleleCount); int i; printf("%s:starting positions codon %d cds %d<BR>\n", el->name, cod->firstCodon, (cod->cdStart+1)); for (i=0;i<item->alleleCount;i++) { char a[512]; if (sameString(el->strand, "-")) reverseComplement(allele[i], strlen(allele[i])); safef(a, sizeof(a), "<B>%s</B>", allele[i]); char *rep = replaceString(cod->seq, (cod->regStart - cod->cdStart), (cod->regEnd - cod->cdStart), a); + if (sameString(bold, rep)) + continue; printf("%s > %s<BR>\n", bold, rep); if (item->chromStart == item->chromEnd && !strstr(rep, "-") && (strlen(rep)-7) % 3 != 0) { printf(" frameshift<BR>\n"); } else if (item->chromStart == item->chromEnd && countChars(allele[i], '-') == strlen(allele[i])) { printf(" wildtype<BR>\n"); } else { struct dnaSeq *dnaseq = newDnaSeq(cod->seq, strlen(cod->seq), "orig"); aaSeq *origAa = translateSeq(dnaseq, 0, FALSE); if (!strstr(origAa->dna, "X")) { char *rep2 = replaceString(cod->seq, (cod->regStart - cod->cdStart), (cod->regEnd - cod->cdStart), allele[i]); dnaseq = newDnaSeq(rep2, strlen(rep2), "rep2"); aaSeq *repAa = translateSeq(dnaseq, 0, FALSE); //freeDnaSeq(&dnaseq); - if (!strstr(repAa->dna, "X") && isNotEmpty(repAa->dna)) + if (!strstr(rep2, "-") && strlen(allele[i]) != (item->chromEnd - item->chromStart)) + { //indel + int diff = abs((item->chromEnd - item->chromStart) - strlen(allele[i])); + if (diff % 3 == 0) + printf(" in-frame indel<BR>\n"); + else + printf(" frameshift indel<BR>\n"); + } + else if (!strstr(rep2, "-") && isNotEmpty(repAa->dna)) { printf(" %s > %s<BR>\n", origAa->dna, repAa->dna); if (differentString(origAa->dna, repAa->dna)) aaProperties(origAa->dna, repAa->dna); } - else if ((countChars(rep2, '-')) % 3 != 0) + else if (strstr(rep2, "-") && (item->chromEnd - item->chromStart) % 3 != 0) { printf(" frameshift<BR>\n"); } + else if (strstr(rep2, "-") && (item->chromEnd - item->chromStart) % 3 == 0) + { + printf(" in-frame deletion<BR>\n"); + } } } } + /* print a hr between gene models */ + printf("<hr style=\"width:30%%;text-align:left;margin-left:0\" />\n"); } bedFreeList(&list); } char *aaPolarity (char *aa) /* return the polarity of the amino acid */ { if (sameString(aa, "A") || sameString(aa, "G") || sameString(aa, "I") || sameString(aa, "L") || sameString(aa, "M") || sameString(aa, "F") || sameString(aa, "P") || sameString(aa, "W") ||