809c73c649a713c1357c72a11cffe018dfa25feb braney Sat Jul 29 15:32:40 2017 -0700 remove hgComposite (RIP) diff --git src/hg/hgComposite/hgComposite.c src/hg/hgComposite/hgComposite.c deleted file mode 100644 index 494f981..0000000 --- src/hg/hgComposite/hgComposite.c +++ /dev/null @@ -1,1240 +0,0 @@ -/* hgComposite --- build a composite */ - -/* Copyright (C) 2017 The Regents of the University of California - * See README in this or parent directory for licensing information. */ -#include "common.h" -#include "linefile.h" -#include "hash.h" -#include "options.h" -#include "jksql.h" -#include "htmshell.h" -#include "web.h" -#include "cheapcgi.h" -#include "cart.h" -#include "cartTrackDb.h" -#include "genbank.h" -#include "hgConfig.h" -#include "hgHgvs.h" -#include "hui.h" -#include "grp.h" -#include "hCommon.h" -#include "hgFind.h" -#include "hPrint.h" -#include "jsHelper.h" -#include "memalloc.h" -#include "textOut.h" -#include "trackHub.h" -#include "hubConnect.h" -#include "twoBit.h" -#include "gpFx.h" -#include "bigGenePred.h" -#include "udc.h" -#include "knetUdc.h" -#include "cartTrackDb.h" -#include "trashDir.h" -#include "customComposite.h" - -#define hgCompEditPrefix "hgCompositeEdit_" -#define hgsAddTrack hgCompEditPrefix "addTrack" -#define hgsAddMathTrack hgCompEditPrefix "addMathTrack" -#define hgsDeleteMathTrack hgCompEditPrefix "deleteMathTrack" -#define hgsDeleteTrack hgCompEditPrefix "deleteTrack" -#define hgsAddVisTrack hgCompEditPrefix "addVisTrack" -#define hgsChangeGroup hgCompEditPrefix "changeGroup" -#define hgsCurrentGroup hgCompEditPrefix "currentGroup" -#define hgsCurrentComposite hgCompEditPrefix "currentComposite" -#define hgsMakeMathTrack hgCompEditPrefix "makeMathTrack" -#define hgsCurrentMathTrack hgCompEditPrefix "currentMathTrack" -#define hgsNewCompositeName hgCompEditPrefix "newCompositeName" -#define hgsNewMathTrackShortLabel hgCompEditPrefix "newMathTrackShortLabel" -#define hgsNewMathTrackLongLabel hgCompEditPrefix "newMathTrackLongLabel" -#define hgsNewCompositeShortLabel hgCompEditPrefix "newCompositeShortLabel" -#define hgsNewCompositeLongLabel hgCompEditPrefix "newCompositeLongLabel" -//#define hgCompositePrefix "hgComposite_" -#define hgDoNewComposite hgCompEditPrefix "doNewComposite" - -struct track -{ -struct track *next; -char *name; -char *shortLabel; -char *longLabel; -void *reserved; -}; - -struct composite -{ -struct composite *next; -char *name; -char *shortLabel; -char *longLabel; -struct track *trackList; -}; - -struct mathTrack -{ -struct mathTrack *next; -char *name; -char *shortLabel; -char *longLabel; -struct track *trackList; -}; - - -/* Global Variables */ -struct cart *cart; /* CGI and other variables */ -struct hash *oldVars = NULL; /* The cart before new cgi stuff added. */ -char *genome = NULL; /* Name of genome - mouse, human, etc. */ -char *database = NULL; /* Current genome database - hg17, mm5, etc. */ -struct grp *fullGroupList = NULL; /* List of all groups. */ - -// Null terminated list of CGI Variables we don't want to save permanently: -char *excludeVars[] = {"Submit", "submit", "hgva_startQuery", hgsAddTrack, hgsNewCompositeName, hgsNewCompositeShortLabel, hgsNewCompositeLongLabel, hgsNewMathTrackShortLabel, hgsNewMathTrackLongLabel, hgsChangeGroup, hgsAddVisTrack, hgsAddMathTrack, hgsDeleteMathTrack, "createNewComposite", "deleteComposite", "makeMathWig", NULL}; - -static struct trackDb *findTrack(char *name, struct trackDb *fullTrackList) -{ -struct trackDb *tdb; -for (tdb = fullTrackList; tdb != NULL; tdb = tdb->next) - { - if (sameString(name, tdb->track)) - return tdb; - } -errAbort("cannot find track"); -return NULL; -} - -void nbSpaces(int count) -/* Print some non-breaking spaces. */ -{ -int i; -for (i=0; i<count; ++i) - printf(" "); -} - -void addSomeCss() -/*#*** This should go in a .css file of course. */ -{ -printf("<style>\n" - "div.sectionLite { border-width: 1px; border-color: #"HG_COL_BORDER"; border-style: solid;" - " background-color: #FFFFFF; padding-left: 10px; padding-right: 10px; " - " padding-top: 8px; padding-bottom: 5px; margin-top: 5px; margin-bottom: 5px }\n" - ".sectionLiteHeader { font-weight: bold; font-size:larger; color:#000000;" - " text-align:left; vertical-align:bottom; white-space:nowrap; }\n" - "div.sectionLiteHeader.noReorderRemove { padding-bottom:5px; }\n" - "div.sourceFilter { padding-top: 5px; padding-bottom: 5px }\n" - "</style>\n"); -} - - -INLINE void startCollapsibleSection(char *sectionSuffix, char *title, boolean onByDefault) -// Wrap shared args to jsBeginCollapsibleSectionFontSize -{ -jsBeginCollapsibleSectionFontSize(cart, "hgva", sectionSuffix, title, onByDefault, "1.1em"); -} - -INLINE void startSmallCollapsibleSection(char *sectionSuffix, char *title, boolean onByDefault) -// Wrap shared args to jsBeginCollapsibleSectionFontSize -{ -jsBeginCollapsibleSectionFontSize(cart, "hgva", sectionSuffix, title, onByDefault, "0.9em"); -} - -#define endCollapsibleSection jsEndCollapsibleSection - - -static struct dyString *onChangeStart() -/* Start up a javascript onChange command */ -{ -struct dyString *dy = jsOnChangeStart(); -return dy; -} - - -static char *onChangeClade() -/* Return javascript executed when they change clade. */ -{ -struct dyString *dy = onChangeStart(); -jsDropDownCarryOver(dy, "clade"); -dyStringAppend(dy, " document.hiddenForm.org.value=0;"); -dyStringAppend(dy, " document.hiddenForm.db.value=0;"); -return jsOnChangeEnd(&dy); -} - -static char *onChangeOrg() -/* Return javascript executed when they change organism. */ -{ -struct dyString *dy = onChangeStart(); -jsDropDownCarryOver(dy, "clade"); -jsDropDownCarryOver(dy, "org"); -dyStringAppend(dy, " document.hiddenForm.db.value=0;"); -return jsOnChangeEnd(&dy); -} - -static char *onChangeDb() -/* Return javascript executed when they change database. */ -{ -struct dyString *dy = onChangeStart(); -jsDropDownCarryOver(dy, "clade"); -jsDropDownCarryOver(dy, "db"); -return jsOnChangeEnd(&dy); -} - -INLINE void printOption(char *val, char *selectedVal, char *label) -/* For rolling our own select without having to build conditional arrays/lists. */ -{ -printf("<OPTION VALUE='%s'%s>%s\n", val, (sameString(selectedVal, val) ? " SELECTED" : ""), label); -} - - -static struct composite *getCompositeList(char *db, char *hubName, struct hash *nameHash, struct trackDb *wigTracks) -{ -struct composite *compositeList = NULL; -FILE *f; - -if ((hubName != NULL) && ((f = fopen(hubName, "r")) != NULL)) - { - fclose(f); - // read hub to find names of composites and add them to compositeList - struct trackDb *tdbList = trackDbFromRa(hubName, NULL); - struct trackDb *tdb, *tdbNext; - struct composite *composite = NULL; - struct track *track = NULL; - - for(tdb = tdbList; tdb; tdb = tdbNext) - { - hashAdd(nameHash, tdb->track, tdb); - tdbNext = tdb->next; - trackDbFieldsFromSettings(tdb); - if (trackDbSetting(tdb, "compositeTrack")) - { - AllocVar(composite); - slAddHead(&compositeList, composite); - composite->name = tdb->track; - composite->shortLabel = tdb->shortLabel; - composite->longLabel = tdb->longLabel; - } - else - { - if (composite == NULL) - errAbort("track not in composite"); - AllocVar(track); - track->name = tdb->track; - track->shortLabel = tdb->shortLabel; - track->longLabel = tdb->longLabel; - slAddHead(&composite->trackList, track); - if (sameString(tdb->type, "mathWig")) - { - struct mathTrack *mathTrack = (struct mathTrack *)track; - char *equation = hashMustFindVal(tdb->settingsHash, "trackNames"); - char *words[100]; - int count = chopByWhite(equation, words, sizeof(words)/sizeof(char *)); - struct track *subTrack; - int ii; - for (ii=0; ii < count; ii++) - { - AllocVar(subTrack); - slAddHead(&mathTrack->trackList, subTrack); - subTrack->name = cloneString(words[ii]); - struct trackDb *tdb = findTrack(subTrack->name, wigTracks); - subTrack->shortLabel = tdb->shortLabel; - subTrack->longLabel = tdb->longLabel; - } - } - } - } - } - -return compositeList; -} - -static char *getSqlBigWig(struct sqlConnection *conn, char *db, struct trackDb *tdb) -{ -char buffer[4096]; - -safef(buffer, sizeof buffer, "NOSQLINJ select fileName from %s", tdb->table); -return sqlQuickString(conn, buffer); -} - -static int snakePalette2[] = -{ -0x1f77b4, 0xaec7e8, 0xff7f0e, 0xffbb78, 0x2ca02c, 0x98df8a, 0xd62728, 0xff9896, 0x9467bd, 0xc5b0d5, 0x8c564b, 0xc49c94, 0xe377c2, 0xf7b6d2, 0x7f7f7f, 0xc7c7c7, 0xbcbd22, 0xdbdb8d, 0x17becf, 0x9edae5 -}; - - -char *getUrl(struct sqlConnection *conn, char *db, struct trackDb *wigTracks, struct track *track) -{ -struct trackDb *tdb = findTrack(track->name, wigTracks); -char *bigDataUrl = trackDbSetting(tdb, "bigDataUrl"); -if (bigDataUrl == NULL) - { - if (startsWith("bigWig", tdb->type)) - bigDataUrl = getSqlBigWig(conn, db, tdb); - } -return bigDataUrl; -} - -void outTdb(struct sqlConnection *conn, char *db, FILE *f, char *name, struct trackDb *tdb, char *parent, unsigned int color, struct track *track, struct trackDb *wigTracks) -{ -char *dataUrl = NULL; -char *bigDataUrl = trackDbSetting(tdb, "bigDataUrl"); - -if (bigDataUrl == NULL) - { - if (startsWith("bigWig", tdb->type)) - dataUrl = getSqlBigWig(conn, db, tdb); - } -struct hashCookie cookie = hashFirst(tdb->settingsHash); -struct hashEl *hel; -fprintf(f, "\ttrack %s\n", name); -while ((hel = hashNext(&cookie)) != NULL) - { - if (sameString(hel->name, "mathDataUrl")) - { - fprintf(f, "\ttrackNames "); - struct mathTrack *mt = (struct mathTrack *)track; - struct track *tr = mt->trackList; - for(; tr; tr = tr->next) - { - fprintf(f, "%s ", tr->name); - } - fprintf(f, "\n"); - - fprintf(f, "\tmathDataUrl "); - tr = mt->trackList; - for(; tr; tr = tr->next) - { - fprintf(f, "%s ", getUrl(conn, db, wigTracks, tr)); - } - fprintf(f, "\n"); - } - else if (differentString(hel->name, "parent") && differentString(hel->name, "polished")&& differentString(hel->name, "color")&& differentString(hel->name, "track")&& differentString(hel->name, "trackNames")) - fprintf(f, "\t%s %s\n", hel->name, (char *)hel->val); - } -if (bigDataUrl == NULL) - { - if (dataUrl != NULL) - fprintf(f, "\tbigDataUrl %s\n", dataUrl); - } -fprintf(f, "\tparent %s\n",parent); -fprintf(f, "\tcolor %d,%d,%d\n", (color >> 16) & 0xff,(color >> 8) & 0xff,color & 0xff); -fprintf(f, "\n"); -} - -static void outComposite(FILE *f, struct composite *composite) -{ -char *parent = composite->name; -char *shortLabel = composite->shortLabel; -char *longLabel = composite->longLabel; -fprintf(f,"track %s\n\ -shortLabel %s\n\ -compositeTrack on\n\ -aggregate none\n\ -longLabel %s\n\ -%s on\n\ -type wig \n\ -visibility full\n\n", parent, shortLabel, longLabel, CUSTOM_COMPOSITE_SETTING); -} - -static void outHubHeader(FILE *f, char *db, char *hubName) -{ -char *hubFile = strrchr(hubName, '/') + 1; - -fprintf(f,"hub hub1\n\ -shortLabel User Composite\n\ -longLabel User Composite\n\ -genomesFile %s\n\ -email braney@soe.ucsc.edu\n\ -descriptionUrl hub.html\n\n", hubFile); -fprintf(f,"genome %s\n\ -trackDb %s\n\n", db, hubFile); -} - -static char *getHubName(char *db) -{ -struct tempName hubTn; -char buffer[4096]; -safef(buffer, sizeof buffer, "%s-%s", customCompositeCartName, db); -char *hubName = cartOptionalString(cart, buffer); - -if (hubName == NULL) - { - trashDirDateFile(&hubTn, "hgComposite", "hub", ".txt"); - hubName = cloneString(hubTn.forCgi); - cartSetString(cart, buffer, hubName); - FILE *f = mustOpen(hubName, "a"); - outHubHeader(f, db, hubName); - fclose(f); - cartSetString(cart, "hubUrl", hubName); - cartSetString(cart, hgHubConnectRemakeTrackHub, hubName); - } -return hubName; -} - - -static void outputCompositeHub(char *db, char *hubName, struct composite *compositeList, struct hash *nameHash, struct trackDb *wigTracks) -{ -chmod(hubName, 0666); -FILE *f = mustOpen(hubName, "w"); - -outHubHeader(f, db, hubName); -int useColor = 0; -struct composite *composite; -struct sqlConnection *conn = hAllocConn(db); -for(composite = compositeList; composite; composite = composite->next) - { - outComposite(f, composite); - struct trackDb *tdb; - struct track *track; - for (track = composite->trackList; track; track = track->next) - { - tdb = hashMustFindVal(nameHash, track->name); - - outTdb(conn, db, f, track->name,tdb, composite->name, snakePalette2[useColor], track, wigTracks); - useColor++; - if (useColor == (sizeof snakePalette2 / sizeof(int))) - useColor = 0; - } - } -fclose(f); -hFreeConn(&conn); -} - - -void topLabelSpansStart(char *label) -{ -printf("<span style='display: inline-block; padding-right: 5px;'>" - "<span style='display: block;'>%s</span>\n" - "<span style='display: block; padding-bottom: 5px;'>\n", label); -} - -void topLabelSpansEnd() -{ -printf("</span></span>"); -} - - -void printCtAndHubButtons() -/* Print a div with buttons for hgCustom and hgHubConnect */ -{ -boolean hasCustomTracks = customTracksExist(cart, NULL); -puts("<div style='padding-top: 5px; padding-bottom: 5px'>"); -hOnClickButton("prtCtHub_CtBut", "document.customTrackForm.submit(); return false;", - hasCustomTracks ? CT_MANAGE_BUTTON_LABEL : CT_ADD_BUTTON_LABEL); -printf(" "); -if (hubConnectTableExists()) - hOnClickButton("prtCtHub_TrkHub", "document.trackHubForm.submit(); return false;", "track hubs"); -nbSpaces(3); -printf("To reset <B>all</B> user cart settings (including custom tracks), \n" - "<A HREF=\"cartReset?destination=%s\">click here</A>.\n", - cgiScriptName()); -puts("</div>"); -} - -void hgGatewayCladeGenomeDb() -/* Make a row of labels and row of buttons like hgGateway, but not using tables. */ -{ -boolean gotClade = hGotClade(); -if (gotClade) - { - topLabelSpansStart("clade"); - printCladeListHtml(genome, "change", onChangeClade()); - topLabelSpansEnd(); - } -topLabelSpansStart("genome"); -if (gotClade) - printGenomeListForCladeHtml(database, "change", onChangeOrg()); -else - printGenomeListHtml(database, "change", onChangeOrg()); -topLabelSpansEnd(); -topLabelSpansStart("assembly"); -printAssemblyListHtml(database, "change", onChangeDb()); -topLabelSpansEnd(); -puts("<BR>"); -topLabelSpansEnd(); -topLabelSpansStart(""); -printf("</span>\n"); -topLabelSpansEnd(); -puts("<BR>"); -} - -void printAssemblySection() -/* Print assembly-selection stuff. - * Redrawing the whole page when the assembly changes seems fine to me. */ -{ -//#*** ---------- More copied verbatim, from hgTables/mainPage.c: ----------- -/* Hidden form - for benefit of javascript. */ - { - static char *saveVars[] = { - "clade", "org", "db", }; - jsCreateHiddenForm(cart, cgiScriptName(), saveVars, ArraySize(saveVars)); - } - - -//#*** ------------------ end verbatim --------------- - -printf("<div class='sectionLiteHeader noReorderRemove'>" - "Select Genome Assembly</div>\n"); - -/* Print clade, genome and assembly line. */ -hgGatewayCladeGenomeDb(); - -} - -static void printCompositeList(struct composite *compositeList, struct composite *currentComposite) -{ -if (compositeList != NULL) - { - - printf("<div class='sectionLiteHeader noReorderRemove'>" - "My Composites</div>\n"); - - int count = slCount(compositeList); - char *labels[count]; - char *names[count]; - count = 0; - for(; compositeList; compositeList = compositeList->next) - { - labels[count] = compositeList->shortLabel; - names[count] = compositeList->name; - count++; - } - printf("Current composite: "); - cgiMakeDropListFull("compositeList", labels, names, count, - currentComposite->name, - "change", - "var e = document.getElementById('compositeList'); \ - var strUser = e.options[e.selectedIndex].value; \ - document.changeCompositeForm.elements['"hgsCurrentComposite"'].value = strUser; \ - document.changeCompositeForm.submit();"); - //document.addTrackForm.elements['hgComp_track'] = strUser;"); - - hOnClickButton("deleteComposite", "document.deleteCompositeForm.submit(); return false;", "Delete Composite"); - } -hOnClickButton("new2Composite", "document.makeNewCompositeForm.submit(); return false;", "New Composite"); - -} - - -static void printCompositeLabels(struct composite *composite) -{ -if (composite == NULL) - return; - -printf("<BR>short label "); -cgiMakeTextVar(hgsNewCompositeShortLabel, composite->shortLabel, 29); -printf("<BR>long label "); -cgiMakeTextVar(hgsNewCompositeLongLabel, composite->longLabel, 29); -printf("<BR>"); -hOnClickButton("selVar_MakeNewComposite", - "var e = document.getElementById('"hgsNewCompositeLongLabel"'); \ - var strUser = e.value; \ - document.editCompositeForm.elements['"hgsNewCompositeLongLabel"'].value = strUser; \ - var e = document.getElementById('"hgsNewCompositeShortLabel"'); \ - var strUser = e.value; \ - document.editCompositeForm.elements['"hgsNewCompositeShortLabel"'].value = strUser; \ -document.editCompositeForm.submit();" , "make changes"); -printf("<BR>"); -} - -static boolean printMakeMath(struct mathTrack *currentMathTrack) -{ -if (currentMathTrack == NULL) - { - hOnClickButton("makeMathWig", "document.makeMathWigForm.submit(); return FLASE;", "Add Math Track to Composite"); - - - return FALSE; - } - -printf("<BR>short label "); -cgiMakeTextVar(hgsNewMathTrackShortLabel, currentMathTrack->shortLabel, 29); -printf("<BR>long label "); -cgiMakeTextVar(hgsNewMathTrackLongLabel, currentMathTrack->longLabel, 29); -struct track *track; -hOnClickButton("selVar_newMathLabels", - "var e = document.getElementById('"hgsNewMathTrackLongLabel"'); \ - var strUser = e.value; \ - document.editMathTrackForm.elements['"hgsNewMathTrackLongLabel"'].value = strUser; \ - var e = document.getElementById('"hgsNewMathTrackShortLabel"'); \ - var strUser = e.value; \ - document.editMathTrackForm.elements['"hgsNewMathTrackShortLabel"'].value = strUser; \ -document.editMathTrackForm.submit();" , "make changes"); -printf("<BR>"); -printf("<table id=\"sessionTable\" class=\"sessionTable stripe hover row-border compact\" borderwidth=0>\n"); -printf("<thead><tr>"); -printf("<TD><B>Name</B></TD><TD>Color</TD><TD>Edit</TD><TD>Delete</TD>"); -printf("</tr></thead><tbody>"); -if (currentMathTrack) - for(track = currentMathTrack->trackList; track; track = track->next) - { - printf("<TR>\n"); - printf("<TD>%s</TD>",track->shortLabel); - printf("<TD>COLORSELECTOR</TD>"); - printf("<TD>"); - hOnClickButton("selVar_AddAllVis", "document.addVisTrackForm.submit(); return false;", "Edit Track"); - printf("</TD>"); - printf("<TD>"); - char javaScript[4096]; - safef(javaScript, sizeof javaScript, - "document.deleteMathTrackForm.elements['"hgsDeleteMathTrack"'].value = '%s'; " - "document.deleteMathTrackForm.submit(); return false;", - track->name); - char buttonName[1024]; - safef(buttonName, sizeof buttonName, "delMathTrack%s", track->name); - hOnClickButton(buttonName, javaScript, "Delete Track"); - printf("</TD>"); - printf("</TR>\n"); - } -printf("</tbody></table>"); -return TRUE; -} - - -static void printTrackList(struct composite *composite) -{ -printf("<table id=\"sessionTable\" class=\"sessionTable stripe hover row-border compact\" borderwidth=0>\n"); -printf("<thead><tr>"); -printf("<TD><B>Name</B></TD><TD>Color</TD><TD>Edit</TD><TD>Delete</TD>"); -printf("</tr></thead><tbody>"); - -struct track *track; -if (composite) - for(track = composite->trackList; track; track = track->next) - { - printf("<TR>\n"); - printf("<TD>%s</TD>",track->shortLabel); - printf("<TD>COLORSELECTOR</TD>"); -printf("<TD>"); -hOnClickButton("selVar_AddAllVis", "document.addVisTrackForm.submit(); return false;", "Edit Track"); -printf("</TD>"); -printf("<TD>"); - char javaScript[4096]; - safef(javaScript, sizeof javaScript, - "document.deleteTrackForm.elements['"hgsDeleteTrack"'].value = '%s'; " - "document.deleteTrackForm.submit(); return false;", - track->name); - char buttonName[1024]; - safef(buttonName, sizeof buttonName, "delTrack%s", track->name); - hOnClickButton(buttonName, javaScript, "Delete Track"); -printf("</TD>"); - printf("</TR>\n"); - } -printf("</table>"); -} - - -static boolean trackCanBeAdded(struct trackDb *tdb) -{ -return (tdb->subtracks == NULL) && !startsWith("wigMaf",tdb->type) && (startsWith("wig",tdb->type) || startsWith("bigWig",tdb->type)) ; -} - -static void availableTracks(char *db, struct grp *groupList, struct trackDb *fullTrackList, char *formName, char *varName) -{ -printf("<H4>Add tracks from %s</H4>", db); - -char *curGroupName = cartOptionalString(cart, hgsCurrentGroup); -printf("<BR>groups: "); -char **labels, **names; -int count = slCount(groupList); -AllocArray(labels, count); -AllocArray(names, count); -count = 0; -struct grp *grp; -for(grp = groupList; grp; grp = grp->next) - { - labels[count] = grp->label; - names[count] = grp->name; - count++; - } -char buffer[1024]; -safef(buffer, sizeof buffer, "availGroups%s", formName); -char javaScript[4096]; -safef(javaScript, sizeof javaScript, - "var e = document.getElementById('availGroups%s'); \ - var strUser = e.options[e.selectedIndex].value; \ - document.changeGroupForm.elements['"hgsCurrentGroup"'].value = strUser; \ - document.changeGroupForm.submit();", formName); -cgiMakeDropListFull(buffer, labels, names, count, - curGroupName, - "change", javaScript); - -struct grp *curGroup; -if (curGroupName == NULL) - curGroup = groupList; -else - { - for(curGroup = groupList; curGroup; curGroup = curGroup->next) - { - if (sameString(curGroupName, curGroup->name)) - break; - } - if (curGroup == NULL) - errAbort("cannot find current group"); - } - -struct trackDb *tdb; -count = 0; -for(tdb = fullTrackList; tdb; tdb = tdb->next) - { - if (sameString(tdb->grp, curGroup->name)) - count++; - } - -AllocArray(labels, count); -AllocArray(names, count); -count = 0; -for(tdb = fullTrackList; tdb; tdb = tdb->next) - { - if (sameString(tdb->grp, curGroup->name)) - { - labels[count] = tdb->shortLabel; - names[count] = tdb->track; - count++; - } - } - -printf("track:"); -safef(buffer, sizeof buffer, "availTracks%s", formName); -cgiMakeDropListFull(buffer, labels, names, count, - *names, - "change", ""); -safef(javaScript, sizeof javaScript, - "var e = document.getElementById('availTracks%s'); \ - var strUser = e.options[e.selectedIndex].value; \ - document.%s.elements['%s'].value = strUser; \ - document.%s.submit();", formName, formName, varName, formName); -hOnClickButton(formName, javaScript, "add track"); - -printf("<BR>"); -printf("<BR>"); -printf("<BR>"); -hOnClickButton("selVar_AddAllVis", "document.addVisTrackForm.submit(); return false;", "Add All Visibile Wiggles"); -} - -void doMainPage(char *db, struct grp *groupList, struct trackDb *fullTrackList, struct composite *currentComposite, struct composite *compositeList, struct mathTrack *currentMathTrack) -/* Print out initial HTML of control page. */ -{ -jsInit(); -webIncludeResourceFile("jquery-ui.css"); -webIncludeResourceFile("ui.dropdownchecklist.css"); -addSomeCss(); -#ifdef NOTNOW -printAssemblySection(); - -puts("<BR>"); -printf("<div class='sectionLiteHeader noReorderRemove'>" - "Add Hubs and Custom Tracks </div>\n"); -printCtAndHubButtons(); -#endif - -hPrintf("<FORM ACTION='%s' NAME='changeGroupForm'>", cgiScriptName()); -cartSaveSession(cart); -cgiMakeHiddenVar(hgsCurrentGroup, ""); -hPrintf("</FORM>\n"); - -hPrintf("<FORM ACTION='%s' NAME='changeCompositeForm'>", cgiScriptName()); -cartSaveSession(cart); -cgiMakeHiddenVar(hgsCurrentComposite, ""); -hPrintf("</FORM>\n"); - -if (currentComposite) - { - hPrintf("<FORM ACTION='%s' NAME='deleteCompositeForm'>", cgiScriptName()); - cgiMakeHiddenVar("deleteComposite", currentComposite->name); - cartSaveSession(cart); - hPrintf("</FORM>\n"); - } - -hPrintf("<FORM ACTION='%s' NAME='makeMathWigForm'>", cgiScriptName()); -cgiMakeHiddenVar("makeMathWig", "on"); -cartSaveSession(cart); -hPrintf("</FORM>\n"); - -hPrintf("<FORM ACTION='%s' NAME='makeNewCompositeForm'>", cgiScriptName()); -cgiMakeHiddenVar("createNewComposite", "on"); -cartSaveSession(cart); -hPrintf("</FORM>\n"); - -hPrintf("<FORM ACTION='%s' NAME='editMathTrackForm'>", cgiScriptName()); -cartSaveSession(cart); -cgiMakeHiddenVar(hgsNewMathTrackShortLabel, ""); -cgiMakeHiddenVar(hgsNewMathTrackLongLabel, ""); -hPrintf("</FORM>\n"); - -hPrintf("<FORM ACTION='%s' NAME='editCompositeForm'>", cgiScriptName()); -cartSaveSession(cart); -cgiMakeHiddenVar(hgsNewCompositeShortLabel, ""); -cgiMakeHiddenVar(hgsNewCompositeLongLabel, ""); -hPrintf("</FORM>\n"); - -hPrintf("<FORM ACTION='%s' NAME='addVisTrackForm'>", cgiScriptName()); -cartSaveSession(cart); -cgiMakeHiddenVar(hgsAddVisTrack, ""); -hPrintf("</FORM>\n"); - -hPrintf("<FORM ACTION='%s' NAME='deleteTrackForm'>", cgiScriptName()); -cartSaveSession(cart); -cgiMakeHiddenVar(hgsDeleteTrack, ""); -hPrintf("</FORM>\n"); - -hPrintf("<FORM ACTION='%s' NAME='deleteMathTrackForm'>", cgiScriptName()); -cartSaveSession(cart); -cgiMakeHiddenVar(hgsDeleteMathTrack, ""); -hPrintf("</FORM>\n"); - -hPrintf("<FORM ACTION='%s' NAME='addMathTrackForm'>", cgiScriptName()); -cartSaveSession(cart); -cgiMakeHiddenVar(hgsAddMathTrack, ""); -hPrintf("</FORM>\n"); - -hPrintf("<FORM ACTION='%s' NAME='addTrackForm'>", cgiScriptName()); -cartSaveSession(cart); -cgiMakeHiddenVar(hgsAddTrack, ""); -hPrintf("</FORM>\n"); - -/* Hidden form for jumping to custom tracks CGI. */ -hPrintf("<FORM ACTION='%s' NAME='customTrackForm'>", hgCustomName()); -cartSaveSession(cart); -hPrintf("</FORM>\n"); - -/* Hidden form for jumping to track hub manager CGI. */ -hPrintf("<FORM ACTION='%s' NAME='trackHubForm'>", hgHubConnectName()); -cartSaveSession(cart); -hPrintf("</FORM>\n"); - -printf("<FORM ACTION=\"%s\" NAME=\"mainForm\" ID=\"mainForm\" METHOD=%s>\n", - cgiScriptName(), cartUsualString(cart, "formMethod", "GET")); -cartSaveSession(cart); - -printf("</FORM>"); -puts("<BR>"); -puts("<BR>"); -printCompositeList(compositeList, currentComposite); -puts("<BR>"); -printCompositeLabels(currentComposite); -puts("<BR>"); - -printf("<div id=\"tabs\">" - "<ul> <li><a href=\"#addTracksToComposite\">Add Tracks To Composite</a></li>" - "<li><a href=\"#addTracksToMathWig\">Add Tracks to Math Wig</a></li> " - "</ul> "); - -printf("<div id=\"addTracksToComposite\" class=\"hubList\"> \n"); -printTrackList(currentComposite); -availableTracks(db, groupList, fullTrackList, "addTrackForm", hgsAddTrack ); -puts("<BR>"); -printf("</div>"); - -printf("<div id=\"addTracksToMathWig\" class=\"hubList\"> \n"); -if (printMakeMath(currentMathTrack)) - availableTracks(db, groupList, fullTrackList, "addMathTrackForm", hgsAddMathTrack); -puts("<BR>"); -printf("</div>"); -printf("</div>"); -printf("</FORM>"); -jsReloadOnBackButton(cart); - -webNewSection("Using the Composite Builder"); -webIncludeHelpFileSubst("hgCompositeHelp", NULL, FALSE); -jsIncludeFile("jquery-ui.js", NULL); -jsIncludeFile("hgVarAnnogrator.js", NULL); -jsIncludeFile("ui.dropdownchecklist.js", NULL); -jsIncludeFile("ddcl.js", NULL); -} - -void doUi(char *db, struct grp *groupList, struct trackDb *fullTrackList,struct composite *currentComposite, struct composite *compositeList, struct mathTrack *currentMathTrack) -/* Set up globals and make web page */ -{ -cartWebStart(cart, db, "Composite Editor"); -jsIncludeFile("jquery.js", NULL); -jsIncludeFile("utils.js", NULL); -jsIncludeFile("jquery-ui.js", NULL); - -webIncludeResourceFile("jquery-ui.css"); - -jsIncludeFile("ajax.js", NULL); -jsIncludeFile("hgHubConnect.js", NULL); -jsIncludeFile("jquery.cookie.js", NULL); - -doMainPage(database, groupList, fullTrackList, currentComposite, compositeList, currentMathTrack); -cartWebEnd(); -} - -static void addWigs(struct hash *hash, struct trackDb **wigList, struct trackDb *list) -// Add tracks that are acceptable in custom composites. -{ -if (list == NULL) - return; - -struct trackDb *tdb, *tdbNext; -for(tdb = list; tdb; tdb = tdbNext) - { - tdbNext = tdb->next; - addWigs(hash, wigList, tdb->subtracks); - - if (trackCanBeAdded(tdb)) - { - slAddHead(wigList, tdb); - hashStore(hash, tdb->grp); - } - } - -} - -char *makeUnique(struct hash *nameHash, struct trackDb *tdb) -// Make the name of this track unique. -{ -char *skipHub = trackHubSkipHubName(tdb->track); -if (hashLookup(nameHash, skipHub) == NULL) - { - hashAdd(nameHash, tdb->track, tdb); - return skipHub; - } - -unsigned count = 0; -char buffer[4096]; - -for(;; count++) - { - safef(buffer, sizeof buffer, "%s%d", skipHub, count); - if (hashLookup(nameHash, buffer) == NULL) - { - hashAdd(nameHash, buffer, tdb); - return cloneString(buffer); - } - } - -return NULL; -} - -static bool subtrackEnabledInTdb(struct trackDb *subTdb) -/* Return TRUE unless the subtrack was declared with "subTrack ... off". */ -{ -bool enabled = TRUE; -char *words[2]; -char *setting; -if ((setting = trackDbLocalSetting(subTdb, "parent")) != NULL) - { - if (chopLine(cloneString(setting), words) >= 2) - if (sameString(words[1], "off")) - enabled = FALSE; - } -else - return subTdb->visibility != tvHide; - -return enabled; -} - -bool isSubtrackVisible(struct trackDb *tdb) -/* Has this subtrack not been deselected in hgTrackUi or declared with - * * "subTrack ... off"? -- assumes composite track is visible. */ -{ -boolean overrideComposite = (NULL != cartOptionalString(cart, tdb->track)); -bool enabledInTdb = subtrackEnabledInTdb(tdb); -char option[1024]; -safef(option, sizeof(option), "%s_sel", tdb->track); -boolean enabled = cartUsualBoolean(cart, option, enabledInTdb); -if (overrideComposite) - enabled = TRUE; -return enabled; -} - - -bool isParentVisible( struct trackDb *tdb) -// Are this track's parents visible? -{ -if (tdb->parent == NULL) - return TRUE; - -if (!isParentVisible(tdb->parent)) - return FALSE; - -char *cartVis = cartOptionalString(cart, tdb->parent->track); -boolean vis; -if (cartVis != NULL) - vis = differentString(cartVis, "hide"); -else if (tdbIsSuperTrack(tdb->parent)) - vis = tdb->parent->isShow; -else - vis = tdb->parent->visibility != tvHide; - -return vis; -} - - -struct mathTrack *getMathTracks(struct composite *compositeList) -{ -struct mathTrack *mathTrackList = NULL; - -return mathTrackList; -} - -static char *createNewCompositeName(struct hash *nameHash) -{ -static int compositeNumber = 0; -char buffer[4096]; -for(;;) - { - safef(buffer, sizeof buffer, "userTrack%d", compositeNumber); - if (hashLookup(nameHash, buffer) == NULL) - { - hashStore(nameHash, buffer); - return cloneString(buffer); - } - compositeNumber++; - } -} - -int main(int argc, char *argv[]) -/* Process command line. */ -{ -long enteredMainTime = clock1000(); -if (hIsPrivateHost()) - pushCarefulMemHandler(LIMIT_2or6GB); - -cgiSpoof(&argc, argv); -htmlPushEarlyHandlers(); /* Make errors legible during initialization. */ -oldVars = hashNew(10); -cart = cartAndCookie(hUserCookie(), excludeVars, oldVars); - -/* Set up global variables. */ -getDbAndGenome(cart, &database, &genome, oldVars); -initGenbankTableNames(database); - -int timeout = cartUsualInt(cart, "udcTimeout", 300); -if (udcCacheTimeout() < timeout) - udcSetCacheTimeout(timeout); -knetUdcInstall(); - -struct trackDb *fullTrackList = NULL; /* List of all tracks in database. */ -struct trackDb *wigTracks = NULL; /* List of all wig tracks */ -cartTrackDbInit(cart, &fullTrackList, &fullGroupList, TRUE); -struct hash *groupHash = newHash(5); -addWigs(groupHash, &wigTracks, fullTrackList); -struct grp *grp, *grpNext, *groupList = NULL; - -for(grp = fullGroupList; grp; grp = grpNext) - { - grpNext = grp->next; - if (hashLookup(groupHash, grp->name) != NULL) - slAddHead(&groupList, grp); - } - -slReverse(&groupList); - -char *hubName = getHubName(database); -struct hash *nameHash = newHash(5); -struct composite *compositeList = getCompositeList(database, hubName, nameHash, wigTracks); - -char *deleteCompositeName = cgiOptionalString("deleteComposite"); -if (deleteCompositeName) - { - struct composite *composite, *prevComposite = NULL; - for (composite = compositeList; composite; prevComposite = composite, composite = composite->next) - { - if (sameString(composite->name, deleteCompositeName)) - break; - } - if (composite) - { - if (composite == compositeList) - compositeList = compositeList->next; - else - prevComposite->next = composite->next; - } - } - -struct composite *currentComposite = NULL; -char *currentCompositeName = cartOptionalString(cart, hgsCurrentComposite); - -if (currentCompositeName != NULL) - { - for (currentComposite = compositeList; currentComposite; currentComposite = currentComposite->next) - if (sameString(currentComposite->name, currentCompositeName)) - break; - } -if (currentCompositeName == NULL) - currentComposite = compositeList; - -if (currentComposite == NULL) - currentComposite = compositeList; - -char *createNewComposite = cartOptionalString(cart, "createNewComposite"); -if (createNewComposite != NULL) - { - struct composite *composite; - AllocVar(composite); - slAddHead(&compositeList, composite); - currentComposite = composite; - - composite->name = createNewCompositeName(nameHash); - composite->shortLabel = cloneString("Short Label"); - composite->longLabel = cloneString("Long Label"); - } - -char *newShortLabel = cgiOptionalString(hgsNewCompositeShortLabel); -if (newShortLabel != NULL) - { - if (currentComposite != NULL) - { - currentComposite->shortLabel = cloneString(newShortLabel); - currentComposite->longLabel = cloneString(cgiOptionalString(hgsNewCompositeLongLabel)); - } - } - -struct mathTrack *currentMathTrack = NULL; - -char *currentMathTrackName = cartOptionalString(cart, hgsCurrentMathTrack); -char *makeMathWig = cartOptionalString(cart, "makeMathWig"); - -if (makeMathWig != NULL) - { - AllocVar(currentMathTrack); - if (currentComposite == NULL) - errAbort("need currentComposite"); - slAddHead(¤tComposite->trackList, currentMathTrack); - currentMathTrack->name = createNewCompositeName(nameHash); - currentMathTrack->shortLabel = cloneString("MathWig Short"); - currentMathTrack->longLabel = cloneString("MathWig Long Label"); - cartSetString(cart, hgsCurrentMathTrack, currentMathTrack->name); - struct trackDb *tdb; - AllocVar(tdb); - hashAdd(nameHash, currentMathTrack->name, tdb); - tdb->track = currentMathTrack->name; - tdb->type = "mathWig"; - tdb->settingsHash = newHash(5); - hashAdd(tdb->settingsHash, "shortLabel",currentMathTrack->shortLabel); - hashAdd(tdb->settingsHash, "longLabel", currentMathTrack->longLabel); - hashAdd(tdb->settingsHash, "type", "mathWig"); - hashAdd(tdb->settingsHash, "mathDataUrl", ""); - } -else if (currentMathTrackName != NULL) - { - if (currentComposite == NULL) - errAbort("need currentComposite"); - for (currentMathTrack = (struct mathTrack *)currentComposite->trackList; currentMathTrack; currentMathTrack = currentMathTrack->next) - if (sameString(currentMathTrack->name, currentMathTrackName)) - break; - } - -newShortLabel = cgiOptionalString(hgsNewMathTrackShortLabel); -if (newShortLabel != NULL) - { - if (currentMathTrack != NULL) - { - struct trackDb *tdb = hashMustFindVal(nameHash, currentMathTrack->name); - hashReplace(tdb->settingsHash, "shortLabel",cloneString(newShortLabel)); - hashReplace(tdb->settingsHash, "longLabel", cloneString(cgiOptionalString(hgsNewMathTrackLongLabel))); - } - } - -char *addAllVisible = cartOptionalString(cart, hgsAddVisTrack); -if (addAllVisible != NULL) - { - struct trackDb *tdb; - - for(tdb = wigTracks; tdb; tdb = tdb->next) - { - if (isParentVisible(tdb) && isSubtrackVisible(tdb)) - { - struct track *track; - AllocVar(track); - track->name = makeUnique(nameHash, tdb); - track->shortLabel = tdb->shortLabel; - track->longLabel = tdb->longLabel; - slAddHead(¤tComposite->trackList, track); - } - } - } - -char *newMathTrackName = cartOptionalString(cart, hgsAddMathTrack); -if (newMathTrackName != NULL) - { - if (currentMathTrack == NULL) - warn("cannot add track without specifying a mathwig"); - else - { - struct trackDb *tdb = findTrack(newMathTrackName, wigTracks); - - struct track *track; - AllocVar(track); - track->name = makeUnique(nameHash, tdb); - track->shortLabel = tdb->shortLabel; - track->longLabel = tdb->longLabel; - slAddHead(¤tMathTrack->trackList, track); - } - } - -char *deleteTrackName = cartOptionalString(cart, hgsDeleteTrack); -if (deleteTrackName != NULL) - { - if (currentComposite == NULL) - warn("cannot delete track without specifying a composite"); - else - { - struct track *track, *prevTrack = NULL; - for(track = currentComposite->trackList; track; prevTrack = track,track = track->next) - { - if (sameString(track->name, deleteTrackName)) - break; - } - if (track != NULL) - { - if (prevTrack == NULL) - currentComposite->trackList = track->next; - else - prevTrack->next = track->next; - } - } - } - -char *deleteMathTrackName = cartOptionalString(cart, hgsDeleteMathTrack); -if (deleteMathTrackName != NULL) - { - if (currentMathTrack == NULL) - warn("cannot delete track without specifying a mathwig"); - else - { - struct track *track, *prevTrack = NULL; - for(track = currentMathTrack->trackList; track; prevTrack = track,track = track->next) - { - if (sameString(track->name, deleteMathTrackName)) - break; - } - if (track != NULL) - { - if (prevTrack == NULL) - currentMathTrack->trackList = track->next; - else - prevTrack->next = track->next; - } - } - } - -char *newTrackName = cartOptionalString(cart, hgsAddTrack); -if (newTrackName != NULL) - { - if (currentComposite == NULL) - warn("cannot add track without specifying a composite"); - else - { - struct trackDb *tdb = findTrack(newTrackName, wigTracks); - - struct track *track; - AllocVar(track); - track->name = makeUnique(nameHash, tdb); - track->shortLabel = tdb->shortLabel; - track->longLabel = tdb->longLabel; - slAddHead(¤tComposite->trackList, track); - } - } - -if (currentComposite) - cartSetString(cart, hgsCurrentComposite, currentComposite->name); - -doUi(database, groupList, wigTracks, currentComposite, compositeList, currentMathTrack); - -outputCompositeHub(database, hubName, compositeList, nameHash, wigTracks); -cartCheckout(&cart); -cgiExitTime("hgComposite", enteredMainTime); -return 0; -}