This blog focuses on the role that good design plays in the succcesful online presentation of biological data. Topics include data visualization, user interfaces, general bioinformatics, open access publishing, and inspirational notes from the design world and may include mundane system level development tricks and project management rants.

Is Central Serous Retinopathy (CSR) the new carpal tunnel for a generation of over-stressed and over-loaded information workers who spend far too many hours per day staring at screens of varying dimensions?

Central serous retinopathy (or choroidopathy) is essentially a delamination of the retina when cellular layers that normally serve as a fluid barrier between the choroid and the retina begin to leak. This introduces a bubble or blister of fluid underneath the retina. This results in blurred and dimmed vision.

Although CSR is idiopathic, it has been linked to chronic stress, defined biochemically as elevated serum cortisol levels. This finding is corroborated by an increased incidence of CSR in those with Cushing’s Syndrome (chronic overexposure to elevated levels of cortisol.) Men are more often affected than women; with an age of onset between 20-50, averaging around 45.

I’ve been having progressively worse vision problems since December that I had attributed to floaters or sleep deprivation. Given the sad state of my own personal health care coverage as a self-employeed worker and the prevalence of holidays and work deadlines around the turnover of a new year, I didn’t get around to checking this out until this week. After a standard eye exam, I was tentatively diagnosed with Central Serous Retinopathy (CSR), confirmed a few days later by fluoroscein angiography.

My symptoms currently include a large purplish gray blotch almost dead-center in my field of vision; completely distorted visual acuity that’s not just blurry but makes straight lines look broken and covered with Adobe’s marching ants from using the lasso tool; micropsia (things appear smaller than the unaffected eye); loss of several aspects of color perception; and — surprise — everything looks dim and desaturated.

I’m certainly not a high stress individual. I’m not Type-A; I don’t go around yelling at people. I am, however, a perfectionist, although I’ve softened in my old age. Now I’m satisfied if things are done as best as they possibly can be with the time and team available.

I do work hard and I work long hours and have been doing so for many years.

Here’s a brief outline of a typical day for me.

Wake up early, anytime between 3-4:30 am. Roll over and check the time on my phone. Check my email. Read about things I need to deal with and decide to just get up. Espresso. Since I’m a teleworker, lunch was almost always a working lunch at my desk. And without any seminars or Bits ‘n’ Nibbles to attend in the afternoon, I’d work straight through until 6, 7 or 8, with a full work day of 15, 16, or 17 hours. Multiply that times seven and I was typically logging close to 100 hours a week, each week, weekends and holidays inclusive.

So what am I doing to change? First off, I’m no longer tethered to my phone. If I’m not working, I’m not answering work emails. I’m waiting until I’m actually at my desk to start working. And I’m making every effort to reclaim my weekends and holidays and not working at all. And I’m keeping my fingers crossed I retain my vision.

Bookmark and Share

{ 0 comments }

Nearly 50 years after Sydney Brenner’s letter to Max Perutz set the wheels in motion for the use of Caenorhabditis elegans as a potent genetic model system, leading eventually to six Nobel prizes and a global research community numbering in the thousands, a new threshold has been crossed.

Starting with the latest release of the C. elegans genome (WS232 in worm-speak), the genetic map is now FROZEN. Recombinational distances have changed very little over the last three years, a testament both to the fine granularity of the genetic map as well as — perhaps — to shifting tides in experimental approaches.

New mutations, deficiencies and rearrangements will still be placed on the map but simply assigned an interpolated genetic position.

Bookmark and Share

{ 0 comments }

A draft assembly of the 273 MB Ascaris suum genome has been published in Nature. A. suum is a model for human ascaris infection via the common round worm.

Bookmark and Share

{ 0 comments }

Here’s a simple approach for installing and running a local instance of GBrowse, leveraging the PSGI/Plack webserver <-> web application stack. You don’t need root access, you don’t need Apache, and you don’t need to request any firewall exceptions (for now).

Background

Both the current implementation and installer of GBrowse are loosely tied to Apache. By loosely, I mean that the installer generates suitable configuration and assumes installation paths as if the instance will be run under Apache. The implementation is tightly tied to the CGI specification; it’s a suite of CGI scripts. Although GBrowse will rununder any webserver that implements the CGI specification (are there any that DON’T?), this approach increases the administrative effort required for running a local instance, increases the complexity of configuration, makes it more difficult to run GBrowse under other environments, and makes it impossible to leverage powerful advances in Perl web application development.

