e70152e44cc66cc599ff6b699eb8adc07f3e656a
kent
Sat May 24 21:09:34 2014 -0700
Adding Copyright NNNN Regents of the University of California to all files I believe with reasonable certainty were developed under UCSC employ or as part of Genome Browser copyright assignment.
diff --git src/hg/hgc/mgcClick.c src/hg/hgc/mgcClick.c
index 88304bd..6a9f3d5 100644
--- src/hg/hgc/mgcClick.c
+++ src/hg/hgc/mgcClick.c
@@ -1,859 +1,862 @@
/* mgcClick - click handling for MGC and ORFEome related tracks */
+
+/* Copyright (C) 2013 The Regents of the University of California
+ * See README in this or parent directory for licensing information. */
#include "common.h"
#include "hgc.h"
#include "mgcClick.h"
#include "ccdsClick.h"
#include "ccdsGeneMap.h"
#include "gbMiscDiff.h"
#include "web.h"
#include "genbank.h"
#include "htmshell.h"
#include "genePred.h"
#include "geneSimilarities.h"
static char *findRefSeqSummary(struct sqlConnection *conn,
struct geneSimilarities *refSeqs,
char **sumAccv)
/* Given similar refseq genes, find the first one with a RefSeq
* summary and return that summary, or NULL if not found. Also returns
* accv of matched */
{
char buf[GENBANK_ACC_BUFSZ];
struct geneSim *rs;
for (rs = refSeqs->genes; rs != NULL; rs = rs->next)
{
char *sum = getRefSeqSummary(conn, genbankDropVer(buf, rs->gene->name));
if (sum != NULL)
{
*sumAccv = cloneString(rs->gene->name);
return sum;
}
}
*sumAccv = NULL;
return NULL;
}
static char *getAccVersion(struct sqlConnection *conn, char *acc)
/* given a accession, get acc.ver */
{
char query[256], accver[64];
sqlSafef(query, sizeof(query), "SELECT version FROM gbCdnaInfo WHERE acc=\"%s\"", acc);
safef(accver, sizeof(accver), "%s.%d", acc, sqlNeedQuickNum(conn, query));
return cloneString(accver);
}
struct mgcDb
/* information about an MGC databases */
{
char *name; /* collection name */
char *title; /* collection title */
char *organism; /* organism name for URL, case-sensitive */
char *server; /* MGC server */
};
static struct mgcDb getMgcDb()
/* get the mgc database info for the current host */
{
struct mgcDb mgcDb;
mgcDb.name = "MGC";
mgcDb.title = "Mammalian Gene Collection";
mgcDb.server = "mgc";
mgcDb.organism = NULL;
/* NOTE: mgc server likes first letter of organism capitalized */
if (startsWith("hg", database) || startsWith("braNey", database))
mgcDb.organism = "Hs";
else if (startsWith("mm", database))
mgcDb.organism = "Mm";
else if (startsWith("rn", database))
mgcDb.organism = "Rn";
else if (startsWith("bosTau", database))
mgcDb.organism = "Bt";
else if (startsWith("danRer", database))
{
mgcDb.name = "ZGC";
mgcDb.title = "Zebrafish Gene Collection";
mgcDb.organism = "Dr";
mgcDb.server = "zgc";
}
else if (startsWith("xenTro", database))
{
mgcDb.name = "XGC";
mgcDb.title = "Xenopus Gene Collection";
mgcDb.organism = "Str";
mgcDb.server = "xgc";
}
else
errAbort("can't map database \"%s\" to an MGC organism", database);
return mgcDb;
}
char *mgcDbName()
/* get just the MGC collection name for the current ucsc database */
{
return getMgcDb().name;
}
void printMgcHomeUrl(struct mgcDb *mgcDb)
/* print out an URL to link to the MGC site */
{
printf("http://%s.nci.nih.gov/", mgcDb->server);
}
void printMgcUrl(int imageId)
/* print out an URL to link to the MGC site for a full-length MGC clone */
{
struct mgcDb mgcDb = getMgcDb();
printf("http://%s.nci.nih.gov/Reagents/CloneInfo?ORG=%s&IMAGE=%d",
mgcDb.server, mgcDb.organism, imageId);
}
static void printOrderUrl(int gi)
/* print out an URL to link to the NCBI order CGI for a full-length MGC clone */
{
printf("http://www.ncbi.nlm.nih.gov/genome/clone/orderclone.cgi?db=nucleotide&uid=%d", gi);
}
static void printImageUrl(int imageId)
/* print out an URL to link to IMAGE database for a clone */
{
printf("http://www.imageconsortium.org/IQ/bin/singleCloneQuery?clone_id=%d", imageId);
}
void printMgcDetailsUrl(char *acc, int start)
/* print out an URL to link to MGC details pages from another details page in
* the browser.*/
{
// pass zero coordiates for window to indicate this isn't a browser click
printf("../cgi-bin/hgc?%s&g=mgcGenes&o=%d&i=%s&l=0&r=0&db=%s",
cartSidUrlString(cart), start, acc, database);
}
static void printMBLabValidDbUrl(char *acc)
/* print out an URL to link to Brent lab validation database */
{
printf("http://mblab.wustl.edu/cgi-bin/mgc.cgi?acc=%s&action=cloneRpt&alignment=Submit", acc);
}
struct cloneInfo
/* Information on a MGC or ORFeome clone collected from various tables */
{
boolean isMgc; // is this MGC or ORFeome
char *acc;
int start;
char *pslTbl; // psl-format table
char *gpTbl; // genePred format table
char *desc; // genbank info
char *organism;
char *tissue;
char *library;
char *development;
char *geneName;
char *productName;
char *moddate;
char *clone;
char *cds;
char *keyword;
int version;
int imageId;
int mgcId;
int gi;
char *refSeqAccv; // best RefSeq acc.version, or NULL
char *refSeqSum; // RefSeq from best matching RefSeq with summary, or NULL.
char *refSeqSumAccv; // accv for summary, maybe different than best match
struct geneSimilarities *refSeqs; // most similar RefSeqs, with name set to acc.version
};
static boolean isInMBLabValidDb(char *acc)
/* check if an accession is in the Brent lab validation database */
{
boolean inMBLabValidDb = FALSE;
struct sqlConnection *fconn = sqlMayConnect("hgFixed");
if ((fconn != NULL) && sqlTableExists(fconn, "mgcMBLabValid"))
{
char query[64], buf[32];
sqlSafef(query, sizeof(query), "select acc from mgcMBLabValid where acc=\"%s\"",
acc);
if (sqlQuickQuery(fconn, query, buf, sizeof(buf)) != NULL)
inMBLabValidDb = TRUE;
sqlDisconnect(&fconn);
}
return inMBLabValidDb;
}
static void cdnaInfoLoad(struct cloneInfo *ci, struct sqlConnection *conn)
/* Loading clone information from gbCdnaInfo relational tables. */
{
// data from gbCdnaInfo and friends
char query[1024];
sqlSafef(query, sizeof(query),
"select "
"description.name, organism.name, tissue.name, library.name,"
"development.name, geneName.name, productName.name, mrnaClone.name,"
"cds.name,keyword.name,gbCdnaInfo.moddate,gbCdnaInfo.version,"
"gbCdnaInfo.gi"
" from "
"gbCdnaInfo,description,organism,tissue,library,development,"
"geneName,productName,mrnaClone,cds,keyword"
" where "
"(acc = \"%s\") and"
"(description = description.id) and (organism = organism.id) and"
"(tissue = tissue.id) and (library = library.id) and"
"(development = development.id) and (geneName = geneName.id) and"
"(productName = productName.id) and (mrnaClone = mrnaClone.id) and"
"(cds = cds.id) and (keyword = keyword.id)", ci->acc);
struct sqlResult *sr = sqlGetResult(conn, query);
char **row = sqlNextRow(sr);
if (row == NULL)
errAbort("can't find %s in gbCdnaInfo", ci->acc);
int i = 0;
ci->desc = cloneString(row[i++]);
ci->organism = cloneString(row[i++]);
ci->tissue = cloneString(row[i++]);
ci->library = cloneString(row[i++]);
ci->development = cloneString(row[i++]);
ci->geneName = cloneString(row[i++]);
ci->productName = cloneString(row[i++]);
ci->clone = cloneString(row[i++]);
ci->cds = cloneString(row[i++]);
ci->keyword = cloneString(row[i++]);
ci->moddate = cloneString(row[i++]);
ci->version = sqlUnsigned(row[i++]);
ci->gi = sqlUnsigned(row[i++]);
sqlFreeResult(&sr);
}
static char *cdnaInfoDbName(struct cloneInfo *ci)
/* get the name to use in describing this gene collection */
{
return (ci->isMgc ? mgcDbName() : "ORFeome");
}
static void getRefSeqInfo(struct sqlConnection *conn, struct cloneInfo *ci)
/* fill in refSeq info */
{
ci->refSeqs = geneSimilaritiesBuildAt(conn, TRUE, ci->acc, seqName, ci->start,
ci->gpTbl, "refGene");
// replace accession in gene names with accession.version
struct geneSim *gs;
for (gs = ci->refSeqs->genes; gs != NULL; gs = gs->next)
{
char *accv ;
// add version number if it's not already there
if (strchr(gs->gene->name, '.'))
accv = cloneString(gs->gene->name);
else
accv = getAccVersion(conn, gs->gene->name);
freeMem(gs->gene->name);
gs->gene->name = accv;
}
if ((ci->refSeqs != NULL) && (ci->refSeqs->genes != NULL))
{
// use first one (highest similarity)
ci->refSeqAccv = cloneString(ci->refSeqs->genes->gene->name);
// get summary for first one with summary
ci->refSeqSum = findRefSeqSummary(conn, ci->refSeqs, &ci->refSeqSumAccv);
}
}
static void parseCloneField(struct cloneInfo *ci)
/* parse the mrnaClone field to get IMAGE and MGC fields, if available */
{
/* MGC:135061 IMAGE:40080529
* or
* IMAGE:100005038; FLH186078.01X; RZPDo839A0971D
*/
char buf[1024], *words[64];
safecpy(buf, sizeof(buf), ci->clone);
int nwords = chopByWhite(buf, words, ArraySize(words));
if (nwords == ArraySize(words))
errAbort("more words in mrnaClone file than can be parsed, most likely data corruption: %s",
ci->clone);
int i;
for (i = 0; i < nwords; i++)
{
char *word = words[i];
int l = strlen(word);
if ((l > 0) && (word[l-1] == ';'))
word[l-1] = '\0'; // wack trailing `;'
if (startsWith("MGC:", word))
ci->mgcId = sqlUnsigned(word+4);
else if (startsWith("IMAGE:", word))
ci->imageId = sqlUnsigned(word+6);
}
}
static struct cloneInfo *cloneInfoLoad(struct sqlConnection *conn, char *acc,
int start, char *pslTbl, char *gpTbl)
/* Load clone information tables. */
{
struct cloneInfo *ci;
AllocVar(ci);
ci->acc = cloneString(acc);
ci->start = start;
ci->pslTbl = cloneString(pslTbl);
ci->gpTbl = cloneString(gpTbl);
cdnaInfoLoad(ci, conn);
parseCloneField(ci);
if (sqlTableExists(conn, "refGene"))
getRefSeqInfo(conn, ci);
return ci;
}
static void cloneInfoFree(struct cloneInfo **ciPtr)
/* free a cloneInfo object */
{
struct cloneInfo *ci = *ciPtr;
if (ci != NULL)
{
freeMem(ci->acc);
freeMem(ci->pslTbl);
freeMem(ci->gpTbl);
freeMem(ci->desc);
freeMem(ci->organism);
freeMem(ci->tissue);
freeMem(ci->library);
freeMem(ci->development);
freeMem(ci->geneName);
freeMem(ci->productName);
freeMem(ci->moddate);
freeMem(ci->clone);
freeMem(ci->cds);
freeMem(ci->keyword);
freeMem(ci->refSeqAccv);
freeMem(ci->refSeqSum);
geneSimilaritiesFree(&ci->refSeqs);
freeMem(ci);
*ciPtr = NULL;
}
}
static struct cloneInfo *mgcCloneInfoLoad(struct sqlConnection *conn, char *acc,
int start)
/* Load MGC clone information */
{
struct cloneInfo *ci = cloneInfoLoad(conn, acc, start, "mgcFullMrna", "mgcGenes");
ci->isMgc = TRUE;
if (ci->mgcId == 0)
errAbort("no MGC:nnnn entry in mrnaClone table for MGC clone %s", acc);
if (ci->imageId == 0)
errAbort("no IMAGE:nnnn entry in mrnaClone table for MGC clone %s", acc);
return ci;
}
static struct cloneInfo *orfeomeCloneInfoLoad(struct sqlConnection *conn, char *acc,
int start)
/* Load ORFeome clone information */
{
struct cloneInfo *ci = cloneInfoLoad(conn, acc, start, "orfeomeMrna", "orfeomeGenes");
ci->isMgc = FALSE;
return ci;
}
static void prCellLabelVal(char *label, char *val)
/* print label and value as adjacent cells */
{
webPrintLabelCell(label);
webPrintLinkCell(val);
}
static void prInitialSection(struct cloneInfo *ci, char *collection)
/* start page and print initial section */
{
cartWebStart(cart, database, "%s Clone %s.%d", collection, ci->acc, ci->version);
printf("%s\n", ci->geneName);
printf("
%s\n", ci->desc);
if (ci->refSeqAccv != NULL)
printf("
RefSeq: %s\n", ci->refSeqAccv);
if (ci->refSeqSum != NULL)
{
printf("
RefSeq Summary:");
if (!sameString(ci->refSeqSumAccv, ci->refSeqAccv))
printf(" (summary from %s):", ci->refSeqAccv); // no summary for best match
printf(" %s\n", ci->refSeqSum);
}
}
static void prCloneInfo(struct cloneInfo *ci)
/* print table of clone information */
{
webPrintLinkTableStart();
prCellLabelVal("Gene", ci->geneName);
webPrintLinkTableNewRow();
prCellLabelVal("Product", ci->productName);
webPrintLinkTableNewRow();
prCellLabelVal("Tissue", ci->tissue);
webPrintLinkTableNewRow();
prCellLabelVal("Library", ci->library);
webPrintLinkTableNewRow();
prCellLabelVal("Development", ci->development);
webPrintLinkTableNewRow();
prCellLabelVal("CDS", ci->cds);
webPrintLinkTableNewRow();
prCellLabelVal("Modification date", ci->moddate);
webPrintLinkTableEnd();
}
static void prSeqLinks(struct sqlConnection *conn, struct cloneInfo *ci)
/* print table of sequence links */
{
webNewSection("Sequences");
webPrintLinkTableStart();
webPrintLinkCellStart();
hgcAnchorSomewhere("htcDisplayMrna", ci->acc, ci->pslTbl, seqName);
printf("mRNA");
webPrintLinkCellEnd();
webPrintLinkCellStart();
hgcAnchorSomewhere("htcTranslatedMRna", ci->acc, ci->pslTbl, seqName);
printf("Protein
");
webPrintLinkCellEnd();
webPrintLinkCellStart();
hgcAnchorSomewhere("htcGeneInGenome", ci->acc, ci->gpTbl, seqName);
printf("Genomic");
webPrintLinkCellEnd();
webPrintLinkTableNewRow();
webPrintLinkCellStart();
hgcAnchorSomewhere("htcDisplayMrna", ci->acc, ci->gpTbl, seqName);
printf("Reference genome mRNA");
webPrintLinkCellEnd();
#if BROKEN
// FIXME: doesn't work when genePred table is not the track; not that important
webPrintLinkCellStart();
hgcAnchorSomewhereTbl("htcTranslatedPredMRna", ci->acc, ci->pslTbl, seqName, ci->gpTbl);
printf("Reference genome protein");
webPrintLinkCellEnd();
webFinishPartialLinkTable(1, 2, 3);
#else
webFinishPartialLinkTable(1, 1, 3);
#endif
webPrintLinkTableEnd();
}
static void prAlign(struct sqlConnection *conn, char *pslTbl, struct psl *psl)
/* print an alignment */
{
// genomic location
webPrintLinkCellStart();
printf("%s:%d-%d",
hgTracksPathAndSettings(), database, psl->tName, psl->tStart+1, psl->tEnd,
psl->tName, psl->tStart+1, psl->tEnd);
webPrintLinkCellEnd();
// genomic span
webPrintLinkCellRightStart();
printf("%d", psl->tEnd-psl->tStart);
webPrintLinkCellEnd();
// strand
webPrintLinkCell(psl->strand);
// mRNA location, linked to aligment viewer
webPrintLinkCellStart();
char other[128];
safef(other, sizeof(other), "%d&aliTable=%s", psl->tStart, pslTbl);
hgcAnchorSomewhere("htcCdnaAli", psl->qName, other, psl->tName);
printf("%s:%d-%d", psl->qName, psl->qStart+1, psl->qEnd);
webPrintLinkCellEnd();
// identity
webPrintLinkCellRightStart();
printf("%.2f%%", 100.0 * pslIdent(psl));
webPrintLinkCellEnd();
// fraction aligned
webPrintLinkCellRightStart();
int aligned = psl->match + psl->misMatch + psl->repMatch;
printf("%.2f%%", 100.0*aligned/((float)psl->qSize));
webPrintLinkCellEnd();
}
static void prAligns(struct sqlConnection *conn, struct cloneInfo *ci)
/* print table of alignments */
{
struct psl* pslList = getAlignments(conn, ci->pslTbl, ci->acc);
assert(pslList != NULL);
slSort(&pslList, pslCmpMatch);
// header, print note about order only if we have multiple alignments and didn't
// come from another details page
webNewSection("Alignments");
if ((pslList->next != NULL) && (winStart < winEnd))
printf("The alignment you clicked on is shown first.\n");
webPrintLinkTableStart();
webPrintLabelCell("genomic (browser)");
webPrintLabelCell("span");
webPrintLabelCell(" ");
webPrintLabelCell("mRNA (alignment details)");
webPrintLabelCell("identity");
webPrintLabelCell("aligned");
// print with clicked alignment first
struct psl* psl;
int pass;
for (pass = 1; pass <= 2; pass++)
{
for (psl = pslList; psl != NULL; psl = psl->next)
if ((pass == 1) == (psl->tStart == ci->start))
{
webPrintLinkTableNewRow();
prAlign(conn, ci->pslTbl, psl);
}
}
webPrintLinkTableEnd();
}
enum gbMiscDiffFields
/* optional fields in gbMiscDiff table */
{
gbMiscDiffNotes = 0x01,
gbMiscDiffGene = 0x02,
gbMiscDiffReplace = 0x04
};
static unsigned getMiscDiffFields(struct gbMiscDiff *gmds)
/* find which fields are present */
{
struct gbMiscDiff *gmd;
unsigned flds = 0;
for (gmd = gmds; gmd != NULL; gmd = gmd->next)
{
if (gmd->notes != NULL)
flds |= gbMiscDiffNotes;
if (gmd->gene != NULL)
flds |=gbMiscDiffGene;
if (gmd->replacement != NULL)
flds |= gbMiscDiffReplace;
}
return flds;
}
static void prMiscDiffHdr(unsigned miscDiffFlds)
/* print a header row for miscDiffs table */
{
webPrintLabelCell("mRNA start");
webPrintLabelCell("mRNA end");
if (miscDiffFlds & gbMiscDiffGene)
webPrintLabelCell("Gene");
if (miscDiffFlds & gbMiscDiffReplace)
webPrintLabelCell("Replace");
if (miscDiffFlds & gbMiscDiffNotes)
webPrintLabelCell("Notes");
}
static void prMiscDiff(struct gbMiscDiff *gmd, unsigned miscDiffFlds)
/* print any gbMiscDiff row */
{
webPrintLinkTableNewRow();
webPrintIntCell(gmd->mrnaStart);
webPrintIntCell(gmd->mrnaEnd);
if (miscDiffFlds & gbMiscDiffGene)
webPrintLinkCell(gmd->gene);
if (miscDiffFlds & gbMiscDiffReplace)
webPrintLinkCell(gmd->replacement);
if (miscDiffFlds & gbMiscDiffNotes)
webPrintLinkCell(gmd->notes);
}
static void prMiscDiffs(struct sqlConnection *conn, char *acc)
/* print any gbMiscDiff rows for the accession */
{
struct gbMiscDiff *gmds = NULL, *gmd;
if (sqlTableExists(conn, "gbMiscDiff"))
gmds = sqlQueryObjs(conn, (sqlLoadFunc)gbMiscDiffLoad, sqlQueryMulti,
"select * from gbMiscDiff where acc=\"%s\"", acc);
webNewSection("NCBI Clone Validation");
if (gmds != NULL)
{
unsigned miscDiffFlds = getMiscDiffFields(gmds);
webPrintLinkTableStart();
prMiscDiffHdr(miscDiffFlds);
for (gmd = gmds; gmd != NULL; gmd = gmd->next)
prMiscDiff(gmd, miscDiffFlds);
webPrintLinkTableEnd();
}
else
printf("No clone discrepancies annotated
\n");
}
static void prMethodsLink(struct sqlConnection *conn, char *track)
/* generate link to methods page */
{
webNewSection("Description and Methods");
printf("Click here for details",
hgcPathAndSettings(), track, seqName, winStart, winEnd);
}
static void prOrderLink(char *name, struct cloneInfo *ci)
/* create link to NCBI clone order CGI */
{
webPrintLinkTableNewRow();
webPrintLinkCellStart();
printf("gi);
printf("\" TARGET=_blank>Order %s clone", name);
webPrintLinkCellEnd();
}
static void prImageLink(struct cloneInfo *ci)
/* create link to IMAGE database */
{
webPrintLinkTableNewRow();
webPrintLinkCellStart();
printf("imageId);
printf("\" TARGET=_blank>IMAGE clone %d", ci->imageId);
webPrintLinkCellEnd();
}
static void prGenbankLink(struct cloneInfo *ci)
/* create link to Genbank database */
{
webPrintLinkTableNewRow();
webPrintLinkCellStart();
printf("acc);
printf("\" TARGET=_blank>Genbank %s", ci->acc);
webPrintLinkCellEnd();
}
static void prRefSeqLinks(struct cloneInfo *ci)
/* print link to RefSeq */
{
webPrintLinkTableNewRow();
webPrintLinkCellStart();
printf("refSeqAccv);
printf("\" TARGET=_blank>RefSeq %s", ci->refSeqAccv);
webPrintLinkCellEnd();
}
static void prCcdsLinks(struct sqlConnection *conn, struct cloneInfo *ci)
/* generate links to CCDS gene */
{
struct geneSimilarities *ccdsGenes
= geneSimilaritiesBuildAt(conn, TRUE, ci->acc, seqName, ci->start,
ci->gpTbl, "ccdsGene");
if (ccdsGenes->genes != NULL)
{
/* just use cloest one */
char *ccdsId = ccdsGenes->genes->gene->name;
webPrintLinkTableNewRow();
webPrintLinkCellStart();
printf("%s", ccdsId);
webPrintLinkCellEnd();
}
geneSimilaritiesFree(&ccdsGenes);
}
static void prUcscGenesLinks(struct sqlConnection *conn, struct cloneInfo *ci)
/* generate links to UCSC or known genes */
{
struct geneSimilarities *ucscGenes
= geneSimilaritiesBuildAt(conn, TRUE, ci->acc, seqName, ci->start,
ci->gpTbl, "knownGene");
if (ucscGenes->genes != NULL)
{
/* just use cloest one */
struct genePred *gene = ucscGenes->genes->gene;
webPrintLinkTableNewRow();
webPrintLinkCellStart();
printf("UCSC Gene %s",
cartSidUrlString(cart), database, gene->name, seqName, gene->txStart, gene->txEnd, gene->name);
webPrintLinkCellEnd();
}
geneSimilaritiesFree(&ucscGenes);
}
static void prMgcCloneLinks(struct sqlConnection *conn, struct mgcDb *mgcDb, struct cloneInfo *ci)
/* print table of clone links */
{
webPrintLinkTableStart();
webPrintLabelCell("Links");
if (ci->gi > 0)
prOrderLink(mgcDb->name, ci);
// link to MGC database
webPrintLinkTableNewRow();
webPrintLinkCellStart();
printf("imageId);
printf("\" TARGET=_blank>%s clone database", mgcDb->name);
webPrintLinkCellEnd();
prImageLink(ci);
prGenbankLink(ci);
if (ci->refSeqAccv != NULL)
prRefSeqLinks(ci);
if (sqlTableExists(conn, "ccdsGene"))
prCcdsLinks(conn, ci);
if (sqlTableExists(conn, "knownGene"))
prUcscGenesLinks(conn, ci);
// Brent lab validation database
if (isInMBLabValidDb(ci->acc))
{
webPrintLinkTableNewRow();
webPrintLinkCellStart();
printf("acc);
printf("\" TARGET=_blank>Brent Lab Clone Validation");
webPrintLinkCellEnd();
}
webPrintLinkTableEnd();
}
static void prMgcInfoLinks(struct sqlConnection *conn, char *acc, struct mgcDb *mgcDb,
struct cloneInfo *ci)
/* print clone info and links */
{
webNewSection("%s Clone Information and Links", mgcDb->name);
printf("
\n");
prCloneInfo(ci);
printf(" | \n");
prMgcCloneLinks(conn, mgcDb, ci);
printf(" |
\n");
}
static void prRefSeqSim(struct cloneInfo *ci, struct geneSim *gs)
/* print similarity information for a given RefSeq */
{
webPrintLinkTableNewRow();
// RefSeq acc and link
webPrintLinkCellStart();
printf("gene->name);
printf("\" TARGET=_blank>%s", gs->gene->name);
webPrintLinkCellEnd();
// link to browser
webPrintLinkCellStart();
printf("%s:%d-%d",
hgTracksPathAndSettings(), database,
gs->gene->chrom, gs->gene->txStart+1, gs->gene->txEnd,
gs->gene->chrom, gs->gene->txStart+1, gs->gene->txEnd);
webPrintLinkCellEnd();
// similarity
webPrintLinkCellRightStart();
printf("%0.2f%%", 100.0*gs->sim);
webPrintLinkCellEnd();
}
static void prRefSeqSims(struct cloneInfo *ci)
/* print similarity information for RefSeqs */
{
webNewSection("RefSeq CDS isoform similarity of %s clone %s",
cdnaInfoDbName(ci), ci->acc);
webPrintLinkTableStart();
webPrintLabelCell("RefSeq");
webPrintLabelCell("Position");
webPrintLabelCell("Similarity");
struct geneSim *gs;
for (gs = ci->refSeqs->genes; gs != NULL; gs = gs->next)
prRefSeqSim(ci, gs);
webPrintLinkTableEnd();
printf("This table compares the similarity of the BLAT genomic alignments of "
"the CDS of this %s clone with alignment of RefSeq mRNA CDSs. This is a metric "
"of the similarity of the exon structure of the mRNAs, rather than a measure of their "
"nucleotide sequence similarity.", cdnaInfoDbName(ci));
}
void doMgcGenes(struct trackDb *tdb, char *acc)
/* Process click on a mgcGenes track. */
{
struct sqlConnection *conn = hAllocConn(database);
int start = cartInt(cart, "o");
struct mgcDb mgcDb = getMgcDb();
struct cloneInfo *ci = mgcCloneInfoLoad(conn, acc, start);
prInitialSection(ci, mgcDb.name);
printf("
Clone Source: %s\n", mgcDb.title);
prMgcInfoLinks(conn, acc, &mgcDb, ci);
if ((ci->refSeqs != NULL) && (ci->refSeqs->genes != NULL))
prRefSeqSims(ci);
prSeqLinks(conn, ci);
prAligns(conn, ci);
prMiscDiffs(conn, acc);
prMethodsLink(conn, tdb->track);
cloneInfoFree(&ci);
hFreeConn(&conn);
}
static void prOrfeomeCloneLinks(struct sqlConnection *conn, char *acc, struct cloneInfo *ci)
/* print table of clone links */
{
webPrintLinkTableStart();
webPrintLabelCell("Links");
webPrintLinkTableNewRow();
if (ci->gi > 0)
prOrderLink("ORFeome", ci);
#if 0
// link to ORFeome database
// FIXME: this doesn't appear to work, need to ask Christa
// http://www.orfeomecollaboration.org/bin/cloneStatus.pl
#endif
if (ci->imageId > 0)
prImageLink(ci);
prGenbankLink(ci);
if (ci->refSeqAccv != NULL)
prRefSeqLinks(ci);
if (sqlTableExists(conn, "ccdsGene"))
prCcdsLinks(conn, ci);
if (sqlTableExists(conn, "knownGene"))
prUcscGenesLinks(conn, ci);
webPrintLinkTableEnd();
}
static void prOrfeomeInfoLinks(struct sqlConnection *conn, char *acc, struct cloneInfo *ci)
/* print clone info and links */
{
webNewSection("ORFeome Clone Information and Links");
printf("\n");
prCloneInfo(ci);
printf(" | \n");
prOrfeomeCloneLinks(conn, acc, ci);
printf(" |
\n");
}
void doOrfeomeGenes(struct trackDb *tdb, char *acc)
/* Process click on a orfeomeGenes track. */
{
struct sqlConnection *conn = hAllocConn(database);
int start = cartInt(cart, "o");
struct cloneInfo *ci = orfeomeCloneInfoLoad(conn, acc, start);
// initial section
prInitialSection(ci, "ORFeome");
printf("
Clone Source: ORFeome collaboration\n");
prOrfeomeInfoLinks(conn, acc, ci);
if ((ci->refSeqs != NULL) && (ci->refSeqs->genes != NULL))
prRefSeqSims(ci);
prSeqLinks(conn, ci);
prAligns(conn, ci);
prMiscDiffs(conn, acc);
prMethodsLink(conn, tdb->track);
cloneInfoFree(&ci);
hFreeConn(&conn);
}