d5a9a15796cc24fd3dc96e9eee982f8a2122de7d tdreszer Fri Oct 29 14:46:16 2010 -0700 Fixed problem with bam views. This fix extended to psl and genePred views which would also have had problems. This code also cleans up bam cfg spacing and adds links to selected cv.ra terms found in the '...' metadata table diff --git src/hg/lib/hui.c src/hg/lib/hui.c index fc833a9..c33cfce 100644 --- src/hg/lib/hui.c +++ src/hg/lib/hui.c @@ -35,31 +35,31 @@ //#define PM_BUTTON "<A NAME=\"%s\"></A><A HREF=\"#%s\"><IMG height=18 width=18 onclick=\"return (setCheckBoxesThatContain('%s',%s,true,'%s','','%s') == false);\" id=\"btn_%s\" src=\"../images/%s\" alt=\"%s\"></A>\n" //#define DEF_BUTTON "<A NAME=\"%s\"></A><A HREF=\"#%s\"><IMG onclick=\"setCheckBoxesThatContain('%s',true,false,'%s','','%s'); return (setCheckBoxesThatContain('%s',false,false,'%s','_defOff','%s') == false);\" id=\"btn_%s\" src=\"../images/%s\" alt=\"%s\"></A>\n" //#define DEFAULT_BUTTON(nameOrId,anc,beg,contains) printf(DEF_BUTTON,(anc),(anc),(nameOrId), (beg),(contains),(nameOrId),(beg),(contains),(anc),"defaults_sm.png","default") //#define PLUS_BUTTON(nameOrId,anc,beg,contains) printf(PM_BUTTON, (anc),(anc),(nameOrId),"true", (beg),(contains),(anc),"add_sm.gif", "+") //#define MINUS_BUTTON(nameOrId,anc,beg,contains) printf(PM_BUTTON, (anc),(anc),(nameOrId),"false",(beg),(contains),(anc),"remove_sm.gif","-") #define PM_BUTTON "<IMG height=18 width=18 onclick=\"setCheckBoxesThatContain('%s',%s,true,'%s','','%s');\" id=\"btn_%s\" src=\"../images/%s\" alt=\"%s\">\n" #define DEF_BUTTON "<IMG onclick=\"setCheckBoxesThatContain('%s',true,false,'%s','','%s'); setCheckBoxesThatContain('%s',false,false,'%s','_defOff','%s');\" id=\"btn_%s\" src=\"../images/%s\" alt=\"%s\">\n" #define DEFAULT_BUTTON(nameOrId,anc,beg,contains) printf(DEF_BUTTON,(nameOrId), (beg),(contains),(nameOrId),(beg),(contains),(anc),"defaults_sm.png","default") #define PLUS_BUTTON(nameOrId,anc,beg,contains) printf(PM_BUTTON, (nameOrId),"true", (beg),(contains),(anc),"add_sm.gif", "+") #define MINUS_BUTTON(nameOrId,anc,beg,contains) printf(PM_BUTTON, (nameOrId),"false",(beg),(contains),(anc),"remove_sm.gif","-") #define ENCODE_DCC_DOWNLOADS "encodeDCC" //#define SUBTRACK_CFG_POPUP -//#define BAM_CFG_UI_CHANGES +#define BAM_CFG_UI_CHANGES struct trackDb *wgEncodeDownloadDirKeeper(char *db, struct trackDb *tdb, struct hash *trackHash) /* Look up through self and parents, looking for someone responsible for handling * where the downloads are. */ { if (!sameString(tdb->table, tdb->track)) { tdb = hashFindVal(trackHash, tdb->table); if (tdb == NULL) errAbort("Can't find track for table %s in wgEncodeDownloadDirKeeper", tdb->table); } return trackDbTopLevelSelfOrParent(tdb); } static char *htmlStringForDownloadsLink(char *database, struct trackDb *tdb,char *name,boolean nameIsFile, @@ -119,65 +119,113 @@ if (hTableOrSplitExists(db, tdb->table)) { char *tbOff = trackDbSetting(tdb, "tableBrowser"); if (isNotEmpty(tbOff) && sameString(nextWord(&tbOff), "off")) return FALSE; char *hint = " title='Open table schema in new window'"; if( label == NULL) label = " View table schema"; struct trackDb *topLevel = trackDbTopLevelSelfOrParent(tdb); printf(SCHEMA_LINKED, db, topLevel->grp, topLevel->track, tdb->table, hint, label); return TRUE; } return FALSE; } +char *controlledVocabLink(char *file,char *term,char *value,char *title, char *label,char *suffix) +// returns allocated string of HTML link to controlled vocabulary term +{ +#define VOCAB_LINK "<A HREF='hgEncodeVocab?ra=%s&%s=\"%s\"' title='%s details' TARGET=ucscVocab>%s</A>" +char *encFile = cgiEncode(file); +char *encTerm = cgiEncode(term); +char *encValue = cgiEncode(value); +struct dyString *dyLink = dyStringCreate(VOCAB_LINK,encFile,encTerm,encValue,title,label); +if (suffix != NULL) + dyStringAppend(dyLink,suffix); // Don't encode since this may contain HTML + +freeMem(encFile); +freeMem(encTerm); +freeMem(encValue); +return dyStringCannibalize(&dyLink); +} + char *metadataAsHtmlTable(char *db,struct trackDb *tdb,boolean showLongLabel,boolean showShortLabel, struct hash *trackHash) /* If metadata from metaDb exists, return string of html with table definition */ { const struct mdbObj *safeObj = metadataForTable(db,tdb,NULL); if (safeObj == NULL || safeObj->vars == NULL) return NULL; //struct dyString *dyTable = dyStringCreate("<table id='mdb_%s'>",tdb->table); struct dyString *dyTable = dyStringCreate("<table>"); if(showLongLabel) dyStringPrintf(dyTable,"<tr><td colspan=2>%s</td></tr>",tdb->longLabel); if(showShortLabel) dyStringPrintf(dyTable,"<tr><td align=right><i>shortLabel:</i></td><td nowrap>%s</td></tr>",tdb->shortLabel); +//#define DONT_USE_CV_WHITELIST +#ifndef DONT_USE_CV_WHITELIST +// Need whiteListed cv terms and the cv.ra file +struct slPair *oneTerm,*whiteList = mdbCvWhiteList(FALSE,TRUE); // Want terms that are defined in cv, not searchable via trackSearch +char *cvFile = NULL; +char *vocab = trackDbSetting(tdb, "controlledVocabulary"); +if(vocab != NULL) + cvFile = firstWordInLine(cloneString(vocab)); +#endif///ndef DONT_USE_CV_WHITELIST + struct mdbObj *mdbObj = mdbObjClone(safeObj); // Important if we are going to remove vars! mdbObjRemoveVars(mdbObj,"composite project objType"); // Don't bother showing these (suggest: "composite project dataType view tableName") mdbObjReorderVars(mdbObj,"grant lab dataType cell treatment antibody protocol replicate view setType inputType",FALSE); // Bring to front mdbObjReorderVars(mdbObj,"subId submittedDataVersion dateSubmitted dateResubmitted dateUnrestricted dataVersion tableName fileName fileIndex",TRUE); // Send to back struct mdbVar *mdbVar; for (mdbVar=mdbObj->vars;mdbVar!=NULL;mdbVar=mdbVar->next) { if ((sameString(mdbVar->var,"fileName") || sameString(mdbVar->var,"fileIndex") ) && trackDbSettingClosestToHome(tdb,"wgEncode") != NULL) { dyStringPrintf(dyTable,"<tr><td align=right><i>%s:</i></td><td nowrap>",mdbVar->var); dyStringAppend(dyTable,htmlStringForDownloadsLink(db, tdb, mdbVar->val, TRUE, trackHash)); dyStringAppend(dyTable,"</td></tr>"); } else { // If antibody and metadata contains input={sameValue} then just print input if(sameString(mdbVar->var,"antibody") && mdbObjContains(mdbObj,"input",mdbVar->val)) continue; +#ifndef DONT_USE_CV_WHITELIST + if (cvFile && whiteList) + { + for(oneTerm=whiteList;oneTerm!=NULL;oneTerm=oneTerm->next) + { + if (sameWord(oneTerm->name,mdbVar->var)) + break; + } + if (oneTerm != NULL) + { + //build link then + // TODO: If hgEncodeVocab was changed to give a description of a term not found in cv.ra, then "type" could almost always be linked + char *linkOfType = controlledVocabLink(cvFile,"type",oneTerm->name,oneTerm->val,oneTerm->val,NULL); + char *linkOfTerm = controlledVocabLink(cvFile,"term",mdbVar->val,mdbVar->val,mdbVar->val,NULL); + dyStringPrintf(dyTable,"<tr><td align=right><i>%s:</i></td><td nowrap>%s</td></tr>",linkOfType,linkOfTerm); + freeMem(linkOfType); + freeMem(linkOfTerm); + continue; + } + } +#endif///ndef DONT_USE_CV_WHITELIST dyStringPrintf(dyTable,"<tr><td align=right><i>%s:</i></td><td nowrap>%s</td></tr>",mdbVar->var,mdbVar->val); } } dyStringAppend(dyTable,"</table>"); //mdbObjsFree(&mdbObj); // spill some memory return dyStringCannibalize(&dyTable); } boolean compositeMetadataToggle(char *db,struct trackDb *tdb,char *title, boolean embeddedInText,boolean showLongLabel, struct hash *trackHash) /* If metadata from metaTbl exists, create a link that will allow toggling it's display */ { const struct mdbObj *safeObj = metadataForTable(db,tdb,NULL); if(safeObj == NULL || safeObj->vars == NULL) return FALSE; @@ -944,37 +992,37 @@ { if (sameString(setting, "genbank") || sameString(setting, "seq") || sameString(setting, "ss") || startsWith("extFile", setting) || sameString(setting, "hgPcrResult") || sameString(setting, "nameIsSequence") || sameString(setting, "seq1Seq2") || sameString(setting, "lfExtra")) gotIt = TRUE; else if (differentString(setting, "none")) errAbort("trackDb for %s, setting %s: unrecognized value \"%s\". " "must be one of {none,genbank,seq,ss,extFile,nameIsSequence,seq1Seq2," "hgPcrResult,lfExtra}.", tdb->track, BASE_COLOR_USE_SEQUENCE, setting); } return gotIt; } -static void baseColorDropLists(struct cart *cart, struct trackDb *tdb) +static void baseColorDropLists(struct cart *cart, struct trackDb *tdb, char *name) /* draw the baseColor drop list options */ { enum baseColorDrawOpt curOpt = baseColorDrawOptEnabled(cart, tdb); char *curValue = baseColorDrawAllOptionValues[curOpt]; char var[512]; -safef(var, sizeof(var), "%s." BASE_COLOR_VAR_SUFFIX, tdb->track); +safef(var, sizeof(var), "%s." BASE_COLOR_VAR_SUFFIX, name); boolean gotCds = baseColorGotCds(tdb); boolean gotSeq = baseColorGotSequence(tdb); if (gotCds && gotSeq) { puts("<P><B>Color track by codons or bases:</B>"); cgiMakeDropListFull(var, baseColorDrawAllOptionLabels, baseColorDrawAllOptionValues, ArraySize(baseColorDrawAllOptionLabels), curValue, NULL); #ifndef BAM_CFG_UI_CHANGES printf("<BR>"); #endif///ndef BAM_CFG_UI_CHANGES printf("<A HREF=\"%s\">Help on mRNA coloring</A><BR>", CDS_MRNA_HELP_PAGE); } @@ -997,162 +1045,176 @@ cgiMakeDropListFull(var, baseColorDrawItemOptionLabels, baseColorDrawItemOptionValues, ArraySize(baseColorDrawItemOptionLabels), curValue, NULL); #ifndef BAM_CFG_UI_CHANGES printf("<BR>"); #endif///ndef BAM_CFG_UI_CHANGES printf("<A HREF=\"%s\">Help on base coloring</A><BR>", CDS_BASE_HELP_PAGE); } } void baseColorDrawOptDropDown(struct cart *cart, struct trackDb *tdb) /* Make appropriately labeled drop down of options if any are applicable.*/ { -baseColorDropLists(cart, tdb); +baseColorDropLists(cart, tdb, tdb->track); } enum baseColorDrawOpt baseColorDrawOptEnabled(struct cart *cart, struct trackDb *tdb) /* Query cart & trackDb to determine what drawing mode (if any) is enabled. */ { char *stringVal = NULL; assert(cart); assert(tdb); /* trackDb can override default of OFF; cart can override trackDb. */ stringVal = trackDbSettingClosestToHomeOrDefault(tdb, BASE_COLOR_DEFAULT, BASE_COLOR_DRAW_OFF); stringVal = cartUsualStringClosestToHome(cart, tdb, FALSE, BASE_COLOR_VAR_SUFFIX,stringVal); return baseColorDrawOptStringToEnum(stringVal); } /*** Control of fancy indel display code: ***/ +static boolean tdbOrCartBoolean(struct cart *cart, struct trackDb *tdb, + char *settingName, char *defaultOnOff) +/* Query cart & trackDb to determine if a boolean variable is set. */ +{ +boolean alreadySet; +alreadySet = !sameString("off",trackDbSettingOrDefault(tdb, settingName, defaultOnOff)); +alreadySet = cartUsualBooleanClosestToHome(cart, tdb, FALSE, settingName, alreadySet); // NOTE: compositeLevel=FALSE because tdb param already is at appropriate level +return alreadySet; +} + static boolean indelAppropriate(struct trackDb *tdb) /* Return true if it makes sense to offer indel display options for tdb. */ { return (tdb && (startsWith("psl", tdb->type) || sameString("bam", tdb->type)) && (cfgOptionDefault("browser.indelOptions", NULL) != NULL)); } -void indelShowOptions(struct cart *cart, struct trackDb *tdb) +static void indelEnabledByName(struct cart *cart, struct trackDb *tdb, char *name, + float basesPerPixel, boolean *retDoubleInsert, boolean *retQueryInsert, + boolean *retPolyA) +/* Query cart & trackDb to determine what indel display (if any) is enabled. Set + * basesPerPixel to 0.0 to disable check for zoom level. */ +{ +struct trackDb *tdbLevel = tdb; +if (differentString(tdb->track, name) && tdb->parent != NULL) + tdbLevel = tdb->parent; + +boolean apropos = indelAppropriate(tdb); +if (apropos && (basesPerPixel > 0.0)) + { + // check indel max zoom + float showIndelMaxZoom = trackDbFloatSettingOrDefault(tdbLevel, "showIndelMaxZoom", -1.0); + if ((showIndelMaxZoom >= 0) + && ((basesPerPixel > showIndelMaxZoom) || (showIndelMaxZoom == 0.0))) + apropos = FALSE; + } + +if (retDoubleInsert) + *retDoubleInsert = apropos && + tdbOrCartBoolean(cart, tdbLevel, INDEL_DOUBLE_INSERT, "off"); +if (retQueryInsert) + *retQueryInsert = apropos && + tdbOrCartBoolean(cart, tdbLevel, INDEL_QUERY_INSERT, "off"); +if (retPolyA) + *retPolyA = apropos && + tdbOrCartBoolean(cart, tdbLevel, INDEL_POLY_A, "off"); +} + +void indelEnabled(struct cart *cart, struct trackDb *tdb, float basesPerPixel, + boolean *retDoubleInsert, boolean *retQueryInsert, + boolean *retPolyA) +/* Query cart & trackDb to determine what indel display (if any) is enabled. Set + * basesPerPixel to 0.0 to disable check for zoom level. */ +{ +indelEnabledByName(cart,tdb,tdb->track,basesPerPixel,retDoubleInsert,retQueryInsert,retPolyA); +} + +static void indelShowOptionsWithName(struct cart *cart, struct trackDb *tdb,char *name) /* Make HTML inputs for indel display options if any are applicable. */ { if (indelAppropriate(tdb)) { boolean showDoubleInsert, showQueryInsert, showPolyA; char var[512]; - indelEnabled(cart, tdb, 0.0, &showDoubleInsert, &showQueryInsert, &showPolyA); + indelEnabledByName(cart, tdb, name, 0.0, &showDoubleInsert, &showQueryInsert, &showPolyA); #ifdef BAM_CFG_UI_CHANGES printf("<TABLE><TR><TD colspan=2><B>Alignment Gap/Insertion Display Options</B>"); printf(" <A HREF=\"%s\">Help on display options</A>\n<TR valign='top'><TD>", INDEL_HELP_PAGE); - safef(var, sizeof(var), "%s_%s", INDEL_DOUBLE_INSERT, tdb->track); + safef(var, sizeof(var), "%s_%s", INDEL_DOUBLE_INSERT, name); cgiMakeCheckBox(var, showDoubleInsert); printf("</TD><TD>Draw double horizontal lines when both genome and query have " "an insertion</TD></TR>\n<TR valign='top'><TD>"); - safef(var, sizeof(var), "%s_%s", INDEL_QUERY_INSERT, tdb->track); + safef(var, sizeof(var), "%s_%s", INDEL_QUERY_INSERT, name); cgiMakeCheckBox(var, showQueryInsert); printf("</TD><TD>Draw a vertical purple line for an insertion at the beginning or " "end of the <BR>query, orange for insertion in the middle of the query</TD></TR>\n<TR valign='top'><TD>"); - safef(var, sizeof(var), "%s_%s", INDEL_POLY_A, tdb->track); + safef(var, sizeof(var), "%s_%s", INDEL_POLY_A, name); /* We can highlight valid polyA's only if we have query sequence -- * so indelPolyA code piggiebacks on baseColor code: */ if (baseColorGotSequence(tdb)) { cgiMakeCheckBox(var, showPolyA); printf("</TD><TD>Draw a vertical green line where query has a polyA tail " "insertion</TD></TR>\n"); } printf("</TABLE>\n"); #else///ifndef BAM_CFG_UI_CHANGES printf("<P><B>Alignment Gap/Insertion Display Options</B><BR>\n"); - safef(var, sizeof(var), "%s_%s", INDEL_DOUBLE_INSERT, tdb->track); + safef(var, sizeof(var), "%s_%s", INDEL_DOUBLE_INSERT, name); cgiMakeCheckBox(var, showDoubleInsert); printf("Draw double horizontal lines when both genome and query have " "an insertion " "<BR>\n"); - safef(var, sizeof(var), "%s_%s", INDEL_QUERY_INSERT, tdb->track); + safef(var, sizeof(var), "%s_%s", INDEL_QUERY_INSERT, name); cgiMakeCheckBox(var, showQueryInsert); printf("Draw a vertical purple line for an insertion at the beginning or " "end of the query, orange for insertion in the middle of the query" "<BR>\n"); - safef(var, sizeof(var), "%s_%s", INDEL_POLY_A, tdb->track); + safef(var, sizeof(var), "%s_%s", INDEL_POLY_A, name); /* We can highlight valid polyA's only if we have query sequence -- * so indelPolyA code piggiebacks on baseColor code: */ if (baseColorGotSequence(tdb)) { cgiMakeCheckBox(var, showPolyA); printf("Draw a vertical green line where query has a polyA tail " "insertion" "<BR>\n"); } printf("<A HREF=\"%s\">Help on alignment gap/insertion display options</A>" "<BR>\n", INDEL_HELP_PAGE); #endif///ndef BAM_CFG_UI_CHANGES } } -static boolean tdbOrCartBoolean(struct cart *cart, struct trackDb *tdb, - char *settingName, char *defaultOnOff) -/* Query cart & trackDb to determine if a boolean variable is set. */ -{ -boolean alreadySet; -char optionStr[512]; -alreadySet = !sameString("off", - trackDbSettingOrDefault(tdb, settingName, defaultOnOff)); -safef(optionStr, sizeof(optionStr), "%s_%s", - settingName, tdb->track); -alreadySet = cartUsualBoolean(cart, optionStr, alreadySet); -return alreadySet; -} - -void indelEnabled(struct cart *cart, struct trackDb *tdb, float basesPerPixel, - boolean *retDoubleInsert, boolean *retQueryInsert, - boolean *retPolyA) -/* Query cart & trackDb to determine what indel display (if any) is enabled. Set - * basesPerPixel to 0.0 to disable check for zoom level. */ -{ -boolean apropos = indelAppropriate(tdb); -if (apropos && (basesPerPixel > 0.0)) +void indelShowOptions(struct cart *cart, struct trackDb *tdb) +/* Make HTML inputs for indel display options if any are applicable. */ { - // check indel max zoom - float showIndelMaxZoom = trackDbFloatSettingOrDefault(tdb, "showIndelMaxZoom", -1.0); - if ((showIndelMaxZoom >= 0) - && ((basesPerPixel > showIndelMaxZoom) || (showIndelMaxZoom == 0.0))) - apropos = FALSE; - } - -if (retDoubleInsert) - *retDoubleInsert = apropos && - tdbOrCartBoolean(cart, tdb, INDEL_DOUBLE_INSERT, "off"); -if (retQueryInsert) - *retQueryInsert = apropos && - tdbOrCartBoolean(cart, tdb, INDEL_QUERY_INSERT, "off"); -if (retPolyA) - *retPolyA = apropos && - tdbOrCartBoolean(cart, tdb, INDEL_POLY_A, "off"); +indelShowOptionsWithName(cart, tdb, tdb->track); } - /****** base position (ruler) controls *******/ static char *zoomOptions[] = { ZOOM_1PT5X, ZOOM_3X, ZOOM_10X, ZOOM_BASE }; void zoomRadioButtons(char *var, char *curVal) /* Make a list of radio buttons for all zoom options */ { int i; int size = ArraySize(zoomOptions); for (i = 0; i < size; i++) @@ -4537,36 +4599,36 @@ cgiMakeCheckBox(option, doScoreCtFilter); safef(option, sizeof(option), "%s.filterTopScorersCt", name); scoreFilterCt = cartUsualStringClosestToHome(cart, tdb, compositeLevel, "filterTopScorersCt", words[1]); puts(" <B> Show only items in top-scoring </B>"); cgiMakeIntVarWithLimits(option,atoi(scoreFilterCt),"Top-scoring count",0,1,100000); /* Only check size of table if track does not have subtracks */ if ( !compositeLevel && hTableExists(db, tdb->table)) printf(" (range: 1 to 100,000 total items: %d)\n",getTableSize(db, tdb->table)); else printf(" (range: 1 to 100,000)\n"); } cfgEndBox(boxed); } -void pslCfgUi(char *db, struct cart *cart, struct trackDb *tdb, char *prefix, char *title, boolean boxed) +void pslCfgUi(char *db, struct cart *cart, struct trackDb *tdb, char *name, char *title, boolean boxed) /* Put up UI for psl tracks */ { boxed = cfgBeginBoxAndTitle(tdb, boxed, title); -baseColorDropLists(cart, tdb); -indelShowOptions(cart, tdb); +baseColorDropLists(cart, tdb, name); +indelShowOptionsWithName(cart, tdb, name); cfgEndBox(boxed); } void netAlignCfgUi(char *db, struct cart *cart, struct trackDb *tdb, char *prefix, char *title, boolean boxed) /* Put up UI for net tracks */ { boxed = cfgBeginBoxAndTitle(tdb, boxed, title); boolean compositeLevel = isNameAtCompositeLevel(tdb,prefix); enum netColorEnum netColor = netFetchColorOption(cart, tdb, compositeLevel); char optString[256]; /* our option strings here */ safef(optString, ArraySize(optString), "%s.%s", prefix, NET_COLOR ); @@ -4942,31 +5004,31 @@ printf("%s ", "none"); } if(trackDbSettingClosestToHomeOn(tdb, "nmdFilter")) { boolean nmdDefault = FALSE; safef(varName, sizeof(varName), "hgt.%s.nmdFilter", name); nmdDefault = cartUsualBoolean(cart,varName, FALSE); // TODO: var name (hgt prefix) needs changing before ClosesToHome can be used printf("<p><b>Filter out NMD targets.</b>"); cgiMakeCheckBox(varName, nmdDefault); } if(!sameString(tdb->track, "tigrGeneIndex") && !sameString(tdb->track, "ensGeneNonCoding") && !sameString(tdb->track, "encodeGencodeRaceFrags")) - baseColorDrawOptDropDown(cart, tdb); + baseColorDropLists(cart, tdb, name); filterBy_t *filterBySet = filterBySetGet(tdb,cart,name); if(filterBySet != NULL) { filterBySetCfgUi(tdb,filterBySet); filterBySetFree(&filterBySet); } cfgEndBox(boxed); } static boolean isSpeciesOn(struct cart *cart, struct trackDb *tdb, char *species, char *option, int optionSize, boolean defaultState) /* check the cart to see if species is turned off or on (default is defaultState) */ { boolean ret = defaultState; safef(option, optionSize, "%s.%s", tdb->track, species); @@ -5497,35 +5559,35 @@ printf("<B>Minimum alignment quality:</B>\n"); safef(cartVarName, sizeof(cartVarName), "%s." BAM_MIN_ALI_QUAL, name); cartMakeIntVar(cart, cartVarName, atoi(trackDbSettingOrDefault(tdb, BAM_MIN_ALI_QUAL, BAM_MIN_ALI_QUAL_DEFAULT)), 4); puts("<BR>"); #endif///ndef BAM_CFG_UI_CHANGES if (isCustomTrack(name)) { // Auto-magic baseColor defaults for BAM, same as in hgTracks.c newCustomTrack hashAdd(tdb->settingsHash, BASE_COLOR_USE_SEQUENCE, cloneString("lfExtra")); hashAdd(tdb->settingsHash, BASE_COLOR_DEFAULT, cloneString("diffBases")); hashAdd(tdb->settingsHash, SHOW_DIFF_BASES_ALL_SCALES, cloneString(".")); hashAdd(tdb->settingsHash, "showDiffBasesMaxZoom", cloneString("100")); } -baseColorDrawOptDropDown(cart, tdb); +baseColorDropLists(cart, tdb, name); #ifdef BAM_CFG_UI_CHANGES puts("<BR>"); #endif///def BAM_CFG_UI_CHANGES -indelShowOptions(cart, tdb); +indelShowOptionsWithName(cart, tdb, name); printf("<BR>\n"); printf("<B>Additional coloring modes:</B><BR>\n"); safef(cartVarName, sizeof(cartVarName), "%s." BAM_COLOR_MODE, name); char *selected = cartUsualString(cart, cartVarName, trackDbSettingOrDefault(tdb, BAM_COLOR_MODE, BAM_COLOR_MODE_DEFAULT)); cgiMakeRadioButton(cartVarName, BAM_COLOR_MODE_STRAND, sameString(selected, BAM_COLOR_MODE_STRAND)); printf("Color by strand (blue for +, red for -)<BR>\n"); cgiMakeRadioButton(cartVarName, BAM_COLOR_MODE_GRAY, sameString(selected, BAM_COLOR_MODE_GRAY)); printf("Use gray for\n"); char cartVarName2[1024]; safef(cartVarName2, sizeof(cartVarName2), "%s." BAM_GRAY_MODE, name); int grayMenuSize = canPair ? ArraySize(grayLabels) : ArraySize(grayLabels)-1; char *sel2 = cartUsualString(cart, cartVarName2, trackDbSettingOrDefault(tdb, BAM_GRAY_MODE, BAM_GRAY_MODE_DEFAULT)); char onChange[2048]; @@ -5746,58 +5808,45 @@ (void)metadataForTable(db,childTdb,NULL); if(vocab == NULL) return cloneString(label); // No wrapping! char *words[15]; int count,ix; boolean found=FALSE; if((count = chopByWhite(cloneString(vocab), words,15)) <= 1) return cloneString(label); char *suffix=NULL; char *rootLabel = labelRoot(label,&suffix); for(ix=1;ix<count && !found;ix++) { -#define VOCAB_LINK "<A HREF='hgEncodeVocab?ra=%s&%s=\"%s\"' title='%s details' TARGET=ucscVocab>%s</A>" if(sameString(vocabType,words[ix])) // controlledVocabulary setting matches tag so all labels are linked { - int sz=strlen(VOCAB_LINK)+strlen(words[0])+strlen(words[ix])+2*strlen(label) + 10; - char *link=needMem(sz); - safef(link,sz,VOCAB_LINK,words[0],"term",words[ix],rootLabel,rootLabel); - if(suffix) - safecat(link,sz,suffix); - freeMem(words[0]); + char *link = controlledVocabLink(words[0],"term",words[ix],rootLabel,rootLabel,suffix); return link; } else if(countChars(words[ix],'=') == 1 && childTdb != NULL) // The name of a trackDb setting follows and will be the controlled vocab term { strSwapChar(words[ix],'=',0); if(sameString(vocabType,words[ix])) // tags match, but search for term { char * cvSetting = words[ix] + strlen(words[ix]) + 1; const char * cvTerm = metadataFindValue(childTdb,cvSetting); if(cvTerm != NULL) { - char *encodedTerm = cgiEncode((char *)cvTerm); - int sz=strlen(VOCAB_LINK)+strlen(words[0])+strlen(encodedTerm)+2*strlen(label) + 10; - char *link=needMem(sz); - safef(link,sz,VOCAB_LINK,words[0],(sameWord(cvSetting,"antibody")?"target":"term"),encodedTerm,cvTerm,rootLabel); - if(suffix) - safecat(link,sz,suffix); - freeMem(words[0]); - freeMem(encodedTerm); + char *link = controlledVocabLink(words[0],(sameWord(cvSetting,"antibody")?"target":"term"),(char *)cvTerm,(char *)cvTerm,rootLabel,suffix); return link; } } } } freeMem(words[0]); freeMem(rootLabel); return cloneString(label); } #define PM_BUTTON_UC "<IMG height=18 width=18 onclick=\"return (matSetMatrixCheckBoxes(%s%s%s%s%s%s) == false);\" id='btn_%s' src='../images/%s'>" #define MATRIX_RIGHT_BUTTONS_AFTER 8 #define MATRIX_BOTTOM_BUTTONS_AFTER 20 static void buttonsForAll()