9f05077cf93a6e7a926efcdf2d771c0896f20abf
kent
Mon Jun 21 22:44:35 2010 -0700
Making hgRenderTracks look up default track settings before layering on stuff passed in .
diff --git src/hg/hgTracks/renderMain.c src/hg/hgTracks/renderMain.c
index e29d07b..63cf2bc 100644
--- src/hg/hgTracks/renderMain.c
+++ src/hg/hgTracks/renderMain.c
@@ -1,105 +1,128 @@
-/* hgTrackRender - execute enough of browser to render one track. */
+/* renderMain - execute enough of browser to render list of tracks without touching cart or
+ * writing form. . */
#include "common.h"
#include "linefile.h"
#include "hash.h"
#include "htmshell.h"
+#include "options.h"
#include "errabort.h"
#include "portable.h"
#include "cheapcgi.h"
#include "ra.h"
#include "hdb.h"
#include "hgTracks.h"
+#include "imageV2.h"
static void usage()
/* Print out usage and exit - just temporary. */
{
errAbort(
-"hgTrackRender - execute enough of browser to render one track.\n"
+"hgRenderTracks - execute enough of browser to render a list of tracks\n"
"usage:\n"
" hgTrackRender track.ra cart.ra output.ps\n"
"where track.ra is a trackDb.ra entry flattened out to include stuff inherited from parent\n"
"and cart.ra is a file with the cart settings. Both .ra files should just have a single stanza\n"
);
}
+static struct optionSpec options[] = {
+ {NULL, 0},
+};
+
+struct trackDb *hTrackDbForTrackAndAncestors(char *db, char *track);
+/* Load trackDb object for a track. If need be grab its ancestors too.
+ * This does not load children. hTrackDbForTrack will handle children, and
+ * is actually faster if being called on lots of tracks. This function
+ * though is faster on one or two tracks. */
+
+static void hashIntoHash(struct hash *newStuff, struct hash *hash)
+/* Add newStuff into hash. */
+{
+struct hashCookie cookie = hashFirst(newStuff);
+struct hashEl *hel;
+while ((hel = hashNext(&cookie)) != NULL)
+ hashAdd(hash, hel->name, hel->val);
+}
+
struct track *trackFromSettingsHash(struct hash *settings)
/* Wrap a trackDb, and then a track around settings, and return track. */
{
-struct trackDb *tdb = trackDbNew();
-tdb->settingsHash = settings;
-tdb->track = hashMustFindVal(settings, "track");
+char *trackName = hashMustFindVal(settings, "track");
+struct trackDb *tdb = hTrackDbForTrackAndAncestors(database, trackName);
+hashIntoHash(settings, tdb->settingsHash);
trackDbFieldsFromSettings(tdb);
trackDbAddTableField(tdb);
return trackFromTrackDb(tdb);
}
static void hgTrackRenderFromCommandLine(char *trackFile, char *cartFile, char *outFile)
/* Generate tracks from trackFile and cart from cartFile, both in .ra format. Then
* call makeActiveImage, the heart of the genome browser.*/
{
struct track *track, *trackList = NULL;
/* Load in cart file into a single hash and then wrap a cart around it.
* We need to set cart before we can make tracks. */
struct hash *cartHash = raReadSingle(cartFile);
cart = cartFromHash(cartHash);
database = hashMustFindVal(cartHash, "db");
position = cloneString(hashMustFindVal(cartHash, "position"));
if (!hgParseChromRange(NULL, position, &chromName, &winStart, &winEnd))
errAbort("position not in chrom:start-end format");
-uglyf("Got %d vars in %s\n", cartHash->elCount, cartFile);
-
/* Initialize layout. */
initTl();
setLayoutGlobals();
/* Make list of tracks out of track file. */
struct lineFile *lf = lineFileOpen(trackFile, TRUE);
struct hash *trackRa;
while ((trackRa = raNextRecord(lf)) != NULL)
{
track = trackFromSettingsHash(trackRa);
slAddHead(&trackList, track);
}
slReverse(&trackList);
lineFileClose(&lf);
-uglyf("Got %d tracks in %s\n", slCount(trackList), trackFile);
+verboseTime(2, "Before load %d tracks", slCount(trackList));
/* Prepare track list for drawing. */
for (track = trackList; track != NULL; track = track->next)
{
track->loadItems(track);
- uglyf("%s has %d items\n", track->track, slCount(track->items));
}
-makeActiveImage(trackList, outFile);
+verboseTime(2, "After load");
+
+/* Initialize global image box. */
+int sideSliceWidth = 0; // Just being explicit
+if (withLeftLabels)
+ sideSliceWidth = (insideX - gfxBorder*3) + 2;
+theImgBox = imgBoxStart(database,chromName,winStart,winEnd,(!revCmplDisp),sideSliceWidth,tl.picWidth);
+makeActiveImage(trackList, NULL);
+verboseTime(2,"After makeActiveImage");
}
int main(int argc, char *argv[])
{
/* Set up some timing since we're trying to optimize things very often. */
long enteredMainTime = clock1000();
-uglyTime(NULL);
-measureTiming = TRUE;
+verboseTimeInit();
/* Push very early error handling - this is just
* for the benefit of the cgiVarExists, which
* somehow can't be moved effectively into doMiddle. */
// htmlPushEarlyHandlers();
/* Set up cgi vars from command line. */
-cgiSpoof(&argc, argv);
+// cgiSpoof(&argc, argv);
+optionInit(&argc, argv, options);
if (argc != 4)
usage();
hgTrackRenderFromCommandLine(argv[1], argv[2], argv[3]);
-if (measureTiming)
- {
- fprintf(stdout, "Overall total time: %ld millis
\n",
- clock1000() - enteredMainTime);
- }
+verbose(2, "Overall total time: %ld millis
\n", clock1000() - enteredMainTime);
return 0;
}