lib/fuzzyShow.c File Reference

#include "common.h"
#include "dnautil.h"
#include "memgfx.h"
#include "fuzzyFind.h"
#include "htmshell.h"
#include "cda.h"
#include "seqOut.h"

Include dependency graph for fuzzyShow.c:

Go to the source code of this file.

Functions

static void ffShNeedle (FILE *f, DNA *needle, int needleSize, int needleNumOffset, char *colorFlags, struct ffAli *aliList, boolean upcMatch, int cdsS, int cdsE, boolean accentRange, int accentStart, int accentEnd)
int ffShAliPart (FILE *f, struct ffAli *aliList, char *needleName, DNA *needle, int needleSize, int needleNumOffset, char *haystackName, DNA *haystack, int haySize, int hayNumOffset, int blockMaxGap, boolean rcNeedle, boolean rcHaystack, boolean showJumpTable, boolean showNeedle, boolean showHaystack, boolean showSideBySide, boolean upcMatch, int cdsS, int cdsE, int hayPartS, int hayPartE)
int ffShAli (FILE *f, struct ffAli *aliList, char *needleName, DNA *needle, int needleSize, int needleNumOffset, char *haystackName, DNA *haystack, int haySize, int hayNumOffset, int blockMaxGap, boolean rcNeedle)
void ffShowAli (struct ffAli *aliList, char *needleName, DNA *needle, int needleNumOffset, char *haystackName, DNA *haystack, int hayNumOffset, boolean rcNeedle)

Variables

static char const rcsid [] = "$Id: fuzzyShow.c,v 1.23 2007/03/27 23:21:25 angie Exp $"


Function Documentation

int ffShAli ( FILE *  f,
struct ffAli aliList,
char *  needleName,
DNA needle,
int  needleSize,
int  needleNumOffset,
char *  haystackName,
DNA haystack,
int  haySize,
int  hayNumOffset,
int  blockMaxGap,
boolean  rcNeedle 
)

Definition at line 368 of file fuzzyShow.c.

References FALSE, ffShAliPart(), and TRUE.

Referenced by ffShowAli().

00374 {
00375 return ffShAliPart(f, aliList, needleName, needle, needleSize, needleNumOffset,
00376     haystackName, haystack, haySize, hayNumOffset, blockMaxGap, rcNeedle, FALSE,
00377     TRUE, TRUE, TRUE, TRUE, FALSE, 0, 0, 0, 0);
00378 }

Here is the call graph for this function:

Here is the caller graph for this function:

int ffShAliPart ( FILE *  f,
struct ffAli aliList,
char *  needleName,
DNA needle,
int  needleSize,
int  needleNumOffset,
char *  haystackName,
DNA haystack,
int  haySize,
int  hayNumOffset,
int  blockMaxGap,
boolean  rcNeedle,
boolean  rcHaystack,
boolean  showJumpTable,
boolean  showNeedle,
boolean  showHaystack,
boolean  showSideBySide,
boolean  upcMatch,
int  cdsS,
int  cdsE,
int  hayPartS,
int  hayPartE 
)

Definition at line 82 of file fuzzyShow.c.

References FALSE, ffAli::hEnd, ffAli::hStart, ffAli::left, needMem(), ffAli::nEnd, ffAli::nStart, ffAli::right, and TRUE.

Referenced by ffShAli().

