[DAS] 1.6 draft 7

Mitch Skinner mitch_skinner at berkeley.edu
Wed Sep 29 09:22:07 UTC 2010


  On 09/23/2010 07:44 AM, Thomas Down wrote:
> Just getting in touch to let you know that we're very interested in getting
> big piles of sequencing data onto genome browsers, and are certainly
> interested in alternative formats.  My current thoughts are that -- at least
> for what we're doing -- a slightly more concise XML schema, plus richer
> control of server-side summarization/binning (think maxbins++) might be the
> sweet spot, but very interested to see other options as well.

Hello,

I've only just joined the list, so I think I'm entering this 
conversation mid-way, and I apologize if I'm speaking out of turn.  I do 
have a few opinions about putting genomic data into JSON, though, and it 
looks like this might be the time to express them, if you're discussing 
DAS alternative content formats.

As you may know, JBrowse client-server communication is (currently) not 
DAS.  And that's on purpose, for multiple reasons that may be relevant 
to this discussion.  They are:

1. XML verbosity
2. cacheability
3. need for server-side code

JBrowse does something different from DAS in each of those areas.  In 
order of decreasing ease-of-adoption, they are:

1. XML verbosity:

It's true that if you gzip then this doesn't cost you too much in terms 
of size-on-the-wire, but you still have to deal with it in memory on the 
client and server.

Most of the genomics data formats I've seen have attributes that are 
either *named* or *positional*.  Positional data formats, like GFF2, 
specify in advance the attributes (columns) that each record (line) can 
have.  This saves space, but makes the format awkward to extend (e.g., 
what happened when different people extended GFF in different ways).  
With XML, by contrast, each attribute is named.  That makes the tradeoff 
the other way around; it takes up more space, but it's easier to extend, 
because new attributes get new names and don't step on each other.

And then there are hybrids like GFF3, where some attributes are 
specified positionally, and the rest are named.

But there's another middle ground--you can have positional attributes, 
but have the *positions* be named.  This is what JBrowse does; each 
feature is represented in JSON as an array.  Each position in the array 
is named, in a separate array of strings.  In other words, there are a 
bunch of genomic features like this:

[
[10000,20000,-1,"foo"],
[50000,80000,1,"bar]
]

and a separate array (not sure what to call it, a "schema" array, 
maybe?) that names each position, e.g.:

["start", "end", "strand", "name"]

or what have you.  And, since it's JSON, attribute values can have their 
own nested structure; for example, one of the attributes could be 
"subfeatures" which could be an array of subfeatures.  In JBrowse, each 
track can have its own "schema"; attributes like "phase", "score", and 
"subfeatures" can be left out of a track if it doesn't use them.

For genomic applications, where the space used by the schema array can 
be amortized over large numbers of features, I think this is a pretty 
substantial win.  And if you need ad-hoc additional attributes, you can 
always pull the GFF3 trick and have a set of named attributes at the end.

2. Cacheability

JBrowse partitions feature data by refseq, track, and genomic region.  
And the boundaries between those chunks of data are defined statically.  
That makes those chunks of data more cacheable; if you're viewing a 
given region, and you move a little to the left or to the right, you 
usually don't need to make a new HTTP request.  And if you come back to 
the same region the next day, your browser will likely have the same 
data in its cache.

You could, potentially, provide useful caching-related HTTP headers from 
current DAS servers, but my understanding is that implementations 
typically don't.  And I think that has something to do with dynamic 
queries being harder to usefully cache.

Gregg has been working on proxying DAS sources for JBrowse clients; I 
asked him if his proxy would provide useful caching headers, and he 
said, "well, I could make them up" :)  But it would be nice if we could 
get them without having to do that.

3. Server-side code

The fact that the boundaries of the data chunks are statically defined 
means that you can just pre-generate them and serve them with a plain 
static HTTP server.  Sometimes I meet people who disagree with this 
choice, but if you have have a workload that's dominated by reads then I 
think it's a pretty clear win, especially if you have a lot of users.  
Plus, the HTTP server will generate appropriate caching-related headers 
for free.  And it's easier for less-technical users, or users with 
limited rights on a server, to set up a JBrowse instance if they don't 
need to set up CGI/servlets/whatever.

BAM and BigBed have made a similar choice to be statically-serveable; 
you could view the JBrowse approach as doing something like what they're 
doing, in a way that's easier to digest for web browser clients.  In the 
JBrowse case, range queries are done by the client using a lazily-loaded 
nested containment list, described here:

http://biowiki.org/view/JBrowse/LazyFeatureLoading

It's possible to store the JSON gzipped on the server and then send it 
out as-is; I compress the json files and give them a .jsonz extension, 
and then add this to my apache config:

<Files *.jsonz>
   ForceType text/javascript
   Header set Content-Encoding: gzip
</Files>

which works in all the web browsers that JBrowse supports, including IE 
6/7/8.

I hope this contributes to the discussion,
Mitch



More information about the DAS mailing list