Enter PSGI (the Perl Web Server Gateway Interface), a specification for glueing Perl applications to webservers. Plack is a reference implementation of this specification. PSGI as implemented by Plack makes it simple to run Perl-based applications (even CGI-based ones like GBrowse) in a variety of environments.

In other words, PSGI abstracts the request/response cycle so that you can focus on your application. Running your application under CGI, Fast CGI, or mod_perl is just a matter of changing the application handler. The core Plack distribution provides a number of handlers out of the box (CGI, FCGI, mod_perl, for example) and even includes a light-weight webserver (HTTP::Server::PSGI) which is perfect for development. Other webservers also implement the PSGI specification, including the high-performance preforking server Starman.

You can also do cool things via middleware handlers like mapping multiple applications to different URLs with ease (how about running the last 10 versions of GBrowse all without touching Apache config or dealing with library conflicts), handle tasks like serving static files, mangling requests and responses, etc.

What this isn’t (yet)

This isn’t a rewrite of GBrowse using PSGI. It’s just some modifications to the current GBrowse to make it possible to wrap the CGI components so that they can be used via servers that implement the PSGI specification. There is a project to rewrite GBrowse as a pure PSGI app. Stay tuned for details.

Conventions

  1. Installation root.
  2. Our working installation root is configured via the environment variable GBROWSE_ROOT.

  3. No root privileges required.
  4. You do not need to be root. Ever. In fact, one of the great advantages of this approach is the ease with which you can install a local instance.

  5. Self-contained, versioned installation paths.
  6. This tutorial installs everything under a single directory for simplified management and configuration. This path corresponds to the version of GBrowse being installed.

    The current version of GBrowse is specified by environment variable (GBROWSE_VERSION). If you want to use the same installation path from release to release, you can also create and adjust symlinks as necessary (~/gbrowse/current -> ~/gbrowse/gbrowse-2.40, for example, and set GBROWSE_VERSION=current). This isn’t necessarily required but means that you won’t need to set GBROWSE_VERSION every time you update to a new version of GBrowse. At any rate, maintaining installations by version is a Good Practice and makes it easy to revert to older versions should the need arise.

  7. Each installation has it’s own set of local libraries.
  8. In keeping with the self-contained non-privileged design gestalt, we’ll install all required libraries to a local path tied to the installed version of GBrowse ($GBROWSE_ROOT/$GBROWSE_VERSION/extlib). This makes it dead simple to run many possibly conflicting variants of GBrowse all with their own dedicated suite of libraries. Awesome.

