256b87a01941403ecb6d5b6ce2ed34aa0fd77514
markd
Fri Dec 19 21:50:42 2014 -0800
added support for transmap V3 which includes source databases in mapped alignment idenitifier
diff --git src/hg/hgc/transMapClick.c src/hg/hgc/transMapClick.c
index b071b34..cd366e4 100644
--- src/hg/hgc/transMapClick.c
+++ src/hg/hgc/transMapClick.c
@@ -1,262 +1,262 @@
/* transMapClick - transMap click handling */
/* Copyright (C) 2010 The Regents of the University of California
* See README in this or parent directory for licensing information. */
/*
* Per-genome tables associated with transMap:
* transMapAliXxx - mapped PSLs alignments
* transMapInfoXxx - information for mapped alignments
* hgFixed tables associated with transMap:
* transMapSrcXxx - information about source alignments
* transMapGeneXxx - gene information
* transMapSeqXxx - seq table for accessing sequence
* transMapExtFileXxx - extFile table
*
* Xxx is:
* - UcscGene - UCSC genes
* - RefSeq - RefSeq mRNAs
* - MRna - GenBank mRNAs
* - SplicedEst - GenBank spliced ESTs
*/
#include "common.h"
#include "hgc.h"
#include "hui.h"
#include "hCommon.h"
#include "transMapClick.h"
#include "transMapStuff.h"
#include "transMapInfo.h"
#include "transMapSrc.h"
#include "transMapGene.h"
#include "genbank.h"
struct transMapBag
/* object contain collected information on a specific transMap mapping */
{
struct psl *psl; // transMap alignment
struct transMapInfo *info; // addition information about mapping
struct transMapSrc *src; // source information
struct transMapGene *gene; // gene information
boolean srcDbIsActive; // source database is active
};
static struct transMapBag *transMapBagLoad(struct sqlConnection *conn,
struct trackDb *tdb, char *mappedId,
boolean getSrcRec)
/* load information from various tables */
{
struct transMapBag *bag;
AllocVar(bag);
bag->psl = getAlignments(conn, tdb->table, mappedId);
char *transMapInfoTbl = trackDbRequiredSetting(tdb, transMapInfoTblSetting);
bag->info = transMapInfoQuery(conn, transMapInfoTbl, mappedId);
if (getSrcRec)
{
char *transMapSrcTbl = trackDbRequiredSetting(tdb, transMapSrcTblSetting);
bag->src = transMapSrcQuery(conn, transMapSrcTbl, bag->info->srcDb, bag->info->srcId);
}
char *transMapGeneTbl = trackDbSetting(tdb, transMapGeneTblSetting);
if (transMapGeneTbl != NULL)
bag->gene = transMapGeneQuery(conn, transMapGeneTbl,
- bag->info->srcDb, transMapIdToAcc(bag->info->srcId));
+ bag->info->srcDb, transMapIdToSeqId(bag->info->srcId));
bag->srcDbIsActive = hDbIsActive(bag->info->srcDb);
return bag;
}
static void transMapBagFree(struct transMapBag **bagPtr)
/* free the bag */
{
struct transMapBag *bag = *bagPtr;
if (bag != NULL)
{
pslFree(&bag->psl);
transMapInfoFree(&bag->info);
transMapSrcFree(&bag->src);
transMapGeneFree(&bag->gene);
freez(bagPtr);
}
}
static void prOrgScientific(char *db)
/* print organism and scientific name for a database. */
{
char *org = hOrganism(db);
char *sciName = hScientificName(db);
if ((org != NULL) && (sciName != NULL))
printf("%s (%s)", org, sciName);
else
printf("n/a");
freeMem(org);
freeMem(sciName);
}
static char *chainSubsetDesc(enum transMapInfoChainSubset cs)
/* get description for chain subset */
{
switch (cs)
{
case transMapInfoUnknown:
return "unknown";
case transMapInfoAll:
return "all";
case transMapInfoSyn:
return "syntenic";
case transMapInfoRbest:
return "reciprocal best";
}
return NULL;
}
static void displayMapped(struct transMapBag *bag)
/* display information about the mapping alignment */
{
printf("
\n");
printf("TransMap Alignment\n");
printf("\n");
// organism/assembly
printf("Organism | ");
prOrgScientific(database);
printf(" |
\n");
printf("Genome | %s |
\n", database);
// position
printf("");
printf("Position | ");
printf("",
hgTracksPathAndSettings(),
bag->psl->tName, bag->psl->tStart, bag->psl->tEnd);
printf("%s:%d-%d", bag->psl->tName, bag->psl->tStart, bag->psl->tEnd);
printf(" |
\n");
// % identity and % aligned
printf("Identity | %0.1f%% |
\n",
100.0*pslIdent(bag->psl));
printf("Aligned | %0.1f%% |
\n",
100.0*pslQueryAligned(bag->psl));
// chain used in mapping
printf("Chain ID | %s |
\n",
bag->info->mappingId);
printf("Chain subset | %s |
\n",
chainSubsetDesc(bag->info->chainSubset));
printf("
\n");
}
static void displaySource(struct transMapBag *bag)
/* display information about the source gene that was mapped */
{
printf("\n");
printf("Source Alignment\n");
printf("\n");
// organism/assembly
printf("Organism | ");
prOrgScientific(bag->info->srcDb);
printf(" |
\n");
printf("Genome | %s |
\n", bag->info->srcDb);
// position
printf("Position\n");
printf(" | ");
if (bag->srcDbIsActive)
printf(""
"%s:%d-%d",
hgTracksName(), bag->src->db,
bag->src->chrom, bag->src->chromStart, bag->src->chromEnd,
bag->src->chrom, bag->src->chromStart, bag->src->chromEnd);
else
printf("%s:%d-%d", bag->src->chrom, bag->src->chromStart, bag->src->chromEnd);
printf(" |
\n");
// % identity and % aligned
printf("Identity | %0.1f%% |
\n",
100.0*bag->src->ident);
printf("Aligned | %0.1f%% |
\n",
100.0*bag->src->aligned);
// gene and CDS
printf("Gene | %s |
\n",
(((bag->gene != NULL) && (strlen(bag->gene->geneName) > 0))
? bag->gene->geneName : " "));
printf("CDS | %s |
\n",
(((bag->gene != NULL) && (strlen(bag->gene->cds) > 0))
? bag->gene->cds : " "));
printf("
\n");
}
static void displayAligns(struct trackDb *tdb, struct transMapBag *bag)
/* display cDNA alignments */
{
int start = cartInt(cart, "o");
printf("mRNA/Genomic Alignments
");
printAlignmentsSimple(bag->psl, start, "hgcTransMapCdnaAli", tdb->table, bag->info->mappedId);
}
void transMapClickHandler(struct trackDb *tdb, char *mappedId)
/* Handle click on a transMap tracks */
{
struct sqlConnection *conn = hAllocConn(database);
struct transMapBag *bag = transMapBagLoad(conn, tdb, mappedId, TRUE);
genericHeader(tdb, mappedId);
printf("\n");
printf("\n");
displayMapped(bag);
printf(" | \n");
displaySource(bag);
printf(" | \n");
printf(" |
\n");
printf("\n");
displayAligns(tdb, bag);
printf(" |
\n");
printf("
\n");
printTrackHtml(tdb);
transMapBagFree(&bag);
hFreeConn(&conn);
}
static struct dnaSeq *getCdnaSeq(struct trackDb *tdb, char *name)
/* look up sequence name in seq and extFile tables specified
* for base coloring. */
{
/* FIXME: this is really a rip off of some of the code in
* hgTracks/cds.c; really need to centralize it somewhere */
char *spec = trackDbRequiredSetting(tdb, BASE_COLOR_USE_SEQUENCE);
char *specCopy = cloneString(spec);
// value is: extFile seqTbl extFileTbl
char *words[3];
int nwords = chopByWhite(specCopy, words, ArraySize(words));
if ((nwords != ArraySize(words)) || !sameString(words[0], "extFile"))
errAbort("invalid %s track setting: %s", BASE_COLOR_USE_SEQUENCE, spec);
-struct dnaSeq *seq = hDnaSeqGet(NULL, name, words[1], words[2]);
+struct dnaSeq *seq = hDnaSeqMustGet(NULL, name, words[1], words[2]);
freeMem(specCopy);
return seq;
}
void transMapShowCdnaAli(struct trackDb *tdb, char *mappedId)
/* Show alignment for mappedId, mostly ripped off from htcCdnaAli */
{
struct sqlConnection *conn = hAllocConn(database);
struct transMapBag *bag = transMapBagLoad(conn, tdb, mappedId, FALSE);
struct genbankCds cds;
if ((bag->gene == NULL) || (strlen(bag->gene->cds) == 0)
|| !genbankCdsParse(bag->gene->cds, &cds))
ZeroVar(&cds); /* can't get or parse cds */
-struct dnaSeq *seq = getCdnaSeq(tdb, transMapIdToAcc(mappedId));
+struct dnaSeq *seq = getCdnaSeq(tdb, transMapIdToSeqId(mappedId));
writeFramesetType();
puts("");
printf("\n%s vs Genomic\n\n\n", mappedId);
showSomeAlignment(bag->psl, seq, gftDna, 0, seq->size, NULL, cds.start, cds.end);
dnaSeqFree(&seq);
transMapBagFree(&bag);
hFreeConn(&conn);
}