00095 {
00096 long i;
00097 struct ffAli *ali;
00098 struct ffAli *lastAli;
00099 struct ffAli *leftAli = aliList;
00100 struct ffAli *rightAli = aliList;
00101 int charsInLine;
00102 struct baf baf;
00103 int maxSize = (needleSize > haySize ? needleSize : haySize);
00104 char *colorFlags = needMem(maxSize);
00105 int anchorCount = 0;
00106 boolean restrictToWindow = FALSE;
00107 int hayOffStart = 0, hayOffEnd = haySize;
00108 int hayPaddedOffStart = 0, hayPaddedOffEnd = haySize;
00109 int hayExtremity = rcHaystack ? (hayNumOffset + haySize) : hayNumOffset;
00110 int nPartS=0, nPartE=0;
00111 
00112 if (aliList != NULL)
00113     {
00114     while (leftAli->left != NULL) leftAli = leftAli->left;
00115     while (rightAli->right != NULL) rightAli = rightAli->right;
00116     }
00117 
00118 /* If we are only showing part of the alignment, translate haystack window
00119  * coords to needle window coords and haystack-offset window coords: */
00120 if (hayPartS > (hayNumOffset + (leftAli->hStart - haystack)) ||
00121     (hayPartE > 0 && hayPartE < (hayNumOffset + (rightAli->hEnd - haystack))))
00122     {
00123     DNA *haystackPartS;
00124     DNA *haystackPartE;
00125     restrictToWindow = TRUE;
00126     if (rcHaystack)
00127         {
00128         haystackPartS = haystack + (haySize - (hayPartE - hayNumOffset));
00129         haystackPartE = haystack + (haySize - (hayPartS - hayNumOffset));
00130         }
00131     else
00132         {
00133         haystackPartS = haystack + hayPartS - hayNumOffset;
00134         haystackPartE = haystack + hayPartE - hayNumOffset;
00135         }
00136     boolean foundStart = FALSE;
00137     hayOffStart = haystackPartS - haystack;
00138     hayOffEnd = haystackPartE - haystack;
00139     for (ali = leftAli;  ali != NULL;  ali = ali->right)
00140         {
00141         if (haystackPartS < ali->hEnd && !foundStart)
00142             {
00143             int offset = haystackPartS - ali->hStart;
00144             if (offset < 0)
00145                 offset = 0;
00146             nPartS = offset + ali->nStart - needle;
00147             hayOffStart = offset + ali->hStart - haystack;
00148             foundStart = TRUE;
00149             }
00150         if (haystackPartE > ali->hStart)
00151             {
00152             if (haystackPartE > ali->hEnd)
00153                 {
00154                 nPartE = ali->nEnd - needle;
00155                 hayOffEnd = ali->hEnd - haystack;
00156                 }
00157             else
00158                 {
00159                 nPartE = haystackPartE - ali->hStart + ali->nStart - needle;
00160                 hayOffEnd = haystackPartE - haystack;
00161                 }
00162             }
00163         }
00164     hayPaddedOffStart = max(0, (hayOffStart - 100));
00165     hayPaddedOffEnd = min(haySize, (hayOffEnd + 100));
00166     if (rcHaystack)
00167         hayExtremity = hayNumOffset + haySize - hayPaddedOffStart;
00168     else
00169         hayExtremity = hayNumOffset + hayPaddedOffEnd;
00170     }
00171 
00172 if (showJumpTable)
00173     {
00174     fputs("<CENTER><P><TABLE BORDER=1 WIDTH=\"97%\"><TR>", f);
00175     fputs("<TD WIDTH=\"23%\"><P ALIGN=CENTER><A HREF=\"#cDNA\">cDNA Sequence</A></TD>", f);
00176     if (restrictToWindow)
00177         fputs("<TD WIDTH=\"23%\"><P ALIGN=CENTER><A HREF=\"#cDNAStart\">cDNA Sequence in window</A></TD>", f);
00178     fputs("<TD WIDTH=\"27%\"><P ALIGN=\"CENTER\"><A HREF=\"#genomic\">Genomic Sequence</A></TD>", f);
00179     fputs("<TD WIDTH=\"29%\"><P ALIGN=\"CENTER\"><A HREF=\"#1\">cDNA in Genomic</A></TD>", f);
00180     fputs("<TD WIDTH=\"21%\"><P ALIGN=\"CENTER\"><A HREF=\"#ali\">Side by Side</A></TD>", f);
00181     fputs("</TR></TABLE>\n", f);
00182     }
00183 if (cdsE > 0) 
00184     {
00185     fprintf(f, "Matching bases in coding regions of cDNA and genomic sequences are colored blue%s. ", 
00186             (upcMatch ? " and capitalized" : ""));
00187     fprintf(f, "Matching bases in UTR regions of cDNA and genomic sequences are colored red%s. ", 
00188             (upcMatch ? " and capitalized" : ""));
00189     fputs("Light blue (coding) or orange (UTR) bases mark the boundaries of gaps in either sequence "
00190           "(often splice sites).\n", f);
00191     } 
00192 else 
00193     {
00194     fprintf(f, "Matching bases in cDNA and genomic sequences are colored blue%s. ", 
00195             (upcMatch ? " and capitalized" : ""));
00196     fputs("Light blue bases mark the boundaries of gaps in either sequence "
00197           "(often splice sites).\n", f);
00198     } 
00199 if (showNeedle && restrictToWindow)
00200     fputs("Bases that were in the selected browser region are shown in bold "
00201           "and underlined, "
00202           "and only the alignment for these bases is displayed in the "
00203           "Genomic and Side by Side sections.\n", f);
00204 
00205 if (showJumpTable)
00206     fputs("</P></CENTER>\n", f);
00207 htmHorizontalLine(f);
00208 
00209 fprintf(f, "<H4><A NAME=cDNA></A>cDNA %s%s</H4>\n", needleName, (rcNeedle ? " (reverse complemented)" : ""));
00210 
00211 /* NOTE: if rcHaystack, hayNumOffset changes here into the end, not start! */
00212 if (rcHaystack) 
00213     hayNumOffset += haySize;
00214 
00215 if (rcNeedle)
00216     reverseComplement(needle, needleSize);
00217 
00218 if (showNeedle)
00219     {
00220     ffShNeedle(f, needle, needleSize, needleNumOffset, colorFlags,
00221                aliList, upcMatch, cdsS, cdsE,
00222                restrictToWindow, nPartS, nPartE);
00223     }
00224 
00225 if (showHaystack)
00226     {
00227     struct cfm *cfm = cfmNew(10, 50, TRUE, rcHaystack, f, hayExtremity);
00228     char *h = cloneMem(haystack, haySize);
00229     char *accentFlags = needMem(haySize);
00230     zeroBytes(accentFlags, haySize);
00231     fprintf(f, "<H4><A NAME=genomic></A>Genomic %s %s:</H4>\n", 
00232         haystackName,
00233         (rcHaystack ? "(reverse strand)" : ""));
00234     fprintf(f, "<TT><PRE>\n");
00235     zeroBytes(colorFlags, haySize);
00236     for (ali = leftAli; ali != NULL; ali = ali->right)
00237         {
00238         boolean utr = FALSE;
00239         int i;
00240         int off = ali->hStart-haystack;
00241         int count = ali->hEnd - ali->hStart;
00242         int offn = ali->nStart-needle;
00243         if ((cdsE > 0) && ((cdsS-offn-1) > 0)) 
00244             utr = TRUE;
00245         for (i=0; i<count; ++i)
00246             {
00247             if (!utr && (i > (cdsE-offn-1)) && (cdsE > 0))
00248                 utr = TRUE;
00249             if (utr && (i == (cdsS-offn)))
00250                 utr = FALSE;
00251             if (toupper(ali->hStart[i]) == toupper(ali->nStart[i]))
00252                 {
00253                 if (utr)
00254                     colorFlags[off+i] = ((i == 0 || i == count-1) ? socOrange : socRed);
00255                 else
00256                     colorFlags[off+i] = ((i == 0 || i == count-1) ? socBrightBlue : socBlue);
00257                 if (upcMatch)
00258                     h[off+i] = toupper(h[off+i]);
00259                 }
00260             if (restrictToWindow && off+i >= hayOffStart && off+i < hayOffEnd)
00261                 accentFlags[off+i] = TRUE;
00262             }
00263         }
00264     ali = leftAli;
00265     lastAli = NULL;
00266     while (ali && (ali->hEnd - haystack) <= hayPaddedOffStart)
00267         ali = ali->right;
00268     for (i = hayPaddedOffStart; i < hayPaddedOffEnd; ++i)
00269         {
00270         /* Put down "anchor" on first match position in haystack
00271          * so user can hop here with a click on the needle. */
00272         if (ali != NULL &&  i == ali->hStart - haystack)
00273             {
00274             if (lastAli == NULL || ali->hStart - lastAli->hEnd > blockMaxGap)
00275                 {
00276                 fprintf(f, "<A NAME=%d></A>", ++anchorCount);
00277                 }
00278             lastAli = ali;
00279             ali = ali->right;
00280             }
00281         cfmOutExt(cfm, h[i], seqOutColorLookup[(int)colorFlags[i]],
00282                   accentFlags[i], accentFlags[i], FALSE);
00283         }
00284     cfmFree(&cfm);
00285     freeMem(h);
00286     fprintf(f, "</TT></PRE>\n");
00287     htmHorizontalLine(f);
00288     }
00289 
00290 if (showSideBySide)
00291     {
00292     fprintf(f, "<H4><A NAME=ali></A>Side by Side Alignment</H4>\n");
00293     fprintf(f, "<TT><PRE>\n");
00294     lastAli = NULL;
00295     charsInLine = 0;
00296     bafInit(&baf, needle, needleNumOffset, FALSE, 
00297         haystack, hayNumOffset, rcHaystack, f, 50, FALSE);
00298     for (ali=leftAli; ali!=NULL; ali = ali->right)
00299         {
00300         boolean doBreak = TRUE;
00301         int aliLen;
00302         int i;
00303 
00304         if ((ali->hEnd - haystack) <= hayOffStart ||
00305             (ali->hStart - haystack) >= hayOffEnd)
00306             continue;
00307 
00308         /* Decide whether to put in a line break and/or blank characters */
00309         if (lastAli != NULL)
00310             {
00311             int nSkip = ali->nStart - lastAli->nEnd;
00312             int hSkip = ali->hStart - lastAli->hEnd;
00313             if (nSkip > 0 && nSkip <= blockMaxGap && hSkip == 0)
00314                 {
00315                 for (i=0; i<nSkip; ++i)
00316                     bafOut(&baf, lastAli->nEnd[i],'.');
00317                 doBreak = FALSE; 
00318                 }
00319             else if (hSkip > 0 && hSkip <= blockMaxGap && nSkip == 0)
00320                 {
00321                 for (i=0; i<hSkip; ++i)
00322                     bafOut(&baf, '.', lastAli->hEnd[i]);
00323                 doBreak = FALSE;
00324                 }
00325             else if (hSkip == nSkip && hSkip <= blockMaxGap)
00326                 {
00327                 for (i=0; i<hSkip; ++i)
00328                     bafOut(&baf, lastAli->nEnd[i], lastAli->hEnd[i]);
00329                 doBreak = FALSE;
00330                 }
00331             }
00332         else
00333             {
00334             doBreak = FALSE;
00335             }
00336         if (doBreak)
00337             bafFlushLine(&baf);
00338         int offset = max(0, (hayOffStart - (ali->hStart - haystack)));
00339         int nStart = offset + ali->nStart - needle;
00340         int hStart = offset + ali->hStart - haystack;
00341         bafSetPos(&baf, nStart, hStart);
00342         if (doBreak || lastAli == NULL)
00343             bafStartLine(&baf);
00344         aliLen = ali->nEnd - ali->nStart;
00345         for (i=0; i<aliLen; ++i)
00346             {
00347             int hayOff = i + (ali->hStart - haystack);
00348             if (hayOff < hayOffStart)
00349                 continue;
00350             if (hayOff >= hayOffEnd)
00351                 break;
00352             bafOut(&baf, ali->nStart[i], ali->hStart[i]);
00353             }
00354         lastAli = ali;
00355         }
00356     if (leftAli != NULL)
00357         bafFlushLine(&baf);
00358     fprintf(f, "</TT></PRE>\n");
00359     fprintf(f, "<EM>*Aligned Blocks with gaps &lt;= %d bases are merged for "
00360             "this display when only one sequence has a gap, or when gaps in "
00361             "both sequences are of the same size.</EM>\n", blockMaxGap);
00362     }
00363 if (rcNeedle)
00364     reverseComplement(needle, needleSize);
00365 return anchorCount;
00366 }

