393c8a7bb0e4dc56856fcbe514a4aa65914f096b
lrnassar
Wed Feb 12 11:25:50 2020 -0800
Fixing linkout to GTF files on download server refs #24810
diff --git src/hg/hgTables/mainPage.c src/hg/hgTables/mainPage.c
index 9ee309b..9988063 100644
--- src/hg/hgTables/mainPage.c
+++ src/hg/hgTables/mainPage.c
@@ -1,1037 +1,1037 @@
/* mainPage - stuff to put up the first table browser page. */
/* Copyright (C) 2014 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 "htmshell.h"
#include "cheapcgi.h"
#include "cart.h"
#include "cartTrackDb.h"
#include "textOut.h"
#include "jksql.h"
#include "hdb.h"
#include "web.h"
#include "jsHelper.h"
#include "hui.h"
#include "hgColors.h"
#include "trackDb.h"
#include "grp.h"
#include "hgTables.h"
#include "joiner.h"
#include "trackDb.h"
#include "hubConnect.h"
#include "trackHub.h"
#include "hgConfig.h"
static struct dyString *onChangeStart()
/* Start up a javascript onChange command */
{
struct dyString *dy = jsOnChangeStart();
jsDropDownCarryOver(dy, hgtaTrack);
jsDropDownCarryOver(dy, hgtaGroup);
jsTrackedVarCarryOver(dy, hgtaRegionType, "regionType");
jsTextCarryOver(dy, hgtaRange);
jsDropDownCarryOver(dy, hgtaOutputType);
jsTextCarryOver(dy, hgtaOutFileName);
return dy;
}
static char *onChangeClade()
/* Return javascript executed when they change clade. */
{
struct dyString *dy = onChangeStart();
jsDropDownCarryOver(dy, "clade");
jsDropDownCarryOver(dy, hgtaTable);
dyStringAppend(dy, " document.hiddenForm.org.value=0;");
dyStringAppend(dy, " document.hiddenForm.db.value=0;");
dyStringAppend(dy, " document.hiddenForm.position.value='';");
return jsOnChangeEnd(&dy);
}
static char *onChangeOrg()
/* Return javascript executed when they change organism. */
{
struct dyString *dy = onChangeStart();
jsDropDownCarryOver(dy, "clade");
jsDropDownCarryOver(dy, "org");
jsDropDownCarryOver(dy, hgtaTable);
dyStringAppend(dy, " document.hiddenForm.db.value=0;");
dyStringAppend(dy, " document.hiddenForm.position.value='';");
return jsOnChangeEnd(&dy);
}
static char *onChangeDb()
/* Return javascript executed when they change database. */
{
struct dyString *dy = onChangeStart();
jsDropDownCarryOver(dy, "clade");
jsDropDownCarryOver(dy, "db");
jsDropDownCarryOver(dy, hgtaTable);
dyStringAppend(dy, " document.hiddenForm.position.value='';");
return jsOnChangeEnd(&dy);
}
static char *onChangeGroupOrTrack()
/* Return javascript executed when they change group. */
{
struct dyString *dy = onChangeStart();
jsDropDownCarryOver(dy, "clade");
jsDropDownCarryOver(dy, "db");
jsDropDownCarryOver(dy, "org");
dyStringPrintf(dy, " document.hiddenForm.%s.value=0;", hgtaTable);
return jsOnChangeEnd(&dy);
}
static char *onChangeTable()
/* Return javascript executed when they change group. */
{
struct dyString *dy = onChangeStart();
jsDropDownCarryOver(dy, "clade");
jsDropDownCarryOver(dy, "db");
jsDropDownCarryOver(dy, "org");
jsDropDownCarryOver(dy, hgtaTable);
return jsOnChangeEnd(&dy);
}
void makeRegionButtonExtraHtml(char *val, char *selVal, char *extraHtml)
/* Make region radio button including a little Javascript to save selection state
* and optional extra html attributes. */
{
jsMakeTrackingRadioButtonExtraHtml(hgtaRegionType, "regionType", val, selVal, extraHtml);
}
void makeRegionButton(char *val, char *selVal)
/* Make region radio button including a little Javascript
* to save selection state. */
{
makeRegionButtonExtraHtml(val, selVal, NULL);
}
struct grp *showGroupField(char *groupVar, char *event, char *groupScript,
struct sqlConnection *conn, boolean allTablesOk)
/* Show group control. Returns selected group. */
{
struct grp *group, *groupList = fullGroupList;
struct grp *selGroup = findSelectedGroup(groupList, groupVar);
hPrintf("group:\n");
hPrintf("\n");
return selGroup;
}
static void addIfExists(struct hash *hash, struct slName **pList, char *name)
/* Add name to tail of list if it exists in hash. */
{
if (hashLookup(hash, name))
slNameAddTail(pList, name);
}
struct slName *getDbListForGenome()
/* Get list of selectable databases. */
{
struct hash *hash = sqlHashOfDatabases();
struct slName *dbList = NULL;
addIfExists(hash, &dbList, database);
addIfExists(hash, &dbList, "uniProt");
addIfExists(hash, &dbList, "proteome");
addIfExists(hash, &dbList, "go");
addIfExists(hash, &dbList, "hgFixed");
addIfExists(hash, &dbList, "visiGene");
addIfExists(hash, &dbList, "ultra");
return dbList;
}
char *findSelDb()
/* Find user selected database (as opposed to genome database). */
{
struct slName *dbList = getDbListForGenome();
char *selDb = cartUsualString(cart, hgtaTrack, NULL);
if (!slNameInList(dbList, selDb))
selDb = cloneString(dbList->name);
slFreeList(&dbList);
return selDb;
}
struct trackDb *showTrackField(struct grp *selGroup, char *trackVar, char *event, char *trackScript,
boolean disableNoGenome)
/* Show track control. Returns selected track. */
{
struct trackDb *track, *selTrack = NULL;
if (trackScript == NULL)
trackScript = "";
if (sameString(selGroup->name, "allTables"))
{
char *selDb = findSelDb();
struct slName *dbList = getDbListForGenome(), *db;
hPrintf("database:\n");
hPrintf("\n");
}
else
{
boolean allTracks = sameString(selGroup->name, "allTracks");
hPrintf("track:\n");
hPrintf("\n");
}
hPrintf("\n");
return selTrack;
}
char *unsplitTableName(char *table)
/* Convert chr*_name to name */
{
if (startsWith("chr", table))
{
char *s = strrchr(table, '_');
if (s != NULL)
{
table = s + 1;
}
}
return table;
}
struct slName *tablesForDb(char *db)
/* Find tables associated with database. */
{
boolean isGenomeDb = sameString(db, database);
struct sqlConnection *conn = hAllocConn(db);
struct slName *raw, *rawList = sqlListTables(conn);
struct slName *cooked, *cookedList = NULL;
struct hash *uniqHash = newHash(0);
hFreeConn(&conn);
for (raw = rawList; raw != NULL; raw = raw->next)
{
if (cartTrackDbIsAccessDenied(db, raw->name))
continue;
if (isGenomeDb)
{
/* Deal with tables split across chromosomes. */
char *root = unsplitTableName(raw->name);
if (cartTrackDbIsAccessDenied(db, root))
continue;
if (!hashLookup(uniqHash, root))
{
hashAdd(uniqHash, root, NULL);
cooked = slNameNew(root);
slAddHead(&cookedList, cooked);
}
}
else
{
char dbTable[256];
safef(dbTable, sizeof(dbTable), "%s.%s", db, raw->name);
cooked = slNameNew(dbTable);
slAddHead(&cookedList, cooked);
}
}
hashFree(&uniqHash);
slFreeList(&rawList);
slSort(&cookedList, slNameCmp);
return cookedList;
}
char *showTableField(struct trackDb *track, char *varName, boolean useJoiner)
/* Show table control and label. */
{
struct slName *name, *nameList = NULL;
char *selTable;
if (track == NULL)
nameList = tablesForDb(findSelDb());
else
nameList = cartTrackDbTablesForTrack(database, track, useJoiner);
/* Get currently selected table. If it isn't in our list
* then revert to first in list. */
selTable = cartUsualString(cart, varName, nameList->name);
if (!slNameInListUseCase(nameList, selTable))
selTable = nameList->name;
/* Print out label and drop-down list. */
hPrintf("table: ");
hPrintf("\n");
if (!trackHubDatabase(database))
{
char *restrictDate = encodeRestrictionDateDisplay(database,selTdb);
if (restrictDate)
{
hPrintf("restricted until: %s",
ENCODE_DATA_RELEASE_POLICY, restrictDate);
freeMem(restrictDate);
}
}
return selTable;
}
struct outputType
/* Info on an output type. */
{
struct outputType *next;
char *name; /* Symbolic name of type. */
char *label; /* User visible label. */
};
static void showOutDropDown(struct outputType *otList, struct outputType *otDefault)
/* Display output drop-down. */
{
struct outputType *ot;
char *outputType = cartUsualString(cart, hgtaOutputType, otList->name);
if (otDefault != NULL && otDefault != otList)
{
boolean otInOtList = FALSE;
for (ot = otList; ot != NULL; ot = ot->next)
if (sameString(ot->name, outputType))
{
otInOtList = TRUE;
break;
}
if (! otInOtList)
outputType = otDefault->name;
}
hPrintf("\n");
hPrintf(" ");
hPrintf("
"
"Note: Table Browser GTF files contain transcripts, but no gene identifiers or symbols. "
"If you are looking for fully formatted "
"gene model files for use in genome analysis pipelines, check the "
- "bigZips/genes "
+ "bigZips/genes "
"directory on our download server.
\n");
}
if (curTrack == NULL)
{
struct trackDb *tdb = hTrackDbForTrack(database, curTable);
struct trackDb *cTdb = hCompositeTrackDbForSubtrack(database, tdb);
if (cTdb)
curTrack = cTdb;
else
curTrack = tdb;
isMaf = isMafTable(database, curTrack, curTable);
}
/* Table-specific options */
if (isHicTable(curTable))
hicMainPageConfig(cart, hTrackDbForTrack(database,curTable));
/* Region line */
{
char *regionType;
if (cartVarExists(cart, "hgFind.matches")) // coming back from a search
regionType = cartUsualString(cart, hgtaRegionType, hgtaRegionTypeRange);
else
regionType = cartUsualString(cart, hgtaRegionType, hgtaRegionTypeGenome);
char *range = cartUsualString(cart, hgtaRange, "");
if (isPositional)
{
boolean doEncode = FALSE;
if (!trackHubDatabase(database))
doEncode = sqlTableExists(conn, "encodeRegions");
hPrintf("
region:\n");
/* If regionType not allowed force it to "genome". */
if ((sameString(regionType, hgtaRegionTypeUserRegions) &&
userRegionsFileName() == NULL) ||
(sameString(regionType, hgtaRegionTypeEncode) && !doEncode))
regionType = hgtaRegionTypeGenome;
// Is "genome" is not allowed because of tdb 'tableBrowser noGenome'?
boolean disableGenome = ((curTrack && cartTrackDbIsNoGenome(database, curTrack->table)) ||
(curTable && cartTrackDbIsNoGenome(database, curTable)));
// If "genome" is selected but not allowed, force it to "range":
if (sameString(regionType, hgtaRegionTypeGenome) && disableGenome)
regionType = hgtaRegionTypeRange;
jsTrackingVar("regionType", regionType);
if (disableGenome)
{
makeRegionButtonExtraHtml(hgtaRegionTypeGenome, regionType, "DISABLED");
hPrintf(" genome (unavailable for selected track)"
" ");
}
else
{
makeRegionButton(hgtaRegionTypeGenome, regionType);
hPrintf(" genome ");
}
if (doEncode)
{
makeRegionButton(hgtaRegionTypeEncode, regionType);
hPrintf(" ENCODE Pilot regions ");
}
makeRegionButton(hgtaRegionTypeRange, regionType);
hPrintf(" position ");
hPrintf("\n",
hgtaRange, hgtaRange, range);
jsOnEventById("focus", hgtaRange,
jsRadioUpdate(hgtaRegionType, "regionType", "range"));
cgiMakeButton(hgtaDoLookupPosition, "lookup");
hPrintf(" ");
if (userRegionsFileName() != NULL)
{
makeRegionButton(hgtaRegionTypeUserRegions, regionType);
hPrintf(" defined regions ");
cgiMakeButton(hgtaDoSetUserRegions, "change");
hPrintf(" ");
cgiMakeButton(hgtaDoClearUserRegions, "clear");
}
else
cgiMakeButton(hgtaDoSetUserRegions, "define regions");
hPrintf("
\n");
}
else
{
/* Need to put at least stubs of cgi variables in for JavaScript to work. */
jsTrackingVar("regionType", regionType);
cgiMakeHiddenVar(hgtaRange, range);
cgiMakeHiddenVar(hgtaRegionType, regionType);
}
/* Select identifiers line (if applicable). */
if (!isWig && getIdField(database, curTrack, curTable, hti) != NULL)
{
hPrintf("
\n");
}
hPrintf("\n");
/* Submit buttons. */
{
hPrintf(" \n");
if (isWig || isBam || isVcf || isLongTabix || isHic)
{
char *name;
extern char *maxOutMenu[];
char *maxOutput = maxOutMenu[0];
if (isCustomTrack(curTable))
name=filterFieldVarName("ct", curTable, "_", filterMaxOutputVar);
else
name=filterFieldVarName(database,curTable, "_",filterMaxOutputVar);
maxOutput = cartUsualString(cart, name, maxOutMenu[0]);
if (isWig)
hPrintf(
"Note: to return more than %s lines, change the filter setting"
" (above). The entire data set may be available for download as"
" a very large file that contains the original data values (not"
" compressed into the wiggle format) -- see the Downloads page."
" ", maxOutput);
else if (isBam || isVcf || isLongTabix || isHic)
hPrintf(
"Note: to return more than %s lines, change the filter setting"
" (above). Please consider downloading the entire data from our Download pages."
" ", maxOutput);
}
else if (anySubtrackMerge(database, curTable) || anyIntersection())
{
hPrintf("Note: The all fields and selected fields output formats "
"are not available when a%s has been specified. ",
canSubtrackMerge ? " subtrack merge or intersection" : "n intersection");
}
cgiMakeButton(hgtaDoTopSubmit, "get output");
hPrintf(" ");
if (isPositional || isWig)
{
cgiMakeButton(hgtaDoSummaryStats, "summary/statistics");
hPrintf(" ");
}
#ifdef SOMETIMES
hPrintf(" ");
cgiMakeButton(hgtaDoTest, "test");
#endif /* SOMETIMES */
}
hPrintf("
"
"To reset all user cart settings (including custom tracks), \n"
"click here.\n",
getScriptName());
}
static char *getGenomeSpaceText()
/* fetch GenomeSpace text if enabled */
{
if (isGenomeSpaceEnabled())
{
return
"Send data to "
"GenomeSpace for use with diverse computational tools. ";
}
else
{
return "";
}
}
void mainPageAfterOpen(struct sqlConnection *conn)
/* Put up main page assuming htmlOpen()/htmlClose()
* will happen in calling routine. */
{
hPrintf(
"Use this program to retrieve the data associated with a track in text "
"format, to calculate intersections between tracks, and to retrieve "
"DNA sequence covered by a track. For help in using this application "
"see Using the Table Browser for a description "
"of the controls in this form, and the "
"User's Guide for "
"general information and sample queries. "
"For more complex queries, you may want to use "
"Galaxy or "
"our public "
"MySQL server. "
"To examine the biological function of your set through annotation "
"enrichments, send the data to "
"GREAT. "
"%s"
"Refer to the "
"Credits page for the list of "
"contributors and usage restrictions associated with these data. "
"All tables can be downloaded in their entirety from the "
"Sequence and Annotation Downloads page."
, getGenomeSpaceText()
);
// When GREAT is selected, disable the other checkboxes and force output to BED
jsInline(
"function onSelectGreat() {\n"
" document.getElementById('checkboxGalaxy').checked=false;\n");
if (isGenomeSpaceEnabled())
jsInline(
" document.getElementById('checkboxGenomeSpace').checked=false;\n");
jsInline(
" document.getElementById('outBed').selected=true;\n"
" return true;\n"
"}\n");
// Disable/enable noGenome tracks depending on whether region is genome.
jsInline(
"function maybeDisableNoGenome() {\n"
" var regionTypeSelected = $('input[name=\"hgta_regionType\"]:checked').val();\n"
" var regionIsGenome = (regionTypeSelected === 'genome');\n"
" var $noGenomeOptions = $('select[name=\"hgta_track\"] option.hgtaNoGenome');\n"
" $noGenomeOptions.attr('disabled', regionIsGenome)\n"
" .css('color', regionIsGenome ? '' : 'black');\n"
"}\n"
"$(document).ready(function() {\n"
// once when the page loads, and every time the user changes the region type:
" maybeDisableNoGenome();\n"
" $('input[name=\"hgta_regionType\"]').change(maybeDisableNoGenome);\n"
"});\n");
/* Main form. */
hPrintf("
\n");
/* Hidden form - for benefit of javascript. */
{
static char *saveVars[] = {
"clade", "org", "db", hgtaGroup, hgtaTrack, hgtaTable, hgtaRegionType,
hgtaRange, hgtaOutputType, hgtaOutFileName};
jsCreateHiddenForm(cart, getScriptName(), saveVars, ArraySize(saveVars));
}
/* Hidden form for jumping to custom tracks CGI. */
hPrintf("\n");
/* Hidden form for jumping to track hub manager CGI. */
hPrintf("\n");
webNewSection("Using the Table Browser\n");
printMainHelp();
cartFlushHubWarnings();
}
void doMainPage(struct sqlConnection *conn)
/* Put up the first page user sees. */
{
htmlOpen("Table Browser");
mainPageAfterOpen(conn);
htmlClose();
}