2ffc9d13a7475fbf6eb60a6b50d463ee11e7ff41
kate
Wed Oct 25 18:06:54 2017 -0700
Implement V2 GTEx eQTL clusters as described in RM as 'permissive with ID'. This adds Ensembl gene ID to schemas. Also adding summary columns to cluster track (maxEffect, maxPvalue, effectType) to provide alternative to parsing comma-sep fields for table filtering. refs #15646
diff --git src/hg/hgc/gtexEqtlClusterClick.c src/hg/hgc/gtexEqtlClusterClick.c
index b5de604..219cee7 100644
--- src/hg/hgc/gtexEqtlClusterClick.c
+++ src/hg/hgc/gtexEqtlClusterClick.c
@@ -1,188 +1,187 @@
/* Details page for GTEx eQTL Clusters */
/* Copyright (C) 2017 The Regents of the University of California
* See README in this or parent directory for licensing information. */
#include "common.h"
#include "hCommon.h"
#include "web.h"
#include "gtexTissue.h"
#include "gtexInfo.h"
#include "gtexEqtlCluster.h"
#include "hgc.h"
static struct gtexEqtlCluster *getGtexEqtl(char *item, char *chrom, int start, int end, char *table)
/* Retrieve this item from the track table */
{
char *gene = firstWordInLine(cloneString(item));
struct sqlConnection *conn = hAllocConn(database);
struct gtexEqtlCluster *eqtls = NULL, *eqtl;
char **row;
int offset;
char where[512];
sqlSafefFrag(where, sizeof(where), "target='%s'", gene);
struct sqlResult *sr = hRangeQuery(conn, table, chrom, start, end, where, &offset);
while ((row = sqlNextRow(sr)) != NULL)
{
eqtl = gtexEqtlClusterLoad(row+offset);
slAddHead(&eqtls, eqtl);
}
slReverse(&eqtls);
sqlFreeResult(&sr);
hFreeConn(&conn);
return eqtls;
}
static char *getGeneDescription(struct sqlConnection *conn, char *geneName)
/* Return description from KnownGenes track */
{
char query[256];
sqlSafef(query, sizeof query,
"SELECT kgXref.description FROM kgXref WHERE geneSymbol='%s'", geneName);
return sqlQuickString(conn, query);
}
static void printMinorAlleleFreq(char *rsId, struct sqlConnection *conn)
/* Print minor allele frequency for a SNP (from UCSC dbSNP table) */
{
#define SNP_COMMON_SUFFIX "Common"
#define MAX_ALLELE_COUNT 10
char *snpTable = hFindLatestSnpTableConn(conn, SNP_COMMON_SUFFIX);
if (!snpTable)
return;
char query[256];
sqlSafef(query, sizeof query, "SELECT alleleFreqs FROM %s WHERE name='%s'", snpTable, rsId);
double freqs[MAX_ALLELE_COUNT];
int count = sqlDoubleArray(sqlQuickString(conn, query), freqs, MAX_ALLELE_COUNT);
doubleSort(count, freqs);
printf("
Minor allele frequency (1000 Genomes): %.0f%%\n", 100.0 * freqs[count-2]);
}
static void printGwasCatalogTrait(char *rsId, struct sqlConnection *conn)
/* Print trait/disease for a SNP (from UCSC gwasCatalog table) */
{
char query[256];
sqlSafef(query, sizeof query, "SELECT count(*) FROM gwasCatalog WHERE name='%s'", rsId);
int count = sqlQuickNum(conn, query);
if (count)
{
sqlSafef(query, sizeof query, "SELECT trait FROM gwasCatalog WHERE name='%s' LIMIT 1", rsId);
char *trait = sqlQuickString(conn, query);
printf("
GWAS disease or trait");
if (count > 1)
printf(" (1 of %d)", count);
printf(": %s "
"GWAS Catalog\n", trait, rsId);
}
}
static void printEqtlRegion(struct gtexEqtlCluster *eqtl, char *table, struct sqlConnection *conn)
/* Print position of region encompassing all identified eQTL's for this gene */
{
#define FLANK 1000
char query[256];
sqlSafef(query, sizeof query, "SELECT MIN(chromStart) from %s WHERE target='%s'",
table, eqtl->target);
int start = sqlQuickNum(conn, query) - FLANK;
sqlSafef(query, sizeof query, "SELECT MAX(chromEnd) from %s WHERE target='%s'",
table, eqtl->target);
int end = sqlQuickNum(conn, query) + FLANK;
char posLink[1024];
safef(posLink, sizeof posLink,"%s:%d-%d",
hgTracksPathAndSettings(), database,
eqtl->chrom, start+1, end,
eqtl->chrom, start+1, end);
printf("
Region containing eQTLs for this gene: %s (%d bp, including +-%dbp flank)\n",
posLink, end-start, FLANK);
}
static void printClusterDetails(struct gtexEqtlCluster *eqtl, char *table)
/* Print details of an eQTL cluster */
{
webNewSection("eQTL Cluster Details");
char *version = gtexVersion(table);
struct gtexTissue *tissues = gtexGetTissues(version);
struct hash *tissueHash = hashNew(0);
struct gtexTissue *tis = NULL;
for (tis = tissues; tis != NULL; tis = tis->next)
hashAdd(tissueHash, tis->name, tis);
printf("
Tissue | Effect (FPKM) | P-Value (-log10) | Probability | |
---|---|---|---|---|
%s | %s%0.2f | %0.2f | %0.2f |