/* Lowe Lab additions for Archaea and Bacterial details pages*/ #include "common.h" #include "obscure.h" #include "hCommon.h" #include "hash.h" #include "bits.h" #include "memgfx.h" #include "portable.h" #include "errabort.h" #include "dystring.h" #include "nib.h" #include "cheapcgi.h" #include "htmshell.h" #include "cart.h" #include "jksql.h" #include "dnautil.h" #include "dnaseq.h" #include "fa.h" #include "fuzzyFind.h" #include "seqOut.h" #include "hdb.h" #include "spDb.h" #include "hui.h" #include "hgRelate.h" #include "htmlPage.h" #include "psl.h" #include "cogs.h" #include "cogsxra.h" #include "bed.h" #include "xenalign.h" #include "isochores.h" #include "genePred.h" #include "genePredReader.h" #include "pepPred.h" #include "wabAli.h" #include "minGeneInfo.h" #include "rnaGene.h" #include "tRNAs.h" #include "snoRNAs.h" #include "gbRNAs.h" #include "hgMaf.h" #include "maf.h" #include "hgConfig.h" #include "web.h" #include "dbDb.h" #include "sample.h" #include "axt.h" #include "gbProtAnn.h" #include "hgSeq.h" #include "chain.h" #include "chainNet.h" #include "chainDb.h" #include "chainToPsl.h" #include "chainToAxt.h" #include "netAlign.h" #include "tigrCmrGene.h" #include "jgiGene.h" #include "lowelabPfamHit.h" #include "lowelabArkinOperonScore.h" #include "lowelabTIGROperonScore.h" #include "sargassoSeaXra.h" #include "codeBlastScore.h" #include "codeBlast.h" #include "tigrOperon.h" #include "easyGene.h" #include "llaInfo.h" #include "blastTab.h" #include "hdb.h" #include "hgc.h" #include "genbank.h" #include "pseudoGeneLink.h" #include "axtLib.h" #include "tfbsCons.h" #include "tfbsConsMap.h" #include "tfbsConsSites.h" #include "tfbsConsFactors.h" #include "simpleNucDiff.h" #include "botDelay.h" #include "bed5FloatScore.h" #include "bed6FloatScore.h" #include "pscreen.h" #include "gapCalc.h" #include "chainConnect.h" #include "ec.h" #include "transMapClick.h" #include "ccdsClick.h" #include "memalloc.h" #include "rnaHybridization.h" #include "cddInfo.h" #include "alignInfo.h" #include "loweutils.h" #include "cddDesc.h" #include "arCOGs.h" #include "arcogdesc.h" #include "megablastInfo.h" #include "geneTree.h" /*#define LISTUI*/ extern char *uniprotFormat; static void goPrint( struct sqlConnection *conn, char *geneId, char *acc) /* Print out GO annotations. */ { struct sqlConnection *goConn = sqlConnect("go"); char query[512]; struct sqlResult *sr; char **row; static char *aspects[3] = {"F", "P", "C"}; static char *aspectNames[3] = { "Molecular Function", "Biological Process", "Cellular Component", }; int aspectIx; int termCount = 0; if (sqlTableExists(goConn,"goaPart") && sqlTableExists(goConn,"term")) for (aspectIx = 0; aspectIx < ArraySize(aspects); ++aspectIx) { boolean hasFirst = FALSE; safef(query, sizeof(query), "select term.acc,term.name" " from goaPart,term" " where goaPart.dbObjectId = '%s'" " and goaPart.goId = term.acc" " and goaPart.aspect = '%s'" , acc, aspects[aspectIx]); sr = sqlGetResult(goConn, query); while ((row = sqlNextRow(sr)) != NULL) { char *goID = row[0]; char *goTermName = row[1]; if (!hasFirst) { printf("%s:
", aspectNames[aspectIx]); hasFirst = TRUE; } printf("%s %s
\n", goID, goTermName); termCount++; } if (hasFirst) printf("
"); sqlFreeResult(&sr); } if (termCount == 0) printf("Not available
\n"); sqlDisconnect(&goConn); } void keggOtherGenes(struct sqlConnection *conn, char *geneId, char *table, char *mapId) /* Print out genes linked to a kegg pathway mapId. */ { char query[512], **row; struct sqlResult *sr; char *extraTable = "gbProtCodeXra"; char *keggTable = "keggPathway"; if (hTableExists(database, extraTable)) { safef(query, sizeof(query), "select x.name, x.gene, x.product from %s k1, %s x " "where k1.mapID = '%s' and " "k1.kgID = x.name ;" , keggTable, extraTable, mapId ); sr = sqlGetResult(conn, query); printf("\n"); while ((row = sqlNextRow(sr)) != NULL) { printf("\n", row[1], row[2]); else printf("\n", row[2]); } sqlFreeResult(&sr); printf("
"); hgcAnchorPosition(table,row[0]); printf("%s
\n",row[0]); if (differentString(row[0],row[1]) && differentString(row[1], "none")) printf("
%s%s
%s
\n"); } } void keggLink(struct sqlConnection *conn, char *geneId, char *table, char *title) /* Print out kegg database link. */ { char query[512], **row; struct sqlResult *sr; struct sqlConnection *conn2 = hAllocConn(database); safef(query, sizeof(query), "select keggPathway.locusID,keggPathway.mapID,keggMapDesc.description" " from keggPathway,keggMapDesc" " where keggPathway.kgID='%s'" " and keggPathway.mapID = keggMapDesc.mapID" , geneId); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { printf("%s",title); printf("", row[1], row[0]); printf("%s - %s
", row[1], row[2]); printf("Other Genes in Kegg Pathway:
"); keggOtherGenes(conn2, geneId, table, row[1]); printf("
\n"); } sqlFreeResult(&sr); } int keggCount(struct sqlConnection *conn, char *geneId) /* Count up number of hits. */ { char query[256]; char *keggTable = "keggPathway"; if (!hTableExists(database, keggTable)) return 0; safef(query, sizeof(query), "select count(*) from %s where kgID='%s'", keggTable, geneId); return sqlQuickNum(conn, query); } void modBaseAnchor(char *swissProtAcc) /* Print out anchor to modBase. */ { printf("", swissProtAcc); } float computeGCContent(char* dna, int length) { float percent = 0.0f; int count = 0; int i = 0; for (i = 0; i < length; i++) { if ((dna[i] == 'C') || (dna[i] == 'c') || (dna[i] == 'G') || (dna[i] == 'g')) count++; } percent = (float) count / (float) length * 100.0f; return percent; } int selfBlastpHitCount(struct sqlConnection *conn, char *geneId) /* Count up number of hits. */ { char query[512]; char *blastpHitsTable = "blastpHits"; if (!hTableExists(database, blastpHitsTable)) return 0; safef(query, sizeof(query), "select count(*) from %s where query = '%s' and target like '%s:%%' and target != '%s:%s'", blastpHitsTable, geneId, database, database, geneId); return sqlQuickNum(conn, query); } struct blastTab* loadSelfBlastpHits(struct sqlConnection *conn, char* queryName, int self) /* Load all blastp hits in the same genome of the given query gene into a list */ { char query[512]; struct sqlResult *srBlastpHits = NULL; struct blastTab *list = NULL; struct blastTab *blastpHits; char **row; char blastpHitsTable[] = "blastpHits"; if (hTableExists(database, blastpHitsTable)) { if (self) { sprintf(query, "select * from %s where query = '%s' and target like '%s:%%'", blastpHitsTable, queryName, database); } else { sprintf(query, "select * from %s where query = '%s' and target like '%s:%%' and target != '%s:%s'", blastpHitsTable, queryName, database, database, queryName); } srBlastpHits = sqlGetResult(conn, query); while ((row = sqlNextRow(srBlastpHits)) != NULL) { blastpHits = blastTabLoad(row); slAddTail(&list, blastpHits); } } if (srBlastpHits != NULL) sqlFreeResult(&srBlastpHits); return list; } void printSelfHomologs(struct sqlConnection *conn, struct blastTab *blastpHitsList) /* Print self homologs in refseq */ { char query[512]; struct sqlResult *sr; char **row; char refSeq[50]; char xraTable[50]; char product[255]; struct blastTab *blastpHits; struct minGeneInfo *ginfo; char *blastpTarget[2]; char **buffer = NULL; boolean findTable = FALSE; unsigned int cdsStart = 0; unsigned int cdsEnd = 0; printf("
\n"); printf("Homologs within genome
\n"); /* Print table */ printf("", HG_COL_BORDER); printf("\n"); printf("
\n"); printf("\n", HG_COL_INSIDE); printf("\n"); /* Print table column heading */ printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); blastpHits = blastpHitsList; while (blastpHits != NULL) { parseDelimitedString(blastpHits->target, ':', blastpTarget, 2); if (hTableExists(blastpTarget[0], "lookup")) { sprintf(query, "select lookupValue from %s.lookup where lookupCode = 'annotRev'", blastpTarget[0]); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) != NULL) { strcpy(refSeq, row[0]); findTable = TRUE; sqlFreeResult(&sr); } } else if (hTableExists(blastpTarget[0], "refSeq")) { strcpy(refSeq, "refSeq"); findTable = TRUE; } if (findTable) { sprintf(query, "select chrom, cdsStart, cdsEnd from %s where name = '%s'", refSeq, blastpTarget[1]); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) != NULL) { cdsStart = strtoul(row[1], buffer, 10); cdsEnd = strtoul(row[2], buffer, 10); printf("\n"); printf("\n", row[0], cdsStart, cdsEnd, blastpTarget[0], blastpTarget[1]); } else printf("\n", blastpTarget[1]); sqlFreeResult(&sr); } else printf("\n", blastpTarget[1]); if (hTableExists(blastpTarget[0], "lookup")) { sprintf(query, "select lookupValue from %s.lookup where lookupCode = 'annotRevXra'", blastpTarget[0]); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) != NULL) { strcpy(xraTable, row[0]); sqlFreeResult(&sr); } else strcpy(product, "N/A"); sprintf(query, "select product from %s where name = '%s'", xraTable, blastpTarget[1]); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) != NULL) { strcpy(product, row[0]); sqlFreeResult(&sr); } else strcpy(product, "N/A"); } else { ginfo = getGbProtCodeInfo(conn, blastpTarget[0], blastpTarget[1]); if (ginfo != NULL && ginfo->product != NULL && differentString(ginfo->product,"none")) strcpy(product, ginfo->product); else strcpy(product, "N/A"); } printf("\n", product); printf("\n", blastpHits->eValue); printf("\n"); free(blastpTarget[0]); free(blastpTarget[1]); blastpHits = blastpHits->next; } /* Close table */ printf("\n"); printf("
GeneProductBlastP E-value
%s%s%s%s%0.0e
\n"); printf("
\n"); } int getGeneTree(struct sqlConnection *conn, char *geneId, char *treeFileName) { int success = 0; char query[256]; char *geneTreeTable = "geneTree"; struct sqlResult *sr; char **row; struct geneTree *genetree; if (!hTableExists(database, geneTreeTable)) return 0; safef(query, sizeof(query), "select * from %s where name = '%s'", geneTreeTable, geneId); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { genetree = geneTreeLoad(row); if (!fileExists(treeFileName)) { FILE *f; f = fopen(treeFileName, "w"); if (f != NULL) { fprintf(f, "%s\n", genetree->tree); fclose(f); success = 1; } } else success = 1; } sqlFreeResult(&sr); geneTreeFree(&genetree); return success; } void doRefSeq(struct trackDb *tdb, char *item, char *pepTable, char *extraTable) /* Handle click on gene track. */ { struct minGeneInfo ginfo; char query[256]; char query2[256]; char *gi = NULL; struct sqlResult *sr, *sr2; struct dnaSeq *sequence; char **row, **row2; char *words[16], *dupe = cloneString(tdb->type); int wordCount, x, length; int num = 0; int hits = 0; struct sqlConnection *conn = hAllocConn(database); struct sqlConnection *conn2; struct sqlConnection *spConn = NULL; struct COG *COG=NULL; struct COGXra *COGXra=NULL; char *temparray[160]; char *giwords[5]; char *spAcc = NULL; struct slName *el, *list; char *table = tdb->table; char *pdb = hPdbFromGdb(database); struct genePred *gpList = NULL, *gp = NULL; char tableName[64]; boolean hasBin; int itemCount = 0; int arcogCount = 0; char genome[50] = ""; char clade[50] = ""; boolean hasArCOG; char treeFileName[256]; char treeTmpPsFileName[256]; char treePsFileName[256]; char treePngFileName[256]; char treePdfFileName[256]; char command[512]; char buffer[512]; char searchTerm[256]; struct blastTab *blastpHitsList; char pepTableName[64]; char extraTableName[64]; if (startsWith("annotRev", table)) { sprintf(pepTableName, "%s%s", table, pepTable); sprintf(extraTableName, "%s%s", table, extraTable); } else { strcpy(pepTableName, pepTable); strcpy(extraTableName, extraTable); } spConn = sqlConnect( pdb); genericHeader(tdb, item); wordCount = chopLine(dupe, words); if (wordCount > 1) num = atoi(words[1]); if (num < 3) num = 3; if (extraTableName != NULL && hTableExists(database, extraTableName)) { sprintf(query, "select * from %s where name = '%s'", extraTableName, item); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { minGeneInfoStaticLoad(row, &ginfo); gi = cloneString(ginfo.gi); if (ginfo.gene != NULL && differentString(ginfo.gene,"none")) printf("Gene: %s
\n", ginfo.gene); if (ginfo.product != NULL && differentString(ginfo.product,"none")) medlineLinkedLine("Product", ginfo.product, ginfo.product); if (ginfo.note != NULL && differentString(ginfo.note,"none")) printf("Note: %s
\n", ginfo.note); if (ginfo.protein != NULL && differentString(ginfo.protein,"none")) printf("Protein: %s
\n", ginfo.protein); if (ginfo.ec != NULL && differentString(ginfo.ec,"none")) { printf("EC (Enzyme Commission) number: " "
%s\n", ginfo.ec, ginfo.ec); getEcHtml(ginfo.ec); medlineLinkedTermLine("EC PubMed Search", ginfo.ec, ginfo.ec, "EC/RN Number"); printf(" Brenda : %s
\n", ginfo.ec, ginfo.ec); } } sqlFreeResult(&sr); } /* lookup swissprot acc */ spAcc = uniProtFindPrimAccFromGene(item, database); if (spAcc != NULL) { printf("UniProtKB: "); printf("%s
\n", item); } else { printf(" TARGET=_blank>%s
\n", spAcc); } } /* print table of contents */ printf("

