\n");
for (i=0; i < varCount; i++)
{
checked[i] = cartUsualBoolean(cart, vars[i], defaults[i]);
if (i % SNP125_FILTER_COLUMNS == 0)
{
if (i > 0)
printf("\n");
printf("
\n");
}
void cartSetStringArray(struct cart *cart, char *vars[], char *defaults[],
int varCount)
/* Given parallel arrays of variable names and default values, set those
* cart variables to the default values. If a NULL is encountered in
* vars[], assume vars[] is NULL-terminated even if varCount has not
* been reached. */
{
if (vars == NULL)
return;
int i;
for (i = 0; i < varCount; i++)
{
if (vars[i] == NULL)
break;
cartSetString(cart, vars[i], defaults[i]);
}
}
void snp125Ui(struct trackDb *tdb)
/* UI for dbSNP version 125 and later. */
{
char autoSubmit[2048];
char *orthoTable = snp125OrthoTable(tdb, NULL);
int version = snpVersion(tdb->track);
if (version < 130)
snp125ValidLabelsSize--; // no by-1000genomes
if (isNotEmpty(orthoTable) && hTableExists(database, orthoTable))
{
snp125ExtendedNames = cartUsualBoolean(cart, "snp125ExtendedNames", FALSE);
printf(" Include Chimp state and observed human alleles in name: ");
cgiMakeCheckBox("snp125ExtendedNames",snp125ExtendedNames);
printf(" (If enabled, chimp allele is displayed first, then '>', then human alleles). ");
printf(" \n");
}
snp125OfferGeneTracksForFunction(tdb);
snp125AvHetCutoff = atof(cartUsualString(cart, "snp125AvHetCutoff", "0"));
printf(" Minimum Average Heterozygosity: ");
cgiMakeDoubleVar("snp125AvHetCutoff",snp125AvHetCutoff,6);
snp125WeightCutoff = atoi(cartUsualString(cart, "snp125WeightCutoff", "3"));
printf(" Maximum Weight: ");
cgiMakeIntVar("snp125WeightCutoff",snp125WeightCutoff,4);
printf(" SNPs with higher weights are less reliable
\n");
hFreeConn(&conn);
}
void cbrWabaUi(struct trackDb *tdb)
/* Put up UI cbrWaba. */
{
/* This link is disabled in the external browser
char *cbrWabaFilter = cartUsualString(cart, "cbrWaba.filter", "red");
char *cbrWabaMap = cartUsualString(cart, "cbrWaba.type", fcoeEnumToString(0));
int start = cartInt(cart, "cbrWaba.start");
int end = cartInt(cart, "cbrWaba.end");
printf(
"
Filter by chromosome (e.g. chr10): ");
snprintf(filterVar, sizeof(filterVar), "%s.chromFilter", tdb->track);
filterSetting = cartUsualString(cart, filterVar, filterVal);
cgiMakeTextVar(filterVar, cartUsualString(cart, filterVar, ""), 15);
}
void crossSpeciesUi(struct trackDb *tdb)
/* Put up UI for selecting rainbow chromosome color or intensity score. */
{
char colorVar[256];
char *colorSetting;
/* initial value of chromosome coloring option is "on", unless
* overridden by the colorChromDefault setting in the track */
char *colorDefault = trackDbSettingOrDefault(tdb, "colorChromDefault", "on");
printf("
Color track based on chromosome: ");
snprintf(colorVar, sizeof(colorVar), "%s.color", tdb->track);
colorSetting = cartUsualString(cart, colorVar, colorDefault);
cgiMakeRadioButton(colorVar, "on", sameString(colorSetting, "on"));
printf(" on ");
cgiMakeRadioButton(colorVar, "off", sameString(colorSetting, "off"));
printf(" off ");
printf("
");
filterByChrom(tdb);
}
void transRegCodeUi(struct trackDb *tdb)
/* Put up UI for transcriptional regulatory code - not
* much more than score UI. */
{
printf("%s",
"
The scoring ranges from 0 to 1000 and is based on the number of lines "
"of evidence that support the motif being active. Each of the two "
"sensu stricto species in which the motif was conserved counts "
"as a line of evidence. If the ChIP-chip data showed good (P ≤ 0.001) "
"evidence of binding to the transcription factor associated with the "
"motif, that counts as two lines of evidence. If the ChIP-chip data "
"showed weaker (P ≤ 0.005) evidence of binding, that counts as just one line "
"of evidence. The following table shows the relationship between lines "
"of evidence and score:");
printf("
");
hTableStart();
printf("%s",
"
\n"
"
Evidence
Score
\n"
"
4
1000
\n"
"
3
500
\n"
"
2
333
\n"
"
1
250
\n"
"
0
200
\n"
"
\n"
);
hTableEnd();
}
void zooWiggleUi(struct trackDb *tdb )
/* put up UI for zoo track with one species on each line
* and checkboxes to toggle each of them on/off*/
{
char options[7][256];
int thisHeightPer, thisLineGap;
float thisMinYRange, thisMaxYRange;
char *interpolate, *fill;
char **row;
int rowOffset;
struct sample *sample;
struct sqlResult *sr;
char option[64];
struct sqlConnection *conn = hAllocConn(database);
char newRow = 0;
snprintf( &options[0][0], 256, "%s.heightPer", tdb->track );
snprintf( &options[1][0], 256, "%s.linear.interp", tdb->track );
snprintf( &options[3][0], 256, "%s.fill", tdb->track );
snprintf( &options[4][0], 256, "%s.min.cutoff", tdb->track );
snprintf( &options[5][0], 256, "%s.max.cutoff", tdb->track );
snprintf( &options[6][0], 256, "%s.interp.gap", tdb->track );
thisHeightPer = atoi(cartUsualString(cart, &options[0][0], "50"));
interpolate = cartUsualString(cart, &options[1][0], "Linear Interpolation");
fill = cartUsualString(cart, &options[3][0], "1");
thisMinYRange = atof(cartUsualString(cart, &options[4][0], "0.0"));
thisMaxYRange = atof(cartUsualString(cart, &options[5][0], "1000.0"));
thisLineGap = atoi(cartUsualString(cart, &options[6][0], "200"));
printf("
Maximum Interval to Interpolate Across: ");
cgiMakeIntVar(&options[6][0], thisLineGap, 10 );
printf(" bases");
}
}
void affyTranscriptomeUi(struct trackDb *tdb)
/* put up UI for the GC percent track (a sample track)*/
{
int affyTranscriptomeHeightPer = atoi(cartUsualString(cart, "affyTranscriptome.heightPer", "100"));
char *fill = cartUsualString(cart, "affyTranscriptome.fill", "1");
printf("
");
printf(" Fill Blocks: ");
cgiMakeRadioButton("affyTranscriptome.fill", "1", sameString(fill, "1"));
printf(" on ");
cgiMakeRadioButton("affyTranscriptome.fill", "0", sameString(fill, "0"));
printf(" off ");
printf("
Track Height: ");
cgiMakeIntVar("affyTranscriptome.heightPer", affyTranscriptomeHeightPer, 5 );
printf(" pixels");
}
void ancientRUi(struct trackDb *tdb)
/* put up UI for the ancient repeats track to let user enter an
* integer to filter out those repeats with less aligned bases.*/
{
int ancientRMinLength = atoi(cartUsualString(cart, "ancientR.minLength", "50"));
printf("
Length Filter Exclude aligned repeats with less than ");
cgiMakeIntVar("ancientR.minLength", ancientRMinLength, 4 );
printf("aligned bases (not necessarily identical). Enter 0 for no filtering.");
}
void affyTransfragUi(struct trackDb *tdb)
/* Options for filtering affymetrix transfrag track based on score. */
{
boolean skipPseudos = cartUsualBoolean(cart, "affyTransfrags.skipPseudos", TRUE);
boolean skipDups = cartUsualBoolean(cart, "affyTransfrags.skipDups", FALSE);
printf(" ");
cgiMakeCheckBox("affyTransfrags.skipPseudos", skipPseudos);
printf(" Remove transfrags that overlap pseudogenes from display. ");
cgiMakeCheckBox("affyTransfrags.skipDups", skipDups);
printf(" Remove transfrags that have a BLAT match elsewhere in the genome from display. ");
}
void ucsfdemoUi(struct trackDb *tdb)
{
char **menu;
int menuSize = 0;
int menuPos = 0;
puts(" ER filter: ");
menuSize = 3;
menu = needMem((size_t)(menuSize * sizeof(char *)));
menuPos = 0;
menu[menuPos++] = "no filter";
menu[menuPos++] = "pos";
menu[menuPos++] = "neg";
cgiMakeDropList(UCSF_DEMO_ER, menu, menuSize,
cartCgiUsualString(cart, UCSF_DEMO_ER, UCSF_DEMO_ER_DEFAULT));
freez(&menu);
puts(" PR filter: ");
menuSize = 3;
menu = needMem((size_t)(menuSize * sizeof(char *)));
menuPos = 0;
menu[menuPos++] = "no filter";
menu[menuPos++] = "pos";
menu[menuPos++] = "neg";
cgiMakeDropList(UCSF_DEMO_PR, menu, menuSize,
cartCgiUsualString(cart, UCSF_DEMO_PR, UCSF_DEMO_PR_DEFAULT));
freez(&menu);
}
void hapmapSnpsUi(struct trackDb *tdb)
/* Options for filtering hapmap snps */
/* Default is always to not filter (include all data) */
/* snp track puts the menu options in kent/src/hg/lib/snp125Ui.h */
/* snp track also sets global variables, don't actually need this? */
/* Consider using radio buttons */
{
struct sqlConnection *conn = hAllocConn(database);
boolean isPhaseIII = sameString(trackDbSettingOrDefault(tdb, "hapmapPhase", "II"), "III");
if ((isPhaseIII && !sqlTableExists(conn, "hapmapPhaseIIISummary")) ||
(!isPhaseIII & !sqlTableExists(conn, "hapmapAllelesSummary")))
return;
puts("
");
puts("Display filters (applied to all subtracks):");
puts(" \n");
puts(" Population availability: ");
static char *popAvailMenuPhaseIII[] =
{ "no filter",
"all 11 Phase III populations",
"all 4 Phase II populations" };
static char *popAvailMenuPhaseII[] =
{ "no filter",
"all 4 populations",
"1-3 populations" };
char **menu = isPhaseIII ? popAvailMenuPhaseIII : popAvailMenuPhaseII;
cgiMakeDropList(HAP_POP_COUNT, menu, 3,
cartUsualString(cart, HAP_POP_COUNT, HAP_FILTER_DEFAULT));
puts(" Major allele mixture between populations: ");
static char *mixedMenu[] = { "no filter", "mixed", "not mixed" };
cgiMakeDropList(HAP_POP_MIXED, mixedMenu, 3,
cartUsualString(cart, HAP_POP_MIXED, HAP_FILTER_DEFAULT));
puts(" Monomorphism: ");
static char *noYesNoMenu[] = { "no filter", "yes", "no" };
char **pops = isPhaseIII ? hapmapPhaseIIIPops : hapmapPhaseIIPops;
int popCount = isPhaseIII ? HAP_PHASEIII_POPCOUNT : HAP_PHASEII_POPCOUNT;
puts("
");
int cellCount = 0, i;
char cartVar[128];
for (i = 0; i < popCount; i++)
{
char table[HDB_MAX_TABLE_STRING];
if (endsWith(tdb->track, "PhaseII"))
safef(table, sizeof(table), "hapmapSnps%sPhaseII", pops[i]);
else
safef(table, sizeof(table), "hapmapSnps%s", pops[i]);
if (sqlTableExists(conn, table))
{
if (cellCount == 0)
puts("
");
}
void specificUi(struct trackDb *tdb, struct customTrack *ct, boolean ajax)
/* Draw track specific parts of UI. */
{
char *track = tdb->track;
if (sameString(track, "stsMap"))
stsMapUi(tdb);
else if (sameString(track, "affyTxnPhase2"))
affyTxnPhase2Ui(tdb);
else if (sameString(track, "cgapSage"))
cgapSageUi(tdb);
else if (sameString(track, "stsMapMouseNew"))
stsMapMouseUi(tdb);
else if (sameString(track, "stsMapRat"))
stsMapRatUi(tdb);
else if (sameString(track, "snpMap"))
snpMapUi(tdb);
else if (sameString(track, "snp"))
snpUi(tdb);
else if (snpVersion(track) >= 125)
snp125Ui(tdb);
else if (sameString(track, "rertyHumanDiversityLd") ||
startsWith("hapmapLd", track) ||
sameString(tdb->type, "ld2"))
ldUi(tdb);
else if (sameString(track, "cbr_waba"))
cbrWabaUi(tdb);
else if (sameString(track, "fishClones"))
fishClonesUi(tdb);
else if (sameString(track, "recombRate"))
recombRateUi(tdb);
else if (sameString(track, "recombRateRat"))
recombRateRatUi(tdb);
else if (sameString(track, "recombRateMouse"))
recombRateMouseUi(tdb);
else if (sameString(track, "cghNci60"))
cghNci60Ui(tdb);
else if (sameString(track, "xenoRefGene"))
refGeneUI(tdb);
else if (startsWith("transMapAln", track))
transMapUI(tdb);
else if (sameString(track, "refGene"))
refGeneUI(tdb);
else if (sameString(track, "knownGene"))
knownGeneUI(tdb);
else if (sameString(track, "omimGene"))
omimGeneUI(tdb);
else if (sameString(track, "hg17Kg"))
hg17KgUI(tdb);
else if (sameString(track, "pseudoGeneLink") || startsWith("retroMrnaInfo", track))
retroGeneUI(tdb);
else if (sameString(track, "ensGeneNonCoding"))
ensemblNonCodingUI(tdb);
else if (sameString(track, "vegaGeneComposite"))
vegaGeneUI(tdb);
else if (sameString(track, "all_mrna"))
mrnaUi(tdb, FALSE);
else if (sameString(track, "mrna"))
mrnaUi(tdb, FALSE);
else if (sameString(track, "splicesP"))
bedUi(tdb, cart, "", FALSE);
else if(sameString(track,"FantomCageBedForward") || sameString(track,"FantomCageBedReverse") ||
sameString(track,"FantomCageReadForward") || sameString(track,"FantomCageReadReverse"))
bedUi(tdb, cart, "", FALSE);
else if (sameString(track, "all_est"))
mrnaUi(tdb, FALSE);
else if (sameString(track, "est"))
mrnaUi(tdb, FALSE);
else if (sameString(track, "tightMrna"))
mrnaUi(tdb, FALSE);
else if (sameString(track, "tightEst"))
mrnaUi(tdb, FALSE);
else if (sameString(track, "intronEst"))
mrnaUi(tdb, FALSE);
else if (sameString(track, "xenoMrna"))
mrnaUi(tdb, TRUE);
else if (sameString(track, "xenoEst"))
mrnaUi(tdb, TRUE);
else if (sameString(track, "rosetta"))
rosettaUi(tdb);
else if (startsWith("blastDm", track))
blastFBUi(tdb);
else if (sameString(track, "blastSacCer1SG"))
blastSGUi(tdb);
else if (sameString(track, "blastHg17KG") || sameString(track, "blastHg16KG")
|| sameString(track, "blastCe3WB") || sameString(track, "blastHg18KG")
|| sameString(track, "blatzHg17KG")|| startsWith("mrnaMap", track)|| startsWith("mrnaXeno", track))
blastUi(tdb);
else if (sameString(track, "hgPcrResult"))
pcrResultUi(tdb);
else if (startsWith("bedGraph", tdb->type) || startsWith("bigWig", tdb->type))
wigCfgUi(cart,tdb,tdb->track,NULL, FALSE);
else if (startsWith("wig", tdb->type))
{
if (startsWith("wigMaf", tdb->type))
wigMafCfgUi(cart, tdb, tdb->track, NULL, FALSE, database);
else
wigCfgUi(cart,tdb,tdb->track, NULL, FALSE);
}
else if (startsWith("chromGraph", tdb->type))
chromGraphUi(tdb);
/* else if (sameString(track, "affyHumanExon")) */
/* affyAllExonUi(tdb); */
else if (sameString(track, "ancientR"))
ancientRUi(tdb);
else if (sameString(track, "zoo") || sameString(track, "zooNew" ))
zooWiggleUi(tdb);
else if (sameString(track, "humMusL") ||
sameString( track, "musHumL") ||
sameString( track, "regpotent") ||
sameString( track, "mm3Rn2L" ) ||
sameString( track, "mm3Hg15L" ) ||
sameString( track, "hg15Mm3L" ))
humMusUi(tdb,7);
/* NOTE: type psl xeno tracks use crossSpeciesUi, so
* add explicitly here only if track has another type (bed, chain).
* For crossSpeciesUi, the
* default for chrom coloring is "on", unless track setting
* colorChromDefault is set to "off" */
else if (startsWith("net", track))
netAlignCfgUi(database, cart, tdb, tdb->track, NULL, FALSE);
else if (startsWith("chain", track) || endsWith("chainSelf", track))
chainColorUi(tdb);
else if (sameString(track, "orthoTop4"))
/* still used ?? */
crossSpeciesUi(tdb);
else if (sameString(track, "mouseOrtho"))
crossSpeciesUi(tdb);
else if (sameString(track, "mouseSyn"))
crossSpeciesUi(tdb);
else if (sameString(track, "affyTranscriptome"))
affyTranscriptomeUi(tdb);
else if (startsWith("sample", tdb->type))
genericWiggleUi(tdb,7);
else if (sameString(track, WIKI_TRACK_TABLE))
wikiTrackUi(tdb);
else if (sameString(track, RULER_TRACK_NAME))
rulerUi(tdb);
else if (sameString(track, OLIGO_MATCH_TRACK_NAME))
oligoMatchUi(tdb);
else if (sameString(track, CUTTERS_TRACK_NAME))
cutterUi(tdb);
else if(sameString(track, "affyTransfrags"))
affyTransfragUi(tdb);
else if (sameString(track, "gvPos"))
gvUi(tdb);
else if (sameString(track, "oreganno"))
oregannoUi(tdb);
else if (startsWith("retroposons", track))
retroposonsUi(tdb);
else if (sameString(track, "tfbsConsSites"))
tfbsConsSitesUi(tdb);
else if (sameString(track, "CGHBreastCancerUCSF"))
ucsfdemoUi(tdb);
else if (startsWith("hapmapSnps", track))
hapmapSnpsUi(tdb);
else if (sameString(track, "switchDbTss"))
switchDbScoreUi(tdb);
else if (sameString(track, "dgv") || (startsWith("dgvV", track) && isdigit(track[4])))
dgvUi(tdb);
#ifdef USE_BAM
else if (sameString(tdb->type, "bam"))
bamCfgUi(cart, tdb, track, NULL, FALSE); // tim would like to see this boxed when at composite level: tdbIsComposite(tdb));
#endif
else if (tdb->type != NULL)
{
/* handle all tracks with type genePred or bed or "psl xeno " */
char *typeLine = cloneString(tdb->type);
char *words[8];
int wordCount = 0;
wordCount = chopLine(typeLine, words);
if (wordCount > 0)
{
if (sameWord(words[0], "genePred"))
{
genePredCfgUi(cart,tdb,tdb->track,NULL,FALSE);
}
else if(sameWord(words[0], "encodePeak") || sameWord(words[0], "narrowPeak")
|| sameWord(words[0], "broadPeak") || sameWord(words[0], "gappedPeak"))
{
encodePeakUi(tdb, ct);
}
else if (sameWord(words[0], "expRatio"))
{
expRatioUi(tdb);
}
else if (sameWord(words[0], "array")) /* not quite the same as an "expRatio" type (custom tracks) */
{
expRatioCtUi(tdb);
}
/* if bed has score then show optional filter based on score */
else if (sameWord(words[0], "bed") && wordCount == 3)
{
/* Note: jaxQTL3 is a bed 8 format track because of
thickStart/thickStart, but there is no valid score.
Similarly, the score field for wgRna track is no long used either.
It originally was usd to depict different RNA types. But the new
wgRna table has a new field 'type', which is used to store RNA
type info and from which to determine the display color of each entry.
*/
int bedFieldCount = atoi(words[1]);
if ((bedFieldCount >= 5 || trackDbSetting(tdb, "scoreMin") != NULL)
&& !sameString(track, "jaxQTL3") && !sameString(track, "wgRna")
&& !startsWith("encodeGencodeIntron", track))
{
if (trackDbSetting(tdb, "scoreFilterMax"))
scoreCfgUi(database, cart,tdb,tdb->track,NULL,
sqlUnsigned(trackDbSetting(tdb, "scoreFilterMax")),FALSE);
else
scoreCfgUi(database, cart,tdb,tdb->track,NULL,1000,FALSE);
}
}
else if (sameWord(words[0], "bed5FloatScore") || sameWord(words[0], "bed5FloatScoreWithFdr"))
scoreCfgUi(database, cart,tdb,tdb->track,NULL,1000,FALSE);
else if (sameWord(words[0], "psl"))
{
if (wordCount == 3)
if (sameWord(words[1], "xeno"))
crossSpeciesUi(tdb);
baseColorDrawOptDropDown(cart, tdb);
indelShowOptions(cart, tdb);
}
else if (sameWord(words[0], "factorSource"))
{
printf(" Cell Abbreviations: \n");
char *sourceTable = trackDbRequiredSetting(tdb, "sourceTable");
struct sqlConnection *conn = hAllocConn(database);
hPrintAbbreviationTable(conn, sourceTable, "Cell Type");
hFreeConn(&conn);
}
}
freeMem(typeLine);
}
if (tdbIsSuperTrack(tdb))
{
superTrackUi(tdb);
}
else if (tdbIsComposite(tdb)) // for the moment generalizing this to include other containers...
{
hCompositeUi(database, cart, tdb, NULL, NULL, MAIN_FORM, trackHash);
}
if (!ajax)
extraUiLinks(database,tdb, trackHash);
}
void trackUi(struct trackDb *tdb, struct customTrack *ct, boolean ajax)
/* Put up track-specific user interface. */
{
if (!ajax)
{
jsIncludeFile("jquery.js", NULL);
printf("\n");
jsIncludeFile("jquery-ui.js", NULL);
jsIncludeFile("utils.js",NULL);
}
#define RESET_TO_DEFAULTS "defaults"
char setting[128];
// NOTE: Currently only composite multi-view tracks because
// reset relies upon all cart vars following naming convention:
// {track}.{varName}... ( One exception supported: {track}_sel ).
if (trackDbLocalSetting(tdb, "container"))
{
/* For the moment, be a composite... */
tdbMarkAsComposite(tdb);
}
if (ajax && cartOptionalString(cart, "descriptionOnly"))
{
//struct trackDb *tdbParent = tdbFillInAncestry(cartString(cart, "db"),tdb);
if (tdb->html != NULL && tdb->html[0] != 0)
puts(tdb->html);
else
{
struct trackDb *tdbParent = tdb->parent;
for (;tdbParent && (tdbParent->html == NULL || tdbParent->html[0] == 0); tdbParent = tdbParent->parent )
; // Get the first parent that has html
if (tdbParent != NULL && tdbParent->html != NULL && tdbParent->html[0])
{
printf("
",tdbParent?tdbParent->track:tdb->track);
}
cartRemove(cart,"descriptionOnly"); // This is a once only request and should be deleted
return;
}
if(tdbIsContainer(tdb))
{
safef(setting,sizeof(setting),"%s.%s",tdb->track,RESET_TO_DEFAULTS);
// NOTE: if you want track vis to not be reset, move to after vis dropdown
if (1 == cartUsualInt(cart, setting, 0))
cartRemoveAllForTdbAndChildren(cart,tdb);
else if (!ajax) // Overkill on !ajax, because ajax shouldn't be called for a composite
cartTdbTreeMatchSubtrackVis(cart,tdb);
}
printf("");
if (ct)
{
/* hidden form for custom tracks CGI */
printf("\n");
}
if (ajax)
return;
if (!ct)
{
/* Print data version trackDB setting, if any */
char *version = trackDbSetting(tdb, "dataVersion");
if (version)
printf("Data version: %s \n", version);
/* Print lift information from trackDb, if any */
trackDbPrintOrigAssembly(tdb, database);
if (hTableOrSplitExists(database, tdb->table))
{
/* Print update time of the table (or one of the components if split) */
char *tableName = hTableForTrack(database, tdb->table);
struct sqlConnection *conn = hAllocConnProfile(getTrackProfileName(tdb), database);
char *date = firstWordInLine(sqlTableUpdate(conn, tableName));
if (date != NULL && !startsWith("wigMaf", tdb->type))
printf("Data last updated: %s \n", date);
hFreeConn(&conn);
}
}
if (tdb->html != NULL && tdb->html[0] != 0)
{
htmlHorizontalLine();
// include anchor for Description link
puts("");
printf("
");
puts(tdb->html);
printf("
");
makeTopLink(tdb);
printf(" 
");
makeTopLink(tdb);
printf(" 
");
}
} /* void trackUi(struct trackDb *tdb) */
struct trackDb *trackDbForPseudoTrack(char *tableName, char *shortLabel,
char *longLabel, int defaultVis, boolean canPack)
/* Create trackDb for a track without a corresponding table. */
{
struct trackDb *tdb;
AllocVar(tdb);
tdb->track = tableName;
tdb->table = tableName;
tdb->shortLabel = shortLabel;
tdb->longLabel = longLabel;
tdb->visibility = defaultVis;
tdb->priority = 1.0;
tdb->html = hFileContentsOrWarning(hHelpFile(tableName));
tdb->type = "none";
tdb->grp = "map";
tdb->canPack = canPack;
return tdb;
}
struct trackDb *trackDbForWikiTrack()
/* Create a trackDb entry for the wikiTrack.
It is not a real track, so doesn't appear in trackDb */
{
return trackDbForPseudoTrack(WIKI_TRACK_TABLE,
WIKI_TRACK_LABEL, WIKI_TRACK_LONGLABEL, tvFull, FALSE);
}
struct trackDb *trackDbForRuler()
/* Create a trackDb entry for the base position ruler.
It is not (yet?) a real track, so doesn't appear in trackDb */
{
return trackDbForPseudoTrack(RULER_TRACK_NAME,
RULER_TRACK_LABEL, RULER_TRACK_LONGLABEL, tvFull, FALSE);
}
struct trackDb *trackDbForOligoMatch()
/* Create a trackDb entry for the oligo matcher pseudo-track. */
{
return trackDbForPseudoTrack(OLIGO_MATCH_TRACK_NAME,
OLIGO_MATCH_TRACK_LABEL, OLIGO_MATCH_TRACK_LONGLABEL, tvHide, TRUE);
}
void doMiddle(struct cart *theCart)
/* Write body of web page. */
{
struct trackDb *tdb = NULL;
char *track;
struct customTrack *ct = NULL, *ctList = NULL;
char *ignored;
cart = theCart;
track = cartString(cart, "g");
getDbAndGenome(cart, &database, &ignored, NULL);
chromosome = cartUsualString(cart, "c", hDefaultChrom(database));
trackHash = makeTrackHash(database, chromosome);
if (sameWord(track, WIKI_TRACK_TABLE))
tdb = trackDbForWikiTrack();
else if (sameWord(track, RULER_TRACK_NAME))
/* special handling -- it's not a full-fledged track */
tdb = trackDbForRuler();
else if (sameWord(track, OLIGO_MATCH_TRACK_NAME))
tdb = trackDbForOligoMatch();
else if (sameWord(track, CUTTERS_TRACK_NAME))
tdb = trackDbForPseudoTrack(CUTTERS_TRACK_NAME, CUTTERS_TRACK_LABEL, CUTTERS_TRACK_LONGLABEL, tvHide, TRUE);
else if (isCustomTrack(track))
{
ctList = customTracksParseCart(database, cart, NULL, NULL);
for (ct = ctList; ct != NULL; ct = ct->next)
{
if (sameString(track, ct->tdb->track))
{
tdb = ct->tdb;
break;
}
}
}
else if (sameString(track, "hgPcrResult"))
tdb = pcrResultFakeTdb();
else
{
tdb = hTrackDbForTrack(database, track);
}
if (tdb == NULL)
{
uglyAbort("Can't find %s in track database %s chromosome %s. TrackHash has %d els",
track, database, chromosome, trackHash->elCount);
errAbort("Can't find %s in track database %s chromosome %s",
track, database, chromosome);
}
char *super = trackDbGetSupertrackName(tdb);
if (super)
{
/* configured as a supertrack member in trackDb */
if (tdb->parent)
{
/* the supertrack is also configured, so use supertrack defaults */
tdbMarkAsSuperTrack(tdb->parent);
trackDbSuperMemberSettings(tdb);
}
}
char *title = (tdbIsSuper(tdb) ? "Super-track Settings" : "Track Settings");
if(cartOptionalString(cart, "ajax"))
{
// html is going to be used w/n a dialog in hgTracks.js so serve up stripped down html
trackUi(tdb, ct, TRUE);
cartRemove(cart,"ajax");
}
else
{
cartWebStart(cart, database, "%s %s", tdb->shortLabel, title);
trackUi(tdb, ct, FALSE);
printf(" \n");
webEnd();
}
}
char *excludeVars[] = { "submit", "Submit", "g", NULL, "ajax", NULL,};
int main(int argc, char *argv[])
/* Process command line. */
{
cgiSpoof(&argc, argv);
htmlSetBackground(hBackgroundImage());
cartEmptyShell(doMiddle, hUserCookie(), excludeVars, NULL);
return 0;
}