Here is the call graph for this function:

Here is the caller graph for this function:

static void ffShNeedle ( FILE *  f,
DNA needle,
int  needleSize,
int  needleNumOffset,
char *  colorFlags,
struct ffAli aliList,
boolean  upcMatch,
int  cdsS,
int  cdsE,
boolean  accentRange,
int  accentStart,
int  accentEnd 
) [static]

Definition at line 17 of file fuzzyShow.c.

References cfmNew(), cloneMem(), FALSE, ffAli::hStart, ffAli::left, needMem(), ffAli::nEnd, ffAli::nStart, ffAli::right, socBlue, socBrightBlue, socOrange, socRed, TRUE, and zeroBytes().

00023 {
00024 struct cfm *cfm = cfmNew(10, 50, TRUE, FALSE, f, needleNumOffset);
00025 char *n = cloneMem(needle, needleSize);
00026 char *accentFlags = needMem(needleSize);
00027 struct ffAli *leftAli = aliList;
00028 struct ffAli *ali;
00029 long i;
00030 
00031 zeroBytes(colorFlags, needleSize);
00032 zeroBytes(accentFlags, needleSize);
00033 fprintf(f, "<TT><PRE>\n");
00034 if (aliList != NULL)
00035     {
00036     for (leftAli = aliList; leftAli->left != NULL; leftAli = leftAli->left)
00037         ;
00038     }
00039 for (ali = leftAli; ali != NULL; ali = ali->right)
00040     {
00041     boolean utr = FALSE;
00042     int off = ali->nStart-needle;
00043     int count = ali->nEnd - ali->nStart;
00044     if ((cdsE > 0) && ((cdsS-off-1) > 0)) 
00045         utr = TRUE;
00046     for (i=0; i<count; ++i)
00047         {
00048         if (!utr && (i > (cdsE-off-1)) && (cdsE > 0))
00049             utr = TRUE;
00050         if (utr && (i == (cdsS-off)))
00051             utr = FALSE;
00052         if (toupper(ali->hStart[i]) == toupper(ali->nStart[i]))
00053             {
00054             if (utr)
00055                 colorFlags[off+i] = ((i == 0 || i == count-1) ? socOrange : socRed);
00056             else
00057                 colorFlags[off+i] = ((i == 0 || i == count-1) ? socBrightBlue : socBlue);
00058             if (upcMatch)
00059                 n[off+i] = toupper(n[off+i]);
00060             }
00061         if (accentRange)
00062             {
00063             if (off+i >= accentStart && off+i < accentEnd)
00064                 accentFlags[off+i] = TRUE;
00065             }
00066         }
00067     }
00068 for (i=0; i<needleSize; ++i)
00069     {
00070     if (accentRange && i == accentStart)
00071         fprintf(f, "<A NAME=cDNAStart></A>");
00072     cfmOutExt(cfm, n[i], seqOutColorLookup[(int)colorFlags[i]],
00073               accentFlags[i], accentFlags[i], FALSE);
00074     }
00075 cfmFree(&cfm);
00076 freeMem(n);
00077 freeMem(accentFlags);
00078 fprintf(f, "</TT></PRE>\n");
00079 htmHorizontalLine(f);
00080 }

Here is the call graph for this function:

void ffShowAli ( struct ffAli aliList,
char *  needleName,
DNA needle,
int  needleNumOffset,
char *  haystackName,
DNA haystack,
int  hayNumOffset,
boolean  rcNeedle 
)

Definition at line 380 of file fuzzyShow.c.

References ffShAli().

00383 {
00384 ffShAli(stdout, aliList, needleName, needle, strlen(needle), needleNumOffset,
00385     haystackName, haystack, strlen(haystack), hayNumOffset, 8, rcNeedle);
00386 }

Here is the call graph for this function:


Variable Documentation

char const rcsid[] = "$Id: fuzzyShow.c,v 1.23 2007/03/27 23:21:25 angie Exp $" [static]

Definition at line 15 of file fuzzyShow.c.


Generated on Tue Dec 25 19:50:49 2007 for blat by  doxygen 1.5.2