\n");
boolean foundInCart = FALSE;
struct slName *selectedAttributes = snp125FilterFromCart(cart, track, attributeVar, &foundInCart);
// Include all by default:
if (! foundInCart)
selectedAttributes = slNameListFromStringArray(values, menuSize);
cgiMakeCheckboxGroupWithVals(cartVar, labels, values, menuSize, selectedAttributes,
SNP125_FILTER_COLUMNS);
printf("
\n");
}
static void snp125PrintFilterControlSection(struct trackDb *tdb, int version)
/* Print a collapsible section of filtering controls on SNP properties, first numeric
* and then enum/set. */
{
char cartVar[512];
printf("
\n");
jsBeginCollapsibleSection(cart, tdb->track, "filterByAttribute", "Filtering Options", FALSE);
printf(" \n");
safef(cartVar, sizeof(cartVar), "%s.minAvHet", tdb->track);
double minAvHet = cartUsualDouble(cart, cartVar,
// Check old cart var name:
cartUsualDouble(cart, "snp125AvHetCutoff", SNP125_DEFAULT_MIN_AVHET));
printf("Minimum Average Heterozygosity: ");
cgiMakeDoubleVar(cartVar, minAvHet, 6);
printf(" \n");
safef(cartVar, sizeof(cartVar), "%s.maxWeight", tdb->track);
int defaultMaxWeight = SNP125_DEFAULT_MAX_WEIGHT;
char *setting = trackDbSetting(tdb, "defaultMaxWeight");
if (isNotEmpty(setting))
defaultMaxWeight = atoi(setting);
int maxWeight = cartUsualInt(cart, cartVar,
// Check old cart var name:
cartUsualInt(cart, "snp125WeightCutoff", defaultMaxWeight));
printf("Maximum Weight: ");
cgiMakeIntVar(cartVar, maxWeight, 4);
printf(" Range: 1, 2 or 3; SNPs with higher weights are less reliable \n");
if (version >= 132)
{
printf("Minimum number of distinct "
"Submitters: ");
safef(cartVar, sizeof(cartVar), "%s.minSubmitters", tdb->track);
cgiMakeIntVar(cartVar, cartUsualInt(cart, cartVar, SNP132_DEFAULT_MIN_SUBMITTERS), 4);
printf(" \n");
printf("Minor Allele Frequency range: ");
safef(cartVar, sizeof(cartVar), "%s.minMinorAlFreq", tdb->track);
float maf = cartUsualDouble(cart, cartVar, SNP132_DEFAULT_MIN_MINOR_AL_FREQ);
cgiMakeDoubleVarInRange(cartVar, maf, NULL, 4, "0.0", "0.5");
printf(" to ");
safef(cartVar, sizeof(cartVar), "%s.maxMinorAlFreq", tdb->track);
maf = cartUsualDouble(cart, cartVar, SNP132_DEFAULT_MAX_MINOR_AL_FREQ);
cgiMakeDoubleVarInRange(cartVar, maf, NULL, 4, "0.0", "0.5");
printf(" Range: 0.0 - 0.5\n");
printf(" \n");
printf("Minimum chromosome sample count (2N) for "
"Allele Frequency data: ");
safef(cartVar, sizeof(cartVar), "%s.minAlFreq2N", tdb->track);
cgiMakeIntVar(cartVar, cartUsualInt(cart, cartVar, SNP132_DEFAULT_MIN_AL_FREQ_2N), 4);
printf(" \n");
}
printf(" \n");
printf("Filter by attribute: \n");
printf("Check the boxes below to include SNPs with those attributes. "
"In order to be displayed, a SNP must pass the filter for each "
"category. \n"
"Some assemblies may not contain any SNPs that have some of the "
"listed attributes.\n"
"
\n");
jsEndCollapsibleSection();
}
static void snp125PrintColorSpec(char *track, char *attribute, char *vars[], boolean varsAreOld,
char *labels[], char *defaults[], int varCount)
/* Print a table displaying snp125 attribute color selects. */
{
int i;
printf("If a SNP has more than one of these attributes, the stronger color will override the\n"
"weaker color. The order of colors, from strongest to weakest, is red,\n"
"green, blue, gray, and black.\n"
"
\n");
printf("
\n");
for (i=0; i < varCount; i++)
{
if (i % SNP125_FILTER_COLUMNS == 0)
{
if (i > 0)
printf("\n");
printf("
\n");
}
static void snp125RemoveColorVars(struct cart *cart, char *vars[], boolean varsAreOld,
int varCount, char *track, char *attribute)
/* Remove each cart variable in vars[], as well as the new cart vars that begin with
* the track name if varsAreOld. */
{
int i;
for (i = 0; i < varCount; i++)
{
if (varsAreOld)
cartRemove(cart, vars[i]);
char cartVar[512];
safef(cartVar, sizeof(cartVar), "%s.%s%s", track, attribute,
(varsAreOld ? snp125OldColorVarToNew(vars[i], attribute) : vars[i]));
cartRemove(cart, cartVar);
}
}
static void snp125ResetColorVarsIfNecessary(struct trackDb *tdb, char *buttonVar, int version)
/* If the 'Set defaults' button has been clicked, remove all color-control cart variables. */
{
// Note we use CGI, not cart, to detect a click:
if (isNotEmpty(cgiOptionalString(buttonVar)))
{
char cartVar[512];
safef(cartVar, sizeof(cartVar), "%s.colorSource", tdb->track);
cartRemove(cart, cartVar);
cartRemove(cart, snp125ColorSourceOldVar);
snp125RemoveColorVars(cart, snp125LocTypeOldColorVars, TRUE, snp125LocTypeArraySize,
tdb->track, "locType");
snp125RemoveColorVars(cart, snp125ClassOldColorVars, TRUE, snp125ClassArraySize,
tdb->track, "class");
snp125RemoveColorVars(cart, snp125ValidOldColorVars, TRUE, snp125ValidArraySize,
tdb->track, "valid");
int funcArraySize = (version < 130) ? snp125FuncArraySize : (snp125FuncArraySize - 1);
snp125RemoveColorVars(cart, snp125FuncOldColorVars, TRUE, funcArraySize,
tdb->track, "func");
snp125RemoveColorVars(cart, snp125MolTypeOldColorVars, TRUE, snp125MolTypeArraySize,
tdb->track, "molType");
snp125RemoveColorVars(cart, snp132ExceptionVarName, FALSE, snp132ExceptionArraySize,
tdb->track, "exceptions");
snp125RemoveColorVars(cart, snp132BitfieldVarName, FALSE, snp132BitfieldArraySize,
tdb->track, "bitfields");
}
}
void snp125PrintColorControlSection(struct trackDb *tdb, int version)
/* Print a collapsible section of color controls: user selects an attribute to color by,
* and then a color for each possible value of the selected attribute. */
{
printf("
\n");
jsBeginCollapsibleSection(cart, tdb->track, "colorByAttribute", "Coloring Options", FALSE);
char defaultButtonVar[512];
safef(defaultButtonVar, sizeof(defaultButtonVar), "%s_coloring", SNP125_DEFAULTS);
stripChar(defaultButtonVar, ' ');
snp125ResetColorVarsIfNecessary(tdb, defaultButtonVar, version);
printf(" SNP Feature for Color Specification:\n");
char **labels = snp132ColorSourceLabels;
int arraySize = snp132ColorSourceArraySize;
if (version <= 127)
{
labels = snp125ColorSourceLabels;
arraySize = snp125ColorSourceArraySize;
}
else if (version <= 131)
{
labels = snp128ColorSourceLabels;
arraySize = snp128ColorSourceArraySize;
}
// It would be preferable for Javascript to handle changing the color selection
// menus when the color source selection changes, but for now we do a submit that
// returns to the current vertical position:
char autoSubmit[2048];
safef(autoSubmit, sizeof(autoSubmit), "onchange=\""
"document."MAIN_FORM".action = '%s'; %s"
"document."MAIN_FORM".submit();\"",
cgiScriptName(), jsSetVerticalPosition(MAIN_FORM));
cgiContinueHiddenVar("g");
cgiContinueHiddenVar("c");
char cartVar[512];
safef(cartVar, sizeof(cartVar), "%s.colorSource", tdb->track);
enum snp125ColorSource colorSourceCart = snp125ColorSourceFromCart(cart, tdb);
char *colorSourceSelected = snp125ColorSourceToLabel(tdb, colorSourceCart);
cgiMakeDropListFull(cartVar, labels, labels, arraySize, colorSourceSelected, autoSubmit);
printf(" \n");
char javascript[2048];
safef(javascript, sizeof(javascript),
"document."MAIN_FORM".action='%s'; %s document."MAIN_FORM".submit();",
cgiScriptName(), jsSetVerticalPosition(MAIN_FORM));
cgiMakeOnClickSubmitButton(javascript, defaultButtonVar, JS_DEFAULTS_BUTTON_LABEL);
printf("
\n"
"The selected "Feature for Color Specification" above has the\n"
"selection of colors below for each attribute. Only the color\n"
"options for the feature selected above will be used to color items;\n"
"color options for other features will not be shown.\n");
if (version > 127 && colorSourceCart == snp125ColorSourceLocType)
colorSourceCart = SNP125_DEFAULT_COLOR_SOURCE;
switch (colorSourceCart)
{
int funcArraySize;
case snp125ColorSourceLocType:
snp125PrintColorSpec(tdb->track, "locType", snp125LocTypeOldColorVars, TRUE,
snp125LocTypeLabels, snp125LocTypeDefault, snp125LocTypeArraySize);
break;
case snp125ColorSourceClass:
snp125PrintColorSpec(tdb->track, "class", snp125ClassOldColorVars, TRUE,
snp125ClassLabels, snp125ClassDefault, snp125ClassArraySize);
break;
case snp125ColorSourceValid:
snp125PrintColorSpec(tdb->track, "valid", snp125ValidOldColorVars, TRUE,
snp125ValidLabels, snp125ValidDefault, snp125ValidArraySize);
break;
case snp125ColorSourceFunc:
funcArraySize = (version < 130) ? snp125FuncArraySize : (snp125FuncArraySize - 1);
snp125PrintColorSpec(tdb->track, "func", snp125FuncOldColorVars, TRUE,
snp125FuncLabels, snp125FuncDefault, funcArraySize);
break;
case snp125ColorSourceMolType:
snp125PrintColorSpec(tdb->track, "molType", snp125MolTypeOldColorVars, TRUE,
snp125MolTypeLabels, snp125MolTypeDefault, snp125MolTypeArraySize);
break;
case snp125ColorSourceExceptions:
snp125PrintColorSpec(tdb->track, "exceptions", snp132ExceptionVarName, FALSE,
snp132ExceptionLabels, snp132ExceptionDefault, snp132ExceptionArraySize);
break;
case snp125ColorSourceBitfields:
snp125PrintColorSpec(tdb->track, "bitfields", snp132BitfieldVarName, FALSE,
snp132BitfieldLabels, snp132BitfieldDefault, snp132BitfieldArraySize);
break;
case snp125ColorSourceAlleleFreq:
printf("
Items are be colored by allele frequency on a red-blue spectrum, "
"with red representing rare alleles and blue representing common alleles. "
"Items with no allele frequency data are colored black.
");
break;
default:
errAbort("Unrecognized value of enum snp125ColorSource (%d)", colorSourceCart);
}
jsEndCollapsibleSection();
}
void snp125Ui(struct trackDb *tdb)
/* UI for dbSNP version 125 and later. */
{
char *orthoTable = snp125OrthoTable(tdb, NULL);
int version = snpVersion(tdb->track);
char cartVar[512];
jsInit();
if (version < 130)
snp125ValidArraySize--; // no by-1000genomes
if (isNotEmpty(orthoTable) && hTableExists(database, orthoTable))
{
printf(" Include Chimp state and observed human alleles in name: ");
safef(cartVar, sizeof(cartVar), "%s.extendedNames", tdb->track);
snp125ExtendedNames = cartUsualBoolean(cart, cartVar,
// Check old cart var name for backwards compatibility w/ old sessions:
cartUsualBoolean(cart, "snp125ExtendedNames", FALSE));
cgiMakeCheckBox(cartVar, snp125ExtendedNames);
printf(" (If enabled, chimp allele is displayed first, then '>', then human alleles).");
printf("
\n");
}
else
puts(" ");
// Make wrapper table for collapsible sections:
puts("
");
snp125PrintColorControlSection(tdb, version);
// End wrapper table for collapsible sections:
puts("
");
}
void snpUi(struct trackDb *tdb)
/* Put up UI snp data. */
{
int snpSource = 0;
int snpMolType = 0;
int snpClass = 0;
int snpValid = 0;
int snpFunc = 0;
int snpLocType = 0;
/* It would be nice to add a 'reset' button here to reset the snp
* variables to their defaults.
* I'd also like to see 'submit' buttons at several places along the
* page, as the page is very tall and scrolling is tedious. */
printf(" Colors and Filters:\n");
printf(" Use the "Color Specification" buttons to specify a group to direct coloring for the track display.\n");
printf(" Variants can optionally be excluded based on their values in each of the subsequent categories by choosing "exclude".\n");
printf(" \n");
printf(" Color Specification: \n");
snpColorSourceCart[0] = cartUsualString(cart, snpColorSourceDataName[0], snpColorSourceDefault[0]);
snpColorFilterButtons(snpColorSourceDataName[0], snpColorSourceCart[0]);
snpAvHetCutoff = atof(cartUsualString(cart, "snpAvHetCutoff", "0"));
printf(" Minimum Average Heterozygosity: ");
cgiMakeDoubleVar("snpAvHetCutoff",snpAvHetCutoff,6);
printf("
Exclude | Sources: \n");
for (snpSource=0; snpSource < snpSourceCartSize; snpSource++)
{
snpSourceCart[snpSource] = cartUsualString(cart, snpSourceStrings[snpSource], snpSourceDefault[snpSource]);
snpFilterButtons(snpSourceStrings[snpSource], snpSourceCart[snpSource]);
printf(" - %s \n", snpSourceLabels[snpSource]);
}
printf(" Exclude | Molecule Types: \n");
for (snpMolType=0; snpMolType%s \n", snpMolTypeLabels[snpMolType]);
}
printf(" Exclude | Variant Classes: \n");
for (snpClass=0; snpClass%s \n", snpClassLabels[snpClass]);
}
printf(" Exclude | Validation Status: \n");
for (snpValid=0; snpValid%s \n",snpValidLabels[snpValid]);
}
printf(" Exclude | Functional Classes: \n");
for (snpFunc=0; snpFunc%s \n",snpFuncLabels[snpFunc]);
}
printf(" Exclude | Location Type: \n");
for (snpLocType=0; snpLocType%s \n",snpLocTypeLabels[snpLocType]);
}
}
void ldUi(struct trackDb *tdb)
/* Put up UI snp data. */
{
char var[512];
char *val;
/* It would be nice to add a 'reset' button to reset the ld variables to their defaults. */
printf(" LD Values: \n");
safef(var, sizeof(var), "%s_val", tdb->track);
val = cartUsualString(cart, var, ldValDefault);
cgiMakeRadioButton(var, "rsquared", sameString("rsquared", val));
printf(" r2 ");
cgiMakeRadioButton(var, "dprime", sameString("dprime", val));
printf(" D' ");
cgiMakeRadioButton(var, "lod", sameString("lod", val));
printf(" LOD ");
printf(" Track Geometry: \n");
safef(var, sizeof(var), "%s_trm", tdb->track);
cgiMakeCheckBox(var, cartUsualBoolean(cart, var, ldTrmDefault));
printf(" Trim to triangle \n");
if (tdbIsComposite(tdb))
{
printf(" ");
struct slRef *tdbRefList = trackDbListGetRefsToDescendantLeaves(tdb->subtracks);
slSort(&tdbRefList, trackDbRefCmp);
struct slRef *tdbRef;
for (tdbRef = tdbRefList; tdbRef != NULL; tdbRef = tdbRef->next)
{
struct trackDb *subTdb = tdbRef->val;
if (hTableExists(database, subTdb->table))
{
safef(var, sizeof(var), "%s_inv", subTdb->track);
cgiMakeCheckBoxJS(var, cartUsualBoolean(cart, var, ldInvDefault),
"class='subtrackInCompositeUi'");
printf(" Invert display for %s \n",
subTdb->longLabel);
}
}
slFreeList(&tdbRefList);
}
else
{
safef(var, sizeof(var), "%s_inv", tdb->track);
printf(" ");
cgiMakeCheckBox(var, cartUsualBoolean(cart, var, ldInvDefault));
printf(" Invert the display \n");
}
printf(" Colors:\n");
safef(var, sizeof(var), "%s_pos", tdb->track);
val = cartUsualString(cart, var, ldPosDefault);
printf("
\n ");
printf("
\n
LD values
\n
- ");
radioButton(var, val, "red");
printf("
\n
");
radioButton(var, val, "green");
printf("
\n
");
radioButton(var, val, "blue");
printf("
\n
\n ");
safef(var, sizeof(var), "%s_out", tdb->track);
val = cartUsualString(cart, var, ldOutDefault);
printf("
\n
Outlines
\n
- ");
radioButton(var, val, "red");
printf("
\n
");
radioButton(var, val, "green");
printf("
\n
");
radioButton(var, val, "blue");
printf("
\n
");
radioButton(var, val, "yellow");
printf("
\n
");
radioButton(var, val, "black");
printf("
\n
");
radioButton(var, val, "white");
printf("
\n
");
radioButton(var, val, "none");
printf("
\n
\n ");
printf("
\n");
if (tdb->type && sameString(tdb->type, "ld2"))
{
safef(var, sizeof(var), "%s_gap", tdb->track);
printf(" ");
cgiMakeCheckBox(var, cartUsualBoolean(cart, var, ldGapDefault));
printf(" In dense mode, shade gaps between markers by T-int \n");
}
if (tdbIsComposite(tdb))
printf(" Populations:\n");
}
void oregannoUi (struct trackDb *tdb)
/* print the controls */
{
int i = 0; /* variable to walk through array */
printf(" Type of region to display: ");
printf(" (Click here for detailed information on these element types) ");
for (i = 0; i < oregannoTypeSize; i++)
{
cartMakeCheckBox(cart, oregannoTypeString[i], TRUE);
printf (" %s ", oregannoTypeLabel[i]);
}
}
void labelMakeCheckBox(struct trackDb *tdb, char *sym, char *desc, boolean dflt)
/* add a checkbox use to choose labels to enable. */
{
char varName[64];
safef(varName, sizeof(varName), "%s.label.%s", tdb->track, sym);
boolean option = cartUsualBoolean(cart, varName, dflt);
cgiMakeCheckBox(varName, option);
printf(" %s ", desc);
}
void gvIdControls (struct trackDb *tdb)
/* print the controls for the label choice */
{
printf("Label: ");
labelMakeCheckBox(tdb, "hgvs", "HGVS name", FALSE);
labelMakeCheckBox(tdb, "common", "Common name", FALSE);
printf(" \n");
}
void gvUi(struct trackDb *tdb)
/* print UI for human mutation filters */
{
int i = 0; /* variable to walk through arrays */
//char *def;
gvIdControls(tdb);
/*
printf(" Exclude data source ");
for (i = 0; i < gvSrcSize; i++)
{
if (differentString(gvSrcDbValue[i], "LSDB"))
{
if (sameString(gvSrcDbValue[i], "UniProt (Swiss-Prot/TrEMBL)"))
{
// exclude Swiss-Prot data by default, can be misleading
cartMakeCheckBox(cart, gvSrcString[i], TRUE);
}
else
{
cartMakeCheckBox(cart, gvSrcString[i], FALSE);
}
printf (" %s ", gvSrcDbValue[i]); // label with db value
}
else
{
cartMakeCheckBox(cart, gvSrcString[i], FALSE);
printf (" Locus Specific Databases ");
}
}
*/
printf(" Exclude ");
for (i = 0; i < gvAccuracySize; i++)
{
cartMakeCheckBox(cart, gvAccuracyString[i], FALSE);
printf (" %s ", gvAccuracyLabel[i]);
}
printf(" Exclude mutation type ");
for (i = 0; i < gvTypeSize; i++)
{
cartMakeCheckBox(cart, gvTypeString[i], FALSE);
printf (" %s ", gvTypeLabel[i]);
}
printf(" Exclude mutation location ");
for (i = 0; i < gvLocationSize; i++)
{
cartMakeCheckBox(cart, gvLocationString[i], FALSE);
printf (" %s ", gvLocationLabel[i]);
}
/*
printf(" Exclude phenotype association ");
for (i = 0; i < gvFilterDASize; i++)
{
cartMakeCheckBox(cart, gvFilterDAString[i], FALSE);
printf (" %s ", gvFilterDALabel[i]);
}
*/
printf(" ");
cartMakeRadioButton(cart, "gvPos.filter.colorby", "type", "type");
printf("Color mutations by type ");
for (i = 0; i < gvColorTypeSize; i++)
{
char *defaultVal = cartUsualString(cart, gvColorTypeStrings[i], gvColorTypeDefault[i]);
printf (" %s ", gvColorTypeLabels[i]);
cgiMakeDropList(gvColorTypeStrings[i], gvColorLabels, gvColorLabelSize, defaultVal);
}
printf(" ");
/*
cartMakeRadioButton(cart, "gvPos.filter.colorby", "disease", "type");
printf("Color mutations by phenotype association (determination is described below) ");
for (i = 0; i < gvColorDASize; i++)
{
char *defaultVal = cartUsualString(cart, gvColorDAStrings[i], gvColorDADefault[i]);
printf (" %s ", gvColorDALabels[i]);
cgiMakeDropList(gvColorDAStrings[i], gvColorLabels, gvColorLabelSize, defaultVal);
}
printf(" ");
*/
/* only on development page for now, but need to check in other changes */
/*
if (startsWith("hgwdev-giardine", cgiServerName()))
{
cartMakeRadioButton(cart, "gvPos.filter.colorby", "count", "type");
printf("Color mutations by count of positions associated with a mutation ");
def = cartUsualString(cart, "gvColorCountSingle", "blue");
printf (" Single position ");
cgiMakeDropList("gvColorCountSingle", gvColorLabels, gvColorLabelSize, def);
def = cartUsualString(cart, "gvColorCountMult", "green");
printf (" Multiple positions ");
cgiMakeDropList("gvColorCountMult", gvColorLabels, gvColorLabelSize, def);
printf(" ");
}
*/
}
void retroposonsUi(struct trackDb *tdb)
{
struct sqlConnection *conn = hAllocConn(database);
char query[256];
char **row;
struct sqlResult *sr;
struct slName *sList = NULL, *item;
int menuSize = 0;
char **menu;
int i;
char *tableList[3];
i = 0;
tableList[i++] = "dbRIPAlu";
tableList[i++] = "dbRIPL1";
tableList[i++] = "dbRIPSVA";
safef(query, sizeof(query),
"SELECT genoRegion FROM dbRIPAlu GROUP BY genoRegion ORDER BY genoRegion DESC");
sr = sqlGetResult(conn, query);
while ((row = sqlNextRow(sr)) != NULL)
{
slNameAddHead(&sList, row[0]);
}
sqlFreeResult(&sr);
menuSize = slCount(sList) + 1;
menu = needMem((size_t)(menuSize * sizeof(char *)));
i = 0;
menu[i++] = GENO_REGION_DEFAULT;
for (item = sList; item != NULL; item = item->next)
menu[i++] = item->name;
puts("
\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(
"
");
labelMakeCheckBox(tdb, "class1", "Phenotype map key 1: the disorder has been placed on the map based on its association with a gene, but the underlying defect is not known.", TRUE);
printf("
");
labelMakeCheckBox(tdb, "class2", "Phenotype map key 2: the disorder has been placed on the map by linkage; no mutation has been found.", TRUE);
printf("
");
labelMakeCheckBox(tdb, "class3", "Phenotype map key 3: the molecular basis for the disorder is known; a mutation has been found in the gene.", TRUE);
printf("
");
labelMakeCheckBox(tdb, "class4", "Phenotype map key 4: a contiguous gene deletion or duplication syndrome; multiple genes are deleted or duplicated causing the phenotype.", TRUE);
// removed the "others" option for the time being
//printf("
");
//labelMakeCheckBox(tdb, "others", "Others: no associated OMIM phenotype map key info available.", TRUE);
printf("
");
labelMakeCheckBox(tdb, "class1", "Phenotype map key 1: the disorder has been placed on the map based on its association with a gene, but the underlying defect is not known.", TRUE);
printf("
");
labelMakeCheckBox(tdb, "class2", "Phenotype map key 2: the disorder has been placed on the map by linkage; no mutation has been found.", TRUE);
printf("
");
labelMakeCheckBox(tdb, "class3", "Phenotype map key 3: the molecular basis for the disorder is known; a mutation has been found in the gene.", TRUE);
printf("
");
labelMakeCheckBox(tdb, "class4", "Phenotype map key 4: a contiguous gene deletion or duplication syndrome; multiple genes are deleted or duplicated causing the phenotype.", TRUE);
printf("
");
labelMakeCheckBox(tdb, "others", "Others: no associated OMIM phenotype map key info available.", TRUE);
printf("
");
}
void omimGeneIdConfig(struct trackDb *tdb)
/* Put up gene ID track controls */
{
char varName[64];
char *geneLabel;
safef(varName, sizeof(varName), "%s.label", tdb->track);
geneLabel = cartUsualString(cart, varName, "OMIM ID");
printf(" Label: ");
radioButton(varName, geneLabel, "OMIM ID");
radioButton(varName, geneLabel, "OMIM gene or syndrome");
radioButton(varName, geneLabel, "UCSC gene symbol");
}
void knownGeneIdConfig(struct trackDb *tdb)
/* Put up gene ID track controls */
{
struct sqlConnection *conn = hAllocConn(database);
char query[256];
char *omimAvail = NULL;
safef(query, sizeof(query), "select kgXref.kgID from kgXref,refLink where kgXref.refseq = refLink.mrnaAcc and refLink.omimId != 0 limit 1");
omimAvail = sqlQuickString(conn, query);
hFreeConn(&conn);
printf("Label: ");
labelMakeCheckBox(tdb, "gene", "gene symbol", FALSE);
labelMakeCheckBox(tdb, "kgId", "UCSC Known Gene ID", FALSE);
labelMakeCheckBox(tdb, "prot", "UniProt Display ID", FALSE);
if (omimAvail != NULL)
{
char sym[32];
safef(sym, sizeof(sym), "omim%s", cartString(cart, "db"));
labelMakeCheckBox(tdb, sym, "OMIM ID", FALSE);
}
printf(" \n");
}
void knownGeneShowWhatUi(struct trackDb *tdb)
/* Put up line of controls that describe what parts to show. */
{
char varName[64];
printf("Show: ");
safef(varName, sizeof(varName), "%s.show.noncoding", tdb->track);
boolean option = cartUsualBoolean(cart, varName, TRUE);
cgiMakeCheckBox(varName, option);
printf(" %s ", "non-coding genes");
safef(varName, sizeof(varName), "%s.show.spliceVariants", tdb->track);
option = cartUsualBoolean(cart, varName, TRUE);
cgiMakeCheckBox(varName, option);
printf(" %s ", "splice variants");
printf(" \n");
}
void knownGeneUI(struct trackDb *tdb)
/* Put up refGene-specific controls */
{
/* This is incompatible with adding Protein ID to lf->extra */
knownGeneIdConfig(tdb);
knownGeneShowWhatUi(tdb);
baseColorDrawOptDropDown(cart, tdb);
}
void omimLocationUI(struct trackDb *tdb)
/* Put up omimLcation-specific controls */
{
omimLocationConfig(tdb);
}
void omimGene2IdConfig(struct trackDb *tdb)
/* Put up gene ID track controls */
{
printf("Label: ");
labelMakeCheckBox(tdb, "omimId", "OMIM ID", FALSE);
labelMakeCheckBox(tdb, "gene", "gene symbol", FALSE);
printf(" \n");
}
void omimGene2UI(struct trackDb *tdb)
/* Put up omimGene2-specific controls */
{
omimGene2IdConfig(tdb);
omimGene2Config(tdb);
}
void omimGeneUI(struct trackDb *tdb)
/* Put up omimGene-specific controls */
{
omimGeneIdConfig(tdb);
}
void geneIdConfig(struct trackDb *tdb)
/* Put up gene ID track controls */
{
char varName[64];
char *geneLabel;
safef(varName, sizeof(varName), "%s.label", tdb->track);
geneLabel = cartUsualString(cart, varName, "gene");
printf("Label: ");
radioButton(varName, geneLabel, "gene");
radioButton(varName, geneLabel, "accession");
radioButton(varName, geneLabel, "both");
radioButton(varName, geneLabel, "none");
}
static void hideNoncodingOpt(struct trackDb *tdb)
/* Put up hide-noncoding options. */
{
/* Put up option to hide non-coding elements. */
printf("Hide non-coding genes: ");
char varName[64];
safef(varName, sizeof(varName), "%s.%s", tdb->track, HIDE_NONCODING_SUFFIX);
cartMakeCheckBox(cart, varName, HIDE_NONCODING_DEFAULT);
}
void rgdGene2UI(struct trackDb *tdb)
/* Put up rgdGene2 gene ID track controls, with checkboxes */
{
/* Put up label line - boxes for gene and accession. */
printf("Label: ");
labelMakeCheckBox(tdb, "gene", "gene", FALSE);
labelMakeCheckBox(tdb, "acc", "accession", FALSE);
printf(" \n");
baseColorDrawOptDropDown(cart, tdb);
}
void refGeneUI(struct trackDb *tdb)
/* Put up refGene or xenoRefGene gene ID track controls, with checkboxes */
{
/* Figure out if OMIM database is available. */
int omimAvail = 0;
if (sameString(tdb->track, "refGene"))
{
struct sqlConnection *conn = hAllocConn(database);
char query[128];
safef(query, sizeof(query), "select refLink.omimId from refLink, refGene where refLink.mrnaAcc = refGene.name and refLink.omimId != 0 limit 1");
omimAvail = sqlQuickNum(conn, query);
hFreeConn(&conn);
}
/* Put up label line - boxes for gene, accession or maybe OMIM. */
printf("Label: ");
-labelMakeCheckBox(tdb, "gene", "gene", FALSE);
+labelMakeCheckBox(tdb, "gene", "gene", TRUE);
labelMakeCheckBox(tdb, "acc", "accession", FALSE);
if (omimAvail != 0)
{
char sym[32];
safef(sym, sizeof(sym), "omim%s", cartString(cart, "db"));
labelMakeCheckBox(tdb, sym, "OMIM ID", FALSE);
}
printf(" \n");
/* Put up noncoding option and codon coloring stuff. */
hideNoncodingOpt(tdb);
baseColorDrawOptDropDown(cart, tdb);
}
void transMapUI(struct trackDb *tdb)
/* Put up transMap-specific controls */
{
printf("Label: ");
labelMakeCheckBox(tdb, "orgCommon", "common name", FALSE);
labelMakeCheckBox(tdb, "orgAbbrv", "organism abbreviation", FALSE);
labelMakeCheckBox(tdb, "db", "assembly database", FALSE);
labelMakeCheckBox(tdb, "gene", "gene", FALSE);
labelMakeCheckBox(tdb, "acc", "accession", FALSE);
baseColorDrawOptDropDown(cart, tdb);
indelShowOptions(cart, tdb);
}
void retroGeneUI(struct trackDb *tdb)
/* Put up retroGene-specific controls */
{
printf("Label: ");
labelMakeCheckBox(tdb, "gene", "gene", FALSE);
labelMakeCheckBox(tdb, "acc", "accession", FALSE);
baseColorDrawOptDropDown(cart, tdb);
}
void vegaGeneUI(struct trackDb *tdb)
/* Put up Vega Gene track-specific controls */
{
geneIdConfig(tdb);
printf(" \n");
/* Put up codon coloring stuff. */
baseColorDrawOptDropDown(cart, tdb);
}
void ensemblNonCodingTypeConfig(struct trackDb *tdb)
{
int i = 0;
printf(" Non-coding RNA type: ");
printf(" \n");
for (i=0; i < nonCodingTypeLabelsSize; i++)
{
nonCodingTypeIncludeCart[i] = cartUsualBoolean(cart, nonCodingTypeIncludeStrings[i], nonCodingTypeIncludeDefault[i]);
cgiMakeCheckBox(nonCodingTypeIncludeStrings[i], nonCodingTypeIncludeCart[i]);
printf(" %s", nonCodingTypeLabels[i]);
}
}
void ensemblNonCodingUI(struct trackDb *tdb)
/* Put up Ensembl Non-Coding genes-specific controls */
{
ensemblNonCodingTypeConfig(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("
");
cgiMakeIntVar(cartVar, minQual, 4);
puts(" (range: 0 to 100)
\n");
}
puts("
");
puts("
\n");
printf("Select subtracks to display: \n");
hFreeConn(&conn);
}
void pcrResultUi(struct trackDb *tdb)
/* Result from hgPcr query. */
{
struct targetDb *target;
if (! pcrResultParseCart(database, cart, NULL, NULL, &target))
return;
if (target != NULL)
{
char *chosen = cartUsualString(cart, PCR_RESULT_TARGET_STYLE,
PCR_RESULT_TARGET_STYLE_DEFAULT);
cgiMakeRadioButton(PCR_RESULT_TARGET_STYLE, PCR_RESULT_TARGET_STYLE_TRIM,
sameString(chosen, PCR_RESULT_TARGET_STYLE_TRIM));
printf("Show only the amplified part of %s item \n",
target->description);
cgiMakeRadioButton(PCR_RESULT_TARGET_STYLE, PCR_RESULT_TARGET_STYLE_TALL,
sameString(chosen, PCR_RESULT_TARGET_STYLE_TALL));
printf("Show the whole %s item with amplified part tall",
target->description);
}
baseColorDrawOptDropDown(cart, tdb);
}
void dgvUi(struct trackDb *tdb)
/* Database of Genomic Variants: filter by publication. */
{
struct sqlConnection *conn = hAllocConn(database);
struct sqlResult *sr;
char **row;
char query[256];
safef(query, sizeof(query),
"select reference,pubMedId from %s group by pubMedId order by reference;", tdb->table);
sr = sqlGetResult(conn, query);
printf(" Filter by publication reference:\n");
char cartVarName[256];
safef (cartVarName, sizeof(cartVarName), "hgt_%s_filterType", tdb->track);
boolean isInclude = sameString("include", cartUsualString(cart, cartVarName, "include"));
cgiMakeRadioButton(cartVarName, "include", isInclude);
printf("include\n");
cgiMakeRadioButton(cartVarName, "exclude", !isInclude);
printf("exclude \n");
safef (cartVarName, sizeof(cartVarName), "hgt_%s_filterPmId", tdb->track);
boolean filterPmIdInCart = cartListVarExists(cart, cartVarName);
struct slName *checked = NULL;
if (filterPmIdInCart)
checked = cartOptionalSlNameList(cart, cartVarName);
#define MAX_DGV_REFS 128
char *labelArr[MAX_DGV_REFS], *valueArr[MAX_DGV_REFS];
int refCount = 0;
while ((row = sqlNextRow(sr)) != NULL)
{
char *ref = row[0];
char *pmId = row[1];
char label[512];
safef(label, sizeof(label),
"%s", pmId, ref);
labelArr[refCount] = cloneString(label);
valueArr[refCount++] = cloneString(pmId);
if (! filterPmIdInCart)
slNameAddHead(&checked, pmId);
if (refCount >= MAX_DGV_REFS)
errAbort("dgvUi: %s has too many references (max %d)", tdb->track, MAX_DGV_REFS);
}
sqlFreeResult(&sr);
jsMakeCheckboxGroupSetClearButton(cartVarName, TRUE);
jsMakeCheckboxGroupSetClearButton(cartVarName, FALSE);
cgiMakeCheckboxGroupWithVals(cartVarName, labelArr, valueArr, refCount, checked, 4);
hFreeConn(&conn);
}
static void factorSourceUi(char *db,struct trackDb *tdb)
{
printf(" Cell Abbreviations: \n");
char *sourceTable = trackDbRequiredSetting(tdb, "sourceTable");
struct sqlConnection *conn = hAllocConn(db);
hPrintAbbreviationTable(conn, sourceTable, "Cell Type");
hFreeConn(&conn);
}
#ifdef UNUSED
static boolean isInTrackList(struct trackDb *tdbList, struct trackDb *target)
/* Return TRUE if target is in tdbList. */
{
struct trackDb *tdb;
for (tdb = tdbList; tdb != NULL; tdb = tdb->next)
if (tdb == target)
return TRUE;
return FALSE;
}
#endif /* UNUSED */
void superTrackUi(struct trackDb *superTdb, struct trackDb *tdbList)
/* List tracks in this collection, with visibility controls and UI links */
{
#define SUPERS_WITH_CHECKBOXES
#ifdef SUPERS_WITH_CHECKBOXES
#ifdef BUTTONS_BY_CSS
#define BUTTON_SUPER "%c"
#define BUTTON_PLUS_SUPER() printf(BUTTON_SUPER,"true", '+')
#define BUTTON_MINUS_SUPER() printf(BUTTON_SUPER,"false",'-')
#else///ifndef BUTTONS_BY_CSS
#define PM_BUTTON_GLOBAL ""
#define BUTTON_PLUS_SUPER() printf(PM_BUTTON_GLOBAL,"true", "plus_all", "add_sm.gif")
#define BUTTON_MINUS_SUPER() printf(PM_BUTTON_GLOBAL,"false","minus_all","remove_sm.gif")
#endif///ndef BUTTONS_BY_CSS
jsIncludeFile("hui.js",NULL);
#endif///def SUPERS_WITH_CHECKBOXES
printf("\n
");
tdbRefSortPrioritiesFromCart(cart, &superTdb->children);
struct slRef *childRef;
for (childRef = superTdb->children; childRef != NULL; childRef = childRef->next)
{
struct trackDb *tdb = childRef->val;
#ifdef SUPERS_WITH_CHECKBOXES
if (childRef == superTdb->children) // first time through
{
printf("\n
");
BUTTON_PLUS_SUPER();
BUTTON_MINUS_SUPER();
printf(" All ");
printf("
\n");
}
printf("
");
if (!tdbIsDownloadsOnly(tdb))
{
enum trackVisibility tv = hTvFromString(cartUsualString(cart, tdb->track,hStringFromTv(tdb->visibility)));
// Don't use cheapCgi code... no name and no boolshad... just js
printf("",tdb->track,(tv != tvHide?" CHECKED":""));
hTvDropDownClassVisOnlyAndExtra(tdb->track, tv, tdb->canPack,
(tv == tvHide ? "hiddenText":"normalText"),
trackDbSetting(tdb, "onlyVisibility"),
"onchange='superT.selChanged(this);'");
printf("
");
}
void previewLinks(char *db, struct trackDb *tdb)
/* Informational messages about preview browser (ENCODE tracks only) */
{
if (trackDbSetting(tdb, "wgEncode") != NULL)
{
if (hIsPreviewHost())
{
printf("
WARNING: This data is provided for early access via the Preview Browser -- it is unreviewed and subject to change. For high quality reviewed annotations, see the Genome Browser.",
"genome.ucsc.edu", db);
}
else
{
// TODO: use hTrackUiName()
printf("
NOTE: Early access to additional track data may be available on the Preview Browser.",
"genome-preview.ucsc.edu", db, tdb->track);
}
}
}
void specificUi(struct trackDb *tdb, struct trackDb *tdbList, struct customTrack *ct, boolean ajax)
/* Draw track specific parts of UI. */
{
char *track = tdb->track;
// Ideally check cfgTypeFromTdb()/cfgByCfgType() first, but with all these special cases already in
// place, lets be cautious at this time.
// NOTE: Developer, please try to use cfgTypeFromTdb()/cfgByCfgType().
boolean boxed = trackDbSettingClosestToHomeOn(tdb, "boxedCfg");
// UI precedence:
// 1) supers to get them out of the way: they have no controls
// 2) special cases based upon track name (developer please avoid)
// 3) cfgTypeFromTdb()/cfgByCfgType() <== prefered method
// 4) special cases falling through the cracks but based upon type
if (tdbIsSuperTrack(tdb))
superTrackUi(tdb, tdbList);
else 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")
|| sameString(track, "refGene"))
refGeneUI(tdb);
else if (startsWith("transMapAln", track))
transMapUI(tdb);
else if (sameString(track, "rgdGene2"))
rgdGene2UI(tdb);
else if (sameString(track, "knownGene"))
knownGeneUI(tdb);
else if (sameString(track, "omimLocation"))
omimLocationUI(tdb);
else if (sameString(track, "omimGene2"))
omimGene2UI(tdb);
else if (sameString(track, "omimGene"))
omimGeneUI(tdb);
else if (sameString(track, "hg17Kg"))
hg17KgUI(tdb);
else if (startsWith("ucscRetro", track)
|| startsWith("retroMrnaInfo", track))
retroGeneUI(tdb);
else if (sameString(track, "ensGeneNonCoding"))
ensemblNonCodingUI(tdb);
else if (sameString(track, "vegaGeneComposite"))
vegaGeneUI(tdb);
else if (sameString(track, "rosetta"))
rosettaUi(tdb);
else if (startsWith("pubs", track))
pubsUi(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 (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);
else if (startsWith("chain", track)
|| endsWith("chainSelf", track))
chainColorUi(tdb);
else if (sameString(track, "orthoTop4") // still used ??
|| sameString(track, "mouseOrtho")
|| sameString(track, "mouseSyn"))
// NOTE: type psl xeno tracks use crossSpeciesCfgUi, so
// add explicitly here only if track has another type (bed, chain).
// For crossSpeciesCfgUi, the
// default for chrom coloring is "on", unless track setting
// colorChromDefault is set to "off"
crossSpeciesCfgUi(cart,tdb);
else if (sameString(track, "affyTranscriptome"))
affyTranscriptomeUi(tdb);
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);
else if (sameString(track, "all_mrna")
|| sameString(track, "mrna")
|| sameString(track, "all_est")
|| sameString(track, "est")
|| sameString(track, "tightMrna")
|| sameString(track, "tightEst")
|| sameString(track, "intronEst")
|| sameString(track, "xenoMrna")
|| sameString(track, "xenoEst"))
mrnaCfgUi(cart, tdb, tdb->track, NULL, boxed);
else if (tdb->type != NULL)
{ // NOTE for developers: please avoid special cases and use cfgTypeFromTdb//cfgByCfgType()
// When you do, then multi-view cfg and subtrack cfg will work.
eCfgType cType = cfgTypeFromTdb(tdb,FALSE);
if (cType != cfgNone)
{
cfgByCfgType(cType,database, cart, tdb,tdb->track, NULL, boxed);
}
// NOTE: these cases that fall through the cracks should probably get folded into cfgByCfgType()
else if (startsWithWord("expRatio", tdb->type))
expRatioUi(tdb);
else if (startsWith("chromGraph", tdb->type))
chromGraphUi(tdb);
else if (startsWith("sample", tdb->type))
genericWiggleUi(tdb,7);
else if (startsWithWord("array",tdb->type)) /* not quite the same as an "expRatio" type (custom tracks) */
expRatioCtUi(tdb);
else if (startsWithWord("factorSource",tdb->type))
factorSourceUi(database,tdb);
}
if (!ajax) // ajax asks for a simple cfg dialog for right-click popup or hgTrackUi subtrack cfg
{
// Composites *might* have had their top level controls just printed, but almost certainly have additional controls
if (tdbIsComposite(tdb)) // for the moment generalizing this to include other containers...
hCompositeUi(database, cart, tdb, NULL, NULL, MAIN_FORM);
// Additional special case navigation links may be added
previewLinks(database, tdb);
extraUiLinks(database,tdb);
}
}
#ifdef UNUSED
static void findSuperChildrenAndSettings(struct trackDb *tdbList, struct trackDb *super)
/* Find the tracks that have super as a parent and stuff references to them on
* super's children list. Also do some visibility and parentName futzing. */
{
struct trackDb *tdb;
for (tdb = tdbList; tdb != NULL; tdb = tdb->next)
{
if (tdb->parent == super)
{
trackDbSuperMemberSettings(tdb); /* This adds tdb to tdb->parent->children. */
}
}
}
#endif /* UNUSED */
void trackUi(struct trackDb *tdb, struct trackDb *tdbList, struct customTrack *ct, boolean ajax)
/* Put up track-specific user interface. */
{
if (!ajax)
{
jsIncludeFile("jquery.js", NULL);
webIncludeResourceFile("jquery-ui.css");
jsIncludeFile("jquery-ui.js", NULL);
jsIncludeFile("utils.js",NULL);
jsonObjectAdd(NULL, "track", newJsonString(tdb->track));
jsonObjectAdd(NULL, "db", newJsonString(database));
}
#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
cartTdbTreeReshapeIfNeeded(cart,tdb);
}
printf("");
if (ajax)
return;
if (ct)
{
/* hidden form for custom tracks CGI */
printf("\n");
if (ct->bbiFile)
{
time_t timep = bbiUpdateTime(ct->bbiFile);
printBbiUpdateTime(&timep);
}
else
printUpdateTime(CUSTOM_TRASH, ct->tdb, ct);
}
if (!ct)
{
/* Print data version trackDB setting, if any */
struct trackVersion *trackVersion = getTrackVersion(database, tdb->track);
char *version = trackVersion == NULL ? trackDbSetting(tdb, "dataVersion") : trackVersion->version;
if (version)
{
cgiDown(0.7);
printf("Data version: %s \n", version);
}
/* Print lift information from trackDb, if any */
trackDbPrintOrigAssembly(tdb, database);
printUpdateTime(database, tdb, NULL);
}
if (tdb->html != NULL && tdb->html[0] != 0)
{
char *browserVersion;
if (btIE == cgiClientBrowser(&browserVersion, NULL, NULL) && *browserVersion < '8')
htmlHorizontalLine();
else // Move line down, since
Description (in ->html) is proceded by too much space
printf("");
printf("
");
puts(""); // include anchor for Description link
// Add pennantIcon
printPennantIconNote(tdb);
puts(tdb->html);
printf("
");
cgiDown(0.7); // positions top link below line
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 *tdbList = NULL;
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 = trackHashMakeWithComposites(database,chromosome,&tdbList,FALSE);
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 (isHubTrack(track))
{
tdb = hubConnectAddHubForTrackAndFindTdb(database, track, &tdbList, trackHash);
}
else if (sameString(track, "hgPcrResult"))
tdb = pcrResultFakeTdb();
else
{
tdb = tdbForTrack(database, track,&tdbList);
}
if (tdb == NULL)
{
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 && sameString(super,tdb->parent->track))
{ // check trackName because super is returned for any level child
/* the supertrack is also configured, so use supertrack defaults */
tdbMarkAsSuperTrack(tdb->parent);
trackDbSuperMemberSettings(tdb);
}
}
char *title = (tdbIsSuper(tdb) ? "Super-track Settings" :
tdbIsDownloadsOnly(tdb) ? DOWNLOADS_ONLY_TITLE : "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, tdbList, ct, TRUE);
cartRemove(cart,"ajax");
}
else
{
cartWebStart(cart, database, "%s %s", tdb->shortLabel, title);
trackUi(tdb, tdbList, ct, FALSE);
printf(" \n");
jsonPrintGlobals(TRUE);
webEnd();
}
}
char *excludeVars[] = { "submit", "Submit", "g", NULL, "ajax", NULL,};
int main(int argc, char *argv[])
/* Process command line. */
{
cgiSpoof(&argc, argv);
htmlSetBackground(hBackgroundImage());
setUdcCacheDir();
cartEmptyShell(doMiddle, hUserCookie(), excludeVars, NULL);
return 0;
}