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("<TT><PRE>");
 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("</TT></PRE>");
 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("<TT><PRE>");
 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("</TT></PRE>");
 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("<TT><PRE>");
 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("</TT></PRE>");
 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("<FORM ACTION=\"../cgi-bin/hgNear\" METHOD=GET>\n");
 cartSaveSession(cart);
 hgSeqOptionsHtiCart(hti, cart);
 hPrintf("<BR>\n");
 cgiMakeButton(getGenomicSeqVarName, "get sequence");
 hPrintf("</FORM>");
 }
 
 void doGetGenomicSeq(struct sqlConnection *conn, struct column *colList,
 	struct genePos *geneList)
 /* Retrieve genomic sequence sequence according to options. */
 {
 char *table = genomeSetting("geneTable");
-struct hTableInfo *hti = hFindTableInfo(database, NULL, table);
+struct hTableInfo *hti = hFindTableInfo(sqlGetDatabase(conn), NULL, table);
 struct genePos *gp;
 char query[256];
 struct sqlResult *sr;
 char **row;
 boolean hasBin = hOffsetPastBin(database, NULL, table);
 makeTitle("Genomic Sequence", NULL);
 
 hPrintf("<TT><PRE>");
 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("</TT></PRE>");
 }
 
 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("<FORM ACTION=\"../cgi-bin/hgNear\" METHOD=GET>\n");
 cartSaveSession(cart);
 hPrintf("Select sequence type:<BR>\n");
 howRadioButton("protein");
 hPrintf("Protein<BR>\n");
 howRadioButton("mRNA");
 hPrintf("mRNA<BR>\n");
 howRadioButton("promoter");
 hPrintf("Promoter including ");
 cgiMakeIntVar(proUpSizeVarName,
 	cartUsualInt(cart, proUpSizeVarName, 1000), 4);
 hPrintf(" bases upstream and ");
 cgiMakeIntVar(proDownSizeVarName,
 	cartUsualInt(cart, proDownSizeVarName, 50), 3);
 hPrintf(" downstream.<BR>\n");
 hPrintf("&nbsp;&nbsp;&nbsp;");
 cgiMakeCheckBox(proIncludeFiveOnly, 
     cartUsualBoolean(cart, proIncludeFiveOnly, TRUE));
 hPrintf("Include only those with annotated 5' UTRs<BR>");
 howRadioButton("genomic");
 hPrintf("Genomic<BR>\n");
 cgiMakeButton(getSeqVarName, "get sequence");
 hPrintf("</FORM>\n");
 }