galaxy-commits
Threads by month
- ----- 2025 -----
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 15302 discussions

galaxy-dist commit a57967485210: EmailAction now comes from 'galaxy-noreply@<host>'.
by commits-noreply@bitbucket.org 29 Jun '10
by commits-noreply@bitbucket.org 29 Jun '10
29 Jun '10
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User Dannon Baker <dannon.baker(a)emory.edu>
# Date 1277253193 14400
# Node ID a579674852103600ecd8e8b2549e76abc3917791
# Parent 040be2b94b8ce845278d5ac19139a4bdae8fb088
EmailAction now comes from 'galaxy-noreply@<host>'.
--- a/lib/galaxy/jobs/actions/post.py
+++ b/lib/galaxy/jobs/actions/post.py
@@ -69,9 +69,11 @@ class EmailAction(DefaultJobAction):
if smtp_server is None:
log.error("Mail is not configured for this galaxy instance. Workflow action aborted.")
# Build the email message
+ frm = 'galaxy-noreply@%s' % trans.request.host
+ to = job.user.email
msg = MIMEText( "Your job '%s' at Galaxy instance %s is complete as of %s." % (job.history.name, trans.request.host, job.update_time))
- msg[ 'To' ] = job.user.email
- msg[ 'From' ] = job.user.email
+ msg[ 'To' ] = to
+ msg[ 'From' ] = frm
msg[ 'Subject' ] = "Galaxy workflow step notification '%s'"
try:
s = smtplib.SMTP()
@@ -80,7 +82,7 @@ class EmailAction(DefaultJobAction):
s.close()
except Exception, e:
log.error("EmailAction PJA Failed, exception: %s" % e)
-
+L
@classmethod
def get_config_form(cls, trans):
form = """
1
0

galaxy-dist commit 764ecc0cf3fd: Refactor code that builds recent tools list to make it easier to understand and more efficient.
by commits-noreply@bitbucket.org 29 Jun '10
by commits-noreply@bitbucket.org 29 Jun '10
29 Jun '10
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User jeremy goecks <jeremy.goecks(a)emory.edu>
# Date 1277168327 14400
# Node ID 764ecc0cf3fdc4885de777f26e1ae7c06a85acbf
# Parent 7d3a9212b15e82327c2af7c3222995f358532d60
Refactor code that builds recent tools list to make it easier to understand and more efficient.
--- a/lib/galaxy/web/controllers/root.py
+++ b/lib/galaxy/web/controllers/root.py
@@ -38,8 +38,9 @@ class RootController( BaseController, Us
filter( self.app.model.Job.user==trans.user ). \
order_by( self.app.model.Job.create_time.desc() ):
tool_id = row[0]
- if tool_id in toolbox.tools_by_id:
- recent_tools.append( toolbox.tools_by_id[tool_id] )
+ a_tool = toolbox.tools_by_id.get( tool_id, None )
+ if a_tool and a_tool not in recent_tools:
+ recent_tools.append( a_tool )
## TODO: make number of recently used tools a user preference.
if len ( recent_tools ) == 5:
break
1
0

galaxy-dist commit 464734ed09ad: Initial implementation of the Galaxy Web API. Disabled unless
by commits-noreply@bitbucket.org 29 Jun '10
by commits-noreply@bitbucket.org 29 Jun '10
29 Jun '10
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User Nate Coraor <nate(a)bx.psu.edu>
# Date 1277226628 14400
# Node ID 464734ed09ad4b36afc3409b5d975732b1c6eb21
# Parent 4b4385fbf52982ee3bf6394c5cb269e7bf3ab912
Initial implementation of the Galaxy Web API. Disabled unless
'enable_api = True' in config file. You should not enable the API on
production sites as this code is brand new and may contain serious bugs and
security flaws! Implemented:
* Display libraries
* Display library info
* Display library contents
* Display library content info
* Create library folders
* Upload datasets to a library from a server directory or with a path paste.
* Basic example scripts in scripts/api/
Framework changes that were made to support this:
* API Key interface in User Preferences.
* New api_keys database table for storing users' API Keys.
* New API-specific route mapper in webapp.
* API controllers in galaxy.web.api
* Return handling in reused library_common methods.
* expose_api decorator for API controller methods validates key and ensures
valid JSON format.
* UniverseWebTransaction renamed to GalaxyWebTransaction and subclassed for
GalaxyWebUITransaction and GalaxyWebAPITransaction.
Things that need to be done next:
* Documentation!
* Refactor reused code from library_common and other controllers into an
even-more-generic location and format. The main changes are that the Web UI
returns redirects and rendered templates, whereas the API returns various
HTTP status codes and JSON.
* Implement more functionality.
* The request and response format should be considered alpha and are subject to
change. They will be standardized as the API matures.
Hints to get started can be found in scripts/api/README
--- /dev/null
+++ b/lib/galaxy/web/api/libraries.py
@@ -0,0 +1,62 @@
+"""
+API operations on a library.
+"""
+import logging, os, string, shutil, urllib, re, socket
+from cgi import escape, FieldStorage
+from galaxy import util, datatypes, jobs, web, util
+from galaxy.web.base.controller import *
+from galaxy.util.sanitize_html import sanitize_html
+from galaxy.model.orm import *
+
+log = logging.getLogger( __name__ )
+
+class LibrariesController( BaseController ):
+
+ @web.expose_api
+ def index( self, trans, **kwd ):
+ """
+ GET /api/libraries
+ Displays a collection (list) of libraries.
+ """
+ query = trans.sa_session.query( trans.app.model.Library ).filter( trans.app.model.Library.table.c.deleted == False )
+ current_user_role_ids = [ role.id for role in trans.get_current_user_roles() ]
+ library_access_action = trans.app.security_agent.permitted_actions.LIBRARY_ACCESS.action
+ restricted_library_ids = [ lp.library_id for lp in trans.sa_session.query( trans.model.LibraryPermissions ) \
+ .filter( trans.model.LibraryPermissions.table.c.action == library_access_action ) \
+ .distinct() ]
+ accessible_restricted_library_ids = [ lp.library_id for lp in trans.sa_session.query( trans.model.LibraryPermissions ) \
+ .filter( and_( trans.model.LibraryPermissions.table.c.action == library_access_action,
+ trans.model.LibraryPermissions.table.c.role_id.in_( current_user_role_ids ) ) ) ]
+ query = query.filter( or_( not_( trans.model.Library.table.c.id.in_( restricted_library_ids ) ),
+ trans.model.Library.table.c.id.in_( accessible_restricted_library_ids ) ) )
+ rval = []
+ for library in query:
+ item = library.get_api_value()
+ item['url'] = url_for( 'library', id=trans.security.encode_id( library.id ) )
+ item['id'] = trans.security.encode_id( item['id'] )
+ rval.append( item )
+ return rval
+
+ @web.expose_api
+ def show( self, trans, id, **kwd ):
+ """
+ GET /api/libraries/{encoded_library_id}
+ Displays information about a library.
+ """
+ library_id = id
+ params = util.Params( kwd )
+ try:
+ decoded_library_id = trans.security.decode_id( library_id )
+ except TypeError:
+ trans.response.status = 400
+ return "Malformed library id ( %s ) specified, unable to decode." % str( library_id )
+ try:
+ library = trans.sa_session.query( trans.app.model.Library ).get( decoded_library_id )
+ except:
+ library = None
+ if not library or not ( trans.user_is_admin() or trans.app.security_agent.can_access_library( trans.get_current_user_roles(), library ) ):
+ trans.response.status = 400
+ return "Invalid library id ( %s ) specified." % str( library_id )
+ item = library.get_api_value( view='element' )
+ item['contents_url'] = url_for( 'contents', library_id=library_id )
+ return item
--- /dev/null
+++ b/scripts/api/common.py
@@ -0,0 +1,94 @@
+import os, sys, urllib, urllib2
+
+new_path = [ os.path.join( os.path.dirname( __file__ ), '..', '..', 'lib' ) ]
+new_path.extend( sys.path[1:] )
+sys.path = new_path
+
+from galaxy import eggs
+import pkg_resources
+
+pkg_resources.require( "simplejson" )
+import simplejson
+
+def make_url( api_key, url, args=None ):
+ # Adds the API Key to the URL if it's not already there.
+ if args is None:
+ args = []
+ argsep = '&'
+ if '?' not in url:
+ argsep = '?'
+ if '?key=' not in url and '&key=' not in url:
+ args.insert( 0, ( 'key', api_key ) )
+ return url + argsep + '&'.join( [ '='.join( t ) for t in args ] )
+
+def get( api_key, url ):
+ # Do the actual GET.
+ url = make_url( api_key, url )
+ return simplejson.loads( urllib2.urlopen( url ).read() )
+
+def post( api_key, url, data ):
+ # Do the actual POST.
+ url = make_url( api_key, url )
+ req = urllib2.Request( url, headers = { 'Content-Type': 'application/json' }, data = simplejson.dumps( data ) )
+ return simplejson.loads( urllib2.urlopen( req ).read() )
+
+def display( api_key, url ):
+ # Sends an API GET request and acts as a generic formatter for the JSON response.
+ try:
+ r = get( api_key, url )
+ except urllib2.HTTPError, e:
+ print e
+ print e.read( 1024 ) # Only return the first 1K of errors.
+ sys.exit( 1 )
+ if type( r ) == unicode:
+ print 'error: %s' % r
+ return None
+ elif type( r ) == list:
+ # Response is a collection as defined in the REST style.
+ print 'Collection Members'
+ print '------------------'
+ for i in r:
+ # All collection members should have a name and url in the response.
+ print i.pop( 'url' )
+ print ' name: %s' % i.pop( 'name' )
+ for k, v in i.items():
+ print ' %s: %s' % ( k, v )
+ print ''
+ print '%d elements in collection' % len( r )
+ elif type( r ) == dict:
+ # Response is an element as defined in the REST style.
+ print 'Member Information'
+ print '------------------'
+ for k, v in r.items():
+ print '%s: %s' % ( k, v )
+ else:
+ print 'response is unknown type: %s' % type( r )
+
+def submit( api_key, url, data ):
+ # Sends an API POST request and acts as a generic formatter for the JSON response.
+ # 'data' will become the JSON payload read by Galaxy.
+ try:
+ r = post( api_key, url, data )
+ except urllib2.HTTPError, e:
+ print e
+ print e.read( 1024 )
+ sys.exit( 1 )
+ print 'Response'
+ print '--------'
+ if type( r ) == list:
+ # Currently the only implemented responses are lists of dicts, because
+ # submission creates some number of collection elements.
+ for i in r:
+ if type( i ) == dict:
+ if 'url' in i:
+ print i.pop( 'url' )
+ else:
+ print '----'
+ if 'name' in i:
+ print ' name: %s' % i.pop( 'name' )
+ for k, v in i.items():
+ print ' %s: %s' % ( k, v )
+ else:
+ print i
+ else:
+ print r
--- a/lib/galaxy/web/framework/__init__.py
+++ b/lib/galaxy/web/framework/__init__.py
@@ -30,6 +30,7 @@ from babel.support import Translations
pkg_resources.require( "SQLAlchemy >= 0.4" )
from sqlalchemy import and_
+from sqlalchemy.orm.exc import NoResultFound
pkg_resources.require( "pexpect" )
pkg_resources.require( "amqplib" )
@@ -87,6 +88,43 @@ def require_login( verb="perform this ac
return decorator
return argcatcher
+def expose_api( func ):
+ def decorator( self, trans, *args, **kwargs ):
+ def error( environ, start_response ):
+ start_response( error_status, [('Content-type', 'text/plain')] )
+ return error_message
+ error_status = '403 Forbidden'
+ if 'key' not in kwargs:
+ error_message = 'No API key provided with request, please consult the API documentation.'
+ return error
+ try:
+ provided_key = trans.sa_session.query( trans.app.model.APIKeys ).filter( trans.app.model.APIKeys.table.c.key == kwargs['key'] ).one()
+ except NoResultFound:
+ error_message = 'Provided API key is not valid.'
+ return error
+ newest_key = provided_key.user.api_keys[0]
+ if newest_key.key != provided_key.key:
+ error_message = 'Provided API key has expired.'
+ return error
+ if trans.request.body:
+ try:
+ payload = util.recursively_stringify_dictionary_keys( simplejson.loads( trans.request.body ) )
+ kwargs['payload'] = payload
+ except ValueError:
+ error_status = '400 Bad Request'
+ error_message = 'Your request did not appear to be valid JSON, please consult the API documentation'
+ return error
+ trans.response.set_content_type( "application/json" )
+ trans.set_user( provided_key.user )
+ if trans.debug:
+ return simplejson.dumps( func( self, trans, *args, **kwargs ), indent=4, sort_keys=True )
+ else:
+ return simplejson.dumps( func( self, trans, *args, **kwargs ) )
+ if not hasattr(func, '_orig'):
+ decorator._orig = func
+ decorator.exposed = True
+ return decorator
+
def require_admin( func ):
def decorator( self, trans, *args, **kwargs ):
admin_users = trans.app.config.get( "admin_users", "" ).split( "," )
@@ -119,7 +157,7 @@ def form( *args, **kwargs ):
class WebApplication( base.WebApplication ):
def __init__( self, galaxy_app, session_cookie='galaxysession' ):
base.WebApplication.__init__( self )
- self.set_transaction_factory( lambda e: UniverseWebTransaction( e, galaxy_app, self, session_cookie ) )
+ self.set_transaction_factory( lambda e: self.transaction_chooser( e, galaxy_app, session_cookie ) )
# Mako support
self.mako_template_lookup = mako.lookup.TemplateLookup(
directories = [ galaxy_app.config.template_path ] ,
@@ -135,21 +173,21 @@ class WebApplication( base.WebApplicatio
if isinstance( body, FormBuilder ):
body = trans.show_form( body )
return base.WebApplication.make_body_iterable( self, trans, body )
+ def transaction_chooser( self, environ, galaxy_app, session_cookie ):
+ if 'is_api_request' in environ:
+ return GalaxyWebAPITransaction( environ, galaxy_app, self )
+ else:
+ return GalaxyWebUITransaction( environ, galaxy_app, self, session_cookie )
-class UniverseWebTransaction( base.DefaultWebTransaction ):
+class GalaxyWebTransaction( base.DefaultWebTransaction ):
"""
- Encapsulates web transaction specific state for the Universe application
+ Encapsulates web transaction specific state for the Galaxy application
(specifically the user's "cookie" session and history)
"""
- def __init__( self, environ, app, webapp, session_cookie ):
+ def __init__( self, environ, app, webapp ):
self.app = app
self.webapp = webapp
self.security = webapp.security
- # FIXME: the following 3 attributes are not currently used
- # Remove them if they are not going to be...
- self.__user = NOT_SET
- self.__history = NOT_SET
- self.__galaxy_session = NOT_SET
base.DefaultWebTransaction.__init__( self, environ )
self.setup_i18n()
self.sa_session.expunge_all()
@@ -158,13 +196,6 @@ class UniverseWebTransaction( base.Defau
# that the current history should not be used for parameter values
# and such).
self.workflow_building_mode = False
- # Always have a valid galaxy session
- self.__ensure_valid_session( session_cookie )
- # Prevent deleted users from accessing Galaxy
- if self.app.config.use_remote_user and self.galaxy_session.user.deleted:
- self.response.send_redirect( url_for( '/static/user_disabled.html' ) )
- if self.app.config.require_login:
- self.__ensure_logged_in_user( environ )
def setup_i18n( self ):
if 'HTTP_ACCEPT_LANGUAGE' in self.environ:
# locales looks something like: ['en', 'en-us;q=0.7', 'ja;q=0.3']
@@ -252,12 +283,7 @@ class UniverseWebTransaction( base.Defau
tstamp = time.localtime ( time.time() + 3600 * 24 * age )
self.response.cookies[name]['expires'] = time.strftime( '%a, %d-%b-%Y %H:%M:%S GMT', tstamp )
self.response.cookies[name]['version'] = version
- #@property
- #def galaxy_session( self ):
- # if not self.__galaxy_session:
- # self.__ensure_valid_session()
- # return self.__galaxy_session
- def __ensure_valid_session( self, session_cookie ):
+ def _ensure_valid_session( self, session_cookie ):
"""
Ensure that a valid Galaxy session exists and is available as
trans.session (part of initialization)
@@ -344,7 +370,7 @@ class UniverseWebTransaction( base.Defau
# If the old session was invalid, get a new history with our new session
if invalidate_existing_session:
self.new_history()
- def __ensure_logged_in_user( self, environ ):
+ def _ensure_logged_in_user( self, environ ):
allowed_paths = (
url_for( controller='root', action='index' ),
url_for( controller='root', action='tool_menu' ),
@@ -537,15 +563,6 @@ class UniverseWebTransaction( base.Defau
self.sa_session.add_all( ( self.galaxy_session, history ) )
self.sa_session.flush()
return history
- def get_user( self ):
- """Return the current user if logged in or None."""
- return self.galaxy_session.user
- def set_user( self, user ):
- """Set the current user."""
- self.galaxy_session.user = user
- self.sa_session.add( self.galaxy_session )
- self.sa_session.flush()
- user = property( get_user, set_user )
def get_current_user_roles( self ):
user = self.get_user()
if user:
@@ -735,6 +752,53 @@ class FormInput( object ):
self.help = help
self.use_label = use_label
+class GalaxyWebAPITransaction( GalaxyWebTransaction ):
+ def __init__( self, environ, app, webapp ):
+ GalaxyWebTransaction.__init__( self, environ, app, webapp )
+ self.__user = None
+ self._ensure_valid_session( None )
+ def _ensure_valid_session( self, session_cookie ):
+ self.galaxy_session = Bunch()
+ self.galaxy_session.history = self.galaxy_session.current_history = Bunch()
+ self.galaxy_session.history.genome_build = None
+ self.galaxy_session.is_api = True
+ def get_user( self ):
+ """Return the current user (the expose_api decorator ensures that it is set)."""
+ return self.__user
+ def set_user( self, user ):
+ """Compatibility method"""
+ self.__user = user
+ user = property( get_user, set_user )
+ @property
+ def db_builds( self ):
+ dbnames = []
+ if 'dbkeys' in self.user.preferences:
+ user_keys = from_json_string( self.user.preferences['dbkeys'] )
+ for key, chrom_dict in user_keys.iteritems():
+ dbnames.append((key, "%s (%s) [Custom]" % (chrom_dict['name'], key) ))
+ dbnames.extend( util.dbnames )
+ return dbnames
+
+class GalaxyWebUITransaction( GalaxyWebTransaction ):
+ def __init__( self, environ, app, webapp, session_cookie ):
+ GalaxyWebTransaction.__init__( self, environ, app, webapp )
+ # Always have a valid galaxy session
+ self._ensure_valid_session( session_cookie )
+ # Prevent deleted users from accessing Galaxy
+ if self.app.config.use_remote_user and self.galaxy_session.user.deleted:
+ self.response.send_redirect( url_for( '/static/user_disabled.html' ) )
+ if self.app.config.require_login:
+ self._ensure_logged_in_user( environ )
+ def get_user( self ):
+ """Return the current user if logged in or None."""
+ return self.galaxy_session.user
+ def set_user( self, user ):
+ """Set the current user."""
+ self.galaxy_session.user = user
+ self.sa_session.add( self.galaxy_session )
+ self.sa_session.flush()
+ user = property( get_user, set_user )
+
class SelectInput( FormInput ):
""" A select form input. """
def __init__( self, name, label, value=None, options=[], error=None, help=None, use_label=True ):
--- a/lib/galaxy/web/buildapp.py
+++ b/lib/galaxy/web/buildapp.py
@@ -48,6 +48,27 @@ def add_controllers( webapp, app ):
if isclass( T ) and T is not BaseController and issubclass( T, BaseController ):
webapp.add_controller( name, T( app ) )
+def add_api_controllers( webapp, app ):
+ from galaxy.web.base.controller import BaseController
+ from galaxy.web.base.controller import ControllerUnavailable
+ import galaxy.web.api
+ controller_dir = galaxy.web.api.__path__[0]
+ for fname in os.listdir( controller_dir ):
+ if not( fname.startswith( "_" ) ) and fname.endswith( ".py" ):
+ name = fname[:-3]
+ module_name = "galaxy.web.api." + name
+ try:
+ module = __import__( module_name )
+ except ControllerUnavailable, exc:
+ log.debug("%s could not be loaded: %s" % (module_name, str(exc)))
+ continue
+ for comp in module_name.split( "." )[1:]:
+ module = getattr( module, comp )
+ for key in dir( module ):
+ T = getattr( module, key )
+ if isclass( T ) and T is not BaseController and issubclass( T, BaseController ):
+ webapp.add_api_controller( name, T( app ) )
+
def app_factory( global_conf, **kwargs ):
"""
Return a wsgi application serving the root object
@@ -80,6 +101,11 @@ def app_factory( global_conf, **kwargs )
webapp.add_route( '/u/:username/h/:slug', controller='history', action='display_by_username_and_slug' )
webapp.add_route( '/u/:username/w/:slug', controller='workflow', action='display_by_username_and_slug' )
webapp.add_route( '/u/:username/v/:slug', controller='visualization', action='display_by_username_and_slug' )
+ # If enabled, add the web API
+ if asbool( kwargs.get( 'enable_api', False ) ):
+ add_api_controllers( webapp, app )
+ webapp.api_mapper.resource( 'content', 'contents', path_prefix='/api/libraries/:library_id', parent_resources=dict( member_name='library', collection_name='libraries' ) )
+ webapp.api_mapper.resource( 'library', 'libraries', path_prefix='/api' )
webapp.finalize_config()
# Wrap the webapp in some useful middleware
if kwargs.get( 'middleware', True ):
--- /dev/null
+++ b/scripts/api/README
@@ -0,0 +1,106 @@
+This is not documentation. These are hints and examples to get you started
+until the documentation is written.
+
+Set these options in universe_wsgi.ini and start the server:
+
+enable_api = True
+admin_users = you(a)example.org
+library_import_dir = /path/to/some/directory
+
+In the directory you specified for 'library_import_dir', create some
+subdirectories, and put (or symlink) files to import into Galaxy into those
+subdirectories.
+
+In Galaxy, create an account that matches the address you put in 'admin_users',
+then browse to that user's preferences and generate a new API Key. Copy the
+key to your clipboard. Create a new library (doing this via the API is not yet
+implemented). Then take your API Key and use the scripts in scripts/api/ to do
+things:
+
+% ./display.py my_key http://localhost:4096/api/libraries
+Collection Members
+------------------
+/api/libraries/f3f73e481f432006
+ name: api_test
+ id: f3f73e481f432006
+
+% ./display.py my_key http://localhost:4096/api/libraries/f3f73e481f432006
+Member Information
+------------------
+synopsys: None
+contents_url: /api/libraries/f3f73e481f432006/contents
+description: API Test Library
+name: api_test
+
+% ./display.py my_key http://localhost:4096/api/libraries/f3f73e481f432006/contents
+Collection Members
+------------------
+/api/libraries/f3f73e481f432006/contents/28202595c0d2591f61ddda595d2c3670
+ name: /
+ type: folder
+ id: 28202595c0d2591f61ddda595d2c3670
+
+% ./library_create_folder.py my_key http://localhost:4096/api/libraries/f3f73e481f432006/contents 28202595c0d2591f61ddda595d2c3670 api_test_folder1 'API Test Folder 1'
+Response
+--------
+/api/libraries/f3f73e481f432006/contents/28202595c0d2591fa4f9089d2303fd89
+ name: api_test_folder1
+ id: 28202595c0d2591fa4f9089d2303fd89
+
+% ./library_upload_from_import_dir.py my_key http://localhost:4096/api/libraries/f3f73e481f432006/contents 28202595c0d2591fa4f9089d2303fd89 bed bed hg19
+Response
+--------
+/api/libraries/f3f73e481f432006/contents/e9ef7fdb2db87d7b
+ name: 2.bed
+ id: e9ef7fdb2db87d7b
+/api/libraries/f3f73e481f432006/contents/3b7f6a31f80a5018
+ name: 3.bed
+ id: 3b7f6a31f80a5018
+
+% ./display.py my_key http://localhost:4096/api/libraries/f3f73e481f432006/contents
+Collection Members
+------------------
+/api/libraries/f3f73e481f432006/contents/28202595c0d2591f61ddda595d2c3670
+ name: /
+ type: folder
+ id: 28202595c0d2591f61ddda595d2c3670
+/api/libraries/f3f73e481f432006/contents/28202595c0d2591fa4f9089d2303fd89
+ name: /api_test_folder1
+ type: folder
+ id: 28202595c0d2591fa4f9089d2303fd89
+/api/libraries/f3f73e481f432006/contents/e9ef7fdb2db87d7b
+ name: /api_test_folder1/2.bed
+ type: file
+ id: e9ef7fdb2db87d7b
+/api/libraries/f3f73e481f432006/contents/3b7f6a31f80a5018
+ name: /api_test_folder1/3.bed
+ type: file
+ id: 3b7f6a31f80a5018
+
+% ./display.py my_key http://localhost:4096/api/libraries/f3f73e481f432006/contents/e9ef7fdb2db87…
+Member Information
+------------------
+misc_blurb: 68 regions
+metadata_endCol: 3
+data_type: bed
+metadata_columns: 6
+metadata_nameCol: 4
+uploaded_by: nate@...
+metadata_strandCol: 6
+name: 2.bed
+genome_build: hg19
+metadata_comment_lines: None
+metadata_startCol: 2
+metadata_chromCol: 1
+file_size: 4272
+metadata_data_lines: 68
+message:
+metadata_dbkey: hg19
+misc_info: uploaded bed file
+date_uploaded: 2010-06-22T17:01:51.266119
+metadata_column_types: str, int, int, str, int, str
+
+Other parameters are valid when uploading, they are the same parameters as are
+used in the web form, like 'link_data_only' and etc.
+
+The request and response format should be considered alpha and are subject to change.
--- a/lib/galaxy/web/framework/base.py
+++ b/lib/galaxy/web/framework/base.py
@@ -45,7 +45,13 @@ class WebApplication( object ):
and `__call__` to handle a request (WSGI style).
"""
self.controllers = dict()
+ self.api_controllers = dict()
self.mapper = routes.Mapper()
+ # FIXME: The following two options are deprecated and should be
+ # removed. Consult the Routes documentation.
+ self.mapper.minimization = True
+ self.mapper.explicit = False
+ self.api_mapper = routes.Mapper()
self.transaction_factory = DefaultWebTransaction
def add_controller( self, controller_name, controller ):
"""
@@ -56,6 +62,10 @@ class WebApplication( object ):
log.debug( "Enabling '%s' controller, class: %s",
controller_name, controller.__class__.__name__ )
self.controllers[ controller_name ] = controller
+ def add_api_controller( self, controller_name, controller ):
+ log.debug( "Enabling '%s' API controller, class: %s",
+ controller_name, controller.__class__.__name__ )
+ self.api_controllers[ controller_name ] = controller
def add_route( self, route, **kwargs ):
"""
Add a route to match a URL with a method. Accepts all keyword
@@ -80,6 +90,7 @@ class WebApplication( object ):
"""
# Create/compile the regular expressions for route mapping
self.mapper.create_regs( self.controllers.keys() )
+ self.api_mapper.create_regs( self.api_controllers.keys() )
def __call__( self, environ, start_response ):
"""
Call interface as specified by WSGI. Wraps the environment in user
@@ -88,12 +99,20 @@ class WebApplication( object ):
"""
# Map url using routes
path_info = environ.get( 'PATH_INFO', '' )
- map = self.mapper.match( path_info )
+ map = self.mapper.match( path_info, environ )
+ if map is None:
+ environ[ 'is_api_request' ] = True
+ map = self.api_mapper.match( path_info, environ )
+ mapper = self.api_mapper
+ controllers = self.api_controllers
+ else:
+ mapper = self.mapper
+ controllers = self.controllers
if map == None:
raise httpexceptions.HTTPNotFound( "No route for " + path_info )
# Setup routes
rc = routes.request_config()
- rc.mapper = self.mapper
+ rc.mapper = mapper
rc.mapper_dict = map
rc.environ = environ
# Setup the transaction
@@ -101,7 +120,7 @@ class WebApplication( object ):
rc.redirect = trans.response.send_redirect
# Get the controller class
controller_name = map.pop( 'controller', None )
- controller = self.controllers.get( controller_name, None )
+ controller = controllers.get( controller_name, None )
if controller_name is None:
raise httpexceptions.HTTPNotFound( "No controller for " + path_info )
# Resolve action method on controller
@@ -112,7 +131,7 @@ class WebApplication( object ):
if method is None:
raise httpexceptions.HTTPNotFound( "No action for " + path_info )
# Is the method exposed
- if not getattr( method, 'exposed', False ):
+ if not getattr( method, 'exposed', False ):
raise httpexceptions.HTTPNotFound( "Action not exposed for " + path_info )
# Is the method callable
if not callable( method ):
--- a/lib/galaxy/web/security/__init__.py
+++ b/lib/galaxy/web/security/__init__.py
@@ -43,6 +43,8 @@ class SecurityHelper( object ):
return self.id_cipher.encrypt( s ).encode( 'hex' )
def decode_id( self, obj_id ):
return int( self.id_cipher.decrypt( obj_id.decode( 'hex' ) ).lstrip( "!" ) )
+ def decode_string_id( self, obj_id ):
+ return self.id_cipher.decrypt( obj_id.decode( 'hex' ) ).lstrip( "!" )
def encode_guid( self, session_key ):
# Session keys are strings
# Pad to a multiple of 8 with leading "!"
--- a/lib/galaxy/config.py
+++ b/lib/galaxy/config.py
@@ -39,6 +39,8 @@ class Configuration( object ):
self.file_path = resolve_path( kwargs.get( "file_path", "database/files" ), self.root )
self.new_file_path = resolve_path( kwargs.get( "new_file_path", "database/tmp" ), self.root )
self.cookie_path = kwargs.get( "cookie_path", "/" )
+ # web API
+ self.enable_api = string_as_bool( kwargs.get( 'enable_api', False ) )
# dataset Track files
self.track_store_path = kwargs.get( "track_store_path", "${extra_files_path}/tracks")
self.tool_path = resolve_path( kwargs.get( "tool_path", "tools" ), self.root )
--- /dev/null
+++ b/lib/galaxy/model/migrate/versions/0049_api_keys_table.py
@@ -0,0 +1,38 @@
+"""
+Migration script to add the api_keys table.
+"""
+
+from sqlalchemy import *
+from migrate import *
+from migrate.changeset import *
+from galaxy.model.custom_types import *
+
+import datetime
+now = datetime.datetime.utcnow
+
+import logging
+log = logging.getLogger( __name__ )
+
+metadata = MetaData( migrate_engine )
+
+APIKeys_table = Table( "api_keys", metadata,
+ Column( "id", Integer, primary_key=True ),
+ Column( "create_time", DateTime, default=now ),
+ Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
+ Column( "key", TrimmedString( 32 ), index=True, unique=True ) )
+
+def upgrade():
+ print __doc__
+ metadata.reflect()
+ try:
+ APIKeys_table.create()
+ except Exception, e:
+ log.debug( "Creating api_keys table failed: %s" % str( e ) )
+
+def downgrade():
+ # Load existing tables
+ metadata.reflect()
+ try:
+ APIKeys_table.drop()
+ except Exception, e:
+ log.debug( "Dropping api_keys table failed: %s" % str( e ) )
--- a/lib/galaxy/tools/actions/upload_common.py
+++ b/lib/galaxy/tools/actions/upload_common.py
@@ -124,7 +124,7 @@ def new_history_upload( trans, uploaded_
return hda
def new_library_upload( trans, cntrller, uploaded_dataset, library_bunch, state=None ):
current_user_roles = trans.get_current_user_roles()
- if not ( cntrller in [ 'library_admin' ] or trans.app.security_agent.can_add_library_item( current_user_roles, library_bunch.folder ) ):
+ if not ( ( trans.user_is_admin() and cntrller in [ 'library_admin', 'api' ] ) or trans.app.security_agent.can_add_library_item( current_user_roles, library_bunch.folder ) ):
# This doesn't have to be pretty - the only time this should happen is if someone's being malicious.
raise Exception( "User is not authorized to add datasets to this library." )
folder = library_bunch.folder
--- /dev/null
+++ b/lib/galaxy/web/api/contents.py
@@ -0,0 +1,154 @@
+"""
+API operations on the contents of a library.
+"""
+import logging, os, string, shutil, urllib, re, socket
+from cgi import escape, FieldStorage
+from galaxy import util, datatypes, jobs, web, util
+from galaxy.web.base.controller import *
+from galaxy.util.sanitize_html import sanitize_html
+from galaxy.model.orm import *
+
+log = logging.getLogger( __name__ )
+
+class ContentsController( BaseController ):
+
+ @web.expose_api
+ def index( self, trans, library_id, **kwd ):
+ """
+ GET /api/libraries/{encoded_library_id}/contents
+ Displays a collection (list) of library contents (files and folders).
+ """
+ rval = []
+ current_user_roles = trans.get_current_user_roles()
+ def traverse( folder ):
+ admin = trans.user_is_admin()
+ rval = []
+ for subfolder in folder.active_folders:
+ if not admin:
+ can_access, folder_ids = trans.app.security_agent.check_folder_contents( trans.user, current_user_roles, subfolder )
+ if admin or can_access:
+ subfolder.api_path = folder.api_path + '/' + subfolder.name
+ subfolder.api_type = 'folder'
+ rval.append( subfolder )
+ rval.extend( traverse( subfolder ) )
+ for ld in folder.datasets:
+ if not admin:
+ can_access = trans.app.security_agent.can_access_dataset( current_user_roles, ld.library_dataset_dataset_association.dataset )
+ if admin or can_access:
+ ld.api_path = folder.api_path + '/' + ld.name
+ ld.api_type = 'file'
+ rval.append( ld )
+ return rval
+ try:
+ decoded_library_id = trans.security.decode_id( library_id )
+ except TypeError:
+ trans.response.status = 400
+ return "Malformed library id ( %s ) specified, unable to decode." % str( library_id )
+ try:
+ library = trans.sa_session.query( trans.app.model.Library ).get( decoded_library_id )
+ except:
+ library = None
+ if not library or not ( trans.user_is_admin() or trans.app.security_agent.can_access_library( current_user_roles, library ) ):
+ trans.response.status = 400
+ return "Invalid library id ( %s ) specified." % str( library_id )
+ encoded_id = trans.security.encode_id( 'folder.%s' % library.root_folder.id )
+ rval.append( dict( id = encoded_id,
+ type = 'folder',
+ name = '/',
+ url = url_for( 'content', library_id=library_id, id=encoded_id ) ) )
+ library.root_folder.api_path = ''
+ for content in traverse( library.root_folder ):
+ encoded_id = trans.security.encode_id( '%s.%s' % ( content.api_type, content.id ) )
+ rval.append( dict( id = encoded_id,
+ type = content.api_type,
+ name = content.api_path,
+ url = url_for( 'content', library_id=library_id, id=encoded_id, ) ) )
+ return rval
+
+ @web.expose_api
+ def show( self, trans, id, library_id, **kwd ):
+ """
+ GET /api/libraries/{encoded_library_id}/contents/{encoded_content_type_and_id}
+ Displays information about a library content (file or folder).
+ """
+ content_id = id
+ try:
+ decoded_type_and_id = trans.security.decode_string_id( content_id )
+ content_type, decoded_content_id = decoded_type_and_id.split( '.' )
+ except:
+ trans.response.status = 400
+ return "Malformed content id ( %s ) specified, unable to decode." % str( content_id )
+ if content_type == 'folder':
+ model_class = trans.app.model.LibraryFolder
+ elif content_type == 'file':
+ model_class = trans.app.model.LibraryDataset
+ else:
+ trans.response.status = 400
+ return "Invalid type ( %s ) specified." % str( content_type )
+ try:
+ content = trans.sa_session.query( model_class ).get( decoded_content_id )
+ except:
+ content = None
+ if not content or ( not trans.user_is_admin() and not trans.app.security_agent.can_access_library_item( trans.get_current_user_roles(), content, trans.user ) ):
+ trans.response.status = 400
+ return "Invalid %s id ( %s ) specified." % ( content_type, str( content_id ) )
+ return content.get_api_value( view='element' )
+
+ @web.expose_api
+ def create( self, trans, library_id, payload, **kwd ):
+ """
+ POST /api/libraries/{encoded_library_id}/contents
+ Creates a new library content item (file or folder).
+ """
+ create_type = None
+ if 'create_type' not in payload:
+ trans.response.status = 400
+ return "Missing required 'create_type' parameter. Please consult the API documentation for help."
+ else:
+ create_type = payload.pop( 'create_type' )
+ if create_type not in ( 'file', 'folder' ):
+ trans.response.status = 400
+ return "Invalid value for 'create_type' parameter ( %s ) specified. Please consult the API documentation for help." % create_type
+ try:
+ content_id = str( payload.pop( 'folder_id' ) )
+ decoded_type_and_id = trans.security.decode_string_id( content_id )
+ parent_type, decoded_parent_id = decoded_type_and_id.split( '.' )
+ assert parent_type in ( 'folder', 'file' )
+ except:
+ trans.response.status = 400
+ return "Malformed parent id ( %s ) specified, unable to decode." % content_id
+ # "content" can be either a folder or a file, but the parent of new contents can only be folders.
+ if parent_type == 'file':
+ trans.response.status = 400
+ try:
+ # With admins or people who can access the dataset provided as the parent, be descriptive.
+ dataset = trans.sa_session.query( trans.app.model.LibraryDataset ).get( decoded_parent_id ).library_dataset_dataset_association.dataset
+ assert trans.user_is_admin() or trans.app.security_agent.can_access_dataset( trans.get_current_user_roles(), dataset )
+ return "The parent id ( %s ) points to a file, not a folder." % content_id
+ except:
+ # If you can't access the parent we don't want to reveal its existence.
+ return "Invalid parent folder id ( %s ) specified." % content_id
+ # The rest of the security happens in the library_common controller.
+ folder_id = trans.security.encode_id( decoded_parent_id )
+ # Now create the desired content object, either file or folder.
+ if create_type == 'file':
+ status, output = trans.webapp.controllers['library_common'].upload_library_dataset( trans, 'api', library_id, folder_id, **payload )
+ elif create_type == 'folder':
+ status, output = trans.webapp.controllers['library_common'].create_folder( trans, 'api', folder_id, library_id, **payload )
+ if status != 200:
+ trans.response.status = status
+ # We don't want to reveal the encoded folder_id since it's invalid
+ # in the API context. Instead, return the content_id originally
+ # supplied by the client.
+ output = output.replace( folder_id, content_id )
+ return output
+ else:
+ rval = []
+ for k, v in output.items():
+ if type( v ) == trans.app.model.LibraryDatasetDatasetAssociation:
+ v = v.library_dataset
+ encoded_id = trans.security.encode_id( create_type + '.' + str( v.id ) )
+ rval.append( dict( id = encoded_id,
+ name = v.name,
+ url = url_for( 'content', library_id=library_id, id=encoded_id ) ) )
+ return rval
--- a/lib/galaxy/model/__init__.py
+++ b/lib/galaxy/model/__init__.py
@@ -829,6 +829,8 @@ class HistoryDatasetAssociationDisplayAt
class Library( object ):
permitted_actions = get_permitted_actions( filter='LIBRARY' )
+ api_collection_visible_keys = ( 'id', 'name' )
+ api_element_visible_keys = ( 'name', 'description', 'synopsys' )
def __init__( self, name=None, description=None, synopsis=None, root_folder=None ):
self.name = name or "Unnamed library"
self.description = description
@@ -870,8 +872,21 @@ class Library( object ):
if isinstance( name, str ):
name = unicode( name, 'utf-8' )
return name
+ def get_api_value( self, view='collection' ):
+ rval = {}
+ try:
+ visible_keys = self.__getattribute__( 'api_' + view + '_visible_keys' )
+ except AttributeError:
+ raise Exception( 'Unknown API view: %s' % view )
+ for key in visible_keys:
+ try:
+ rval[key] = self.__getattribute__( key )
+ except AttributeError:
+ rval[key] = None
+ return rval
class LibraryFolder( object ):
+ api_element_visible_keys = ( 'name', 'description', 'item_count', 'genome_build' )
def __init__( self, name=None, description=None, item_count=0, order_id=None ):
self.name = name or "Unnamed folder"
self.description = description
@@ -961,6 +976,18 @@ class LibraryFolder( object ):
if isinstance( name, str ):
name = unicode( name, 'utf-8' )
return name
+ def get_api_value( self, view='collection' ):
+ rval = {}
+ try:
+ visible_keys = self.__getattribute__( 'api_' + view + '_visible_keys' )
+ except AttributeError:
+ raise Exception( 'Unknown API view: %s' % view )
+ for key in visible_keys:
+ try:
+ rval[key] = self.__getattribute__( key )
+ except AttributeError:
+ rval[key] = None
+ return rval
@property
def parent_library( self ):
f = self
@@ -1011,6 +1038,28 @@ class LibraryDataset( object ):
if not purged and self.purged:
raise Exception( "Cannot unpurge once purged" )
purged = property( get_purged, set_purged )
+ def get_api_value( self, view='collection' ):
+ # Since this class is a proxy to rather complex attributes we want to
+ # display in other objects, we can't use the simpler method used by
+ # other model classes.
+ ldda = self.library_dataset_dataset_association
+ rval = dict( name = ldda.name,
+ uploaded_by = ldda.user.email,
+ message = ldda.message,
+ date_uploaded = ldda.create_time.isoformat(),
+ file_size = int( ldda.get_size() ),
+ data_type = ldda.ext,
+ genome_build = ldda.dbkey,
+ misc_info = ldda.info,
+ misc_blurb = ldda.blurb )
+ for name, spec in ldda.metadata.spec.items():
+ val = ldda.metadata.get( name )
+ if isinstance( val, MetadataFile ):
+ val = val.file_name
+ elif isinstance( val, list ):
+ val = ', '.join( val )
+ rval['metadata_' + name] = val
+ return rval
class LibraryDatasetDatasetAssociation( DatasetInstance ):
def __init__( self,
@@ -1734,6 +1783,9 @@ class UserAction( object ):
self.params = params
self.context = context
+class APIKeys( object ):
+ pass
+
## ---- Utility methods -------------------------------------------------------
def directory_hash_id( id ):
@@ -1748,5 +1800,3 @@ def directory_hash_id( id ):
padded = padded[:-3]
# Break into chunks of three
return [ padded[i*3:(i+1)*3] for i in range( len( padded ) // 3 ) ]
-
-
--- a/lib/galaxy/util/__init__.py
+++ b/lib/galaxy/util/__init__.py
@@ -417,6 +417,14 @@ def stringify_dictionary_keys( in_dict )
out_dict[ str( key ) ] = value
return out_dict
+def recursively_stringify_dictionary_keys( d ):
+ if isinstance(d, dict):
+ return dict([(k.encode('utf-8'), recursively_stringify_dictionary_keys(v)) for k,v in d.iteritems()])
+ elif isinstance(d, list):
+ return [recursively_stringify_dictionary_keys(x) for x in d]
+ else:
+ return d
+
def mkstemp_ln( src, prefix='mkstemp_ln_' ):
"""
From tempfile._mkstemp_inner, generate a hard link in the same dir with a
--- /dev/null
+++ b/scripts/api/library_upload_from_import_dir.py
@@ -0,0 +1,19 @@
+#!/usr/bin/python
+
+import os, sys
+sys.path.insert( 0, os.path.dirname( __file__ ) )
+from common import submit
+
+try:
+ data = {}
+ data[ 'folder_id' ] = sys.argv[3]
+ data[ 'file_type' ] = sys.argv[4]
+ data[ 'server_dir' ] = sys.argv[5]
+ data[ 'dbkey' ] = sys.argv[6]
+ data[ 'upload_option' ] = 'upload_directory'
+ data[ 'create_type' ] = 'file'
+except IndexError:
+ print 'usage: %s key url folder_id file_type server_dir dbkey' % os.path.basename( sys.argv[0] )
+ sys.exit( 1 )
+
+submit( sys.argv[1], sys.argv[2], data )
--- a/lib/galaxy/model/mapping.py
+++ b/lib/galaxy/model/mapping.py
@@ -889,6 +889,12 @@ UserAction.table = Table( "user_action",
Column( "context", Unicode( 512 ) ),
Column( "params", Unicode( 1024 ) ) )
+APIKeys.table = Table( "api_keys", metadata,
+ Column( "id", Integer, primary_key=True ),
+ Column( "create_time", DateTime, default=now ),
+ Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
+ Column( "key", TrimmedString( 32 ), index=True, unique=True ) )
+
# With the tables defined we can define the mappers and setup the
# relationships between the model objects.
@@ -1067,8 +1073,9 @@ assign_mapper( context, User, User.table
_preferences=relation( UserPreference, backref="user", collection_class=attribute_mapped_collection('name')),
# addresses=relation( UserAddress,
# primaryjoin=( User.table.c.id == UserAddress.table.c.user_id ) )
- values=relation( FormValues,
- primaryjoin=( User.table.c.form_values_id == FormValues.table.c.id ) ),
+ values=relation( FormValues,
+ primaryjoin=( User.table.c.form_values_id == FormValues.table.c.id ) ),
+ api_keys=relation( APIKeys, backref="user", order_by=desc( APIKeys.table.c.create_time ) ),
) )
# Set up proxy so that this syntax is possible:
@@ -1485,6 +1492,9 @@ assign_mapper( context, UserAction, User
properties = dict( user=relation( User.mapper ) )
)
+assign_mapper( context, APIKeys, APIKeys.table,
+ properties = {} )
+
def db_next_hid( self ):
"""
Override __next_hid to generate from the database in a concurrency
--- a/lib/galaxy/web/controllers/library_common.py
+++ b/lib/galaxy/web/controllers/library_common.py
@@ -280,7 +280,7 @@ class LibraryCommon( BaseController ):
status = params.get( 'status', 'done' )
show_deleted = util.string_as_bool( params.get( 'show_deleted', False ) )
use_panels = util.string_as_bool( params.get( 'use_panels', False ) )
- is_admin = trans.user_is_admin() and cntrller == 'library_admin'
+ is_admin = trans.user_is_admin() and cntrller in ( 'library_admin', 'api' )
current_user_roles = trans.get_current_user_roles()
try:
parent_folder = trans.sa_session.query( trans.app.model.LibraryFolder ).get( trans.security.decode_id( parent_id ) )
@@ -294,6 +294,8 @@ class LibraryCommon( BaseController ):
# its parent library, or if they are not able to see the folder's contents.
if not parent_folder or ( not is_admin and not trans.app.security_agent.can_access_library_item( current_user_roles, parent_folder, trans.user ) ):
message = "Invalid parent folder id ( %s ) specified." % str( parent_id )
+ if cntrller == 'api':
+ return 400, message
# This doesn't give away the library's existence since
# browse_library will simply punt to browse_libraries if the
# user-supplied id is invalid or inaccessible.
@@ -309,6 +311,8 @@ class LibraryCommon( BaseController ):
if not ( is_admin or trans.app.security_agent.can_add_library_item( current_user_roles, parent_folder ) ):
message = "You are not authorized to create a folder in parent folder '%s'." % parent_folder.name
# Redirect to the real parent library since we know we have access to it.
+ if cntrller == 'api':
+ return 403, message
return trans.response.send_redirect( web.url_for( controller='library_common',
action='browse_library',
cntrller=cntrller,
@@ -317,7 +321,7 @@ class LibraryCommon( BaseController ):
show_deleted=show_deleted,
message=util.sanitize_text( message ),
status='error' ) )
- if params.get( 'new_folder_button', False ):
+ if params.get( 'new_folder_button', False ) or cntrller == 'api':
new_folder = trans.app.model.LibraryFolder( name=util.restore_text( params.name ),
description=util.restore_text( params.description ) )
# We are associating the last used genome build with folders, so we will always
@@ -329,6 +333,9 @@ class LibraryCommon( BaseController ):
trans.sa_session.flush()
# New folders default to having the same permissions as their parent folder
trans.app.security_agent.copy_library_permissions( parent_folder, new_folder )
+ # If we're creating in the API, we're done
+ if cntrller == 'api':
+ return 200, dict( created=new_folder )
# If we have an inheritable template, redirect to the folder_info page so information
# can be filled in immediately.
widgets = []
@@ -654,7 +661,7 @@ class LibraryCommon( BaseController ):
show_deleted=show_deleted,
message=util.sanitize_text( message ),
status='error' ) )
- if ( trans.user_is_admin() and cntrller == 'library_admin' ):
+ if is_admin:
# Get all associated hdas and lddas that use the same disk file.
associated_hdas = trans.sa_session.query( trans.model.HistoryDatasetAssociation ) \
.filter( and_( trans.model.HistoryDatasetAssociation.deleted == False,
@@ -848,7 +855,7 @@ class LibraryCommon( BaseController ):
last_used_build = dbkey[0]
else:
last_used_build = dbkey
- is_admin = trans.user_is_admin() and cntrller == 'library_admin'
+ is_admin = trans.user_is_admin() and cntrller in ( 'library_admin', 'api' )
current_user_roles = trans.get_current_user_roles()
if replace_id not in [ None, 'None' ]:
try:
@@ -859,6 +866,8 @@ class LibraryCommon( BaseController ):
# its parent library, or if they are not able to view the dataset itself.
if not replace_dataset or ( not is_admin and not trans.app.security_agent.can_access_library_item( current_user_roles, replace_dataset, trans.user ) ):
message = "Invalid library dataset id ( %s ) to replace specified." % replace_id
+ if cntrller == 'api':
+ return 400, message
return trans.response.send_redirect( web.url_for( controller='library_common',
action='browse_library',
cntrller=cntrller,
@@ -870,6 +879,8 @@ class LibraryCommon( BaseController ):
# Deny access if the user is not an admin and does not have the LIBRARY_MODIFY permission.
if not ( is_admin or trans.app.security_agent.can_modify_library_item( current_user_roles, replace_dataset ) ):
message = "You are not authorized to replace library dataset '%s'." % replace_dataset.name
+ if cntrller == 'api':
+ return 403, message
return trans.response.send_redirect( web.url_for( controller='library_common',
action='browse_library',
cntrller=cntrller,
@@ -896,6 +907,8 @@ class LibraryCommon( BaseController ):
# its parent library, or if they are not able to see the folder's contents.
if not folder or ( not is_admin and not trans.app.security_agent.can_access_library_item( current_user_roles, folder, trans.user ) ):
message = "Invalid parent folder id ( %s ) specified." % str( folder_id )
+ if cntrller == 'api':
+ return 400, message
return trans.response.send_redirect( web.url_for( controller='library_common',
action='browse_library',
cntrller=cntrller,
@@ -907,6 +920,8 @@ class LibraryCommon( BaseController ):
# Deny access if the user is not an admin and does not have the LIBRARY_ADD permission.
if not ( is_admin or trans.app.security_agent.can_add_library_item( current_user_roles, folder ) ):
message = "You are not authorized to create a library dataset in parent folder '%s'." % folder.name
+ if cntrller == 'api':
+ return 403, message
return trans.response.send_redirect( web.url_for( controller='library_common',
action='browse_library',
cntrller=cntrller,
@@ -918,7 +933,7 @@ class LibraryCommon( BaseController ):
library = folder.parent_library
if folder and last_used_build in [ 'None', None, '?' ]:
last_used_build = folder.genome_build
- if params.get( 'runtool_btn', False ) or params.get( 'ajax_upload', False ):
+ if params.get( 'runtool_btn', False ) or params.get( 'ajax_upload', False ) or cntrller == 'api':
# Check to see if the user selected roles to associate with the DATASET_ACCESS permission
# on the dataset that would cause accessibility issues.
roles = params.get( 'roles', False )
@@ -931,7 +946,8 @@ class LibraryCommon( BaseController ):
permissions, in_roles, error, message = \
trans.app.security_agent.derive_roles_from_access( trans, library.id, cntrller, library=True, **vars )
if error:
- status = 'error'
+ if cntrller == 'api':
+ return 400, message
trans.response.send_redirect( web.url_for( controller='library_common',
action='upload_library_dataset',
cntrller=cntrller,
@@ -961,6 +977,11 @@ class LibraryCommon( BaseController ):
replace_dataset=replace_dataset,
**kwd )
if created_outputs_dict:
+ if cntrller == 'api':
+ # created_outputs_dict can only ever be a string if cntrller == 'api'
+ if type( created_outputs_dict ) == str:
+ return 400, created_outputs_dict
+ return 200, created_outputs_dict
total_added = len( created_outputs_dict.keys() )
ldda_id_list = [ str( v.id ) for k, v in created_outputs_dict.items() ]
created_ldda_ids=",".join( ldda_id_list )
@@ -1001,6 +1022,9 @@ class LibraryCommon( BaseController ):
created_ldda_ids = ''
message = "Upload failed"
status='error'
+ if cntrller == 'api':
+ return 400, message
+ response_code = 400
trans.response.send_redirect( web.url_for( controller='library_common',
action='browse_library',
cntrller=cntrller,
@@ -1068,7 +1092,6 @@ class LibraryCommon( BaseController ):
# Library-specific params
params = util.Params( kwd ) # is this filetoolparam safe?
show_deleted = util.string_as_bool( params.get( 'show_deleted', False ) )
- library_bunch = upload_common.handle_library_params( trans, params, folder_id, replace_dataset )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
server_dir = util.restore_text( params.get( 'server_dir', '' ) )
@@ -1077,11 +1100,11 @@ class LibraryCommon( BaseController ):
else:
replace_id = None
upload_option = params.get( 'upload_option', 'upload_file' )
- err_redirect = False
+ response_code = 200
if upload_option == 'upload_directory':
if server_dir in [ None, 'None', '' ]:
- err_redirect = True
- if cntrller == 'library_admin':
+ response_code = 400
+ if cntrller == 'library_admin' or ( cntrller == 'api' and trans.user_is_admin ):
import_dir = trans.app.config.library_import_dir
import_dir_desc = 'library_import_dir'
full_dir = os.path.join( import_dir, server_dir )
@@ -1095,21 +1118,35 @@ class LibraryCommon( BaseController ):
if import_dir:
message = 'Select a directory'
else:
+ response_code = 403
message = '"%s" is not defined in the Galaxy configuration file' % import_dir_desc
- # Proceed with (mostly) regular upload processing
- precreated_datasets = upload_common.get_precreated_datasets( trans, tool_params, trans.app.model.LibraryDatasetDatasetAssociation, controller=cntrller )
- if upload_option == 'upload_file':
- tool_params = upload_common.persist_uploads( tool_params )
- uploaded_datasets = upload_common.get_uploaded_datasets( trans, cntrller, tool_params, precreated_datasets, dataset_upload_inputs, library_bunch=library_bunch )
- elif upload_option == 'upload_directory':
- uploaded_datasets, err_redirect, message = self.get_server_dir_uploaded_datasets( trans, cntrller, params, full_dir, import_dir_desc, library_bunch, err_redirect, message )
elif upload_option == 'upload_paths':
- uploaded_datasets, err_redirect, message = self.get_path_paste_uploaded_datasets( trans, cntrller, params, library_bunch, err_redirect, message )
- upload_common.cleanup_unused_precreated_datasets( precreated_datasets )
- if upload_option == 'upload_file' and not uploaded_datasets:
- message = 'Select a file, enter a URL or enter text'
- err_redirect = True
- if err_redirect:
+ if not trans.app.config.allow_library_path_paste:
+ response_code = 403
+ message = '"allow_library_path_paste" is not defined in the Galaxy configuration file'
+ # Some error handling should be added to this method.
+ try:
+ library_bunch = upload_common.handle_library_params( trans, params, folder_id, replace_dataset )
+ except:
+ response_code = 500
+ message = "Unable to parse upload parameters, please report this error."
+ # Proceed with (mostly) regular upload processing if we're still errorless
+ if response_code == 200:
+ precreated_datasets = upload_common.get_precreated_datasets( trans, tool_params, trans.app.model.LibraryDatasetDatasetAssociation, controller=cntrller )
+ if upload_option == 'upload_file':
+ tool_params = upload_common.persist_uploads( tool_params )
+ uploaded_datasets = upload_common.get_uploaded_datasets( trans, cntrller, tool_params, precreated_datasets, dataset_upload_inputs, library_bunch=library_bunch )
+ elif upload_option == 'upload_directory':
+ uploaded_datasets, response_code, message = self.get_server_dir_uploaded_datasets( trans, cntrller, params, full_dir, import_dir_desc, library_bunch, response_code, message )
+ elif upload_option == 'upload_paths':
+ uploaded_datasets, response_code, message = self.get_path_paste_uploaded_datasets( trans, cntrller, params, library_bunch, response_code, message )
+ upload_common.cleanup_unused_precreated_datasets( precreated_datasets )
+ if upload_option == 'upload_file' and not uploaded_datasets:
+ response_code = 400
+ message = 'Select a file, enter a URL or enter text'
+ if response_code != 200:
+ if cntrller == 'api':
+ return ( response_code, message )
trans.response.send_redirect( web.url_for( controller='library_common',
action='upload_library_dataset',
cntrller=cntrller,
@@ -1145,7 +1182,7 @@ class LibraryCommon( BaseController ):
trans.sa_session.add_all( ( uploaded_dataset.data, uploaded_dataset.data.dataset ) )
trans.sa_session.flush()
return uploaded_dataset
- def get_server_dir_uploaded_datasets( self, trans, cntrller, params, full_dir, import_dir_desc, library_bunch, err_redirect, message ):
+ def get_server_dir_uploaded_datasets( self, trans, cntrller, params, full_dir, import_dir_desc, library_bunch, response_code, message ):
files = []
try:
for entry in os.listdir( full_dir ):
@@ -1173,22 +1210,22 @@ class LibraryCommon( BaseController ):
files.append( path )
except Exception, e:
message = "Unable to get file list for configured %s, error: %s" % ( import_dir_desc, str( e ) )
- err_redirect = True
- return None, err_redirect, message
+ response_code = 500
+ return None, response_code, message
if not files:
message = "The directory '%s' contains no valid files" % full_dir
- err_redirect = True
- return None, err_redirect, message
+ response_code = 400
+ return None, response_code, message
uploaded_datasets = []
for file in files:
name = os.path.basename( file )
uploaded_datasets.append( self.make_library_uploaded_dataset( trans, cntrller, params, name, file, 'server_dir', library_bunch ) )
- return uploaded_datasets, None, None
- def get_path_paste_uploaded_datasets( self, trans, cntrller, params, library_bunch, err_redirect, message ):
+ return uploaded_datasets, 200, None
+ def get_path_paste_uploaded_datasets( self, trans, cntrller, params, library_bunch, response_code, message ):
if params.get( 'filesystem_paths', '' ) == '':
message = "No paths entered in the upload form"
- err_redirect = True
- return None, err_redirect, message
+ response_code = 400
+ return None, response_code, message
preserve_dirs = True
if params.get( 'dont_preserve_dirs', False ):
preserve_dirs = False
@@ -1222,8 +1259,8 @@ class LibraryCommon( BaseController ):
in_folder ) )
if bad_paths:
message = "Invalid paths:<br><ul><li>%s</li></ul>" % "</li><li>".join( bad_paths )
- err_redirect = True
- return None, err_redirect, message
+ response_code = 400
+ return None, response_code, message
return uploaded_datasets, None, None
@web.expose
def add_history_datasets_to_library( self, trans, cntrller, library_id, folder_id, hda_ids='', **kwd ):
--- a/eggs.ini
+++ b/eggs.ini
@@ -41,7 +41,7 @@ Paste = 1.6
PasteDeploy = 1.3.3
PasteScript = 1.7.3
pexpect = 2.4
-Routes = 1.11
+Routes = 1.12.3
simplejson = 1.5
SQLAlchemy = 0.5.6
sqlalchemy_migrate = 0.5.4
--- /dev/null
+++ b/scripts/api/library_create_folder.py
@@ -0,0 +1,20 @@
+#!/usr/bin/python
+
+import os, sys
+sys.path.insert( 0, os.path.dirname( __file__ ) )
+from common import submit
+
+try:
+ data = {}
+ data[ 'folder_id' ] = sys.argv[3]
+ data[ 'name' ] = sys.argv[4]
+ data[ 'create_type' ] = 'folder'
+except IndexError:
+ print 'usage: %s key url folder_id name [description]' % os.path.basename( sys.argv[0] )
+ sys.exit( 1 )
+try:
+ data[ 'description' ] = sys.argv[5]
+except IndexError:
+ data[ 'description' ] = ''
+
+submit( sys.argv[1], sys.argv[2], data )
--- a/lib/galaxy/web/controllers/user.py
+++ b/lib/galaxy/web/controllers/user.py
@@ -979,3 +979,25 @@ class User( BaseController ):
lines_skipped=lines_skipped )
+ @web.expose
+ def new_api_key( self, trans, **kwd ):
+ params = util.Params( kwd )
+ message = util.restore_text( params.get( 'message', '' ) )
+ status = params.get( 'status', 'done' )
+ admin_view = util.string_as_bool( params.get( 'admin_view', False ) )
+ error = ''
+ user = trans.sa_session.query( trans.app.model.User ).get( int( params.get( 'user_id', None ) ) )
+ if params.get( 'new_api_key_button', None ) == 'Generate a new key now':
+ new_key = trans.app.model.APIKeys()
+ new_key.user_id = user.id
+ new_key.key = trans.app.security.get_new_guid()
+ trans.sa_session.add( new_key )
+ trans.sa_session.flush()
+ message = "Generated a new web API key"
+ status = "done"
+ return trans.response.send_redirect( web.url_for( controller='user',
+ action='show_info',
+ admin_view=admin_view,
+ user_id=user.id,
+ message=message,
+ status=status ) )
--- a/templates/webapps/galaxy/user/info.mako
+++ b/templates/webapps/galaxy/user/info.mako
@@ -66,8 +66,9 @@
<p></p>
%endif
+<p/>
+
<div class="toolForm">
- <p></p><form name="user_info" id="user_info" action="${h.url_for( controller='user', action='new_address', user_id=user.id, admin_view=admin_view )}" method="post" ><div class="toolFormTitle">User Addresses</div><div class="toolFormBody">
@@ -118,5 +119,37 @@
</div></div></form>
- <p></p></div>
+
+<p/>
+
+%if trans.app.config.enable_api:
+ <div class="toolForm">
+ <form name="user_info" id="user_info" action="${h.url_for( controller='user', action='new_api_key', user_id=user.id, admin_view=admin_view )}" method="post" >
+ <div class="toolFormTitle">Web API Key</div>
+ <div class="toolFormBody">
+ <div class="form-row">
+ <label>Current API key:</label>
+ %if user.api_keys:
+ ${user.api_keys[0].key}
+ %else:
+ none set
+ %endif
+ </div>
+ <div class="form-row">
+ <input type="submit" name="new_api_key_button" value="Generate a new key now"/>
+ %if user.api_keys:
+ (invalidates old key)
+ %endif
+ <div class="toolParamHelp" style="clear: both;">
+ An API key will allow you to access Galaxy via its web
+ API (documentation forthcoming). Please note that
+ <strong>this key acts as an alternate means to access
+ your account, and should be treated with the same care
+ as your login password</strong>.
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
+%endif
--- a/lib/galaxy/web/__init__.py
+++ b/lib/galaxy/web/__init__.py
@@ -2,6 +2,6 @@
The Galaxy web application.
"""
-from framework import expose, json, json_pretty, require_login, require_admin, url_for, error, form, FormBuilder
+from framework import expose, json, json_pretty, require_login, require_admin, url_for, error, form, FormBuilder, expose_api
from framework.base import httpexceptions
--- a/universe_wsgi.ini.sample
+++ b/universe_wsgi.ini.sample
@@ -112,6 +112,9 @@ gbrowse_display_sites = wormbase,tair,mo
# Define your GeneTrack servers in tool-data/shared/genetrack/genetrack_sites.txt
#genetrack_display_sites =
+# Enable the (experimental! beta!) Web API. Documentation forthcoming.
+#enable_api = False
+
# Serving static files (needed if running standalone)
static_enabled = True
static_cache_time = 360
--- /dev/null
+++ b/scripts/api/display.py
@@ -0,0 +1,11 @@
+#!/usr/bin/python
+
+import os, sys
+sys.path.insert( 0, os.path.dirname( __file__ ) )
+from common import display
+
+try:
+ display( *sys.argv[1:3] )
+except TypeError:
+ print 'usage: %s key url' % os.path.basename( sys.argv[0] )
+ sys.exit( 1 )
1
0
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User Dannon Baker <dannon.baker(a)emory.edu>
# Date 1277239092 14400
# Node ID 5e75bad5a780acb7c2975bcc375216c1abb5d148
# Parent f2f31fe4cf08f9500a886184b5c5f15fa4184e4d
# Parent 464734ed09ad4b36afc3409b5d975732b1c6eb21
Merge.
1
0

galaxy-dist commit 4b4385fbf529: Fix bug in metadata setting for intersect tool.
by commits-noreply@bitbucket.org 29 Jun '10
by commits-noreply@bitbucket.org 29 Jun '10
29 Jun '10
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User jeremy goecks <jeremy.goecks(a)emory.edu>
# Date 1277222908 14400
# Node ID 4b4385fbf52982ee3bf6394c5cb269e7bf3ab912
# Parent 764ecc0cf3fdc4885de777f26e1ae7c06a85acbf
Fix bug in metadata setting for intersect tool.
--- a/tools/new_operations/intersect.xml
+++ b/tools/new_operations/intersect.xml
@@ -54,7 +54,7 @@
<outputs><data format="input" name="output">
#if inputs.type == "Interval":
- metadata_source="inputs.bed_input1"
+ metadata_source="inputs.interval_input1"
#else:
metadata_source="inputs.gff_input1"
#end if
1
0

galaxy-dist commit beb30aadccd7: Fix IE crashing on pages with grids
by commits-noreply@bitbucket.org 29 Jun '10
by commits-noreply@bitbucket.org 29 Jun '10
29 Jun '10
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User Kanwei Li <kanwei(a)gmail.com>
# Date 1277239345 14400
# Node ID beb30aadccd75bfdec6b06d4afcd704c2c16dbc3
# Parent 5e75bad5a780acb7c2975bcc375216c1abb5d148
Fix IE crashing on pages with grids
--- a/templates/grid_base.mako
+++ b/templates/grid_base.mako
@@ -245,14 +245,13 @@
%endfor
// Initialize URL args with filter arguments.
- var url_args = ${h.to_json_string( cur_filter_dict )};
+ var url_args_init = ${h.to_json_string( cur_filter_dict )},
+ url_args = {};
// Place "f-" in front of all filter arguments.
- for (arg in url_args)
- {
- value = url_args[arg];
- delete url_args[arg];
- url_args["f-" + arg] = value;
+
+ for (arg in url_args_init) {
+ url_args["f-" + arg] = url_args_init[arg];
}
// Add sort argument to URL args.
1
0

galaxy-dist commit f2f31fe4cf08: New: Send Email Action, Delete Action.
by commits-noreply@bitbucket.org 29 Jun '10
by commits-noreply@bitbucket.org 29 Jun '10
29 Jun '10
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User Dannon Baker <dannon.baker(a)emory.edu>
# Date 1277238844 14400
# Node ID f2f31fe4cf08f9500a886184b5c5f15fa4184e4d
# Parent 1f8035729ccd73f31522e816cf5467409e841b91
New: Send Email Action, Delete Action.
Note that delete action is dangerous and will break a workflow if you delete datasets that are required in later steps.
Partial refactoring to make addition of actions simpler.
--- a/lib/galaxy/jobs/actions/post.py
+++ b/lib/galaxy/jobs/actions/post.py
@@ -5,18 +5,50 @@ from galaxy.util.json import from_json_s
from galaxy.web.form_builder import *
+
+# For email notification PJA
+from email.MIMEText import MIMEText
+import smtplib
+
log = logging.getLogger( __name__ )
# DBTODO This still needs refactoring and general cleanup.
+def get_form_template(action_type, title, content, help, on_output = True ):
+ if on_output:
+ form = """
+ if (pja.action_type == "%s"){
+ p_str = "<div class='pjaForm toolForm'><span class='action_tag' style='display:none'>"+ pja.action_type + pja.output_name + "</span><div class='toolFormTitle'> %s <br/> on " + pja.output_name + "\
+ <div style='float: right;' class='buttons'><img src='../images/delete_icon.png'></div></div><div class='toolFormBody'>";
+ %s
+ p_str += "</div><div class='toolParamHelp'>%s</div></div>";
+ }""" % (action_type, title, content, help)
+ else:
+ form = """
+ if (pja.action_type == "%s"){
+ p_str = "<div class='pjaForm toolForm'><span class='action_tag' style='display:none'>"+ pja.action_type + "</span><div class='toolFormTitle'> %s \
+ <div style='float: right;' class='buttons'><img src='../images/delete_icon.png'></div></div><div class='toolFormBody'>";
+ %s
+ p_str += "</div><div class='toolParamHelp'>%s</div></div>";
+ }""" % (action_type, title, content, help)
+ return form
+
+# def get_field(action, argument, i_type, label = None):
+# fstr = ''
+# fname = """pja__"+pja.output_name+"__%s__%s""" % (action, argument)
+# if label:
+# fstr += """<label for='pja__"+pja.output_name+"__ColumnSetAction__chromCol'>Chrom Column</label>"""
+# fstr += """<input type='text' value=" + chromCol + " name='pja__"+pja.output_name+"__ColumnSetAction__chromCol'/>"""
+
class DefaultJobAction(object):
name = "DefaultJobAction"
+ verbose_name = "Default Job"
@classmethod
def execute(cls, job):
pass
- @classmethod
+ @classmethod
def get_config_form(cls, trans):
return "<p>Default Job Action Config Form</p>"
@@ -26,11 +58,42 @@ class DefaultJobAction(object):
return "%s -> %s" % (pja.action_type, pja.action_arguments)
else:
return "%s" % pja.action_type
-
+
+
+class EmailAction(DefaultJobAction):
+ name = "EmailAction"
+ verbose_name = "Email Notification"
+ @classmethod
+ def execute(cls, trans, action, job):
+ smtp_server = trans.app.config.smtp_server
+ if smtp_server is None:
+ return trans.show_error_message( "Mail is not configured for this galaxy instance, workflow action aborted." )
+ # Build the email message
+ msg = MIMEText( "Your job '%s' at Galaxy instance %s is complete as of %s." % (job.history.name, trans.request.host, job.update_time))
+ msg[ 'To' ] = job.user.email
+ msg[ 'From' ] = job.user.email
+ msg[ 'Subject' ] = "Galaxy workflow step notification '%s'"
+ try:
+ s = smtplib.SMTP()
+ s.connect( smtp_server )
+ s.sendmail( frm, [ to ], msg.as_string() )
+ s.close()
+ return trans.show_ok_message( "Your error report has been sent" )
+ except Exception, e:
+ return trans.show_error_message( "An error occurred sending the report by email: %s" % str( e ) )
+
+ @classmethod
+ def get_config_form(cls, trans):
+ form = """
+ p_str += "<label for='pja__"+pja.output_name+"__EmailAction'>There are no additional options for this action. You will be emailed upon job completion.</label>\
+ <input type='hidden' name='pja__"+pja.output_name+"__EmailAction'/>";
+ """
+ return get_form_template(cls.name, cls.verbose_name, form, "This action will send an email notifying you when the job is done.", on_output = False)
+
class ChangeDatatypeAction(DefaultJobAction):
name = "ChangeDatatypeAction"
-
+ verbose_name = "Change Datatype"
@classmethod
def execute(cls, trans, action, job):
for dataset_assoc in job.output_datasets:
@@ -45,24 +108,21 @@ class ChangeDatatypeAction(DefaultJobAct
for dt_name in dtnames:
dt_list += """<option id='pja__"+pja.output_name+"__ChangeDatatypeAction__newtype__%s' value='%s'>%s</option>""" % (dt_name, dt_name, dt_name)
ps = """
- if (pja.action_type == "ChangeDatatypeAction"){
- p_str = "<div class='pjaForm toolForm'><span class='action_tag' style='display:none'>"+ pja.action_type + pja.output_name + "</span><div class='toolFormTitle'>" + pja.action_type + " <br/> on " + pja.output_name + "\
- <div style='float: right;' class='buttons'><img src='../images/delete_icon.png'></div></div>\
- <div class='toolFormBody'><label for='pja__"+pja.output_name+"__ChangeDatatypeAction__newtype'>New Datatype:</label><select id='pja__"+pja.output_name+"__ChangeDatatypeAction__newtype' name='pja__"+pja.output_name+"__ChangeDatatypeAction__newtype'>\
+ p_str += "<label for='pja__"+pja.output_name+"__ChangeDatatypeAction__newtype'>New Datatype:</label>\
+ <select id='pja__"+pja.output_name+"__ChangeDatatypeAction__newtype' name='pja__"+pja.output_name+"__ChangeDatatypeAction__newtype'>\
%s\
</select>";
- if (pja.action_arguments != undefined && pja.action_arguments.newtype != undefined){
- p_str += "<scrip" + "t type='text/javascript'>$('#pja__" + pja.output_name + "__ChangeDatatypeAction__newtype').val('" + pja.action_arguments.newtype + "');</scrip" + "t>"
- }
- p_str += "</div><div class='toolParamHelp'>This action will change the datatype of the output to the indicated value.</div></div>";
- }
+ if (pja.action_arguments != undefined && pja.action_arguments.newtype != undefined){
+ p_str += "<scrip" + "t type='text/javascript'>$('#pja__" + pja.output_name + "__ChangeDatatypeAction__newtype').val('" + pja.action_arguments.newtype + "');</scrip" + "t>";
+ }
""" % dt_list
# Note the scrip + t hack above. Is there a better way?
- return ps
+ return get_form_template(cls.name, cls.verbose_name, ps, 'This action will change the datatype of the output to the indicated value.')
class RenameDatasetAction(DefaultJobAction):
name = "RenameDatasetAction"
-
+ verbose_name = "Rename Dataset"
+
@classmethod
def execute(cls, trans, action, job):
for dataset_assoc in job.output_datasets:
@@ -71,23 +131,22 @@ class RenameDatasetAction(DefaultJobActi
@classmethod
def get_config_form(cls, trans):
- return """
- if (pja.action_type == "RenameDatasetAction"){
- p_str = "<div class='pjaForm toolForm'><span class='action_tag' style='display:none'>"+ pja.action_type + pja.output_name + "</span><div class='toolFormTitle'>"+ pja.action_type + " <br/> on " + pja.output_name + "\
- <div style='float: right;' class='buttons'><img src='../images/delete_icon.png'></div></div><div class='toolFormBody'>";
- if ((pja.action_arguments != undefined) && (pja.action_arguments.newname != undefined)){
- p_str += "<label for='pja__"+pja.output_name+"__RenameDatasetAction__newname'>New output name:</label><input type='text' name='pja__"+pja.output_name+"__RenameDatasetAction__newname' value='"+pja.action_arguments.newname + "'/>";
- }
- else{
- p_str += "<label for='pja__"+pja.output_name+"__RenameDatasetAction__newname'>New output name:</label><input type='text' name='pja__"+pja.output_name+"__RenameDatasetAction__newname' value='New Name'/>";
- }
- p_str += "</div><div class='toolParamHelp'>This action will rename the result dataset.</div></div>";
- }
+ form = """
+ if ((pja.action_arguments != undefined) && (pja.action_arguments.newname != undefined)){
+ p_str += "<label for='pja__"+pja.output_name+"__RenameDatasetAction__newname'>New output name:</label>\
+ <input type='text' name='pja__"+pja.output_name+"__RenameDatasetAction__newname' value='"+pja.action_arguments.newname + "'/>";
+ }
+ else{
+ p_str += "<label for='pja__"+pja.output_name+"__RenameDatasetAction__newname'>New output name:</label>\
+ <input type='text' name='pja__"+pja.output_name+"__RenameDatasetAction__newname' value=''/>";
+ }
"""
+ return get_form_template(cls.name, cls.verbose_name, form, "This action will rename the result dataset.")
class HideDatasetAction(DefaultJobAction):
name = "HideDatasetAction"
-
+ verbose_name = "Hide Dataset"
+
@classmethod
def execute(cls, trans, action, job):
for dataset_assoc in job.output_datasets:
@@ -96,14 +155,79 @@ class HideDatasetAction(DefaultJobAction
@classmethod
def get_config_form(cls, trans):
- return """
- if (pja.action_type == "HideDatasetAction"){
- p_str = "<div class='pjaForm toolForm'><span class='action_tag' style='display:none'>"+ pja.action_type + pja.output_name + "</span><div class='toolFormTitle'>"+ pja.action_type + " <br/> on " + pja.output_name + "\
- <div style='float: right;' class='buttons'><img src='../images/delete_icon.png'></div></div><div class='toolFormBody'>";
- p_str += "<label for='pja__"+pja.output_name+"__HideDatasetAction'>There are no additional options for this action.</label><input type='hidden' name='pja__"+pja.output_name+"__HideDatasetAction'/>";
- p_str += "</div><div class='toolParamHelp'>This action will *hide* the result dataset from your history.</div></div>";
+ form = """
+ p_str += "<label for='pja__"+pja.output_name+"__HideDatasetAction'>There are no additional options for this action.</label>\
+ <input type='hidden' name='pja__"+pja.output_name+"__HideDatasetAction'/>";
+ """
+ return get_form_template(cls.name, cls.verbose_name, form, "This action will rename the result dataset.")
+
+class DeleteDatasetAction(DefaultJobAction):
+ # This is disabled for right now. Deleting a dataset in the middle of a workflow causes errors (obviously) for the subsequent steps using the data.
+ name = "DeleteDatasetAction"
+ verbose_name = "Delete Dataset"
+
+ @classmethod
+ def execute(cls, trans, action, job):
+ for dataset_assoc in job.output_datasets:
+ if action.output_name == '' or dataset_assoc.name == action.output_name:
+ dataset_assoc.dataset.deleted=True
+
+ @classmethod
+ def get_config_form(cls, trans):
+ form = """
+ p_str += "<label for='pja__"+pja.output_name+"__DeleteDatasetAction'>There are no additional options for this action. This dataset will be marked deleted.</label>\
+ <input type='hidden' name='pja__"+pja.output_name+"__DeleteDatasetAction'/>";
+ """
+ return get_form_template(cls.name, cls.verbose_name, form, "This action will rename the result dataset.")
+
+
+class ColumnSetAction(DefaultJobAction):
+ name = "ColumnSetAction"
+ verbose_name = "Assign Columns"
+ @classmethod
+ def execute(cls, trans, action, job):
+ for dataset_assoc in job.output_datasets:
+ if action.output_name == '' or dataset_assoc.name == action.output_name:
+ for k, v in action.action_arguments.items():
+ if v != '':
+ # Try to use both pure integer and 'cX' format.
+ if v[0] == 'c':
+ v = v[1:]
+ v = int(v)
+ if v != 0:
+ setattr(dataset_assoc.dataset.metadata, k, v)
+
+ @classmethod
+ def get_config_form(cls, trans):
+ form = """
+ var chrom_col = ''
+ if (pja.action_arguments != undefined){
+ (pja.action_arguments.chromCol == undefined) ? chromCol = "" : chromCol=pja.action_arguments.chromCol;
+ (pja.action_arguments.startCol == undefined) ? startCol = "" : startCol=pja.action_arguments.startCol;
+ (pja.action_arguments.endCol == undefined) ? endCol = "" : endCol=pja.action_arguments.endCol;
+ (pja.action_arguments.strandCol == undefined) ? strandCol = "" : strandCol=pja.action_arguments.strandCol;
+ (pja.action_arguments.nameCol == undefined) ? nameCol = "" : nameCol=pja.action_arguments.nameCol;
+ }else{
+ chromCol = '';
+ startCol = '';
+ endCol = '';
+ strandCol = '';
+ nameCol = '';
}
+ p_str += "<p>Leave any of these fields blank if they do not need to be set.</p>\
+ <label for='pja__"+pja.output_name+"__ColumnSetAction__chromCol'>Chrom Column</label>\
+ <input type='text' value='" + chromCol + "' name='pja__"+pja.output_name+"__ColumnSetAction__chromCol'/>\
+ <label for='pja__"+pja.output_name+"__ColumnSetAction__startCol'>Start Column</label>\
+ <input type='text' value='" + startCol + "' name='pja__"+pja.output_name+"__ColumnSetAction__startCol'/>\
+ <label for='pja__"+pja.output_name+"__ColumnSetAction__endCol'>End Column</label>\
+ <input type='text' value='" + endCol + "' name='pja__"+pja.output_name+"__ColumnSetAction__endCol'/>\
+ <label for='pja__"+pja.output_name+"__ColumnSetAction__strandCol'>Strand Column</label>\
+ <input type='text' value='" + strandCol + "' name='pja__"+pja.output_name+"__ColumnSetAction__strandCol'/>\
+ <label for='pja__"+pja.output_name+"__ColumnSetAction__nameCol'>Name Column</label>\
+ <input type='text' value='" + nameCol + "' name='pja__"+pja.output_name+"__ColumnSetAction__nameCol'/>\";
"""
+ return get_form_template(cls.name, cls.verbose_name, form, "This action will set column assignments in the output dataset. Blank fields are ignored.")
+
class SetMetadataAction(DefaultJobAction):
name = "SetMetadataAction"
@@ -116,28 +240,38 @@ class SetMetadataAction(DefaultJobAction
@classmethod
def get_config_form(cls, trans):
- dt_list = ""
- mdict = {}
- for dtype_name, dtype_value in trans.app.datatypes_registry.datatypes_by_extension.iteritems():
- for mn, mt in dtype_value.metadata_spec.items():
- if mt.visible:
- mdict[mt.desc] = mt.param.get_html(value= mn).replace('"', "'").strip().replace('\n','')
- for k, v in mdict.items():
- dt_list += "<p><strong>" + k + ":</strong><br/>" + v + "</p>"
- return """
- if (pja.action_type == "SetMetadataAction"){
- p_str = "<div class='pjaForm toolForm'><span class='action_tag' style='display:none'>"+ pja.action_type + pja.output_name + "</span><div class='toolFormTitle'>"+ pja.action_type + " <br/> on " + pja.output_name + "\
- <div style='float: right;' class='buttons'><img src='../images/delete_icon.png'></div></div>\
- <div class='toolFormBody'>\
- %s\
- </div><div class='toolParamHelp'>This tool sets metadata in output.</div></div>";
- }
- """ % dt_list
+ # dt_list = ""
+ # mdict = {}
+ # for dtype_name, dtype_value in trans.app.datatypes_registry.datatypes_by_extension.iteritems():
+ # for mn, mt in dtype_value.metadata_spec.items():
+ # if mt.visible:
+ # mdict[mt.desc] = mt.param.get_html(value= mn).replace('"', "'").strip().replace('\n','')
+ # for k, v in mdict.items():
+ # dt_list += "<p><strong>" + k + ":</strong><br/>" + v + "</p>"
+ # form = """
+ # p_str += "%s";
+ # """ % dt_list
+ # return get_form_template('SetMetadataAction', 'Set Metadata', form, "This action will change metadata for the dataset.")
+ form = """
+ p_str += "<p>Leave any of these fields blank if they do not need to be set.</p><label for='pja__"+pja.output_name+"__SetMetadataAction__chromCol'>Chrom Column</label>\
+ <input type='text' name='pja__"+pja.output_name+"__SetMetadataAction__chromCol'/>\
+ <label for='pja__"+pja.output_name+"__SetMetadataAction__startCol'>Start Column</label>\
+ <input type='text' name='pja__"+pja.output_name+"__SetMetadataAction__startCol'/>\
+ <label for='pja__"+pja.output_name+"__SetMetadataAction__endCol'>End Column</label>\
+ <input type='text' name='pja__"+pja.output_name+"__SetMetadataAction__endCol'/>\
+ <label for='pja__"+pja.output_name+"__SetMetadataAction__comment_lines'>Comment Lines</label>\
+ <input type='text' name='pja__"+pja.output_name+"__SetMetadataAction__comment_lines'/>\
+ ";
+ """
+ return get_form_template(cls.name, cls.verbose_name, form, "This action will set metadata in the output dataset.")
ACTIONS = { "RenameDatasetAction" : RenameDatasetAction,
"HideDatasetAction" : HideDatasetAction,
"ChangeDatatypeAction": ChangeDatatypeAction,
- # "SetMetadataAction" : SetMetadataAction,
+ "ColumnSetAction" : ColumnSetAction,
+ "EmailAction" : EmailAction,
+ # "SetMetadataAction" : SetMetadataAction,
+ # "DeleteDatasetAction" : DeleteDatasetAction,
}
class ActionBox(object):
@@ -147,13 +281,13 @@ class ActionBox(object):
ACTIONS[action.action_type].execute(action, job, trans)
else:
return False
-
+
@classmethod
def get_short_str(cls, action):
if action.action_type in ACTIONS:
return ACTIONS[action.action_type].get_short_str(action)
else:
- return "Unknown PostJobAction"
+ return "Unknown Action"
@classmethod
def handle_incoming(cls, incoming):
@@ -180,7 +314,7 @@ class ActionBox(object):
def get_add_list(cls):
addlist = "<select id='new_pja_list' name='new_pja_list'>"
for action in ACTIONS:
- addlist += "<option value='%s'>%s</option>" % (ACTIONS[action].name, ACTIONS[action].name)
+ addlist += "<option value='%s'>%s</option>" % (ACTIONS[action].name, ACTIONS[action].verbose_name)
addlist += "</select>"
return addlist
@@ -193,4 +327,5 @@ class ActionBox(object):
@classmethod
def execute(cls, trans, pja, job):
- ACTIONS[pja.action_type].execute(trans, pja, job)
+ if ACTIONS.has_key(pja.action_type):
+ ACTIONS[pja.action_type].execute(trans, pja, job)
--- a/templates/workflow/editor.mako
+++ b/templates/workflow/editor.mako
@@ -313,9 +313,9 @@
// DBTODO Refactor to the post module.
// This function preloads how to display known pja's.
function display_pja(pja, node){
- // DBTODO SANITIZE INPUTS. Way too easy to break the page right now with a change dataset name action.
+ // DBTODO SANITIZE INPUTS.
p_str = '';
- ${ActionBox.get_forms(trans)};
+ ${ActionBox.get_forms(trans)}
$("#pja_container").append(p_str);
$("#pja_container>.toolForm:last>.toolFormTitle>.buttons").click(function (){
action_to_rem = $(this).closest(".toolForm", ".action_tag").children(".action_tag:first").text();
@@ -376,7 +376,7 @@
// Add step actions.
if (node && node.type=='tool'){
pjastr = "<p><div class='metadataForm'><div class='metadataFormTitle'>Edit Step Actions</div><div class='form-row'> \
- <label>New Actions:</label><br/>" + display_pja_list() + display_file_list(node) + " <div class='action-button' style='border:1px solid black;display:inline;' id='add_pja'>Create</div>\
+ " + display_pja_list() + " <br/> "+ display_file_list(node) + " <div class='action-button' style='border:1px solid black;display:inline;' id='add_pja'>Create</div>\
</div><div class='form-row'>\
<div style='margin-right: 10px;'><span id='pja_container'></span>";
pjastr += "<div class='toolParamHelp'>Add actions to this step; actions are applied when this workflow step completes.</div></div></div></div>";
1
0

galaxy-dist commit b4237641ca4d: Make the PSU BX browser a UCSC browser instead of being a different display type.
by commits-noreply@bitbucket.org 29 Jun '10
by commits-noreply@bitbucket.org 29 Jun '10
29 Jun '10
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User Nate Coraor <nate(a)bx.psu.edu>
# Date 1277829642 14400
# Node ID b4237641ca4d28631c9e65c726693057d4b8dab3
# Parent eea2c040ccb7bd0d2a7c6e5eab8e65f98a163009
Make the PSU BX browser a UCSC browser instead of being a different display type.
--- a/universe_wsgi.ini.sample
+++ b/universe_wsgi.ini.sample
@@ -105,8 +105,7 @@ mailing_join_addr = galaxy-user-join@bx.
# Use the new iframe / javascript based layout
use_new_layout = true
-# Comma separated list of bx / UCSC / gbrowse / GeneTrack browsers to use for viewing
-bx_display_sites = main
+# Comma separated list of UCSC / gbrowse / GeneTrack browsers to use for viewing
ucsc_display_sites = main,test,archaea,ucla
gbrowse_display_sites = wormbase,tair,modencode_worm,modencode_fly
# Define your GeneTrack servers in tool-data/shared/genetrack/genetrack_sites.txt
--- a/lib/galaxy/util/__init__.py
+++ b/lib/galaxy/util/__init__.py
@@ -278,12 +278,6 @@ def object_to_string( obj ):
def string_to_object( s ):
return pickle.loads( binascii.unhexlify( s ) )
-def get_bx_by_build(build):
- sites = []
- for site in bx_build_sites:
- if build in site['builds']:
- sites.append((site['name'],site['url']))
- return sites
def get_ucsc_by_build(build):
sites = []
for site in ucsc_build_sites:
@@ -484,7 +478,6 @@ def umask_fix_perms( path, umask, unmask
galaxy_root_path = os.path.join(__path__[0], "..","..","..")
# The dbnames list is used in edit attributes and the upload tool
dbnames = read_dbnames( os.path.join( galaxy_root_path, "tool-data", "shared", "ucsc", "builds.txt" ) )
-bx_build_sites = read_build_sites( os.path.join( galaxy_root_path, "tool-data", "shared", "bx", "bx_build_sites.txt" ) )
ucsc_build_sites = read_build_sites( os.path.join( galaxy_root_path, "tool-data", "shared", "ucsc", "ucsc_build_sites.txt" ) )
gbrowse_build_sites = read_build_sites( os.path.join( galaxy_root_path, "tool-data", "shared", "gbrowse", "gbrowse_build_sites.txt" ) )
genetrack_sites = read_build_sites( os.path.join( galaxy_root_path, "tool-data", "shared", "genetrack", "genetrack_sites.txt" ), check_builds=False )
--- a/tool-data/shared/bx/bx_build_sites.txt
+++ /dev/null
@@ -1,1 +0,0 @@
-main http://main.genome-browser.bx.psu.edu/cgi-bin/hgTracks? hg18,hg19,mm8,mm9 bx-main
--- a/lib/galaxy/datatypes/interval.py
+++ b/lib/galaxy/datatypes/interval.py
@@ -54,7 +54,6 @@ class Interval( Tabular ):
"""Initialize interval datatype, by adding UCSC display apps"""
Tabular.__init__(self, **kwd)
self.add_display_app ( 'ucsc', 'display at UCSC', 'as_ucsc_display_file', 'ucsc_links' )
- self.add_display_app ( 'main', 'BX', 'as_ucsc_display_file', 'bx_links' )
def init_meta( self, dataset, copy_from=None ):
Tabular.init_meta( self, dataset, copy_from=copy_from )
@@ -247,29 +246,6 @@ class Interval( Tabular ):
link = '%s?redirect_url=%s&display_url=%s' % ( internal_url, redirect_url, display_url )
ret_val.append( (site_name, link) )
return ret_val
- def bx_links( self, dataset, type, app, base_url ):
- # TODO: abstract these methods to eliminate duplicate code.
- ret_val = []
- if dataset.has_data:
- viewport_tuple = self.get_estimated_display_viewport(dataset)
- if viewport_tuple:
- chrom = viewport_tuple[0]
- start = viewport_tuple[1]
- stop = viewport_tuple[2]
- for site_name, site_url in util.get_bx_by_build(dataset.dbkey):
- if site_name in app.config.bx_display_sites:
- # HACK: UCSC doesn't support https, so force http even
- # if our URL scheme is https. Making this work
- # requires additional hackery in your upstream proxy.
- # If UCSC ever supports https, remove this hack.
- internal_url = "%s" % url_for( controller='dataset', dataset_id=dataset.id, action='display_at', filename='bx_' + site_name )
- if base_url.startswith( 'https://' ):
- base_url = base_url.replace( 'https', 'http', 1 )
- display_url = urllib.quote_plus( "%s%s/display_as?id=%i&display_app=%s&authz_method=display_at" % (base_url, url_for( controller='root' ), dataset.id, type) )
- redirect_url = urllib.quote_plus( "%sdb=%s&position=%s:%s-%s&hgt.customText=%%s" % (site_url, dataset.dbkey, chrom, start, stop ) )
- link = '%s?redirect_url=%s&display_url=%s' % ( internal_url, redirect_url, display_url )
- ret_val.append( (site_name, link) )
- return ret_val
def validate( self, dataset ):
"""Validate an interval file using the bx GenomicIntervalReader"""
--- a/tool-data/shared/ucsc/ucsc_build_sites.txt
+++ b/tool-data/shared/ucsc/ucsc_build_sites.txt
@@ -5,3 +5,4 @@ archaea http://archaea.ucsc.edu/cgi-bin/
#Harvested from http://genome-test.cse.ucsc.edu/cgi-bin/das/dsn
test http://genome-test.cse.ucsc.edu/cgi-bin/hgTracks? anoCar1,ce4,ce3,ce2,ce1,loxAfr1,rn2,eschColi_O157H7_1,rn4,droYak1,heliPylo_J99_1,droYak2,dp3,dp2,caeRem2,caeRem1,oryLat1,eschColi_K12_1,homIni13,homIni14,droAna1,droAna2,oryCun1,sacCer1,heliHepa1,droGri1,sc1,dasNov1,choHof1,tupBel1,mm9,mm8,vibrChol1,mm5,mm4,mm7,mm6,mm3,mm2,rn3,venter1,galGal3,galGal2,ornAna1,equCab1,cioSav2,rheMac2,eutHer13,droPer1,droVir2,droVir1,heliPylo_26695_1,euaGli13,calJac1,campJeju1,droSim1,hg13,hg15,hg16,hg17,monDom1,monDom4,droMoj1,petMar1,droMoj2,vibrChol_MO10_1,vibrPara1,gliRes13,vibrVuln_YJ016_1,braFlo1,cioSav1,lauRas13,dm1,canFam1,canFam2,ci1,echTel1,ci2,caePb1,dm3,ponAbe2,falciparum,xenTro1,xenTro2,nonAfr13,fr2,fr1,gasAcu1,dm2,apiMel1,apiMel2,eschColi_O157H7EDL933_1,priPac1,panTro1,hg18,panTro2,campJeju_RM1221_1,canHg12,vibrChol_O395_1,vibrFisc_ES114_1,danRer5,danRer4,danRer3,danRer2,danRer1,tetNig1,afrOth13,bosTau1,eschColi_CFT073_1,bosTau3,bosTau2,bosTau4,rodEnt13,droEre1,priMat13,vibrVu
ln_CMCP6_1,cb2,cb3,cb1,borEut13,droSec1,felCat3,strPur1,strPur2,otoGar1,catArr1,anoGam1,triCas2
ucla http://epigenomics.mcdb.ucla.edu/cgi-bin/hgTracks? araTha1
+psu bx main http://main.genome-browser.bx.psu.edu/cgi-bin/hgTracks? hg18,hg19,mm8,mm9
--- a/lib/galaxy/config.py
+++ b/lib/galaxy/config.py
@@ -83,7 +83,6 @@ class Configuration( object ):
self.log_memory_usage = string_as_bool( kwargs.get( 'log_memory_usage', 'False' ) )
self.log_actions = string_as_bool( kwargs.get( 'log_actions', 'False' ) )
self.log_events = string_as_bool( kwargs.get( 'log_events', 'False' ) )
- self.bx_display_sites = kwargs.get( 'bx_display_sites', "main" ).lower().split(",")
self.ucsc_display_sites = kwargs.get( 'ucsc_display_sites', "main,test,archaea,ucla" ).lower().split(",")
self.gbrowse_display_sites = kwargs.get( 'gbrowse_display_sites', "wormbase,tair,modencode_worm,modencode_fly" ).lower().split(",")
self.genetrack_display_sites = kwargs.get( 'genetrack_display_sites', "main,test" ).lower().split(",")
1
0

galaxy-dist commit 91d047183110: Fix bug that prevented correct toggling of recently used menu.
by commits-noreply@bitbucket.org 29 Jun '10
by commits-noreply@bitbucket.org 29 Jun '10
29 Jun '10
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User jeremy goecks <jeremy.goecks(a)emory.edu>
# Date 1277147258 14400
# Node ID 91d047183110888b3bbcbfc99a0b5f2c38c2d6bf
# Parent 4cdf4cca0f313c5c3a6045db287a32a3d1e4d30b
Fix bug that prevented correct toggling of recently used menu.
--- a/templates/root/index.mako
+++ b/templates/root/index.mako
@@ -124,10 +124,7 @@
else
{
// "Show" menu.
- var tool_search_query = $('#galaxy_tools').contents().find('#tool-search-query');
- var tool_search_active = tool_search_query.is(":visible") && tool_search_query.val().length > 3;
-
- if (!tool_search_active)
+ if (!$('#galaxy_tools').contents().find('#tool-search-query').hasClass("search_active"))
// Default.
ru_menu.slideDown();
else
--- a/templates/root/tool_menu.mako
+++ b/templates/root/tool_menu.mako
@@ -113,6 +113,8 @@
if ( this.value.length < 3 ) {
reset_tool_search(false);
} else if ( this.value != this.lastValue ) {
+ // Add class to denote that searching is active.
+ $(this).addClass("search_active");
// input.addClass(config.loadingClass);
// Add '*' to facilitate partial matching.
var q = this.value + '*';
--- a/static/scripts/galaxy.base.js
+++ b/static/scripts/galaxy.base.js
@@ -478,7 +478,8 @@ function reset_tool_search( initValue )
if (tool_menu_frame.length == 0)
tool_menu_frame = $(document);
- // Remove matching class.
+ // Remove classes that indicate searching is active.
+ $(this).removeClass("search_active");
tool_menu_frame.find(".toolTitle").removeClass("search_match");
// Reset visibility of tools and labels.
--- a/static/scripts/packed/galaxy.base.js
+++ b/static/scripts/packed/galaxy.base.js
@@ -1,1 +1,1 @@
-$.fn.makeAbsolute=function(a){return this.each(function(){var b=$(this);var c=b.position();b.css({position:"absolute",marginLeft:0,marginTop:0,top:c.top,left:c.left,right:$(window).width()-(c.left+b.width())});if(a){b.remove().appendTo("body")}})};function ensure_popup_helper(){if($("#popup-helper").length===0){$("<div id='popup-helper'/>").css({background:"white",opacity:0,zIndex:15000,position:"absolute",top:0,left:0,width:"100%",height:"100%"}).appendTo("body").hide()}}function attach_popupmenu(b,d){var a=function(){d.unbind().hide();$("#popup-helper").unbind("click.popupmenu").hide()};var c=function(g){$("#popup-helper").bind("click.popupmenu",a).show();d.click(a).css({left:0,top:-1000}).show();var f=g.pageX-d.width()/2;f=Math.min(f,$(document).scrollLeft()+$(window).width()-$(d).width()-20);f=Math.max(f,$(document).scrollLeft()+20);d.css({top:g.pageY-5,left:f});return false};$(b).click(c)}function make_popupmenu(c,b){ensure_popup_helper();var a=$("<ul id='"+c.attr("id")
+"-menu'></ul>");$.each(b,function(f,e){if(e){$("<li/>").html(f).click(e).appendTo(a)}else{$("<li class='head'/>").html(f).appendTo(a)}});var d=$("<div class='popmenu-wrapper'>");d.append(a).append("<div class='overlay-border'>").css("position","absolute").appendTo("body").hide();attach_popupmenu(c,d)}function make_popup_menus(){jQuery("div[popupmenu]").each(function(){var c={};$(this).find("a").each(function(){var b=$(this).attr("confirm"),d=$(this).attr("href"),e=$(this).attr("target");c[$(this).text()]=function(){if(!b||confirm(b)){var g=window;if(e=="_parent"){g=window.parent}else{if(e=="_top"){g=window.top}}g.location=d}}});var a=$("#"+$(this).attr("popupmenu"));make_popupmenu(a,c);$(this).remove();a.addClass("popup").show()})}function array_length(b){if(b.length){return b.length}var c=0;for(var a in b){c++}return c}function naturalSort(i,g){var n=/(-?[0-9\.]+)/g,j=i.toString().toLowerCase()||"",f=g.toString().toLowerCase()||"",k=String.fromCharCode(0),l=j.replace(n,k+"
$1"+k).split(k),e=f.replace(n,k+"$1"+k).split(k),d=(new Date(j)).getTime(),m=d?(new Date(f)).getTime():null;if(m){if(d<m){return -1}else{if(d>m){return 1}}}for(var h=0,c=Math.max(l.length,e.length);h<c;h++){oFxNcL=parseFloat(l[h])||l[h];oFyNcL=parseFloat(e[h])||e[h];if(oFxNcL<oFyNcL){return -1}else{if(oFxNcL>oFyNcL){return 1}}}return 0}function replace_big_select_inputs(a,b){if(!jQuery().autocomplete){return}if(a===undefined){a=20}if(b===undefined){b=3000}$("select").each(function(){var e=$(this);var h=e.find("option").length;if((h<a)||(h>b)){return}if(e.attr("multiple")==true){return}var l=e.attr("value");var c=$("<input type='text' class='text-and-autocomplete-select'></input>");c.attr("size",40);c.attr("name",e.attr("name"));c.attr("id",e.attr("id"));c.click(function(){var m=$(this).val();$(this).val("Loading...");$(this).showAllInCache();$(this).val(m);$(this).select()});var f=[];var i={};e.children("option").each(function(){var n=$(this).text();var m=$(this).attr("value
");f.push(n);i[n]=m;i[m]=m;if(m==l){c.attr("value",n)}});if(l==""||l=="?"){c.attr("value","Click to Search or Select")}if(e.attr("name")=="dbkey"){f=f.sort(naturalSort)}var g={selectFirst:false,autoFill:false,mustMatch:false,matchContains:true,max:b,minChars:0,hideForLessThanMinChars:false};c.autocomplete(f,g);e.replaceWith(c);var k=function(){var n=c.attr("value");var m=i[n];if(m!==null&&m!==undefined){c.attr("value",m)}else{if(l!=""){c.attr("value",l)}else{c.attr("value","?")}}};c.parents("form").submit(function(){k()});$(document).bind("convert_dbkeys",function(){k()});if(e.attr("refresh_on_change")=="true"){var d=e.attr("refresh_on_change_values");if(d!==undefined){d=d.split(",")}var j=function(){var o=c.attr("value");var n=i[o];if(n!==null&&n!==undefined){refresh=false;if(d!==undefined){for(var m=0;m<d.length;m++){if(n==d[m]){refresh=true;break}}}else{refresh=true}if(refresh){c.attr("value",n);c.parents("form").submit()}}};c.bind("result",j);c.keyup(function(m){if(m.key
Code===13){j()}});c.keydown(function(m){if(m.keyCode===13){return false}})}})}function async_save_text(d,f,e,a,c,h,i,g,b){if(c===undefined){c=30}if(i===undefined){i=4}$("#"+d).live("click",function(){if($("#renaming-active").length>0){return}var l=$("#"+f),k=l.text(),j;if(h){j=$("<textarea></textarea>").attr({rows:i,cols:c}).text(k)}else{j=$("<input type='text'></input>").attr({value:k,size:c})}j.attr("id","renaming-active");j.blur(function(){$(this).remove();l.show();if(b){b(j)}});j.keyup(function(n){if(n.keyCode===27){$(this).trigger("blur")}else{if(n.keyCode===13){var m={};m[a]=$(this).val();$(this).trigger("blur");$.ajax({url:e,data:m,error:function(){alert("Text editing for elt "+f+" failed")},success:function(o){l.text(o);if(b){b(j)}}})}}});if(g){g(j)}l.hide();j.insertAfter(l);j.focus();j.select();return})}function init_history_items(d,a,c){var b=function(){try{var e=$.jStore.store("history_expand_state");if(e){for(var g in e){$("#"+g+" div.historyItemBody").show()}}}c
atch(f){$.jStore.remove("history_expand_state")}if($.browser.mozilla){$("div.historyItemBody").each(function(){if(!$(this).is(":visible")){$(this).find("pre.peek").css("overflow","hidden")}})}d.each(function(){var j=this.id;var h=$(this).children("div.historyItemBody");var i=h.find("pre.peek");$(this).find(".historyItemTitleBar > .historyItemTitle").wrap("<a href='javascript:void(0);'></a>").click(function(){if(h.is(":visible")){if($.browser.mozilla){i.css("overflow","hidden")}h.slideUp("fast");if(!c){var k=$.jStore.store("history_expand_state");if(k){delete k[j];$.jStore.store("history_expand_state",k)}}}else{h.slideDown("fast",function(){if($.browser.mozilla){i.css("overflow","auto")}});if(!c){var k=$.jStore.store("history_expand_state");if(k===undefined){k={}}k[j]=true;$.jStore.store("history_expand_state",k)}}return false})});$("#top-links > a.toggle").click(function(){var h=$.jStore.store("history_expand_state");if(h===undefined){h={}}$("div.historyItemBody:visible").ea
ch(function(){if($.browser.mozilla){$(this).find("pre.peek").css("overflow","hidden")}$(this).slideUp("fast");if(h){delete h[$(this).parent().attr("id")]}});$.jStore.store("history_expand_state",h)}).show()};if(a){b()}else{$.jStore.init("galaxy");$.jStore.engineReady(function(){b()})}}function commatize(b){b+="";var a=/(\d+)(\d{3})/;while(a.test(b)){b=b.replace(a,"$1,$2")}return b}function reset_tool_search(a){var c=$("#galaxy_tools").contents();if(c.length==0){c=$(document)}c.find(".toolTitle").removeClass("search_match");c.find(".toolSectionBody").hide();c.find(".toolTitle").show();c.find(".toolPanelLabel").show();c.find(".toolSectionWrapper").each(function(){if($(this).attr("id")!="recently_used_wrapper"){$(this).show()}else{if($(this).hasClass("user_pref_visible")){$(this).show()}}});c.find("#search-no-results").hide();c.find("#search-spinner").hide();if(a){var b=c.find("#tool-search-query");b.val("search tools");b.css("font-style","italic")}}function GalaxyAsync(a){this
.url_dict={};this.log_action=(a===undefined?false:a)}GalaxyAsync.prototype.set_func_url=function(a,b){this.url_dict[a]=b};GalaxyAsync.prototype.set_user_pref=function(a,b){var c=this.url_dict[arguments.callee];if(c===undefined){return false}$.ajax({url:c,data:{pref_name:a,pref_value:b},error:function(){return false},success:function(){return true}})};GalaxyAsync.prototype.log_user_action=function(c,b,d){if(!this.log_action){return}var a=this.url_dict[arguments.callee];if(a===undefined){return false}$.ajax({url:a,data:{action:c,context:b,params:d},error:function(){return false},success:function(){return true}})};$(document).ready(function(){$("a[confirm]").click(function(){return confirm($(this).attr("confirm"))});if($.fn.tipsy){$(".tooltip").tipsy({gravity:"s"})}make_popup_menus();replace_big_select_inputs(20,1500)});
+$.fn.makeAbsolute=function(a){return this.each(function(){var b=$(this);var c=b.position();b.css({position:"absolute",marginLeft:0,marginTop:0,top:c.top,left:c.left,right:$(window).width()-(c.left+b.width())});if(a){b.remove().appendTo("body")}})};function ensure_popup_helper(){if($("#popup-helper").length===0){$("<div id='popup-helper'/>").css({background:"white",opacity:0,zIndex:15000,position:"absolute",top:0,left:0,width:"100%",height:"100%"}).appendTo("body").hide()}}function attach_popupmenu(b,d){var a=function(){d.unbind().hide();$("#popup-helper").unbind("click.popupmenu").hide()};var c=function(g){$("#popup-helper").bind("click.popupmenu",a).show();d.click(a).css({left:0,top:-1000}).show();var f=g.pageX-d.width()/2;f=Math.min(f,$(document).scrollLeft()+$(window).width()-$(d).width()-20);f=Math.max(f,$(document).scrollLeft()+20);d.css({top:g.pageY-5,left:f});return false};$(b).click(c)}function make_popupmenu(c,b){ensure_popup_helper();var a=$("<ul id='"+c.attr("id")
+"-menu'></ul>");$.each(b,function(f,e){if(e){$("<li/>").html(f).click(e).appendTo(a)}else{$("<li class='head'/>").html(f).appendTo(a)}});var d=$("<div class='popmenu-wrapper'>");d.append(a).append("<div class='overlay-border'>").css("position","absolute").appendTo("body").hide();attach_popupmenu(c,d)}function make_popup_menus(){jQuery("div[popupmenu]").each(function(){var c={};$(this).find("a").each(function(){var b=$(this).attr("confirm"),d=$(this).attr("href"),e=$(this).attr("target");c[$(this).text()]=function(){if(!b||confirm(b)){var g=window;if(e=="_parent"){g=window.parent}else{if(e=="_top"){g=window.top}}g.location=d}}});var a=$("#"+$(this).attr("popupmenu"));make_popupmenu(a,c);$(this).remove();a.addClass("popup").show()})}function array_length(b){if(b.length){return b.length}var c=0;for(var a in b){c++}return c}function naturalSort(i,g){var n=/(-?[0-9\.]+)/g,j=i.toString().toLowerCase()||"",f=g.toString().toLowerCase()||"",k=String.fromCharCode(0),l=j.replace(n,k+"
$1"+k).split(k),e=f.replace(n,k+"$1"+k).split(k),d=(new Date(j)).getTime(),m=d?(new Date(f)).getTime():null;if(m){if(d<m){return -1}else{if(d>m){return 1}}}for(var h=0,c=Math.max(l.length,e.length);h<c;h++){oFxNcL=parseFloat(l[h])||l[h];oFyNcL=parseFloat(e[h])||e[h];if(oFxNcL<oFyNcL){return -1}else{if(oFxNcL>oFyNcL){return 1}}}return 0}function replace_big_select_inputs(a,b){if(!jQuery().autocomplete){return}if(a===undefined){a=20}if(b===undefined){b=3000}$("select").each(function(){var e=$(this);var h=e.find("option").length;if((h<a)||(h>b)){return}if(e.attr("multiple")==true){return}var l=e.attr("value");var c=$("<input type='text' class='text-and-autocomplete-select'></input>");c.attr("size",40);c.attr("name",e.attr("name"));c.attr("id",e.attr("id"));c.click(function(){var m=$(this).val();$(this).val("Loading...");$(this).showAllInCache();$(this).val(m);$(this).select()});var f=[];var i={};e.children("option").each(function(){var n=$(this).text();var m=$(this).attr("value
");f.push(n);i[n]=m;i[m]=m;if(m==l){c.attr("value",n)}});if(l==""||l=="?"){c.attr("value","Click to Search or Select")}if(e.attr("name")=="dbkey"){f=f.sort(naturalSort)}var g={selectFirst:false,autoFill:false,mustMatch:false,matchContains:true,max:b,minChars:0,hideForLessThanMinChars:false};c.autocomplete(f,g);e.replaceWith(c);var k=function(){var n=c.attr("value");var m=i[n];if(m!==null&&m!==undefined){c.attr("value",m)}else{if(l!=""){c.attr("value",l)}else{c.attr("value","?")}}};c.parents("form").submit(function(){k()});$(document).bind("convert_dbkeys",function(){k()});if(e.attr("refresh_on_change")=="true"){var d=e.attr("refresh_on_change_values");if(d!==undefined){d=d.split(",")}var j=function(){var o=c.attr("value");var n=i[o];if(n!==null&&n!==undefined){refresh=false;if(d!==undefined){for(var m=0;m<d.length;m++){if(n==d[m]){refresh=true;break}}}else{refresh=true}if(refresh){c.attr("value",n);c.parents("form").submit()}}};c.bind("result",j);c.keyup(function(m){if(m.key
Code===13){j()}});c.keydown(function(m){if(m.keyCode===13){return false}})}})}function async_save_text(d,f,e,a,c,h,i,g,b){if(c===undefined){c=30}if(i===undefined){i=4}$("#"+d).live("click",function(){if($("#renaming-active").length>0){return}var l=$("#"+f),k=l.text(),j;if(h){j=$("<textarea></textarea>").attr({rows:i,cols:c}).text(k)}else{j=$("<input type='text'></input>").attr({value:k,size:c})}j.attr("id","renaming-active");j.blur(function(){$(this).remove();l.show();if(b){b(j)}});j.keyup(function(n){if(n.keyCode===27){$(this).trigger("blur")}else{if(n.keyCode===13){var m={};m[a]=$(this).val();$(this).trigger("blur");$.ajax({url:e,data:m,error:function(){alert("Text editing for elt "+f+" failed")},success:function(o){l.text(o);if(b){b(j)}}})}}});if(g){g(j)}l.hide();j.insertAfter(l);j.focus();j.select();return})}function init_history_items(d,a,c){var b=function(){try{var e=$.jStore.store("history_expand_state");if(e){for(var g in e){$("#"+g+" div.historyItemBody").show()}}}c
atch(f){$.jStore.remove("history_expand_state")}if($.browser.mozilla){$("div.historyItemBody").each(function(){if(!$(this).is(":visible")){$(this).find("pre.peek").css("overflow","hidden")}})}d.each(function(){var j=this.id;var h=$(this).children("div.historyItemBody");var i=h.find("pre.peek");$(this).find(".historyItemTitleBar > .historyItemTitle").wrap("<a href='javascript:void(0);'></a>").click(function(){if(h.is(":visible")){if($.browser.mozilla){i.css("overflow","hidden")}h.slideUp("fast");if(!c){var k=$.jStore.store("history_expand_state");if(k){delete k[j];$.jStore.store("history_expand_state",k)}}}else{h.slideDown("fast",function(){if($.browser.mozilla){i.css("overflow","auto")}});if(!c){var k=$.jStore.store("history_expand_state");if(k===undefined){k={}}k[j]=true;$.jStore.store("history_expand_state",k)}}return false})});$("#top-links > a.toggle").click(function(){var h=$.jStore.store("history_expand_state");if(h===undefined){h={}}$("div.historyItemBody:visible").ea
ch(function(){if($.browser.mozilla){$(this).find("pre.peek").css("overflow","hidden")}$(this).slideUp("fast");if(h){delete h[$(this).parent().attr("id")]}});$.jStore.store("history_expand_state",h)}).show()};if(a){b()}else{$.jStore.init("galaxy");$.jStore.engineReady(function(){b()})}}function commatize(b){b+="";var a=/(\d+)(\d{3})/;while(a.test(b)){b=b.replace(a,"$1,$2")}return b}function reset_tool_search(a){var c=$("#galaxy_tools").contents();if(c.length==0){c=$(document)}$(this).removeClass("search_active");c.find(".toolTitle").removeClass("search_match");c.find(".toolSectionBody").hide();c.find(".toolTitle").show();c.find(".toolPanelLabel").show();c.find(".toolSectionWrapper").each(function(){if($(this).attr("id")!="recently_used_wrapper"){$(this).show()}else{if($(this).hasClass("user_pref_visible")){$(this).show()}}});c.find("#search-no-results").hide();c.find("#search-spinner").hide();if(a){var b=c.find("#tool-search-query");b.val("search tools");b.css("font-style","i
talic")}}function GalaxyAsync(a){this.url_dict={};this.log_action=(a===undefined?false:a)}GalaxyAsync.prototype.set_func_url=function(a,b){this.url_dict[a]=b};GalaxyAsync.prototype.set_user_pref=function(a,b){var c=this.url_dict[arguments.callee];if(c===undefined){return false}$.ajax({url:c,data:{pref_name:a,pref_value:b},error:function(){return false},success:function(){return true}})};GalaxyAsync.prototype.log_user_action=function(c,b,d){if(!this.log_action){return}var a=this.url_dict[arguments.callee];if(a===undefined){return false}$.ajax({url:a,data:{action:c,context:b,params:d},error:function(){return false},success:function(){return true}})};$(document).ready(function(){$("a[confirm]").click(function(){return confirm($(this).attr("confirm"))});if($.fn.tipsy){$(".tooltip").tipsy({gravity:"s"})}make_popup_menus();replace_big_select_inputs(20,1500)});
1
0

galaxy-dist commit 072d5f7ba872: Remove the rest of the memory_usage debugging module since all of its calls were removed from controller methods.
by commits-noreply@bitbucket.org 29 Jun '10
by commits-noreply@bitbucket.org 29 Jun '10
29 Jun '10
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User Nate Coraor <nate(a)bx.psu.edu>
# Date 1277831187 14400
# Node ID 072d5f7ba872c828fc21f6ddd9e8485deded89d3
# Parent b4237641ca4d28631c9e65c726693057d4b8dab3
Remove the rest of the memory_usage debugging module since all of its calls were removed from controller methods.
--- a/lib/galaxy/util/memory_usage.py
+++ /dev/null
@@ -1,44 +0,0 @@
-import os, platform, logging
-from galaxy.datatypes.data import nice_size
-
-log = logging.getLogger( __name__ )
-
-_proc_status = '/proc/%d/status' % os.getpid()
-
-_scale = { 'kB': 1024.0, 'mB': 1024.0*1024.0, 'KB': 1024.0, 'MB': 1024.0*1024.0 }
-
-def _VmB( VmKey ):
- '''Private.
- '''
- global _proc_status, _scale
- # get pseudo file /proc/<pid>/status
- try:
- t = open( _proc_status )
- v = t.read()
- t.close()
- except:
- log.debug("memory_usage is currently supported only on Linux, your platform is %s %s" % ( platform.system(), platform.release() ) )
- return 0.0 # non-Linux?
- # get VmKey line e.g. 'VmRSS: 9999 kB\n ...'
- i = v.index( VmKey )
- v = v[ i: ].split( None, 3 ) # whitespace
- if len( v ) < 3:
- return 0.0 # invalid format?
- # convert Vm value to bytes
- return float( v[ 1 ] ) * _scale[ v[ 2 ] ]
-def memory( since=0.0, pretty=False ):
- '''Return memory usage in bytes.
- '''
- size = _VmB( 'VmSize:' ) - since
- if pretty:
- return nice_size( size )
- else:
- return size
-def resident( since=0.0 ):
- '''Return resident memory usage in bytes.
- '''
- return _VmB( 'VmRSS:' ) - since
-def stacksize( since=0.0 ):
- '''Return stack size in bytes.
- '''
- return _VmB( 'VmStk:' ) - since
--- a/lib/galaxy/app.py
+++ b/lib/galaxy/app.py
@@ -64,10 +64,6 @@ class UniverseApplication( object ):
from galaxy.util import memdump
if memdump.Memdump:
self.memdump = memdump.Memdump()
- # Enable memory_usage logging if configured
- if self.config.log_memory_usage:
- from galaxy.util import memory_usage
- self.memory_usage = memory_usage
# Start the job queue
self.job_manager = jobs.JobManager( self )
# FIXME: These are exposed directly for backward compatibility
--- a/lib/galaxy/config.py
+++ b/lib/galaxy/config.py
@@ -80,7 +80,6 @@ class Configuration( object ):
self.pbs_stage_path = kwargs.get('pbs_stage_path', "" )
self.use_heartbeat = string_as_bool( kwargs.get( 'use_heartbeat', 'False' ) )
self.use_memdump = string_as_bool( kwargs.get( 'use_memdump', 'False' ) )
- self.log_memory_usage = string_as_bool( kwargs.get( 'log_memory_usage', 'False' ) )
self.log_actions = string_as_bool( kwargs.get( 'log_actions', 'False' ) )
self.log_events = string_as_bool( kwargs.get( 'log_events', 'False' ) )
self.ucsc_display_sites = kwargs.get( 'ucsc_display_sites', "main,test,archaea,ucla" ).lower().split(",")
1
0

galaxy-dist commit 7d3a9212b15e: Enable recently used tools menu to show only tools that are currently in the toolbox.
by commits-noreply@bitbucket.org 29 Jun '10
by commits-noreply@bitbucket.org 29 Jun '10
29 Jun '10
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User jeremy goecks <jeremy.goecks(a)emory.edu>
# Date 1277147965 14400
# Node ID 7d3a9212b15e82327c2af7c3222995f358532d60
# Parent 91d047183110888b3bbcbfc99a0b5f2c38c2d6bf
Enable recently used tools menu to show only tools that are currently in the toolbox.
--- a/lib/galaxy/web/controllers/root.py
+++ b/lib/galaxy/web/controllers/root.py
@@ -6,7 +6,6 @@ from cgi import escape, FieldStorage
from galaxy import util, datatypes, jobs, web, util
from galaxy.web.base.controller import *
from galaxy.util.sanitize_html import sanitize_html
-from galaxy.util.odict import odict
from galaxy.model.orm import *
log = logging.getLogger( __name__ )
@@ -33,20 +32,18 @@ class RootController( BaseController, Us
else:
## Get most recently used tools.
toolbox = self.get_toolbox()
- recent_tool_ids = odict()
+ recent_tools = []
if trans.user:
for row in trans.sa_session.query( self.app.model.Job.tool_id ). \
filter( self.app.model.Job.user==trans.user ). \
order_by( self.app.model.Job.create_time.desc() ):
tool_id = row[0]
- recent_tool_ids[tool_id] = tool_id
- ## TODO: make number of recently used tools a user preference.
- if len ( recent_tool_ids ) == 5:
- break
-
- # Create list of recently used tools.
- recent_tools = [ toolbox.tools_by_id[ tool_id ] for tool_id in recent_tool_ids.keys() ]
-
+ if tool_id in toolbox.tools_by_id:
+ recent_tools.append( toolbox.tools_by_id[tool_id] )
+ ## TODO: make number of recently used tools a user preference.
+ if len ( recent_tools ) == 5:
+ break
+
return trans.fill_template('/root/tool_menu.mako', toolbox=toolbox, recent_tools=recent_tools )
@web.json
1
0

galaxy-dist commit c37eed98f8c9: Update UCSC table browser datasource tools to treat data marked as 'gff' as 'gtf'.
by commits-noreply@bitbucket.org 29 Jun '10
by commits-noreply@bitbucket.org 29 Jun '10
29 Jun '10
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User Dan Blankenberg <dan(a)bx.psu.edu>
# Date 1277740225 14400
# Node ID c37eed98f8c974d7591db0b845a515c731d00787
# Parent 980a38b7f8748e5a852ff06d9cdf59be810f97f7
Update UCSC table browser datasource tools to treat data marked as 'gff' as 'gtf'.
--- a/tools/data_source/ucsc_tablebrowser_archaea.xml
+++ b/tools/data_source/ucsc_tablebrowser_archaea.xml
@@ -30,6 +30,7 @@
<value galaxy_value="interval" remote_value="tab" /><value galaxy_value="html" remote_value="hyperlinks" /><value galaxy_value="fasta" remote_value="sequence" />
+ <value galaxy_value="gtf" remote_value="gff" /></value_translation></request_param></request_param_translation>
--- a/tools/data_source/ucsc_tablebrowser.xml
+++ b/tools/data_source/ucsc_tablebrowser.xml
@@ -30,6 +30,7 @@
<value galaxy_value="interval" remote_value="tab" /><value galaxy_value="html" remote_value="hyperlinks" /><value galaxy_value="fasta" remote_value="sequence" />
+ <value galaxy_value="gtf" remote_value="gff" /></value_translation></request_param></request_param_translation>
--- a/tools/data_source/ucsc_tablebrowser_test.xml
+++ b/tools/data_source/ucsc_tablebrowser_test.xml
@@ -30,6 +30,7 @@
<value galaxy_value="interval" remote_value="tab" /><value galaxy_value="html" remote_value="hyperlinks" /><value galaxy_value="fasta" remote_value="sequence" />
+ <value galaxy_value="gtf" remote_value="gff" /></value_translation></request_param></request_param_translation>
1
0

galaxy-dist commit 89fbba1fc87e: Include annotations and tags when exporting histories to and importing histories from file.
by commits-noreply@bitbucket.org 29 Jun '10
by commits-noreply@bitbucket.org 29 Jun '10
29 Jun '10
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User jeremy goecks <jeremy.goecks(a)emory.edu>
# Date 1277733095 14400
# Node ID 89fbba1fc87e5dc59e449bab7a38addd24493337
# Parent 71b1a5920fc12514a9e151770eaf250d6fc6da46
Include annotations and tags when exporting histories to and importing histories from file.
--- a/lib/galaxy/web/controllers/history.py
+++ b/lib/galaxy/web/controllers/history.py
@@ -476,12 +476,24 @@ class HistoryController( BaseController,
history_attrs = from_json_string( history_attr_str )
# Create history.
- # TODO: set tags, annotations.
- new_history = model.History( name='imported: %s' % history_attrs['name'].encode( 'utf-8' ), user=trans.user )
+ new_history = model.History( name='imported from archive: %s' % history_attrs['name'].encode( 'utf-8' ), user=trans.user )
trans.sa_session.add( new_history )
- trans.sa_session.flush()
- # TODO: Ignore hid_counter for now since it just artificially increases the hid for all the history's HDAs.
- #new_history.hid_counter = history_attrs['hid_counter']
+
+ # Builds a tag string for a tag, value pair.
+ def get_tag_str( tag, value ):
+ if not value:
+ return tag
+ else:
+ return tag + ":" + value
+
+ # Add annotation, tags.
+ if trans.user:
+ self.add_item_annotation( trans, new_history, history_attrs[ 'annotation' ] )
+ for tag, value in history_attrs[ 'tags' ].items():
+ trans.app.tag_handler.apply_item_tags( trans, trans.user, new_history, get_tag_str( tag, value ) )
+
+ # Ignore hid_counter since it artificially increases the hid for all HDAs?
+ # new_history.hid_counter = history_attrs['hid_counter']
new_history.genome_build = history_attrs['genome_build']
trans.sa_session.flush()
@@ -515,7 +527,7 @@ class HistoryController( BaseController,
metadata = metadata,
history = new_history,
create_dataset = True,
- sa_session = trans.sa_session )
+ sa_session = trans.sa_session )
hda.state = hda.states.OK
trans.sa_session.add( hda )
trans.sa_session.flush()
@@ -528,7 +540,12 @@ class HistoryController( BaseController,
temp_dataset_name = '%s/datasets/%s' % ( temp_output_dir, dataset_attrs['file_name'] )
shutil.copyfile( temp_dataset_name, hda.file_name )
- # TODO: set tags, annotations.
+ # Set tags, annotations.
+ if trans.user:
+ self.add_item_annotation( trans, hda, dataset_attrs[ 'annotation' ] )
+ for tag, value in dataset_attrs[ 'tags' ].items():
+ trans.app.tag_handler.apply_item_tags( trans, trans.user, hda, get_tag_str( tag, value ) )
+ trans.sa_session.flush()
# Cleanup.
if os.path.exists( temp_output_dir ):
@@ -537,7 +554,7 @@ class HistoryController( BaseController,
return trans.show_ok_message( message="History '%s' has been imported. " % history_attrs['name'] )
except Exception, e:
return trans.show_error_message( 'Error importing history archive. ' + str( e ) )
-
+
return trans.show_form(
web.FormBuilder( web.url_for(), "Import a History from an Archive", submit_text="Submit" )
@@ -567,7 +584,7 @@ class HistoryController( BaseController,
# Create archive and stream back to client.
- # Simple method to convert strings to unicode in utf-8 format. Method should be used for all user input.
+ # Convert strings to unicode in utf-8 format. Method should be used for all user input.
def unicode_wrangler( a_string ):
a_string_type = type ( a_string )
if a_string_type is str:
@@ -575,18 +592,28 @@ class HistoryController( BaseController,
elif a_string_type is unicode:
return a_string.encode( 'utf-8' )
+ # Create dictionary of an item's tags.
+ def get_item_tag_dict( item ):
+ tags = {}
+ for tag in item.tags:
+ tag_user_tname = unicode_wrangler( tag.user_tname )
+ tag_user_value = unicode_wrangler( tag.user_value )
+ tags[ tag_user_tname ] = tag_user_value
+ return tags
+
try:
# Use temporary directory for temp output files.
temp_output_dir = tempfile.mkdtemp()
# Write history attributes to file.
- # TODO: include tags, annotations.
history_attrs = {
"create_time" : history.create_time.__str__(),
"update_time" : history.update_time.__str__(),
"name" : unicode_wrangler( history.name ),
"hid_counter" : history.hid_counter,
- "genome_build" : history.genome_build
+ "genome_build" : history.genome_build,
+ "annotation" : unicode_wrangler( self.get_item_annotation_str( trans, history.user, history ) ),
+ "tags" : get_item_tag_dict( history )
}
history_attrs_file_name = tempfile.NamedTemporaryFile( dir=temp_output_dir ).name
history_attrs_out = open( history_attrs_file_name, 'w' )
@@ -597,7 +624,6 @@ class HistoryController( BaseController,
history_attrs_file_name = new_name
# Write datasets' attributes to file.
- # TODO: include tags, annotations.
datasets = self.get_history_datasets( trans, history )
datasets_attrs = []
for dataset in datasets:
@@ -615,7 +641,9 @@ class HistoryController( BaseController,
"designation" : dataset.designation,
"deleted" : dataset.deleted,
"visible" : dataset.visible,
- "file_name" : dataset.file_name.split('/')[-1]
+ "file_name" : dataset.file_name.split('/')[-1],
+ "annotation" : unicode_wrangler( self.get_item_annotation_str( trans, history.user, dataset ) ),
+ "tags" : get_item_tag_dict( dataset )
}
datasets_attrs.append( attribute_dict )
datasets_attrs_file_name = tempfile.NamedTemporaryFile( dir=temp_output_dir ).name
1
0

galaxy-dist commit 980a38b7f874: Bugfix: Allow administrators to create users when use_remote_user is enabled.
by commits-noreply@bitbucket.org 29 Jun '10
by commits-noreply@bitbucket.org 29 Jun '10
29 Jun '10
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User Nate Coraor <nate(a)bx.psu.edu>
# Date 1277738970 14400
# Node ID 980a38b7f8748e5a852ff06d9cdf59be810f97f7
# Parent 89fbba1fc87e5dc59e449bab7a38addd24493337
Bugfix: Allow administrators to create users when use_remote_user is enabled.
--- a/lib/galaxy/web/framework/middleware/remoteuser.py
+++ b/lib/galaxy/web/framework/middleware/remoteuser.py
@@ -50,11 +50,12 @@ UCSC_ARCHAEA_SERVERS = (
)
class RemoteUser( object ):
- def __init__( self, app, maildomain=None, ucsc_display_sites=[] ):
+ def __init__( self, app, maildomain=None, ucsc_display_sites=[], admin_users=[] ):
self.app = app
self.maildomain = maildomain
self.allow_ucsc_main = False
self.allow_ucsc_archaea = False
+ self.admin_users = admin_users
if 'main' in ucsc_display_sites or 'test' in ucsc_display_sites:
self.allow_ucsc_main = True
if 'archaea' in ucsc_display_sites:
@@ -76,14 +77,7 @@ class RemoteUser( object ):
# un-authenticated. Any other possible values need to go here as well.
if environ.has_key( 'HTTP_REMOTE_USER' ) and environ[ 'HTTP_REMOTE_USER' ] != '(null)':
path_info = environ.get('PATH_INFO', '')
- if path_info.startswith( '/user' ):
- title = "Access to Galaxy user controls is disabled"
- message = """
- User controls are disabled when Galaxy is configured
- for external authentication.
- """
- return self.error( start_response, title, message )
- elif not environ[ 'HTTP_REMOTE_USER' ].count( '@' ):
+ if not environ[ 'HTTP_REMOTE_USER' ].count( '@' ):
if self.maildomain is not None:
environ[ 'HTTP_REMOTE_USER' ] += '@' + self.maildomain
else:
@@ -99,6 +93,15 @@ class RemoteUser( object ):
before you may access Galaxy.
"""
return self.error( start_response, title, message )
+ if path_info.startswith( '/user/create' ) and environ[ 'HTTP_REMOTE_USER' ] in self.admin_users:
+ pass # admins can create users
+ elif path_info.startswith( '/user' ):
+ title = "Access to Galaxy user controls is disabled"
+ message = """
+ User controls are disabled when Galaxy is configured
+ for external authentication.
+ """
+ return self.error( start_response, title, message )
return self.app( environ, start_response )
else:
title = "Access to Galaxy is denied"
--- a/lib/galaxy/web/buildapp.py
+++ b/lib/galaxy/web/buildapp.py
@@ -139,7 +139,9 @@ def wrap_in_middleware( app, global_conf
# upstream server
if asbool(conf.get( 'use_remote_user', False )):
from galaxy.web.framework.middleware.remoteuser import RemoteUser
- app = RemoteUser( app, maildomain=conf.get( 'remote_user_maildomain', None ), ucsc_display_sites=conf.get( 'ucsc_display_sites', [] ) )
+ app = RemoteUser( app, maildomain=conf.get( 'remote_user_maildomain', None ),
+ ucsc_display_sites=conf.get( 'ucsc_display_sites', [] ),
+ admin_users=conf.get( 'admin_users', '' ).split( ',' ) )
log.debug( "Enabling 'remote user' middleware" )
# The recursive middleware allows for including requests in other
# requests or forwarding of requests, all on the server side.
1
0

galaxy-dist commit eea2c040ccb7: Bugfix: If a LibraryDataset does not have an associated LDDA (this should not be possible but apparently has happened), supress an exception in the library browser that prevents viewing the library at all.
by commits-noreply@bitbucket.org 29 Jun '10
by commits-noreply@bitbucket.org 29 Jun '10
29 Jun '10
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User Nate Coraor <nate(a)bx.psu.edu>
# Date 1277740771 14400
# Node ID eea2c040ccb7bd0d2a7c6e5eab8e65f98a163009
# Parent c37eed98f8c974d7591db0b845a515c731d00787
Bugfix: If a LibraryDataset does not have an associated LDDA (this should not be possible but apparently has happened), supress an exception in the library browser that prevents viewing the library at all.
--- a/lib/galaxy/model/__init__.py
+++ b/lib/galaxy/model/__init__.py
@@ -959,16 +959,16 @@ class LibraryFolder( object ):
intermed.sort()
return map( operator.getitem, intermed, ( -1, ) * len( intermed ) )
# This needs to be a list
- active_library_datasets = [ ld for ld in self.datasets if not ld.library_dataset_dataset_association.deleted ]
+ active_library_datasets = [ ld for ld in self.datasets if ld.library_dataset_dataset_association and not ld.library_dataset_dataset_association.deleted ]
return sort_by_attr( [ ld for ld in active_library_datasets ], 'name' )
@property
def activatable_library_datasets( self ):
# This needs to be a list
- return [ ld for ld in self.datasets if not ld.library_dataset_dataset_association.dataset.deleted ]
+ return [ ld for ld in self.datasets if ld.library_dataset_dataset_association and not ld.library_dataset_dataset_association.dataset.deleted ]
@property
def active_datasets( self ):
# This needs to be a list
- return [ ld.library_dataset_dataset_association.dataset for ld in self.datasets if not ld.library_dataset_dataset_association.deleted ]
+ return [ ld.library_dataset_dataset_association.dataset for ld in self.datasets if ld.library_dataset_dataset_association and not ld.library_dataset_dataset_association.deleted ]
def get_display_name( self ):
# Library folder name can be either a string or a unicode object. If string,
# convert to unicode object assuming 'utf-8' format.
1
0
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User Dannon Baker <dannon.baker(a)emory.edu>
# Date 1277490919 14400
# Node ID 71b1a5920fc12514a9e151770eaf250d6fc6da46
# Parent c02ecbcc8dab54e7007b35db5a05e31211d77b01
# Parent d666e89f178eddb4175c388e81d8758096de72df
Merge.
1
0

galaxy-dist commit 4dd860651b7e: GTF enhancements: add GTF as a default datatype for Galaxy, set column metadata, and add GTF sniffer.
by commits-noreply@bitbucket.org 29 Jun '10
by commits-noreply@bitbucket.org 29 Jun '10
29 Jun '10
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User jeremy goecks <jeremy.goecks(a)emory.edu>
# Date 1277480436 14400
# Node ID 4dd860651b7e46b24f9942e06bfacdbf6ab3b28e
# Parent df5010a5df581674896beec9b35ca50bf477f380
GTF enhancements: add GTF as a default datatype for Galaxy, set column metadata, and add GTF sniffer.
--- a/lib/galaxy/datatypes/interval.py
+++ b/lib/galaxy/datatypes/interval.py
@@ -854,9 +854,83 @@ class Gff3( Gff ):
class Gtf( Gff ):
"""Tab delimited data in Gtf format"""
file_ext = "gtf"
+ column_names = [ 'Seqname', 'Source', 'Feature', 'Start', 'End', 'Score', 'Strand', 'Frame', 'Attributes' ]
+
+ """Add metadata elements"""
+ MetadataElement( name="columns", default=9, desc="Number of columns", readonly=True, visible=False )
+ MetadataElement( name="column_types", default=['str','str','str','int','int','float','str','int','list'], param=metadata.ColumnTypesParameter, desc="Column types", readonly=True, visible=False )
+
def sniff( self, filename ):
- return False
+ """
+ Determines whether the file is in gtf format
+
+ GTF lines have nine required fields that must be tab-separated. The first eight GTF fields are the same as GFF.
+ The group field has been expanded into a list of attributes. Each attribute consists of a type/value pair.
+ Attributes must end in a semi-colon, and be separated from any following attribute by exactly one space.
+ The attribute list must begin with the two mandatory attributes:
+
+ gene_id value - A globally unique identifier for the genomic source of the sequence.
+ transcript_id value - A globally unique identifier for the predicted transcript.
+
+ For complete details see http://genome.ucsc.edu/FAQ/FAQformat#format4
+
+ >>> fname = get_test_fname( '1.bed' )
+ >>> Gtf().sniff( fname )
+ False
+ >>> fname = get_test_fname( 'test.gff' )
+ >>> Gtf().sniff( fname )
+ False
+ >>> fname = get_test_fname( 'test.gtf' )
+ >>> Gtf().sniff( fname )
+ True
+ """
+ headers = get_headers( filename, '\t' )
+ try:
+ if len(headers) < 2:
+ return False
+ for hdr in headers:
+ if hdr and hdr[0].startswith( '##gff-version' ) and hdr[0].find( '2' ) < 0:
+ return False
+ if hdr and hdr[0] and not hdr[0].startswith( '#' ):
+ if len(hdr) != 9:
+ return False
+ try:
+ int( hdr[3] )
+ int( hdr[4] )
+ except:
+ return False
+ if hdr[5] != '.':
+ try:
+ score = float( hdr[5] )
+ except:
+ return False
+ if hdr[6] not in data.valid_strand:
+ return False
+
+ # Check attributes for gene_id, transcript_id
+ attributes = hdr[8].split(";")
+ if len( attributes ) >= 2:
+ try:
+ # Imprecise: should check for a single space per the spec.
+ attr_name, attr_value = attributes[0].split(" ")
+ if attr_name != 'gene_id':
+ return False
+ except:
+ return False
+ try:
+ # Imprecise: should check for a single space per the spec.
+ attr_name, attr_value = attributes[1][1:].split(" ")
+ if attr_name != 'transcript_id':
+ return False
+ except:
+ return False
+ else:
+ return False
+ return True
+ except:
+ return False
+
class Wiggle( Tabular, _RemoteCallMixin ):
"""Tab delimited data in wiggle format"""
--- a/lib/galaxy/datatypes/sniff.py
+++ b/lib/galaxy/datatypes/sniff.py
@@ -238,6 +238,9 @@ def guess_ext( fname, sniff_order=None,
>>> fname = get_test_fname('file.html')
>>> guess_ext(fname)
'html'
+ >>> fname = get_test_fname('test.gtf')
+ >>> guess_ext(fname)
+ 'gtf'
>>> fname = get_test_fname('test.gff')
>>> guess_ext(fname)
'gff'
--- /dev/null
+++ b/lib/galaxy/datatypes/test/test.gtf
@@ -0,0 +1,500 @@
+chr13 Cufflinks transcript 3405463 3405542 1000 . . gene_id "CUFF.50189"; transcript_id "CUFF.50189.1"; FPKM "6.3668918357"; frac "1.000000"; conf_lo "0.000000"; conf_hi "17.963819"; cov "0.406914";
+chr13 Cufflinks exon 3405463 3405542 1000 . . gene_id "CUFF.50189"; transcript_id "CUFF.50189.1"; exon_number "1"; FPKM "6.3668918357"; frac "1.000000"; conf_lo "0.000000"; conf_hi "17.963819"; cov "0.406914";
+chr13 Cufflinks transcript 3473337 3473372 1000 . . gene_id "CUFF.50191"; transcript_id "CUFF.50191.1"; FPKM "11.7350749444"; frac "1.000000"; conf_lo "0.000000"; conf_hi "35.205225"; cov "0.750000";
+chr13 Cufflinks exon 3473337 3473372 1000 . . gene_id "CUFF.50191"; transcript_id "CUFF.50191.1"; exon_number "1"; FPKM "11.7350749444"; frac "1.000000"; conf_lo "0.000000"; conf_hi "35.205225"; cov "0.750000";
+chr13 Cufflinks transcript 3490319 3490350 1000 . . gene_id "CUFF.50193"; transcript_id "CUFF.50193.1"; FPKM "39.6058779373"; frac "1.000000"; conf_lo "0.000000"; conf_hi "85.338807"; cov "2.531250";
+chr13 Cufflinks exon 3490319 3490350 1000 . . gene_id "CUFF.50193"; transcript_id "CUFF.50193.1"; exon_number "1"; FPKM "39.6058779373"; frac "1.000000"; conf_lo "0.000000"; conf_hi "85.338807"; cov "2.531250";
+chr13 Cufflinks transcript 3565855 3566203 1000 - . gene_id "CUFF.50195"; transcript_id "CUFF.50195.1"; FPKM "29.8710998584"; frac "1.000000"; conf_lo "7.290671"; conf_hi "52.451529"; cov "1.909091";
+chr13 Cufflinks exon 3565855 3565913 1000 - . gene_id "CUFF.50195"; transcript_id "CUFF.50195.1"; exon_number "1"; FPKM "29.8710998584"; frac "1.000000"; conf_lo "7.290671"; conf_hi "52.451529"; cov "1.909091";
+chr13 Cufflinks exon 3566164 3566203 1000 - . gene_id "CUFF.50195"; transcript_id "CUFF.50195.1"; exon_number "2"; FPKM "29.8710998584"; frac "1.000000"; conf_lo "7.290671"; conf_hi "52.451529"; cov "1.909091";
+chr13 Cufflinks transcript 3566475 3566560 1000 . . gene_id "CUFF.50197"; transcript_id "CUFF.50197.1"; FPKM "14.7370708604"; frac "1.000000"; conf_lo "0.000000"; conf_hi "31.753975"; cov "0.941860";
+chr13 Cufflinks exon 3566475 3566560 1000 . . gene_id "CUFF.50197"; transcript_id "CUFF.50197.1"; exon_number "1"; FPKM "14.7370708604"; frac "1.000000"; conf_lo "0.000000"; conf_hi "31.753975"; cov "0.941860";
+chr13 Cufflinks transcript 3566664 3566942 1000 . . gene_id "CUFF.50199"; transcript_id "CUFF.50199.1"; FPKM "31.7874813134"; frac "1.000000"; conf_lo "17.911934"; conf_hi "45.663029"; cov "2.031569";
+chr13 Cufflinks exon 3566664 3566942 1000 . . gene_id "CUFF.50199"; transcript_id "CUFF.50199.1"; exon_number "1"; FPKM "31.7874813134"; frac "1.000000"; conf_lo "17.911934"; conf_hi "45.663029"; cov "2.031569";
+chr13 Cufflinks transcript 3568042 3568068 1000 . . gene_id "CUFF.50201"; transcript_id "CUFF.50201.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 3568042 3568068 1000 . . gene_id "CUFF.50201"; transcript_id "CUFF.50201.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 3569564 3569626 1000 . . gene_id "CUFF.50203"; transcript_id "CUFF.50203.1"; FPKM "13.4115142222"; frac "1.000000"; conf_lo "0.000000"; conf_hi "32.378260"; cov "0.857143";
+chr13 Cufflinks exon 3569564 3569626 1000 . . gene_id "CUFF.50203"; transcript_id "CUFF.50203.1"; exon_number "1"; FPKM "13.4115142222"; frac "1.000000"; conf_lo "0.000000"; conf_hi "32.378260"; cov "0.857143";
+chr13 Cufflinks transcript 3594171 3594199 1000 . . gene_id "CUFF.50205"; transcript_id "CUFF.50205.1"; FPKM "29.1353584826"; frac "1.000000"; conf_lo "0.000000"; conf_hi "70.338978"; cov "1.862069";
+chr13 Cufflinks exon 3594171 3594199 1000 . . gene_id "CUFF.50205"; transcript_id "CUFF.50205.1"; exon_number "1"; FPKM "29.1353584826"; frac "1.000000"; conf_lo "0.000000"; conf_hi "70.338978"; cov "1.862069";
+chr13 Cufflinks transcript 3606116 3613028 1000 - . gene_id "CUFF.50207"; transcript_id "CUFF.50207.1"; FPKM "19.6171377865"; frac "1.000000"; conf_lo "0.936995"; conf_hi "38.297281"; cov "1.253750";
+chr13 Cufflinks exon 3606116 3606146 1000 - . gene_id "CUFF.50207"; transcript_id "CUFF.50207.1"; exon_number "1"; FPKM "19.6171377865"; frac "1.000000"; conf_lo "0.936995"; conf_hi "38.297281"; cov "1.253750";
+chr13 Cufflinks exon 3612965 3613028 1000 - . gene_id "CUFF.50207"; transcript_id "CUFF.50207.1"; exon_number "2"; FPKM "19.6171377865"; frac "1.000000"; conf_lo "0.936995"; conf_hi "38.297281"; cov "1.253750";
+chr13 Cufflinks transcript 3603507 3603533 1000 . . gene_id "CUFF.50209"; transcript_id "CUFF.50209.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 3603507 3603533 1000 . . gene_id "CUFF.50209"; transcript_id "CUFF.50209.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 3604709 3604735 1000 . . gene_id "CUFF.50211"; transcript_id "CUFF.50211.1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks exon 3604709 3604735 1000 . . gene_id "CUFF.50211"; transcript_id "CUFF.50211.1"; exon_number "1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks transcript 3612524 3612550 1000 . . gene_id "CUFF.50213"; transcript_id "CUFF.50213.1"; FPKM "117.3321730764"; frac "1.000000"; conf_lo "31.638086"; conf_hi "203.026260"; cov "7.498813";
+chr13 Cufflinks exon 3612524 3612550 1000 . . gene_id "CUFF.50213"; transcript_id "CUFF.50213.1"; exon_number "1"; FPKM "117.3321730764"; frac "1.000000"; conf_lo "31.638086"; conf_hi "203.026260"; cov "7.498813";
+chr13 Cufflinks transcript 3639250 3639290 1000 . . gene_id "CUFF.50215"; transcript_id "CUFF.50215.1"; FPKM "30.9119047316"; frac "1.000000"; conf_lo "0.000000"; conf_hi "66.605898"; cov "1.975610";
+chr13 Cufflinks exon 3639250 3639290 1000 . . gene_id "CUFF.50215"; transcript_id "CUFF.50215.1"; exon_number "1"; FPKM "30.9119047316"; frac "1.000000"; conf_lo "0.000000"; conf_hi "66.605898"; cov "1.975610";
+chr13 Cufflinks transcript 3649635 3649777 1000 . . gene_id "CUFF.50217"; transcript_id "CUFF.50217.1"; FPKM "14.7714230069"; frac "1.000000"; conf_lo "1.559461"; conf_hi "27.983385"; cov "0.944056";
+chr13 Cufflinks exon 3649635 3649777 1000 . . gene_id "CUFF.50217"; transcript_id "CUFF.50217.1"; exon_number "1"; FPKM "14.7714230069"; frac "1.000000"; conf_lo "1.559461"; conf_hi "27.983385"; cov "0.944056";
+chr13 Cufflinks transcript 3649976 3650072 1000 . . gene_id "CUFF.50219"; transcript_id "CUFF.50219.1"; FPKM "26.1317132782"; frac "1.000000"; conf_lo "4.795259"; conf_hi "47.468168"; cov "1.670103";
+chr13 Cufflinks exon 3649976 3650072 1000 . . gene_id "CUFF.50219"; transcript_id "CUFF.50219.1"; exon_number "1"; FPKM "26.1317132782"; frac "1.000000"; conf_lo "4.795259"; conf_hi "47.468168"; cov "1.670103";
+chr13 Cufflinks transcript 3650165 3650345 1000 . . gene_id "CUFF.50221"; transcript_id "CUFF.50221.1"; FPKM "16.3383363867"; frac "1.000000"; conf_lo "3.987715"; conf_hi "28.688958"; cov "1.044199";
+chr13 Cufflinks exon 3650165 3650345 1000 . . gene_id "CUFF.50221"; transcript_id "CUFF.50221.1"; exon_number "1"; FPKM "16.3383363867"; frac "1.000000"; conf_lo "3.987715"; conf_hi "28.688958"; cov "1.044199";
+chr13 Cufflinks transcript 3650498 3651017 1000 . . gene_id "CUFF.50223"; transcript_id "CUFF.50223.1"; FPKM "38.9965567383"; frac "1.000000"; conf_lo "27.739220"; conf_hi "50.253893"; cov "2.492308";
+chr13 Cufflinks exon 3650498 3651017 1000 . . gene_id "CUFF.50223"; transcript_id "CUFF.50223.1"; exon_number "1"; FPKM "38.9965567383"; frac "1.000000"; conf_lo "27.739220"; conf_hi "50.253893"; cov "2.492308";
+chr13 Cufflinks transcript 3652248 3652287 1000 . . gene_id "CUFF.50225"; transcript_id "CUFF.50225.1"; FPKM "21.1231348999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "50.995759"; cov "1.350000";
+chr13 Cufflinks exon 3652248 3652287 1000 . . gene_id "CUFF.50225"; transcript_id "CUFF.50225.1"; exon_number "1"; FPKM "21.1231348999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "50.995759"; cov "1.350000";
+chr13 Cufflinks transcript 3652708 3652757 1000 . . gene_id "CUFF.50227"; transcript_id "CUFF.50227.1"; FPKM "16.8985079199"; frac "1.000000"; conf_lo "0.000000"; conf_hi "40.796607"; cov "1.080000";
+chr13 Cufflinks exon 3652708 3652757 1000 . . gene_id "CUFF.50227"; transcript_id "CUFF.50227.1"; exon_number "1"; FPKM "16.8985079199"; frac "1.000000"; conf_lo "0.000000"; conf_hi "40.796607"; cov "1.080000";
+chr13 Cufflinks transcript 3652858 3652892 1000 . . gene_id "CUFF.50229"; transcript_id "CUFF.50229.1"; FPKM "24.1407255999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "58.280867"; cov "1.542857";
+chr13 Cufflinks exon 3652858 3652892 1000 . . gene_id "CUFF.50229"; transcript_id "CUFF.50229.1"; exon_number "1"; FPKM "24.1407255999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "58.280867"; cov "1.542857";
+chr13 Cufflinks transcript 3803155 3803189 1000 . . gene_id "CUFF.50231"; transcript_id "CUFF.50231.1"; FPKM "193.0684834367"; frac "1.000000"; conf_lo "96.519912"; conf_hi "289.617054"; cov "12.339194";
+chr13 Cufflinks exon 3803155 3803189 1000 . . gene_id "CUFF.50231"; transcript_id "CUFF.50231.1"; exon_number "1"; FPKM "193.0684834367"; frac "1.000000"; conf_lo "96.519912"; conf_hi "289.617054"; cov "12.339194";
+chr13 Cufflinks transcript 3881504 3881530 1000 . . gene_id "CUFF.50233"; transcript_id "CUFF.50233.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 3881504 3881530 1000 . . gene_id "CUFF.50233"; transcript_id "CUFF.50233.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 3881847 3881940 1000 . . gene_id "CUFF.50235"; transcript_id "CUFF.50235.1"; FPKM "11.2303742880"; frac "1.000000"; conf_lo "0.000000"; conf_hi "25.439173"; cov "0.717744";
+chr13 Cufflinks exon 3881847 3881940 1000 . . gene_id "CUFF.50235"; transcript_id "CUFF.50235.1"; exon_number "1"; FPKM "11.2303742880"; frac "1.000000"; conf_lo "0.000000"; conf_hi "25.439173"; cov "0.717744";
+chr13 Cufflinks transcript 3882719 3882811 1000 . . gene_id "CUFF.50237"; transcript_id "CUFF.50237.1"; FPKM "9.0852193118"; frac "1.000000"; conf_lo "0.000000"; conf_hi "21.933660"; cov "0.580645";
+chr13 Cufflinks exon 3882719 3882811 1000 . . gene_id "CUFF.50237"; transcript_id "CUFF.50237.1"; exon_number "1"; FPKM "9.0852193118"; frac "1.000000"; conf_lo "0.000000"; conf_hi "21.933660"; cov "0.580645";
+chr13 Cufflinks transcript 3940646 3940672 1000 . . gene_id "CUFF.50239"; transcript_id "CUFF.50239.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 3940646 3940672 1000 . . gene_id "CUFF.50239"; transcript_id "CUFF.50239.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 4135893 4135996 1000 . . gene_id "CUFF.50241"; transcript_id "CUFF.50241.1"; FPKM "8.1242826538"; frac "1.000000"; conf_lo "0.000000"; conf_hi "19.613753"; cov "0.519231";
+chr13 Cufflinks exon 4135893 4135996 1000 . . gene_id "CUFF.50241"; transcript_id "CUFF.50241.1"; exon_number "1"; FPKM "8.1242826538"; frac "1.000000"; conf_lo "0.000000"; conf_hi "19.613753"; cov "0.519231";
+chr13 Cufflinks transcript 4246054 4246080 1000 . . gene_id "CUFF.50243"; transcript_id "CUFF.50243.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 4246054 4246080 1000 . . gene_id "CUFF.50243"; transcript_id "CUFF.50243.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 4246081 4246107 1000 . . gene_id "CUFF.50245"; transcript_id "CUFF.50245.1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks exon 4246081 4246107 1000 . . gene_id "CUFF.50245"; transcript_id "CUFF.50245.1"; exon_number "1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks transcript 4247347 4247373 1000 . . gene_id "CUFF.50247"; transcript_id "CUFF.50247.1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks exon 4247347 4247373 1000 . . gene_id "CUFF.50247"; transcript_id "CUFF.50247.1"; exon_number "1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks transcript 4247393 4247419 1000 . . gene_id "CUFF.50249"; transcript_id "CUFF.50249.1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks exon 4247393 4247419 1000 . . gene_id "CUFF.50249"; transcript_id "CUFF.50249.1"; exon_number "1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks transcript 4253585 4253611 1000 . . gene_id "CUFF.50251"; transcript_id "CUFF.50251.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 4253585 4253611 1000 . . gene_id "CUFF.50251"; transcript_id "CUFF.50251.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 4356816 4356842 1000 . . gene_id "CUFF.50253"; transcript_id "CUFF.50253.1"; FPKM "31.2563804501"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.485841"; cov "1.997626";
+chr13 Cufflinks exon 4356816 4356842 1000 . . gene_id "CUFF.50253"; transcript_id "CUFF.50253.1"; exon_number "1"; FPKM "31.2563804501"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.485841"; cov "1.997626";
+chr13 Cufflinks transcript 4591975 4592074 1000 . . gene_id "CUFF.50255"; transcript_id "CUFF.50255.1"; FPKM "16.8985079199"; frac "1.000000"; conf_lo "0.000000"; conf_hi "33.797016"; cov "1.080000";
+chr13 Cufflinks exon 4591975 4592074 1000 . . gene_id "CUFF.50255"; transcript_id "CUFF.50255.1"; exon_number "1"; FPKM "16.8985079199"; frac "1.000000"; conf_lo "0.000000"; conf_hi "33.797016"; cov "1.080000";
+chr13 Cufflinks transcript 4592148 4592531 1000 . . gene_id "CUFF.50257"; transcript_id "CUFF.50257.1"; FPKM "22.0032655207"; frac "1.000000"; conf_lo "12.163106"; conf_hi "31.843425"; cov "1.406250";
+chr13 Cufflinks exon 4592148 4592531 1000 . . gene_id "CUFF.50257"; transcript_id "CUFF.50257.1"; exon_number "1"; FPKM "22.0032655207"; frac "1.000000"; conf_lo "12.163106"; conf_hi "31.843425"; cov "1.406250";
+chr13 Cufflinks transcript 4592862 4592890 1000 . . gene_id "CUFF.50259"; transcript_id "CUFF.50259.1"; FPKM "58.2707169652"; frac "1.000000"; conf_lo "0.000000"; conf_hi "116.541434"; cov "3.724138";
+chr13 Cufflinks exon 4592862 4592890 1000 . . gene_id "CUFF.50259"; transcript_id "CUFF.50259.1"; exon_number "1"; FPKM "58.2707169652"; frac "1.000000"; conf_lo "0.000000"; conf_hi "116.541434"; cov "3.724138";
+chr13 Cufflinks transcript 4594319 4594938 1000 - . gene_id "CUFF.50261"; transcript_id "CUFF.50261.1"; FPKM "29.3887094260"; frac "1.000000"; conf_lo "8.607754"; conf_hi "50.169665"; cov "1.878261";
+chr13 Cufflinks exon 4594319 4594400 1000 - . gene_id "CUFF.50261"; transcript_id "CUFF.50261.1"; exon_number "1"; FPKM "29.3887094260"; frac "1.000000"; conf_lo "8.607754"; conf_hi "50.169665"; cov "1.878261";
+chr13 Cufflinks exon 4594906 4594938 1000 - . gene_id "CUFF.50261"; transcript_id "CUFF.50261.1"; exon_number "2"; FPKM "29.3887094260"; frac "1.000000"; conf_lo "8.607754"; conf_hi "50.169665"; cov "1.878261";
+chr13 Cufflinks transcript 4596799 4598059 1000 - . gene_id "CUFF.50263"; transcript_id "CUFF.50263.1"; FPKM "22.8358215134"; frac "1.000000"; conf_lo "0.000000"; conf_hi "45.671643"; cov "1.459459";
+chr13 Cufflinks exon 4596799 4596828 1000 - . gene_id "CUFF.50263"; transcript_id "CUFF.50263.1"; exon_number "1"; FPKM "22.8358215134"; frac "1.000000"; conf_lo "0.000000"; conf_hi "45.671643"; cov "1.459459";
+chr13 Cufflinks exon 4598016 4598059 1000 - . gene_id "CUFF.50263"; transcript_id "CUFF.50263.1"; exon_number "2"; FPKM "22.8358215134"; frac "1.000000"; conf_lo "0.000000"; conf_hi "45.671643"; cov "1.459459";
+chr13 Cufflinks transcript 4601790 4601816 1000 . . gene_id "CUFF.50265"; transcript_id "CUFF.50265.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 4601790 4601816 1000 . . gene_id "CUFF.50265"; transcript_id "CUFF.50265.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 4601884 4601952 1000 . . gene_id "CUFF.50267"; transcript_id "CUFF.50267.1"; FPKM "12.2452955941"; frac "1.000000"; conf_lo "0.000000"; conf_hi "29.562759"; cov "0.782609";
+chr13 Cufflinks exon 4601884 4601952 1000 . . gene_id "CUFF.50267"; transcript_id "CUFF.50267.1"; exon_number "1"; FPKM "12.2452955941"; frac "1.000000"; conf_lo "0.000000"; conf_hi "29.562759"; cov "0.782609";
+chr13 Cufflinks transcript 3541632 3541797 1000 . . gene_id "CUFF.50269"; transcript_id "CUFF.50269.1"; FPKM "10.1798240481"; frac "1.000000"; conf_lo "0.000000"; conf_hi "20.359648"; cov "0.650602";
+chr13 Cufflinks exon 3541632 3541797 1000 . . gene_id "CUFF.50269"; transcript_id "CUFF.50269.1"; exon_number "1"; FPKM "10.1798240481"; frac "1.000000"; conf_lo "0.000000"; conf_hi "20.359648"; cov "0.650602";
+chr13 Cufflinks transcript 3541917 3542016 1000 . . gene_id "CUFF.50271"; transcript_id "CUFF.50271.1"; FPKM "12.6738809399"; frac "1.000000"; conf_lo "0.000000"; conf_hi "27.308418"; cov "0.810000";
+chr13 Cufflinks exon 3541917 3542016 1000 . . gene_id "CUFF.50271"; transcript_id "CUFF.50271.1"; exon_number "1"; FPKM "12.6738809399"; frac "1.000000"; conf_lo "0.000000"; conf_hi "27.308418"; cov "0.810000";
+chr13 Cufflinks transcript 3542096 3542122 1000 . . gene_id "CUFF.50273"; transcript_id "CUFF.50273.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 3542096 3542122 1000 . . gene_id "CUFF.50273"; transcript_id "CUFF.50273.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 3548183 3548209 1000 . . gene_id "CUFF.50275"; transcript_id "CUFF.50275.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 3548183 3548209 1000 . . gene_id "CUFF.50275"; transcript_id "CUFF.50275.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 3559238 3559264 1000 . . gene_id "CUFF.50277"; transcript_id "CUFF.50277.1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks exon 3559238 3559264 1000 . . gene_id "CUFF.50277"; transcript_id "CUFF.50277.1"; exon_number "1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks transcript 3559265 3559291 1000 . . gene_id "CUFF.50279"; transcript_id "CUFF.50279.1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks exon 3559265 3559291 1000 . . gene_id "CUFF.50279"; transcript_id "CUFF.50279.1"; exon_number "1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks transcript 3561489 3561515 1000 . . gene_id "CUFF.50281"; transcript_id "CUFF.50281.1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks exon 3561489 3561515 1000 . . gene_id "CUFF.50281"; transcript_id "CUFF.50281.1"; exon_number "1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks transcript 3561516 3561616 1000 . . gene_id "CUFF.50283"; transcript_id "CUFF.50283.1"; FPKM "12.5483969702"; frac "1.000000"; conf_lo "0.000000"; conf_hi "27.038038"; cov "0.801980";
+chr13 Cufflinks exon 3561516 3561616 1000 . . gene_id "CUFF.50283"; transcript_id "CUFF.50283.1"; exon_number "1"; FPKM "12.5483969702"; frac "1.000000"; conf_lo "0.000000"; conf_hi "27.038038"; cov "0.801980";
+chr13 Cufflinks transcript 3563788 3563913 1000 . . gene_id "CUFF.50285"; transcript_id "CUFF.50285.1"; FPKM "16.7564314774"; frac "1.000000"; conf_lo "1.765464"; conf_hi "31.747399"; cov "1.070920";
+chr13 Cufflinks exon 3563788 3563913 1000 . . gene_id "CUFF.50285"; transcript_id "CUFF.50285.1"; exon_number "1"; FPKM "16.7564314774"; frac "1.000000"; conf_lo "1.765464"; conf_hi "31.747399"; cov "1.070920";
+chr13 Cufflinks transcript 3564114 3564162 1000 . . gene_id "CUFF.50287"; transcript_id "CUFF.50287.1"; FPKM "68.9735017140"; frac "1.000000"; conf_lo "20.201871"; conf_hi "117.745132"; cov "4.408163";
+chr13 Cufflinks exon 3564114 3564162 1000 . . gene_id "CUFF.50287"; transcript_id "CUFF.50287.1"; exon_number "1"; FPKM "68.9735017140"; frac "1.000000"; conf_lo "20.201871"; conf_hi "117.745132"; cov "4.408163";
+chr13 Cufflinks transcript 5861035 5872268 1000 - . gene_id "CUFF.50289"; transcript_id "CUFF.50289.1"; FPKM "7.5439767500"; frac "1.000000"; conf_lo "0.000000"; conf_hi "18.212771"; cov "0.482143";
+chr13 Cufflinks exon 5861035 5861117 1000 - . gene_id "CUFF.50289"; transcript_id "CUFF.50289.1"; exon_number "1"; FPKM "7.5439767500"; frac "1.000000"; conf_lo "0.000000"; conf_hi "18.212771"; cov "0.482143";
+chr13 Cufflinks exon 5872240 5872268 1000 - . gene_id "CUFF.50289"; transcript_id "CUFF.50289.1"; exon_number "2"; FPKM "7.5439767500"; frac "1.000000"; conf_lo "0.000000"; conf_hi "18.212771"; cov "0.482143";
+chr13 Cufflinks transcript 5864061 5864135 1000 . . gene_id "CUFF.50291"; transcript_id "CUFF.50291.1"; FPKM "16.8985079199"; frac "1.000000"; conf_lo "0.000000"; conf_hi "36.411224"; cov "1.080000";
+chr13 Cufflinks exon 5864061 5864135 1000 . . gene_id "CUFF.50291"; transcript_id "CUFF.50291.1"; exon_number "1"; FPKM "16.8985079199"; frac "1.000000"; conf_lo "0.000000"; conf_hi "36.411224"; cov "1.080000";
+chr13 Cufflinks transcript 5864192 5864585 1000 . . gene_id "CUFF.50293"; transcript_id "CUFF.50293.1"; FPKM "18.2280859542"; frac "1.000000"; conf_lo "9.386166"; conf_hi "27.070006"; cov "1.164975";
+chr13 Cufflinks exon 5864192 5864585 1000 . . gene_id "CUFF.50293"; transcript_id "CUFF.50293.1"; exon_number "1"; FPKM "18.2280859542"; frac "1.000000"; conf_lo "9.386166"; conf_hi "27.070006"; cov "1.164975";
+chr13 Cufflinks transcript 5865070 5865096 1000 . . gene_id "CUFF.50295"; transcript_id "CUFF.50295.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 5865070 5865096 1000 . . gene_id "CUFF.50295"; transcript_id "CUFF.50295.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 5865442 5866941 1000 + . gene_id "CUFF.50297"; transcript_id "CUFF.50297.1"; FPKM "13.2019593124"; frac "1.000000"; conf_lo "0.000000"; conf_hi "28.446269"; cov "0.843750";
+chr13 Cufflinks exon 5865442 5865510 1000 + . gene_id "CUFF.50297"; transcript_id "CUFF.50297.1"; exon_number "1"; FPKM "13.2019593124"; frac "1.000000"; conf_lo "0.000000"; conf_hi "28.446269"; cov "0.843750";
+chr13 Cufflinks exon 5866915 5866941 1000 + . gene_id "CUFF.50297"; transcript_id "CUFF.50297.1"; exon_number "2"; FPKM "13.2019593124"; frac "1.000000"; conf_lo "0.000000"; conf_hi "28.446269"; cov "0.843750";
+chr13 Cufflinks transcript 5866598 5866661 1000 . . gene_id "CUFF.50299"; transcript_id "CUFF.50299.1"; FPKM "92.4137151871"; frac "1.000000"; conf_lo "43.016507"; conf_hi "141.810924"; cov "5.906250";
+chr13 Cufflinks exon 5866598 5866661 1000 . . gene_id "CUFF.50299"; transcript_id "CUFF.50299.1"; exon_number "1"; FPKM "92.4137151871"; frac "1.000000"; conf_lo "43.016507"; conf_hi "141.810924"; cov "5.906250";
+chr13 Cufflinks transcript 5866756 5866871 1000 . . gene_id "CUFF.50301"; transcript_id "CUFF.50301.1"; FPKM "83.7641556375"; frac "1.000000"; conf_lo "48.832088"; conf_hi "118.696223"; cov "5.353448";
+chr13 Cufflinks exon 5866756 5866871 1000 . . gene_id "CUFF.50301"; transcript_id "CUFF.50301.1"; exon_number "1"; FPKM "83.7641556375"; frac "1.000000"; conf_lo "48.832088"; conf_hi "118.696223"; cov "5.353448";
+chr13 Cufflinks transcript 5866964 5867014 1000 . . gene_id "CUFF.50303"; transcript_id "CUFF.50303.1"; FPKM "124.2537347053"; frac "1.000000"; conf_lo "60.089382"; conf_hi "188.418087"; cov "7.941176";
+chr13 Cufflinks exon 5866964 5867014 1000 . . gene_id "CUFF.50303"; transcript_id "CUFF.50303.1"; exon_number "1"; FPKM "124.2537347053"; frac "1.000000"; conf_lo "60.089382"; conf_hi "188.418087"; cov "7.941176";
+chr13 Cufflinks transcript 5867386 5867412 1000 . . gene_id "CUFF.50305"; transcript_id "CUFF.50305.1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks exon 5867386 5867412 1000 . . gene_id "CUFF.50305"; transcript_id "CUFF.50305.1"; exon_number "1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks transcript 5867480 5867506 1000 . . gene_id "CUFF.50307"; transcript_id "CUFF.50307.1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks exon 5867480 5867506 1000 . . gene_id "CUFF.50307"; transcript_id "CUFF.50307.1"; exon_number "1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks transcript 5867688 5867737 1000 . . gene_id "CUFF.50309"; transcript_id "CUFF.50309.1"; FPKM "25.3477618799"; frac "1.000000"; conf_lo "0.000000"; conf_hi "54.616836"; cov "1.620000";
+chr13 Cufflinks exon 5867688 5867737 1000 . . gene_id "CUFF.50309"; transcript_id "CUFF.50309.1"; exon_number "1"; FPKM "25.3477618799"; frac "1.000000"; conf_lo "0.000000"; conf_hi "54.616836"; cov "1.620000";
+chr13 Cufflinks transcript 5867820 5868008 1000 . . gene_id "CUFF.50311"; transcript_id "CUFF.50311.1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "3.818923"; conf_hi "27.474610"; cov "1.000000";
+chr13 Cufflinks exon 5867820 5868008 1000 . . gene_id "CUFF.50311"; transcript_id "CUFF.50311.1"; exon_number "1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "3.818923"; conf_hi "27.474610"; cov "1.000000";
+chr13 Cufflinks transcript 5868254 5868314 1000 . . gene_id "CUFF.50313"; transcript_id "CUFF.50313.1"; FPKM "13.8512359999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "33.439842"; cov "0.885246";
+chr13 Cufflinks exon 5868254 5868314 1000 . . gene_id "CUFF.50313"; transcript_id "CUFF.50313.1"; exon_number "1"; FPKM "13.8512359999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "33.439842"; cov "0.885246";
+chr13 Cufflinks transcript 5869125 5869300 1000 . . gene_id "CUFF.50315"; transcript_id "CUFF.50315.1"; FPKM "88.8131808291"; frac "1.000000"; conf_lo "59.611587"; conf_hi "118.014775"; cov "5.676136";
+chr13 Cufflinks exon 5869125 5869300 1000 . . gene_id "CUFF.50315"; transcript_id "CUFF.50315.1"; exon_number "1"; FPKM "88.8131808291"; frac "1.000000"; conf_lo "59.611587"; conf_hi "118.014775"; cov "5.676136";
+chr13 Cufflinks transcript 5869455 5869484 1000 . . gene_id "CUFF.50317"; transcript_id "CUFF.50317.1"; FPKM "133.7631356353"; frac "1.000000"; conf_lo "46.960728"; conf_hi "220.565544"; cov "8.548931";
+chr13 Cufflinks exon 5869455 5869484 1000 . . gene_id "CUFF.50317"; transcript_id "CUFF.50317.1"; exon_number "1"; FPKM "133.7631356353"; frac "1.000000"; conf_lo "46.960728"; conf_hi "220.565544"; cov "8.548931";
+chr13 Cufflinks transcript 5869555 5869581 1000 . . gene_id "CUFF.50319"; transcript_id "CUFF.50319.1"; FPKM "125.1741327402"; frac "1.000000"; conf_lo "36.662655"; conf_hi "213.685611"; cov "8.000000";
+chr13 Cufflinks exon 5869555 5869581 1000 . . gene_id "CUFF.50319"; transcript_id "CUFF.50319.1"; exon_number "1"; FPKM "125.1741327402"; frac "1.000000"; conf_lo "36.662655"; conf_hi "213.685611"; cov "8.000000";
+chr13 Cufflinks transcript 6205097 6205155 1000 . . gene_id "CUFF.50321"; transcript_id "CUFF.50321.1"; FPKM "14.3207694237"; frac "1.000000"; conf_lo "0.000000"; conf_hi "34.573396"; cov "0.915254";
+chr13 Cufflinks exon 6205097 6205155 1000 . . gene_id "CUFF.50321"; transcript_id "CUFF.50321.1"; exon_number "1"; FPKM "14.3207694237"; frac "1.000000"; conf_lo "0.000000"; conf_hi "34.573396"; cov "0.915254";
+chr13 Cufflinks transcript 6227260 6227293 1000 . . gene_id "CUFF.50323"; transcript_id "CUFF.50323.1"; FPKM "18.6233083846"; frac "1.000000"; conf_lo "0.000000"; conf_hi "49.047086"; cov "1.190234";
+chr13 Cufflinks exon 6227260 6227293 1000 . . gene_id "CUFF.50323"; transcript_id "CUFF.50323.1"; exon_number "1"; FPKM "18.6233083846"; frac "1.000000"; conf_lo "0.000000"; conf_hi "49.047086"; cov "1.190234";
+chr13 Cufflinks transcript 6553021 6553051 1000 . . gene_id "CUFF.50325"; transcript_id "CUFF.50325.1"; FPKM "27.2556579354"; frac "1.000000"; conf_lo "0.000000"; conf_hi "65.800979"; cov "1.741935";
+chr13 Cufflinks exon 6553021 6553051 1000 . . gene_id "CUFF.50325"; transcript_id "CUFF.50325.1"; exon_number "1"; FPKM "27.2556579354"; frac "1.000000"; conf_lo "0.000000"; conf_hi "65.800979"; cov "1.741935";
+chr13 Cufflinks transcript 6576412 6576471 1000 . . gene_id "CUFF.50327"; transcript_id "CUFF.50327.1"; FPKM "14.0820899333"; frac "1.000000"; conf_lo "0.000000"; conf_hi "33.997173"; cov "0.900000";
+chr13 Cufflinks exon 6576412 6576471 1000 . . gene_id "CUFF.50327"; transcript_id "CUFF.50327.1"; exon_number "1"; FPKM "14.0820899333"; frac "1.000000"; conf_lo "0.000000"; conf_hi "33.997173"; cov "0.900000";
+chr13 Cufflinks transcript 6576625 6576734 1000 . . gene_id "CUFF.50329"; transcript_id "CUFF.50329.1"; FPKM "26.8839898726"; frac "1.000000"; conf_lo "6.561604"; conf_hi "47.206376"; cov "1.718182";
+chr13 Cufflinks exon 6576625 6576734 1000 . . gene_id "CUFF.50329"; transcript_id "CUFF.50329.1"; exon_number "1"; FPKM "26.8839898726"; frac "1.000000"; conf_lo "6.561604"; conf_hi "47.206376"; cov "1.718182";
+chr13 Cufflinks transcript 6577727 6577820 1000 . . gene_id "CUFF.50331"; transcript_id "CUFF.50331.1"; FPKM "31.4599881488"; frac "1.000000"; conf_lo "7.678472"; conf_hi "55.241504"; cov "2.010638";
+chr13 Cufflinks exon 6577727 6577820 1000 . . gene_id "CUFF.50331"; transcript_id "CUFF.50331.1"; exon_number "1"; FPKM "31.4599881488"; frac "1.000000"; conf_lo "7.678472"; conf_hi "55.241504"; cov "2.010638";
+chr13 Cufflinks transcript 6579706 6579858 1000 . . gene_id "CUFF.50333"; transcript_id "CUFF.50333.1"; FPKM "11.0447764182"; frac "1.000000"; conf_lo "0.000000"; conf_hi "22.089553"; cov "0.705882";
+chr13 Cufflinks exon 6579706 6579858 1000 . . gene_id "CUFF.50333"; transcript_id "CUFF.50333.1"; exon_number "1"; FPKM "11.0447764182"; frac "1.000000"; conf_lo "0.000000"; conf_hi "22.089553"; cov "0.705882";
+chr13 Cufflinks transcript 6580126 6580152 1000 . . gene_id "CUFF.50335"; transcript_id "CUFF.50335.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 6580126 6580152 1000 . . gene_id "CUFF.50335"; transcript_id "CUFF.50335.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 6580257 6580295 1000 . . gene_id "CUFF.50337"; transcript_id "CUFF.50337.1"; FPKM "21.6647537435"; frac "1.000000"; conf_lo "0.000000"; conf_hi "52.303342"; cov "1.384615";
+chr13 Cufflinks exon 6580257 6580295 1000 . . gene_id "CUFF.50337"; transcript_id "CUFF.50337.1"; exon_number "1"; FPKM "21.6647537435"; frac "1.000000"; conf_lo "0.000000"; conf_hi "52.303342"; cov "1.384615";
+chr13 Cufflinks transcript 6583845 6585843 1000 - . gene_id "CUFF.50339"; transcript_id "CUFF.50339.1"; FPKM "163.2242242265"; frac "1.000000"; conf_lo "127.815919"; conf_hi "198.632530"; cov "10.431818";
+chr13 Cufflinks exon 6583845 6583946 1000 - . gene_id "CUFF.50339"; transcript_id "CUFF.50339.1"; exon_number "1"; FPKM "163.2242242265"; frac "1.000000"; conf_lo "127.815919"; conf_hi "198.632530"; cov "10.431818";
+chr13 Cufflinks exon 6585726 6585843 1000 - . gene_id "CUFF.50339"; transcript_id "CUFF.50339.1"; exon_number "2"; FPKM "163.2242242265"; frac "1.000000"; conf_lo "127.815919"; conf_hi "198.632530"; cov "10.431818";
+chr13 Cufflinks transcript 6586295 6587966 1000 - . gene_id "CUFF.50341"; transcript_id "CUFF.50341.1"; FPKM "82.5011329424"; frac "1.000000"; conf_lo "60.835274"; conf_hi "104.166992"; cov "5.272727";
+chr13 Cufflinks exon 6586295 6586359 1000 - . gene_id "CUFF.50341"; transcript_id "CUFF.50341.1"; exon_number "1"; FPKM "82.5011329424"; frac "1.000000"; conf_lo "60.835274"; conf_hi "104.166992"; cov "5.272727";
+chr13 Cufflinks exon 6587735 6587966 1000 - . gene_id "CUFF.50341"; transcript_id "CUFF.50341.1"; exon_number "2"; FPKM "82.5011329424"; frac "1.000000"; conf_lo "60.835274"; conf_hi "104.166992"; cov "5.272727";
+chr13 Cufflinks transcript 6588113 6588703 1000 . . gene_id "CUFF.50343"; transcript_id "CUFF.50343.1"; FPKM "42.8896140100"; frac "1.000000"; conf_lo "31.815563"; conf_hi "53.963665"; cov "2.741117";
+chr13 Cufflinks exon 6588113 6588703 1000 . . gene_id "CUFF.50343"; transcript_id "CUFF.50343.1"; exon_number "1"; FPKM "42.8896140100"; frac "1.000000"; conf_lo "31.815563"; conf_hi "53.963665"; cov "2.741117";
+chr13 Cufflinks transcript 6588763 6588911 1000 . . gene_id "CUFF.50345"; transcript_id "CUFF.50345.1"; FPKM "31.1885213287"; frac "1.000000"; conf_lo "12.381135"; conf_hi "49.995907"; cov "1.993289";
+chr13 Cufflinks exon 6588763 6588911 1000 . . gene_id "CUFF.50345"; transcript_id "CUFF.50345.1"; exon_number "1"; FPKM "31.1885213287"; frac "1.000000"; conf_lo "12.381135"; conf_hi "49.995907"; cov "1.993289";
+chr13 Cufflinks transcript 6588964 6589091 1000 . . gene_id "CUFF.50347"; transcript_id "CUFF.50347.1"; FPKM "13.2019593124"; frac "1.000000"; conf_lo "0.000000"; conf_hi "26.403919"; cov "0.843750";
+chr13 Cufflinks exon 6588964 6589091 1000 . . gene_id "CUFF.50347"; transcript_id "CUFF.50347.1"; exon_number "1"; FPKM "13.2019593124"; frac "1.000000"; conf_lo "0.000000"; conf_hi "26.403919"; cov "0.843750";
+chr13 Cufflinks transcript 6589153 6589383 1000 . . gene_id "CUFF.50349"; transcript_id "CUFF.50349.1"; FPKM "12.8018999393"; frac "1.000000"; conf_lo "3.124573"; conf_hi "22.479227"; cov "0.818182";
+chr13 Cufflinks exon 6589153 6589383 1000 . . gene_id "CUFF.50349"; transcript_id "CUFF.50349.1"; exon_number "1"; FPKM "12.8018999393"; frac "1.000000"; conf_lo "3.124573"; conf_hi "22.479227"; cov "0.818182";
+chr13 Cufflinks transcript 6589994 6590086 1000 . . gene_id "CUFF.50351"; transcript_id "CUFF.50351.1"; FPKM "9.0852193118"; frac "1.000000"; conf_lo "0.000000"; conf_hi "21.933660"; cov "0.580645";
+chr13 Cufflinks exon 6589994 6590086 1000 . . gene_id "CUFF.50351"; transcript_id "CUFF.50351.1"; exon_number "1"; FPKM "9.0852193118"; frac "1.000000"; conf_lo "0.000000"; conf_hi "21.933660"; cov "0.580645";
+chr13 Cufflinks transcript 6590329 6590359 1000 . . gene_id "CUFF.50353"; transcript_id "CUFF.50353.1"; FPKM "27.2556579354"; frac "1.000000"; conf_lo "0.000000"; conf_hi "65.800979"; cov "1.741935";
+chr13 Cufflinks exon 6590329 6590359 1000 . . gene_id "CUFF.50353"; transcript_id "CUFF.50353.1"; exon_number "1"; FPKM "27.2556579354"; frac "1.000000"; conf_lo "0.000000"; conf_hi "65.800979"; cov "1.741935";
+chr13 Cufflinks transcript 6590592 6590645 1000 . . gene_id "CUFF.50355"; transcript_id "CUFF.50355.1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "37.774636"; cov "1.000000";
+chr13 Cufflinks exon 6590592 6590645 1000 . . gene_id "CUFF.50355"; transcript_id "CUFF.50355.1"; exon_number "1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "37.774636"; cov "1.000000";
+chr13 Cufflinks transcript 6590963 6591056 1000 . . gene_id "CUFF.50357"; transcript_id "CUFF.50357.1"; FPKM "17.9771360850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "35.954272"; cov "1.148936";
+chr13 Cufflinks exon 6590963 6591056 1000 . . gene_id "CUFF.50357"; transcript_id "CUFF.50357.1"; exon_number "1"; FPKM "17.9771360850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "35.954272"; cov "1.148936";
+chr13 Cufflinks transcript 6591182 6591208 1000 . . gene_id "CUFF.50359"; transcript_id "CUFF.50359.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 6591182 6591208 1000 . . gene_id "CUFF.50359"; transcript_id "CUFF.50359.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 6591662 6591724 1000 . . gene_id "CUFF.50361"; transcript_id "CUFF.50361.1"; FPKM "13.4115142222"; frac "1.000000"; conf_lo "0.000000"; conf_hi "32.378260"; cov "0.857143";
+chr13 Cufflinks exon 6591662 6591724 1000 . . gene_id "CUFF.50361"; transcript_id "CUFF.50361.1"; exon_number "1"; FPKM "13.4115142222"; frac "1.000000"; conf_lo "0.000000"; conf_hi "32.378260"; cov "0.857143";
+chr13 Cufflinks transcript 6592773 6592874 1000 . . gene_id "CUFF.50363"; transcript_id "CUFF.50363.1"; FPKM "12.4253734705"; frac "1.000000"; conf_lo "0.000000"; conf_hi "26.772959"; cov "0.794118";
+chr13 Cufflinks exon 6592773 6592874 1000 . . gene_id "CUFF.50363"; transcript_id "CUFF.50363.1"; exon_number "1"; FPKM "12.4253734705"; frac "1.000000"; conf_lo "0.000000"; conf_hi "26.772959"; cov "0.794118";
+chr13 Cufflinks transcript 6580385 6581757 1000 - . gene_id "CUFF.50365"; transcript_id "CUFF.50365.1"; FPKM "324.9135847836"; frac "1.000000"; conf_lo "293.684884"; conf_hi "356.142286"; cov "20.765542";
+chr13 Cufflinks exon 6580385 6580838 1000 - . gene_id "CUFF.50365"; transcript_id "CUFF.50365.1"; exon_number "1"; FPKM "324.9135847836"; frac "1.000000"; conf_lo "293.684884"; conf_hi "356.142286"; cov "20.765542";
+chr13 Cufflinks exon 6581649 6581757 1000 - . gene_id "CUFF.50365"; transcript_id "CUFF.50365.1"; exon_number "2"; FPKM "324.9135847836"; frac "1.000000"; conf_lo "293.684884"; conf_hi "356.142286"; cov "20.765542";
+chr13 Cufflinks transcript 6594213 6594242 1000 . . gene_id "CUFF.50367"; transcript_id "CUFF.50367.1"; FPKM "28.1641798665"; frac "1.000000"; conf_lo "0.000000"; conf_hi "67.994345"; cov "1.800000";
+chr13 Cufflinks exon 6594213 6594242 1000 . . gene_id "CUFF.50367"; transcript_id "CUFF.50367.1"; exon_number "1"; FPKM "28.1641798665"; frac "1.000000"; conf_lo "0.000000"; conf_hi "67.994345"; cov "1.800000";
+chr13 Cufflinks transcript 6594897 6594938 1000 . . gene_id "CUFF.50369"; transcript_id "CUFF.50369.1"; FPKM "20.1172713332"; frac "1.000000"; conf_lo "0.000000"; conf_hi "48.567389"; cov "1.285714";
+chr13 Cufflinks exon 6594897 6594938 1000 . . gene_id "CUFF.50369"; transcript_id "CUFF.50369.1"; exon_number "1"; FPKM "20.1172713332"; frac "1.000000"; conf_lo "0.000000"; conf_hi "48.567389"; cov "1.285714";
+chr13 Cufflinks transcript 6594742 6594836 1000 . . gene_id "CUFF.50371"; transcript_id "CUFF.50371.1"; FPKM "13.3409273052"; frac "1.000000"; conf_lo "0.000000"; conf_hi "28.745703"; cov "0.852632";
+chr13 Cufflinks exon 6594742 6594836 1000 . . gene_id "CUFF.50371"; transcript_id "CUFF.50371.1"; exon_number "1"; FPKM "13.3409273052"; frac "1.000000"; conf_lo "0.000000"; conf_hi "28.745703"; cov "0.852632";
+chr13 Cufflinks transcript 6595072 6595132 1000 . . gene_id "CUFF.50373"; transcript_id "CUFF.50373.1"; FPKM "20.7768539999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "44.767898"; cov "1.327869";
+chr13 Cufflinks exon 6595072 6595132 1000 . . gene_id "CUFF.50373"; transcript_id "CUFF.50373.1"; exon_number "1"; FPKM "20.7768539999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "44.767898"; cov "1.327869";
+chr13 Cufflinks transcript 6595199 6595225 1000 . . gene_id "CUFF.50375"; transcript_id "CUFF.50375.1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks exon 6595199 6595225 1000 . . gene_id "CUFF.50375"; transcript_id "CUFF.50375.1"; exon_number "1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks transcript 6595246 6595272 1000 . . gene_id "CUFF.50377"; transcript_id "CUFF.50377.1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks exon 6595246 6595272 1000 . . gene_id "CUFF.50377"; transcript_id "CUFF.50377.1"; exon_number "1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks transcript 6598001 6598027 1000 . . gene_id "CUFF.50379"; transcript_id "CUFF.50379.1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks exon 6598001 6598027 1000 . . gene_id "CUFF.50379"; transcript_id "CUFF.50379.1"; exon_number "1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks transcript 6601936 6601990 1000 . . gene_id "CUFF.50381"; transcript_id "CUFF.50381.1"; FPKM "15.3622799272"; frac "1.000000"; conf_lo "0.000000"; conf_hi "37.087825"; cov "0.981818";
+chr13 Cufflinks exon 6601936 6601990 1000 . . gene_id "CUFF.50381"; transcript_id "CUFF.50381.1"; exon_number "1"; FPKM "15.3622799272"; frac "1.000000"; conf_lo "0.000000"; conf_hi "37.087825"; cov "0.981818";
+chr13 Cufflinks transcript 6604226 6604297 1000 . . gene_id "CUFF.50383"; transcript_id "CUFF.50383.1"; FPKM "17.6026124166"; frac "1.000000"; conf_lo "0.000000"; conf_hi "37.928358"; cov "1.125000";
+chr13 Cufflinks exon 6604226 6604297 1000 . . gene_id "CUFF.50383"; transcript_id "CUFF.50383.1"; exon_number "1"; FPKM "17.6026124166"; frac "1.000000"; conf_lo "0.000000"; conf_hi "37.928358"; cov "1.125000";
+chr13 Cufflinks transcript 6616305 6616331 1000 . . gene_id "CUFF.50385"; transcript_id "CUFF.50385.1"; FPKM "46.9402997776"; frac "1.000000"; conf_lo "0.000000"; conf_hi "101.142289"; cov "3.000000";
+chr13 Cufflinks exon 6616305 6616331 1000 . . gene_id "CUFF.50385"; transcript_id "CUFF.50385.1"; exon_number "1"; FPKM "46.9402997776"; frac "1.000000"; conf_lo "0.000000"; conf_hi "101.142289"; cov "3.000000";
+chr13 Cufflinks transcript 6616841 6616921 1000 . . gene_id "CUFF.50387"; transcript_id "CUFF.50387.1"; FPKM "5.2155888642"; frac "1.000000"; conf_lo "0.000000"; conf_hi "15.646767"; cov "0.333333";
+chr13 Cufflinks exon 6616841 6616921 1000 . . gene_id "CUFF.50387"; transcript_id "CUFF.50387.1"; exon_number "1"; FPKM "5.2155888642"; frac "1.000000"; conf_lo "0.000000"; conf_hi "15.646767"; cov "0.333333";
+chr13 Cufflinks transcript 6617878 6617990 1000 . . gene_id "CUFF.50389"; transcript_id "CUFF.50389.1"; FPKM "11.2158238407"; frac "1.000000"; conf_lo "0.000000"; conf_hi "24.166742"; cov "0.716814";
+chr13 Cufflinks exon 6617878 6617990 1000 . . gene_id "CUFF.50389"; transcript_id "CUFF.50389.1"; exon_number "1"; FPKM "11.2158238407"; frac "1.000000"; conf_lo "0.000000"; conf_hi "24.166742"; cov "0.716814";
+chr13 Cufflinks transcript 6618127 6618156 1000 . . gene_id "CUFF.50391"; transcript_id "CUFF.50391.1"; FPKM "28.1641798665"; frac "1.000000"; conf_lo "0.000000"; conf_hi "67.994345"; cov "1.800000";
+chr13 Cufflinks exon 6618127 6618156 1000 . . gene_id "CUFF.50391"; transcript_id "CUFF.50391.1"; exon_number "1"; FPKM "28.1641798665"; frac "1.000000"; conf_lo "0.000000"; conf_hi "67.994345"; cov "1.800000";
+chr13 Cufflinks transcript 6618432 6618463 1000 . . gene_id "CUFF.50393"; transcript_id "CUFF.50393.1"; FPKM "26.4039186249"; frac "1.000000"; conf_lo "0.000000"; conf_hi "63.744698"; cov "1.687500";
+chr13 Cufflinks exon 6618432 6618463 1000 . . gene_id "CUFF.50393"; transcript_id "CUFF.50393.1"; exon_number "1"; FPKM "26.4039186249"; frac "1.000000"; conf_lo "0.000000"; conf_hi "63.744698"; cov "1.687500";
+chr13 Cufflinks transcript 6618765 6618809 1000 . . gene_id "CUFF.50395"; transcript_id "CUFF.50395.1"; FPKM "28.1641798665"; frac "1.000000"; conf_lo "0.000000"; conf_hi "60.685374"; cov "1.800000";
+chr13 Cufflinks exon 6618765 6618809 1000 . . gene_id "CUFF.50395"; transcript_id "CUFF.50395.1"; exon_number "1"; FPKM "28.1641798665"; frac "1.000000"; conf_lo "0.000000"; conf_hi "60.685374"; cov "1.800000";
+chr13 Cufflinks transcript 6620226 6620259 1000 . . gene_id "CUFF.50397"; transcript_id "CUFF.50397.1"; FPKM "24.8507469411"; frac "1.000000"; conf_lo "0.000000"; conf_hi "59.995010"; cov "1.588235";
+chr13 Cufflinks exon 6620226 6620259 1000 . . gene_id "CUFF.50397"; transcript_id "CUFF.50397.1"; exon_number "1"; FPKM "24.8507469411"; frac "1.000000"; conf_lo "0.000000"; conf_hi "59.995010"; cov "1.588235";
+chr13 Cufflinks transcript 6795860 6795886 1000 . . gene_id "CUFF.50399"; transcript_id "CUFF.50399.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 6795860 6795886 1000 . . gene_id "CUFF.50399"; transcript_id "CUFF.50399.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 7155940 7155966 1000 . . gene_id "CUFF.50401"; transcript_id "CUFF.50401.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 7155940 7155966 1000 . . gene_id "CUFF.50401"; transcript_id "CUFF.50401.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 7676033 7676123 1000 . . gene_id "CUFF.50403"; transcript_id "CUFF.50403.1"; FPKM "9.2848944615"; frac "1.000000"; conf_lo "0.000000"; conf_hi "22.415718"; cov "0.593407";
+chr13 Cufflinks exon 7676033 7676123 1000 . . gene_id "CUFF.50403"; transcript_id "CUFF.50403.1"; exon_number "1"; FPKM "9.2848944615"; frac "1.000000"; conf_lo "0.000000"; conf_hi "22.415718"; cov "0.593407";
+chr13 Cufflinks transcript 8202861 8202907 1000 . . gene_id "CUFF.50405"; transcript_id "CUFF.50405.1"; FPKM "17.9771360850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "43.400646"; cov "1.148936";
+chr13 Cufflinks exon 8202861 8202907 1000 . . gene_id "CUFF.50405"; transcript_id "CUFF.50405.1"; exon_number "1"; FPKM "17.9771360850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "43.400646"; cov "1.148936";
+chr13 Cufflinks transcript 8210506 8210549 1000 . . gene_id "CUFF.50407"; transcript_id "CUFF.50407.1"; FPKM "19.2028499090"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.359781"; cov "1.227273";
+chr13 Cufflinks exon 8210506 8210549 1000 . . gene_id "CUFF.50407"; transcript_id "CUFF.50407.1"; exon_number "1"; FPKM "19.2028499090"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.359781"; cov "1.227273";
+chr13 Cufflinks transcript 8240024 8240081 1000 . . gene_id "CUFF.50409"; transcript_id "CUFF.50409.1"; FPKM "14.5676792413"; frac "1.000000"; conf_lo "0.000000"; conf_hi "35.169489"; cov "0.931034";
+chr13 Cufflinks exon 8240024 8240081 1000 . . gene_id "CUFF.50409"; transcript_id "CUFF.50409.1"; exon_number "1"; FPKM "14.5676792413"; frac "1.000000"; conf_lo "0.000000"; conf_hi "35.169489"; cov "0.931034";
+chr13 Cufflinks transcript 8277443 8277522 1000 . . gene_id "CUFF.50411"; transcript_id "CUFF.50411.1"; FPKM "10.5615674500"; frac "1.000000"; conf_lo "0.000000"; conf_hi "25.497879"; cov "0.675000";
+chr13 Cufflinks exon 8277443 8277522 1000 . . gene_id "CUFF.50411"; transcript_id "CUFF.50411.1"; exon_number "1"; FPKM "10.5615674500"; frac "1.000000"; conf_lo "0.000000"; conf_hi "25.497879"; cov "0.675000";
+chr13 Cufflinks transcript 8277606 8277673 1000 . . gene_id "CUFF.50413"; transcript_id "CUFF.50413.1"; FPKM "24.8507469411"; frac "1.000000"; conf_lo "0.000000"; conf_hi "49.701494"; cov "1.588235";
+chr13 Cufflinks exon 8277606 8277673 1000 . . gene_id "CUFF.50413"; transcript_id "CUFF.50413.1"; exon_number "1"; FPKM "24.8507469411"; frac "1.000000"; conf_lo "0.000000"; conf_hi "49.701494"; cov "1.588235";
+chr13 Cufflinks transcript 8277822 8277848 1000 . . gene_id "CUFF.50415"; transcript_id "CUFF.50415.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 8277822 8277848 1000 . . gene_id "CUFF.50415"; transcript_id "CUFF.50415.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 8277918 8277977 1000 . . gene_id "CUFF.50417"; transcript_id "CUFF.50417.1"; FPKM "21.1231348999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "45.514030"; cov "1.350000";
+chr13 Cufflinks exon 8277918 8277977 1000 . . gene_id "CUFF.50417"; transcript_id "CUFF.50417.1"; exon_number "1"; FPKM "21.1231348999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "45.514030"; cov "1.350000";
+chr13 Cufflinks transcript 8278095 8278121 1000 . . gene_id "CUFF.50419"; transcript_id "CUFF.50419.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 8278095 8278121 1000 . . gene_id "CUFF.50419"; transcript_id "CUFF.50419.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 8278201 8278350 1000 . . gene_id "CUFF.50421"; transcript_id "CUFF.50421.1"; FPKM "14.0820899333"; frac "1.000000"; conf_lo "1.486686"; conf_hi "26.677494"; cov "0.900000";
+chr13 Cufflinks exon 8278201 8278350 1000 . . gene_id "CUFF.50421"; transcript_id "CUFF.50421.1"; exon_number "1"; FPKM "14.0820899333"; frac "1.000000"; conf_lo "1.486686"; conf_hi "26.677494"; cov "0.900000";
+chr13 Cufflinks transcript 8278906 8278932 1000 . . gene_id "CUFF.50423"; transcript_id "CUFF.50423.1"; FPKM "46.9402997776"; frac "1.000000"; conf_lo "0.000000"; conf_hi "101.142289"; cov "3.000000";
+chr13 Cufflinks exon 8278906 8278932 1000 . . gene_id "CUFF.50423"; transcript_id "CUFF.50423.1"; exon_number "1"; FPKM "46.9402997776"; frac "1.000000"; conf_lo "0.000000"; conf_hi "101.142289"; cov "3.000000";
+chr13 Cufflinks transcript 8281673 8281699 1000 . . gene_id "CUFF.50425"; transcript_id "CUFF.50425.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 8281673 8281699 1000 . . gene_id "CUFF.50425"; transcript_id "CUFF.50425.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 8311626 8311652 1000 . . gene_id "CUFF.50427"; transcript_id "CUFF.50427.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 8311626 8311652 1000 . . gene_id "CUFF.50427"; transcript_id "CUFF.50427.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 8321948 8321974 1000 . . gene_id "CUFF.50429"; transcript_id "CUFF.50429.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 8321948 8321974 1000 . . gene_id "CUFF.50429"; transcript_id "CUFF.50429.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 8330761 8330829 1000 . . gene_id "CUFF.50431"; transcript_id "CUFF.50431.1"; FPKM "12.2452955941"; frac "1.000000"; conf_lo "0.000000"; conf_hi "29.562759"; cov "0.782609";
+chr13 Cufflinks exon 8330761 8330829 1000 . . gene_id "CUFF.50431"; transcript_id "CUFF.50431.1"; exon_number "1"; FPKM "12.2452955941"; frac "1.000000"; conf_lo "0.000000"; conf_hi "29.562759"; cov "0.782609";
+chr13 Cufflinks transcript 8334495 8335002 1000 . . gene_id "CUFF.50433"; transcript_id "CUFF.50433.1"; FPKM "24.1169650432"; frac "1.000000"; conf_lo "15.160149"; conf_hi "33.073781"; cov "1.541339";
+chr13 Cufflinks exon 8334495 8335002 1000 . . gene_id "CUFF.50433"; transcript_id "CUFF.50433.1"; exon_number "1"; FPKM "24.1169650432"; frac "1.000000"; conf_lo "15.160149"; conf_hi "33.073781"; cov "1.541339";
+chr13 Cufflinks transcript 8335517 8335639 1000 . . gene_id "CUFF.50435"; transcript_id "CUFF.50435.1"; FPKM "13.7386243251"; frac "1.000000"; conf_lo "0.000000"; conf_hi "27.477249"; cov "0.878049";
+chr13 Cufflinks exon 8335517 8335639 1000 . . gene_id "CUFF.50435"; transcript_id "CUFF.50435.1"; exon_number "1"; FPKM "13.7386243251"; frac "1.000000"; conf_lo "0.000000"; conf_hi "27.477249"; cov "0.878049";
+chr13 Cufflinks transcript 8390965 8390991 1000 . . gene_id "CUFF.50437"; transcript_id "CUFF.50437.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 8390965 8390991 1000 . . gene_id "CUFF.50437"; transcript_id "CUFF.50437.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 8431938 8432046 1000 . . gene_id "CUFF.50439"; transcript_id "CUFF.50439.1"; FPKM "15.5032182752"; frac "1.000000"; conf_lo "0.000000"; conf_hi "31.006437"; cov "0.990826";
+chr13 Cufflinks exon 8431938 8432046 1000 . . gene_id "CUFF.50439"; transcript_id "CUFF.50439.1"; exon_number "1"; FPKM "15.5032182752"; frac "1.000000"; conf_lo "0.000000"; conf_hi "31.006437"; cov "0.990826";
+chr13 Cufflinks transcript 8431688 8431754 1000 . . gene_id "CUFF.50441"; transcript_id "CUFF.50441.1"; FPKM "12.6108268059"; frac "1.000000"; conf_lo "0.000000"; conf_hi "30.445229"; cov "0.805970";
+chr13 Cufflinks exon 8431688 8431754 1000 . . gene_id "CUFF.50441"; transcript_id "CUFF.50441.1"; exon_number "1"; FPKM "12.6108268059"; frac "1.000000"; conf_lo "0.000000"; conf_hi "30.445229"; cov "0.805970";
+chr13 Cufflinks transcript 8432289 8432315 1000 . . gene_id "CUFF.50443"; transcript_id "CUFF.50443.1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks exon 8432289 8432315 1000 . . gene_id "CUFF.50443"; transcript_id "CUFF.50443.1"; exon_number "1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks transcript 8432115 8432188 1000 . . gene_id "CUFF.50445"; transcript_id "CUFF.50445.1"; FPKM "11.4179107567"; frac "1.000000"; conf_lo "0.000000"; conf_hi "27.565275"; cov "0.729730";
+chr13 Cufflinks exon 8432115 8432188 1000 . . gene_id "CUFF.50445"; transcript_id "CUFF.50445.1"; exon_number "1"; FPKM "11.4179107567"; frac "1.000000"; conf_lo "0.000000"; conf_hi "27.565275"; cov "0.729730";
+chr13 Cufflinks transcript 8463173 8463199 1000 . . gene_id "CUFF.50447"; transcript_id "CUFF.50447.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 8463173 8463199 1000 . . gene_id "CUFF.50447"; transcript_id "CUFF.50447.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 8482167 8482193 1000 . . gene_id "CUFF.50449"; transcript_id "CUFF.50449.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 8482167 8482193 1000 . . gene_id "CUFF.50449"; transcript_id "CUFF.50449.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 8518188 8518214 1000 . . gene_id "CUFF.50451"; transcript_id "CUFF.50451.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 8518188 8518214 1000 . . gene_id "CUFF.50451"; transcript_id "CUFF.50451.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 8619978 8620005 1000 . . gene_id "CUFF.50453"; transcript_id "CUFF.50453.1"; FPKM "30.1759069999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "72.851084"; cov "1.928571";
+chr13 Cufflinks exon 8619978 8620005 1000 . . gene_id "CUFF.50453"; transcript_id "CUFF.50453.1"; exon_number "1"; FPKM "30.1759069999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "72.851084"; cov "1.928571";
+chr13 Cufflinks transcript 8669464 8669490 1000 . . gene_id "CUFF.50455"; transcript_id "CUFF.50455.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 8669464 8669490 1000 . . gene_id "CUFF.50455"; transcript_id "CUFF.50455.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 8705396 8705459 1000 . . gene_id "CUFF.50457"; transcript_id "CUFF.50457.1"; FPKM "13.2019593124"; frac "1.000000"; conf_lo "0.000000"; conf_hi "31.872349"; cov "0.843750";
+chr13 Cufflinks exon 8705396 8705459 1000 . . gene_id "CUFF.50457"; transcript_id "CUFF.50457.1"; exon_number "1"; FPKM "13.2019593124"; frac "1.000000"; conf_lo "0.000000"; conf_hi "31.872349"; cov "0.843750";
+chr13 Cufflinks transcript 8719319 8719345 1000 . . gene_id "CUFF.50459"; transcript_id "CUFF.50459.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 8719319 8719345 1000 . . gene_id "CUFF.50459"; transcript_id "CUFF.50459.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 8766868 8767005 1000 . . gene_id "CUFF.50461"; transcript_id "CUFF.50461.1"; FPKM "12.2452955941"; frac "1.000000"; conf_lo "0.000000"; conf_hi "24.490591"; cov "0.782609";
+chr13 Cufflinks exon 8766868 8767005 1000 . . gene_id "CUFF.50461"; transcript_id "CUFF.50461.1"; exon_number "1"; FPKM "12.2452955941"; frac "1.000000"; conf_lo "0.000000"; conf_hi "24.490591"; cov "0.782609";
+chr13 Cufflinks transcript 8767194 8767393 1000 . . gene_id "CUFF.50463"; transcript_id "CUFF.50463.1"; FPKM "12.6738809399"; frac "1.000000"; conf_lo "2.325700"; conf_hi "23.022061"; cov "0.810000";
+chr13 Cufflinks exon 8767194 8767393 1000 . . gene_id "CUFF.50463"; transcript_id "CUFF.50463.1"; exon_number "1"; FPKM "12.6738809399"; frac "1.000000"; conf_lo "2.325700"; conf_hi "23.022061"; cov "0.810000";
+chr13 Cufflinks transcript 8767461 8767531 1000 . . gene_id "CUFF.50465"; transcript_id "CUFF.50465.1"; FPKM "17.8505365351"; frac "1.000000"; conf_lo "0.000000"; conf_hi "38.462561"; cov "1.140845";
+chr13 Cufflinks exon 8767461 8767531 1000 . . gene_id "CUFF.50465"; transcript_id "CUFF.50465.1"; exon_number "1"; FPKM "17.8505365351"; frac "1.000000"; conf_lo "0.000000"; conf_hi "38.462561"; cov "1.140845";
+chr13 Cufflinks transcript 8767695 8767885 1000 . . gene_id "CUFF.50467"; transcript_id "CUFF.50467.1"; FPKM "17.6947726910"; frac "1.000000"; conf_lo "5.182679"; conf_hi "30.206866"; cov "1.130890";
+chr13 Cufflinks exon 8767695 8767885 1000 . . gene_id "CUFF.50467"; transcript_id "CUFF.50467.1"; exon_number "1"; FPKM "17.6947726910"; frac "1.000000"; conf_lo "5.182679"; conf_hi "30.206866"; cov "1.130890";
+chr13 Cufflinks transcript 8767947 8767992 1000 . . gene_id "CUFF.50469"; transcript_id "CUFF.50469.1"; FPKM "27.5519150868"; frac "1.000000"; conf_lo "0.000000"; conf_hi "59.366126"; cov "1.760870";
+chr13 Cufflinks exon 8767947 8767992 1000 . . gene_id "CUFF.50469"; transcript_id "CUFF.50469.1"; exon_number "1"; FPKM "27.5519150868"; frac "1.000000"; conf_lo "0.000000"; conf_hi "59.366126"; cov "1.760870";
+chr13 Cufflinks transcript 8784118 8784193 1000 . . gene_id "CUFF.50471"; transcript_id "CUFF.50471.1"; FPKM "16.6761591315"; frac "1.000000"; conf_lo "0.000000"; conf_hi "35.932129"; cov "1.065789";
+chr13 Cufflinks exon 8784118 8784193 1000 . . gene_id "CUFF.50471"; transcript_id "CUFF.50471.1"; exon_number "1"; FPKM "16.6761591315"; frac "1.000000"; conf_lo "0.000000"; conf_hi "35.932129"; cov "1.065789";
+chr13 Cufflinks transcript 8802391 8802417 1000 . . gene_id "CUFF.50473"; transcript_id "CUFF.50473.1"; FPKM "109.5273661476"; frac "1.000000"; conf_lo "26.732460"; conf_hi "192.322273"; cov "7.000000";
+chr13 Cufflinks exon 8802391 8802417 1000 . . gene_id "CUFF.50473"; transcript_id "CUFF.50473.1"; exon_number "1"; FPKM "109.5273661476"; frac "1.000000"; conf_lo "26.732460"; conf_hi "192.322273"; cov "7.000000";
+chr13 Cufflinks transcript 8802581 8802610 1000 . . gene_id "CUFF.50475"; transcript_id "CUFF.50475.1"; FPKM "154.9029892659"; frac "1.000000"; conf_lo "61.492972"; conf_hi "248.313006"; cov "9.900000";
+chr13 Cufflinks exon 8802581 8802610 1000 . . gene_id "CUFF.50475"; transcript_id "CUFF.50475.1"; exon_number "1"; FPKM "154.9029892659"; frac "1.000000"; conf_lo "61.492972"; conf_hi "248.313006"; cov "9.900000";
+chr13 Cufflinks transcript 8803098 8803283 1000 . . gene_id "CUFF.50477"; transcript_id "CUFF.50477.1"; FPKM "18.1704386236"; frac "1.000000"; conf_lo "5.321998"; conf_hi "31.018879"; cov "1.161290";
+chr13 Cufflinks exon 8803098 8803283 1000 . . gene_id "CUFF.50477"; transcript_id "CUFF.50477.1"; exon_number "1"; FPKM "18.1704386236"; frac "1.000000"; conf_lo "5.321998"; conf_hi "31.018879"; cov "1.161290";
+chr13 Cufflinks transcript 8803340 8803703 1000 . . gene_id "CUFF.50479"; transcript_id "CUFF.50479.1"; FPKM "12.7584623804"; frac "1.000000"; conf_lo "5.062328"; conf_hi "20.454597"; cov "0.815406";
+chr13 Cufflinks exon 8803340 8803703 1000 . . gene_id "CUFF.50479"; transcript_id "CUFF.50479.1"; exon_number "1"; FPKM "12.7584623804"; frac "1.000000"; conf_lo "5.062328"; conf_hi "20.454597"; cov "0.815406";
+chr13 Cufflinks transcript 8803760 8819743 1000 + . gene_id "CUFF.50481"; transcript_id "CUFF.50481.1"; FPKM "15.1783005269"; frac "1.000000"; conf_lo "2.785270"; conf_hi "27.571331"; cov "0.970060";
+chr13 Cufflinks exon 8803760 8803879 1000 + . gene_id "CUFF.50481"; transcript_id "CUFF.50481.1"; exon_number "1"; FPKM "15.1783005269"; frac "1.000000"; conf_lo "2.785270"; conf_hi "27.571331"; cov "0.970060";
+chr13 Cufflinks exon 8819697 8819743 1000 + . gene_id "CUFF.50481"; transcript_id "CUFF.50481.1"; exon_number "2"; FPKM "15.1783005269"; frac "1.000000"; conf_lo "2.785270"; conf_hi "27.571331"; cov "0.970060";
+chr13 Cufflinks transcript 8819122 8819153 1000 . . gene_id "CUFF.50483"; transcript_id "CUFF.50483.1"; FPKM "26.4039186249"; frac "1.000000"; conf_lo "0.000000"; conf_hi "63.744698"; cov "1.687500";
+chr13 Cufflinks exon 8819122 8819153 1000 . . gene_id "CUFF.50483"; transcript_id "CUFF.50483.1"; exon_number "1"; FPKM "26.4039186249"; frac "1.000000"; conf_lo "0.000000"; conf_hi "63.744698"; cov "1.687500";
+chr13 Cufflinks transcript 8831114 8831142 1000 . . gene_id "CUFF.50485"; transcript_id "CUFF.50485.1"; FPKM "29.1353584826"; frac "1.000000"; conf_lo "0.000000"; conf_hi "70.338978"; cov "1.862069";
+chr13 Cufflinks exon 8831114 8831142 1000 . . gene_id "CUFF.50485"; transcript_id "CUFF.50485.1"; exon_number "1"; FPKM "29.1353584826"; frac "1.000000"; conf_lo "0.000000"; conf_hi "70.338978"; cov "1.862069";
+chr13 Cufflinks transcript 8831216 8831252 1000 . . gene_id "CUFF.50487"; transcript_id "CUFF.50487.1"; FPKM "34.2537322701"; frac "1.000000"; conf_lo "0.000000"; conf_hi "73.806535"; cov "2.189189";
+chr13 Cufflinks exon 8831216 8831252 1000 . . gene_id "CUFF.50487"; transcript_id "CUFF.50487.1"; exon_number "1"; FPKM "34.2537322701"; frac "1.000000"; conf_lo "0.000000"; conf_hi "73.806535"; cov "2.189189";
+chr13 Cufflinks transcript 8831404 8831522 1000 . . gene_id "CUFF.50489"; transcript_id "CUFF.50489.1"; FPKM "17.7505335293"; frac "1.000000"; conf_lo "1.873974"; conf_hi "33.627093"; cov "1.134454";
+chr13 Cufflinks exon 8831404 8831522 1000 . . gene_id "CUFF.50489"; transcript_id "CUFF.50489.1"; exon_number "1"; FPKM "17.7505335293"; frac "1.000000"; conf_lo "1.873974"; conf_hi "33.627093"; cov "1.134454";
+chr13 Cufflinks transcript 8849862 8849935 1000 . . gene_id "CUFF.50491"; transcript_id "CUFF.50491.1"; FPKM "17.1268661351"; frac "1.000000"; conf_lo "0.000000"; conf_hi "36.903268"; cov "1.094595";
+chr13 Cufflinks exon 8849862 8849935 1000 . . gene_id "CUFF.50491"; transcript_id "CUFF.50491.1"; exon_number "1"; FPKM "17.1268661351"; frac "1.000000"; conf_lo "0.000000"; conf_hi "36.903268"; cov "1.094595";
+chr13 Cufflinks transcript 8850038 8850347 1000 . . gene_id "CUFF.50493"; transcript_id "CUFF.50493.1"; FPKM "9.5394802774"; frac "1.000000"; conf_lo "2.328311"; conf_hi "16.750650"; cov "0.609677";
+chr13 Cufflinks exon 8850038 8850347 1000 . . gene_id "CUFF.50493"; transcript_id "CUFF.50493.1"; exon_number "1"; FPKM "9.5394802774"; frac "1.000000"; conf_lo "2.328311"; conf_hi "16.750650"; cov "0.609677";
+chr13 Cufflinks transcript 8864952 8864979 1000 . . gene_id "CUFF.50495"; transcript_id "CUFF.50495.1"; FPKM "75.4397674996"; frac "1.000000"; conf_lo "7.964388"; conf_hi "142.915147"; cov "4.821429";
+chr13 Cufflinks exon 8864952 8864979 1000 . . gene_id "CUFF.50495"; transcript_id "CUFF.50495.1"; exon_number "1"; FPKM "75.4397674996"; frac "1.000000"; conf_lo "7.964388"; conf_hi "142.915147"; cov "4.821429";
+chr13 Cufflinks transcript 8855128 8864773 1000 - . gene_id "CUFF.50497"; transcript_id "CUFF.50497.1"; FPKM "6.4009499697"; frac "1.000000"; conf_lo "0.000000"; conf_hi "19.202850"; cov "0.409091";
+chr13 Cufflinks exon 8855128 8855158 1000 - . gene_id "CUFF.50497"; transcript_id "CUFF.50497.1"; exon_number "1"; FPKM "6.4009499697"; frac "1.000000"; conf_lo "0.000000"; conf_hi "19.202850"; cov "0.409091";
+chr13 Cufflinks exon 8864739 8864773 1000 - . gene_id "CUFF.50497"; transcript_id "CUFF.50497.1"; exon_number "2"; FPKM "6.4009499697"; frac "1.000000"; conf_lo "0.000000"; conf_hi "19.202850"; cov "0.409091";
+chr13 Cufflinks transcript 8965678 8965704 1000 . . gene_id "CUFF.50499"; transcript_id "CUFF.50499.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 8965678 8965704 1000 . . gene_id "CUFF.50499"; transcript_id "CUFF.50499.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 8972036 8972065 1000 . . gene_id "CUFF.50501"; transcript_id "CUFF.50501.1"; FPKM "112.6567194661"; frac "1.000000"; conf_lo "32.996389"; conf_hi "192.317050"; cov "7.200000";
+chr13 Cufflinks exon 8972036 8972065 1000 . . gene_id "CUFF.50501"; transcript_id "CUFF.50501.1"; exon_number "1"; FPKM "112.6567194661"; frac "1.000000"; conf_lo "32.996389"; conf_hi "192.317050"; cov "7.200000";
+chr13 Cufflinks transcript 9133705 9133859 1000 . . gene_id "CUFF.50503"; transcript_id "CUFF.50503.1"; FPKM "8.1766973806"; frac "1.000000"; conf_lo "0.000000"; conf_hi "17.618334"; cov "0.522581";
+chr13 Cufflinks exon 9133705 9133859 1000 . . gene_id "CUFF.50503"; transcript_id "CUFF.50503.1"; exon_number "1"; FPKM "8.1766973806"; frac "1.000000"; conf_lo "0.000000"; conf_hi "17.618334"; cov "0.522581";
+chr13 Cufflinks transcript 9134178 9134256 1000 . . gene_id "CUFF.50505"; transcript_id "CUFF.50505.1"; FPKM "10.6952581772"; frac "1.000000"; conf_lo "0.000000"; conf_hi "25.820637"; cov "0.683544";
+chr13 Cufflinks exon 9134178 9134256 1000 . . gene_id "CUFF.50505"; transcript_id "CUFF.50505.1"; exon_number "1"; FPKM "10.6952581772"; frac "1.000000"; conf_lo "0.000000"; conf_hi "25.820637"; cov "0.683544";
+chr13 Cufflinks transcript 9272120 9272153 1000 . . gene_id "CUFF.50507"; transcript_id "CUFF.50507.1"; FPKM "24.8212432986"; frac "1.000000"; conf_lo "0.000000"; conf_hi "59.944638"; cov "1.586350";
+chr13 Cufflinks exon 9272120 9272153 1000 . . gene_id "CUFF.50507"; transcript_id "CUFF.50507.1"; exon_number "1"; FPKM "24.8212432986"; frac "1.000000"; conf_lo "0.000000"; conf_hi "59.944638"; cov "1.586350";
+chr13 Cufflinks transcript 9169898 9172437 1000 + . gene_id "CUFF.50509"; transcript_id "CUFF.50509.1"; FPKM "41.4918721248"; frac "1.000000"; conf_lo "16.471332"; conf_hi "66.512412"; cov "2.651786";
+chr13 Cufflinks exon 9169898 9169928 1000 + . gene_id "CUFF.50509"; transcript_id "CUFF.50509.1"; exon_number "1"; FPKM "41.4918721248"; frac "1.000000"; conf_lo "16.471332"; conf_hi "66.512412"; cov "2.651786";
+chr13 Cufflinks exon 9172357 9172437 1000 + . gene_id "CUFF.50509"; transcript_id "CUFF.50509.1"; exon_number "2"; FPKM "41.4918721248"; frac "1.000000"; conf_lo "16.471332"; conf_hi "66.512412"; cov "2.651786";
+chr13 Cufflinks transcript 9171841 9172220 1000 . . gene_id "CUFF.50511"; transcript_id "CUFF.50511.1"; FPKM "108.9509063258"; frac "1.000000"; conf_lo "86.939499"; conf_hi "130.962313"; cov "6.963158";
+chr13 Cufflinks exon 9171841 9172220 1000 . . gene_id "CUFF.50511"; transcript_id "CUFF.50511.1"; exon_number "1"; FPKM "108.9509063258"; frac "1.000000"; conf_lo "86.939499"; conf_hi "130.962313"; cov "6.963158";
+chr13 Cufflinks transcript 9172647 9173652 1000 . . gene_id "CUFF.50513"; transcript_id "CUFF.50513.1"; FPKM "111.9143215254"; frac "1.000000"; conf_lo "98.203357"; conf_hi "125.625287"; cov "7.152553";
+chr13 Cufflinks exon 9172647 9173652 1000 . . gene_id "CUFF.50513"; transcript_id "CUFF.50513.1"; exon_number "1"; FPKM "111.9143215254"; frac "1.000000"; conf_lo "98.203357"; conf_hi "125.625287"; cov "7.152553";
+chr13 Cufflinks transcript 9277893 9277953 1000 . . gene_id "CUFF.50515"; transcript_id "CUFF.50515.1"; FPKM "13.8512359999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "33.439842"; cov "0.885246";
+chr13 Cufflinks exon 9277893 9277953 1000 . . gene_id "CUFF.50515"; transcript_id "CUFF.50515.1"; exon_number "1"; FPKM "13.8512359999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "33.439842"; cov "0.885246";
+chr13 Cufflinks transcript 9278033 9278094 1000 . . gene_id "CUFF.50517"; transcript_id "CUFF.50517.1"; FPKM "13.6278289677"; frac "1.000000"; conf_lo "0.000000"; conf_hi "32.900490"; cov "0.870968";
+chr13 Cufflinks exon 9278033 9278094 1000 . . gene_id "CUFF.50517"; transcript_id "CUFF.50517.1"; exon_number "1"; FPKM "13.6278289677"; frac "1.000000"; conf_lo "0.000000"; conf_hi "32.900490"; cov "0.870968";
+chr13 Cufflinks transcript 9278482 9278551 1000 . . gene_id "CUFF.50519"; transcript_id "CUFF.50519.1"; FPKM "18.1055441999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "39.012026"; cov "1.157143";
+chr13 Cufflinks exon 9278482 9278551 1000 . . gene_id "CUFF.50519"; transcript_id "CUFF.50519.1"; exon_number "1"; FPKM "18.1055441999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "39.012026"; cov "1.157143";
+chr13 Cufflinks transcript 9278167 9278308 1000 . . gene_id "CUFF.50521"; transcript_id "CUFF.50521.1"; FPKM "17.8505365351"; frac "1.000000"; conf_lo "3.275634"; conf_hi "32.425439"; cov "1.140845";
+chr13 Cufflinks exon 9278167 9278308 1000 . . gene_id "CUFF.50521"; transcript_id "CUFF.50521.1"; exon_number "1"; FPKM "17.8505365351"; frac "1.000000"; conf_lo "3.275634"; conf_hi "32.425439"; cov "1.140845";
+chr13 Cufflinks transcript 9346823 9346849 1000 . . gene_id "CUFF.50523"; transcript_id "CUFF.50523.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 9346823 9346849 1000 . . gene_id "CUFF.50523"; transcript_id "CUFF.50523.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 9373600 9373693 1000 . . gene_id "CUFF.50525"; transcript_id "CUFF.50525.1"; FPKM "8.9885680425"; frac "1.000000"; conf_lo "0.000000"; conf_hi "21.700323"; cov "0.574468";
+chr13 Cufflinks exon 9373600 9373693 1000 . . gene_id "CUFF.50525"; transcript_id "CUFF.50525.1"; exon_number "1"; FPKM "8.9885680425"; frac "1.000000"; conf_lo "0.000000"; conf_hi "21.700323"; cov "0.574468";
+chr13 Cufflinks transcript 9353602 9373527 1000 - . gene_id "CUFF.50527"; transcript_id "CUFF.50527.1"; FPKM "16.2485653076"; frac "1.000000"; conf_lo "0.000000"; conf_hi "35.010792"; cov "1.038462";
+chr13 Cufflinks exon 9353602 9353648 1000 - . gene_id "CUFF.50527"; transcript_id "CUFF.50527.1"; exon_number "1"; FPKM "16.2485653076"; frac "1.000000"; conf_lo "0.000000"; conf_hi "35.010792"; cov "1.038462";
+chr13 Cufflinks exon 9373497 9373527 1000 - . gene_id "CUFF.50527"; transcript_id "CUFF.50527.1"; exon_number "2"; FPKM "16.2485653076"; frac "1.000000"; conf_lo "0.000000"; conf_hi "35.010792"; cov "1.038462";
+chr13 Cufflinks transcript 9386521 9386547 1000 . . gene_id "CUFF.50529"; transcript_id "CUFF.50529.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 9386521 9386547 1000 . . gene_id "CUFF.50529"; transcript_id "CUFF.50529.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 9391996 9392202 1000 . . gene_id "CUFF.50531"; transcript_id "CUFF.50531.1"; FPKM "12.2404495852"; frac "1.000000"; conf_lo "2.244186"; conf_hi "22.236713"; cov "0.782299";
+chr13 Cufflinks exon 9391996 9392202 1000 . . gene_id "CUFF.50531"; transcript_id "CUFF.50531.1"; exon_number "1"; FPKM "12.2404495852"; frac "1.000000"; conf_lo "2.244186"; conf_hi "22.236713"; cov "0.782299";
+chr13 Cufflinks transcript 9392422 9392467 1000 . . gene_id "CUFF.50533"; transcript_id "CUFF.50533.1"; FPKM "9.1839716956"; frac "1.000000"; conf_lo "0.000000"; conf_hi "27.551915"; cov "0.586957";
+chr13 Cufflinks exon 9392422 9392467 1000 . . gene_id "CUFF.50533"; transcript_id "CUFF.50533.1"; exon_number "1"; FPKM "9.1839716956"; frac "1.000000"; conf_lo "0.000000"; conf_hi "27.551915"; cov "0.586957";
+chr13 Cufflinks transcript 9392265 9392321 1000 . . gene_id "CUFF.50535"; transcript_id "CUFF.50535.1"; FPKM "14.8232525613"; frac "1.000000"; conf_lo "0.000000"; conf_hi "35.786497"; cov "0.947368";
+chr13 Cufflinks exon 9392265 9392321 1000 . . gene_id "CUFF.50535"; transcript_id "CUFF.50535.1"; exon_number "1"; FPKM "14.8232525613"; frac "1.000000"; conf_lo "0.000000"; conf_hi "35.786497"; cov "0.947368";
+chr13 Cufflinks transcript 9392577 9392603 1000 . . gene_id "CUFF.50537"; transcript_id "CUFF.50537.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 9392577 9392603 1000 . . gene_id "CUFF.50537"; transcript_id "CUFF.50537.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 9396631 9396825 1000 . . gene_id "CUFF.50539"; transcript_id "CUFF.50539.1"; FPKM "8.6659014974"; frac "1.000000"; conf_lo "0.000000"; conf_hi "17.331803"; cov "0.553846";
+chr13 Cufflinks exon 9396631 9396825 1000 . . gene_id "CUFF.50539"; transcript_id "CUFF.50539.1"; exon_number "1"; FPKM "8.6659014974"; frac "1.000000"; conf_lo "0.000000"; conf_hi "17.331803"; cov "0.553846";
+chr13 Cufflinks transcript 9397263 9397434 1000 . . gene_id "CUFF.50541"; transcript_id "CUFF.50541.1"; FPKM "17.1932493371"; frac "1.000000"; conf_lo "4.196374"; conf_hi "30.190124"; cov "1.098837";
+chr13 Cufflinks exon 9397263 9397434 1000 . . gene_id "CUFF.50541"; transcript_id "CUFF.50541.1"; exon_number "1"; FPKM "17.1932493371"; frac "1.000000"; conf_lo "4.196374"; conf_hi "30.190124"; cov "1.098837";
+chr13 Cufflinks transcript 9398210 9398294 1000 . . gene_id "CUFF.50543"; transcript_id "CUFF.50543.1"; FPKM "9.9402987764"; frac "1.000000"; conf_lo "0.000000"; conf_hi "23.998004"; cov "0.635294";
+chr13 Cufflinks exon 9398210 9398294 1000 . . gene_id "CUFF.50543"; transcript_id "CUFF.50543.1"; exon_number "1"; FPKM "9.9402987764"; frac "1.000000"; conf_lo "0.000000"; conf_hi "23.998004"; cov "0.635294";
+chr13 Cufflinks transcript 9406013 9406051 1000 . . gene_id "CUFF.50545"; transcript_id "CUFF.50545.1"; FPKM "10.8323768717"; frac "1.000000"; conf_lo "0.000000"; conf_hi "32.497131"; cov "0.692308";
+chr13 Cufflinks exon 9406013 9406051 1000 . . gene_id "CUFF.50545"; transcript_id "CUFF.50545.1"; exon_number "1"; FPKM "10.8323768717"; frac "1.000000"; conf_lo "0.000000"; conf_hi "32.497131"; cov "0.692308";
+chr13 Cufflinks transcript 9413644 9413670 1000 . . gene_id "CUFF.50547"; transcript_id "CUFF.50547.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 9413644 9413670 1000 . . gene_id "CUFF.50547"; transcript_id "CUFF.50547.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 9414053 9414143 1000 . . gene_id "CUFF.50549"; transcript_id "CUFF.50549.1"; FPKM "9.2848944615"; frac "1.000000"; conf_lo "0.000000"; conf_hi "22.415718"; cov "0.593407";
+chr13 Cufflinks exon 9414053 9414143 1000 . . gene_id "CUFF.50549"; transcript_id "CUFF.50549.1"; exon_number "1"; FPKM "9.2848944615"; frac "1.000000"; conf_lo "0.000000"; conf_hi "22.415718"; cov "0.593407";
+chr13 Cufflinks transcript 9415960 9416015 1000 . . gene_id "CUFF.50551"; transcript_id "CUFF.50551.1"; FPKM "15.0879534999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "36.425542"; cov "0.964286";
+chr13 Cufflinks exon 9415960 9416015 1000 . . gene_id "CUFF.50551"; transcript_id "CUFF.50551.1"; exon_number "1"; FPKM "15.0879534999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "36.425542"; cov "0.964286";
+chr13 Cufflinks transcript 9442325 9442351 1000 . . gene_id "CUFF.50553"; transcript_id "CUFF.50553.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 9442325 9442351 1000 . . gene_id "CUFF.50553"; transcript_id "CUFF.50553.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 9517895 9517921 1000 . . gene_id "CUFF.50555"; transcript_id "CUFF.50555.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 9517895 9517921 1000 . . gene_id "CUFF.50555"; transcript_id "CUFF.50555.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 9584154 9584180 1000 . . gene_id "CUFF.50558"; transcript_id "CUFF.50558.1"; FPKM "46.9402997776"; frac "1.000000"; conf_lo "0.000000"; conf_hi "101.142289"; cov "3.000000";
+chr13 Cufflinks exon 9584154 9584180 1000 . . gene_id "CUFF.50558"; transcript_id "CUFF.50558.1"; exon_number "1"; FPKM "46.9402997776"; frac "1.000000"; conf_lo "0.000000"; conf_hi "101.142289"; cov "3.000000";
+chr13 Cufflinks transcript 9583821 9583888 1000 . . gene_id "CUFF.50557"; transcript_id "CUFF.50557.1"; FPKM "12.4253734705"; frac "1.000000"; conf_lo "0.000000"; conf_hi "29.997505"; cov "0.794118";
+chr13 Cufflinks exon 9583821 9583888 1000 . . gene_id "CUFF.50557"; transcript_id "CUFF.50557.1"; exon_number "1"; FPKM "12.4253734705"; frac "1.000000"; conf_lo "0.000000"; conf_hi "29.997505"; cov "0.794118";
+chr13 Cufflinks transcript 9585768 9585937 1000 . . gene_id "CUFF.50561"; transcript_id "CUFF.50561.1"; FPKM "9.9402987764"; frac "1.000000"; conf_lo "0.000000"; conf_hi "19.880598"; cov "0.635294";
+chr13 Cufflinks exon 9585768 9585937 1000 . . gene_id "CUFF.50561"; transcript_id "CUFF.50561.1"; exon_number "1"; FPKM "9.9402987764"; frac "1.000000"; conf_lo "0.000000"; conf_hi "19.880598"; cov "0.635294";
+chr13 Cufflinks transcript 9586173 9593034 1000 - . gene_id "CUFF.50563"; transcript_id "CUFF.50563.1"; FPKM "10.3039682439"; frac "1.000000"; conf_lo "0.000000"; conf_hi "24.875980"; cov "0.658537";
+chr13 Cufflinks exon 9586173 9586218 1000 - . gene_id "CUFF.50563"; transcript_id "CUFF.50563.1"; exon_number "1"; FPKM "10.3039682439"; frac "1.000000"; conf_lo "0.000000"; conf_hi "24.875980"; cov "0.658537";
+chr13 Cufflinks exon 9592999 9593034 1000 - . gene_id "CUFF.50563"; transcript_id "CUFF.50563.1"; exon_number "2"; FPKM "10.3039682439"; frac "1.000000"; conf_lo "0.000000"; conf_hi "24.875980"; cov "0.658537";
+chr13 Cufflinks transcript 9609217 9609243 1000 . . gene_id "CUFF.50566"; transcript_id "CUFF.50566.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 9609217 9609243 1000 . . gene_id "CUFF.50566"; transcript_id "CUFF.50566.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 9607682 9607717 1000 . . gene_id "CUFF.50565"; transcript_id "CUFF.50565.1"; FPKM "23.4701498888"; frac "1.000000"; conf_lo "0.000000"; conf_hi "56.661954"; cov "1.500000";
+chr13 Cufflinks exon 9607682 9607717 1000 . . gene_id "CUFF.50565"; transcript_id "CUFF.50565.1"; exon_number "1"; FPKM "23.4701498888"; frac "1.000000"; conf_lo "0.000000"; conf_hi "56.661954"; cov "1.500000";
+chr13 Cufflinks transcript 9678669 9678695 1000 . . gene_id "CUFF.50569"; transcript_id "CUFF.50569.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 9678669 9678695 1000 . . gene_id "CUFF.50569"; transcript_id "CUFF.50569.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 9667710 9667736 1000 . . gene_id "CUFF.50571"; transcript_id "CUFF.50571.1"; FPKM "140.7837465978"; frac "1.000000"; conf_lo "46.915532"; conf_hi "234.651961"; cov "8.997626";
+chr13 Cufflinks exon 9667710 9667736 1000 . . gene_id "CUFF.50571"; transcript_id "CUFF.50571.1"; exon_number "1"; FPKM "140.7837465978"; frac "1.000000"; conf_lo "46.915532"; conf_hi "234.651961"; cov "8.997626";
+chr13 Cufflinks transcript 9667815 9668061 1000 . . gene_id "CUFF.50573"; transcript_id "CUFF.50573.1"; FPKM "87.1763440808"; frac "1.000000"; conf_lo "62.754693"; conf_hi "111.597996"; cov "5.571525";
+chr13 Cufflinks exon 9667815 9668061 1000 . . gene_id "CUFF.50573"; transcript_id "CUFF.50573.1"; exon_number "1"; FPKM "87.1763440808"; frac "1.000000"; conf_lo "62.754693"; conf_hi "111.597996"; cov "5.571525";
+chr13 Cufflinks transcript 9668143 9668170 1000 . . gene_id "CUFF.50575"; transcript_id "CUFF.50575.1"; FPKM "82.8583537693"; frac "1.000000"; conf_lo "12.143066"; conf_hi "153.573642"; cov "5.295558";
+chr13 Cufflinks exon 9668143 9668170 1000 . . gene_id "CUFF.50575"; transcript_id "CUFF.50575.1"; exon_number "1"; FPKM "82.8583537693"; frac "1.000000"; conf_lo "12.143066"; conf_hi "153.573642"; cov "5.295558";
+chr13 Cufflinks transcript 9688931 9688970 1000 . . gene_id "CUFF.50577"; transcript_id "CUFF.50577.1"; FPKM "21.1231348999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "50.995759"; cov "1.350000";
+chr13 Cufflinks exon 9688931 9688970 1000 . . gene_id "CUFF.50577"; transcript_id "CUFF.50577.1"; exon_number "1"; FPKM "21.1231348999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "50.995759"; cov "1.350000";
+chr13 Cufflinks transcript 9684078 9685570 1000 . . gene_id "CUFF.50579"; transcript_id "CUFF.50579.1"; FPKM "107.1082431700"; frac "1.000000"; conf_lo "96.097777"; conf_hi "118.118710"; cov "6.845392";
+chr13 Cufflinks exon 9684078 9685570 1000 . . gene_id "CUFF.50579"; transcript_id "CUFF.50579.1"; exon_number "1"; FPKM "107.1082431700"; frac "1.000000"; conf_lo "96.097777"; conf_hi "118.118710"; cov "6.845392";
+chr13 Cufflinks transcript 9690151 9690234 1000 . . gene_id "CUFF.50581"; transcript_id "CUFF.50581.1"; FPKM "10.0586356666"; frac "1.000000"; conf_lo "0.000000"; conf_hi "24.283695"; cov "0.642857";
+chr13 Cufflinks exon 9690151 9690234 1000 . . gene_id "CUFF.50581"; transcript_id "CUFF.50581.1"; exon_number "1"; FPKM "10.0586356666"; frac "1.000000"; conf_lo "0.000000"; conf_hi "24.283695"; cov "0.642857";
+chr13 Cufflinks transcript 9694461 9694537 1000 . . gene_id "CUFF.50583"; transcript_id "CUFF.50583.1"; FPKM "16.4595856363"; frac "1.000000"; conf_lo "0.000000"; conf_hi "35.465478"; cov "1.051948";
+chr13 Cufflinks exon 9694461 9694537 1000 . . gene_id "CUFF.50583"; transcript_id "CUFF.50583.1"; exon_number "1"; FPKM "16.4595856363"; frac "1.000000"; conf_lo "0.000000"; conf_hi "35.465478"; cov "1.051948";
+chr13 Cufflinks transcript 9696900 9696976 1000 . . gene_id "CUFF.50585"; transcript_id "CUFF.50585.1"; FPKM "10.9730570909"; frac "1.000000"; conf_lo "0.000000"; conf_hi "26.491303"; cov "0.701299";
+chr13 Cufflinks exon 9696900 9696976 1000 . . gene_id "CUFF.50585"; transcript_id "CUFF.50585.1"; exon_number "1"; FPKM "10.9730570909"; frac "1.000000"; conf_lo "0.000000"; conf_hi "26.491303"; cov "0.701299";
+chr13 Cufflinks transcript 9725686 9725787 1000 . . gene_id "CUFF.50587"; transcript_id "CUFF.50587.1"; FPKM "12.4253734705"; frac "1.000000"; conf_lo "0.000000"; conf_hi "26.772959"; cov "0.794118";
+chr13 Cufflinks exon 9725686 9725787 1000 . . gene_id "CUFF.50587"; transcript_id "CUFF.50587.1"; exon_number "1"; FPKM "12.4253734705"; frac "1.000000"; conf_lo "0.000000"; conf_hi "26.772959"; cov "0.794118";
+chr13 Cufflinks transcript 9725935 9726047 1000 . . gene_id "CUFF.50589"; transcript_id "CUFF.50589.1"; FPKM "11.2158238407"; frac "1.000000"; conf_lo "0.000000"; conf_hi "24.166742"; cov "0.716814";
+chr13 Cufflinks exon 9725935 9726047 1000 . . gene_id "CUFF.50589"; transcript_id "CUFF.50589.1"; exon_number "1"; FPKM "11.2158238407"; frac "1.000000"; conf_lo "0.000000"; conf_hi "24.166742"; cov "0.716814";
+chr13 Cufflinks transcript 9739796 9739868 1000 . . gene_id "CUFF.50591"; transcript_id "CUFF.50591.1"; FPKM "11.5743204931"; frac "1.000000"; conf_lo "0.000000"; conf_hi "27.942882"; cov "0.739726";
+chr13 Cufflinks exon 9739796 9739868 1000 . . gene_id "CUFF.50591"; transcript_id "CUFF.50591.1"; exon_number "1"; FPKM "11.5743204931"; frac "1.000000"; conf_lo "0.000000"; conf_hi "27.942882"; cov "0.739726";
+chr13 Cufflinks transcript 9740164 9740202 1000 . . gene_id "CUFF.50593"; transcript_id "CUFF.50593.1"; FPKM "21.6647537435"; frac "1.000000"; conf_lo "0.000000"; conf_hi "52.303342"; cov "1.384615";
+chr13 Cufflinks exon 9740164 9740202 1000 . . gene_id "CUFF.50593"; transcript_id "CUFF.50593.1"; exon_number "1"; FPKM "21.6647537435"; frac "1.000000"; conf_lo "0.000000"; conf_hi "52.303342"; cov "1.384615";
+chr13 Cufflinks transcript 9740296 9740330 1000 . . gene_id "CUFF.50595"; transcript_id "CUFF.50595.1"; FPKM "48.2814511998"; frac "1.000000"; conf_lo "0.000000"; conf_hi "96.562902"; cov "3.085714";
+chr13 Cufflinks exon 9740296 9740330 1000 . . gene_id "CUFF.50595"; transcript_id "CUFF.50595.1"; exon_number "1"; FPKM "48.2814511998"; frac "1.000000"; conf_lo "0.000000"; conf_hi "96.562902"; cov "3.085714";
+chr13 Cufflinks transcript 9741046 9741127 1000 . . gene_id "CUFF.50597"; transcript_id "CUFF.50597.1"; FPKM "10.3039682439"; frac "1.000000"; conf_lo "0.000000"; conf_hi "24.875980"; cov "0.658537";
+chr13 Cufflinks exon 9741046 9741127 1000 . . gene_id "CUFF.50597"; transcript_id "CUFF.50597.1"; exon_number "1"; FPKM "10.3039682439"; frac "1.000000"; conf_lo "0.000000"; conf_hi "24.875980"; cov "0.658537";
+chr13 Cufflinks transcript 9741590 9741694 1000 . . gene_id "CUFF.50599"; transcript_id "CUFF.50599.1"; FPKM "12.0703627999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "26.008017"; cov "0.771429";
+chr13 Cufflinks exon 9741590 9741694 1000 . . gene_id "CUFF.50599"; transcript_id "CUFF.50599.1"; exon_number "1"; FPKM "12.0703627999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "26.008017"; cov "0.771429";
+chr13 Cufflinks transcript 9741399 9741517 1000 . . gene_id "CUFF.50601"; transcript_id "CUFF.50601.1"; FPKM "24.8507469411"; frac "1.000000"; conf_lo "6.065348"; conf_hi "43.636146"; cov "1.588235";
+chr13 Cufflinks exon 9741399 9741517 1000 . . gene_id "CUFF.50601"; transcript_id "CUFF.50601.1"; exon_number "1"; FPKM "24.8507469411"; frac "1.000000"; conf_lo "6.065348"; conf_hi "43.636146"; cov "1.588235";
+chr13 Cufflinks transcript 9868979 9869072 1000 . . gene_id "CUFF.50603"; transcript_id "CUFF.50603.1"; FPKM "13.4828520638"; frac "1.000000"; conf_lo "0.000000"; conf_hi "29.051509"; cov "0.861702";
+chr13 Cufflinks exon 9868979 9869072 1000 . . gene_id "CUFF.50603"; transcript_id "CUFF.50603.1"; exon_number "1"; FPKM "13.4828520638"; frac "1.000000"; conf_lo "0.000000"; conf_hi "29.051509"; cov "0.861702";
+chr13 Cufflinks transcript 9872853 9872934 1000 . . gene_id "CUFF.50605"; transcript_id "CUFF.50605.1"; FPKM "15.4559523658"; frac "1.000000"; conf_lo "0.000000"; conf_hi "33.302949"; cov "0.987805";
+chr13 Cufflinks exon 9872853 9872934 1000 . . gene_id "CUFF.50605"; transcript_id "CUFF.50605.1"; exon_number "1"; FPKM "15.4559523658"; frac "1.000000"; conf_lo "0.000000"; conf_hi "33.302949"; cov "0.987805";
+chr13 Cufflinks transcript 9874731 9874997 1000 . . gene_id "CUFF.50607"; transcript_id "CUFF.50607.1"; FPKM "12.6580583670"; frac "1.000000"; conf_lo "3.707459"; conf_hi "21.608657"; cov "0.808989";
+chr13 Cufflinks exon 9874731 9874997 1000 . . gene_id "CUFF.50607"; transcript_id "CUFF.50607.1"; exon_number "1"; FPKM "12.6580583670"; frac "1.000000"; conf_lo "3.707459"; conf_hi "21.608657"; cov "0.808989";
+chr13 Cufflinks transcript 9875128 9875201 1000 . . gene_id "CUFF.50609"; transcript_id "CUFF.50609.1"; FPKM "22.8358215134"; frac "1.000000"; conf_lo "0.000000"; conf_hi "45.671643"; cov "1.459459";
+chr13 Cufflinks exon 9875128 9875201 1000 . . gene_id "CUFF.50609"; transcript_id "CUFF.50609.1"; exon_number "1"; FPKM "22.8358215134"; frac "1.000000"; conf_lo "0.000000"; conf_hi "45.671643"; cov "1.459459";
+chr13 Cufflinks transcript 9875323 9875349 1000 . . gene_id "CUFF.50611"; transcript_id "CUFF.50611.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 9875323 9875349 1000 . . gene_id "CUFF.50611"; transcript_id "CUFF.50611.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 9875425 9875480 1000 . . gene_id "CUFF.50613"; transcript_id "CUFF.50613.1"; FPKM "15.0879534999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "36.425542"; cov "0.964286";
+chr13 Cufflinks exon 9875425 9875480 1000 . . gene_id "CUFF.50613"; transcript_id "CUFF.50613.1"; exon_number "1"; FPKM "15.0879534999"; frac "1.000000"; conf_lo "0.000000"; conf_hi "36.425542"; cov "0.964286";
+chr13 Cufflinks transcript 9876121 9876172 1000 . . gene_id "CUFF.50615"; transcript_id "CUFF.50615.1"; FPKM "16.2485653076"; frac "1.000000"; conf_lo "0.000000"; conf_hi "39.227507"; cov "1.038462";
+chr13 Cufflinks exon 9876121 9876172 1000 . . gene_id "CUFF.50615"; transcript_id "CUFF.50615.1"; exon_number "1"; FPKM "16.2485653076"; frac "1.000000"; conf_lo "0.000000"; conf_hi "39.227507"; cov "1.038462";
+chr13 Cufflinks transcript 9969155 9969237 1000 . . gene_id "CUFF.50617"; transcript_id "CUFF.50617.1"; FPKM "8.6756763125"; frac "1.000000"; conf_lo "0.000000"; conf_hi "21.966038"; cov "0.554471";
+chr13 Cufflinks exon 9969155 9969237 1000 . . gene_id "CUFF.50617"; transcript_id "CUFF.50617.1"; exon_number "1"; FPKM "8.6756763125"; frac "1.000000"; conf_lo "0.000000"; conf_hi "21.966038"; cov "0.554471";
+chr13 Cufflinks transcript 9986765 9986791 1000 . . gene_id "CUFF.50619"; transcript_id "CUFF.50619.1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks exon 9986765 9986791 1000 . . gene_id "CUFF.50619"; transcript_id "CUFF.50619.1"; exon_number "1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks transcript 9987242 9987567 1000 . . gene_id "CUFF.50621"; transcript_id "CUFF.50621.1"; FPKM "10.3671827730"; frac "1.000000"; conf_lo "3.036478"; conf_hi "17.697888"; cov "0.662577";
+chr13 Cufflinks exon 9987242 9987567 1000 . . gene_id "CUFF.50621"; transcript_id "CUFF.50621.1"; exon_number "1"; FPKM "10.3671827730"; frac "1.000000"; conf_lo "3.036478"; conf_hi "17.697888"; cov "0.662577";
+chr13 Cufflinks transcript 10010160 10010265 1000 . . gene_id "CUFF.50623"; transcript_id "CUFF.50623.1"; FPKM "11.9564914528"; frac "1.000000"; conf_lo "0.000000"; conf_hi "25.762659"; cov "0.764151";
+chr13 Cufflinks exon 10010160 10010265 1000 . . gene_id "CUFF.50623"; transcript_id "CUFF.50623.1"; exon_number "1"; FPKM "11.9564914528"; frac "1.000000"; conf_lo "0.000000"; conf_hi "25.762659"; cov "0.764151";
+chr13 Cufflinks transcript 10010497 10010523 1000 . . gene_id "CUFF.50625"; transcript_id "CUFF.50625.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 10010497 10010523 1000 . . gene_id "CUFF.50625"; transcript_id "CUFF.50625.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 10012021 10012167 1000 . . gene_id "CUFF.50627"; transcript_id "CUFF.50627.1"; FPKM "11.4955836190"; frac "1.000000"; conf_lo "0.000000"; conf_hi "22.991167"; cov "0.734694";
+chr13 Cufflinks exon 10012021 10012167 1000 . . gene_id "CUFF.50627"; transcript_id "CUFF.50627.1"; exon_number "1"; FPKM "11.4955836190"; frac "1.000000"; conf_lo "0.000000"; conf_hi "22.991167"; cov "0.734694";
+chr13 Cufflinks transcript 10019657 10019683 1000 . . gene_id "CUFF.50629"; transcript_id "CUFF.50629.1"; FPKM "46.9402997776"; frac "1.000000"; conf_lo "0.000000"; conf_hi "101.142289"; cov "3.000000";
+chr13 Cufflinks exon 10019657 10019683 1000 . . gene_id "CUFF.50629"; transcript_id "CUFF.50629.1"; exon_number "1"; FPKM "46.9402997776"; frac "1.000000"; conf_lo "0.000000"; conf_hi "101.142289"; cov "3.000000";
+chr13 Cufflinks transcript 10024965 10025028 1000 . . gene_id "CUFF.50631"; transcript_id "CUFF.50631.1"; FPKM "13.2019593124"; frac "1.000000"; conf_lo "0.000000"; conf_hi "31.872349"; cov "0.843750";
+chr13 Cufflinks exon 10024965 10025028 1000 . . gene_id "CUFF.50631"; transcript_id "CUFF.50631.1"; exon_number "1"; FPKM "13.2019593124"; frac "1.000000"; conf_lo "0.000000"; conf_hi "31.872349"; cov "0.843750";
+chr13 Cufflinks transcript 10082104 10082206 1000 . . gene_id "CUFF.50633"; transcript_id "CUFF.50633.1"; FPKM "8.2031591844"; frac "1.000000"; conf_lo "0.000000"; conf_hi "19.804178"; cov "0.524272";
+chr13 Cufflinks exon 10082104 10082206 1000 . . gene_id "CUFF.50633"; transcript_id "CUFF.50633.1"; exon_number "1"; FPKM "8.2031591844"; frac "1.000000"; conf_lo "0.000000"; conf_hi "19.804178"; cov "0.524272";
+chr13 Cufflinks transcript 10086419 10086446 1000 . . gene_id "CUFF.50635"; transcript_id "CUFF.50635.1"; FPKM "60.3518139997"; frac "1.000000"; conf_lo "0.000000"; conf_hi "120.703628"; cov "3.857143";
+chr13 Cufflinks exon 10086419 10086446 1000 . . gene_id "CUFF.50635"; transcript_id "CUFF.50635.1"; exon_number "1"; FPKM "60.3518139997"; frac "1.000000"; conf_lo "0.000000"; conf_hi "120.703628"; cov "3.857143";
+chr13 Cufflinks transcript 10086886 10086930 1000 . . gene_id "CUFF.50637"; transcript_id "CUFF.50637.1"; FPKM "18.7761199110"; frac "1.000000"; conf_lo "0.000000"; conf_hi "45.329563"; cov "1.200000";
+chr13 Cufflinks exon 10086886 10086930 1000 . . gene_id "CUFF.50637"; transcript_id "CUFF.50637.1"; exon_number "1"; FPKM "18.7761199110"; frac "1.000000"; conf_lo "0.000000"; conf_hi "45.329563"; cov "1.200000";
+chr13 Cufflinks transcript 10096818 10096844 1000 . . gene_id "CUFF.50639"; transcript_id "CUFF.50639.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 10096818 10096844 1000 . . gene_id "CUFF.50639"; transcript_id "CUFF.50639.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 10111271 10111358 1000 . . gene_id "CUFF.50641"; transcript_id "CUFF.50641.1"; FPKM "9.6014249545"; frac "1.000000"; conf_lo "0.000000"; conf_hi "23.179890"; cov "0.613636";
+chr13 Cufflinks exon 10111271 10111358 1000 . . gene_id "CUFF.50641"; transcript_id "CUFF.50641.1"; exon_number "1"; FPKM "9.6014249545"; frac "1.000000"; conf_lo "0.000000"; conf_hi "23.179890"; cov "0.613636";
+chr13 Cufflinks transcript 10182192 10182228 1000 . . gene_id "CUFF.50643"; transcript_id "CUFF.50643.1"; FPKM "34.2537322701"; frac "1.000000"; conf_lo "0.000000"; conf_hi "73.806535"; cov "2.189189";
+chr13 Cufflinks exon 10182192 10182228 1000 . . gene_id "CUFF.50643"; transcript_id "CUFF.50643.1"; exon_number "1"; FPKM "34.2537322701"; frac "1.000000"; conf_lo "0.000000"; conf_hi "73.806535"; cov "2.189189";
+chr13 Cufflinks transcript 10189009 10189035 1000 . . gene_id "CUFF.50645"; transcript_id "CUFF.50645.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 10189009 10189035 1000 . . gene_id "CUFF.50645"; transcript_id "CUFF.50645.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 10197772 10197798 1000 . . gene_id "CUFF.50647"; transcript_id "CUFF.50647.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 10197772 10197798 1000 . . gene_id "CUFF.50647"; transcript_id "CUFF.50647.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 10200086 10200124 1000 . . gene_id "CUFF.50649"; transcript_id "CUFF.50649.1"; FPKM "21.6647537435"; frac "1.000000"; conf_lo "0.000000"; conf_hi "52.303342"; cov "1.384615";
+chr13 Cufflinks exon 10200086 10200124 1000 . . gene_id "CUFF.50649"; transcript_id "CUFF.50649.1"; exon_number "1"; FPKM "21.6647537435"; frac "1.000000"; conf_lo "0.000000"; conf_hi "52.303342"; cov "1.384615";
+chr13 Cufflinks transcript 10213412 10213536 1000 . . gene_id "CUFF.50651"; transcript_id "CUFF.50651.1"; FPKM "13.5188063359"; frac "1.000000"; conf_lo "0.000000"; conf_hi "27.037613"; cov "0.864000";
+chr13 Cufflinks exon 10213412 10213536 1000 . . gene_id "CUFF.50651"; transcript_id "CUFF.50651.1"; exon_number "1"; FPKM "13.5188063359"; frac "1.000000"; conf_lo "0.000000"; conf_hi "27.037613"; cov "0.864000";
+chr13 Cufflinks transcript 10223893 10223941 1000 . . gene_id "CUFF.50653"; transcript_id "CUFF.50653.1"; FPKM "17.2433754285"; frac "1.000000"; conf_lo "0.000000"; conf_hi "41.629191"; cov "1.102041";
+chr13 Cufflinks exon 10223893 10223941 1000 . . gene_id "CUFF.50653"; transcript_id "CUFF.50653.1"; exon_number "1"; FPKM "17.2433754285"; frac "1.000000"; conf_lo "0.000000"; conf_hi "41.629191"; cov "1.102041";
+chr13 Cufflinks transcript 10289392 10289437 1000 . . gene_id "CUFF.50655"; transcript_id "CUFF.50655.1"; FPKM "18.3679433912"; frac "1.000000"; conf_lo "0.000000"; conf_hi "44.344138"; cov "1.173913";
+chr13 Cufflinks exon 10289392 10289437 1000 . . gene_id "CUFF.50655"; transcript_id "CUFF.50655.1"; exon_number "1"; FPKM "18.3679433912"; frac "1.000000"; conf_lo "0.000000"; conf_hi "44.344138"; cov "1.173913";
+chr13 Cufflinks transcript 10326745 10326771 1000 . . gene_id "CUFF.50657"; transcript_id "CUFF.50657.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 10326745 10326771 1000 . . gene_id "CUFF.50657"; transcript_id "CUFF.50657.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 10346675 10346701 1000 . . gene_id "CUFF.50659"; transcript_id "CUFF.50659.1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks exon 10346675 10346701 1000 . . gene_id "CUFF.50659"; transcript_id "CUFF.50659.1"; exon_number "1"; FPKM "31.2935331850"; frac "1.000000"; conf_lo "0.000000"; conf_hi "75.549272"; cov "2.000000";
+chr13 Cufflinks transcript 10337071 10337097 1000 . . gene_id "CUFF.50661"; transcript_id "CUFF.50661.1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks exon 10337071 10337097 1000 . . gene_id "CUFF.50661"; transcript_id "CUFF.50661.1"; exon_number "1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks transcript 10337141 10337167 1000 . . gene_id "CUFF.50663"; transcript_id "CUFF.50663.1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks exon 10337141 10337167 1000 . . gene_id "CUFF.50663"; transcript_id "CUFF.50663.1"; exon_number "1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks transcript 10344376 10344402 1000 . . gene_id "CUFF.50665"; transcript_id "CUFF.50665.1"; FPKM "46.9402997776"; frac "1.000000"; conf_lo "0.000000"; conf_hi "101.142289"; cov "3.000000";
+chr13 Cufflinks exon 10344376 10344402 1000 . . gene_id "CUFF.50665"; transcript_id "CUFF.50665.1"; exon_number "1"; FPKM "46.9402997776"; frac "1.000000"; conf_lo "0.000000"; conf_hi "101.142289"; cov "3.000000";
+chr13 Cufflinks transcript 10344976 10345002 1000 . . gene_id "CUFF.50667"; transcript_id "CUFF.50667.1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks exon 10344976 10345002 1000 . . gene_id "CUFF.50667"; transcript_id "CUFF.50667.1"; exon_number "1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks transcript 10345008 10345034 1000 . . gene_id "CUFF.50669"; transcript_id "CUFF.50669.1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks exon 10345008 10345034 1000 . . gene_id "CUFF.50669"; transcript_id "CUFF.50669.1"; exon_number "1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks transcript 10345484 10345510 1000 . . gene_id "CUFF.50671"; transcript_id "CUFF.50671.1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks exon 10345484 10345510 1000 . . gene_id "CUFF.50671"; transcript_id "CUFF.50671.1"; exon_number "1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks transcript 10345538 10345564 1000 . . gene_id "CUFF.50673"; transcript_id "CUFF.50673.1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
+chr13 Cufflinks exon 10345538 10345564 1000 . . gene_id "CUFF.50673"; transcript_id "CUFF.50673.1"; exon_number "1"; FPKM "15.6467665925"; frac "1.000000"; conf_lo "0.000000"; conf_hi "46.940300"; cov "1.000000";
--- a/lib/galaxy/datatypes/registry.py
+++ b/lib/galaxy/datatypes/registry.py
@@ -158,6 +158,7 @@ class Registry( object ):
'fasta' : sequence.Fasta(),
'fastq' : sequence.Fastq(),
'fastqsanger' : sequence.FastqSanger(),
+ 'gtf' : interval.Gtf(),
'gff' : interval.Gff(),
'gff3' : interval.Gff3(),
'genetrack' : tracks.GeneTrack(),
@@ -190,6 +191,7 @@ class Registry( object ):
'fasta' : 'text/plain',
'fastq' : 'text/plain',
'fastqsanger' : 'text/plain',
+ 'gtf' : 'text/plain',
'gff' : 'text/plain',
'gff3' : 'text/plain',
'interval' : 'text/plain',
@@ -228,6 +230,7 @@ class Registry( object ):
sequence.Axt(),
interval.Bed(),
interval.CustomTrack(),
+ interval.Gtf(),
interval.Gff(),
interval.Gff3(),
tabular.Pileup(),
1
0

galaxy-dist commit c02ecbcc8dab: New Feature: Administrative Job Lock.
by commits-noreply@bitbucket.org 29 Jun '10
by commits-noreply@bitbucket.org 29 Jun '10
29 Jun '10
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User Dannon Baker <dannon.baker(a)emory.edu>
# Date 1277490892 14400
# Node ID c02ecbcc8dab54e7007b35db5a05e31211d77b01
# Parent df5010a5df581674896beec9b35ca50bf477f380
New Feature: Administrative Job Lock.
Admins can now lock (and unlock) all job dispatching. New jobs will remain in the job queue in the 'waiting' state until the lock is removed. Existing dispatched jobs are unaffected, and jobs can still be submitted, but they will not dispatch.
--- a/lib/galaxy/jobs/__init__.py
+++ b/lib/galaxy/jobs/__init__.py
@@ -73,6 +73,7 @@ class JobQueue( object ):
"""Start the job manager"""
self.app = app
self.sa_session = app.model.context
+ self.job_lock = False
# Should we read jobs form the database, or use an in memory queue
self.track_jobs_in_database = app.config.get_bool( 'track_jobs_in_database', False )
# Keep track of the pid that started the job manager, only it
@@ -197,8 +198,13 @@ class JobQueue( object ):
elif job_state == JOB_INPUT_DELETED:
log.info( "job %d unable to run: one or more inputs deleted" % job.job_id )
elif job_state == JOB_READY:
- self.dispatcher.put( job )
- log.debug( "job %d dispatched" % job.job_id)
+ if self.job_lock:
+ log.info("Job dispatch attempted for %s, but prevented by administrative lock." % job.job_id)
+ if not self.track_jobs_in_database:
+ new_waiting.append( job )
+ else:
+ self.dispatcher.put( job )
+ log.debug( "job %d dispatched" % job.job_id)
elif job_state == JOB_DELETED:
msg = "job %d deleted by user while still queued" % job.job_id
job.info = msg
--- a/lib/galaxy/web/base/controller.py
+++ b/lib/galaxy/web/base/controller.py
@@ -1404,7 +1404,8 @@ class Admin( object ):
@web.expose
@web.require_admin
- def jobs( self, trans, stop = [], stop_msg = None, cutoff = 180, **kwd ):
+ def jobs( self, trans, stop = [], stop_msg = None, cutoff = 180, job_lock = None, **kwd ):
+ # DBTODO admin job lock.
deleted = []
msg = None
status = None
@@ -1425,6 +1426,10 @@ class Admin( object ):
msg += ' for deletion: '
msg += ', '.join( deleted )
status = 'done'
+ if job_lock == 'lock':
+ trans.app.job_manager.job_queue.job_lock = True
+ elif job_lock == 'unlock':
+ trans.app.job_manager.job_queue.job_lock = False
cutoff_time = datetime.utcnow() - timedelta( seconds=int( cutoff ) )
jobs = trans.sa_session.query( trans.app.model.Job ) \
.filter( and_( trans.app.model.Job.table.c.update_time < cutoff_time,
@@ -1445,7 +1450,8 @@ class Admin( object ):
last_updated = last_updated,
cutoff = cutoff,
msg = msg,
- status = status )
+ status = status,
+ job_lock = trans.app.job_manager.job_queue.job_lock )
## ---- Utility methods -------------------------------------------------------
--- a/templates/admin/jobs.mako
+++ b/templates/admin/jobs.mako
@@ -110,5 +110,30 @@
</div></div></div>
+ <p/>
+ <div class="toolForm">
+ <div class="toolFormTitle">
+ Administrative Job Lock
+ </div>
+ <div class="toolFormBody">
+ %if job_lock==True:
+ <div class="form-row">
+ <p>All job execution is currently locked. Click here to unlock.</p>
+ <input type='hidden' name='job_lock' value='unlock'/>
+ </div>
+ <div class="form-row">
+ <input type="submit" class="primary-button" name="submit" value="Unlock">
+ </div>
+ %else:
+ <div class="form-row">
+ <p>To prevent new jobs from dispatching, you can lock down the job queue here.</p>
+ <input type='hidden' name='job_lock' value='lock'/>
+ </div>
+ <div class="form-row">
+ <input type="submit" class="primary-button" name="submit" value="Lock">
+ </div>
+ %endif
+ </div>
+ </div></form>
1
0

galaxy-dist commit df5010a5df58: Changed the way sam_indel_filter expects quality score cutoffs and fixed bug so it checks qualities for correct bases in all cases
by commits-noreply@bitbucket.org 29 Jun '10
by commits-noreply@bitbucket.org 29 Jun '10
29 Jun '10
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User Kelly Vincent <kpvincent(a)bx.psu.edu>
# Date 1277401418 14400
# Node ID df5010a5df581674896beec9b35ca50bf477f380
# Parent 42a4c30c7486b95ff8ce9c5fec116e76855996c7
Changed the way sam_indel_filter expects quality score cutoffs and fixed bug so it checks qualities for correct bases in all cases
--- a/tools/samtools/sam_indel_filter.py
+++ b/tools/samtools/sam_indel_filter.py
@@ -26,14 +26,26 @@ def __main__():
# prep output file
output = open( options.output, 'wb' )
# patterns
- pat_indel = re.compile( '(?P<before_match>(\d+[MIDNSHP])*)(?P<lmatch>\d+)M(?P<ins_del_width>\d+)(?P<ins_del>[ID])(?P<rmatch>\d+)M' )
+ pat_indel = re.compile( '(?P<before_match>(\d+[MNSHP])*)(?P<lmatch>\d+)M(?P<ins_del_width>\d+)(?P<ins_del>[ID])(?P<rmatch>\d+)M(?P<after_match>(\d+[MNSHP])*)' )
pat_matches = re.compile( '(\d+[MIDNSHP])+' )
- qual_thresh = int( options.quality_threshold )
- adj_bases = int( options.adjacent_bases )
+ try:
+ qual_thresh = int( options.quality_threshold ) + 33
+ if qual_thresh < 33 or qual_thresh > 126:
+ raise ValueError
+ except ValueError:
+ stop_err( 'Your quality threshold should be an integer between 0 and 93, inclusive.' )
+ try:
+ adj_bases = int( options.adjacent_bases )
+ if adj_bases < 1:
+ raise ValueError
+ except ValueError:
+ stop_err( 'The number of adjacent bases should be an integer greater than 1.' )
# record lines skipped because of more than one indel
multi_indel_lines = 0
# go through all lines in input file
- for line in open( options.input, 'rb' ):
+ for i,line in enumerate(open( options.input, 'rb' )):
+ if i > 1000:
+ break
if line and not line.startswith( '#' ) and not line.startswith( '@' ) :
split_line = line.split( '\t' )
cigar = split_line[5]
@@ -52,15 +64,15 @@ def __main__():
if pre_left_groups:
for pl in pre_left_groups.groups():
if pl.endswith( 'M' ) or pl.endswith( 'S' ) or pl.endswith( 'P' ):
- pre_left += int( pl[:-1] )
+ pre_left += pl[:-1]
parts[ 'pre_left' ] = pre_left
matches.append( parts )
- cigar_copy = cigar_copy[ len( parts[ 'lmatch' ] ) : ]
+ cigar_copy = cigar_copy[ len( parts[ 'lmatch' ] ) + 1 : ]
# see if matches meet filter requirements
if len( matches ) > 1:
multi_indel_lines += 1
elif len( matches ) == 1:
- pre_left = matches[0][ 'pre_left' ]
+ pre_left = int( matches[0][ 'pre_left' ] )
left = int( matches[0][ 'lmatch' ] )
right = int( matches[0][ 'rmatch' ] )
if matches[0][ 'ins_del' ] == 'D':
@@ -69,25 +81,23 @@ def __main__():
middle = 0
# if there are enough adjacent bases to check, then do so
if left >= adj_bases and right >= adj_bases:
- qual = split_line[10]
- left_bases = qual[ pre_left : pre_left + left ][ -adj_bases : ]
- right_bases = qual[ pre_left + left + middle - 1 : pre_left + left + middle + right ][ : adj_bases ]
+ quals = split_line[10]
+ left_quals = quals[ pre_left : pre_left + left ][ -adj_bases : ]
+ middle_quals = quals[ pre_left + left : pre_left + left + middle ]
+ right_quals = quals[ pre_left + left + middle : pre_left + left + middle + right ][ : adj_bases ]
qual_thresh_met = True
- for l in left_bases:
+ for l in left_quals:
if ord( l ) < qual_thresh:
qual_thresh_met = False
break
if qual_thresh_met:
- for r in right_bases:
+ for r in right_quals:
if ord( r ) < qual_thresh:
qual_thresh_met = False
break
# if filter reqs met, output line
if qual_thresh_met:
output.write( line )
- # error if there are multiple indels
- elif len( matches ) > 1:
- stop_err( 'There is more than one indel present in the alignment:\n%s' % line )
# close out file
output.close()
# if skipped lines because of more than one indel, output message
--- a/tools/samtools/sam_indel_filter.xml
+++ b/tools/samtools/sam_indel_filter.xml
@@ -9,7 +9,7 @@
</command><inputs><param format="sam" name="input1" type="data" label="Select dataset to filter" />
- <param name="quality_threshold" type="integer" value="40" label="Quality threshold for adjacent bases" help="You need to give the true value, not offset (see chart below), regardless of source FASTQ type" />
+ <param name="quality_threshold" type="integer" value="40" label="Quality threshold for adjacent bases" help="Takes Phred value assuming Sanger scale; usually between 0 and 40, but up to 93" /><param name="adjacent_bases" type="integer" value="1" label="The number of adjacent bases to match on either side of the indel" help="If one side is shorter than this width, it will still match if the long-enough side matches" /></inputs><outputs>
@@ -18,19 +18,19 @@
<tests><test><param name="input1" value="sam_indel_filter_in1.sam" ftype="sam"/>
- <param name="quality_threshold" value="47"/>
+ <param name="quality_threshold" value="14"/><param name="adjacent_bases" value="2"/><output name="out_file1" file="sam_indel_filter_out1.sam" ftype="sam"/></test><test><param name="input1" value="sam_indel_filter_in1.sam" ftype="sam"/>
- <param name="quality_threshold" value="62"/>
+ <param name="quality_threshold" value="29"/><param name="adjacent_bases" value="5"/><output name="out_file1" file="sam_indel_filter_out2.sam" ftype="sam"/></test><test><param name="input1" value="sam_indel_filter_in2.sam" ftype="sam"/>
- <param name="quality_threshold" value="40"/>
+ <param name="quality_threshold" value="7"/><param name="adjacent_bases" value="1"/><output name="out_file1" file="sam_indel_filter_out3.sam" ftype="sam"/></test>
@@ -39,7 +39,7 @@
**What it does**
-Allows extracting indels from SAM. Currently it can handle SAM with alignments with only one insertion or one deletion, and will throw an error if it encounters an alignment with more than one. It matches CIGAR strings (column 6 in the SAM file) like 5M3I5M or 4M2D10M, so there must be a match or mismatch of sufficient length on either side of the indel.
+Allows extracting indels from SAM. Currently it can handle SAM with alignments with only one insertion or one deletion, and will skip that alignment if it encounters one with more than one indel. It matches CIGAR strings (column 6 in the SAM file) like 5M3I5M or 4M2D10M, so there must be a match or mismatch of sufficient length on either side of the indel.
-----
@@ -49,10 +49,7 @@ Suppose you have the following::
r770 89 ref 116 37 17M1I5M = 72131356 0 CACACTGTGACAGACAGCGCAGC 00/02!!0//1200210AA44/1 XT:A:U CM:i:2 SM:i:37 AM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:1 XG:i:1 MD:Z:22
r770 181 ref 116 0 24M = 72131356 0 TTGGTGCGCGCGGTTGAGGGTTGG $$(#%%#$%#%####$%%##$###
- r1945 113 ref 181247988 0 23M 41710908 41710908 0 GAGAGAGAGAGAGAGAGAGAGAG PQRVUMNXYRPUXYXWXSOSZ]M XT:A:R CM:i:0 SM:i:0 AM:i:0 X0:i:163148 XM:i:0 XO:i:0 XG:i:0 MD:Z:23
r1945 177 ref 41710908 0 23M 190342418 181247988 0 AGAGAGAGAGAGAGAGAGAGAGA SQQWZYURVYWX]]YXTSY]]ZM XT:A:R CM:i:0 SM:i:0 AM:i:0 X0:i:163148 XM:i:0 XO:i:0 XG:i:0 MD:Z:23
- r2363 115 ref 19671878 0 23M = 19671877 -1 AGAGAGAGAGAGAGAGAGAGTCT 77543:<55#"4!&=964518A> XT:A:R CM:i:2 SM:i:0 AM:i:0 X0:i:4 X1:i:137 XM:i:2 XO:i:0 XG:i:0 MD:Z:23
- r2363 179 ref 19671877 0 23M = 19671878 1 GAGAGAGAGAGAGAGAGAGAGTC LE7402DD34FL:27AKE>;432 XT:A:R CM:i:0 SM:i:0 AM:i:0 X0:i:265 XM:i:0 XO:i:0 XG:i:0 MD:Z:23
r3671 117 ref 190342418 0 24M = 190342418 0 CTGGCGTTCTCGGCGTGGATGGGT #####$$##$#%#%%###%$#$##
r3671 153 ref 190342418 37 16M1I6M = 190342418 0 TCTAACTTAGCCTCATAATAGCT /<<!"0///////00/!!0121/ XT:A:U CM:i:2 SM:i:37 AM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:1 XG:i:1 MD:Z:22
r3824 117 ref 80324999 0 24M = 80324999 0 TCCAGTCGCGTTGTTAGGTTCGGA #$#$$$#####%##%%###**#+/
1
0

galaxy-dist commit 42a4c30c7486: More bug fixes for the job wrapper user property.
by commits-noreply@bitbucket.org 29 Jun '10
by commits-noreply@bitbucket.org 29 Jun '10
29 Jun '10
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User Nate Coraor <nate(a)bx.psu.edu>
# Date 1277395476 14400
# Node ID 42a4c30c7486b95ff8ce9c5fec116e76855996c7
# Parent a9afce9276da25ad1a56c185016fa19ecf242ccb
More bug fixes for the job wrapper user property.
--- a/lib/galaxy/jobs/__init__.py
+++ b/lib/galaxy/jobs/__init__.py
@@ -712,12 +712,16 @@ class JobWrapper( object ):
@property
def user( self ):
job = self.sa_session.query( model.Job ).get( self.job_id )
- if job.user is None and job.galaxy_session is not None:
+ if job.user is not None:
+ return job.user.email
+ elif job.galaxy_session is not None and job.galaxy_session.user is not None:
+ return job.galaxy_session.user.email
+ elif job.history is not None and job.history.user is not None:
+ return job.history.user.email
+ elif job.galaxy_session is not None:
return 'anonymous@' + job.galaxy_session.remote_addr.split()[-1]
- elif job.user is None:
+ else:
return 'anonymous@unknown'
- else:
- return job.history.user.email
class DefaultJobDispatcher( object ):
def __init__( self, app ):
1
0

galaxy-dist commit 7c27ca4b9431: Bug fix for importing a history when not logged in.
by commits-noreply@bitbucket.org 29 Jun '10
by commits-noreply@bitbucket.org 29 Jun '10
29 Jun '10
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User Dan Blankenberg <dan(a)bx.psu.edu>
# Date 1277485525 14400
# Node ID 7c27ca4b9431ae6eda0c4e9835b195876a2bd159
# Parent 4dd860651b7e46b24f9942e06bfacdbf6ab3b28e
Bug fix for importing a history when not logged in.
--- a/lib/galaxy/web/controllers/history.py
+++ b/lib/galaxy/web/controllers/history.py
@@ -724,6 +724,7 @@ class HistoryController( BaseController,
"""Import another user's history via a shared URL"""
msg = ""
user = trans.get_user()
+ user_history = trans.get_history()
# Set referer message
if 'referer' in kwd:
referer = kwd['referer']
1
0

galaxy-dist commit d666e89f178e: Fixed a bug in column_join where it failed when only two files were being joined
by commits-noreply@bitbucket.org 29 Jun '10
by commits-noreply@bitbucket.org 29 Jun '10
29 Jun '10
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User Kelly Vincent <kpvincent(a)bx.psu.edu>
# Date 1277488422 14400
# Node ID d666e89f178eddb4175c388e81d8758096de72df
# Parent 7c27ca4b9431ae6eda0c4e9835b195876a2bd159
Fixed a bug in column_join where it failed when only two files were being joined
--- a/tools/new_operations/column_join.py
+++ b/tools/new_operations/column_join.py
@@ -157,11 +157,8 @@ def __main__():
inputs = [ options.input1, options.input2 ]
if options.fill_options_file == "None":
inputs.extend( args )
- else:
- try:
- col = int( args[0] )
- except ValueError:
- inputs.extend( args )
+ elif len( args ) > 0:
+ inputs.extend( args )
fill_options = None
if options.fill_options_file != "None" and options.fill_options_file is not None:
try:
1
0

galaxy-dist commit 1f467b4962cc: Corrected bug in column_join that resulted in some items incorrectly being listed on more than one line
by commits-noreply@bitbucket.org 29 Jun '10
by commits-noreply@bitbucket.org 29 Jun '10
29 Jun '10
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User Kelly Vincent <kpvincent(a)bx.psu.edu>
# Date 1277392524 14400
# Node ID 1f467b4962cc6b01cbdc829407e08169683ce8ce
# Parent 8adc2157e02a8b144697147b5e5a64833f0d1964
Corrected bug in column_join that resulted in some items incorrectly being listed on more than one line
--- a/tools/new_operations/column_join.py
+++ b/tools/new_operations/column_join.py
@@ -3,14 +3,14 @@
"""
This tool takes a tab-delimited text file as input and creates filters on columns based on certain properties. The tool will skip over invalid lines within the file, informing the user about the number of lines skipped.
-usage: %prog output input1 input2 column1[,column2[,column3[,...]]] hinge1[,hinge2[,hinge3[,...]]] [other_input1 [other_input2 [other_input3 ...]]]
- output: the output pileup
- input1: the pileup file to start with
- input2: the second pileup file to join
- hinge: the columns to be used for matching
- columns: the columns that should appear in the output
+usage: %prog -o output -1 input1 -2 input2 -c column1[,column2[,column3[,...]]] -g hinge1[,hinge2[,hinge3[,...]]] -f <fill_options_file> [other_input1 [other_input2 [other_input3 ...]]]
+ -o, output=0: the output pileup
+ -1, input1=1: the pileup file to start with
+ -2, input2=2: the second pileup file to join
+ -g, hinge=h: the columns to be used for matching
+ -c, columns=c: the columns that should appear in the output
+ -f, fill_options_file=f: the file specifying the fill value to use
other_inputs: the other input files to join
-
"""
import optparse, os, re, struct, sys, tempfile
@@ -31,63 +31,87 @@ def stop_err( msg ):
sys.stderr.write( msg )
sys.exit()
+def split_nums( text ):
+ """
+ Splits a string into pieces of numbers and non-numbers, like 'abc23B3' --> [ 'abc', 23, 'B', 3 ]
+ """
+ split_t = []
+ c = ''
+ n = ''
+ for ch in text:
+ try:
+ v = int( ch )
+ n += ch
+ if c:
+ split_t.append( ''.join( c ) )
+ c = ''
+ except ValueError:
+ c += ch
+ if n:
+ split_t.append( int( ''.join( n ) ) )
+ n = ''
+ if c:
+ split_t.append( ''.join( c ) )
+ if n:
+ split_t.append( int( ''.join( n ) ) )
+ return split_t
+
def hinge_compare( hinge1, hinge2 ):
"""
Compares items like 'chr10' and 'chrM' or 'scaffold2' and scaffold10' so that
first part handled as text but last part as number
"""
- pat = re.compile( '(?P<text>\D*)(?P<number>\d+)?' )
split_hinge1 = hinge1.split( '\t' )
split_hinge2 = hinge2.split( '\t' )
- for i in range( len( split_hinge1 ) ):
- if split_hinge1[ i ] == split_hinge2[ i ]:
+ # quick check if either hinge is empty
+ if not ''.join( split_hinge2 ):
+ if ''.join( split_hinge1 ):
+ return 1
+ elif not ''.join( split_hinge1 ):
+ return 0
+ else:
+ if not ''.join( split_hinge1 ):
+ return -1
+ # go through all parts of the hinges and compare
+ for i, sh1 in enumerate( split_hinge1 ):
+ # if these hinge segments are the same, just move on to the next ones
+ if sh1 == split_hinge2[ i ]:
continue
- try:
- if int( split_hinge1[ i ] ) > int( split_hinge2[ i ] ):
+ # check all parts of each hinge
+ h1 = split_nums( sh1 )
+ h2 = split_nums( split_hinge2[ i ] )
+ for j, h in enumerate( h1 ):
+ # if second hinge has no more parts, first is considered larger
+ if j > 0 and len( h2 ) <= j:
return 1
- else:
- return -1
- except ValueError:
- try:
- if float( split_hinge1[ i ] ) > float( split_hinge2[ i ] ):
+ # if these two parts are the same, move on to next
+ if h == h2[ j ]:
+ continue
+ # do actual comparison, depending on whether letter or number
+ if type( h ) == int:
+ if type( h2[ j ] ) == int:
+ if h > h2[ j ]:
+ return 1
+ elif h < h2[ j ]:
+ return -1
+ # numbers are less than letters
+ elif type( h2[ j ] ) == str:
+ return -1
+ elif type( h ) == str:
+ if type( h2[ j ] ) == str:
+ if h > h2[ j ]:
+ return 1
+ elif h < h2[ j ]:
+ return -1
+ # numbers are less than letters
+ elif type( h2[ j ] ) == int:
return 1
- else:
- return -1
- except ValueError:
- return ref_compare( split_hinge1[ i ], split_hinge2[ i ])
- return 0
-
-def ref_compare( ref1, ref2 ):
- """
- Compares items like 'chr10' and 'chrM' or 'scaffold2' and scaffold10' so that
- first part handled as text but last part as number
- """
- pat = re.compile( '(?P<text>\D*)(?P<number>\d+)?' )
- r1 = pat.match( ref1 )
- r2 = pat.match( ref2 )
- if not r2:
+ # if all else has failed, just do basic string comparison
+ if hinge1 > hinge2:
return 1
- elif not r1:
- return -1
- text1, num1 = r1.groupdict()[ 'text' ].strip(), r1.groupdict()[ 'number' ]
- text2, num2 = r2.groupdict()[ 'text' ].strip(), r2.groupdict()[ 'number' ]
- if text2 == '' and ( num2 == '' or num2 is None ):
- return 1
- elif text1 == '' and ( num1 == '' or num1 is None ):
- return -1
- if text1 > text2:
- return 1
- elif text1 == text2:
- if not ( num1 is None or num2 is None ):
- num1 = int( num1 )
- num2 = int( num2 )
- if num1 > num2:
- return 1
- elif num1 == num2:
- return 0
- elif num1 < num2:
- return -1
- elif text1 < text2:
+ elif hinge1 == hinge2:
+ return 0
+ elif hinge1 < hinge2:
return -1
def hinge_sort( infile, outfile, hinge ):
@@ -119,49 +143,18 @@ def hinge_sort( infile, outfile, hinge )
fout.close()
fin.close()
-def min_chr_pos( chr_pos ):
- """Given line and hinge, identifies the 'smallest' one, from left to right"""
- if len( chr_pos ) == 0 and ''.join( chr_pos ):
- return ''
- min_loc = len( chr_pos )
- min_hinge = []
- loc = 0
- for c_pos in chr_pos:
- if c_pos.strip():
- split_c = c_pos.split( '\t' )
-
-
- ref, pos = c_pos.split( '\t' )[:2]
- pos = int( pos )
- if not min_hinge:
- min_hinge = split_c
- min_loc = loc
- else:
- ref_comp = ref_compare( ref, min_ref_pos[0] )
- if ref_comp < 0:
- min_ref_pos = [ ref, pos ]
- min_loc = loc
- elif ref_comp == 0 and pos < min_ref_pos[1]:
- min_ref_pos[1] = pos
- min_loc = loc
- loc += 1
- return '%s\t%s' % tuple( min_ref_pos ), min_loc
-
def __main__():
parser = optparse.OptionParser()
- parser.add_option( '', '--output', dest='output', help='' )
- parser.add_option( '', '--input1', dest='input1', help='' )
- parser.add_option( '', '--input2', dest='input2', help='' )
- parser.add_option( '', '--hinge', dest='hinge', help='' )
- parser.add_option( '', '--columns', dest='columns', help='' )
- parser.add_option( '', '--fill_options_file', dest='fill_options_file', default=None, help='' )
+ parser.add_option( '-o', '--output', dest='output', help='The name of the output file' )
+ parser.add_option( '-1', '--input1', dest='input1', help='The name of the first input file' )
+ parser.add_option( '-2', '--input2', dest='input2', help='The name of the second input file' )
+ parser.add_option( '-g', '--hinge', dest='hinge', help='The "hinge" to use (the value to compare)' )
+ parser.add_option( '-c', '--columns', dest='columns', help='The columns to include in the output file' )
+ parser.add_option( '-f', '--fill_options_file', dest='fill_options_file', default=None, help='The file specifying the fill value to use' )
(options, args) = parser.parse_args()
- output = options.output
- input1 = options.input1
- input2 = options.input2
hinge = int( options.hinge )
cols = [ int( c ) for c in str( options.columns ).split( ',' ) if int( c ) > hinge ]
- inputs = [ input1, input2 ]
+ inputs = [ options.input1, options.input2 ]
if options.fill_options_file == "None":
inputs.extend( args )
else:
@@ -201,7 +194,7 @@ def __main__():
tmp_input_files.append( tmp_file )
# cycle through files, getting smallest line of all files one at a time
# also have to keep track of vertical position of extra columns
- fout = file( output, 'w' )
+ fout = file( options.output, 'w' )
old_current = ''
first_line = True
current_lines = [ f.readline() for f in tmp_input_files ]
@@ -272,5 +265,6 @@ def __main__():
fout.close()
for f in tmp_input_files:
os.unlink( f.name )
+ file('/afs/bx.psu.edu/user/kpvincent/galaxy-commit/actual_out', 'w').write(file(fout.name,'r').read())
if __name__ == "__main__" : __main__()
--- /dev/null
+++ b/test-data/column_join_in10.pileup
@@ -0,0 +1,26 @@
+0610009D07Rik 2 1.41 1.41 -0.24 12/12 2 1
+1110002N22Rik 2 1.70 1.70 -0.06 10/12 2 1
+1110008L16Rik 3 1.73 1.73 -0.54 12/12 2 1
+1110054O05Rik 1 1.55 1.55 1.14 5/12 1 1
+Actg1 2 4.24 4.24 2.36 4/12 2 1
+Actl6a 2 1.55 1.55 1.00 10/12 1 1
+Actn1 1 3.46 3.46 3.17 1/12 1 1
+Actn4 1 3.46 3.46 3.17 1/12 1 1
+Bnc2 1 2.00 2.00 1.67 3/12 1 1
+Bub3 2 1.89 1.89 1.02 9/12 2 1
+Cad 4 4.90 4.90 3.09 2/12 1 1
+Calm1;Calm3;Calm2 2 2.83 2.83 2.57 3/12 1 1
+E130012A19Rik 2 5.66 5.66 1.50 3/12 2 1
+E2f6 2 3.39 3.39 1.80 5/12 2 1
+Gm12620 1 3.46 3.46 3.17 1/12 1 1
+Gm13092;LOC677017 1 1.15 1.15 0.29 9/12 1 1
+Gm14173;Rpl37a;Gm4149 1 3.00 3.00 1.37 4/12 2 1
+Gm14393;2210418O10Rik;Gm14296;Gm14401;RP23-330D3.5 1 3.46 3.46 3.17 1/12 1 1
+Gm189 1 1.20 1.20 0.16 10/12 2 1
+Sfrs7 1 1.71 1.71 0.18 7/12 2 1
+Sin3a 1 1.71 1.71 -0.12 7/12 2 1
+Ski 1 2.45 2.45 2.13 2/12 1 1
+Skil 1 2.00 2.00 1.03 3/12 1 1
+Tubb2c 1 2.00 2.00 1.67 3/12 1 1
+Tubb2c-ps1 1 12.00 12.00 3.17 1/12 2 1
+Zscan4f 2 1.70 1.70 1.00 10/12 2 1
--- /dev/null
+++ b/test-data/column_join_in12.pileup
@@ -0,0 +1,36 @@
+0610009D07Rik 4 2.00 2.00 2.54 12/12 2 1
+0610010K14Rik 1 1.41 1.41 0.96 6/12 1 1
+1110002N22Rik 2 1.70 1.70 -0.06 10/12 2 1
+1110008L16Rik 6 2.45 2.45 0.68 12/12 2 1
+1110037F02Rik 1 2.45 2.45 2.13 2/12 1 1
+1190005F20Rik 4 2.18 2.18 0.28 11/12 2 1
+Acot8 1 2.00 2.00 0.07 6/12 2 1
+Acta1 2 1.54 1.54 0.63 11/12 2 1
+Actb 2 1.89 1.89 1.35 9/12 2 1
+Actl6b 1 6.00 6.00 2.13 2/12 2 1
+Bend3 1 1.15 1.33 -0.51 9/12 1 1.33
+Bend5 1 3.46 3.46 3.17 1/12 1 1
+Brip1 2 1.73 1.73 0.58 8/12 1 1
+Btf3;Gm3531 1 4.00 4.00 1.67 3/12 2 1
+Bub3 1 1.33 1.33 -0.09 9/12 2 1
+C130039O16Rik 1 2.45 2.45 2.13 2/12 1 1
+C1d 1 1.73 1.73 0.87 4/12 1 1
+Caprin1 2 2.42 2.42 0.51 7/12 2 1
+Cbx3 2 1.54 1.54 0.75 11/12 2 1
+Eed 1 1.10 1.10 -0.47 10/12 1 1
+Efha1 1 3.46 3.46 3.17 1/12 1 1
+Exosc1 3 1.73 1.73 1.29 12/12 2 1
+Exosc10 25 5.00 5.00 1.03 12/12 2 1
+Gm189 2 1.70 1.70 2.12 10/12 2 1
+Gm3200 1 2.45 2.45 2.13 2/12 1 1
+Gm9855;Tdg 2 1.70 1.70 1.37 10/12 2 1
+Sfrs11 4 2.00 2.00 2.54 12/12 2 1
+Sfrs12 2 5.66 5.66 2.57 3/12 2 1
+Sin3a 1 1.31 1.31 -0.12 7/12 1 1
+Sirt7 1 2.00 2.00 1.67 3/12 1 1
+Skiv2l2 34 5.83 5.83 0.68 12/12 2 1
+Tubb2b 3 1.73 1.73 -0.10 12/12 2 1
+Tubb4 1 1.15 1.15 0.29 9/12 1 1
+Zscan4-ps2 1 12.00 12.00 3.17 1/12 2 1
+Zscan4e 2 2.83 2.83 2.12 6/12 2 1
+Zscan4f 2 1.70 1.70 1.00 10/12 2 1
--- a/tools/new_operations/column_join.xml
+++ b/tools/new_operations/column_join.xml
@@ -92,7 +92,7 @@ import simplejson
<param name="input" value="column_join_in6.pileup" ftype="pileup" /><output name="output" file="column_join_out2.pileup" ftype="tabular" /></test>
-<!-- This test is failing for an unclear reason (the column values do not get
+<!-- This test is failing for an unclear reason (the column values do not get
passed into the script), but passes in the browser
<test><param name="input1" value="column_join_in7.pileup" ftype="tabular" />
@@ -106,7 +106,17 @@ import simplejson
<param name="input" value="column_join_in9.pileup" ftype="tabular" /><output name="output" file="column_join_out3.pileup" ftype="tabular" /></test>
---></tests>
+-->
+ <test>
+ <param name="input1" value="column_join_in10.pileup" ftype="pileup" />
+ <param name="hinge" value="1" />
+ <param name="columns" value="2,7" />
+ <param name="fill_empty_columns_switch" value="no_fill" />
+ <param name="input2" value="column_join_in11.pileup" ftype="pileup" />
+ <param name="input" value="column_join_in12.pileup" ftype="pileup" />
+ <output name="output" file="column_join_out4.pileup" ftype="tabular" />
+ </test>
+ </tests><help>
**What it does**
@@ -204,5 +214,3 @@ To join on columns 3 and 4 combining on
</help></tool>
-
-
--- /dev/null
+++ b/test-data/column_join_in11.pileup
@@ -0,0 +1,36 @@
+0610009D07Rik 3 1.73 1.73 1.15 12/12 2 1
+0610010K14Rik 1 1.41 1.41 0.96 6/12 1 1
+1110002N22Rik 3 2.08 2.08 0.74 10/12 2 1
+1110008L16Rik 1 1.00 1.00 -1.35 12/12 1 1
+Acta1 2 1.54 1.54 0.63 11/12 2 1
+Actb 1 1.33 1.33 0.00 9/12 2 1
+Actg1 1 3.00 3.00 0.87 4/12 2 1
+Actl6a 1 1.10 1.10 -0.33 10/12 1 1
+Actl6b 1 2.45 2.45 2.13 2/12 1 1
+Bnc2 1 2.00 2.00 1.67 3/12 1 1
+Bptf 1 3.46 3.46 3.17 1/12 1 1
+Brip1 1 1.22 1.22 -0.19 8/12 1 1
+Brms1l 1 12.00 12.00 3.17 1/12 2 1
+Btf3;Gm3531 1 2.00 2.00 1.67 3/12 1 1
+Bub3 3 2.00 2.00 2.13 9/12 1 1
+C330007P06Rik 1 2.45 2.45 2.13 2/12 1 1
+Cad 1 2.45 2.45 0.50 2/12 1 1
+Calm1;Calm3;Calm2 1 2.00 2.00 1.03 3/12 1 1
+Cbx1 2 3.39 3.39 2.24 5/12 2 1
+E2f6 1 2.40 2.40 0.53 5/12 2 1
+Eed 1 1.20 1.20 -0.47 10/12 2 1
+Gm10079 2 1.41 1.41 0.16 12/12 1 1
+Gm11230 2 1.48 1.48 1.21 11/12 1 1
+Gm13072;Trmt112 1 3.46 3.46 3.17 1/12 1 1
+Gm13092;LOC677017 1 1.33 1.33 0.29 9/12 2 1
+Gm14231 1 1.31 1.31 0.51 7/12 1 1
+Gm14456;Tpt1 1 2.00 2.00 1.67 3/12 1 1
+Gm15501;Rps8 1 1.55 1.55 1.14 5/12 1 1
+Gm189 1 1.20 1.20 0.16 10/12 2 1
+Sfrs11 3 1.73 1.73 1.15 12/12 2 1
+Sin3a 4 3.43 3.43 1.93 7/12 2 1
+Sirt7 1 2.00 2.00 1.67 3/12 1 1
+Skiv2l2 12 3.46 3.46 -0.72 12/12 2 1
+Tubb2b 4 2.00 2.00 0.49 12/12 2 1
+Zscan4e 1 1.41 1.41 0.63 6/12 1 1
+Zscan4f 2 1.70 1.70 1.00 10/12 2 1
--- /dev/null
+++ b/test-data/column_join_out4.pileup
@@ -0,0 +1,65 @@
+0610009D07Rik 2 2 3 2 4 2
+0610010K14Rik 1 1 1 1
+1110002N22Rik 2 2 3 2 2 2
+1110008L16Rik 3 2 1 1 6 2
+1110037F02Rik 1 1
+1110054O05Rik 1 1
+1190005F20Rik 4 2
+Acot8 1 2
+Acta1 2 2 2 2
+Actb 1 2 2 2
+Actg1 2 2 1 2
+Actl6a 2 1 1 1
+Actl6b 1 1 1 2
+Actn1 1 1
+Actn4 1 1
+Bend3 1 1
+Bend5 1 1
+Bnc2 1 1 1 1
+Bptf 1 1
+Brip1 1 1 2 1
+Brms1l 1 2
+Btf3;Gm3531 1 1 1 2
+Bub3 2 2 3 1 1 2
+C1d 1 1
+C130039O16Rik 1 1
+C330007P06Rik 1 1
+Cad 4 1 1 1
+Calm1;Calm3;Calm2 2 1 1 1
+Caprin1 2 2
+Cbx1 2 2
+Cbx3 2 2
+E2f6 2 2 1 2
+E130012A19Rik 2 2
+Eed 1 2 1 1
+Efha1 1 1
+Exosc1 3 2
+Exosc10 25 2
+Gm189 1 2 1 2 2 2
+Gm3200 1 1
+Gm9855;Tdg 2 2
+Gm10079 2 1
+Gm11230 2 1
+Gm12620 1 1
+Gm13072;Trmt112 1 1
+Gm13092;LOC677017 1 1 1 2
+Gm14173;Rpl37a;Gm4149 1 2
+Gm14231 1 1
+Gm14393;2210418O10Rik;Gm14296;Gm14401;RP23-330D3.5 1 1
+Gm14456;Tpt1 1 1
+Gm15501;Rps8 1 1
+Sfrs7 1 2
+Sfrs11 3 2 4 2
+Sfrs12 2 2
+Sin3a 1 2 4 2 1 1
+Sirt7 1 1 1 1
+Ski 1 1
+Skil 1 1
+Skiv2l2 12 2 34 2
+Tubb2b 4 2 3 2
+Tubb2c 1 1
+Tubb2c-ps1 1 2
+Tubb4 1 1
+Zscan4-ps2 1 2
+Zscan4e 1 1 2 2
+Zscan4f 2 2 2 2 2 2
1
0

galaxy-dist commit 5cde0b6269e3: API: Add library creation functionality. Note that no roles can be associated with libraries via the API at this time.
by commits-noreply@bitbucket.org 29 Jun '10
by commits-noreply@bitbucket.org 29 Jun '10
29 Jun '10
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User Nate Coraor <nate(a)bx.psu.edu>
# Date 1277318677 14400
# Node ID 5cde0b6269e320c2bd769222cbd40f2e8956b7c5
# Parent e177f00679e9f8106c346251c1f8bdc0ece127d5
API: Add library creation functionality. Note that no roles can be associated with libraries via the API at this time.
--- a/lib/galaxy/model/__init__.py
+++ b/lib/galaxy/model/__init__.py
@@ -830,7 +830,7 @@ class HistoryDatasetAssociationDisplayAt
class Library( object ):
permitted_actions = get_permitted_actions( filter='LIBRARY' )
api_collection_visible_keys = ( 'id', 'name' )
- api_element_visible_keys = ( 'name', 'description', 'synopsys' )
+ api_element_visible_keys = ( 'name', 'description', 'synopsis' )
def __init__( self, name=None, description=None, synopsis=None, root_folder=None ):
self.name = name or "Unnamed library"
self.description = description
--- a/scripts/api/README
+++ b/scripts/api/README
@@ -13,9 +13,20 @@ subdirectories.
In Galaxy, create an account that matches the address you put in 'admin_users',
then browse to that user's preferences and generate a new API Key. Copy the
-key to your clipboard. Create a new library (doing this via the API is not yet
-implemented). Then take your API Key and use the scripts in scripts/api/ to do
-things:
+key to your clipboard and then use these scripts:
+
+% ./display.py my_key http://localhost:4096/api/libraries
+Collection Members
+------------------
+
+0 elements in collection
+
+% ./library_create_library.py my_key http://localhost:4096/api/libraries api_test 'API Test Library'
+Response
+--------
+/api/libraries/f3f73e481f432006
+ name: api_test
+ id: f3f73e481f432006
% ./display.py my_key http://localhost:4096/api/libraries
Collection Members
@@ -27,7 +38,7 @@ Collection Members
% ./display.py my_key http://localhost:4096/api/libraries/f3f73e481f432006
Member Information
------------------
-synopsys: None
+synopsis: None
contents_url: /api/libraries/f3f73e481f432006/contents
description: API Test Library
name: api_test
--- /dev/null
+++ b/scripts/api/library_create_library.py
@@ -0,0 +1,19 @@
+#!/usr/bin/python
+
+import os, sys
+sys.path.insert( 0, os.path.dirname( __file__ ) )
+from common import submit
+
+try:
+ data = {}
+ data[ 'name' ] = sys.argv[3]
+except IndexError:
+ print 'usage: %s key url name [description] [synopsys]' % os.path.basename( sys.argv[0] )
+ sys.exit( 1 )
+try:
+ data[ 'description' ] = sys.argv[4]
+ data[ 'synopsis' ] = sys.argv[5]
+except IndexError:
+ pass
+
+submit( sys.argv[1], sys.argv[2], data )
--- a/lib/galaxy/web/api/libraries.py
+++ b/lib/galaxy/web/api/libraries.py
@@ -60,3 +60,33 @@ class LibrariesController( BaseControlle
item = library.get_api_value( view='element' )
item['contents_url'] = url_for( 'contents', library_id=library_id )
return item
+
+ @web.expose_api
+ def create( self, trans, payload, **kwd ):
+ """
+ POST /api/libraries
+ Creates a new library.
+ """
+ if not trans.user_is_admin():
+ trans.response.status = 403
+ return "You are not authorized to create a new library."
+ params = util.Params( payload )
+ name = util.restore_text( params.get( 'name', None ) )
+ if not name:
+ trans.response.status = 400
+ return "Missing required parameter 'name'."
+ description = util.restore_text( params.get( 'description', '' ) )
+ synopsis = util.restore_text( params.get( 'synopsis', '' ) )
+ if synopsis in [ 'None', None ]:
+ synopsis = ''
+ library = trans.app.model.Library( name=name, description=description, synopsis=synopsis )
+ root_folder = trans.app.model.LibraryFolder( name=name, description='' )
+ library.root_folder = root_folder
+ trans.sa_session.add_all( ( library, root_folder ) )
+ trans.sa_session.flush()
+ encoded_id = trans.security.encode_id( library.id )
+ rval = {}
+ rval['url'] = url_for( 'libraries', id=encoded_id )
+ rval['name'] = name
+ rval['id'] = encoded_id
+ return [ rval ]
1
0

galaxy-dist commit 8adc2157e02a: Removed extra cloud clause left from earlier code cleanup. Resoves issue #350
by commits-noreply@bitbucket.org 29 Jun '10
by commits-noreply@bitbucket.org 29 Jun '10
29 Jun '10
# HG changeset patch -- Bitbucket.org
# Project galaxy-dist
# URL http://bitbucket.org/galaxy/galaxy-dist/overview
# User Enis Afgan <afgane(a)gmail.com>
# Date 1277351003 14400
# Node ID 8adc2157e02a8b144697147b5e5a64833f0d1964
# Parent 150c8db8dec1f36d42baea62c895f52d983d9e60
Removed extra cloud clause left from earlier code cleanup. Resoves issue #350
--- a/lib/galaxy/app.py
+++ b/lib/galaxy/app.py
@@ -1,6 +1,6 @@
import sys, os, atexit
-from galaxy import config, jobs, util, tools, web, cloud
+from galaxy import config, jobs, util, tools, web
import galaxy.tools.search
from galaxy.web import security
import galaxy.model
1
0