\n"); printf("[Positions and Sequence]   \n"); printf("[COG]   \n"); printf("[Gene Ontology]   \n"); printf("[Protein Domain and Structure Infomation]   \n"); printf("[Gene Homology]   \n"); printf("[Pathway]
\n"); printf("

\n"); /* Positions and sequence */ printf("\n"); printf("\n"); printf("
\n"); printf("Positions and Sequence
\n"); hFindSplitTable(database, seqName, table, tableName, &hasBin); safef(query, sizeof(query), "name = \"%s\"", item); gpList = genePredReaderLoadQuery(conn, tableName, query); for (gp = gpList; gp != NULL; gp = gp->next) { sequence = hDnaFromSeq(database, gp->chrom, gp->txStart, gp->txEnd, dnaUpper); if (sequence != NULL) printf("GC content: %0.2f%%
\n", computeGCContent(sequence->dna, sequence->size)); } geneShowPosAndLinks(item, item, tdb, pepTableName, "htcTranslatedProtein", "htcGeneMrna", "htcGeneInGenome", "Predicted mRNA"); genePredFreeList(&gpList); printf("

\n"); /* COG */ printf("\n"); printf("\n"); printf("
\n"); printf("COG
\n"); /* cog description */ itemCount = 0; if (hTableExists(database, "COG")) { sprintf(query, "select * from COG where name = '%s'", item); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { COG = COGLoad(row); if(COG!=NULL) { length=chopString(COG->COG, "," , temparray, 999); for(x=0; xCOG: " "%s  " "Code %s \n", COGXra->name, COGXra->name, COG->code,COG->code); printf(" %s
\n", COGXra->info); itemCount++; } sqlFreeResult(&sr2); hFreeConn(&conn2); } } } sqlFreeResult(&sr); //hFreeConn(&conn2); } /* if (hTableExists(database, "arCOGs")) { struct arCOGs *infoload = NULL; struct arcogdesc *description = NULL; int rowOffset = hOffsetPastBin(database, seqName, "arCOGs"); //infoload = arCOGsLoad(row); row = NULL; sprintf(query, "select * from arCOGs where gene = '%s'", item); sr = sqlGetResult(conn, query); conn2 = hAllocConn(database); while ((row = sqlNextRow(sr)) != NULL) { infoload = arCOGsLoad(row+rowOffset); if(infoload!=NULL) { sprintf(query2, "select * from mgCommonDb.arcogdesc where name = '%s'",infoload->name ); sr2 = sqlGetResult(conn2, query2); while ((row2 = sqlNextRow(sr2)) != NULL) { description=arcogdescLoad(row2); if(description!=NULL) { printf("arCOG: %s Code %s",infoload->name, description->code); printf(" %s
\n", description->description); itemCount++; } } sqlFreeResult(&sr2); hFreeConn(&conn2); } } } */ arcogCount = 0; hasArCOG = FALSE; row = NULL; sprintf(query, "show databases like 'arCogsDb'"); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) != NULL) { hasArCOG = TRUE; } sqlFreeResult(&sr); if (hasArCOG) { /* Get species info */ memset(genome, 0, 50); memset(clade, 0, 50); getGenomeClade(conn, database, genome, clade); sprintf(query, "select distinct a.arcog_id, a.anntation, c.class_id from arCogsDb.arcogDef a, arCogsDb.arcog b, arCogsDb.arcogFun c where a.arcog_id = b.arcog_id and a.arcog_id = c.arcog_id and db_name = '%s' and name = '%s'", database, item); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { printf("arCOG: %s Code %s ", row[0], row[0], genome, row[2], row[2]); printf(" %s
\n", row[1]); arcogCount++; itemCount++; } sqlFreeResult(&sr); if (arcogCount > 0) printf("arCOG Gene Annotation
", genome, item); } if (itemCount == 0) printf("Not available\n"); printf("

\n"); /* GO */ printf("\n"); printf("\n"); printf("
\n"); printf("Gene Ontology
\n"); /* print go terms */ goPrint( conn, item, spAcc); printf("

\n"); /* Protein domain and structure information */ printf("\n"); printf("\n"); printf("
\n"); printf("Protein Domain and Structure Information
\n"); /* interpro domains */ list = spExtDbAcc1List(spConn, spAcc, "InterPro"); if (list != NULL) { char query[256], **row, **row2; struct sqlResult *sr, *sr2; printf("InterPro Domains: "); printf("", spAcc); printf("Graphical view of domain structure
"); safef(query, sizeof(query), "select extAcc1,extAcc2 from extDbRef,extDb" " where extDbRef.acc = '%s'" " and extDb.val = 'Interpro' and extDb.id = extDbRef.extDb" , spAcc); sr = sqlGetResult(spConn, query); while ((row = sqlNextRow(sr)) != NULL) { char interPro[256]; char *pdb = hPdbFromGdb(database); safef(interPro, 128, "%s.interProXref", pdb); if (hTableExists(database, interPro)) { safef(query, sizeof(query), "select description from %s where accession = '%s' and interProId = '%s'", interPro, spAcc, row[0]); sr2 = sqlGetResult(conn, query); if ((row2 = sqlNextRow(sr2)) != NULL) { printf("", row[0]); printf("%s - %s
\n", row[0], row2[0]); } sqlFreeResult(&sr2); } else { printf("", row[0]); printf("%s - %s
\n", row[0], row[1]); } } printf("
\n"); slFreeList(&list); } /* pfam domains */ list = spExtDbAcc1List(spConn, spAcc, "Pfam"); if (list != NULL) { printf("Pfam Domains:
"); for (el = list; el != NULL; el = el->next) { char query[256]; char *description; safef(query, sizeof(query), "select description from proteome.pfamDesc where pfamAC='%s'", el->name); description = sqlQuickString(spConn, query); if (description == NULL) { safef(query, sizeof(query), "select extDbRef.extAcc1 from extDbRef,extDb " "where extDbRef.acc = '%s' " "and extDbRef.extDb = extDb.id " "and extDb.val = '%s'" , spAcc,el->name); printf("%s\n", query); description = sqlQuickString(spConn, query); } if (description == NULL) description = cloneString("n/a"); printf("", el->name); printf("%s - %s
\n", el->name, description); freez(&description); } slFreeList(&list); printf("
\n"); } list = spExtDbAcc1List(spConn, spAcc, "PDB"); if (list != NULL) { char query[256], **row; struct sqlResult *sr; int column = 0, maxColumn=4, rowCount=0; printf("Protein Data Bank (PDB) 3-D Structure
"); safef(query, sizeof(query), "select extAcc1,extAcc2 from extDbRef,extDb" " where extDbRef.acc = '%s'" " and extDb.val = 'PDB' and extDb.id = extDbRef.extDb" , spAcc); sr = sqlGetResult(spConn, query); printf("\n"); while ((row = sqlNextRow(sr)) != NULL) { if (++column > maxColumn) { printf(""); column = 1; if (rowCount == 0) { printf(""); } ++rowCount; } printf(""); } printf("
To conserve bandwidth, only the images from the first %d structures are shown.", maxColumn); printf("
"); printf("", row[0]); if (rowCount < 1) printf("
", row[0]); printf("%s
- %s
\n", row[0], row[1]); printf("
\n"); printf("
\n"); slFreeList(&list); } /* Do modBase link. */ { printf("ModBase Predicted Comparative 3D Structure on "); modBaseAnchor(spAcc); printf("%s", spAcc); printf("
\n"); printf(""); printf("", spAcc); printf("", spAcc); printf("", spAcc); printf("\n"); printf(""); printf(""); printf(""); printf("
"); modBaseAnchor(spAcc); printf("\n"); modBaseAnchor(spAcc); printf("\n"); modBaseAnchor(spAcc); printf("\n
FrontTopSide
\n"); printf("The pictures above may be empty if there is no " "ModBase structure for the protein. The ModBase structure " "frequently covers just a fragment of the protein. You may " "be asked to log onto ModBase the first time you click on the " "pictures. It is simplest after logging in to just click on " "the picture again to get to the specific info on that model.

"); } printf("


\n"); /* Gene Homology */ printf("\n"); printf("\n"); printf("
\n"); printf("Gene Homology
\n"); /* ncbi blast hits */ hits = chopString(gi,":",giwords,sizeof(giwords)); if (hits > 0) { printf("NCBI Blast Hits: " "%s
\n", (hits == 2) ? giwords[1] : giwords[0], (hits == 2) ? giwords[1] : giwords[0]); } /* Gene tree */ safef(treeFileName, sizeof(treeFileName), "../trash/geneTree/geneTree_%s.txt", item); if (getGeneTree(conn, item, treeFileName)) { safef(treeTmpPsFileName, sizeof(treeTmpPsFileName), "../trash/geneTree/tmp_geneTree_%s.ps", item); safef(treePsFileName, sizeof(treePsFileName), "../trash/geneTree/geneTree_%s.ps", item); safef(treePngFileName, sizeof(treePngFileName), "../trash/geneTree/geneTree_%s.png", item); safef(treePdfFileName, sizeof(treePdfFileName), "../trash/geneTree/geneTree_%s.pdf", item); safef(searchTerm, sizeof(searchTerm), ".%s) show\n", item); if (!fileExists(treePsFileName)) { safef(command, sizeof(command), "../bin/draw_tree -b %s | grep -v translate | sed '5 i 10 530 translate' | sed '6 i 0.33 0.33 scale' | sed 's/findfont 12/findfont 24/' > %s", treeFileName, treeTmpPsFileName); mustSystem(command); FILE *fi = mustOpen(treeTmpPsFileName, "r"); FILE *fo = mustOpen(treePsFileName, "w"); if ((fi != NULL) && (fo != NULL)) { mustGetLine(fi, buffer, 512); while (!sameWord(buffer, "")) { if (endsWith(buffer, searchTerm)) { fprintf(fo, "255 0 0 setrgbcolor\n"); fprintf(fo, "%s", buffer); fprintf(fo, "0 0 0 setrgbcolor\n"); } else fprintf(fo, "%s", buffer); mustGetLine(fi, buffer, 512); } fclose(fo); fclose(fi); } safef(command, sizeof(command), "rm -f %s", treeTmpPsFileName); mustSystem(command); } if (!fileExists(treePngFileName)) { safef(command, sizeof(command), "pstoimg -scale 0.4 -aaliastext -type png -density 300 -out %s %s", treePngFileName, treePsFileName); mustSystem(command); } if (!fileExists(treePdfFileName)) { safef(command, sizeof(command), "ps2pdf %s %s", treePsFileName, treePdfFileName); mustSystem(command); } printf("
Phylogenetic tree with homologous genes: View as \n"); printf("Postscript \n", treePsFileName); printf("PNG \n", treePngFileName); printf("PDF \n", treePdfFileName); printf("Text 
\n", treeFileName); printf("
The 20 highest scoring homologous genes of this protein were retrieved by BLASTP from the genomes available in the UCSC microbial genome browser. "); printf("The alignments of the protein sequences, made by MUSCLE, "); printf("were used to construct the phylogenetic tree. This maximum likelihood unrooted tree was computed by using "); printf("PHYML with the Jones Taylor Thornton model of sequence evolution, "); printf("by including a Gamma-correction (eight categories of evolutionary rates, "); printf("an estimated alpha-parameter and an estimated proportion of invariant sites).
"); } /* Self Homologs */ if (selfBlastpHitCount(conn, item) > 0) { blastpHitsList = loadSelfBlastpHits(conn, item, 0); printSelfHomologs(conn, blastpHitsList); } printf("

\n"); /* Pathway */ printf("\n"); printf("\n"); printf("
\n"); printf("Pathway
\n"); /* kegg pathway links */ if (keggCount(conn, item) > 0) { keggLink(conn, item, table, "Kegg Pathway:
"); } else printf("Not available\n"); printf("

\n"); /* Do SAM-T02 sub-section */ //doSamT02(spAcc, database); printTrackHtml(tdb); hFreeConn(&conn); } /*Code to display Sargasso Sea Information*/ void doSargassoSea(struct trackDb *tdb, char *trnaName) { struct bed *cb=NULL; struct sargassoSeaXra *cbs=NULL, *cbs2, *list=NULL; struct sqlConnection *conn = hAllocConn(database); struct sqlResult *sr; char query[512]; char *dupe, *words[16]; char **row; char tempstring[255]=""; int flag, z, dashes, wordCount, rowOffset; int start = cartInt(cart, "o"), num = 0, flag2=0; float sequenceLength, dashlength=60; genericHeader(tdb,trnaName); dupe = cloneString(tdb->type); wordCount = chopLine(dupe, words); if (wordCount > 1) num = atoi(words[1]); if (num < 3) num = 3; genericBedClick(conn, tdb, trnaName, start, num); rowOffset = hOffsetPastBin(database, seqName, tdb->table); sprintf(query, "select * from %s where name = '%s'", tdb->table, trnaName); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) cb=bedLoadN(row+1, 6); sequenceLength=(cb->chromEnd - cb->chromStart); if(sequenceLength<0){ sequenceLength=sequenceLength*-1;} sequenceLength=sequenceLength/3; dashlength=sequenceLength/60; /*Query the database for the extrainfo file for sargassoSea*/ conn=hAllocConn(database);/*sqlConnect(dupe);*/ safef(tempstring, sizeof(tempstring),"select * from sargassoSeaXra where qname = '%s'", trnaName); sr = sqlGetResult(conn, tempstring); /*Load the required data from the database*/ while ((row = sqlNextRow(sr)) != NULL) { cbs=sargassoSeaXraLoad(row); slAddHead(&list, cbs); } slReverse(&list); flag=0; flag2=0; /*Print out table with Blast information*/ printf(" \n\n

"); printf(""); printf(" \n \n"); printf(" \n \n \n \n \n \n \n \n \n "); flag=0; for(cbs2=list;cbs2!=NULL;cbs2=cbs2->next) { printf("\n \n \n \n \n \n \n \n \n \n \n"); flag=0; } /* printf("

\n
Organism"); printf("
\n
"); printf("Nucleotides \naligned begin"); printf("
\n
"); printf("Nucelotides \naligned end"); printf("
\n
NCBI Link"); printf("
\n
"); printf("Evalue"); printf("
\n
"); printf("Percent Identity"); printf("
\n
"); printf("Alignment Length"); printf("
\n
"); printf("Gap openings"); printf("
"); printf("",cbs2->GI); printf("%s",cbs2->GI,cbs2->species); printf("
\n
"); printf("%i",cbs2->thisseqstart); printf("
\n
"); printf("%i",cbs2->thisseqend); printf("
\n
"); printf("NCBI Link",cbs2->GI); printf("
\n
"); printf("%s",cbs2->evalue); printf("
\n
"); printf("%.2f",cbs2->PI); printf("
\n
"); printf("%i",cbs2->length); printf("
\n
"); printf("%i",cbs2->gap); printf("
\n"); */ /*Print out the table for the alignments*/ printf(""); printf(" \n \n"); printf(" \n \n \n "); printf(" \n \n \n "); flag=0; flag2=0; for(cbs2=list;cbs2!=NULL;cbs2=cbs2->next) { printf("\n \n \n \n \n"); flag=0; } /*Free the data*/ hFreeConn(&conn); sargassoSeaXraFree(&cbs); printTrackHtml(tdb); } /*Function to print out full code name from code letter*/ void printCode(char code) { switch(code) { case 'a': printf("Aerobe"); break; case 'b': printf("Bacteria"); break; case 'c': printf("Crenarchaea"); break; case 'd': printf("Acidophile"); break; case 'e': printf("Euryarchaea"); break; case 'g': printf("Within Genus"); break; case 'h': printf("Hyperthermophile"); break; case 'm': printf("Methanogen"); break; case 'n': printf("Anaerobe"); break; case 'o': printf("Nanoarchaea"); break; case 't': printf("Thermophile"); break; case 'u': printf("Eukarya"); break; case 'v': printf("Viral"); break; case 'k': printf("Alkaliphile"); break; case 'l': printf("Halophile"); break; case 'r': printf("Facultative Aerobe"); break; default: break; } } void doTrnaGenes(struct trackDb *tdb, char *trnaName) { struct tRNAs *trna; char query[512]; struct sqlConnection *conn = hAllocConn(database); struct sqlResult *sr; char *dupe, *words[16]; char **row; int wordCount; int rowOffset; char* chrom = cartString(cart, "c"); genericHeader(tdb,trnaName); dupe = cloneString(tdb->type); wordCount = chopLine(dupe, words); rowOffset = hOffsetPastBin(database, seqName, tdb->table); sprintf(query, "select * from %s where chrom = '%s' and name = '%s'", tdb->table, chrom, trnaName); sr = sqlGetResult(conn, query); printf("
Organism"); printf("
\n
Alignment"); printf("
%s where each plus(+) is approx. %.1f amino acids", trnaName, dashlength); printf("
\n
"); printf("\n"); for(z=0; z<60; z++) { printf("+"); } printf(""); printf("
"); dashes=cbs2->queryseqstart-cbs2->queryseqend; if(dashes<0) dashes=dashes*-1; printf("",cbs2->GI); printf("%s, %s",cbs2->GI, cbs2->species,cbs2->qName); printf("\n "); printf("\n"); dashes=dashes/dashlength; if(cbs2->queryseqstart>cbs2->queryseqend) for(z=0; z<((cbs2->queryseqend)/dashlength); z++) { printf(" "); } else for(z=0; z<((cbs2->queryseqstart)/dashlength); z++) { printf(" "); } if(dashes<1) printf("+"); for(z=0; z"); printf("
\n"); while ((row = sqlNextRow(sr)) != NULL) { printf("\n"); printf("\n"); printf(""); printf(""); } printf("
\n"); trna = tRNAsLoad(row+rowOffset); printf("tRNA name: %s
\n",trna->name); printf("tRNA Isotype: %s
\n",trna->aa); printf("tRNA anticodon: %s
\n",trna->ac); printf("tRNAscan-SE score: %.2f
\n",trna->trnaScore); printf("Intron(s): %s
\n",trna->intron); printf("Genomic size: %d nt
\n",trna->chromEnd-trna->chromStart); printf("Position: " "", hgTracksPathAndSettings(), database, trna->chrom, trna->chromStart+1, trna->chromEnd); printf("%s:%d-%d
\n", trna->chrom, trna->chromStart+1, trna->chromEnd); printf("Strand: %s
\n", trna->strand); if (!sameString(trna->genomeUrl, "")) { printf("
View summary of all genomic tRNA predictions
\n", trna->genomeUrl); printf("
View tRNA alignments
\n", trna->trnaUrl); } if (trna->next != NULL) printf("
\n"); printf("
\n"); if (startsWith(trna->chrom, trna->name)) printf("tRNA secondary structure for %s\n", database,database,trna->name,trna->name); else printf("tRNA secondary structure for %s\n", database,database,trna->chrom,trna->name,trna->name); printf("
"); sqlFreeResult(&sr); hFreeConn(&conn); printTrackHtml(tdb); tRNAsFree(&trna); } void doSnornaGenes(struct trackDb *tdb, char *snornaName) { struct snoRNAs *snorna; char query[512]; struct sqlConnection *conn = hAllocConn(database); struct sqlResult *sr; char *dupe, *words[16]; char **row; int wordCount; int rowOffset; genericHeader(tdb,snornaName); dupe = cloneString(tdb->type); wordCount = chopLine(dupe, words); rowOffset = hOffsetPastBin(database, seqName, tdb->table); sprintf(query, "select * from %s where name = '%s'", tdb->table, snornaName); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { snorna = snoRNAsLoad(row+rowOffset); printf("sRNA name: %s
\n",snorna->name); printf("Snoscan score: %.2f
\n",snorna->snoScore); printf("HMM snoRNA score: %.2f
\n",snorna->hmmScore); printf("Predicted targets: %s
\n",snorna->targetList); printf("Predicted guide interactions:
%s
\n",snorna->guideStr); printf("Possible sRNA homolog(s): %s
\n",snorna->orthologs); printf("
Genomic size: %d nt
\n",snorna->chromEnd-snorna->chromStart); printf("Position: " "", hgTracksPathAndSettings(), database, snorna->chrom, snorna->chromStart+1, snorna->chromEnd); printf("%s:%d-%d
\n", snorna->chrom, snorna->chromStart+1, snorna->chromEnd); printf("Strand: %s

\n", snorna->strand); printf("Snoscan program output:
 %s

\n",snorna->snoscanOutput); if (snorna->next != NULL) printf("
\n"); } sqlFreeResult(&sr); hFreeConn(&conn); printTrackHtml(tdb); snoRNAsFree(&snorna); } void doGbRnaGenes(struct trackDb *tdb, char *gbRnaName) { struct gbRNAs *gbRna; char query[512]; struct sqlConnection *conn = hAllocConn(database); struct sqlResult *sr; char *dupe, *words[16]; char **row; int wordCount; int rowOffset; genericHeader(tdb,gbRnaName); dupe = cloneString(tdb->type); wordCount = chopLine(dupe, words); rowOffset = hOffsetPastBin(database, seqName, tdb->table); sprintf(query, "select * from %s where name = '%s'", tdb->table, gbRnaName); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { gbRna = gbRNAsLoad(row+rowOffset); printf("Genbank ncRNA name: %s
\n",gbRna->name); printf("Product Description/Note: %s
\n",gbRna->product); printf ("Intron(s): %s
\n",gbRna->intron); printf("
Genomic size: %d nt
\n",gbRna->chromEnd-gbRna->chromStart); printf("Position: " "", hgTracksPathAndSettings(), database, gbRna->chrom, gbRna->chromStart+1, gbRna->chromEnd); printf("%s:%d-%d
\n", gbRna->chrom, gbRna->chromStart+1, gbRna->chromEnd); printf("Strand: %s
\n", gbRna->strand); if (gbRna->next != NULL) printf("
\n"); } sqlFreeResult(&sr); hFreeConn(&conn); printTrackHtml(tdb); gbRNAsFree(&gbRna); } void doEasyGenes(struct trackDb *tdb, char *egName) { struct easyGene *egList = NULL, *eg; char query[512]; struct sqlConnection *conn = hAllocConn(database); struct sqlResult *sr; char **row; int rowOffset; genericHeader(tdb,egName); rowOffset = hOffsetPastBin(database, seqName, tdb->table); sprintf(query, "select * from %s where name = '%s'", tdb->table, egName); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) slAddTail(&egList,easyGeneLoad(row+rowOffset)); slReverse(&egList); sqlFreeResult(&sr); hFreeConn(&conn); for (eg = egList; eg != NULL; eg = eg->next) { if (eg->genbank[0] == 'Y') printf("\n"); else printf("\n"); printf("Item: %s
\n",eg->name); printf("Feature identifier: %s
\n",eg->feat); printf("Start codon: %s
\n",eg->startCodon); printf("EasyGene descriptor: %s
\n",eg->descriptor); if (eg->R >= 0.001) printf("R value: %.3f
\n",eg->R); else printf("R value: %.2e
\n",eg->R); printf("Log-odds : %.1f
\n",eg->logOdds); printf("Frame: %d
\n",eg->frame); printf("Swiss-Prot match: %s
\n",eg->swissProt); printf("ORF identifier: %s
\n",eg->orf); printPos(eg->chrom, eg->chromStart, eg->chromEnd, eg->strand, TRUE, eg->name); printf("
\n"); if (eg->next != NULL) printf("
\n"); } printTrackHtml(tdb); easyGeneFreeList(&egList); } void doCodeBlast(struct trackDb *tdb, char *trnaName) { struct pepPred *pp=NULL; struct codeBlast *cb=NULL; struct codeBlastScore *cbs=NULL, *cbs2, *list=NULL; struct sqlConnection *conn = hAllocConn(database); struct sqlResult *sr; char query[512]; char *dupe, *words[16]; char **row; char tempstring[255]=""; int flag, z, dashes, wordCount, rowOffset, currentGI=0; int start = cartInt(cart, "o"), num = 0, flag2=0; float sequenceLength, dashlength=60; genericHeader(tdb,trnaName); dupe = cloneString(tdb->type); wordCount = chopLine(dupe, words); if (wordCount > 1) num = atoi(words[1]); if (num < 3) num = 3; genericBedClick(conn, tdb, trnaName, start, num); rowOffset = hOffsetPastBin(database, seqName, tdb->table); sprintf(query, "select * from %s where name = '%s'", tdb->table, trnaName); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { cb=codeBlastLoad(row); } sequenceLength=(cb->chromEnd - cb->chromStart); if(sequenceLength<0){ sequenceLength=sequenceLength*-1;} sequenceLength=sequenceLength/3; dashlength=sequenceLength/60; conn=hAllocConn(database);/*sqlConnect(dupe);*/ sprintf(query, "select * from gbProtCodePep where name = '%s'", trnaName); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { pp=pepPredLoad(row); } /*Query the database for the extrainfo file for codeBlast*/ conn=hAllocConn(database);/*sqlConnect(dupe);*/ safef(tempstring, sizeof(tempstring), "select * from codeBlastScore where qname = '%s'", trnaName); sr = sqlGetResult(conn, tempstring); /*Load the required data from the database*/ while ((row = sqlNextRow(sr)) != NULL) { cbs=codeBlastScoreLoad(row); slAddHead(&list, cbs); } if (pp!=NULL) printf( "
Query NCBI Blast",pp->seq); /*Print out table with Blast information*/ printf(" \n\n

"); printf(" \n \n"); printf(" \n \n \n \n \n \n \n \n \n \n "); flag=0; for(cbs2=list;cbs2!=NULL;cbs2=cbs2->next) { if(sameString(trnaName, cbs2->qName)) { if(flag==0) { currentGI=cbs2->GI; printf("\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n"); flag=0; } } } /*Print out the table for the alignments*/ printf("
\n
Organism"); printf("
\n
"); printf("Phylogenetic/Functional Category"); printf("
\n
"); printf("Gene Name"); printf("
\n
"); printf("Product"); printf("
\n
NCBI Entry"); printf("
\n
"); printf("Evalue"); printf("
\n
"); printf("Percent Identity"); printf("
\n
"); printf("Alignment Length(AA)"); printf("
\n
"); printf("Gap openings"); printf("
"); printf("",cbs2->GI); printf("%s",cbs2->GI,cbs2->species); printf("
\n
"); flag=1; } if((cbs2->next!=NULL) && (currentGI== cbs2->GI) && (currentGI== cbs2->next->GI) ) { printCode(cbs2->code[0]); printf(", "); } else { printCode(cbs2->code[0]); /*See which database to link to*/ if((sameString(cbs2->species, "Pyrococcus furiosus"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Pyrococcus abyssi"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Pyrococcus horikoshii"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Thermococcus kodakaraensis"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Sulfolobus solfataricus"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Sulfolobus tokodaii"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Sulfolobus acidocaldarius"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Pyrobaculum aerophilum"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Nanoarchaeum equitans"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Methanosarcina acetivorans"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Methanosarcina barkeri"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Methanosarcina mazei"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Methanothermobacter thermautotrophicus"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Methanococcoides burtonii"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Methanopyrus kandleri"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Haloarcula marismortui"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Halobacterium sp."))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Aeropyrum pernix"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Archaeoglobus fulgidus"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Thermoplasma acidophilum"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Thermoplasma volcanium"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Methanocaldococcus jannaschii"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Methanococcus maripaludis"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Methanosphaera stadtmanae"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Methanospirillum hungatei"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Aquifex aeolicus"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Thermotoga maritima"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Escherichia coli K12"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Bacillus subtilis"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else if((sameString(cbs2->species, "Shewanella oneidensis"))){ printf("
\n
"); printf("%s",hgTracksName(),cbs2->name,cbs2->name); } else{ printf("
\n
"); printf("%s",cbs2->name); } printf("
\n
"); printf("%s",cbs2->product); printf("
\n
"); printf("NCBI Link",cbs2->GI); printf("
\n
"); printf("%s",cbs2->evalue); printf("
\n
"); printf("%.2f",cbs2->PI); printf("
\n
"); printf("%i",cbs2->length); printf("
\n
"); printf("%i",cbs2->gap); printf("
"); printf(" \n \n"); printf(" \n \n \n "); printf(" \n \n \n "); flag=0; flag2=0; for(cbs2=list;cbs2!=NULL;cbs2=cbs2->next) { if(sameString(trnaName, cbs2->qName)); { if(flag==0) { currentGI=cbs2->GI; printf("\n \n \n \n \n"); flag=0; } } } printf("

\n
Organism"); printf("
\n
Alignment"); printf("
%s where each plus(+) is approx. %f amino acids", trnaName, dashlength); printf("
\n
"); printf("\n"); for(z=0; z<60; z++) { printf("+"); } printf(""); printf("
"); flag=1; } if((cbs2->next!=NULL) && (currentGI== cbs2->GI) && (currentGI== cbs2->next->GI) ) { } else { dashes=cbs2->seqend-cbs2->seqstart; if(cbs2->length",cbs2->GI); printf("%s, %s",cbs2->GI, cbs2->species, cbs2->name); printf("\n "); printf("\n"); dashes=dashes/dashlength; if(cbs2->seqstart>cbs2->seqend) for(z=0; z<((cbs2->seqend)/dashlength); z++) { printf(" "); } else for(z=0; z<((cbs2->seqstart)/dashlength); z++) { printf(" "); } if(dashes<1) printf("+"); for(z=0; z"); printf("
\n"); /*\printf(" \n \n"); */ /*Free the data*/ hFreeConn(&conn); codeBlastScoreFree(&cbs); codeBlastFree(&cb); printTrackHtml(tdb); } void llDoCodingGenes(struct trackDb *tdb, char *item, char *pepTable, char *extraTable) /* Handle click on gene track. */ { struct minGeneInfo ginfo; char query[256]; char query2[256]; struct sqlResult *sr, *sr2; char **row, **row2; char *words[16], *dupe = cloneString(tdb->type); int wordCount, x, length; int start = cartInt(cart, "o"), num = 0; struct sqlConnection *conn = hAllocConn(database); struct sqlConnection *conn2; struct COG *COG=NULL; struct COGXra *COGXra=NULL; char *temparray[160]; genericHeader(tdb, item); wordCount = chopLine(dupe, words); if (wordCount > 1) num = atoi(words[1]); if (num < 3) num = 3; genericBedClick(conn, tdb, item, start, num); if (pepTable != NULL && hTableExists(database, pepTable)) { char *pepNameCol = sameString(pepTable, "gbSeq") ? "acc" : "name"; conn = hAllocConn(database); /* simple query to see if pepName has a record in pepTable: */ safef(query, sizeof(query), "select 0 from %s where %s = '%s'", pepTable, pepNameCol, item); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) != NULL) { hgcAnchorSomewhere("htcTranslatedProtein", item, pepTable, seqName); printf("Predicted Protein
\n"); } sqlFreeResult(&sr); } if (extraTable != NULL && hTableExists(database, extraTable)) { conn = hAllocConn(database); sprintf(query, "select * from %s where name = '%s'", extraTable, item); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { minGeneInfoStaticLoad(row, &ginfo); printf("Product: %s
\n", ginfo.product); printf("Note: %s
\n", ginfo.note); } sqlFreeResult(&sr); } if (hTableExists(database, "COG")) { conn = hAllocConn(database); sprintf(query, "select * from COG where name = '%s'", item); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { COG = COGLoad(row); if(COG!=NULL) { length=chopString(COG->COG, "," , temparray, 999); for(x=0; xCOG: %s INFO: %s
\n", COGXra->name, COGXra->info); } sqlFreeResult(&sr2); hFreeConn(&conn2); } } } } printTrackHtml(tdb); hFreeConn(&conn); } /*void doTigrOperons(struct trackDb *tdb, char *opName)*/ /* track handler for the TIGR operon predictions */ /*{ struct tigrOperon *op; char query[512]; struct sqlConnection *conn = hAllocConn(database); struct sqlResult *sr; char *dupe, *words[16]; char **row; int wordCount; int start = cartInt(cart, "o"), num = 0; genericHeader(tdb,opName); dupe = cloneString(tdb->type); wordCount = chopLine(dupe, words); if (wordCount > 1) num = atoi(words[1]); if (num < 3) num = 3; genericBedClick(conn, tdb, opName, start, num); sprintf(query, "select * from %sInfo where name = '%s'", tdb->table, opName); sr = sqlGetResult(conn, query);*/ /* Make the operon table like on the TIGR web page. */ /*if ((row = sqlNextRow(sr)) != NULL) { int i,j; char *infos[30]; op = tigrOperonLoad(row); chopCommas(op->info,infos); printf("

\n\n"); for (i = 0; i <= op->size; i++) { printf(" "); for (j = 0; j <= op->size; j++) { printf(""); } printf("\n"); } printf("
"); if ((i == 0 || j == 0) && !(i == 0 && j == 0)) (i > j) ? printf("%s",op->genes[i-1]) : printf("%s",op->genes[j-1]); else if (i + j > 0) { char *data = infos[((i-1)*op->size)+(j-1)]; if (!sameString(data,"---")) { char *n, *conf; n = chopPrefixAt(data,'|'); conf = data; printf("confidence = %.2f, n = %d",atof(conf),atoi(n)); } else printf("%s",data); } printf("
\n

\n"); } printTrackHtml(tdb);*/ /* clean up */ /*sqlFreeResult(&sr); hFreeConn(&conn); tigrOperonFree(&op); } */ void doTigrCmrGene(struct trackDb *tdb, char *tigrName) /* Handle the TIRG CMR gene track. */ { struct tigrCmrGene *tigr; char query[512]; struct sqlConnection *conn = hAllocConn(database); struct sqlResult *sr; char *dupe, *words[16]; char **row; int wordCount; int rowOffset; /* int start = cartInt(cart, "o"), num = 0; */ genericHeader(tdb,tigrName); dupe = cloneString(tdb->type); wordCount = chopLine(dupe, words); rowOffset = hOffsetPastBin(database, seqName, tdb->table); sprintf(query, "select * from %s where name = '%s'", tdb->table, tigrName); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { tigr = tigrCmrGeneLoad(row); if (tigr != NULL) { printf("TIGR locus name: %s
\n",tigrName); printf("TIGR gene description: %s
\n",tigr->tigrCommon); printf("Alternate TIGR gene name: "); if (strlen(tigr->tigrGene) >0) { printf("%s
\n",tigr->tigrGene); } else { printf("None
"); } printf("Genbank locus name: %s
\n",tigr->primLocus); printf("Protein length: %d aa
\n",tigr->tigrPepLength); if (strlen(tigr->tigrECN)>0) { printf("Enzyme comission number: %s
\n",tigr->tigrECN); } printf("Main role: %s
\n",tigr->tigrMainRole); printf("Subrole: %s
\n",tigr->tigrSubRole); if (tigr->tigrMw > 0) { printf("Molecular weight: %.2f Da
\n",tigr->tigrMw); } if (tigr->tigrPi > 0) { printf("Isoelectric point: %.2f
\n",tigr->tigrPi); } printf("GC content: %.2f %%
\n",tigr->tigrGc); printf("
Position: " "", hgTracksPathAndSettings(), database, tigr->chrom, tigr->chromStart, tigr->chromEnd); printf("%s:%d-%d
\n", tigr->chrom, tigr->chromStart, tigr->chromEnd); printf("Strand: %s
\n", tigr->strand); printf("Genomic size: %d nt
\n",tigr->tigrLength); if (tigr->next != NULL) printf("
\n"); } } sqlFreeResult(&sr); hFreeConn(&conn); printTrackHtml(tdb); tigrCmrGeneFree(&tigr); } void doJgiGene(struct trackDb *tdb, char *jgiName) /* Handle the JGI gene track. */ { struct jgiGene *jgi; char query[512]; struct sqlConnection *conn = hAllocConn(database); struct sqlResult *sr; char *dupe, *words[16]; char **row; int wordCount; int rowOffset; genericHeader(tdb,jgiName); dupe = cloneString(tdb->type); wordCount = chopLine(dupe, words); rowOffset = hOffsetPastBin(database, seqName, tdb->table); sprintf(query, "select * from %s where name = '%s'", tdb->table, jgiName); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { jgi = jgiGeneLoad(row+rowOffset); printf("JGI locus name: %s
\n",jgiName); printf("JGI gene symbol: %s
\n",jgi->jgiSymbol); printf("JGI gene description: %s
\n",jgi->jgiDescription); printf("JGI gene id: " "", jgi->jgiGeneId); printf("%s
\n", jgi->jgiGeneId); printf("GC content: %.0f %%
\n",jgi->jgiGc); printf("
Position: " "", hgTracksPathAndSettings(), database, jgi->chrom, jgi->chromStart + 1, jgi->chromEnd); printf("%s:%d-%d
\n", jgi->chrom, jgi->chromStart + 1, jgi->chromEnd); printf("Strand: %s
\n", jgi->strand); printf("Genomic size: %d nt
\n", (jgi->chromEnd - jgi->chromStart)); if (jgi->next != NULL) printf("
\n"); } sqlFreeResult(&sr); hFreeConn(&conn); printTrackHtml(tdb); jgiGeneFree(&jgi); } void doPfamHit(struct trackDb *tdb, char *hitName) /* Handle the Pfam hits track. */ { struct lowelabPfamHits *pfamHit; char query[512]; struct sqlConnection *conn = hAllocConn(database); struct sqlConnection *spConn = NULL; struct sqlResult *sr; char *dupe, *words[16]; char **row; int wordCount; int rowOffset; char *description; int start = cartInt(cart, "o"); char *pdb = hPdbFromGdb(database); spConn = sqlConnect(pdb); genericHeader(tdb,hitName); dupe = cloneString(tdb->type); wordCount = chopLine(dupe, words); rowOffset = hOffsetPastBin(database, seqName, tdb->table); sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d", tdb->table, hitName,seqName,start); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { pfamHit = lowelabPfamHitsLoad(row+rowOffset); safef(query, sizeof(query), "select description from proteome.pfamDesc where pfamAC='%s'", pfamHit->pfamAC); if (!sqlTableExists(spConn,"proteome.pfamDesc")) { safef(query, sizeof(query), "select extDbRef.extAcc1 from extDbRef,extDb " "where extDbRef.acc = '%s' " "and extDbRef.extDb = extDb.id " "and extDb.val = '%s'" , pfamHit->pfamAC,pfamHit->pfamID); } description = sqlQuickString(spConn, query); if (description == NULL) description = cloneString("n/a"); printf("", pfamHit->pfamAC ); printf("%s - %s

\n", pfamHit->pfamAC, description); freez(&description); printf("Domain assignment based on %d%% identity BlastP hit to Pfam-A SwissProt Sequence:
\n" "%s (%s, %d%% full-length alignment) " "
[Pfam Domain Structure]
\n", pfamHit->ident,pfamHit->swissAC,pfamHit->swissAC,pfamHit->protCoord,pfamHit->percLen,pfamHit->swissAC); printf("
Position: " "", hgTracksPathAndSettings(), database, pfamHit->chrom, pfamHit->chromStart + 1, pfamHit->chromEnd); printf("%s:%d-%d
\n", pfamHit->chrom, pfamHit->chromStart + 1, pfamHit->chromEnd); printf("Strand: %s
\n", pfamHit->strand); printf("Genomic size: %d nt
\n", (pfamHit->chromEnd - pfamHit->chromStart)); if (pfamHit->next != NULL) printf("
\n"); } sqlFreeResult(&sr); hFreeConn(&conn); printTrackHtml(tdb); lowelabPfamHitsFree(&pfamHit); } void doTigrOperons(struct trackDb *tdb, char *tigrOperonName) /* Handle the TIGR operons track. */ { struct bed *tigrOperon; struct lowelabTIGROperonScore *tigrOperonScore; char query[512]; struct sqlConnection *conn = hAllocConn(database); struct sqlResult *sr; char *dupe, *words[16]; char **row; int wordCount; int rowOffset; int bedSize = 0; genericHeader(tdb, tigrOperonName); dupe = cloneString(tdb->type); wordCount = chopLine(dupe, words); if (wordCount > 1) bedSize = atoi(words[1]); if (bedSize < 3) bedSize = 3; rowOffset = hOffsetPastBin(database, seqName, tdb->table); sprintf(query, "select * from %s where name = '%s'", tdb->table, tigrOperonName); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { tigrOperon = bedLoadN(row+rowOffset, bedSize); printf("Operon name: %s
\n",tigrOperonName); printf("
Position: " "", hgTracksPathAndSettings(), database, tigrOperon->chrom, tigrOperon->chromStart + 1, tigrOperon->chromEnd); printf("%s:%d-%d
\n", tigrOperon->chrom, tigrOperon->chromStart + 1, tigrOperon->chromEnd); printf("Strand: %s
\n", tigrOperon->strand); printf("Genomic size: %d nt
\n", (tigrOperon->chromEnd - tigrOperon->chromStart)); if (tigrOperon->next != NULL) printf("
\n"); } sqlFreeResult(&sr); printf("
OperonDB predicted gene pairs
\n"); /* Print table */ printf("", HG_COL_BORDER); printf("\n"); printf("
\n"); printf("\n", HG_COL_INSIDE); printf("\n"); /* Print table column heading */ printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); sprintf(query, "select * from lowelabTIGROperonScore where name = '%s'", tigrOperonName); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { tigrOperonScore = lowelabTIGROperonScoreLoad(row); printf("\n"); printf("\n", tigrOperonScore->gene1); printf("\n", tigrOperonScore->gene2); printf("\n", tigrOperonScore->confidence); printf("\n", tigrOperonScore->ortholog_link, tigrOperonScore->ortholog); printf("\n"); tigrOperonScore = tigrOperonScore->next; } sqlFreeResult(&sr); /* Close table */ printf("\n"); printf("
Gene 1Gene 2ConfidenceNumber of Conserved Genomes
%s%s%d%d
\n"); printf("
\n"); printf("
Note:\n"); printf("
Confidence - an estimation of the lower boundary of the probability that the two corresponding genes are located in the same operon\n"); printf("
Number of Conserved Genomes - number of other genomes that have the same pair of genes located in the same directon (a set of consecutive genes on the same DNA strand)\n"); bedFree(&tigrOperon); lowelabTIGROperonScoreFree(&tigrOperonScore); hFreeConn(&conn); printTrackHtml(tdb); } void doArkinOperons(struct trackDb *tdb, char *arkinOperonName) /* Handle the Arkin operons track. */ { struct bed *arkinOperon; struct lowelabArkinOperonScore *arkinOperonScore; char query[512]; struct sqlConnection *conn = hAllocConn(database); struct sqlResult *sr; char *dupe, *words[16]; char **row; int wordCount; int rowOffset; int bedSize = 0; genericHeader(tdb, arkinOperonName); dupe = cloneString(tdb->type); wordCount = chopLine(dupe, words); if (wordCount > 1) bedSize = atoi(words[1]); if (bedSize < 3) bedSize = 3; rowOffset = hOffsetPastBin(database, seqName, tdb->table); sprintf(query, "select * from %s where name = '%s'", tdb->table, arkinOperonName); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { arkinOperon = bedLoadN(row+rowOffset, bedSize); printf("Arkin operon name: %s
\n",arkinOperonName); printf("
Position: " "", hgTracksPathAndSettings(), database, arkinOperon->chrom, arkinOperon->chromStart + 1, arkinOperon->chromEnd); printf("%s:%d-%d
\n", arkinOperon->chrom, arkinOperon->chromStart + 1, arkinOperon->chromEnd); printf("Strand: %s
\n", arkinOperon->strand); printf("Genomic size: %d nt
\n", (arkinOperon->chromEnd - arkinOperon->chromStart)); if (arkinOperon->next != NULL) printf("
\n"); } sqlFreeResult(&sr); printf("
Arkin operon predicted gene pairs
\n"); /* Print table */ printf("", HG_COL_BORDER); printf("\n"); printf("
\n"); printf("\n", HG_COL_INSIDE); printf("\n"); /* Print table column heading */ printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); sprintf(query, "select * from lowelabArkinOperonScore where name = '%s'", arkinOperonName); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { arkinOperonScore = lowelabArkinOperonScoreLoad(row); printf("\n"); printf("\n", arkinOperonScore->gene1); printf("\n", arkinOperonScore->gene2); printf("\n", arkinOperonScore->prob); printf("\n", arkinOperonScore->gnMinus); printf("\n"); arkinOperonScore = arkinOperonScore->next; } sqlFreeResult(&sr); /* Close table */ printf("\n"); printf("
Gene 1Gene 2Probability of the Same OperonGene neighbor score
%s%s%0.3f%0.3f
\n"); printf("
\n"); printf("
Note:\n"); printf("
Probability of the Same Operon - Estimated probability that the pair is in the same operon. Values near 1 or 0 are confident predictions of being in the same operon or not, while values near 0.5 are low-confidence predictions.\n"); printf("
Gene neighbor score - An indicator of conservation (gene neighbor score, surprisal subtracted). Positive scores indicate conservation, and scores above 5 are generally strongly indicative of operons\n"); bedFree(&arkinOperon); lowelabArkinOperonScoreFree(&arkinOperonScore); hFreeConn(&conn); printTrackHtml(tdb); } struct bed * getBlastpTrackRecord(struct sqlConnection *conn, struct trackDb *tdb, char *targetName) /* Get blastp track record clicked by user*/ { struct bed *blastpTrack = NULL; char *dupe, *words[16]; int wordCount; int bedSize = 0; char query[512]; struct sqlResult *sr; char **row; int rowOffset; int start = cartInt(cart, "o"); int end = cartInt(cart, "t"); char *chrom = cartString(cart, "c"); dupe = cloneString(tdb->type); wordCount = chopLine(dupe, words); if (wordCount > 1) bedSize = atoi(words[1]); if (bedSize < 3) bedSize = 3; rowOffset = hOffsetPastBin(database, seqName, tdb->table); sprintf(query, "select distinct * from %s where name = '%s' and chrom = '%s' and chromStart = %d and chromEnd = %d", tdb->table, targetName, chrom, start, end); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) != NULL) blastpTrack = bedLoadN(row+rowOffset, bedSize); freez(&dupe); sqlFreeResult(&sr); return blastpTrack; } void printQueryGeneInfo(struct sqlConnection *conn, struct bed *blastpTrack, char *queryName, unsigned int *querySeqLength, char *queryTable) /* Get and print blastp query gene info */ { char query[512]; struct sqlResult *srRefSeq; char **row; int geneCount; char **buffer = NULL; char *targetGeneName[2]; struct minGeneInfo* ginfo; char blastpHits[] = "blastpHits"; unsigned int queryStart = 0; unsigned int queryEnd = 0; parseDelimitedString(blastpTrack->name, ':', targetGeneName, 2); if (hTableExists(database, queryTable) && hTableExists(database, blastpHits)) { /* Get query gene from refSeq */ sprintf(query, "select count(*) from %s where chrom = '%s' and strand = '%s' and cdsStart <= %u and cdsEnd >= %u", queryTable, blastpTrack->chrom, blastpTrack->strand, blastpTrack->chromStart, blastpTrack->chromEnd); srRefSeq = sqlGetResult(conn, query); if ((row = sqlNextRow(srRefSeq)) != NULL) { geneCount = atoi(row[0]); sqlFreeResult(&srRefSeq); if (geneCount == 1) { sprintf(query, "select name, cdsStart, cdsEnd from %s where chrom = '%s' and strand = '%s' and cdsStart <= %u and cdsEnd >= %u", queryTable, blastpTrack->chrom, blastpTrack->strand, blastpTrack->chromStart, blastpTrack->chromEnd); srRefSeq = sqlGetResult(conn, query); if ((row = sqlNextRow(srRefSeq)) != NULL) { strcpy(queryName, row[0]); queryStart = strtoul(row[1], buffer, 10); queryEnd = strtoul(row[2], buffer, 10); } sqlFreeResult(&srRefSeq); } else { /* Check blastpHits if more than 1 query gene is found within the region */ sprintf(query, "select a.name, a.cdsStart, a.cdsEnd from %s a, %s b where a.chrom = '%s' and a.strand = '%s' and a.cdsStart <= %u and a.cdsEnd >= %u and a.name = b.query and b.target like '%%%s'", queryTable, blastpHits, blastpTrack->chrom, blastpTrack->strand, blastpTrack->chromStart, blastpTrack->chromEnd, targetGeneName[0]); srRefSeq = sqlGetResult(conn, query); if ((row = sqlNextRow(srRefSeq)) != NULL) { strcpy(queryName, row[0]); queryStart = strtoul(row[1], buffer, 10); queryEnd = strtoul(row[2], buffer, 10); } sqlFreeResult(&srRefSeq); } if ((queryStart == 0) && (queryEnd == 0)) printf("Query gene not found for %s at %s:%u-%u\n", blastpTrack->name, blastpTrack->chrom, blastpTrack->chromStart, blastpTrack->chromEnd); else { *querySeqLength = queryEnd - queryStart; /* Print query gene info */ printf("Gene: %s
\n", queryName); ginfo = getGbProtCodeInfo(conn, database, queryName); if (ginfo != NULL) { if (ginfo->product != NULL && differentString(ginfo->product,"none")) medlineLinkedLine("Product", ginfo->product, ginfo->product); } printf("Position: " "", hgTracksPathAndSettings(), database, blastpTrack->chrom, queryStart + 1, queryEnd); printf("%s:%d-%d
\n", blastpTrack->chrom, queryStart + 1, queryEnd); printf("Strand: %s
\n", blastpTrack->strand); printf("Genomic size: %d nt
\n", (queryEnd - queryStart)); } } else printf("
Query gene not found for %s at %s:%u-%u
\n", blastpTrack->name, blastpTrack->chrom, blastpTrack->chromStart, blastpTrack->chromEnd); } sqlFreeResult(&srRefSeq); free(targetGeneName[0]); free(targetGeneName[1]); } struct slName* getAllClades(struct sqlConnection *conn) /* Get all available clades in database */ { char query[512]; struct sqlResult *srDb; char **rowDb; struct slName *list = NULL; char clade[50]; sprintf(query, "select label from %s.clade", cfgOption("central.db")); srDb = sqlGetResult(conn, query); while ((rowDb = sqlNextRow(srDb)) != NULL) { strcpy(clade, rowDb[0]); slNameAddTail(&list, clade); } sqlFreeResult(&srDb); return list; } struct blastTab* loadBlastpHits(struct sqlConnection *conn, char* queryName) /* Load all blastp hits of the given query gene into a list */ { char query[512]; struct sqlResult *srBlastpHits = NULL; struct blastTab *list = NULL; struct blastTab *blastpHits; char **row; char blastpHitsTable[] = "blastpHits"; if (hTableExists(database, blastpHitsTable)) { sprintf(query, "select * from %s where query = '%s'", blastpHitsTable, queryName); srBlastpHits = sqlGetResult(conn, query); while ((row = sqlNextRow(srBlastpHits)) != NULL) { blastpHits = blastTabLoad(row); slAddTail(&list, blastpHits); } } if (srBlastpHits != NULL) sqlFreeResult(&srBlastpHits); return list; } void printBlastpResult(struct sqlConnection *conn, struct blastTab *blastpHitsList, unsigned int querySeqLength) /* Print Blastp result of given clade */ { char query[512]; struct sqlResult *sr; char **row; char refSeq[50]; char xraTable[50]; char product[255]; struct blastTab *blastpHits; struct minGeneInfo *ginfo; char *blastpTarget[2]; char *clades[2]; int cladePortionCount = 0; char genome[50] = ""; char clade[50] = ""; unsigned int hitStart = 0; unsigned int hitEnd = 0; char **buffer = NULL; boolean findTable = FALSE; int tStart = cartInt(cart, "o"); int tEnd = cartInt(cart, "t"); char *tChrom = cartString(cart, "c"); printf("
\n"); /* Print table */ printf("", HG_COL_BORDER); printf("\n"); printf("
\n"); printf("\n", HG_COL_INSIDE); printf("\n"); /* Print table column heading */ printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); blastpHits = blastpHitsList; while (blastpHits != NULL) { parseDelimitedString(blastpHits->target, ':', blastpTarget, 2); /* Get species info */ memset(genome, 0, 50); memset(clade, 0, 50); getGenomeClade(conn, blastpTarget[0], genome, clade); if ((strcmp(genome , "") != 0) && (strcmp(clade, "") != 0)) { cladePortionCount = parseDelimitedString(clade, '-', clades, 2); printf("\n"); printf("\n", blastpTarget[1], tChrom, tStart, tEnd, genome); if (cladePortionCount == 1) printf("\n", clades[0]); else if (cladePortionCount == 2) printf("\n", clades[0], clades[1]); /* Get target gene position from refSeq */ strcpy(refSeq, blastpTarget[0]); strcat(refSeq, "."); if (hDbExists(blastpTarget[0])) { if (hTableExists(blastpTarget[0], "lookup")) { sprintf(query, "select lookupValue from %s.lookup where lookupCode = 'annotRev'", blastpTarget[0]); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) != NULL) { strcat(refSeq, row[0]); findTable = TRUE; sqlFreeResult(&sr); } } else if (hTableExists(blastpTarget[0], "refSeq")) { strcat(refSeq, "refSeq"); findTable = TRUE; } if (findTable) { sprintf(query, "select chrom, cdsStart, cdsEnd from %s where name = '%s'", refSeq, blastpTarget[1]); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) != NULL) { hitStart = strtoul(row[1], buffer, 10) + blastpHits->tStart * 3 + 1; hitEnd = strtoul(row[1], buffer, 10) + blastpHits->tEnd * 3; printf("\n", row[0], hitStart, hitEnd, blastpTarget[0], blastpTarget[1]); } else printf("\n", blastpTarget[1]); sqlFreeResult(&sr); } else printf("\n", blastpTarget[1]); } else printf("\n", blastpTarget[1]); /* Get target gene product annotation */ if (hDbExists(blastpTarget[0])) { if (hTableExists(blastpTarget[0], "lookup")) { sprintf(query, "select lookupValue from %s.lookup where lookupCode = 'annotRevXra'", blastpTarget[0]); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) != NULL) { strcpy(xraTable, row[0]); sqlFreeResult(&sr); } else strcpy(product, "N/A"); sprintf(query, "select product from %s.%s where name = '%s'", blastpTarget[0], xraTable, blastpTarget[1]); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) != NULL) { strcpy(product, row[0]); sqlFreeResult(&sr); } else strcpy(product, "N/A"); } else { ginfo = getGbProtCodeInfo(conn, blastpTarget[0], blastpTarget[1]); if (ginfo != NULL && ginfo->product != NULL && differentString(ginfo->product,"none")) strcpy(product, ginfo->product); else strcpy(product, "N/A"); } printf("\n", product); } else printf("\n", "N/A"); printf("\n", ((double) (blastpHits->qEnd - blastpHits->qStart) / ((double) (querySeqLength-3) / 3.0f)) * 100.0f); printf("\n", blastpHits->qStart + 1, blastpHits->qEnd); printf("\n", blastpHits->identity); printf("\n", blastpHits->eValue); printf("\n", (blastpHits->eValue == 0)? 0 : log(blastpHits->eValue) / log(10)); printf("\n", blastpHits->bitScore); printf("\n", blastpHits->aliLength); printf("\n", blastpHits->mismatch); printf("\n", blastpHits->gapOpen); printf("\n"); } free(blastpTarget[0]); free(blastpTarget[1]); blastpHits = blastpHits->next; } /* Close table */ printf("\n"); printf("
OrganismCladeGeneProductPercent Length of Full ProteinPosition in Source ProteinProtein Identity (%%)E-valueLog of E-valueBit ScoreProtein Alignment LengthProtein MismatchesAlignment Gaps
%s%s%s
%s
%s%s%s%s%s%s%0.f%u - %u%0.1f%0.0ee%0.0f%0.1f%u%u%u
\n"); printf("
\n"); } void doBlastP(struct trackDb *tdb, char *targetName) /* Handle the BlastP Archaea and BlastP Bacteria tracks. */ { char queryName[50]; char queryTable[50]; unsigned int querySeqLength = 0; struct sqlConnection *conn = hAllocConn(database); struct bed *blastpTrack; struct blastTab *blastpHitsList; char query[512]; struct sqlResult *sr; char **row; cartWebStart(cart, database, "%s", "BlastP Alignment Hits"); blastpTrack = getBlastpTrackRecord(conn, tdb, targetName); if (hTableExists(database, "lookup")) { sprintf(query, "select lookupValue from lookup where lookupCode = 'annotRev'"); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) != NULL) { strcpy(queryTable, row[0]); sqlFreeResult(&sr); } } else strcpy(queryTable, "refSeq"); printQueryGeneInfo(conn, blastpTrack, queryName, &querySeqLength, queryTable); blastpHitsList = loadBlastpHits(conn, queryName); printBlastpResult(conn, blastpHitsList, querySeqLength); printf("
Note: All measurements are counted by the number of amino acids.
\n"); printf("
\n"); hFreeConn(&conn); printTrackHtml(tdb); } void doSelfHomologs(struct trackDb *tdb, char *targetName) /* Handle the Self Homologs tracks. */ { char queryName[50]; char queryTable[50]; unsigned int querySeqLength = 0; struct sqlConnection *conn = hAllocConn(database); struct bed *blastpTrack; struct blastTab *blastpHitsList; char query[512]; struct sqlResult *sr; char **row; cartWebStart(cart, database, "%s", "Homologs Within Genome by BlastP Search"); blastpTrack = getBlastpTrackRecord(conn, tdb, targetName); if (hTableExists(database, "lookup")) { sprintf(query, "select lookupValue from lookup where lookupCode = 'annotRev'"); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) != NULL) { strcpy(queryTable, row[0]); sqlFreeResult(&sr); } } else strcpy(queryTable, "refSeq"); printQueryGeneInfo(conn, blastpTrack, queryName, &querySeqLength, queryTable); blastpHitsList = loadSelfBlastpHits(conn, queryName, 1); printBlastpResult(conn, blastpHitsList, querySeqLength); printf("
Note: All measurements are counted by the number of amino acids.
\n"); printf("
\n"); hFreeConn(&conn); printTrackHtml(tdb); } void printQuerySequenceInfo(struct sqlConnection *conn, struct bed *blastxTrack, char *queryName, unsigned int *querySeqLength, char *queryTable) /* Get and print blastx query sequence info */ { char query[512]; struct sqlResult *srQuerySeq; char **row; int seqCount; char **buffer = NULL; char *targetGeneName[2]; char blastxHits[] = "blastxHits"; unsigned int queryStart = 0; unsigned int queryEnd = 0; parseDelimitedString(blastxTrack->name, ':', targetGeneName, 2); if (hTableExists(database, queryTable) && hTableExists(database, blastxHits)) { /* Get query sequence from query table */ sprintf(query, "select count(*) from %s where chrom = '%s' and chromStart <= %u and chromEnd >= %u", queryTable, blastxTrack->chrom, blastxTrack->chromStart, blastxTrack->chromEnd); srQuerySeq = sqlGetResult(conn, query); if ((row = sqlNextRow(srQuerySeq)) != NULL) { seqCount = atoi(row[0]); sqlFreeResult(&srQuerySeq); if (seqCount == 1) { sprintf(query, "select name, chromStart, chromEnd from %s where chrom = '%s' and chromStart <= %u and chromEnd >= %u", queryTable, blastxTrack->chrom, blastxTrack->chromStart, blastxTrack->chromEnd); srQuerySeq = sqlGetResult(conn, query); if ((row = sqlNextRow(srQuerySeq)) != NULL) { strcpy(queryName, row[0]); queryStart = strtoul(row[1], buffer, 10); queryEnd = strtoul(row[2], buffer, 10); } sqlFreeResult(&srQuerySeq); } else { /* Check blastxHits if more than 1 query sequence is found within the region */ sprintf(query, "select a.name, a.chromStart, a.chromEnd from %s a, %s b where a.chrom = '%s' and a.chromStart <= %u and a.chromEnd >= %u and a.name = b.query and b.target like '%%%s'", queryTable, blastxHits, blastxTrack->chrom, blastxTrack->chromStart, blastxTrack->chromEnd, targetGeneName[0]); srQuerySeq = sqlGetResult(conn, query); if ((row = sqlNextRow(srQuerySeq)) != NULL) { strcpy(queryName, row[0]); queryStart = strtoul(row[1], buffer, 10); queryEnd = strtoul(row[2], buffer, 10); } sqlFreeResult(&srQuerySeq); } if ((queryStart == 0) && (queryEnd == 0)) printf("Query sequence not found for %s at %s:%u-%u\n", blastxTrack->name, blastxTrack->chrom, blastxTrack->chromStart, blastxTrack->chromEnd); else { *querySeqLength = (blastxTrack->chromEnd - blastxTrack->chromStart); /* Print query sequence info */ printf("Query sequence: %s
\n", queryName); printf("Position: " "", hgTracksPathAndSettings(), database, blastxTrack->chrom, queryStart + 1, queryEnd); printf("%s:%d-%d
\n", blastxTrack->chrom, queryStart + 1, queryEnd); printf("Genomic size: %d nt

\n", (queryEnd - queryStart)); printf("BlastX hit position: " "", hgTracksPathAndSettings(), database, blastxTrack->chrom, blastxTrack->chromStart + 1, blastxTrack->chromEnd); printf("%s:%d-%d
\n", blastxTrack->chrom, blastxTrack->chromStart + 1, blastxTrack->chromEnd); printf("BlastX hit position relative to query sequence: %d-%d
\n", blastxTrack->chromStart - queryStart + 1, blastxTrack->chromEnd - queryStart); printf("BlastX hit genomic size: %d nt
\n", (blastxTrack->chromEnd - blastxTrack->chromStart)); } } else printf("
Query sequence not found for %s at %s:%u-%u
\n", blastxTrack->name, blastxTrack->chrom, blastxTrack->chromStart, blastxTrack->chromEnd); } sqlFreeResult(&srQuerySeq); free(targetGeneName[0]); free(targetGeneName[1]); } struct blastTab* loadBlastxHits(struct sqlConnection *conn, char* queryName, char* queryTable, struct bed *blastxTrack) /* Load all blastx hits of the given query region into a list */ { char query[512]; struct sqlResult *srBlastxHits = NULL; struct blastTab *list = NULL; struct blastTab *blastxHits; struct sqlResult *srQuery = NULL; struct bed *queryTrack = NULL; char **rowQuery; int rowOffset; char **row; char blastxHitsTable[] = "blastxHits"; unsigned int queryStart = 0; unsigned int queryEnd = 0; unsigned int qStart = 0; unsigned int qEnd = 0; if (hTableExists(database, queryTable) && hTableExists(database, blastxHitsTable)) { rowOffset = hOffsetPastBin(database, seqName, queryTable); sprintf(query, "select * from %s where name = '%s'", queryTable, queryName); srQuery = sqlGetResult(conn, query); if ((rowQuery = sqlNextRow(srQuery)) != NULL) { queryTrack = bedLoadN(rowQuery+rowOffset, 6); queryStart = blastxTrack->chromStart - queryTrack->chromStart + 1; queryEnd = blastxTrack->chromEnd - queryTrack->chromStart; } sqlFreeResult(&srQuery); srQuery = NULL; sprintf(query, "select * from %s where query = '%s'", blastxHitsTable, queryName); srBlastxHits = sqlGetResult(conn, query); while ((row = sqlNextRow(srBlastxHits)) != NULL) { blastxHits = blastTabLoad(row); if (blastxHits->qStart < blastxHits->qEnd) { qStart = blastxHits->qStart; qEnd = blastxHits->qEnd; } else { qStart = blastxHits->qEnd; qEnd = blastxHits->qStart; } if (((qStart <= queryStart) && (qEnd >= queryEnd)) || ((qStart >= queryStart) && (qStart <= queryEnd)) || ((qEnd >= queryStart) && (qEnd <= queryEnd))) slAddTail(&list, blastxHits); } } if (srQuery != NULL) sqlFreeResult(&srQuery); if (srBlastxHits != NULL) sqlFreeResult(&srBlastxHits); return list; } void printBlastxResult(struct sqlConnection *conn, struct blastTab *blastxHitsList, unsigned int querySeqLength) /* Print Blastx result of given clade */ { char query[512]; struct sqlResult *sr; char **row; char refSeq[50]; struct blastTab *blastxHits; struct minGeneInfo *ginfo; char *blastxTarget[2]; char *clades[2]; int cladePortionCount = 0; char genome[50] = ""; char clade[50] = ""; unsigned int targetProteinStart = 0; unsigned int targetProteinEnd = 0; unsigned int hitStart = 0; unsigned int hitEnd = 0; char **buffer = NULL; int tStart = cartInt(cart, "o"); int tEnd = cartInt(cart, "t"); char *tChrom = cartString(cart, "c"); printf("
\n"); /* Print table */ printf("", HG_COL_BORDER); printf("\n"); printf("
\n"); printf("\n", HG_COL_INSIDE); printf("\n"); /* Print table column heading */ printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); blastxHits = blastxHitsList; while (blastxHits != NULL) { parseDelimitedString(blastxHits->target, ':', blastxTarget, 2); /* Get species info */ memset(genome, 0, 50); memset(clade, 0, 50); getGenomeClade(conn, blastxTarget[0], genome, clade); if ((strcmp(genome , "") != 0) && (strcmp(clade, "") != 0)) { cladePortionCount = parseDelimitedString(clade, '-', clades, 2); printf("\n"); printf("\n", blastxTarget[1], tChrom, tStart, tEnd, genome); if (cladePortionCount == 1) printf("\n", clades[0]); else if (cladePortionCount == 2) printf("\n", clades[0], clades[1]); /* Get target gene position from refSeq */ strcpy(refSeq, blastxTarget[0]); strcat(refSeq, ".refSeq"); if (hDbExists(blastxTarget[0]) && hTableExists(blastxTarget[0], "refSeq")) { sprintf(query, "select chrom, cdsStart, cdsEnd from %s where name = '%s'", refSeq, blastxTarget[1]); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) != NULL) { targetProteinStart = strtoul(row[1], buffer, 10); targetProteinEnd = strtoul(row[2], buffer, 10); hitStart = targetProteinStart + blastxHits->tStart * 3 + 1; hitEnd = targetProteinStart + blastxHits->tEnd * 3; printf("\n", row[0], hitStart, hitEnd, blastxTarget[0], blastxTarget[1]); } else printf("\n", blastxTarget[1]); sqlFreeResult(&sr); } else printf("\n", blastxTarget[1]); /* Get target gene product annotation */ if (hDbExists(blastxTarget[0])) { ginfo = getGbProtCodeInfo(conn, blastxTarget[0], blastxTarget[1]); if (ginfo != NULL && ginfo->product != NULL && differentString(ginfo->product,"none")) printf("\n", ginfo->product); else printf("\n", "N/A"); } else printf("\n", "N/A"); printf("\n", blastxHits->qStart + 1, blastxHits->qEnd); printf("\n", blastxHits->tStart + 1, blastxHits->tEnd); if ((targetProteinStart == 0) || (targetProteinEnd == 0)) printf("\n"); else printf("\n", ((double) (blastxHits->tEnd - blastxHits->tStart) / ((double) (targetProteinEnd-targetProteinStart-3) / 3.0f)) * 100.0f); printf("\n", blastxHits->identity); printf("\n", blastxHits->eValue); printf("\n", (blastxHits->eValue == 0)? 0 : log(blastxHits->eValue) / log(10)); printf("\n", blastxHits->bitScore); printf("\n", blastxHits->aliLength); printf("\n", blastxHits->mismatch); printf("\n", blastxHits->gapOpen); printf("\n"); } free(blastxTarget[0]); free(blastxTarget[1]); blastxHits = blastxHits->next; } /* Close table */ printf("\n"); printf("
OrganismCladeGeneProductPosition in Query Genomic SequencePosition in Target ProteinPercent Length of Target ProteinProtein Identity (%%)E-valueLog of E-valueBit ScoreProtein Alignment LengthProtein MismatchesAlignment Gaps
%s%s%s
%s
%s%s%s%s%s%s%u - %u%u - %uN/A%0.f%0.1f%0.0ee%0.0f%0.1f%u%u%u
\n"); printf("
\n"); } void doBlastX(struct trackDb *tdb, char *targetName) /* Handle the BlastX Archaea and BlastX Bacteria tracks. */ { char queryName[50]; char queryTable[50]; unsigned int querySeqLength = 0; struct sqlConnection *conn = hAllocConn(database); struct bed *blastxTrack; struct blastTab *blastxHitsList; cartWebStart(cart, database, "%s", "BlastX Alignment Hits"); blastxTrack = getBlastpTrackRecord(conn, tdb, targetName); /* if (!differentWord(blastxTrack->chrom, "assembly"))*/ if (hTableExists(database, "scaffolds")) strcpy(queryTable, "scaffolds"); else strcpy(queryTable, "igenics"); printQuerySequenceInfo(conn, blastxTrack, queryName, &querySeqLength, queryTable); blastxHitsList = loadBlastxHits(conn, queryName, queryTable, blastxTrack); printBlastxResult(conn, blastxHitsList, querySeqLength); printf("
\n"); printf("
\n"); hFreeConn(&conn); printTrackHtml(tdb); } void doUltraConserved(struct trackDb *tdb, char *item) /* Handle the ultraConserved track. */ { char tableName[65]; int start = cartInt(cart, "o"); int end = cartInt(cart, "t"); struct hashEl* hashItem; struct hashCookie cookie; struct trackDb *multizTrack; struct sqlConnection *conn = hAllocConn(database); cookie = hashFirst(trackHash); hashItem = hashNext(&cookie); while (hashItem != NULL) { memset(tableName, 0, 65); strcpy(tableName, hashItem->name); if (strstr(tableName, "multiz") != NULL) break; hashItem = hashNext(&cookie); } multizTrack = hashFindVal(trackHash, tableName); winStart = start; winEnd = end; genericHeader(tdb, NULL); if (tdb->html != NULL && tdb->html[0] != 0) { puts(tdb->html); htmlHorizontalLine(); } genericMafClick(conn, multizTrack, item, start); printTrackHtml(multizTrack); hFreeConn(&conn); } float computeMolecularWeight(char* dna, int length) { float weight = 0.0f; int count[4] = {0,0,0,0}; int i = 0; for (i = 0; i < length; i++) { if ((dna[i] == 'A') || (dna[i] == 'a')) count[0]++; else if ((dna[i] == 'C') || (dna[i] == 'c')) count[1]++; else if ((dna[i] == 'G') || (dna[i] == 'g')) count[2]++; else if ((dna[i] == 'T') || (dna[i] == 't')) count[3]++; } weight = count[0] * 313.209 + count[1] * 289.184 + count[2] * 329.208 + count[3] * 304.196 - 63.980 + 2.016; return weight; } float computeNMolePerOD(char* dna, int length) { int extCoeff = 0; float nmolePerOD = 0.0f; enum { baseA = 0, baseC, baseG, baseT }; int indExtCoeff[4] = {15400, 7400, 11500, 8700}; int neighborExtCoeff[4][4] = { {27400, 21200, 25000, 22800}, {21200, 14600, 18000, 15200}, {25200, 17600, 21600, 20000}, {23400, 16200, 19000, 16800}}; int i = 0; int *bases = malloc(sizeof(int) * length); for (i = 0; i < length; i++) { if ((dna[i] == 'A') || (dna[i] == 'a')) bases[i] = baseA; else if ((dna[i] == 'C') || (dna[i] == 'c')) bases[i] = baseC; else if ((dna[i] == 'G') || (dna[i] == 'g')) bases[i] = baseG; else if ((dna[i] == 'T') || (dna[i] == 't')) bases[i] = baseT; } for (i = 0; i < (length - 1); i++) extCoeff += neighborExtCoeff[bases[i]][bases[i + 1]]; for (i = 1; i < (length - 1); i++) extCoeff -= indExtCoeff[bases[i]]; nmolePerOD = pow(10, 6) / (float) extCoeff; free(bases); return nmolePerOD; } void doPrimers(struct trackDb *tdb, char *primerName) /* Handle the array primer and GOLD primer tracks. */ { struct bed *primer; struct dnaSeq *sequence; char query[512]; struct sqlConnection *conn = hAllocConn(database); struct sqlResult *sr; char *dupe, *words[16]; char **row; int wordCount; int rowOffset; int bedSize = 0; int pairCount = 0; boolean forwardPrimer = TRUE; genericHeader(tdb, primerName); if (startsWith("Asn", primerName)) forwardPrimer = FALSE; dupe = cloneString(tdb->type); wordCount = chopLine(dupe, words); if (wordCount > 1) bedSize = atoi(words[1]); if (bedSize < 3) bedSize = 3; rowOffset = hOffsetPastBin(database, seqName, tdb->table); sprintf(query, "select * from %s where name = '%s'", tdb->table, primerName); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { primer = bedLoadN(row+rowOffset, bedSize); printf("Primer name: %s
\n",primerName); printf("
Position: " "", hgTracksPathAndSettings(), database, primer->chrom, primer->chromStart + 1, primer->chromEnd); printf("%s:%d-%d
\n", primer->chrom, primer->chromStart + 1, primer->chromEnd); printf("Strand: %s
\n", primer->strand); printf("Genomic size: %d nt

\n", (primer->chromEnd - primer->chromStart)); sequence = hDnaFromSeq(database, primer->chrom, primer->chromStart, primer->chromEnd, dnaUpper); if (sequence != NULL) { if (strcmp(primer->strand, "-") == 0) reverseComplement(sequence->dna, sequence->size); printf("Sequence: 5' %s 3'
\n", sequence->dna); printf("GC content: %0.2f%%
\n", computeGCContent(sequence->dna, sequence->size)); printf("Molecular weight: %0.1f g/mol
\n", computeMolecularWeight(sequence->dna, sequence->size)); printf("nmole/OD260: %0.3f
\n", computeNMolePerOD(sequence->dna, sequence->size)); printf("ug/OD260: %0.3f
\n", computeNMolePerOD(sequence->dna, sequence->size) * computeMolecularWeight(sequence->dna, sequence->size) * pow(10,-3)); } if (primer->next != NULL) printf("
\n"); } sqlFreeResult(&sr); printf("
Primer pairing
\n"); /* Print table */ printf("", HG_COL_BORDER); printf("\n"); printf("
\n"); printf("\n", HG_COL_INSIDE); printf("\n"); /* Print table column heading */ printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); memset(query, 0, 512); if (strcmp(primer->strand, "+") == 0) { if (hTableExists(database, "genomePcrPrimers")) sprintf(query, "select *, 'Array PCR' primerType from genomePcrPrimers where chrom = '%s' and chromStart > %d and strand = '-'", primer->chrom, primer->chromEnd); if (hTableExists(database, "goldRTprimers")) { if (strcmp(query, "") != 0) sprintf(query, "%s union ", query); sprintf(query, "%sselect *, 'GOLD RT' primerType from goldRTprimers where chrom = '%s' and chromStart > %d and strand = '-'", query, primer->chrom, primer->chromEnd); } sprintf(query, "%s order by chromStart", query); } else { if (hTableExists(database, "genomePcrPrimers")) sprintf(query, "select *, 'Array PCR' primerType from genomePcrPrimers where chrom = '%s' and chromEnd < %d and strand = '+'", primer->chrom, primer->chromStart); if (hTableExists(database, "goldRTprimers")) { if (strcmp(query, "") != 0) sprintf(query, "%s union ", query); sprintf(query, "%sselect *, 'GOLD RT' primerType from goldRTprimers where chrom = '%s' and chromEnd < %d and strand = '+'", query, primer->chrom, primer->chromStart); } sprintf(query, "%s order by chromStart desc", query); } sr = sqlGetResult(conn, query); while (((row = sqlNextRow(sr)) != NULL) && (pairCount < 6)) { if ((forwardPrimer && startsWith("Asn", row[4])) || (!forwardPrimer && startsWith("Sn", row[4]))) { printf("\n"); printf("\n", row[4]); printf("\n", row[7]); sequence = hDnaFromSeq(database, row[1], atoi(row[2]), atoi(row[3]), dnaUpper); if (sequence != NULL) { if (strcmp(row[6], "-") == 0) reverseComplement(sequence->dna, sequence->size); printf("\n", sequence->dna); } else printf("\n"); if (strcmp(primer->strand, "+") == 0) { sequence = hDnaFromSeq(database, primer->chrom, primer->chromStart, atoi(row[3]), dnaUpper); printf("\n", primer->chrom, primer->chromStart + 1, atoi(row[3])); } else { sequence = hDnaFromSeq(database, primer->chrom, atoi(row[2]), primer->chromEnd, dnaUpper); printf("\n", primer->chrom, atoi(row[2])+ 1, primer->chromEnd); } if (sequence != NULL) { printf("\n", sequence->size); printf("\n", computeGCContent(sequence->dna, sequence->size)); } else { printf("\n"); printf("\n"); } printf("\n"); pairCount++; } } sqlFreeResult(&sr); /* Close table */ printf("\n"); printf("
Primer NamePrimer TypePrimer SequencePCR RegionPCR Length (bp)PCR Region
GC Content (%%)
" "", hgTracksPathAndSettings(), database, row[1], atoi(row[2]) + 1, atoi(row[3])); printf("%s%s5' %s 3'N/A" "", hgTracksPathAndSettings(), database, primer->chrom, primer->chromStart + 1, atoi(row[3])); printf("%s:%d-%d" "", hgTracksPathAndSettings(), database, primer->chrom, atoi(row[2]) + 1, primer->chromEnd); printf("%s:%d-%d%d%0.2fN/AN/A
\n"); printf("
\n"); bedFree(&primer); hFreeConn(&conn); printTrackHtml(tdb); } void doWiki(char *track, struct trackDb *tdb, char *itemName) { char strand[2]; char wikiea[] = "wikiea"; char wikibme[] = "microbewiki"; char *wiki; if(sameWord(track, "wiki")) wiki = wikiea; else wiki = wikibme; printf(""); if(startsWith("Make", itemName)) { strand[0] = itemName[strlen(itemName)-1]; strand[1] = 0; printf("", database, seqName, winStart, winEnd, strand); } else { printf("", database, seqName, itemName); } printf(""); } void doRNAHybridization(struct trackDb *tdb, char *itemName) { struct sqlConnection *conn = hAllocConn(database); char query[512]; struct sqlResult *sr; char **row; struct rnaHybridization *rnaHyb; char rnaHybridizationTable[] = "rnaHybridization"; char tRNATable[] = "tRNAs"; char jgiTable[] = "jgiGene"; char *saveTableName; int i; cartWebStart(cart, database, "%s", "RNAHybridization Sites"); if (hTableExists(database, rnaHybridizationTable)) { /* Get query gene from refSeq */ sprintf(query, "select * from %s where name='%s'", rnaHybridizationTable, itemName); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) != NULL) { rnaHyb = rnaHybridizationLoad(row); printf("Hybridization Site:

"); /* print hybridization site */ printf(""); printf("Pattern 5%s3
", rnaHyb->patternSeq); printf("         "); for(i=0;imatchLength;i++) printf("|"); printf("
"); printf("Target  3%s5", rnaHyb->targetSeq); printf("


"); printf("
Genomic size: %d nt
\n",rnaHyb->matchLength); printf("Percentage G-C base-pairs: %d
", (int)(rnaHyb->gcContent * 100)); printf("Position: " "", hgTracksPathAndSettings(), database, rnaHyb->chrom, rnaHyb->chromStart+1, rnaHyb->chromEnd); printf("%s:%d-%d
\n", rnaHyb->chrom, rnaHyb->chromStart+1, rnaHyb->chromEnd); printf("Strand: %s
\n", rnaHyb->strand); printf("Target Position: " "", hgTracksPathAndSettings(), database, rnaHyb->chromTarget, rnaHyb->chromStartTarget+1, rnaHyb->chromEndTarget+1); printf("%s:%d-%d
\n", rnaHyb->chromTarget, rnaHyb->chromStartTarget+1, rnaHyb->chromEndTarget+1); printf("Target Strand: %s
\n", rnaHyb->strandTarget); printf("
"); if(strlen(rnaHyb->refSeqTarget) > 0) { printf("Additional information for target
"); printf("
"); doRefSeq(tdb, rnaHyb->refSeqTarget,"gbProtCodePep","gbProtCodeXra"); } if(strlen(rnaHyb->JGITarget) > 0) { saveTableName = tdb->table; tdb->table = jgiTable; printf("Additional information for target
"); printf("
"); doJgiGene(tdb, rnaHyb->JGITarget); tdb->table = saveTableName; } if(strlen(rnaHyb->trnaTarget) > 0) { saveTableName = tdb->table; tdb->table = tRNATable; printf("Additional information for target
"); printf("
"); doTrnaGenes(tdb, rnaHyb->trnaTarget); tdb->table = saveTableName; } freeMem(rnaHyb); } sqlFreeResult(&sr); } hFreeConn(&conn); } void doarCOGs(struct trackDb *tdb, char *itemName) { char query[512]; struct sqlConnection *conn = hAllocConn(database); struct sqlResult *sr; char *dupe, *words[16]; char **row; int wordCount; int rowOffset; struct arCOGs *infoload; int start = cartInt(cart, "o"); int end = cartInt(cart, "t"); sprintf(query, "select * from mgCommonDb.arcogdesc where name = '%s'", itemName); //sprintf(query, "select * from %s where query = '%s'", blastpHitsTable, queryName); struct sqlResult *srarcogdesc = sqlGetResult(conn, query); struct arcogdesc *description = NULL; while ((row = sqlNextRow(srarcogdesc)) != NULL) { struct arcogdesc *element; element = arcogdescLoad(row); slAddTail(&description, element); } sqlFreeResult(&srarcogdesc); genericHeader(tdb,itemName); dupe = cloneString(tdb->type); wordCount = chopLine(dupe, words); rowOffset = hOffsetPastBin(database,seqName, tdb->table); sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d and chromEnd = '%d';", tdb->table, itemName,seqName,start, end); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { infoload = arCOGsLoad(row+rowOffset); printf("Name: %s
\n", infoload->name); printf("Description: %s
\n", description->description); printf("Code: %s
\n", description->code); printf("Gene: %s
\n", infoload->gene); printf("Position: " "", hgTracksPathAndSettings(), database, infoload->chrom, infoload->chromStart + 1, infoload->chromEnd); printf("%s:%d-%d
\n", infoload->chrom, infoload->chromStart + 1, infoload->chromEnd); printf("Strand: %s
\n", infoload->strand); printf("Genomic size: %d nt
\n", (infoload->chromEnd - infoload->chromStart)); if (infoload->next != NULL) printf("
\n"); } sqlFreeResult(&sr); hFreeConn(&conn); arCOGsFree(&infoload); printTrackHtml(tdb); } void doloweOrthologs(struct trackDb *tdb, char *itemName) { char query[512]; struct sqlConnection *conn = hAllocConn(database); struct sqlResult *sr; char *dupe, *words[16]; char **row; int wordCount; int rowOffset; struct bed *infoload; int bedSize = 0; int start = cartInt(cart, "o"); int end = cartInt(cart, "t"); dupe = cloneString(tdb->type); wordCount = chopLine(dupe, words); if (wordCount > 1) bedSize = atoi(words[1]); if (bedSize < 3) bedSize = 3; genericHeader(tdb,itemName); dupe = cloneString(tdb->type); wordCount = chopLine(dupe, words); rowOffset = hOffsetPastBin(database,seqName, tdb->table); sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d and chromEnd = '%d';", tdb->table, itemName,seqName,start, end); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { infoload = bedLoadN(row+rowOffset, bedSize); printf("Name: %s\n", infoload->name); printf(" List of Orthologs
",database,infoload->name); printf("Position: " "", hgTracksPathAndSettings(), database, infoload->chrom, infoload->chromStart + 1, infoload->chromEnd); printf("%s:%d-%d
\n", infoload->chrom, infoload->chromStart + 1, infoload->chromEnd); printf("Strand: %s
\n", infoload->strand); printf("Genomic size: %d nt
\n", (infoload->chromEnd - infoload->chromStart)); if (infoload->next != NULL) printf("
\n"); } sqlFreeResult(&sr); hFreeConn(&conn); printTrackHtml(tdb); } void doCddInfo(struct trackDb *tdb, char *itemName) { char query[512]; struct sqlConnection *conn = hAllocConn(database); struct sqlResult *sr; char *dupe, *words[16]; char **row; int wordCount; int rowOffset; struct cddInfo *infoload; int bedSize = 0; int start = cartInt(cart, "o"); int end = cartInt(cart, "t"); dupe = cloneString(tdb->type); wordCount = chopLine(dupe, words); if (wordCount > 1) bedSize = atoi(words[1]); if (bedSize < 3) bedSize = 3; sprintf(query, "select * from mgCommonDb.cddDesc where accession = '%s'", itemName); //sprintf(query, "select * from %s where query = '%s'", blastpHitsTable, queryName); struct sqlResult *srCddDesc = sqlGetResult(conn, query); struct cddDesc *description = NULL; while ((row = sqlNextRow(srCddDesc)) != NULL) { struct cddDesc *element; element = cddDescLoad(row); slAddTail(&description, element); } sqlFreeResult(&srCddDesc); genericHeader(tdb,itemName); dupe = cloneString(tdb->type); wordCount = chopLine(dupe, words); rowOffset = hOffsetPastBin(database,seqName, tdb->table); sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d and chromEnd = '%d';", tdb->table, itemName,seqName,start, end); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { infoload = cddInfoLoad(row+rowOffset); printf("Name: %s
\n", infoload->fullname); printf("Accession: %s", infoload->name, infoload->NCBInum); printf(" Link to NCBI Site
\n"); printf("E-value: %0.0e
\n", infoload->evalue); printf("Description: %s
\n", description->name); printf("Protein Identity: %u%%
\n", infoload->percentident); printf("Percent Length: %u%%
\n", infoload->percentlength); printf("Position: " "", hgTracksPathAndSettings(), database, infoload->chrom, infoload->chromStart + 1, infoload->chromEnd); printf("%s:%d-%d
\n", infoload->chrom, infoload->chromStart + 1, infoload->chromEnd); printf("Strand: %s
\n", infoload->strand); printf("Genomic size: %d nt
\n", (infoload->chromEnd - infoload->chromStart)); if (infoload->next != NULL) printf("
\n"); } sqlFreeResult(&sr); hFreeConn(&conn); cddInfoFree(&infoload); printTrackHtml(tdb); } void domegablastInfo(struct trackDb *tdb, char *itemName) { char query[512]; struct sqlConnection *conn = hAllocConn(database); struct sqlResult *sr; char *dupe, *words[16]; char **row; int wordCount; int rowOffset; struct megablastInfo *infoload; int start = cartInt(cart, "o"); int end = cartInt(cart, "t"); genericHeader(tdb,itemName); dupe = cloneString(tdb->type); wordCount = chopLine(dupe, words); rowOffset = hOffsetPastBin(database,seqName, tdb->table); sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d and chromEnd = '%d';", tdb->table, itemName,seqName,start, end); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { infoload = megablastInfoLoad(row+rowOffset); printf("Name: %s
\n", infoload->name); printf("Accession: %s", infoload->name, infoload->name); printf(" Link to NCBI Site
\n"); printf("Description: %s
\n", infoload->fullname); printf("E-value: %0.0e", infoload->evalue); #ifdef LISTUI printf(" Sort by E-value",database); #endif printf("
\n"); printf("Protein Identity: %u%%\n", infoload->percentident); #ifdef LISTUI printf(" Sort by Percent Identity",database); #endif printf("
\n"); printf("Position: " "", hgTracksPathAndSettings(), database, infoload->chrom, infoload->chromStart + 1, infoload->chromEnd); printf("%s:%d-%d
\n", infoload->chrom, infoload->chromStart + 1, infoload->chromEnd); printf("Strand: %s
\n", infoload->strand); printf("Genomic size: %d nt
\n", (infoload->chromEnd - infoload->chromStart)); if (infoload->next != NULL) printf("
\n"); } sqlFreeResult(&sr); hFreeConn(&conn); megablastInfoFree(&infoload); printTrackHtml(tdb); } void doAlignInfo(struct trackDb *tdb, char *itemName) { char query[512]; struct sqlConnection *conn = hAllocConn(database); struct sqlResult *sr; char *dupe, *words[16]; char **row; int wordCount; int rowOffset; struct alignInfo *infoload; int bedSize = 0; int start = cartInt(cart, "o"); dupe = cloneString(tdb->type); wordCount = chopLine(dupe, words); if (wordCount > 1) bedSize = atoi(words[1]); if (bedSize < 3) bedSize = 3; genericHeader(tdb,itemName); dupe = cloneString(tdb->type); wordCount = chopLine(dupe, words); rowOffset = hOffsetPastBin(database, seqName, tdb->table); sprintf(query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d;", tdb->table, itemName,seqName,start); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { infoload = alignInfoLoad(row+rowOffset); printf("Name: %s ", infoload->name); linkToOtherBrowserTitle(infoload->orgn, infoload->alignChrom, infoload->alignChromStart + 1, infoload->alignChromEnd, "Aligned Feature"); //printf("", //hgTracksPathAndSettings(), infoload->orgn, infoload->alignChrom, infoload->alignChromStart + 1, infoload->alignChromEnd); printf("Link to Feature
\n" ); printf("Position: " "", hgTracksPathAndSettings(), database, infoload->chrom, infoload->chromStart + 1, infoload->chromEnd); printf("%s:%d-%d
\n", infoload->chrom, infoload->chromStart + 1, infoload->chromEnd); printf("Strand: %s
\n", infoload->strand); printf("Genomic size: %d nt
\n", (infoload->chromEnd - infoload->chromStart)); if (infoload->next != NULL) printf("
\n"); break; } sqlFreeResult(&sr); hFreeConn(&conn); alignInfoFree(&infoload); printTrackHtml(tdb); } void doCRISPRs(struct trackDb *tdb, char *crisprName) /* Handle the CRISPR array track. */ { struct bed *crispr; struct dnaSeq *sequence; char tempSeq[512]; char query[512]; struct sqlConnection *conn = hAllocConn(database); struct sqlResult *sr; char *dupe, *words[16]; char **row; int wordCount; int rowOffset; int bedSize = 0; int pairCount = 0; genericHeader(tdb, crisprName); dupe = cloneString(tdb->type); wordCount = chopLine(dupe, words); if (wordCount > 1) bedSize = atoi(words[1]); if (bedSize < 3) bedSize = 3; rowOffset = hOffsetPastBin(database, seqName, tdb->table); safef(query, ArraySize(query), "select * from %s where name = '%s'", tdb->table, crisprName); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { crispr = bedLoadN(row+rowOffset, bedSize); printf("Name: %s
\n", crisprName); printf("Position: " "", hgTracksPathAndSettings(), database, crispr->chrom, crispr->chromStart + 1, crispr->chromEnd); printf("%s:%d-%d
\n", crispr->chrom, crispr->chromStart + 1, crispr->chromEnd); printf("Strand: %s
\n", crispr->strand); printf("Genomic size: %d nt

\n", (crispr->chromEnd - crispr->chromStart)); printf("Number of spacers: %u

\n", crispr->blockCount - 1); sequence = hDnaFromSeq(database, crispr->chrom, crispr->chromStart, crispr->chromEnd, dnaUpper); if (sequence != NULL) { /* Print table */ printf("", HG_COL_BORDER); printf("\n"); printf("
\n"); printf("\n", HG_COL_INSIDE); printf("\n"); /* Print table column heading */ printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); if (strcmp(crispr->strand, "+") == 0) { for (pairCount = 0; pairCount < (int) crispr->blockCount; pairCount++) { printf("\n"); memset(tempSeq, '\0', sizeof(tempSeq)); memcpy(tempSeq, sequence->dna + crispr->chromStarts[pairCount], crispr->blockSizes[pairCount]); printf("\n", crispr->chromStart + 1 + crispr->chromStarts[pairCount], tempSeq, crispr->blockSizes[pairCount]); if (pairCount + 1 < crispr->blockCount) { memset(tempSeq, '\0', sizeof(tempSeq)); memcpy(tempSeq, sequence->dna + crispr->chromStarts[pairCount] + crispr->blockSizes[pairCount], crispr->chromStarts[pairCount+1] - crispr->blockSizes[pairCount] - crispr->chromStarts[pairCount]); printf("\n", crispr->chromStart + 1 + crispr->chromStarts[pairCount] + crispr->blockSizes[pairCount], tempSeq, crispr->chromStarts[pairCount+1] - crispr->blockSizes[pairCount] - crispr->chromStarts[pairCount]); } else { printf("\n"); } printf("\n"); } } else { for (pairCount = ((int)crispr->blockCount - 1); pairCount >= 0; pairCount--) { printf("\n"); memset(tempSeq, '\0', sizeof(tempSeq)); memcpy(tempSeq, sequence->dna + crispr->chromStarts[pairCount], crispr->blockSizes[pairCount]); reverseComplement(tempSeq, strlen(tempSeq)); printf("\n", crispr->chromStart + crispr->chromStarts[pairCount] + crispr->blockSizes[pairCount], tempSeq, crispr->blockSizes[pairCount]); if (pairCount - 1 >= 0) { memset(tempSeq, '\0', sizeof(tempSeq)); memcpy(tempSeq, sequence->dna + crispr->chromStarts[pairCount-1] + crispr->blockSizes[pairCount-1], crispr->chromStarts[pairCount] - crispr->blockSizes[pairCount-1] - crispr->chromStarts[pairCount-1]); reverseComplement(tempSeq, strlen(tempSeq)); printf("\n", crispr->chromStart + crispr->chromStarts[pairCount], tempSeq, crispr->chromStarts[pairCount] - crispr->blockSizes[pairCount-1] - crispr->chromStarts[pairCount-1]); } else { printf("\n"); } printf("\n"); } } /* Close table */ printf("\n"); printf("
Direct RepeatSpacer
Start PosSequenceLengthStart PosSequenceLength
%d%s%d%d%s%d   
%d%s%d%d%s%d   
\n"); printf("
\n"); } if (crispr->next != NULL) printf("
\n"); } sqlFreeResult(&sr); bedFree(&crispr); hFreeConn(&conn); printTrackHtml(tdb); } bool loweLabClick(char *track, char *item, struct trackDb *tdb) /* check if we have one of the lowelab tracks */ { if (sameWord(track, "gbProtCode")) { llDoCodingGenes(tdb, item,"gbProtCodePep","gbProtCodeXra"); } else if (sameWord(track, "refSeq")) { doRefSeq(tdb, item,"gbProtCodePep","gbProtCodeXra"); } else if (startsWith("annotRev", track)) { doRefSeq(tdb, item,"Pep","Xra"); } else if (sameWord(track, "sargassoSea")) { doSargassoSea(tdb, item); } else if (sameWord(track, "tigrCmrORFs")) { doTigrCmrGene(tdb,item); } else if (sameWord(track, "jgiGene")) { doJgiGene(tdb,item); } else if (sameWord(track, "lowelabPfamHits")) { doPfamHit(tdb,item); } /*else if (sameWord(track, "tigrOperons"))*/ else if (sameWord(track, "lowelabTIGROperons")) { doTigrOperons(tdb,item); } else if (sameWord(track, "lowelabArkinOperons")) { doArkinOperons(tdb,item); } else if (sameWord(track,"codeBlast")) { doCodeBlast(tdb, item); } else if (sameWord(track,"gbRNAs")) { doGbRnaGenes(tdb, item); } else if (sameWord(track,"tRNAs")) { doTrnaGenes(tdb, item); } else if (sameWord(track,"snoRNAs")) { doSnornaGenes(tdb, item); } else if (sameWord(track,"easyGene")) { doEasyGenes(tdb, item); } else if (startsWith("BlastP_", track) && differentWord(track, "BlastP_Crenarchaea") && differentWord(track, "BlastP_Nanoarch") && differentWord(track, "BlastP_Euryarch") && differentWord(track, "BlastP_Bacteria")) { doBlastP(tdb, item); } else if (startsWith("BlastX_", track) && differentWord(track, "BlastX_Crenarchaea") && differentWord(track, "BlastX_Nanoarch") && differentWord(track, "BlastX_Euryarch") && differentWord(track, "BlastX_Bacteria")) { doBlastX(tdb, item); } else if (sameWord(track,"ultraConserved")) { doUltraConserved(tdb, item); } else if (sameWord(track,"genomePcrPrimers") || sameWord(track,"goldRTPrimers")) { doPrimers(tdb, item); } else if (sameWord(track,"wiki") || sameWord(track,"wikibme")) { doWiki(track,tdb,item); } else if (sameWord(track,"rnaHybridization")) { doRNAHybridization(tdb, item); } else if (sameWord(track,"cddInfo")) { doCddInfo(tdb, item); } else if (sameWord(track,"alignInfo")) { doAlignInfo(tdb, item); } else if (sameWord(track,"arCOGs")) { doarCOGs(tdb, item); } else if (sameWord(track,"megablastInfo") || sameWord(track,"vecScreenInfo")) { domegablastInfo(tdb, item); } else if (sameWord(track,"loweOrthologs")) { doloweOrthologs(tdb, item); } else if (sameWord(track,"selfHomologs")) { doSelfHomologs(tdb, item); } else if (sameWord(track,"CRISPRs")) { doCRISPRs(tdb, item); } else return FALSE; return TRUE; }