Installation

  1. Set up your environment.
  2.   // Set an environment variables for the your installation root and the version of GBrowse you are installing.
      > export GBROWSE_ROOT=~/gbrowse
      > export GBROWSE_VERSION=2.40
    
  3. Prepare your library directory.
  4.   // You may need to install the local::lib library first
      > (sudo) perl -MCPAN -e 'install local::lib'
      > cd ${GBROWSE_ROOT}
      > mkdir ${GBROWSE_VERSION}
      > cd ${GBROWSE_VERSION}
      > mkdir extlib ; cd extlib
      > perl -Mlocal::lib=./
      > eval $(perl -Mlocal::lib=./)
    
  5. Check out GBrowse fork with modifications for running under PSGI/Plack.
  6.   > cd ${GBROWSE_ROOT}
      > mkdir src ; cd src
      > git clone git@github.com:tharris/GBrowse-PSGI.git
      > cd GBrowse-PSGI
      # Here, the wwwuser is YOU, not the Apache user.
      > perl Build.PL --conf         ${GBROWSE_ROOT}/${GBROWSE_VERSION}/conf \
                      --htdocs       ${GBROWSE_ROOT}/${GBROWSE_VERSION}/html \
                      --cgibin       ${GBROWSE_ROOT}/${GBROWSE_VERSION}/cgi \
                      --wwwuser      $LOGNAME \
                      --tmp          ${GBROWSE_ROOT}/${GBROWSE_VERSION}/tmp \
                      --persistent   ${GBROWSE_ROOT}/${GBROWSE_VERSION}/tmp/persistent \
                      --databases    ${GBROWSE_ROOT}/${GBROWSE_VERSION}/databases \
                      --installconf  n \
                      --installetc   n
      > ./Build installdeps   # Be sure to install all components of the Plack stack:
    
          Plack
          Plack::App::CGIBin
          Plack::App::WrapCGI
          Plack::Builder
          Plack::Middleware::ReverseProxy
          Plack::Middleware::Debug
          CGI::Emulate::PSGI
          CGI::Compile
    
      // Should you need to adjust any values, run
      > ./Build.PL reconfig
      > ./Build install
    

    Note: the curent installer script SHOULD NOT require a root password if using local paths like this example. When it asks if you want to restart Apache, select NO. It’s not relevant for us.

  7. Fire up a Plack server using plackup.
  8. The Build script will have installed a suitable .psgi file at conf/GBrowse.psgi. Launch a simple plack HTTP server via:

       > plackup -p 9001 ${GBROWSE_ROOT}/${GBROWSE_VERSION}/conf/GBrowse.psgi
       // Open http://localhost:9001/
    

    Note: By default, plackup will use HTTP::Server::PSGI.

    Where To From Here

    PSGI/Plack is really powerful. Here are some examples that take advantage of configuration already in the conf/GBrowse.psgi file.

    Enable the Plack debugging middleware:

       > export GBROWSE_DEVELOPMENT=true
       > plackup -p 9001 ${GBROWSE_ROOT}/${GBROWSE_VERSION}/conf/GBrowse.psgi
       // Visit http://localhost:9001/ and see all the handy debugging information.
    

    Run GBrowse under the preforking, lightweight HTTP server Starman:

       > perl -MCPAN -e 'install Starman'
       > starman -p 9001 ${GBROWSE_ROOT}/${GBROWSE_VERSION}/conf/GBrowse.psgi
    
    Bookmark and Share

    { 4 comments }

An introduction to cloud computing for biologists (aka the 10-minute model organism database installation)

August 11, 2011

This tutorial will explain the basic concepts of cloud computing and get you up and running in minutes. No knowledge of system administration or programming is necessary. As an example, it describes how to launch your own instance of the model organism database WormBase. Introduction to cloud computing If you aren’t familiar with cloud computing [...]

Read the full article →

Happy belated birthday, Mendel!

July 21, 2011

Photoshop art from my old grad school days. url=’http://toddharris.net/blog/2011/07/21/happy-belated-birthday-mendel/’;size=’small’;username=’tharris’;

Read the full article →

Debugging xinetd configuration problems

June 19, 2011

xinetd is great when it’s working but can be a complete pain to debug when things go wrong. As a start, try launching it in the foreground in debugging mode: /usr/sbin/xinetd -d -dontfork url=’http://toddharris.net/blog/2011/06/19/debugging-xinetd-at-system-launch/’;size=’small’;username=’tharris’;

Read the full article →

GitHub’s “Organizations” for distributed #bioinformatics dev; migrating from Mercurial

February 12, 2011

GitHub.com’s “Organizations” is a great tool for distributed bioinformatics teams. Here’s how I migrated some of our repositories from Mercurial to Git to take advantage of this feature After much evangelizing, weeping, and wailing, I finally convinced everyone at one highly geographically and functionally distributed projects that we should at least try consolidating our code [...]

Read the full article →

Amazon Elastic Block Store for facile sharing and archiving of biological data

February 10, 2011

Amazon’s Web Services offers enormous potential for people who need to process, store, and share large amounts of data. And it’s a huge boon for bioinformatics. It’s cost effective and it’s fasta. Hah. Get it? It’s “>fasta”. Archiving and sharing data has never been easier. Here’s a quick tutorial on creating an Elastic Block Store [...]

Read the full article →

Hide ‘n Seek: What to do with empty data fields?

February 8, 2011

We’ve been working on a fundamental website redesign for a hefty biological database. One design dilemma has been what to do with empty data fields. For example, on a Gene Summary we might have a “Variation” field listing variations found in the gene. Obviously, not all genes have variations. Displaying field labels with empty contents [...]

Read the full article →