/lib/galaxy/datatypes/coverage.py

https://bitbucket.org/h_morita_dbcls/galaxy-central · Python · 66 lines · 41 code · 10 blank · 15 comment · 0 complexity · 825029d4ba2c06e4a06df647e5486db8 MD5 · raw file

  1. """
  2. Coverage datatypes
  3. """
  4. import pkg_resources
  5. pkg_resources.require( "bx-python" )
  6. import logging, os, sys, time, tempfile, shutil
  7. import data
  8. from galaxy import util
  9. from galaxy.datatypes.sniff import *
  10. from galaxy.web import url_for
  11. from cgi import escape
  12. import urllib
  13. from bx.intervals.io import *
  14. from galaxy.datatypes import metadata
  15. from galaxy.datatypes.metadata import MetadataElement
  16. from galaxy.datatypes.tabular import Tabular
  17. import math
  18. log = logging.getLogger(__name__)
  19. class LastzCoverage( Tabular ):
  20. file_ext = "coverage"
  21. MetadataElement( name="chromCol", default=1, desc="Chrom column", param=metadata.ColumnParameter )
  22. MetadataElement( name="positionCol", default=2, desc="Position column", param=metadata.ColumnParameter )
  23. MetadataElement( name="forwardCol", default=3, desc="Forward or aggregate read column", param=metadata.ColumnParameter )
  24. MetadataElement( name="reverseCol", desc="Optional reverse read column", param=metadata.ColumnParameter, optional=True, no_value=0 )
  25. MetadataElement( name="columns", default=3, desc="Number of columns", readonly=True, visible=False )
  26. def get_track_window(self, dataset, data, start, end):
  27. """
  28. Assumes we have a numpy file.
  29. """
  30. # Maybe if we import here people will still be able to use Galaxy when numpy kills it
  31. pkg_resources.require("numpy>=1.2.1")
  32. #from numpy.lib import format
  33. import numpy
  34. range = end - start
  35. # Determine appropriate resolution to plot ~1000 points
  36. resolution = ( 10 ** math.ceil( math.log10( range / 1000 ) ) )
  37. # Restrict to valid range
  38. resolution = min( resolution, 10000 )
  39. resolution = max( resolution, 1 )
  40. # Memory map the array (don't load all the data)
  41. data = numpy.load( data )
  42. # Grab just what we need
  43. t_start = math.floor( start / resolution )
  44. t_end = math.ceil( end / resolution )
  45. x = numpy.arange( t_start, t_end ) * resolution
  46. y = data[ t_start : t_end ]
  47. return zip(x.tolist(), y.tolist())
  48. def get_track_resolution( self, dataset, start, end):
  49. range = end - start
  50. # Determine appropriate resolution to plot ~1000 points
  51. resolution = math.ceil( 10 ** math.ceil( math.log10( range / 1000 ) ) )
  52. # Restrict to valid range
  53. resolution = min( resolution, 10000 )
  54. resolution = max( resolution, 1 )
  55. return resolution