"); /* notify if species removed from alignment */ - if ((speciesOffHash) && !hIsGsidServer()) + if (speciesOffHash) { char *species; struct hashCookie hc = hashFirst(speciesOffHash); puts("Components not displayed: "); while ((species = hashNextName(&hc)) != NULL) printf("%s ", species); puts("
"); } for (maf = subList; maf != NULL; maf = maf->next) { mafLowerCase(maf); #ifdef ADDEXONCAPITAL if (capTrack != NULL) @@ -789,545 +772,39 @@ } static void mafOrAxtClick(struct sqlConnection *conn, struct trackDb *tdb, char *axtOtherDb) { struct sqlConnection *conn2 = NULL; if (!isHubTrack(tdb->track)) conn2 = hAllocConn(database); // MAF file location is optionally in trackDb char *mafFile = hashFindVal(tdb->settingsHash, "mafFile"); mafOrAxtClick2(conn, conn2, tdb, axtOtherDb, mafFile); hFreeConn(&conn2); } -static void blueCapWriteGsid(FILE *f, char *s, int size, char *r, boolean isProtein, int offset) -/* Write capital letters in blue, with added logic specific for protein. */ -{ -boolean isBlue = FALSE; -int step; -int i; - -if (isProtein) - step = 3; -else - step=1; -for (i=0; i"); - isBlue = TRUE; - } - } - else if (islower(c)) - { - if (isBlue) - { - fprintf(f, ""); - isBlue = FALSE; - } - } - /* look up codon to get AA if it is protein */ - if (isProtein) - { - if (c != '-') - { - c=lookupCodon(s+(long)(i-offset%3)); - /* bypass the first partial codon */ - if ((i == 0) && (c == 'X')) c= ' '; - if ((i == (size-1)) && (c == 'X')) c= ' '; - } - } - fprintf(f, "%c", c); - } - } - -if (isBlue) - fprintf(f, ""); -} - -void mafPrettyOutGsid(FILE *f, struct mafAli *maf, int lineSize, - boolean onlyDiff, int blockNo, boolean isProtein, int mafOrig) -{ -int ii, ch; -int srcChars = 0; -struct mafComp *mc; -int lineStart, lineEnd; -char *summaryLine = needMem(lineSize+1); -char *referenceText; -int startChars, sizeChars, srcSizeChars; -boolean haveInserts = FALSE; -struct mafComp *masterMc = maf->components; - -startChars = sizeChars = srcSizeChars = 0; - -for (mc = maf->components; mc != NULL; mc = mc->next) - { - /* Figure out length of source (species) field. */ - /*if (mc->size != 0)*/ - { - char dbOnly[128]; - int len; -// char *chrom; unused variable - char *org; - - memset(dbOnly, 0, sizeof(dbOnly)); - safef(dbOnly, sizeof(dbOnly), "%s", mc->src); - // chrom = chopPrefix(dbOnly); unused variable - - if ((org = hOrganism(dbOnly)) == NULL) - len = strlen(dbOnly); - else - len = strlen(org); - if (srcChars < len) - srcChars = len; - - len = digitsBaseTen(mc->start); - if (startChars < len) - startChars = len; - len = digitsBaseTen(mc->size); - if (sizeChars < len) - sizeChars = len; - len = digitsBaseTen(mc->srcSize); - if (srcSizeChars < len) - srcSizeChars = len; - - if (mc->text && (mc->rightStatus == MAF_INSERT_STATUS) && (masterMc->start + masterMc->size < winEnd)) - haveInserts = TRUE; - -#ifdef REVERSESTRAND - /* complement bases if hgTracks is on reverse strand */ - if (mc->size && cartCgiUsualBoolean(cart, COMPLEMENT_BASES_VAR, FALSE)) - complement(mc->text, maf->textSize); -#endif - } - } -/* first sequence in the alignment */ -referenceText = maf->components->text; - -for (lineStart = 0; lineStart < maf->textSize; lineStart = lineEnd) - { - int size; - lineEnd = lineStart + lineSize; - if (lineEnd >= maf->textSize) - lineEnd = maf->textSize; - size = lineEnd - lineStart; - initSummaryLine(summaryLine, size, '*'); - for (mc = maf->components; mc != NULL; mc = mc->next) - { - char dbOnly[128], *chrom; - int s = mc->start; - int e = s + mc->size; - char *org; -// char *revComp = ""; unused variable - struct dyString *dy = newDyString(512); -#ifdef REVERSESTRAND - char strand = mc->strand; - if (cartCgiUsualBoolean(cart, COMPLEMENT_BASES_VAR, FALSE)) - strand = (strand == '+') ? '-' : '+'; -#endif -// if (strand == '-') revComp = "&hgSeq.revComp=on"; unused variable - - dyStringClear(dy); - - safef(dbOnly, sizeof(dbOnly), "%s", mc->src); - chrom = chopPrefix(dbOnly); - if ((org = hOrganism(dbOnly)) == NULL) - org = dbOnly; - - if (mc->strand == '-') - reverseIntRange(&s, &e, mc->srcSize); - - - if (mc->text != NULL) - { - fprintf(f, " "); - - dyStringClear(dy); - dyStringPrintf(dy, "%s:%d-%d %c %*dbps",chrom, s+1, e, mc->strand,sizeChars, mc->size); - fprintf(f, " %*s ", dy->string, srcChars, org); - - updateSummaryLine(summaryLine, referenceText + lineStart, - mc->text + lineStart, size); - blueCapWriteGsid(f, mc->text + lineStart, size, - (onlyDiff && mc != maf->components) ? referenceText + lineStart - : NULL, isProtein, - mc->start-mafOrig); - fprintf(f, "\n"); - } - else - { - if (((mc->leftStatus == MAF_CONTIG_STATUS) && (mc->rightStatus == MAF_CONTIG_STATUS) ) - || ((mc->leftStatus == MAF_TANDEM_STATUS) && (mc->rightStatus == MAF_TANDEM_STATUS) ) - || ((mc->leftStatus == MAF_INSERT_STATUS) && (mc->rightStatus == MAF_INSERT_STATUS) ) - || ((mc->leftStatus == MAF_MISSING_STATUS) && (mc->rightStatus == MAF_MISSING_STATUS) )) - { - if (lineStart == 0) - { - int s = mc->start; - int e = s + mc->rightLen; - //struct dyString *dy = newDyString(512); - - if (mc->strand == '-') - reverseIntRange(&s, &e, mc->srcSize); - fprintf(f, " "); - } - else - fprintf(f, " "); - initSummaryLine(summaryLine, size, ' '); - dyStringClear(dy); - dyStringPrintf(dy, "%s:%d-%d %c %*dbps",chrom, s+1, e, mc->strand,sizeChars, mc->size); - fprintf(f, "%*s ", dy->string, srcChars, org); - ch = '-'; - switch(mc->rightStatus) - { - case MAF_INSERT_STATUS: - ch = '='; - break; - case MAF_MISSING_STATUS: - ch = 'N'; - break; - case MAF_TANDEM_STATUS: - case MAF_CONTIG_STATUS: - ch = '-'; - break; - } - for(ii=lineStart; ii < lineEnd ; ii++) - fputc(ch,f); - fprintf(f,"\n"); - } - } - } -#ifdef ADDMATCHLINE - if (lineStart == 0) - fprintf(f, " %-*s %s\n", srcChars, "", summaryLine); - else - fprintf(f, "%-*s %s\n", srcChars, "", summaryLine); -#else - fprintf(f, "\n"); -#endif - } - -if (haveInserts) - { - fprintf(f, "Inserts between block %d and %d in window\n",blockNo, blockNo+1); - for (mc = maf->components; mc != NULL; mc = mc->next) - { - char dbOnly[128]; - // char *chrom; unused variable - int s = mc->start + mc->size; - int e = s + mc->rightLen; - char *org; - - if (mc->text == NULL) - continue; - - if (mc->strand == '-') - reverseIntRange(&s, &e, mc->srcSize); - - safef(dbOnly, sizeof(dbOnly), "%s", mc->src); - // chrom = chopPrefix(dbOnly); unused variable - - if ((org = hOrganism(dbOnly)) == NULL) - org = dbOnly; - - if (mc->rightStatus == MAF_INSERT_STATUS) - { - if (hDbIsActive(dbOnly)) - { -#ifdef REVERSESTRAND - char strand = mc->strand; - if (cartCgiUsualBoolean(cart, COMPLEMENT_BASES_VAR, FALSE)) - strand = (strand == '+') ? '-' : '+'; -#endif - /* - char *revComp = ""; - if (strand == '-') revComp = "&hgSeq.revComp=on"; - linkToOtherBrowser(dbOnly, chrom, s, e); - fprintf(f,"B"); - fprintf(f, ""); - fprintf(f, " "); - - printf("D ", hgcName(), - s, cgiEncode(chrom), - chrom, s, e, dbOnly,revComp); - */ - fprintf(f, " "); - } - else - fprintf(f, " "); - - fprintf(f, "%*s %dbp\n", srcChars, org,mc->rightLen); - } - } - fprintf(f, "\n"); - } -freeMem(summaryLine); - -} - -static void mafOrAxtClickGsid(struct sqlConnection *conn, struct trackDb *tdb, char *axtOtherDb) -/* Display details for MAF or AXT tracks. */ -{ -hgBotDelay(); -if (winEnd - winStart > 30000) - { - printf("Zoom so that window is 30,000 bases or less to see base-by-base alignments\n"); - } -else - { - struct mafAli *mafList, *maf, *subList = NULL; - int aliIx = 0, realCount = 0; - char dbChrom[64]; - char option[128]; - struct consWiggle *consWig, *consWiggles; - struct hash *speciesOffHash = NULL; - char *speciesOrder = NULL; - char *speciesTarget = trackDbSetting(tdb, SPECIES_TARGET_VAR); - char buffer[1024]; - int useTarg = FALSE; - int useIrowChains = FALSE; - int itemPrinted; - int mafOrig; - char query[256]; - - safef(option, sizeof(option), "%s.%s", tdb->track, MAF_CHAIN_VAR); - if (cartCgiUsualBoolean(cart, option, FALSE) && - trackDbSetting(tdb, "irows") != NULL) - useIrowChains = TRUE; - - safef(buffer, sizeof(buffer), "%s.vis",tdb->track); - if (useIrowChains) - { - if (!cartVarExists(cart, buffer) && (speciesTarget != NULL)) - useTarg = TRUE; - else - { - char *val; - - val = cartUsualString(cart, buffer, "useCheck"); - useTarg = sameString("useTarg",val); - } - } - - mafList = mafOrAxtLoadInRegion(conn, tdb, seqName, winStart, winEnd, - axtOtherDb); - safef(dbChrom, sizeof(dbChrom), "%s.%s", database, seqName); - - safef(option, sizeof(option), "%s.speciesOrder", tdb->track); - speciesOrder = cartUsualString(cart, option, NULL); - if (speciesOrder == NULL) - speciesOrder = trackDbSetting(tdb, "speciesOrder"); - - sqlSafef(query, sizeof(query), "select chromStart from %s", tdb->table); - mafOrig = atoi(sqlNeedQuickString(conn, query)); - - for (maf = mafList; maf != NULL; maf = maf->next) - { - int mcCount = 0; - struct mafComp *mc; - struct mafAli *subset; - struct mafComp *nextMc; - - /* remove empty components and configured off components - * from MAF, and ignore - * the entire MAF if all components are empty - * (solely for gap annotation) */ - - if (!useTarg) - { - for (mc = maf->components->next; mc != NULL; mc = nextMc) - { - char buf[64]; - char *organism; - mafSrcDb(mc->src, buf, sizeof buf); - organism = hOrganism(buf); - if (!organism) - organism = buf; - nextMc = mc->next; - safef(option, sizeof(option), "%s.%s", tdb->track, buf); - if (!cartUsualBoolean(cart, option, TRUE)) - { - if (speciesOffHash == NULL) - speciesOffHash = newHash(4); - hashStoreName(speciesOffHash, organism); - } - if (!cartUsualBoolean(cart, option, TRUE)) - slRemoveEl(&maf->components, mc); - else - mcCount++; - } - } - if (mcCount == 0) - continue; - - if (speciesOrder) - { - int speciesCt; - char *species[2048]; - struct mafComp **newOrder, *mcThis; - int i; - - mcCount = 0; - speciesCt = chopLine(cloneString(speciesOrder), species); - newOrder = needMem((speciesCt + 1) * sizeof (struct mafComp *)); - newOrder[mcCount++] = maf->components; - - for (i = 0; i < speciesCt; i++) - { - if ((mcThis = mafMayFindCompSpecies(maf, species[i], '.')) == NULL) - continue; - newOrder[mcCount++] = mcThis; - } - - maf->components = NULL; - for (i = 0; i < mcCount; i++) - { - newOrder[i]->next = 0; - slAddHead(&maf->components, newOrder[i]); - } - - slReverse(&maf->components); - } - subset = mafSubsetE(maf, dbChrom, winStart, winEnd, TRUE); - if (subset != NULL) - { - /* Reformat MAF if needed so that sequence from current - * database is the first component and on the - * plus strand. */ - mafMoveComponentToTop(subset, dbChrom); - if (subset->components->strand == '-') - mafFlipStrand(subset); - subset->score = mafScoreMultiz(subset); - slAddHead(&subList, subset); - ++realCount; - } - } - slReverse(&subList); - mafAliFreeList(&mafList); - if (subList != NULL) - { - char *showVarName = "hgc.showMultiBase"; - char *showVarVal = cartUsualString(cart, showVarName, "all"); - boolean onlyDiff = sameWord(showVarVal, "diff"); - /* add links for conservation score statistics */ - boolean first = TRUE; - consWiggles = wigMafWiggles(database, tdb); - for (consWig = consWiggles; consWig != NULL; - consWig = consWig->next) - { - if (first) - printf("\n "); - if (sameString(consWig->leftLabel, DEFAULT_CONS_LABEL)) - conservationStatsLink(tdb, - "Conservation score statistics", consWig->table); - else - { - char *wigVarSuffix = NULL; - (void)wigMafWiggleVar(tdb->track, consWig, &wigVarSuffix); - if (!cartUsualBooleanClosestToHome(cart, tdb, FALSE, wigVarSuffix,FALSE)) - continue; - if (first) - { - printf("\n
Conservation score statistics:"); - first = FALSE; - } - printf(" "); - subChar(consWig->uiLabel, '_', ' '); - conservationStatsLink(tdb, - consWig->uiLabel, consWig->table); - } - } - puts("
\n"); - -#ifdef REVERSESTRAND - /* notify if bases are complemented (hgTracks is on reverse strand) */ - if (cartCgiUsualBoolean(cart, COMPLEMENT_BASES_VAR, FALSE)) - puts("Alignment displayed on reverse strand
"); -#endif - - printf(""); - - /* notify if species removed from alignment */ - if ((speciesOffHash) && !hIsGsidServer()) - { - char *species; - struct hashCookie hc = hashFirst(speciesOffHash); - puts("Components not displayed: "); - - itemPrinted = 0; - while ((species = hashNextName(&hc)) != NULL) - { - /* print a break every 6 items */ - if (((itemPrinted % 6) == 0) && (itemPrinted >0)) - printf(""); - } -} - void customMafClick(struct sqlConnection *conn, struct sqlConnection *conn2, struct trackDb *tdb) { struct hash *settings = tdb->settingsHash; char *fileName; if ((fileName = hashFindVal(settings, "mafFile")) == NULL) errAbort("cannot find custom maf file setting"); mafOrAxtClick2(conn, conn2, tdb, NULL, fileName); } void genericMafClick(struct sqlConnection *conn, struct trackDb *tdb, char *item, int start) /* Display details for MAF tracks. */ { -if (hIsGsidServer()) - { - mafOrAxtClickGsid(conn, tdb, NULL); - } -else - { mafOrAxtClick(conn, tdb, NULL); } -} void genericAxtClick(struct sqlConnection *conn, struct trackDb *tdb, char *item, int start, char *otherDb) /* Display details for AXT tracks. */ { mafOrAxtClick(conn, tdb, otherDb); }
"); - printf("%s ", species); - itemPrinted++; - } - puts("
"); - } - - for (maf = subList; maf != NULL; maf = maf->next) - { - mafLowerCase(maf); - printf("Alignment block %d of %d in window, %d - %d, %d bps \n", - ++aliIx,realCount,maf->components->start + 1, - maf->components->start + maf->components->size, maf->components->size); - if (strstr(tdb->type, "wigMafProt")) - { - mafPrettyOutGsid(stdout, maf,210,onlyDiff, aliIx, 1, mafOrig); - } - else - { - mafPrettyOutGsid(stdout, maf, 70,onlyDiff, aliIx, 0, mafOrig); - } - } - mafAliFreeList(&subList); - } - else - { - printf("No multiple alignment in browser window"); - } - printf("