06d7be056190c14b85e71bc12523f18ea6815b5e
markd
Mon Dec 7 00:50:29 2020 -0800
BLAT mmap index support merge with master
diff --git src/hg/near/hgNear/getSeq.c src/hg/near/hgNear/getSeq.c
index 130556f..d962e3c 100644
--- src/hg/near/hgNear/getSeq.c
+++ src/hg/near/hgNear/getSeq.c
@@ -1,320 +1,320 @@
/* getSeq - pages to get protein and nucleic acid sequence. */
/* Copyright (C) 2013 The Regents of the University of California
* See README in this or parent directory for licensing information. */
#include "common.h"
#include "linefile.h"
#include "hash.h"
#include "obscure.h"
#include "jksql.h"
#include "cart.h"
#include "dnautil.h"
#include "hdb.h"
#include "cheapcgi.h"
#include "hgSeq.h"
#include "hgNear.h"
#include "genePred.h"
#include "bed.h"
static void printNameAndDescription(struct sqlConnection *conn,
struct genePos *gp, struct column *nameCol, struct column *descCol)
/* Look up name and description and print. */
{
char *name = NULL;
char *description = NULL;
if (nameCol != NULL)
name = nameCol->cellVal(nameCol, gp, conn);
if (descCol != NULL)
description = descCol->cellVal(descCol, gp, conn);
if (name != NULL)
hPrintf(" %s", name);
if (description != NULL)
hPrintf(" - %s", description);
freeMem(name);
freeMem(description);
}
static void getSeqFromBlob(struct sqlConnection *conn, struct column *colList,
struct genePos *geneList, char *tableId)
/* Get sequence from blob field in table and print it as fasta. */
{
struct sqlResult *sr;
char **row;
char query[256];
struct genePos *gp;
-struct sqlConnection *conn2 = hAllocConn(database);
+struct sqlConnection *conn2 = hAllocConn(sqlGetDatabase(conn));
char *tableName = genomeSetting(tableId);
struct column *descCol = findNamedColumn("description");
struct column *nameCol = findNamedColumn("name");
hPrintf("");
for (gp = geneList; gp != NULL; gp = gp->next)
{
char *id = gp->name;
sqlSafef(query, sizeof(query),
"select seq from %s where name = '%s'", tableName, id);
sr = sqlGetResult(conn, query);
if ((row = sqlNextRow(sr)) != NULL)
{
char *seq = row[0];
hPrintf(">%s", id);
printNameAndDescription(conn2, gp, nameCol, descCol);
hPrintf("\n");
writeSeqWithBreaks(stdout, seq, strlen(seq), 60);
}
sqlFreeResult(&sr);
}
hPrintf("");
hFreeConn(&conn2);
}
static void getProtein( struct sqlConnection *conn, struct column *colList,
struct genePos *geneList)
/* Print out proteins. */
{
getSeqFromBlob(conn, colList, geneList, "pepTable");
}
void getGeneMrna(struct sqlConnection *conn,
struct column *colList, struct genePos *geneList, char *tableId)
/* Get mRNA sequence for gene from gene prediction. */
{
struct sqlResult *sr;
char **row;
char query[256];
struct genePos *gp;
struct sqlConnection *conn2 = hAllocConn(database);
struct column *descCol = findNamedColumn("description");
struct column *nameCol = findNamedColumn("name");
char *table = genomeSetting(tableId);
boolean hasBin = hOffsetPastBin(database, NULL, table);
hPrintf("");
for (gp = geneList; gp != NULL; gp = gp->next)
{
char *id = gp->name;
sqlSafef(query, sizeof(query),
"select * from %s where name='%s'"
" and chrom='%s' and txStart=%d and txEnd=%d",
table, id, gp->chrom, gp->start, gp->end);
sr = sqlGetResult(conn, query);
while ((row = sqlNextRow(sr)) != NULL)
{
struct genePred *gene = genePredLoad(row+hasBin);
struct bed *bed = bedFromGenePred(gene);
struct dnaSeq *seq = hSeqForBed(database, bed);
hPrintf(">%s (predicted mRNA)", id);
printNameAndDescription(conn2, gp, nameCol, descCol);
hPrintf("\n");
writeSeqWithBreaks(stdout, seq->dna, seq->size, 50);
dnaSeqFree(&seq);
bedFree(&bed);
genePredFree(&gene);
}
sqlFreeResult(&sr);
}
hPrintf("");
hFreeConn(&conn2);
}
static void getMrna(struct sqlConnection *conn, struct column *colList,
struct genePos *geneList)
/* Print out proteins. */
{
if (genomeOptionalSetting("mrnaTable") != NULL)
getSeqFromBlob(conn, colList, geneList, "mrnaTable");
else
getGeneMrna(conn, colList, geneList, "geneTable");
}
static boolean hasUtr5(struct genePred *gp)
/* Return TRUE if it looks like gene has a 5' UTR. */
{
if (gp->strand[0] == '-')
return gp->txEnd != gp->cdsEnd;
else
return gp->txStart != gp->cdsStart;
}
static struct dnaSeq *genePromoSeq(struct genePred *gp,
int upSize, int downSize)
/* Get promoter sequence for gene. */
{
struct dnaSeq *seq;
assert(upSize >= 0 && downSize >= 0);
if (gp->strand[0] == '-')
{
int start = gp->txEnd - downSize;
int end = gp->txEnd + upSize;
seq = hChromSeq(database, gp->chrom, start, end);
reverseComplement(seq->dna, seq->size);
}
else
{
int start = gp->txStart - upSize;
int end = gp->txStart + downSize;
seq = hChromSeq(database, gp->chrom, start, end);
}
return seq;
}
static void getPromoter(struct sqlConnection *conn, struct column *colList,
struct genePos *geneList)
/* Print out promoters. */
{
struct sqlResult *sr;
char **row;
char query[256];
struct genePos *gp;
char *table = genomeSetting("geneTable");
struct sqlConnection *conn2 = hAllocConn(database);
int upSize = cartInt(cart, proUpSizeVarName);
int downSize = cartInt(cart, proDownSizeVarName);
boolean fiveOnly = cartBoolean(cart, proIncludeFiveOnly);
struct column *descCol = findNamedColumn("description");
struct column *nameCol = findNamedColumn("name");
boolean hasBin = hOffsetPastBin(database, NULL, table);
hPrintf("");
for (gp = geneList; gp != NULL; gp = gp->next)
{
char *id = gp->name;
sqlSafef(query, sizeof(query),
"select * from %s where name='%s'"
" and chrom='%s' and txStart=%d and txEnd=%d",
table, id, gp->chrom, gp->start, gp->end);
sr = sqlGetResult(conn, query);
while ((row = sqlNextRow(sr)) != NULL)
{
struct genePred *gene = genePredLoad(row+hasBin);
if (!fiveOnly || hasUtr5(gene))
{
struct dnaSeq *seq = genePromoSeq(gene, upSize, downSize);
hPrintf(">%s (promoter %d %d)", id, upSize, downSize);
printNameAndDescription(conn2, gp, nameCol, descCol);
hPrintf("\n");
writeSeqWithBreaks(stdout, seq->dna, seq->size, 50);
dnaSeqFree(&seq);
}
genePredFree(&gene);
}
}
hPrintf("");
hFreeConn(&conn2);
}
static void getGenomic(struct sqlConnection *conn,
struct column *colList, struct genePos *geneList)
/* Put up dialog to get genomic sequence. */
{
struct hTableInfo *hti = hFindTableInfo(database, NULL, genomeSetting("geneTable"));
makeTitle("Get Genomic Sequence Near Gene", NULL);
hPrintf("
");
for (gp = geneList; gp != NULL; gp = gp->next)
{
char *id = gp->name;
sqlSafef(query, sizeof(query), "select * from %s where name='%s'",
table, id);
sr = sqlGetResult(conn, query);
while ((row = sqlNextRow(sr)) != NULL)
{
struct genePred *gene = genePredLoad(row+hasBin);
struct bed *bed = bedFromGenePred(gene);
hgSeqBed(database, hti, bed);
bedFree(&bed);
genePredFree(&gene);
}
}
hPrintf("");
}
void doGetSeq(struct sqlConnection *conn, struct column *colList,
struct genePos *geneList, char *how)
/* Put up the get sequence page. */
{
if (sameString(how, "protein"))
{
makeTitle("Protein Sequence", NULL);
getProtein(conn, colList, geneList);
}
else if (sameString(how, "mRNA"))
{
makeTitle("mRNA Sequence", NULL);
getMrna(conn, colList, geneList);
}
else if (sameString(how, "promoter"))
{
makeTitle("Promoter Sequence", NULL);
getPromoter(conn, colList, geneList);
}
else if (sameString(how, "genomic"))
{
getGenomic(conn, colList, geneList);
}
else
errAbort("Unrecognized %s value %s", getSeqHowVarName, how);
}
static void howRadioButton(char *how)
/* Put up a getSeqHow radio button. */
{
char *howName = getSeqHowVarName;
char *oldVal = cartUsualString(cart, howName, "protein");
cgiMakeRadioButton(howName, how, sameString(how, oldVal));
}
void doGetSeqPage(struct sqlConnection *conn, struct column *colList)
/* Put up the get sequence page asking how to get sequence. */
{
makeTitle("Get Sequence", NULL);
hPrintf("\n");
}