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

25 May '10
details: http://www.bx.psu.edu/hg/galaxy/rev/6056caca2503
changeset: 3814:6056caca2503
user: jeremy goecks <jeremy.goecks(a)emory.edu>
date: Mon May 24 14:50:20 2010 -0400
description:
Page editor: fix indenting issue for webkit browsers.
diffstat:
templates/page/editor.mako | 26 ++++++++++++--------------
1 files changed, 12 insertions(+), 14 deletions(-)
diffs (49 lines):
diff -r 37ecd71e87f3 -r 6056caca2503 templates/page/editor.mako
--- a/templates/page/editor.mako Mon May 24 14:46:19 2010 -0400
+++ b/templates/page/editor.mako Mon May 24 14:50:20 2010 -0400
@@ -476,8 +476,7 @@
// item_class='History').
var item_elt_id = item_info.iclass + "-" + item_id;
var item_embed_html =
- "\
- <p><div id='" + item_elt_id + "' class='embedded-item " + item_info.singular.toLowerCase() +
+ "<p><div id='" + item_elt_id + "' class='embedded-item " + item_info.singular.toLowerCase() +
" placeholder'> \
<p class='title'>Embedded Galaxy " + item_info.singular + " '" + item_name + "'</p> \
<p class='content'> \
@@ -487,24 +486,23 @@
</div></p>";
// Insert embedded item into document.
+ wym.insert(" "); // Needed to prevent insertion from occurring in child element in webkit browsers.
wym.insert(item_embed_html);
// TODO: can we fix this?
// Due to oddities of wym.insert() [likely due to inserting a <div> and/or a complete paragraph], an
- // empty paragraph may be included either before or after an embedded item. Remove these paragraphs.
+ // empty paragraph (or two!) may be included either before an embedded item. Remove these paragraphs.
$("#" + item_elt_id, wym._doc.body).each( function() {
// Remove previous empty paragraphs.
- var prev_elt = $(this).prev();
- if ( prev_elt.length != 0 && jQuery.trim(prev_elt.text()) == "" )
- prev_elt.remove();
-
- // Remove subsequent empty paragraphs.
- /*
- var next_elt = $(this).next();
- var next_next_elt = next_elt.next();
- if (next_next_elt.length != 0)
- next_elt.remove();
- */
+ var removing = true;
+ while (removing)
+ {
+ var prev_elt = $(this).prev();
+ if ( prev_elt.length != 0 && jQuery.trim(prev_elt.text()) == "" )
+ prev_elt.remove();
+ else
+ removing = false;
+ }
});
});
1
0

25 May '10
details: http://www.bx.psu.edu/hg/galaxy/rev/37ecd71e87f3
changeset: 3813:37ecd71e87f3
user: Nate Coraor <nate(a)bx.psu.edu>
date: Mon May 24 14:46:19 2010 -0400
description:
Added nginx mod_zip support for library downloads
diffstat:
lib/galaxy/config.py | 1 +
lib/galaxy/web/controllers/library_common.py | 40 ++++++++++++++++++++++-----
templates/library/common/common.mako | 8 +++++
3 files changed, 41 insertions(+), 8 deletions(-)
diffs (144 lines):
diff -r 663b2fd4a44c -r 37ecd71e87f3 lib/galaxy/config.py
--- a/lib/galaxy/config.py Mon May 24 14:15:02 2010 -0400
+++ b/lib/galaxy/config.py Mon May 24 14:46:19 2010 -0400
@@ -101,6 +101,7 @@
# Configuration options for taking advantage of nginx features
self.apache_xsendfile = kwargs.get( 'apache_xsendfile', False )
self.nginx_x_accel_redirect_base = kwargs.get( 'nginx_x_accel_redirect_base', False )
+ self.nginx_x_archive_files_base = kwargs.get( 'nginx_x_archive_files_base', False )
self.nginx_upload_store = kwargs.get( 'nginx_upload_store', False )
self.nginx_upload_path = kwargs.get( 'nginx_upload_path', False )
if self.nginx_upload_store:
diff -r 663b2fd4a44c -r 37ecd71e87f3 lib/galaxy/web/controllers/library_common.py
--- a/lib/galaxy/web/controllers/library_common.py Mon May 24 14:15:02 2010 -0400
+++ b/lib/galaxy/web/controllers/library_common.py Mon May 24 14:46:19 2010 -0400
@@ -106,6 +106,9 @@
message += "Don't navigate away from Galaxy or use the browser's \"stop\" or \"reload\" buttons (on this tab) until the "
message += "message \"This job is running\" is cleared from the \"Information\" column below for each selected dataset."
status = "info"
+ comptypes_t = comptypes
+ if trans.app.config.nginx_x_archive_files_base:
+ comptypes_t = ['ngxzip']
return trans.fill_template( '/library/common/browse_library.mako',
cntrller=cntrller,
use_panels=use_panels,
@@ -113,7 +116,7 @@
created_ldda_ids=created_ldda_ids,
hidden_folder_ids=hidden_folder_ids,
show_deleted=show_deleted,
- comptypes=comptypes,
+ comptypes=comptypes_t,
current_user_roles=current_user_roles,
message=message,
status=status )
@@ -1253,6 +1256,19 @@
status=status )
@web.expose
def act_on_multiple_datasets( self, trans, cntrller, library_id, ldda_ids='', **kwd ):
+ class NgxZip( object ):
+ def __init__( self, url_base ):
+ self.files = {}
+ self.url_base = url_base
+ def add( self, file, relpath ):
+ self.files[file] = relpath
+ def __str__( self ):
+ rval = ''
+ for fname, relpath in self.files.items():
+ size = os.stat( fname ).st_size
+ quoted_fname = urllib.quote_plus( fname, '/' )
+ rval += '- %i %s%s %s\n' % ( size, self.url_base, quoted_fname, relpath )
+ return rval
# Perform an action on a list of library datasets.
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
@@ -1319,10 +1335,10 @@
trans.sa_session.add( ld )
trans.sa_session.flush()
message = "The selected datasets have been removed from this data library"
- elif action in ['zip','tgz','tbz']:
+ elif action in ['zip','tgz','tbz','ngxzip']:
error = False
killme = string.punctuation + string.whitespace
- trantab = string.maketrans(killme,'_'*len(killme))
+ trantab = string.maketrans(killme,'_'*len(killme))
try:
outext = 'zip'
if action == 'zip':
@@ -1340,6 +1356,8 @@
elif action == 'tbz':
archive = util.streamball.StreamBall( 'w|bz2' )
outext = 'tbz2'
+ elif action == 'ngxzip':
+ archive = NgxZip( trans.app.config.nginx_x_archive_files_base )
except (OSError, zipfile.BadZipFile):
error = True
log.exception( "Unable to create archive for download" )
@@ -1347,7 +1365,7 @@
status = 'error'
except:
error = True
- log.exception( "Unexpected error %s in create archive for download" % sys.exc_info()[0])
+ log.exception( "Unexpected error %s in create archive for download" % sys.exc_info()[0])
message = "Unable to create archive for download, please report - %s" % sys.exc_info()[0]
status = 'error'
if not error:
@@ -1377,7 +1395,8 @@
seen.append( path )
zpath = os.path.split(path)[-1] # comes as base_name/fname
outfname,zpathext = os.path.splitext(zpath)
- if is_composite: # need to add all the components from the extra_files_path to the zip
+ if is_composite:
+ # need to add all the components from the extra_files_path to the zip
if zpathext == '':
zpath = '%s.html' % zpath # fake the real nature of the html file
try:
@@ -1391,8 +1410,8 @@
flist = glob.glob(os.path.join(ldda.dataset.extra_files_path,'*.*')) # glob returns full paths
for fpath in flist:
efp,fname = os.path.split(fpath)
- if fname > '':
- fname = fname.translate(trantab)
+ if fname > '':
+ fname = fname.translate(trantab)
try:
archive.add( fpath,fname )
except IOError:
@@ -1409,7 +1428,7 @@
log.exception( "Unable to write %s to temporary library download archive" % ldda.dataset.file_name)
message = "Unable to create archive for download, please report this error"
status = 'error'
- if not error:
+ if not error:
if action == 'zip':
archive.close()
tmpfh = open( tmpf )
@@ -1426,6 +1445,11 @@
trans.response.set_content_type( "application/x-zip-compressed" )
trans.response.headers[ "Content-Disposition" ] = "attachment; filename=%s.%s" % (outfname,outext)
return tmpfh
+ elif action == 'ngxzip':
+ #trans.response.set_content_type( "application/x-zip-compressed" )
+ #trans.response.headers[ "Content-Disposition" ] = "attachment; filename=%s.%s" % (outfname,outext)
+ trans.response.headers[ "X-Archive-Files" ] = "zip"
+ return archive
else:
trans.response.set_content_type( "application/x-tar" )
trans.response.headers[ "Content-Disposition" ] = "attachment; filename=%s.%s" % (outfname,outext)
diff -r 663b2fd4a44c -r 37ecd71e87f3 templates/library/common/common.mako
--- a/templates/library/common/common.mako Mon May 24 14:15:02 2010 -0400
+++ b/templates/library/common/common.mako Mon May 24 14:46:19 2010 -0400
@@ -391,6 +391,14 @@
%if 'zip' in comptypes:
<option value="zip">Download as a .zip file</option>
%endif
+ %if 'ngxzip' in comptypes:
+ ## We can safely have two default selected items since ngxzip, if present, will always be the only available type.
+ <option value="ngxzip"
+ %if default_action == 'download':
+ selected
+ %endif>
+ >Download as a .zip file</option>
+ %endif
%endif
</select>
<input type="submit" class="primary-button" name="action_on_datasets_button" id="action_on_datasets_button" value="Go"/>
1
0

25 May '10
details: http://www.bx.psu.edu/hg/galaxy/rev/663b2fd4a44c
changeset: 3812:663b2fd4a44c
user: Dan Blankenberg <dan(a)bx.psu.edu>
date: Mon May 24 14:15:02 2010 -0400
description:
First pass at implementing a method for allowing a maximum file size cutoff for setting optional metadata (e.g. line and sequence counts). Currently csFasta, qualsolid, and fastq make use of this option.
diffstat:
datatypes_conf.xml.sample | 2 +-
lib/galaxy/datatypes/data.py | 14 ++++++++++++++
lib/galaxy/datatypes/qualityscore.py | 7 +++++++
lib/galaxy/datatypes/registry.py | 2 ++
lib/galaxy/datatypes/sequence.py | 7 +++++++
5 files changed, 31 insertions(+), 1 deletions(-)
diffs (96 lines):
diff -r 7faa12ac9746 -r 663b2fd4a44c datatypes_conf.xml.sample
--- a/datatypes_conf.xml.sample Mon May 24 11:22:12 2010 -0400
+++ b/datatypes_conf.xml.sample Mon May 24 14:15:02 2010 -0400
@@ -33,7 +33,7 @@
</datatype>
<datatype extension="customtrack" type="galaxy.datatypes.interval:CustomTrack"/>
<datatype extension="csfasta" type="galaxy.datatypes.sequence:csFasta" display_in_upload="true"/>
- <datatype extension="data" type="galaxy.datatypes.data:Data" mimetype="application/octet-stream"/>
+ <datatype extension="data" type="galaxy.datatypes.data:Data" mimetype="application/octet-stream" max_optional_metadata_filesize="1048576" />
<datatype extension="fasta" type="galaxy.datatypes.sequence:Fasta" display_in_upload="true">
<converter file="fasta_to_tabular_converter.xml" target_datatype="tabular"/>
</datatype>
diff -r 7faa12ac9746 -r 663b2fd4a44c lib/galaxy/datatypes/data.py
--- a/lib/galaxy/datatypes/data.py Mon May 24 11:22:12 2010 -0400
+++ b/lib/galaxy/datatypes/data.py Mon May 24 14:15:02 2010 -0400
@@ -57,6 +57,8 @@
composite_type = None
composite_files = odict()
primary_file_name = 'index'
+ #A per datatype setting (inherited): max file size (in bytes) for setting optional metadata
+ _max_optional_metadata_filesize = None
def __init__(self, **kwd):
"""Initialize the datatype"""
@@ -116,6 +118,18 @@
if not value:
return True
return False
+ def set_max_optional_metadata_filesize( self, max_value ):
+ try:
+ max_value = int( max_value )
+ except:
+ return
+ self.__class__._max_optional_metadata_filesize = max_value
+ def get_max_optional_metadata_filesize( self ):
+ rval = self.__class__._max_optional_metadata_filesize
+ if rval is None:
+ return -1
+ return rval
+ max_optional_metadata_filesize = property( get_max_optional_metadata_filesize, set_max_optional_metadata_filesize )
def set_peek( self, dataset, is_multi_byte=False ):
"""Set the peek and blurb text"""
if not dataset.dataset.purged:
diff -r 7faa12ac9746 -r 663b2fd4a44c lib/galaxy/datatypes/qualityscore.py
--- a/lib/galaxy/datatypes/qualityscore.py Mon May 24 11:22:12 2010 -0400
+++ b/lib/galaxy/datatypes/qualityscore.py Mon May 24 14:15:02 2010 -0400
@@ -63,6 +63,13 @@
except:
pass
return False
+
+ def set_meta( self, dataset, **kwd ):
+ if self.max_optional_metadata_filesize >= 0 and dataset.get_size() > self.max_optional_metadata_filesize:
+ return
+ return QualityScore.set_meta( self, dataset, **kwd )
+
+
class QualityScore454 ( QualityScore ):
"""
diff -r 7faa12ac9746 -r 663b2fd4a44c lib/galaxy/datatypes/registry.py
--- a/lib/galaxy/datatypes/registry.py Mon May 24 11:22:12 2010 -0400
+++ b/lib/galaxy/datatypes/registry.py Mon May 24 14:15:02 2010 -0400
@@ -64,6 +64,8 @@
self.available_tracks.append( extension )
if display_in_upload:
self.upload_file_formats.append( extension )
+ #max file size cut off for setting optional metadata
+ self.datatypes_by_extension[extension].max_optional_metadata_filesize = elem.get( 'max_optional_metadata_filesize', None )
for converter in elem.findall( 'converter' ):
# Build the list of datatype converters which will later be loaded
# into the calling app's toolbox.
diff -r 7faa12ac9746 -r 663b2fd4a44c lib/galaxy/datatypes/sequence.py
--- a/lib/galaxy/datatypes/sequence.py Mon May 24 11:22:12 2010 -0400
+++ b/lib/galaxy/datatypes/sequence.py Mon May 24 14:15:02 2010 -0400
@@ -148,6 +148,11 @@
except:
pass
return False
+
+ def set_meta( self, dataset, **kwd ):
+ if self.max_optional_metadata_filesize >= 0 and dataset.get_size() > self.max_optional_metadata_filesize:
+ return
+ return Sequence.set_meta( self, dataset, **kwd )
class Fastq ( Sequence ):
"""Class representing a generic FASTQ sequence"""
@@ -158,6 +163,8 @@
Set the number of sequences and the number of data lines
in dataset.
"""
+ if self.max_optional_metadata_filesize >= 0 and dataset.get_size() > self.max_optional_metadata_filesize:
+ return
data_lines = 0
sequences = 0
seq_counter = 0 # blocks should be 4 lines long
1
0

25 May '10
details: http://www.bx.psu.edu/hg/galaxy/rev/7faa12ac9746
changeset: 3811:7faa12ac9746
user: Greg Von Kuster <greg(a)bx.psu.edu>
date: Mon May 24 11:22:12 2010 -0400
description:
Send the web freamework ( trans ) to the grid's build_initial_query() method rather than the web framework's db session so that the method can take advantage of all of the web freamwork's attributes. Change the library controller to use grids for the data libraries display.
diffstat:
lib/galaxy/web/controllers/admin.py | 12 +-
lib/galaxy/web/controllers/history.py | 8 +-
lib/galaxy/web/controllers/library.py | 88 ++++++++++++++++++----
lib/galaxy/web/controllers/library_admin.py | 14 +-
lib/galaxy/web/controllers/page.py | 4 +-
lib/galaxy/web/controllers/requests.py | 4 +-
lib/galaxy/web/controllers/tracks.py | 4 +-
lib/galaxy/web/controllers/visualization.py | 4 +-
lib/galaxy/web/controllers/workflow.py | 4 +-
lib/galaxy/web/framework/helpers/grids.py | 7 +-
lib/galaxy/webapps/community/controllers/admin.py | 24 +++---
lib/galaxy/webapps/community/controllers/tool.py | 12 +-
templates/library/browse_libraries.mako | 31 --------
templates/library/grid.mako | 1 +
test/functional/test_library_security.py | 2 +-
15 files changed, 121 insertions(+), 98 deletions(-)
diffs (466 lines):
diff -r d22853e5963d -r 7faa12ac9746 lib/galaxy/web/controllers/admin.py
--- a/lib/galaxy/web/controllers/admin.py Mon May 24 10:53:55 2010 -0400
+++ b/lib/galaxy/web/controllers/admin.py Mon May 24 11:22:12 2010 -0400
@@ -103,8 +103,8 @@
use_paging = True
def get_current_item( self, trans ):
return trans.user
- def build_initial_query( self, session ):
- return session.query( self.model_class )
+ def build_initial_query( self, trans ):
+ return trans.sa_session.query( self.model_class )
class RoleListGrid( grids.Grid ):
class NameColumn( grids.TextColumn ):
@@ -197,8 +197,8 @@
use_paging = True
def get_current_item( self, trans ):
return None
- def build_initial_query( self, session ):
- return session.query( self.model_class )
+ def build_initial_query( self, trans ):
+ return trans.sa_session.query( self.model_class )
def apply_default_filter( self, trans, query, **kwargs ):
return query.filter( model.Role.type != model.Role.types.PRIVATE )
@@ -275,8 +275,8 @@
use_paging = True
def get_current_item( self, trans ):
return None
- def build_initial_query( self, session ):
- return session.query( self.model_class )
+ def build_initial_query( self, trans ):
+ return trans.sa_session.query( self.model_class )
class AdminGalaxy( BaseController, Admin ):
diff -r d22853e5963d -r 7faa12ac9746 lib/galaxy/web/controllers/history.py
--- a/lib/galaxy/web/controllers/history.py Mon May 24 10:53:55 2010 -0400
+++ b/lib/galaxy/web/controllers/history.py Mon May 24 11:22:12 2010 -0400
@@ -110,8 +110,8 @@
grids.GridOperation( "Unshare" )
]
standard_filters = []
- def build_initial_query( self, session ):
- return session.query( self.model_class ).join( 'users_shared_with' )
+ def build_initial_query( self, trans ):
+ return trans.sa_session.query( self.model_class ).join( 'users_shared_with' )
def apply_default_filter( self, trans, query, **kwargs ):
return query.filter( model.HistoryUserShareAssociation.user == trans.user )
@@ -138,9 +138,9 @@
key="free-text-search", visible=False, filterable="standard" )
)
operations = []
- def build_initial_query( self, session ):
+ def build_initial_query( self, trans ):
# Join so that searching history.user makes sense.
- return session.query( self.model_class ).join( model.User.table )
+ return trans.sa_session.query( self.model_class ).join( model.User.table )
def apply_default_filter( self, trans, query, **kwargs ):
# A public history is published, has a slug, and is not deleted.
return query.filter( self.model_class.published == True ).filter( self.model_class.slug != None ).filter( self.model_class.deleted == False )
diff -r d22853e5963d -r 7faa12ac9746 lib/galaxy/web/controllers/library.py
--- a/lib/galaxy/web/controllers/library.py Mon May 24 10:53:55 2010 -0400
+++ b/lib/galaxy/web/controllers/library.py Mon May 24 11:22:12 2010 -0400
@@ -1,12 +1,73 @@
from galaxy.web.base.controller import *
+from galaxy.web.framework.helpers import time_ago, iff, grids
from galaxy.model.orm import *
from galaxy.datatypes import sniff
-from galaxy import util
+from galaxy import model, util
from galaxy.util.odict import odict
log = logging.getLogger( __name__ )
+class LibraryListGrid( grids.Grid ):
+ class NameColumn( grids.TextColumn ):
+ def get_value( self, trans, grid, library ):
+ return library.name
+ class DescriptionColumn( grids.TextColumn ):
+ def get_value( self, trans, grid, library ):
+ if library.description:
+ return library.description
+ return ''
+ # Grid definition
+ title = "Data Libraries"
+ model_class = model.Library
+ template='/library/grid.mako'
+ default_sort_key = "name"
+ columns = [
+ NameColumn( "Name",
+ key="name",
+ model_class=model.Library,
+ link=( lambda library: dict( operation="browse", id=library.id ) ),
+ attach_popup=False,
+ filterable="advanced" ),
+ DescriptionColumn( "Description",
+ key="description",
+ model_class=model.Library,
+ attach_popup=False,
+ filterable="advanced" ),
+ ]
+ columns.append( grids.MulticolFilterColumn( "Search",
+ cols_to_filter=[ columns[0], columns[1] ],
+ key="free-text-search",
+ visible=False,
+ filterable="standard" ) )
+ standard_filters = []
+ default_filter = dict( name="All", description="All", deleted="False", purged="False" )
+ num_rows_per_page = 50
+ preserve_state = False
+ use_paging = True
+ def build_initial_query( self, trans ):
+ return trans.sa_session.query( self.model_class ).filter( self.model_class.table.c.deleted == False )
+ def apply_default_filter( self, trans, query, **kwd ):
+ 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 ) ) ) ]
+ if not trans.user:
+ # Filter to get only public libraries, a library whose id
+ # is not in restricted_library_ids is a public library
+ return query.filter( not_( trans.model.Library.table.c.id.in_( restricted_library_ids ) ) )
+ else:
+ # Filter to get libraries accessible by the current user, get both
+ # public libraries and restricted libraries accessible by the current user.
+ return 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 ) ) )
class Library( BaseController ):
+
+ library_list_grid = LibraryListGrid()
+
@web.expose
def index( self, trans, **kwd ):
params = util.Params( kwd )
@@ -18,19 +79,12 @@
status=status )
@web.expose
def browse_libraries( self, trans, **kwd ):
- params = util.Params( kwd )
- message = util.restore_text( params.get( 'message', '' ) )
- status = params.get( 'status', 'done' )
- current_user_roles = trans.get_current_user_roles()
- all_libraries = trans.sa_session.query( trans.app.model.Library ) \
- .filter( trans.app.model.Library.table.c.deleted==False ) \
- .order_by( trans.app.model.Library.name )
- authorized_libraries = []
- for library in all_libraries:
- if trans.app.security_agent.can_access_library( current_user_roles, library ):
- authorized_libraries.append( library )
- return trans.fill_template( '/library/browse_libraries.mako',
- libraries=authorized_libraries,
- default_action=params.get( 'default_action', None ),
- message=message,
- status=status )
+ if 'operation' in kwd:
+ operation = kwd['operation'].lower()
+ if operation == "browse":
+ return trans.response.send_redirect( web.url_for( controller='library_common',
+ action='browse_library',
+ cntrller='library',
+ **kwd ) )
+ # Render the list view
+ return self.library_list_grid( trans, **kwd )
diff -r d22853e5963d -r 7faa12ac9746 lib/galaxy/web/controllers/library_admin.py
--- a/lib/galaxy/web/controllers/library_admin.py Mon May 24 10:53:55 2010 -0400
+++ b/lib/galaxy/web/controllers/library_admin.py Mon May 24 11:22:12 2010 -0400
@@ -69,8 +69,8 @@
num_rows_per_page = 50
preserve_state = False
use_paging = True
- def build_initial_query( self, session ):
- return session.query( self.model_class )
+ def build_initial_query( self, trans ):
+ return trans.sa_session.query( self.model_class )
class LibraryAdmin( BaseController ):
@@ -78,16 +78,16 @@
@web.expose
@web.require_admin
- def browse_libraries( self, trans, **kwargs ):
- if 'operation' in kwargs:
- operation = kwargs['operation'].lower()
+ def browse_libraries( self, trans, **kwd ):
+ if 'operation' in kwd:
+ operation = kwd['operation'].lower()
if operation == "browse":
return trans.response.send_redirect( web.url_for( controller='library_common',
action='browse_library',
cntrller='library_admin',
- **kwargs ) )
+ **kwd ) )
# Render the list view
- return self.library_list_grid( trans, **kwargs )
+ return self.library_list_grid( trans, **kwd )
@web.expose
@web.require_admin
def create_library( self, trans, **kwd ):
diff -r d22853e5963d -r 7faa12ac9746 lib/galaxy/web/controllers/page.py
--- a/lib/galaxy/web/controllers/page.py Mon May 24 10:53:55 2010 -0400
+++ b/lib/galaxy/web/controllers/page.py Mon May 24 11:22:12 2010 -0400
@@ -71,9 +71,9 @@
cols_to_filter=[ columns[0], columns[1], columns[2], columns[3] ],
key="free-text-search", visible=False, filterable="standard" )
)
- def build_initial_query( self, session ):
+ def build_initial_query( self, trans ):
# Join so that searching history.user makes sense.
- return session.query( self.model_class ).join( model.User.table )
+ return trans.sa_session.query( self.model_class ).join( model.User.table )
def apply_default_filter( self, trans, query, **kwargs ):
return query.filter( self.model_class.deleted==False ).filter( self.model_class.published==True )
diff -r d22853e5963d -r 7faa12ac9746 lib/galaxy/web/controllers/requests.py
--- a/lib/galaxy/web/controllers/requests.py Mon May 24 10:53:55 2010 -0400
+++ b/lib/galaxy/web/controllers/requests.py Mon May 24 11:22:12 2010 -0400
@@ -126,8 +126,8 @@
]
def apply_default_filter( self, trans, query, **kwd ):
return query.filter_by( user=trans.user )
- def build_initial_query( self, session ):
- return session.query( self.model_class )
+ def build_initial_query( self, trans ):
+ return trans.sa_session.query( self.model_class )
class Requests( BaseController ):
request_grid = RequestsGrid()
diff -r d22853e5963d -r 7faa12ac9746 lib/galaxy/web/controllers/tracks.py
--- a/lib/galaxy/web/controllers/tracks.py Mon May 24 10:53:55 2010 -0400
+++ b/lib/galaxy/web/controllers/tracks.py Mon May 24 11:22:12 2010 -0400
@@ -71,8 +71,8 @@
DbKeyColumn( "Dbkey", key="dbkey", model_class=model.HistoryDatasetAssociation, visible=False )
]
- def build_initial_query( self, session ):
- return session.query( self.model_class ).join( model.History.table).join( model.Dataset.table )
+ def build_initial_query( self, trans ):
+ return trans.sa_session.query( self.model_class ).join( model.History.table).join( model.Dataset.table )
def apply_default_filter( self, trans, query, **kwargs ):
if self.available_tracks is None:
self.available_tracks = trans.app.datatypes_registry.get_available_tracks()
diff -r d22853e5963d -r 7faa12ac9746 lib/galaxy/web/controllers/visualization.py
--- a/lib/galaxy/web/controllers/visualization.py Mon May 24 10:53:55 2010 -0400
+++ b/lib/galaxy/web/controllers/visualization.py Mon May 24 11:22:12 2010 -0400
@@ -55,9 +55,9 @@
cols_to_filter=[ columns[0], columns[1], columns[2], columns[3] ],
key="free-text-search", visible=False, filterable="standard" )
)
- def build_initial_query( self, session ):
+ def build_initial_query( self, trans ):
# Join so that searching history.user makes sense.
- return session.query( self.model_class ).join( model.User.table )
+ return trans.sa_session.query( self.model_class ).join( model.User.table )
def apply_default_filter( self, trans, query, **kwargs ):
return query.filter( self.model_class.deleted==False ).filter( self.model_class.published==True )
diff -r d22853e5963d -r 7faa12ac9746 lib/galaxy/web/controllers/workflow.py
--- a/lib/galaxy/web/controllers/workflow.py Mon May 24 10:53:55 2010 -0400
+++ b/lib/galaxy/web/controllers/workflow.py Mon May 24 11:22:12 2010 -0400
@@ -75,9 +75,9 @@
key="free-text-search", visible=False, filterable="standard" )
)
operations = []
- def build_initial_query( self, session ):
+ def build_initial_query( self, trans ):
# Join so that searching stored_workflow.user makes sense.
- return session.query( self.model_class ).join( model.User.table )
+ return trans.sa_session.query( self.model_class ).join( model.User.table )
def apply_default_filter( self, trans, query, **kwargs ):
# A public workflow is published, has a slug, and is not deleted.
return query.filter( self.model_class.published==True ).filter( self.model_class.slug != None ).filter( self.model_class.deleted == False )
diff -r d22853e5963d -r 7faa12ac9746 lib/galaxy/web/framework/helpers/grids.py
--- a/lib/galaxy/web/framework/helpers/grids.py Mon May 24 10:53:55 2010 -0400
+++ b/lib/galaxy/web/framework/helpers/grids.py Mon May 24 11:22:12 2010 -0400
@@ -45,7 +45,6 @@
webapp = kwargs.get( 'webapp', 'galaxy' )
status = kwargs.get( 'status', None )
message = kwargs.get( 'message', None )
- session = trans.sa_session
# Build a base filter and sort key that is the combination of the saved state and defaults. Saved state takes preference over defaults.
base_filter = {}
if self.default_filter:
@@ -60,7 +59,7 @@
if pref_name in trans.get_user().preferences:
base_sort_key = from_json_string( trans.get_user().preferences[pref_name] )
# Build initial query
- query = self.build_initial_query( session )
+ query = self.build_initial_query( trans )
query = self.apply_default_filter( trans, query, **kwargs )
# Maintain sort state in generated urls
extra_url_args = {}
@@ -258,8 +257,8 @@
pass
def get_current_item( self, trans ):
return None
- def build_initial_query( self, session ):
- return session.query( self.model_class )
+ def build_initial_query( self, trans ):
+ return trans.sa_session.query( self.model_class )
def apply_default_filter( self, trans, query, **kwargs):
return query
diff -r d22853e5963d -r 7faa12ac9746 lib/galaxy/webapps/community/controllers/admin.py
--- a/lib/galaxy/webapps/community/controllers/admin.py Mon May 24 10:53:55 2010 -0400
+++ b/lib/galaxy/webapps/community/controllers/admin.py Mon May 24 11:22:12 2010 -0400
@@ -113,8 +113,8 @@
use_paging = True
def get_current_item( self, trans ):
return trans.user
- def build_initial_query( self, session ):
- return session.query( self.model_class )
+ def build_initial_query( self, trans ):
+ return trans.sa_session.query( self.model_class )
class RoleListGrid( grids.Grid ):
class NameColumn( grids.TextColumn ):
@@ -211,8 +211,8 @@
use_paging = True
def get_current_item( self, trans ):
return None
- def build_initial_query( self, session ):
- return session.query( self.model_class )
+ def build_initial_query( self, trans ):
+ return trans.sa_session.query( self.model_class )
def apply_default_filter( self, trans, query, **kwd ):
return query.filter( model.Role.type != model.Role.types.PRIVATE )
@@ -294,8 +294,8 @@
use_paging = True
def get_current_item( self, trans ):
return None
- def build_initial_query( self, session ):
- return session.query( self.model_class )
+ def build_initial_query( self, trans ):
+ return trans.sa_session.query( self.model_class )
class ManageCategoryListGrid( grids.Grid ):
class NameColumn( grids.TextColumn ):
@@ -360,8 +360,8 @@
use_paging = True
def get_current_item( self, trans ):
return None
- def build_initial_query( self, session ):
- return session.query( self.model_class )
+ def build_initial_query( self, trans ):
+ return trans.sa_session.query( self.model_class )
class ToolsByCategoryListGrid( grids.Grid ):
class NameColumn( grids.TextColumn ):
@@ -423,8 +423,8 @@
num_rows_per_page = 50
preserve_state = False
use_paging = True
- def build_initial_query( self, session ):
- return session.query( self.model_class )
+ def build_initial_query( self, trans ):
+ return trans.sa_session.query( self.model_class )
def apply_default_filter( self, trans, query, **kwd ):
ids = kwd.get( 'ids', False )
if ids:
@@ -546,8 +546,8 @@
num_rows_per_page = 50
preserve_state = False
use_paging = True
- def build_initial_query( self, session ):
- return session.query( self.model_class )
+ def build_initial_query( self, trans ):
+ return trans.sa_session.query( self.model_class )
def apply_default_filter( self, trans, query, **kwd ):
ids = kwd.get( 'ids', False )
if ids:
diff -r d22853e5963d -r 7faa12ac9746 lib/galaxy/webapps/community/controllers/tool.py
--- a/lib/galaxy/webapps/community/controllers/tool.py Mon May 24 10:53:55 2010 -0400
+++ b/lib/galaxy/webapps/community/controllers/tool.py Mon May 24 11:22:12 2010 -0400
@@ -94,8 +94,8 @@
num_rows_per_page = 50
preserve_state = False
use_paging = True
- def build_initial_query( self, session ):
- return session.query( self.model_class )
+ def build_initial_query( self, trans ):
+ return trans.sa_session.query( self.model_class )
def apply_default_filter( self, trans, query, **kwd ):
ids = kwd.get( 'ids', False )
if not ids:
@@ -218,8 +218,8 @@
num_rows_per_page = 50
preserve_state = False
use_paging = True
- def build_initial_query( self, session ):
- return session.query( self.model_class )
+ def build_initial_query( self, trans ):
+ return trans.sa_session.query( self.model_class )
def apply_default_filter( self, trans, query, **kwd ):
ids = kwd.get( 'ids', False )
if not ids:
@@ -295,8 +295,8 @@
num_rows_per_page = 50
preserve_state = False
use_paging = True
- def build_initial_query( self, session ):
- return session.query( self.model_class )
+ def build_initial_query( self, trans ):
+ return trans.sa_session.query( self.model_class )
class ToolController( BaseController ):
diff -r d22853e5963d -r 7faa12ac9746 templates/library/browse_libraries.mako
--- a/templates/library/browse_libraries.mako Mon May 24 10:53:55 2010 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-<%inherit file="/base.mako"/>
-<%namespace file="/message.mako" import="render_msg" />
-
-<%def name="title()">Browse Data Libraries</%def>
-
-<h2>Data Libraries</h2>
-
-%if message:
- ${render_msg( message, status )}
-%endif
-
-%if not libraries:
- You are not authorized to access any libraries
-%else:
- <table class="grid">
- <thead>
- <tr>
- <th>Name</th>
- <th>Description</th>
- </tr>
- </thead>
- <tbody>
- %for library in libraries:
- <tr class="libraryRow libraryOrFolderRow" id="libraryRow">
- <td><a href="${h.url_for( controller='library_common', action='browse_library', cntrller='library', id=trans.security.encode_id( library.id ), hidden_folder_ids='' )}">${library.name}</a></td>
- <td>${library.description}</td>
- </tr>
- %endfor
- </tbody>
- </table>
-%endif
diff -r d22853e5963d -r 7faa12ac9746 templates/library/grid.mako
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/library/grid.mako Mon May 24 11:22:12 2010 -0400
@@ -0,0 +1,1 @@
+<%inherit file="/grid_base.mako"/>
diff -r d22853e5963d -r 7faa12ac9746 test/functional/test_library_security.py
--- a/test/functional/test_library_security.py Mon May 24 10:53:55 2010 -0400
+++ b/test/functional/test_library_security.py Mon May 24 11:22:12 2010 -0400
@@ -192,7 +192,7 @@
# regular_user2 should not be to see the library since they do not have
# Role One which is associated with the LIBRARY_ACCESS permission
self.login( email=regular_user2.email )
- self.browse_libraries_regular_user( check_str1="You are not authorized to access any libraries" )
+ self.browse_libraries_regular_user( check_str1="No Items" )
self.logout()
# regular_user3 should not be able to see 1.bed from the analysis view's access librarys
self.login( email=regular_user3.email )
1
0

25 May '10
details: http://www.bx.psu.edu/hg/galaxy/rev/d22853e5963d
changeset: 3810:d22853e5963d
user: jeremy goecks <jeremy.goecks(a)emory.edu>
date: Mon May 24 10:53:55 2010 -0400
description:
In Page editor, prevent extra paragraphs from being inserted with embedded items.
diffstat:
templates/page/editor.mako | 29 ++++++++++++++++++++++++-----
1 files changed, 24 insertions(+), 5 deletions(-)
diffs (48 lines):
diff -r 18bd3fa93bed -r d22853e5963d templates/page/editor.mako
--- a/templates/page/editor.mako Sun May 23 08:46:07 2010 -0400
+++ b/templates/page/editor.mako Mon May 24 10:53:55 2010 -0400
@@ -474,20 +474,39 @@
// Embedded item HTML; item class is embedded in div container classes; this is necessary because the editor strips
// all non-standard attributes when it returns its content (e.g. it will not return an element attribute of the form
// item_class='History').
+ var item_elt_id = item_info.iclass + "-" + item_id;
var item_embed_html =
"\
- <div id='" + item_info.iclass + "-" + item_id + "' class='embedded-item " + item_info.singular.toLowerCase() +
+ <p><div id='" + item_elt_id + "' class='embedded-item " + item_info.singular.toLowerCase() +
" placeholder'> \
<p class='title'>Embedded Galaxy " + item_info.singular + " '" + item_name + "'</p> \
<p class='content'> \
[Do not edit this block; Galaxy will fill it in with the annotated " +
- item_info.singular.toLowerCase() + " when it is displayed.]</div> \
+ item_info.singular.toLowerCase() + " when it is displayed.] \
</p> \
- </div><p></p>";
+ </div></p>";
- // Insert embedded representation into document.
- // TODO: maybe try replace() instead to handle indenting?
+ // Insert embedded item into document.
wym.insert(item_embed_html);
+
+ // TODO: can we fix this?
+ // Due to oddities of wym.insert() [likely due to inserting a <div> and/or a complete paragraph], an
+ // empty paragraph may be included either before or after an embedded item. Remove these paragraphs.
+ $("#" + item_elt_id, wym._doc.body).each( function() {
+ // Remove previous empty paragraphs.
+ var prev_elt = $(this).prev();
+ if ( prev_elt.length != 0 && jQuery.trim(prev_elt.text()) == "" )
+ prev_elt.remove();
+
+ // Remove subsequent empty paragraphs.
+ /*
+ var next_elt = $(this).next();
+ var next_next_elt = next_elt.next();
+ if (next_next_elt.length != 0)
+ next_elt.remove();
+ */
+ });
+
});
hide_modal();
},
1
0
details: http://www.bx.psu.edu/hg/galaxy/rev/18bd3fa93bed
changeset: 3809:18bd3fa93bed
user: fubar: ross Lazarus at gmail period com
date: Sun May 23 08:46:07 2010 -0400
description:
branch merge again?
diffstat:
test-data/sanger_full_range_masked_N.fastqsanger | 8 +
test-data/sanger_full_range_masked_lowercase.fastqsanger | 8 +
tools/fastq/fastq_masker_by_quality.py | 83 ++++++++++++++++
tools/fastq/fastq_masker_by_quality.xml | 53 ++++++++++
4 files changed, 152 insertions(+), 0 deletions(-)
diffs (168 lines):
diff -r f175a156d7e0 -r 18bd3fa93bed test-data/sanger_full_range_masked_N.fastqsanger
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/sanger_full_range_masked_N.fastqsanger Sun May 23 08:46:07 2010 -0400
@@ -0,0 +1,8 @@
+@FAKE0001 Original version has PHRED scores from 0 to 93 inclusive (in that order)
+NNNNNNNNNNNNNNNNNNNNNCGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTAC
++
+!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
+@FAKE0002 Original version has PHRED scores from 93 to 0 inclusive (in that order)
+CATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCNNNNNNNNNNNNNNNNNNNNN
++
+~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!
diff -r f175a156d7e0 -r 18bd3fa93bed test-data/sanger_full_range_masked_lowercase.fastqsanger
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/sanger_full_range_masked_lowercase.fastqsanger Sun May 23 08:46:07 2010 -0400
@@ -0,0 +1,8 @@
+@FAKE0001 Original version has PHRED scores from 0 to 93 inclusive (in that order)
+acgtacgtacgtacgtacgtaCGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTAC
++
+!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
+@FAKE0002 Original version has PHRED scores from 93 to 0 inclusive (in that order)
+CATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCatgcatgcatgcatgcatgca
++
+~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!
diff -r f175a156d7e0 -r 18bd3fa93bed tools/fastq/fastq_masker_by_quality.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/fastq/fastq_masker_by_quality.py Sun May 23 08:46:07 2010 -0400
@@ -0,0 +1,83 @@
+#Dan Blankenberg
+import string
+from optparse import OptionParser
+from galaxy_utils.sequence.fastq import fastqReader, fastqWriter
+
+
+def get_score_comparer( operator ):
+ if operator == 'gt':
+ return compare_gt
+ elif operator == 'ge':
+ return compare_ge
+ elif operator == 'eq':
+ return compare_eq
+ elif operator == 'lt':
+ return compare_lt
+ elif operator == 'le':
+ return compare_le
+ elif operator == 'ne':
+ return compare_ne
+ raise 'Invalid operator provided: %s' % operator
+
+def compare_gt( quality_score, threshold_value ):
+ return quality_score > threshold_value
+
+def compare_ge( quality_score, threshold_value ):
+ return quality_score >= threshold_value
+
+def compare_eq( quality_score, threshold_value ):
+ return quality_score == threshold_value
+
+def compare_ne( quality_score, threshold_value ):
+ return quality_score != threshold_value
+
+def compare_lt( quality_score, threshold_value ):
+ return quality_score < threshold_value
+
+def compare_le( quality_score, threshold_value ):
+ return quality_score <= threshold_value
+
+class BaseReplacer( object ):
+ def __init__( self, replace_character ):
+ self.replace_character = replace_character
+ def __call__( self, base_character ):
+ return self.replace_character
+
+def main():
+ usage = "usage: %prog [options] input_file output_file"
+ parser = OptionParser( usage=usage )
+ parser.add_option( '-f', '--format', dest='format', type='choice', default='sanger', choices=( 'sanger', 'cssanger', 'solexa', 'illumina' ), help='FASTQ variant type' )
+ parser.add_option( '-m', '--mask_character', dest='mask_character', default='N', help='Mask Character to use' )
+ parser.add_option( '-c', '--score_comparison', type="choice", dest='score_comparison', default='le', choices=('gt','ge','eq','lt', 'le', 'ne' ), help='Mask base when score is' )
+ parser.add_option( '-s', '--quality_score', type="float", dest='quality_score', default='0', help='Quality Score' )
+ parser.add_option( "-l", "--lowercase", action="store_true", dest="lowercase", default=False, help="Use lowercase masking")
+ ( options, args ) = parser.parse_args()
+
+ if len ( args ) != 2:
+ parser.error( "Need to specify an input file and an output file" )
+
+ score_comparer = get_score_comparer( options.score_comparison )
+
+ if options.lowercase:
+ base_masker = string.lower
+ else:
+ base_masker = BaseReplacer( options.mask_character )
+
+ out = fastqWriter( open( args[1], 'wb' ), format = options.format )
+
+ num_reads = None
+ num_reads_excluded = 0
+ for num_reads, fastq_read in enumerate( fastqReader( open( args[0] ), format = options.format ) ):
+ sequence_list = list( fastq_read.sequence )
+ for i, quality_score in enumerate( fastq_read.get_decimal_quality_scores() ):
+ if score_comparer( quality_score, options.quality_score ):
+ sequence_list[ i ] = base_masker( sequence_list[ i ] )
+ fastq_read.sequence = "".join( sequence_list )
+ out.write( fastq_read )
+
+ if num_reads is not None:
+ print "Processed %i %s reads." % ( num_reads + 1, options.format )
+ else:
+ print "No valid FASTQ reads were provided."
+
+if __name__ == "__main__": main()
diff -r f175a156d7e0 -r 18bd3fa93bed tools/fastq/fastq_masker_by_quality.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/fastq/fastq_masker_by_quality.xml Sun May 23 08:46:07 2010 -0400
@@ -0,0 +1,53 @@
+<tool id="fastq_masker_by_quality" name="FASTQ Masker" version="1.0.0">
+ <description>by quality score</description>
+ <command interpreter="python">fastq_masker_by_quality.py '$input_file' '$output_file' -f '${input_file.extension[len( 'fastq' ):]}' -s '${quality_score}' -c '${score_comparison}'
+ #if $mask_type.value == 'lowercase'
+ --lowercase
+ #else
+ -m '${mask_type}'
+ #end if
+ </command>
+ <inputs>
+ <param name="input_file" type="data" format="fastqsanger" label="File to mask" />
+ <param name="mask_type" type="select" label="Mask input with">
+ <option value="N">N's</option>
+ <option value="lowercase">Lowercase</option>
+ </param>
+ <param name="score_comparison" type="select" label="When score is">
+ <option value="le" selected="True">Less than or equal</option>
+ <option value="lt">Less than</option>
+ <option value="eq">Equal to</option>
+ <option value="ne">Not Equal to</option>
+ <option value="ge">Greater than</option>
+ <option value="gt">Greater than or equal</option>
+ </param>
+ <param name="quality_score" type="integer" value="0"/>
+ </inputs>
+ <outputs>
+ <data name="output_file" format="fastqsanger" />
+ </outputs>
+ <tests>
+ <test>
+ <param name="input_file" value="sanger_full_range_original_sanger.fastqsanger" ftype="fastqsanger" />
+ <param name="mask_type" value="N" />
+ <param name="score_comparison" value="le" />
+ <param name="quality_score" value="20" />
+ <output name="output_file" file="sanger_full_range_masked_N.fastqsanger" />
+ </test>
+ <test>
+ <param name="input_file" value="sanger_full_range_original_sanger.fastqsanger" ftype="fastqsanger" />
+ <param name="mask_type" value="lowercase" />
+ <param name="score_comparison" value="le" />
+ <param name="quality_score" value="20" />
+ <output name="output_file" file="sanger_full_range_masked_lowercase.fastqsanger" />
+ </test>
+ </tests>
+ <help>
+**What it does**
+
+This tool allows masking base characters in FASTQ format files dependent upon user specified quality score value and comparison method.
+
+This tool is not available for use on color space (csSanger) formats.
+
+ </help>
+</tool>
1
0
details: http://www.bx.psu.edu/hg/galaxy/rev/f175a156d7e0
changeset: 3808:f175a156d7e0
user: fubar: ross Lazarus at gmail period com
date: Sun May 23 08:45:01 2010 -0400
description:
Branch merge
diffstat:
eggs.ini | 2 +-
lib/galaxy/jobs/runners/pbs.py | 133 +++++++++++++-----------------------
tool_conf.xml.sample | 1 +
tools/rgenetics/rgtest_one_tool.sh | 16 ++--
4 files changed, 58 insertions(+), 94 deletions(-)
diffs (243 lines):
diff -r 72d709b2c198 -r f175a156d7e0 eggs.ini
--- a/eggs.ini Sat May 22 19:47:50 2010 -0400
+++ b/eggs.ini Sun May 23 08:45:01 2010 -0400
@@ -17,7 +17,7 @@
DRMAA_python = 0.2
MySQL_python = 1.2.3c1
numpy = 1.3.0
-pbs_python = 2.9.8
+pbs_python = 2.9.4
psycopg2 = 2.0.13
pycrypto = 2.0.1
pysam = 0.1.1
diff -r 72d709b2c198 -r f175a156d7e0 lib/galaxy/jobs/runners/pbs.py
--- a/lib/galaxy/jobs/runners/pbs.py Sat May 22 19:47:50 2010 -0400
+++ b/lib/galaxy/jobs/runners/pbs.py Sun May 23 08:45:01 2010 -0400
@@ -50,19 +50,6 @@
%s
"""
-# From pbs' job.h
-JOB_EXIT_STATUS = {
- 0: "job exec successful",
- -1: "job exec failed, before files, no retry",
- -2: "job exec failed, after files, no retry",
- -3: "job execution failed, do retry",
- -4: "job aborted on MOM initialization",
- -5: "job aborted on MOM init, chkpt, no migrate",
- -6: "job aborted on MOM init, chkpt, ok migrate",
- -7: "job restart failed",
- -8: "exec() of user command failed",
-}
-
class PBSJobState( object ):
def __init__( self ):
"""
@@ -78,7 +65,6 @@
self.efile = None
self.runner_url = None
self.check_count = 0
- self.stop_job = False
class PBSJobRunner( object ):
"""
@@ -207,9 +193,8 @@
pbs_options = self.determine_pbs_options( runner_url )
c = pbs.pbs_connect( pbs_server_name )
if c <= 0:
- errno, text = pbs.error()
job_wrapper.fail( "Unable to queue job for execution. Resubmitting the job may succeed." )
- log.error( "Connection to PBS server for submit failed: %s: %s" % ( errno, text ) )
+ log.error( "Connection to PBS server for submit failed" )
return
# define job attributes
@@ -351,78 +336,58 @@
log.debug( "(%s/%s) Skipping state check because PBS server connection failed" % ( galaxy_job_id, job_id ) )
new_watched.append( pbs_job_state )
continue
- try:
+ if statuses.has_key( job_id ):
status = statuses[job_id]
- except KeyError:
+ if status.job_state != old_state:
+ log.debug("(%s/%s) job state changed from %s to %s" % ( galaxy_job_id, job_id, old_state, status.job_state ) )
+ if status.job_state == "R" and not pbs_job_state.running:
+ pbs_job_state.running = True
+ pbs_job_state.job_wrapper.change_state( model.Job.states.RUNNING )
+ if status.job_state == "R" and ( pbs_job_state.check_count % 20 ) == 0:
+ # Every 20th time the job status is checked, do limit checks (if configured)
+ if self.app.config.output_size_limit > 0:
+ # Check the size of the job outputs
+ fail = False
+ for outfile, size in pbs_job_state.job_wrapper.check_output_sizes():
+ if size > self.app.config.output_size_limit:
+ pbs_job_state.fail_message = 'Job output grew too large (greater than %s), please try different job parameters or' \
+ % nice_size( self.app.config.output_size_limit )
+ log.warning( '(%s/%s) Dequeueing job due to output %s growing larger than %s limit' \
+ % ( galaxy_job_id, job_id, os.path.basename( outfile ), nice_size( self.app.config.output_size_limit ) ) )
+ self.work_queue.put( ( 'fail', pbs_job_state ) )
+ fail = True
+ break
+ if fail:
+ continue
+ if self.job_walltime is not None:
+ # Check the job's execution time
+ if status.get( 'resources_used', False ):
+ # resources_used may not be in the status for new jobs
+ h, m, s = [ int( i ) for i in status.resources_used.walltime.split( ':' ) ]
+ time_executing = timedelta( 0, s, 0, 0, m, h )
+ if time_executing > self.job_walltime:
+ pbs_job_state.fail_message = 'Job ran longer than maximum allowed execution time (%s), please try different job parameters or' \
+ % self.app.config.job_walltime
+ log.warning( '(%s/%s) Dequeueing job since walltime has been reached' \
+ % ( galaxy_job_id, job_id ) )
+ self.work_queue.put( ( 'fail', pbs_job_state ) )
+ continue
+ pbs_job_state.old_state = status.job_state
+ new_watched.append( pbs_job_state )
+ else:
try:
- # Recheck to make sure it wasn't a communication problem
+ # recheck to make sure it wasn't a communication problem
self.check_single_job( pbs_server_name, job_id )
- log.warning( "(%s/%s) PBS job was not in state check list, but was found with individual state check" % ( galaxy_job_id, job_id ) )
+ log.warning( "(%s/%s) job was not in state check list, but was found with individual state check" % ( galaxy_job_id, job_id ) )
new_watched.append( pbs_job_state )
except:
errno, text = pbs.error()
- if errno == 15001:
- # 15001 == job not in queue
- log.debug("(%s/%s) PBS job has left queue" % (galaxy_job_id, job_id) )
+ if errno != 15001:
+ log.info("(%s/%s) state check resulted in error (%d): %s" % (galaxy_job_id, job_id, errno, text) )
+ new_watched.append( pbs_job_state )
+ else:
+ log.debug("(%s/%s) job has left queue" % (galaxy_job_id, job_id) )
self.work_queue.put( ( 'finish', pbs_job_state ) )
- else:
- # Unhandled error, continue to monitor
- log.info("(%s/%s) PBS state check resulted in error (%d): %s" % (galaxy_job_id, job_id, errno, text) )
- new_watched.append( pbs_job_state )
- continue
- if status.job_state != old_state:
- log.debug("(%s/%s) PBS job state changed from %s to %s" % ( galaxy_job_id, job_id, old_state, status.job_state ) )
- if status.job_state == "R" and not pbs_job_state.running:
- pbs_job_state.running = True
- pbs_job_state.job_wrapper.change_state( model.Job.states.RUNNING )
- if status.job_state == "R" and ( pbs_job_state.check_count % 20 ) == 0:
- # Every 20th time the job status is checked, do limit checks (if configured)
- if self.app.config.output_size_limit > 0:
- # Check the size of the job outputs
- fail = False
- for outfile, size in pbs_job_state.job_wrapper.check_output_sizes():
- if size > self.app.config.output_size_limit:
- pbs_job_state.fail_message = 'Job output grew too large (greater than %s), please try different job parameters or' \
- % nice_size( self.app.config.output_size_limit )
- log.warning( '(%s/%s) Dequeueing job due to output %s growing larger than %s limit' \
- % ( galaxy_job_id, job_id, os.path.basename( outfile ), nice_size( self.app.config.output_size_limit ) ) )
- pbs_job_state.stop_job = True
- self.work_queue.put( ( 'fail', pbs_job_state ) )
- fail = True
- break
- if fail:
- continue
- if self.job_walltime is not None:
- # Check the job's execution time
- if status.get( 'resources_used', False ):
- # resources_used may not be in the status for new jobs
- h, m, s = [ int( i ) for i in status.resources_used.walltime.split( ':' ) ]
- time_executing = timedelta( 0, s, 0, 0, m, h )
- if time_executing > self.job_walltime:
- pbs_job_state.fail_message = 'Job ran longer than maximum allowed execution time (%s), please try different job parameters or' \
- % self.app.config.job_walltime
- log.warning( '(%s/%s) Dequeueing job since walltime has been reached' \
- % ( galaxy_job_id, job_id ) )
- pbs_job_state.stop_job = True
- self.work_queue.put( ( 'fail', pbs_job_state ) )
- continue
- elif status.job_state == "C":
- # "keep_completed" is enabled in PBS, so try to check exit status
- try:
- assert int( status.exit_status ) == 0
- log.debug("(%s/%s) PBS job has completed successfully" % ( galaxy_job_id, job_id ) )
- except AssertionError:
- pbs_job_state.fail_message = 'Job cannot be completed due to a cluster error. Please retry or'
- log.error( '(%s/%s) PBS job failed: %s' % ( galaxy_job_id, job_id, JOB_EXIT_STATUS.get( int( status.exit_status ), 'Unknown error: %s' % status.exit_status ) ) )
- self.work_queue.put( ( 'fail', pbs_job_state ) )
- continue
- except AttributeError:
- # No exit_status, can't verify proper completion so we just have to assume success.
- log.debug("(%s/%s) PBS job has completed" % ( galaxy_job_id, job_id ) )
- self.work_queue.put( ( 'finish', pbs_job_state ) )
- continue
- pbs_job_state.old_state = status.job_state
- new_watched.append( pbs_job_state )
# Replace the watch list with the updated version
self.watched = new_watched
@@ -446,10 +411,9 @@
log.debug("connection to PBS server %s for state check failed" % pbs_server_name )
failures.append( pbs_server_name )
continue
- stat_attrl = pbs.new_attrl(3)
+ stat_attrl = pbs.new_attrl(2)
stat_attrl[0].name = pbs.ATTR_state
stat_attrl[1].name = pbs.ATTR_used
- stat_attrl[2].name = pbs.ATTR_exitstat
jobs = pbs.pbs_statjob( c, None, stat_attrl, None )
pbs.pbs_disconnect( c )
statuses.update( self.convert_statjob_to_bunches( jobs ) )
@@ -516,8 +480,7 @@
"""
Seperated out so we can use the worker threads for it.
"""
- if pbs_job_state.stop_job:
- self.stop_job( self.sa_session.query( self.app.model.Job ).get( pbs_job_state.job_wrapper.job_id ) )
+ self.stop_job( self.sa_session.query( self.app.model.Job ).get( pbs_job_state.job_wrapper.job_id ) )
pbs_job_state.job_wrapper.fail( pbs_job_state.fail_message )
self.cleanup( ( pbs_job_state.ofile, pbs_job_state.efile, pbs_job_state.job_file ) )
diff -r 72d709b2c198 -r f175a156d7e0 tool_conf.xml.sample
--- a/tool_conf.xml.sample Sat May 22 19:47:50 2010 -0400
+++ b/tool_conf.xml.sample Sun May 23 08:45:01 2010 -0400
@@ -221,6 +221,7 @@
<tool file="fastq/fastq_filter.xml" />
<tool file="fastq/fastq_trimmer.xml" />
<tool file="fastq/fastq_trimmer_by_quality.xml" />
+ <tool file="fastq/fastq_masker_by_quality.xml" />
<tool file="fastq/fastq_manipulation.xml" />
<tool file="fastq/fastq_to_fasta.xml" />
<tool file="fastq/fastq_to_tabular.xml" />
diff -r 72d709b2c198 -r f175a156d7e0 tools/rgenetics/rgtest_one_tool.sh
--- a/tools/rgenetics/rgtest_one_tool.sh Sat May 22 19:47:50 2010 -0400
+++ b/tools/rgenetics/rgtest_one_tool.sh Sun May 23 08:45:01 2010 -0400
@@ -1,20 +1,20 @@
#!/bin/sh
# script to generate all functional test outputs for each rgenetics tool
# could be run at installation to ensure all dependencies are in place?
-case $# in 0) echo "USAGE: ${0##*/} TooltoTest"; exit 1;;
- [2-10]*) echo "Too many arguments - name of tool only"; exit 2;;
+case $# in 0) echo "USAGE: ${0##*/} TooltoTest galaxyRoot outRoot"; exit 1;;
+ [1-3]*) echo "Need ToolToTest and paths for galaxyRoot outRoot as parameters"; exit 2;;
+ [5-10]*) echo "Too many arguments - ToolToTest and paths for galaxyRoot outRoot as parameters"; exit 2;;
*)
esac
-GALAXYROOT=`pwd`
-#PATHTOGALAXY='/opt/galaxy' # whatever
-PATHTOGALAXY='/share/shared/galaxy' # whatever
+GALAXYROOT=$2
+OUTROOT=$3
echo "using $GALAXYROOT"
# change this as needed for your local install
INPATH="${GALAXYROOT}/test-data"
BINPATH="${GALAXYROOT}/tool-data/rg/bin"
-TOOLPATH="${PATHTOGALAXY}/tools/rgenetics"
-OROOT="${GALAXYROOT}/test-data/rgtestouts"
-NORMALOROOT="${GALAXYROOT}/test-data"
+TOOLPATH="${GALAXYROOT}/tools/rgenetics"
+OROOT="${OUTROOT}/test-data/rgtestouts"
+NORMALOROOT="${OUTROOT}/test-data"
case "$1" in
'rgManQQ')
1
0

25 May '10
details: http://www.bx.psu.edu/hg/galaxy/rev/72d709b2c198
changeset: 3807:72d709b2c198
user: fubar: ross Lazarus at gmail period com
date: Sat May 22 19:47:50 2010 -0400
description:
Require two paths for rgtest.sh galaxyroot and outroot
test with a /tmp path for outroot...this script will recreate all the
snp/wga test outputs if you ask it to - which may or may not be what
you want...
diffstat:
tools/rgenetics/rgEigPCA.xml | 2 +-
tools/rgenetics/rgtest.sh | 27 +++++++++++++++++++++++----
2 files changed, 24 insertions(+), 5 deletions(-)
diffs (53 lines):
diff -r 3b8e4af25be2 -r 72d709b2c198 tools/rgenetics/rgEigPCA.xml
--- a/tools/rgenetics/rgEigPCA.xml Fri May 21 15:50:49 2010 -0400
+++ b/tools/rgenetics/rgEigPCA.xml Sat May 22 19:47:50 2010 -0400
@@ -48,7 +48,7 @@
<param name="t" value="2" />
<param name="s" value="2" />
<output name='out_file1' file='rgtestouts/rgEigPCA/rgEigPCAtest1.html' ftype='html' compare='diff' lines_diff='195'>
- <extra_files type="file" name='rgEigPCAtest1_PCAPlot.pdf' value="rgtestouts/rgEigPCA/rgEigPCAtest1_PCAPlot.pdf" compare="sim_size" delta="30000"/>
+ <extra_files type="file" name='rgEigPCAtest1_PCAPlot.pdf' value="rgtestouts/rgEigPCA/rgEigPCAtest1_PCAPlot.pdf" compare="sim_size" delta="3000"/>
</output>
<output name='pca' file='rgtestouts/rgEigPCA/rgEigPCAtest1.txt' compare='diff'/>
</test>
diff -r 3b8e4af25be2 -r 72d709b2c198 tools/rgenetics/rgtest.sh
--- a/tools/rgenetics/rgtest.sh Fri May 21 15:50:49 2010 -0400
+++ b/tools/rgenetics/rgtest.sh Sat May 22 19:47:50 2010 -0400
@@ -1,14 +1,33 @@
#!/bin/sh
# script to generate all functional test outputs for each rgenetics tool
# could be run at installation to ensure all dependencies are in place?
-GALAXYROOT=`pwd`
-echo "using $GALAXYROOT"
+if test $# -lt 2
+then
+ echo "We need to agree on 2 parameters - GalaxyRoot and OutRoot - use paths to galaxy and galaxy to re-create all test outputs"
+ echo "or more prudently, galaxy and /tmp/foo for checking without updating all your test-data"
+ echo "Exiting with no changes"
+ exit 1
+fi
+if [ $1 ]
+then
+ GALAXYROOT=$1
+else
+ GALAXYROOT=`pwd`
+fi
+if [ $2 ]
+then
+ OUTROOT=$2
+else
+ OUTROOT=`pwd`
+ OUTROOT="$OUTROOT/test-data"
+fi
+echo "using $GALAXYROOT as galaxyroot and $OUTROOT as outroot"
# change this as needed for your local install
INPATH="${GALAXYROOT}/test-data"
BINPATH="${GALAXYROOT}/tool-data/rg/bin"
TOOLPATH="${GALAXYROOT}/tools/rgenetics"
-OROOT="${GALAXYROOT}/test-data/rgtestouts"
-NORMALOROOT="${GALAXYROOT}/test-data"
+OROOT="${OUTROOT}/test-data/rgtestouts"
+NORMALOROOT="${OUTROOT}/test-data"
mkdir -p $OROOT
rm -rf $OROOT/*
# needed for testing - but tool versions should be bumped if this is rerun?
1
0
details: http://www.bx.psu.edu/hg/galaxy/rev/aa84d012cb50
changeset: 3806:aa84d012cb50
user: fubar/ross period lazarus at gmail d0t com
date: Sat May 22 20:04:38 2010 -0400
description:
Require 2 paths for rgtest.sh
This script will overwrite all the snp/wga test outputs if you ask it to
diffstat:
tools/rgenetics/rgtest.sh | 27 +++++++++++++++++++++++----
1 files changed, 23 insertions(+), 4 deletions(-)
diffs (41 lines):
diff -r 88afe0a30dc7 -r aa84d012cb50 tools/rgenetics/rgtest.sh
--- a/tools/rgenetics/rgtest.sh Fri May 21 16:53:42 2010 -0400
+++ b/tools/rgenetics/rgtest.sh Sat May 22 20:04:38 2010 -0400
@@ -1,14 +1,33 @@
#!/bin/sh
# script to generate all functional test outputs for each rgenetics tool
# could be run at installation to ensure all dependencies are in place?
-GALAXYROOT=`pwd`
-echo "using $GALAXYROOT"
+if test $# -lt 2
+then
+ echo "We need to agree on 2 parameters - GalaxyRoot and OutRoot - use paths to galaxy and galaxy to re-create all test outputs"
+ echo "or more prudently, galaxy and /tmp/foo for checking without updating all your test-data"
+ echo "Exiting with no changes"
+ exit 1
+fi
+if [ $1 ]
+then
+ GALAXYROOT=$1
+else
+ GALAXYROOT=`pwd`
+fi
+if [ $2 ]
+then
+ OUTROOT=$2
+else
+ OUTROOT=`pwd`
+ OUTROOT="$OUTROOT/test-data"
+fi
+echo "using $GALAXYROOT as galaxyroot and $OUTROOT as outroot"
# change this as needed for your local install
INPATH="${GALAXYROOT}/test-data"
BINPATH="${GALAXYROOT}/tool-data/rg/bin"
TOOLPATH="${GALAXYROOT}/tools/rgenetics"
-OROOT="${GALAXYROOT}/test-data/rgtestouts"
-NORMALOROOT="${GALAXYROOT}/test-data"
+OROOT="${OUTROOT}/test-data/rgtestouts"
+NORMALOROOT="${OUTROOT}/test-data"
mkdir -p $OROOT
rm -rf $OROOT/*
# needed for testing - but tool versions should be bumped if this is rerun?
1
0
details: http://www.bx.psu.edu/hg/galaxy/rev/88afe0a30dc7
changeset: 3805:88afe0a30dc7
user: Nate Coraor <nate(a)bx.psu.edu>
date: Fri May 21 16:53:42 2010 -0400
description:
merge backout
diffstat:
eggs.ini | 2 +-
lib/galaxy/jobs/runners/pbs.py | 133 ++++++++++++++--------------------------
2 files changed, 49 insertions(+), 86 deletions(-)
diffs (200 lines):
diff -r c9b41f94d707 -r 88afe0a30dc7 eggs.ini
--- a/eggs.ini Fri May 21 16:48:59 2010 -0400
+++ b/eggs.ini Fri May 21 16:53:42 2010 -0400
@@ -17,7 +17,7 @@
DRMAA_python = 0.2
MySQL_python = 1.2.3c1
numpy = 1.3.0
-pbs_python = 2.9.8
+pbs_python = 2.9.4
psycopg2 = 2.0.13
pycrypto = 2.0.1
pysam = 0.1.1
diff -r c9b41f94d707 -r 88afe0a30dc7 lib/galaxy/jobs/runners/pbs.py
--- a/lib/galaxy/jobs/runners/pbs.py Fri May 21 16:48:59 2010 -0400
+++ b/lib/galaxy/jobs/runners/pbs.py Fri May 21 16:53:42 2010 -0400
@@ -50,19 +50,6 @@
%s
"""
-# From pbs' job.h
-JOB_EXIT_STATUS = {
- 0: "job exec successful",
- -1: "job exec failed, before files, no retry",
- -2: "job exec failed, after files, no retry",
- -3: "job execution failed, do retry",
- -4: "job aborted on MOM initialization",
- -5: "job aborted on MOM init, chkpt, no migrate",
- -6: "job aborted on MOM init, chkpt, ok migrate",
- -7: "job restart failed",
- -8: "exec() of user command failed",
-}
-
class PBSJobState( object ):
def __init__( self ):
"""
@@ -78,7 +65,6 @@
self.efile = None
self.runner_url = None
self.check_count = 0
- self.stop_job = False
class PBSJobRunner( object ):
"""
@@ -207,9 +193,8 @@
pbs_options = self.determine_pbs_options( runner_url )
c = pbs.pbs_connect( pbs_server_name )
if c <= 0:
- errno, text = pbs.error()
job_wrapper.fail( "Unable to queue job for execution. Resubmitting the job may succeed." )
- log.error( "Connection to PBS server for submit failed: %s: %s" % ( errno, text ) )
+ log.error( "Connection to PBS server for submit failed" )
return
# define job attributes
@@ -351,78 +336,58 @@
log.debug( "(%s/%s) Skipping state check because PBS server connection failed" % ( galaxy_job_id, job_id ) )
new_watched.append( pbs_job_state )
continue
- try:
+ if statuses.has_key( job_id ):
status = statuses[job_id]
- except KeyError:
+ if status.job_state != old_state:
+ log.debug("(%s/%s) job state changed from %s to %s" % ( galaxy_job_id, job_id, old_state, status.job_state ) )
+ if status.job_state == "R" and not pbs_job_state.running:
+ pbs_job_state.running = True
+ pbs_job_state.job_wrapper.change_state( model.Job.states.RUNNING )
+ if status.job_state == "R" and ( pbs_job_state.check_count % 20 ) == 0:
+ # Every 20th time the job status is checked, do limit checks (if configured)
+ if self.app.config.output_size_limit > 0:
+ # Check the size of the job outputs
+ fail = False
+ for outfile, size in pbs_job_state.job_wrapper.check_output_sizes():
+ if size > self.app.config.output_size_limit:
+ pbs_job_state.fail_message = 'Job output grew too large (greater than %s), please try different job parameters or' \
+ % nice_size( self.app.config.output_size_limit )
+ log.warning( '(%s/%s) Dequeueing job due to output %s growing larger than %s limit' \
+ % ( galaxy_job_id, job_id, os.path.basename( outfile ), nice_size( self.app.config.output_size_limit ) ) )
+ self.work_queue.put( ( 'fail', pbs_job_state ) )
+ fail = True
+ break
+ if fail:
+ continue
+ if self.job_walltime is not None:
+ # Check the job's execution time
+ if status.get( 'resources_used', False ):
+ # resources_used may not be in the status for new jobs
+ h, m, s = [ int( i ) for i in status.resources_used.walltime.split( ':' ) ]
+ time_executing = timedelta( 0, s, 0, 0, m, h )
+ if time_executing > self.job_walltime:
+ pbs_job_state.fail_message = 'Job ran longer than maximum allowed execution time (%s), please try different job parameters or' \
+ % self.app.config.job_walltime
+ log.warning( '(%s/%s) Dequeueing job since walltime has been reached' \
+ % ( galaxy_job_id, job_id ) )
+ self.work_queue.put( ( 'fail', pbs_job_state ) )
+ continue
+ pbs_job_state.old_state = status.job_state
+ new_watched.append( pbs_job_state )
+ else:
try:
- # Recheck to make sure it wasn't a communication problem
+ # recheck to make sure it wasn't a communication problem
self.check_single_job( pbs_server_name, job_id )
- log.warning( "(%s/%s) PBS job was not in state check list, but was found with individual state check" % ( galaxy_job_id, job_id ) )
+ log.warning( "(%s/%s) job was not in state check list, but was found with individual state check" % ( galaxy_job_id, job_id ) )
new_watched.append( pbs_job_state )
except:
errno, text = pbs.error()
- if errno == 15001:
- # 15001 == job not in queue
- log.debug("(%s/%s) PBS job has left queue" % (galaxy_job_id, job_id) )
+ if errno != 15001:
+ log.info("(%s/%s) state check resulted in error (%d): %s" % (galaxy_job_id, job_id, errno, text) )
+ new_watched.append( pbs_job_state )
+ else:
+ log.debug("(%s/%s) job has left queue" % (galaxy_job_id, job_id) )
self.work_queue.put( ( 'finish', pbs_job_state ) )
- else:
- # Unhandled error, continue to monitor
- log.info("(%s/%s) PBS state check resulted in error (%d): %s" % (galaxy_job_id, job_id, errno, text) )
- new_watched.append( pbs_job_state )
- continue
- if status.job_state != old_state:
- log.debug("(%s/%s) PBS job state changed from %s to %s" % ( galaxy_job_id, job_id, old_state, status.job_state ) )
- if status.job_state == "R" and not pbs_job_state.running:
- pbs_job_state.running = True
- pbs_job_state.job_wrapper.change_state( model.Job.states.RUNNING )
- if status.job_state == "R" and ( pbs_job_state.check_count % 20 ) == 0:
- # Every 20th time the job status is checked, do limit checks (if configured)
- if self.app.config.output_size_limit > 0:
- # Check the size of the job outputs
- fail = False
- for outfile, size in pbs_job_state.job_wrapper.check_output_sizes():
- if size > self.app.config.output_size_limit:
- pbs_job_state.fail_message = 'Job output grew too large (greater than %s), please try different job parameters or' \
- % nice_size( self.app.config.output_size_limit )
- log.warning( '(%s/%s) Dequeueing job due to output %s growing larger than %s limit' \
- % ( galaxy_job_id, job_id, os.path.basename( outfile ), nice_size( self.app.config.output_size_limit ) ) )
- pbs_job_state.stop_job = True
- self.work_queue.put( ( 'fail', pbs_job_state ) )
- fail = True
- break
- if fail:
- continue
- if self.job_walltime is not None:
- # Check the job's execution time
- if status.get( 'resources_used', False ):
- # resources_used may not be in the status for new jobs
- h, m, s = [ int( i ) for i in status.resources_used.walltime.split( ':' ) ]
- time_executing = timedelta( 0, s, 0, 0, m, h )
- if time_executing > self.job_walltime:
- pbs_job_state.fail_message = 'Job ran longer than maximum allowed execution time (%s), please try different job parameters or' \
- % self.app.config.job_walltime
- log.warning( '(%s/%s) Dequeueing job since walltime has been reached' \
- % ( galaxy_job_id, job_id ) )
- pbs_job_state.stop_job = True
- self.work_queue.put( ( 'fail', pbs_job_state ) )
- continue
- elif status.job_state == "C":
- # "keep_completed" is enabled in PBS, so try to check exit status
- try:
- assert int( status.exit_status ) == 0
- log.debug("(%s/%s) PBS job has completed successfully" % ( galaxy_job_id, job_id ) )
- except AssertionError:
- pbs_job_state.fail_message = 'Job cannot be completed due to a cluster error. Please retry or'
- log.error( '(%s/%s) PBS job failed: %s' % ( galaxy_job_id, job_id, JOB_EXIT_STATUS.get( int( status.exit_status ), 'Unknown error: %s' % status.exit_status ) ) )
- self.work_queue.put( ( 'fail', pbs_job_state ) )
- continue
- except AttributeError:
- # No exit_status, can't verify proper completion so we just have to assume success.
- log.debug("(%s/%s) PBS job has completed" % ( galaxy_job_id, job_id ) )
- self.work_queue.put( ( 'finish', pbs_job_state ) )
- continue
- pbs_job_state.old_state = status.job_state
- new_watched.append( pbs_job_state )
# Replace the watch list with the updated version
self.watched = new_watched
@@ -446,10 +411,9 @@
log.debug("connection to PBS server %s for state check failed" % pbs_server_name )
failures.append( pbs_server_name )
continue
- stat_attrl = pbs.new_attrl(3)
+ stat_attrl = pbs.new_attrl(2)
stat_attrl[0].name = pbs.ATTR_state
stat_attrl[1].name = pbs.ATTR_used
- stat_attrl[2].name = pbs.ATTR_exitstat
jobs = pbs.pbs_statjob( c, None, stat_attrl, None )
pbs.pbs_disconnect( c )
statuses.update( self.convert_statjob_to_bunches( jobs ) )
@@ -516,8 +480,7 @@
"""
Seperated out so we can use the worker threads for it.
"""
- if pbs_job_state.stop_job:
- self.stop_job( self.sa_session.query( self.app.model.Job ).get( pbs_job_state.job_wrapper.job_id ) )
+ self.stop_job( self.sa_session.query( self.app.model.Job ).get( pbs_job_state.job_wrapper.job_id ) )
pbs_job_state.job_wrapper.fail( pbs_job_state.fail_message )
self.cleanup( ( pbs_job_state.ofile, pbs_job_state.efile, pbs_job_state.job_file ) )
1
0

25 May '10
details: http://www.bx.psu.edu/hg/galaxy/rev/b1619e50417f
changeset: 3804:b1619e50417f
user: Nate Coraor <nate(a)bx.psu.edu>
date: Fri May 21 16:53:29 2010 -0400
description:
Backed out changeset 48432330228e. pbs_python 2.9.8 is causing the job runner to segfault.
diffstat:
eggs.ini | 2 +-
lib/galaxy/jobs/runners/pbs.py | 133 ++++++++++++++--------------------------
2 files changed, 49 insertions(+), 86 deletions(-)
diffs (200 lines):
diff -r 48432330228e -r b1619e50417f eggs.ini
--- a/eggs.ini Fri May 14 10:37:36 2010 -0400
+++ b/eggs.ini Fri May 21 16:53:29 2010 -0400
@@ -17,7 +17,7 @@
DRMAA_python = 0.2
MySQL_python = 1.2.3c1
numpy = 1.3.0
-pbs_python = 2.9.8
+pbs_python = 2.9.4
psycopg2 = 2.0.13
pycrypto = 2.0.1
pysam = 0.1.1
diff -r 48432330228e -r b1619e50417f lib/galaxy/jobs/runners/pbs.py
--- a/lib/galaxy/jobs/runners/pbs.py Fri May 14 10:37:36 2010 -0400
+++ b/lib/galaxy/jobs/runners/pbs.py Fri May 21 16:53:29 2010 -0400
@@ -50,19 +50,6 @@
%s
"""
-# From pbs' job.h
-JOB_EXIT_STATUS = {
- 0: "job exec successful",
- -1: "job exec failed, before files, no retry",
- -2: "job exec failed, after files, no retry",
- -3: "job execution failed, do retry",
- -4: "job aborted on MOM initialization",
- -5: "job aborted on MOM init, chkpt, no migrate",
- -6: "job aborted on MOM init, chkpt, ok migrate",
- -7: "job restart failed",
- -8: "exec() of user command failed",
-}
-
class PBSJobState( object ):
def __init__( self ):
"""
@@ -78,7 +65,6 @@
self.efile = None
self.runner_url = None
self.check_count = 0
- self.stop_job = False
class PBSJobRunner( object ):
"""
@@ -207,9 +193,8 @@
pbs_options = self.determine_pbs_options( runner_url )
c = pbs.pbs_connect( pbs_server_name )
if c <= 0:
- errno, text = pbs.error()
job_wrapper.fail( "Unable to queue job for execution. Resubmitting the job may succeed." )
- log.error( "Connection to PBS server for submit failed: %s: %s" % ( errno, text ) )
+ log.error( "Connection to PBS server for submit failed" )
return
# define job attributes
@@ -351,78 +336,58 @@
log.debug( "(%s/%s) Skipping state check because PBS server connection failed" % ( galaxy_job_id, job_id ) )
new_watched.append( pbs_job_state )
continue
- try:
+ if statuses.has_key( job_id ):
status = statuses[job_id]
- except KeyError:
+ if status.job_state != old_state:
+ log.debug("(%s/%s) job state changed from %s to %s" % ( galaxy_job_id, job_id, old_state, status.job_state ) )
+ if status.job_state == "R" and not pbs_job_state.running:
+ pbs_job_state.running = True
+ pbs_job_state.job_wrapper.change_state( model.Job.states.RUNNING )
+ if status.job_state == "R" and ( pbs_job_state.check_count % 20 ) == 0:
+ # Every 20th time the job status is checked, do limit checks (if configured)
+ if self.app.config.output_size_limit > 0:
+ # Check the size of the job outputs
+ fail = False
+ for outfile, size in pbs_job_state.job_wrapper.check_output_sizes():
+ if size > self.app.config.output_size_limit:
+ pbs_job_state.fail_message = 'Job output grew too large (greater than %s), please try different job parameters or' \
+ % nice_size( self.app.config.output_size_limit )
+ log.warning( '(%s/%s) Dequeueing job due to output %s growing larger than %s limit' \
+ % ( galaxy_job_id, job_id, os.path.basename( outfile ), nice_size( self.app.config.output_size_limit ) ) )
+ self.work_queue.put( ( 'fail', pbs_job_state ) )
+ fail = True
+ break
+ if fail:
+ continue
+ if self.job_walltime is not None:
+ # Check the job's execution time
+ if status.get( 'resources_used', False ):
+ # resources_used may not be in the status for new jobs
+ h, m, s = [ int( i ) for i in status.resources_used.walltime.split( ':' ) ]
+ time_executing = timedelta( 0, s, 0, 0, m, h )
+ if time_executing > self.job_walltime:
+ pbs_job_state.fail_message = 'Job ran longer than maximum allowed execution time (%s), please try different job parameters or' \
+ % self.app.config.job_walltime
+ log.warning( '(%s/%s) Dequeueing job since walltime has been reached' \
+ % ( galaxy_job_id, job_id ) )
+ self.work_queue.put( ( 'fail', pbs_job_state ) )
+ continue
+ pbs_job_state.old_state = status.job_state
+ new_watched.append( pbs_job_state )
+ else:
try:
- # Recheck to make sure it wasn't a communication problem
+ # recheck to make sure it wasn't a communication problem
self.check_single_job( pbs_server_name, job_id )
- log.warning( "(%s/%s) PBS job was not in state check list, but was found with individual state check" % ( galaxy_job_id, job_id ) )
+ log.warning( "(%s/%s) job was not in state check list, but was found with individual state check" % ( galaxy_job_id, job_id ) )
new_watched.append( pbs_job_state )
except:
errno, text = pbs.error()
- if errno == 15001:
- # 15001 == job not in queue
- log.debug("(%s/%s) PBS job has left queue" % (galaxy_job_id, job_id) )
+ if errno != 15001:
+ log.info("(%s/%s) state check resulted in error (%d): %s" % (galaxy_job_id, job_id, errno, text) )
+ new_watched.append( pbs_job_state )
+ else:
+ log.debug("(%s/%s) job has left queue" % (galaxy_job_id, job_id) )
self.work_queue.put( ( 'finish', pbs_job_state ) )
- else:
- # Unhandled error, continue to monitor
- log.info("(%s/%s) PBS state check resulted in error (%d): %s" % (galaxy_job_id, job_id, errno, text) )
- new_watched.append( pbs_job_state )
- continue
- if status.job_state != old_state:
- log.debug("(%s/%s) PBS job state changed from %s to %s" % ( galaxy_job_id, job_id, old_state, status.job_state ) )
- if status.job_state == "R" and not pbs_job_state.running:
- pbs_job_state.running = True
- pbs_job_state.job_wrapper.change_state( model.Job.states.RUNNING )
- if status.job_state == "R" and ( pbs_job_state.check_count % 20 ) == 0:
- # Every 20th time the job status is checked, do limit checks (if configured)
- if self.app.config.output_size_limit > 0:
- # Check the size of the job outputs
- fail = False
- for outfile, size in pbs_job_state.job_wrapper.check_output_sizes():
- if size > self.app.config.output_size_limit:
- pbs_job_state.fail_message = 'Job output grew too large (greater than %s), please try different job parameters or' \
- % nice_size( self.app.config.output_size_limit )
- log.warning( '(%s/%s) Dequeueing job due to output %s growing larger than %s limit' \
- % ( galaxy_job_id, job_id, os.path.basename( outfile ), nice_size( self.app.config.output_size_limit ) ) )
- pbs_job_state.stop_job = True
- self.work_queue.put( ( 'fail', pbs_job_state ) )
- fail = True
- break
- if fail:
- continue
- if self.job_walltime is not None:
- # Check the job's execution time
- if status.get( 'resources_used', False ):
- # resources_used may not be in the status for new jobs
- h, m, s = [ int( i ) for i in status.resources_used.walltime.split( ':' ) ]
- time_executing = timedelta( 0, s, 0, 0, m, h )
- if time_executing > self.job_walltime:
- pbs_job_state.fail_message = 'Job ran longer than maximum allowed execution time (%s), please try different job parameters or' \
- % self.app.config.job_walltime
- log.warning( '(%s/%s) Dequeueing job since walltime has been reached' \
- % ( galaxy_job_id, job_id ) )
- pbs_job_state.stop_job = True
- self.work_queue.put( ( 'fail', pbs_job_state ) )
- continue
- elif status.job_state == "C":
- # "keep_completed" is enabled in PBS, so try to check exit status
- try:
- assert int( status.exit_status ) == 0
- log.debug("(%s/%s) PBS job has completed successfully" % ( galaxy_job_id, job_id ) )
- except AssertionError:
- pbs_job_state.fail_message = 'Job cannot be completed due to a cluster error. Please retry or'
- log.error( '(%s/%s) PBS job failed: %s' % ( galaxy_job_id, job_id, JOB_EXIT_STATUS.get( int( status.exit_status ), 'Unknown error: %s' % status.exit_status ) ) )
- self.work_queue.put( ( 'fail', pbs_job_state ) )
- continue
- except AttributeError:
- # No exit_status, can't verify proper completion so we just have to assume success.
- log.debug("(%s/%s) PBS job has completed" % ( galaxy_job_id, job_id ) )
- self.work_queue.put( ( 'finish', pbs_job_state ) )
- continue
- pbs_job_state.old_state = status.job_state
- new_watched.append( pbs_job_state )
# Replace the watch list with the updated version
self.watched = new_watched
@@ -446,10 +411,9 @@
log.debug("connection to PBS server %s for state check failed" % pbs_server_name )
failures.append( pbs_server_name )
continue
- stat_attrl = pbs.new_attrl(3)
+ stat_attrl = pbs.new_attrl(2)
stat_attrl[0].name = pbs.ATTR_state
stat_attrl[1].name = pbs.ATTR_used
- stat_attrl[2].name = pbs.ATTR_exitstat
jobs = pbs.pbs_statjob( c, None, stat_attrl, None )
pbs.pbs_disconnect( c )
statuses.update( self.convert_statjob_to_bunches( jobs ) )
@@ -516,8 +480,7 @@
"""
Seperated out so we can use the worker threads for it.
"""
- if pbs_job_state.stop_job:
- self.stop_job( self.sa_session.query( self.app.model.Job ).get( pbs_job_state.job_wrapper.job_id ) )
+ self.stop_job( self.sa_session.query( self.app.model.Job ).get( pbs_job_state.job_wrapper.job_id ) )
pbs_job_state.job_wrapper.fail( pbs_job_state.fail_message )
self.cleanup( ( pbs_job_state.ofile, pbs_job_state.efile, pbs_job_state.job_file ) )
1
0

25 May '10
details: http://www.bx.psu.edu/hg/galaxy/rev/c9b41f94d707
changeset: 3803:c9b41f94d707
user: Dan Blankenberg <dan(a)bx.psu.edu>
date: Fri May 21 16:48:59 2010 -0400
description:
Add a tool to mask FASTQ bases according to quality score. Currently replacement by Ns or lowercase is allowed.
diffstat:
test-data/sanger_full_range_masked_N.fastqsanger | 8 +
test-data/sanger_full_range_masked_lowercase.fastqsanger | 8 +
tool_conf.xml.sample | 1 +
tools/fastq/fastq_masker_by_quality.py | 83 ++++++++++++++++
tools/fastq/fastq_masker_by_quality.xml | 53 ++++++++++
5 files changed, 153 insertions(+), 0 deletions(-)
diffs (179 lines):
diff -r 3b8e4af25be2 -r c9b41f94d707 test-data/sanger_full_range_masked_N.fastqsanger
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/sanger_full_range_masked_N.fastqsanger Fri May 21 16:48:59 2010 -0400
@@ -0,0 +1,8 @@
+@FAKE0001 Original version has PHRED scores from 0 to 93 inclusive (in that order)
+NNNNNNNNNNNNNNNNNNNNNCGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTAC
++
+!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
+@FAKE0002 Original version has PHRED scores from 93 to 0 inclusive (in that order)
+CATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCNNNNNNNNNNNNNNNNNNNNN
++
+~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!
diff -r 3b8e4af25be2 -r c9b41f94d707 test-data/sanger_full_range_masked_lowercase.fastqsanger
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/sanger_full_range_masked_lowercase.fastqsanger Fri May 21 16:48:59 2010 -0400
@@ -0,0 +1,8 @@
+@FAKE0001 Original version has PHRED scores from 0 to 93 inclusive (in that order)
+acgtacgtacgtacgtacgtaCGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTAC
++
+!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
+@FAKE0002 Original version has PHRED scores from 93 to 0 inclusive (in that order)
+CATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCatgcatgcatgcatgcatgca
++
+~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!
diff -r 3b8e4af25be2 -r c9b41f94d707 tool_conf.xml.sample
--- a/tool_conf.xml.sample Fri May 21 15:50:49 2010 -0400
+++ b/tool_conf.xml.sample Fri May 21 16:48:59 2010 -0400
@@ -221,6 +221,7 @@
<tool file="fastq/fastq_filter.xml" />
<tool file="fastq/fastq_trimmer.xml" />
<tool file="fastq/fastq_trimmer_by_quality.xml" />
+ <tool file="fastq/fastq_masker_by_quality.xml" />
<tool file="fastq/fastq_manipulation.xml" />
<tool file="fastq/fastq_to_fasta.xml" />
<tool file="fastq/fastq_to_tabular.xml" />
diff -r 3b8e4af25be2 -r c9b41f94d707 tools/fastq/fastq_masker_by_quality.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/fastq/fastq_masker_by_quality.py Fri May 21 16:48:59 2010 -0400
@@ -0,0 +1,83 @@
+#Dan Blankenberg
+import string
+from optparse import OptionParser
+from galaxy_utils.sequence.fastq import fastqReader, fastqWriter
+
+
+def get_score_comparer( operator ):
+ if operator == 'gt':
+ return compare_gt
+ elif operator == 'ge':
+ return compare_ge
+ elif operator == 'eq':
+ return compare_eq
+ elif operator == 'lt':
+ return compare_lt
+ elif operator == 'le':
+ return compare_le
+ elif operator == 'ne':
+ return compare_ne
+ raise 'Invalid operator provided: %s' % operator
+
+def compare_gt( quality_score, threshold_value ):
+ return quality_score > threshold_value
+
+def compare_ge( quality_score, threshold_value ):
+ return quality_score >= threshold_value
+
+def compare_eq( quality_score, threshold_value ):
+ return quality_score == threshold_value
+
+def compare_ne( quality_score, threshold_value ):
+ return quality_score != threshold_value
+
+def compare_lt( quality_score, threshold_value ):
+ return quality_score < threshold_value
+
+def compare_le( quality_score, threshold_value ):
+ return quality_score <= threshold_value
+
+class BaseReplacer( object ):
+ def __init__( self, replace_character ):
+ self.replace_character = replace_character
+ def __call__( self, base_character ):
+ return self.replace_character
+
+def main():
+ usage = "usage: %prog [options] input_file output_file"
+ parser = OptionParser( usage=usage )
+ parser.add_option( '-f', '--format', dest='format', type='choice', default='sanger', choices=( 'sanger', 'cssanger', 'solexa', 'illumina' ), help='FASTQ variant type' )
+ parser.add_option( '-m', '--mask_character', dest='mask_character', default='N', help='Mask Character to use' )
+ parser.add_option( '-c', '--score_comparison', type="choice", dest='score_comparison', default='le', choices=('gt','ge','eq','lt', 'le', 'ne' ), help='Mask base when score is' )
+ parser.add_option( '-s', '--quality_score', type="float", dest='quality_score', default='0', help='Quality Score' )
+ parser.add_option( "-l", "--lowercase", action="store_true", dest="lowercase", default=False, help="Use lowercase masking")
+ ( options, args ) = parser.parse_args()
+
+ if len ( args ) != 2:
+ parser.error( "Need to specify an input file and an output file" )
+
+ score_comparer = get_score_comparer( options.score_comparison )
+
+ if options.lowercase:
+ base_masker = string.lower
+ else:
+ base_masker = BaseReplacer( options.mask_character )
+
+ out = fastqWriter( open( args[1], 'wb' ), format = options.format )
+
+ num_reads = None
+ num_reads_excluded = 0
+ for num_reads, fastq_read in enumerate( fastqReader( open( args[0] ), format = options.format ) ):
+ sequence_list = list( fastq_read.sequence )
+ for i, quality_score in enumerate( fastq_read.get_decimal_quality_scores() ):
+ if score_comparer( quality_score, options.quality_score ):
+ sequence_list[ i ] = base_masker( sequence_list[ i ] )
+ fastq_read.sequence = "".join( sequence_list )
+ out.write( fastq_read )
+
+ if num_reads is not None:
+ print "Processed %i %s reads." % ( num_reads + 1, options.format )
+ else:
+ print "No valid FASTQ reads were provided."
+
+if __name__ == "__main__": main()
diff -r 3b8e4af25be2 -r c9b41f94d707 tools/fastq/fastq_masker_by_quality.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/fastq/fastq_masker_by_quality.xml Fri May 21 16:48:59 2010 -0400
@@ -0,0 +1,53 @@
+<tool id="fastq_masker_by_quality" name="FASTQ Masker" version="1.0.0">
+ <description>by quality score</description>
+ <command interpreter="python">fastq_masker_by_quality.py '$input_file' '$output_file' -f '${input_file.extension[len( 'fastq' ):]}' -s '${quality_score}' -c '${score_comparison}'
+ #if $mask_type.value == 'lowercase'
+ --lowercase
+ #else
+ -m '${mask_type}'
+ #end if
+ </command>
+ <inputs>
+ <param name="input_file" type="data" format="fastqsanger" label="File to mask" />
+ <param name="mask_type" type="select" label="Mask input with">
+ <option value="N">N's</option>
+ <option value="lowercase">Lowercase</option>
+ </param>
+ <param name="score_comparison" type="select" label="When score is">
+ <option value="le" selected="True">Less than or equal</option>
+ <option value="lt">Less than</option>
+ <option value="eq">Equal to</option>
+ <option value="ne">Not Equal to</option>
+ <option value="ge">Greater than</option>
+ <option value="gt">Greater than or equal</option>
+ </param>
+ <param name="quality_score" type="integer" value="0"/>
+ </inputs>
+ <outputs>
+ <data name="output_file" format="fastqsanger" />
+ </outputs>
+ <tests>
+ <test>
+ <param name="input_file" value="sanger_full_range_original_sanger.fastqsanger" ftype="fastqsanger" />
+ <param name="mask_type" value="N" />
+ <param name="score_comparison" value="le" />
+ <param name="quality_score" value="20" />
+ <output name="output_file" file="sanger_full_range_masked_N.fastqsanger" />
+ </test>
+ <test>
+ <param name="input_file" value="sanger_full_range_original_sanger.fastqsanger" ftype="fastqsanger" />
+ <param name="mask_type" value="lowercase" />
+ <param name="score_comparison" value="le" />
+ <param name="quality_score" value="20" />
+ <output name="output_file" file="sanger_full_range_masked_lowercase.fastqsanger" />
+ </test>
+ </tests>
+ <help>
+**What it does**
+
+This tool allows masking base characters in FASTQ format files dependent upon user specified quality score value and comparison method.
+
+This tool is not available for use on color space (csSanger) formats.
+
+ </help>
+</tool>
1
0

25 May '10
details: http://www.bx.psu.edu/hg/galaxy/rev/3b8e4af25be2
changeset: 3802:3b8e4af25be2
user: jeremy goecks <jeremy.goecks(a)emory.edu>
date: Fri May 21 15:50:49 2010 -0400
description:
Another pass on search+select for autocomplete that handles user input much better.
diffstat:
lib/galaxy/web/framework/helpers/__init__.py | 2 +-
static/scripts/galaxy.base.js | 68 +++++++++++++++------------
static/scripts/packed/galaxy.base.js | 2 +-
3 files changed, 39 insertions(+), 33 deletions(-)
diffs (105 lines):
diff -r 37586a11c13a -r 3b8e4af25be2 lib/galaxy/web/framework/helpers/__init__.py
--- a/lib/galaxy/web/framework/helpers/__init__.py Fri May 21 15:25:56 2010 -0400
+++ b/lib/galaxy/web/framework/helpers/__init__.py Fri May 21 15:50:49 2010 -0400
@@ -44,7 +44,7 @@
TODO: This has a hardcoded "?v=2" to defeat caching. This should be done
in a better way.
"""
- return "\n".join( [ javascript_include_tag( "/static/scripts/" + name + ".js?v=2" ) for name in args ] )
+ return "\n".join( [ javascript_include_tag( "/static/scripts/" + name + ".js?v=3" ) for name in args ] )
# Hashes
diff -r 37586a11c13a -r 3b8e4af25be2 static/scripts/galaxy.base.js
--- a/static/scripts/galaxy.base.js Fri May 21 15:25:56 2010 -0400
+++ b/static/scripts/galaxy.base.js Fri May 21 15:50:49 2010 -0400
@@ -242,44 +242,50 @@
// Get refresh vals.
var refresh_vals = select_elt.attr('refresh_on_change_values');
if (refresh_vals !== undefined)
- refresh_vals = refresh_vals.split(",")
- text_input_elt.keyup( function( e )
+ refresh_vals = refresh_vals.split(",");
+
+ // Function that attempts to refresh based on the value in the text element.
+ var try_refresh_fn = function()
{
- if ( ( e.keyCode == 13 ) && // Return Key
- ( return_key_pressed_for_autocomplete == true ) ) // Make sure return key was for autocomplete.
+ //
+ // If value entered can be matched to value, do so and refresh by submitting parent form.
+ //
+
+ // Get new value and see if it can be matched.
+ var cur_value = text_input_elt.attr('value');
+ var new_value = select_mapping[cur_value];
+ if (new_value !== null && new_value !== undefined)
{
- //
- // If value entered can be matched to value, do so and refresh by submitting parent form.
- //
-
- // Get new value and see if it can be matched.
- var cur_value = text_input_elt.attr('value');
- var new_value = select_mapping[cur_value];
- if (new_value !== null && new_value !== undefined)
+ // Do refresh if new value is refresh value or if there are no refresh values.
+ refresh = false;
+ if (refresh_vals !== undefined)
{
- // Do refresh if new value is refresh value or if there are no refresh values.
- refresh = false;
- if (refresh_vals !== undefined)
- {
- for (var i= 0; i < refresh_vals.length; i++ )
- if (new_value == refresh_vals[i])
- {
- refresh = true;
- break;
- }
- }
- else
- // Refresh for all values.
- refresh = true;
+ for (var i= 0; i < refresh_vals.length; i++ )
+ if (new_value == refresh_vals[i])
+ {
+ refresh = true;
+ break;
+ }
+ }
+ else
+ // Refresh for all values.
+ refresh = true;
- if (refresh)
- {
- text_input_elt.attr('value', new_value);
- text_input_elt.parents('form').submit();
- }
+ if (refresh)
+ {
+ text_input_elt.attr('value', new_value);
+ text_input_elt.parents('form').submit();
}
}
+ };
+
+ // Attempt refresh if (a) result event fired by autocomplete (indicating autocomplete occurred) or (b) on keyup (in which
+ // case a user may have manually entered a value that needs to be refreshed).
+ text_input_elt.bind("result", try_refresh_fn);
+ text_input_elt.keyup( function(e) {
+ try_refresh_fn();
});
+
}
});
}
diff -r 37586a11c13a -r 3b8e4af25be2 static/scripts/packed/galaxy.base.js
--- a/static/scripts/packed/galaxy.base.js Fri May 21 15:25:56 2010 -0400
+++ b/static/scripts/packed/galaxy.base.js Fri May 21 15:50:49 2010 -0400
@@ -1,1 +1,1 @@
-$(document).ready(function(){replace_big_select_inputs()});$.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_popupmen!
u(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).sp
lit(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){if(typeof jQuery().autocomplete=="undefined"){return}if(a===undefined){a=20}$("select").each(function(){var b=$(this);if(b.find("option").length<a){return}var c=b.attr("value");var d=$("<input type='text' class='text-and-autocomplete-select'></input>");d.attr("size",40);d.attr("name",b.attr("name"));d.attr("id",b.attr("id"));d.click(function(){var j=$(this).attr("value");$(this).attr("value","Loading...");$(this).showAllInCache();$(this).attr("value",j);$(this).select()});var i=[];var h={};b.children("option").each(function(){var k=$(this).text();var j=$(this).attr("value");i.push(k);h[k]=j;h[j]=j;if(j==c){d.attr("!
value",k)}});if(c==""||c=="?"){d.attr("value","Click to Search or Select")}i=i.sort(naturalSort);var g={selectFirst:false,autoFill:false,mustMatch:false,matchContains:true,max:1000,minChars:0,hideForLessThanMinChars:false};d.autocomplete(i,g);b.replaceWith(d);var e=function(){var k=d.attr("value");var j=h[k];if(j!==null&&j!==undefined){d.attr("value",j)}else{if(c!=""){d.attr("value",c)}else{d.attr("value","?")}}};d.parents("form").submit(function(){e()});$(document).bind("convert_dbkeys",function(){e()});if(b.attr("refresh_on_change")=="true"){var f=b.attr("refresh_on_change_values");if(f!==undefined){f=f.split(",")}d.keyup(function(m){if((m.keyCode==13)&&(return_key_pressed_for_autocomplete==true)){var l=d.attr("value");var k=h[l];if(k!==null&&k!==undefined){refresh=false;if(f!==undefined){for(var j=0;j<f.length;j++){if(k==f[j]){refresh=true;break}}}else{refresh=true}if(refresh){d.attr("value",k);d.parents("form").submit()}}}})}})}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",f
unction(){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()}}}catch(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").each(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_s!
tate",h)}).show()};if(a){b()}else{$.jStore.init("galaxy");$.jStore.eng
ineReady(function(){b()})}}$(document).ready(function(){$("a[confirm]").click(function(){return confirm($(this).attr("confirm"))});if($.fn.tipsy){$(".tooltip").tipsy({gravity:"s"})}make_popup_menus()});
\ No newline at end of file
+$(document).ready(function(){replace_big_select_inputs()});$.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_popupmen!
u(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).sp
lit(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){if(typeof jQuery().autocomplete=="undefined"){return}if(a===undefined){a=20}$("select").each(function(){var d=$(this);if(d.find("option").length<a){return}var j=d.attr("value");var b=$("<input type='text' class='text-and-autocomplete-select'></input>");b.attr("size",40);b.attr("name",d.attr("name"));b.attr("id",d.attr("id"));b.click(function(){var k=$(this).attr("value");$(this).attr("value","Loading...");$(this).showAllInCache();$(this).attr("value",k);$(this).select()});var e=[];var g={};d.children("option").each(function(){var l=$(this).text();var k=$(this).attr("value");e.push(l);g[l]=k;g[k]=k;if(k==j){b.attr("!
value",l)}});if(j==""||j=="?"){b.attr("value","Click to Search or Select")}e=e.sort(naturalSort);var f={selectFirst:false,autoFill:false,mustMatch:false,matchContains:true,max:1000,minChars:0,hideForLessThanMinChars:false};b.autocomplete(e,f);d.replaceWith(b);var i=function(){var l=b.attr("value");var k=g[l];if(k!==null&&k!==undefined){b.attr("value",k)}else{if(j!=""){b.attr("value",j)}else{b.attr("value","?")}}};b.parents("form").submit(function(){i()});$(document).bind("convert_dbkeys",function(){i()});if(d.attr("refresh_on_change")=="true"){var c=d.attr("refresh_on_change_values");if(c!==undefined){c=c.split(",")}var h=function(){var m=b.attr("value");var l=g[m];if(l!==null&&l!==undefined){refresh=false;if(c!==undefined){for(var k=0;k<c.length;k++){if(l==c[k]){refresh=true;break}}}else{refresh=true}if(refresh){b.attr("value",l);b.parents("form").submit()}}};b.bind("result",h);b.keyup(function(k){h()})}})}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()}}}catch(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").each(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()})
}}$(document).ready(function(){$("a[confirm]").click(function(){return confirm($(this).attr("confirm"))});if($.fn.tipsy){$(".tooltip").tipsy({gravity:"s"})}make_popup_menus()});
\ No newline at end of file
1
0

25 May '10
details: http://www.bx.psu.edu/hg/galaxy/rev/37586a11c13a
changeset: 3801:37586a11c13a
user: Dan Blankenberg <dan(a)bx.psu.edu>
date: Fri May 21 15:25:56 2010 -0400
description:
First pass at adding Ensembl browsers as an external display application. Two different URL generation and data attachment methods are used; one for 'old' Ensembl archives older than ~November 2008 and another for Ensembl sites using the current method. The tool-data/shared/ensembl/ensembl_sites.txt file contains the site and build information for using the current method; the tool-data/shared/ensembl/ensembl_sites_data_URL.txt file has the site and build information for when the older method is to be used.
The new method follows: http://www.ensembl.org/info/docs/webcode/linking.html
The old method follows: http://aug2007.archive.ensembl.org/Homo_sapiens/helpview?se=1;kw=urlsource
diffstat:
datatypes_conf.xml.sample | 2 +
display_applications/ensembl/ensembl_gff.xml | 127 +++++++++++++++
display_applications/ensembl/ensembl_interval_as_bed.xml | 127 +++++++++++++++
tool-data/shared/ensembl/ensembl_sites.txt | 4 +
tool-data/shared/ensembl/ensembl_sites_data_URL.txt | 8 +
5 files changed, 268 insertions(+), 0 deletions(-)
diffs (301 lines):
diff -r 0539d58e383a -r 37586a11c13a datatypes_conf.xml.sample
--- a/datatypes_conf.xml.sample Fri May 21 14:41:20 2010 -0400
+++ b/datatypes_conf.xml.sample Fri May 21 15:25:56 2010 -0400
@@ -49,6 +49,7 @@
</datatype>
<datatype extension="gff" type="galaxy.datatypes.interval:Gff" display_in_upload="true">
<converter file="gff_to_bed_converter.xml" target_datatype="bed"/>
+ <display file="ensembl/ensembl_gff.xml" inherit="True"/>
</datatype>
<datatype extension="gff3" type="galaxy.datatypes.interval:Gff3" display_in_upload="true"/>
<datatype extension="gif" type="galaxy.datatypes.images:Image" mimetype="image/gif"/>
@@ -63,6 +64,7 @@
<indexer file="interval_awk.xml" />
<!-- <display file="ucsc/interval_as_bed.xml" inherit="True" /> -->
<display file="genetrack.xml" inherit="True"/>
+ <display file="ensembl/ensembl_interval_as_bed.xml" inherit="True"/>
</datatype>
<datatype extension="jpg" type="galaxy.datatypes.images:Image" mimetype="image/jpeg"/>
<datatype extension="laj" type="galaxy.datatypes.images:Laj"/>
diff -r 0539d58e383a -r 37586a11c13a display_applications/ensembl/ensembl_gff.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/display_applications/ensembl/ensembl_gff.xml Fri May 21 15:25:56 2010 -0400
@@ -0,0 +1,127 @@
+<display id="ensembl_gff" version="1.0.0" name="display at Ensembl">
+ <!-- Current Ensembl method of attaching user data via URL; archives older than ~November 2008 will use a different method -->
+ <!-- Load links from file: one line to one link -->
+ <dynamic_links from_file="tool-data/shared/ensembl/ensembl_sites.txt" skip_startswith="#" id="0" name="1">
+
+ <!-- Define parameters by column from file, allow splitting on builds -->
+ <dynamic_param name="site_id" value="0"/>
+ <dynamic_param name="site_name" value="1"/>
+ <dynamic_param name="site_link" value="2"/>
+ <dynamic_param name="site_dbkeys" value="3" split="True" separator="," />
+ <dynamic_param name="site_organisms" value="4" split="True" separator="," />
+
+ <!-- Filter out some of the links based upon matching site_dbkeys to dataset dbkey -->
+ <filter>${dataset.dbkey in $site_dbkeys}</filter>
+
+ <!-- We define url and params as normal, but values defined in dynamic_param are available by specified name -->
+ <url>${site_link}${site_organism}/Location/View?r=${position};contigviewbottom=url:${gff_file.qp}=normal</url>
+
+ <param type="data" name="gff_file" url="galaxy_${DATASET_HASH}.gff" />
+ <param type="template" name="site_organism" strip="True" >
+ #set index = $site_dbkeys.index( $gff_file.dbkey )
+ $site_organisms[ $index ]
+ </param>
+ <param type="template" name="position" strip="True" >
+#set line_count = 0
+#set chrom = None
+#set start = float( 'inf' )
+#set end = 0
+#for $line in open( $gff_file.file_name ):
+ #if $line_count > 10: ##10 max lines to check for view port
+ #break
+ #end if
+ #if not $line.startswith( "#" ):
+ #set $fields = $line.split( "\t" )
+ #try:
+ #if len( $fields ) >= 5:
+ #if $chrom is None or $fields[ 0 ] == $chrom:
+ #set chrom = $fields[ 0 ]
+ #set start = min( $start, int( $fields[ 3 ] ) )
+ #set end = max( $end, int( $fields[ 4 ] ) )
+ #end if
+ #end if
+ #except:
+ #pass
+ #end try
+ #end if
+ #set line_count += 1
+#end for
+#if $chrom is not None:
+##The difference between chr1 and 1 is handled by Ensembl, except for the viewport, we need to provide e.g. '1' instead of 'chr1' here
+##This is rather naive, it would be more ideal to have actual mappings
+#if $chrom == 'chrM':
+ #set $chrom = 'MT'
+#end if
+#if $chrom.startswith( 'chr' ):
+ #set $chrom = $chrom[3:]
+#end if
+${chrom}:${start}-${end}
+#else:
+##default view is of '1'
+1
+#end if
+ </param>
+ </dynamic_links>
+
+ <!-- Old Ensembl method of attaching user data via URL -->
+ <!-- Load links from file: one line to one link -->
+ <dynamic_links from_file="tool-data/shared/ensembl/ensembl_sites_data_URL.txt" skip_startswith="#" id="0" name="1">
+
+ <!-- Define parameters by column from file, allow splitting on builds -->
+ <dynamic_param name="site_id" value="0"/>
+ <dynamic_param name="site_name" value="1"/>
+ <dynamic_param name="site_link" value="2"/>
+ <dynamic_param name="site_dbkeys" value="3" split="True" separator="," />
+ <dynamic_param name="site_organisms" value="4" split="True" separator="," />
+
+ <!-- Filter out some of the links based upon matching site_dbkeys to dataset dbkey -->
+ <filter>${dataset.dbkey in $site_dbkeys}</filter>
+
+ <!-- We define url and params as normal, but values defined in dynamic_param are available by specified name -->
+ <url>${site_link}${site_organism}/contigview?data_URL=${gff_file.qp}${position}</url>
+
+ <param type="data" name="gff_file" url="galaxy_${DATASET_HASH}.gff" />
+ <param type="template" name="site_organism" strip="True" >
+ #set index = $site_dbkeys.index( $gff_file.dbkey )
+ $site_organisms[ $index ]
+ </param>
+ <param type="template" name="position" strip="True" >
+ #set line_count = 0
+ #set chrom = None
+ #set start = float( 'inf' )
+ #set end = 0
+ #for $line in open( $gff_file.file_name ):
+ #if $line_count > 10: ##10 max lines to check for view port
+ #break
+ #end if
+ #if not $line.startswith( "#" ):
+ #set $fields = $line.split( "\t" )
+ #try:
+ #if len( $fields ) >= 5:
+ #if $chrom is None or $fields[ 0 ] == $chrom:
+ #set chrom = $fields[ 0 ]
+ #set start = min( $start, int( $fields[ 3 ] ) )
+ #set end = max( $end, int( $fields[ 4 ] ) )
+ #end if
+ #end if
+ #except:
+ #pass
+ #end try
+ #end if
+ #set line_count += 1
+ #end for
+ #if $chrom is not None:
+ ##The difference between chr1 and 1 is handled by Ensembl, except for the viewport, we need to provide e.g. '1' instead of 'chr1' here
+ ##This is rather naive, it would be more ideal to have actual mappings
+ #if $chrom == 'chrM':
+ #set $chrom = 'MT'
+ #end if
+ #if $chrom.startswith( 'chr' ):
+ #set $chrom = $chrom[3:]
+ #end if
+ &chr=${chrom}&start=${start}&end=${end}
+ #end if
+ </param>
+ </dynamic_links>
+
+</display>
diff -r 0539d58e383a -r 37586a11c13a display_applications/ensembl/ensembl_interval_as_bed.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/display_applications/ensembl/ensembl_interval_as_bed.xml Fri May 21 15:25:56 2010 -0400
@@ -0,0 +1,127 @@
+<display id="ensembl_interval" version="1.0.0" name="display at Ensembl">
+ <!-- Current Ensembl method of attaching user data via URL; archives older than ~November 2008 will use a different method -->
+ <!-- Load links from file: one line to one link -->
+ <dynamic_links from_file="tool-data/shared/ensembl/ensembl_sites.txt" skip_startswith="#" id="0" name="1">
+
+ <!-- Define parameters by column from file, allow splitting on builds -->
+ <dynamic_param name="site_id" value="0"/>
+ <dynamic_param name="site_name" value="1"/>
+ <dynamic_param name="site_link" value="2"/>
+ <dynamic_param name="site_dbkeys" value="3" split="True" separator="," />
+ <dynamic_param name="site_organisms" value="4" split="True" separator="," />
+
+ <!-- Filter out some of the links based upon matching site_dbkeys to dataset dbkey -->
+ <filter>${dataset.dbkey in $site_dbkeys}</filter>
+
+ <!-- We define url and params as normal, but values defined in dynamic_param are available by specified name -->
+ <url>${site_link}${site_organism}/Location/View?r=${position};contigviewbottom=url:${bed_file.qp}=normal</url>
+
+ <param type="data" name="bed_file" url="galaxy_${DATASET_HASH}.bed" format="bedstrict"/>
+ <param type="template" name="site_organism" strip="True" >
+ #set index = $site_dbkeys.index( $bed_file.dbkey )
+ $site_organisms[ $index ]
+ </param>
+ <param type="template" name="position" strip="True" >
+#set line_count = 0
+#set chrom = None
+#set start = float( 'inf' )
+#set end = 0
+#for $line in open( $bed_file.file_name ):
+ #if $line_count > 10: ##10 max lines to check for view port
+ #break
+ #end if
+ #if not $line.startswith( "#" ):
+ #set $fields = $line.split( "\t" )
+ #try:
+ #if len( $fields ) >= max( $bed_file.metadata.startCol, $bed_file.metadata.endCol, $bed_file.metadata.chromCol ):
+ #if $chrom is None or $fields[ $bed_file.metadata.chromCol - 1 ] == $chrom:
+ #set chrom = $fields[ $bed_file.metadata.chromCol - 1 ]
+ #set start = min( $start, int( $fields[ $bed_file.metadata.startCol - 1 ] ) )
+ #set end = max( $end, int( $fields[ $bed_file.metadata.endCol - 1 ] ) )
+ #end if
+ #end if
+ #except:
+ #pass
+ #end try
+ #end if
+ #set line_count += 1
+#end for
+#if $chrom is not None:
+##The difference between chr1 and 1 is handled by Ensembl, except for the viewport, we need to provide e.g. '1' instead of 'chr1' here
+##This is rather naive, it would be more ideal to have actual mappings
+#if $chrom == 'chrM':
+ #set $chrom = 'MT'
+#end if
+#if $chrom.startswith( 'chr' ):
+ #set $chrom = $chrom[3:]
+#end if
+${chrom}:${start + 1}-${end}
+#else:
+##default view is of '1'
+1
+#end if
+ </param>
+ </dynamic_links>
+
+ <!-- Old Ensembl method of attaching user data via URL -->
+ <!-- Load links from file: one line to one link -->
+ <dynamic_links from_file="tool-data/shared/ensembl/ensembl_sites_data_URL.txt" skip_startswith="#" id="0" name="1">
+
+ <!-- Define parameters by column from file, allow splitting on builds -->
+ <dynamic_param name="site_id" value="0"/>
+ <dynamic_param name="site_name" value="1"/>
+ <dynamic_param name="site_link" value="2"/>
+ <dynamic_param name="site_dbkeys" value="3" split="True" separator="," />
+ <dynamic_param name="site_organisms" value="4" split="True" separator="," />
+
+ <!-- Filter out some of the links based upon matching site_dbkeys to dataset dbkey -->
+ <filter>${dataset.dbkey in $site_dbkeys}</filter>
+
+ <!-- We define url and params as normal, but values defined in dynamic_param are available by specified name -->
+ <url>${site_link}${site_organism}/contigview?data_URL=${bed_file.qp}${position}</url>
+
+ <param type="data" name="bed_file" url="galaxy_${DATASET_HASH}.bed" format="bedstrict"/>
+ <param type="template" name="site_organism" strip="True" >
+ #set index = $site_dbkeys.index( $bed_file.dbkey )
+ $site_organisms[ $index ]
+ </param>
+ <param type="template" name="position" strip="True" >
+ #set line_count = 0
+ #set chrom = None
+ #set start = float( 'inf' )
+ #set end = 0
+ #for $line in open( $bed_file.file_name ):
+ #if $line_count > 10: ##10 max lines to check for view port
+ #break
+ #end if
+ #if not $line.startswith( "#" ):
+ #set $fields = $line.split( "\t" )
+ #try:
+ #if len( $fields ) >= max( $bed_file.metadata.startCol, $bed_file.metadata.endCol, $bed_file.metadata.chromCol ):
+ #if $chrom is None or $fields[ $bed_file.metadata.chromCol - 1 ] == $chrom:
+ #set chrom = $fields[ $bed_file.metadata.chromCol - 1 ]
+ #set start = min( $start, int( $fields[ $bed_file.metadata.startCol - 1 ] ) )
+ #set end = max( $end, int( $fields[ $bed_file.metadata.endCol - 1 ] ) )
+ #end if
+ #end if
+ #except:
+ #pass
+ #end try
+ #end if
+ #set line_count += 1
+ #end for
+ #if $chrom is not None:
+ ##The difference between chr1 and 1 is handled by Ensembl, except for the viewport, we need to provide e.g. '1' instead of 'chr1' here
+ ##This is rather naive, it would be more ideal to have actual mappings
+ #if $chrom == 'chrM':
+ #set $chrom = 'MT'
+ #end if
+ #if $chrom.startswith( 'chr' ):
+ #set $chrom = $chrom[3:]
+ #end if
+ &chr=${chrom}&start=${start + 1}&end=${end}
+ #end if
+ </param>
+ </dynamic_links>
+
+</display>
diff -r 0539d58e383a -r 37586a11c13a tool-data/shared/ensembl/ensembl_sites.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tool-data/shared/ensembl/ensembl_sites.txt Fri May 21 15:25:56 2010 -0400
@@ -0,0 +1,4 @@
+#These builds are displayed using the method described in:
+#http://www.ensembl.org/info/docs/webcode/linking.html
+ensembl_Current Current http://www.ensembl.org/ hg19,felCat3,galGal3,bosTau4,canFam2,loxAfr3,cavPor3,equCab2,anoCar1,oryLat2,mm9,monDom5,ponAbe2,susScr2,ornAna1,oryCun2,rn4,rheMac2,gasAcu1,tetNig2,xenTro2,taeGut1,danRer5,ci2,dm3,ce6,sacCer2 Homo_sapiens,Felis_catus,Gallus_gallus,Bos_taurus,Canis_familiaris,Loxodonta_africana,Cavia_porcellus,Equus_caballus,Anolis_carolinensis,Oryzias_latipes,Mus_musculus,Monodelphis_domestica,Pongo_pygmaeus,Sus_scrofa,Ornithorhynchus_anatinus,Oryctolagus_cuniculus,Rattus_norvegicus,Macaca_mulatta,Gasterosteus_aculeatus,Tetraodon_nigroviridis,Xenopus_tropicalis,Taeniopygia_guttata,Danio_rerio,Ciona_intestinalis,Drosophila_melanogaster,Caenorhabditis_elegans,Saccharomyces_cerevisiae
+ensembl_May_2009 May 2009 http://may2009.archive.ensembl.org/ hg18 Homo_sapiens
diff -r 0539d58e383a -r 37586a11c13a tool-data/shared/ensembl/ensembl_sites_data_URL.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tool-data/shared/ensembl/ensembl_sites_data_URL.txt Fri May 21 15:25:56 2010 -0400
@@ -0,0 +1,8 @@
+#These builds are displayed using the method described in:
+#http://aug2007.archive.ensembl.org/Homo_sapiens/helpview?se=1;kw=urlsource
+ensembl_March_2008 March 2008 http://mar2008.archive.ensembl.org/ bosTau3,tetNig1 Bos_taurus,Tetraodon_nigroviridis
+ensembl_February_2007 February 2007 http://feb2007.archive.ensembl.org/ monDom4,danRer4 Monodelphis_domestica,Danio_rerio
+ensembl_July_2008 July 2008 http://jul2008.archive.ensembl.org/ panTro2 Pan_troglodytes
+ensembl_April_2006 April 2006 http://apr2006.archive.ensembl.org/ galGal2,bosTau2,canFam1,mm7,rheMac1,danRer3,apiMel2,sacCer1 Gallus_gallus,Bos_taurus,Canis_familiaris,Mus_musculus,Macaca_mulatta,Danio_rerio,Apis_mellifera,Saccharomyces_cerevisiae
+ensembl_November_2005 November 2005 http://nov2005.archive.ensembl.org/ hg17,panTro1,bosTau1,mm6,xenTro1,anoGam1,dm2 Homo_sapiens,Pan_troglodytes,Bos_taurus,Mus_musculus,Xenopus_tropicalis,Anopheles_gambiae,Drosophila_melanogaster
+ensembl_August_2007 August 2007 http://aug2007.archive.ensembl.org/ mm8,ce4 Mus_musculus,Caenorhabditis_elegans
1
0

25 May '10
details: http://www.bx.psu.edu/hg/galaxy/rev/0539d58e383a
changeset: 3800:0539d58e383a
user: jeremy goecks <jeremy.goecks(a)emory.edu>
date: Fri May 21 14:41:20 2010 -0400
description:
Enable display framework to handle unicode characters in item titles and enable pages to have unicode characters in titles.
diffstat:
lib/galaxy/web/controllers/page.py | 6 +++---
templates/display_common.mako | 20 +++++++++++++-------
2 files changed, 16 insertions(+), 10 deletions(-)
diffs (53 lines):
diff -r e5bbcf6ebf6c -r 0539d58e383a lib/galaxy/web/controllers/page.py
--- a/lib/galaxy/web/controllers/page.py Fri May 21 13:43:50 2010 -0400
+++ b/lib/galaxy/web/controllers/page.py Fri May 21 14:41:20 2010 -0400
@@ -296,8 +296,8 @@
return self.sharing( trans, **kwargs )
session.flush()
- # Build grid
- grid = self._page_list( trans, *args, **kwargs )
+ # Build grid HTML and make sure to encode in utf-8 to support unicode characters.
+ grid = unicode( self._page_list( trans, *args, **kwargs ), 'utf-8' )
# Build list of pages shared with user.
shared_by_others = trans.sa_session \
@@ -313,7 +313,7 @@
@web.expose
def list_published( self, trans, *args, **kwargs ):
- grid = self._all_published_list( trans, *args, **kwargs )
+ grid = unicode( self._all_published_list( trans, *args, **kwargs ), 'utf-8' )
if 'async' in kwargs:
return grid
else:
diff -r e5bbcf6ebf6c -r 0539d58e383a templates/display_common.mako
--- a/templates/display_common.mako Fri May 21 13:43:50 2010 -0400
+++ b/templates/display_common.mako Fri May 21 14:41:20 2010 -0400
@@ -19,13 +19,19 @@
<%def name="get_item_name( item )">
<%
# Start with exceptions, end with default.
- if type( item ) is model.Page:
- return item.title
- elif type( item ) is model.Visualization:
- return item.title
- if hasattr( item, 'get_display_name'):
- return item.get_display_name()
- return item.name
+ if type( item ) is model.Page:
+ item_name = item.title
+ elif type( item ) is model.Visualization:
+ item_name = item.title
+ elif hasattr( item, 'get_display_name'):
+ item_name = item.get_display_name()
+ else:
+ item_name = item.name
+
+ # Encode in unicode.
+ if type( item_name ) is str:
+ item_name = unicode( item_name, 'utf-8' )
+ return item_name
%>
</%def>
1
0

25 May '10
details: http://www.bx.psu.edu/hg/galaxy/rev/e5bbcf6ebf6c
changeset: 3799:e5bbcf6ebf6c
user: fubar: ross Lazarus at gmail period com
date: Fri May 21 13:43:50 2010 -0400
description:
Unreverted js changes from JG - for some strange reason they break the tool upload form here although functional tests seem fine
diffstat:
lib/galaxy/datatypes/interval.py | 50 ++++++++++++++++++++++++++++---------
lib/galaxy/tools/__init__.py | 2 +
tools/rgenetics/rgEigPCA.xml | 3 +-
tools/rgenetics/rgHaploView.xml | 6 ++--
tools/rgenetics/rgtest_one_tool.sh | 7 +++-
5 files changed, 49 insertions(+), 19 deletions(-)
diffs (163 lines):
diff -r 3ad722e3c101 -r e5bbcf6ebf6c lib/galaxy/datatypes/interval.py
--- a/lib/galaxy/datatypes/interval.py Thu May 20 17:00:12 2010 -0400
+++ b/lib/galaxy/datatypes/interval.py Fri May 21 13:43:50 2010 -0400
@@ -140,28 +140,32 @@
else:
empty_line_count += 1
+
def get_estimated_display_viewport( self, dataset ):
"""Return a chrom, start, stop tuple for viewing a file."""
if dataset.has_data() and dataset.state == dataset.states.OK:
try:
c, s, e = dataset.metadata.chromCol, dataset.metadata.startCol, dataset.metadata.endCol
c, s, e = int(c)-1, int(s)-1, int(e)-1
-
+ try:
+ skipme = int(dataset.metadata.comment_lines)
+ except:
+ skipme = 0
peek = []
for idx, line in enumerate(file(dataset.file_name)):
if line[0] != '#':
peek.append( line.rstrip( '\n\r' ).split() )
- if idx > 10:
+ if idx > 100 and idx > skipme: # viewport should have at least 100 features
break
- chr, start, stop = peek[0][c], int( peek[0][s] ), int( peek[0][e] )
+ chr, start, stop = peek[skipme][c], int( peek[skipme][s] ), int( peek[skipme][e] )
- for p in peek[1:]:
+ for p in peek[(skipme+1):]:
if p[0] == chr:
start = min( start, int( p[s] ) )
stop = max( stop, int( p[e] ) )
except Exception, exc:
- #log.error( 'Viewport generation error -> %s ' % str(exc) )
+ log.error( 'Viewport generation error -> %s ' % str(exc) )
(chr, start, stop) = 'chr1', 1, 1000
return (chr, str( start ), str( stop ))
else:
@@ -864,20 +868,42 @@
Tabular.__init__( self, **kwd )
self.add_display_app( 'ucsc', 'display at UCSC', 'as_ucsc_display_file', 'ucsc_links' )
self.add_display_app( 'gbrowse', 'display in Gbrowse', 'as_gbrowse_display_file', 'gbrowse_links' )
+
def get_estimated_display_viewport( self, dataset ):
- value = ( "", "", "" )
num_check_lines = 100 # only check up to this many non empty lines
+ vstart = None
+ vend = 0
+ vwig_chr = '?'
+ value = None
for i, line in enumerate( file( dataset.file_name ) ):
line = line.rstrip( '\r\n' )
- if line and line.startswith( "browser" ):
- chr_info = line.split()[-1]
- wig_chr, coords = chr_info.split( ":" )
- start, end = coords.split( "-" )
- value = ( wig_chr, start, end )
- break
+ if line:
+ if line.startswith( "browser" ):
+ chr_info = line.split()[-1]
+ wig_chr, coords = chr_info.split( ":" )
+ start, end = coords.split( "-" )
+ value = ( wig_chr, start, end )
+ break
+ # variableStep chrom=chr20
+ if line and (line.lower().startswith( "variablestep" ) or line.lower().startswith( "fixedstep" )):
+ c = line.split("chr")[-1]
+ c = c.split()[0]
+ vwig_chr = 'chr%s' % c
+ else:
+ try:
+ offset = line.split()[0]
+ offset = int(offset)
+ vend = max(vend,offset)
+ if not vstart:
+ vstart = offset # first
+ except:
+ pass
if i > num_check_lines:
break
+ if value == None:
+ value = (vwig_chr, vstart, vend)
return value
+
def _get_viewer_range( self, dataset ):
"""Retrieve the chromosome, start, end for an external viewer."""
if dataset.has_data:
diff -r 3ad722e3c101 -r e5bbcf6ebf6c lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py Thu May 20 17:00:12 2010 -0400
+++ b/lib/galaxy/tools/__init__.py Fri May 21 13:43:50 2010 -0400
@@ -563,6 +563,7 @@
attributes = {}
attributes['compare'] = attrib.pop( 'compare', 'diff' ).lower() #method of comparison
attributes['lines_diff'] = int( attrib.pop( 'lines_diff', '0' ) ) # allow a few lines (dates etc) to vary in logs
+ attributes['delta'] = int( attrib.pop( 'delta', '10000' ) ) # allow a file size to vary if sim_size compare
attributes['sort'] = util.string_as_bool( attrib.pop( 'sort', False ) )
attributes['extra_files'] = []
for extra in output_elem.findall( 'extra_files' ):
@@ -573,6 +574,7 @@
assert extra_value is not None, 'extra_files requires a value attribute'
extra_attributes = {}
extra_attributes['compare'] = extra.get( 'compare', 'diff' ).lower() #method of comparison
+ extra_attributes['delta'] = extra.get( 'delta', '0' ) # allow a file size to vary if sim_size compare
extra_attributes['lines_diff'] = int( extra.get( 'lines_diff', '0' ) ) # allow a few lines (dates etc) to vary in logs
extra_attributes['sort'] = util.string_as_bool( extra.get( 'sort', False ) )
attributes['extra_files'].append( ( extra_type, extra_value, extra_name, extra_attributes ) )
diff -r 3ad722e3c101 -r e5bbcf6ebf6c tools/rgenetics/rgEigPCA.xml
--- a/tools/rgenetics/rgEigPCA.xml Thu May 20 17:00:12 2010 -0400
+++ b/tools/rgenetics/rgEigPCA.xml Fri May 21 13:43:50 2010 -0400
@@ -48,8 +48,7 @@
<param name="t" value="2" />
<param name="s" value="2" />
<output name='out_file1' file='rgtestouts/rgEigPCA/rgEigPCAtest1.html' ftype='html' compare='diff' lines_diff='195'>
- <extra_files type="file" name='rgEigPCAtest1_PCAPlot.pdf' value="rgtestouts/rgEigPCA/rgEigPCAtest1_PCAPlot.pdf" compare="diff"
- lines_diff="27"/>
+ <extra_files type="file" name='rgEigPCAtest1_PCAPlot.pdf' value="rgtestouts/rgEigPCA/rgEigPCAtest1_PCAPlot.pdf" compare="sim_size" delta="30000"/>
</output>
<output name='pca' file='rgtestouts/rgEigPCA/rgEigPCAtest1.txt' compare='diff'/>
</test>
diff -r 3ad722e3c101 -r e5bbcf6ebf6c tools/rgenetics/rgHaploView.xml
--- a/tools/rgenetics/rgHaploView.xml Thu May 20 17:00:12 2010 -0400
+++ b/tools/rgenetics/rgHaploView.xml Fri May 21 13:43:50 2010 -0400
@@ -101,9 +101,9 @@
<param name='infoTrack' value='noinfo' />
<param name='hires' value='lo' />
<param name='memsize' value='2048' />
- <output name='out_file1' file='rgtestouts/rgHaploView/rgHaploViewtest1.html' ftype='html' lines_diff="16">
- <extra_files type="file" name='alljoin.pdf' value="rgtestouts/rgHaploView/alljoin.pdf" compare="diff" lines_diff="3625"/>
- <extra_files type="file" name='allnup.pdf' value="rgtestouts/rgHaploView/allnup.pdf" compare="diff" lines_diff="3675" />
+ <output name='out_file1' file='rgtestouts/rgHaploView/rgHaploViewtest1.html' ftype='html' lines_diff="18">
+ <extra_files type="file" name='alljoin.pdf' value="rgtestouts/rgHaploView/alljoin.pdf" compare="sim_size" delta="3000"/>
+ <extra_files type="file" name='allnup.pdf' value="rgtestouts/rgHaploView/allnup.pdf" compare="sim_size" delta="3000" />
<extra_files type="file" name='Log_rgHaploViewtest1.txt' value="rgtestouts/rgHaploView/Log_rgHaploViewtest1.txt" compare="diff" lines_diff="20"/>
<extra_files type="file" name='rgHaploViewtest1.ped.TESTS' value="rgtestouts/rgHaploView/rgHaploViewtest1.ped.TESTS" compare="diff"
lines_diff="20"/>
diff -r 3ad722e3c101 -r e5bbcf6ebf6c tools/rgenetics/rgtest_one_tool.sh
--- a/tools/rgenetics/rgtest_one_tool.sh Thu May 20 17:00:12 2010 -0400
+++ b/tools/rgenetics/rgtest_one_tool.sh Fri May 21 13:43:50 2010 -0400
@@ -6,7 +6,8 @@
*)
esac
GALAXYROOT=`pwd`
-PATHTOGALAXY='/opt/galaxy' # whatever
+#PATHTOGALAXY='/opt/galaxy' # whatever
+PATHTOGALAXY='/share/shared/galaxy' # whatever
echo "using $GALAXYROOT"
# change this as needed for your local install
INPATH="${GALAXYROOT}/test-data"
@@ -56,7 +57,9 @@
echo "now doing $TOOL"
OUTPATH="$OROOT/$TOOL"
rm -rf $OUTPATH/*
-python $TOOLPATH/$TOOL.py -i "$INPATH/tinywga" -o $NPRE -s ${OUTPATH}/${NPRE}.html -p $OUTPATH
+CMD="python $TOOLPATH/$TOOL.py -i $INPATH/tinywga -o $NPRE -s ${OUTPATH}/${NPRE}.html -p $OUTPATH"
+echo "doing $CMD"
+$CMD
# rgQC.py -i '$input_file.extra_files_path/$input_file.metadata.base_name' -o "$out_prefix"
# -s '$html_file' -p '$html_file.files_path'
#
1
0

25 May '10
details: http://www.bx.psu.edu/hg/galaxy/rev/3ad722e3c101
changeset: 3798:3ad722e3c101
user: Nate Coraor <nate(a)bx.psu.edu>
date: Thu May 20 17:00:12 2010 -0400
description:
add multiprocess.sh example script for running multiple galaxy processes. instructions coming later.
diffstat:
contrib/multiproccess.sh | 26 ++++++++++++++++++++++++++
1 files changed, 26 insertions(+), 0 deletions(-)
diffs (30 lines):
diff -r e59720d5c6b8 -r 3ad722e3c101 contrib/multiproccess.sh
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/contrib/multiproccess.sh Thu May 20 17:00:12 2010 -0400
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+# copy this script to the top level galaxy directory and modify the following
+# for your environment
+
+web_server_names=(web{0..2}) # server names: web0 web1 web2
+runner_server_names=(runner0) # server name: runner0
+
+web_config='universe_wsgi.webapp.ini'
+runner_config='universe_wsgi.runner.ini'
+
+# actually do the requested action
+
+if [ -z "$1" ]; then
+ echo "usage: multiprocess.sh <--daemon|--stop-daemon>"
+ exit 1
+fi
+
+for server_name in ${web_server_names[@]}; do
+ echo "[$server_name]"
+ python ./scripts/paster.py serve $web_config --server-name=$server_name --pid-file=$server_name.pid --log-file=$server_name.log $@
+done
+for server_name in ${runner_server_names[@]}; do
+ echo "[$server_name]"
+ python ./scripts/paster.py serve $runner_config --server-name=$server_name --pid-file=$server_name.pid --log-file=$server_name.log $@
+done
1
0
details: http://www.bx.psu.edu/hg/galaxy/rev/e59720d5c6b8
changeset: 3797:e59720d5c6b8
user: rc
date: Thu May 20 15:36:07 2010 -0400
description:
added more options to the sff converter tool
diffstat:
tools/filters/sff_extractor.xml | 27 ++++++++++++++++++++++-----
1 files changed, 22 insertions(+), 5 deletions(-)
diffs (39 lines):
diff -r 218cfbba30ce -r e59720d5c6b8 tools/filters/sff_extractor.xml
--- a/tools/filters/sff_extractor.xml Thu May 20 14:16:08 2010 -0400
+++ b/tools/filters/sff_extractor.xml Thu May 20 15:36:07 2010 -0400
@@ -1,13 +1,30 @@
<tool id="Sff_extractor" name="SFF converter" version="1.0.0">
<description></description>
- <command interpreter="python">sff_extract.py -s $out_file1 -q $out_file2 -x $out_file3 $input</command>
- <inputs>
+ <command interpreter="python">
+ #if str($fastq_output) == "fastq_false" #sff_extract.py $clip --seq_file=$out_file3 --qual_file=$out_file4 --xml_file=$out_file2 $input
+ #elif str($fastq_output) == "fastq_true" #sff_extract.py $clip --fastq --seq_file=$out_file1 --xml_file=$out_file2 $input
+ #end if#
+ </command>
+ <inputs>
<param format="sff" name="input" type="data" label="Extract from this dataset"/>
+ <param name="clip" type="select" label="Completely remove ends with low qual and/or adaptor sequence">
+ <option value="">No</option>
+ <option value="--clip">Yes</option>
+ </param>
+ <param name="fastq_output" type="boolean" truevalue="fastq_true" falsevalue="fastq_false" checked="False" label="Do you want FASTQ file instead of FASTA + FASTA quality file?" />
</inputs>
<outputs>
- <data format="fasta" name="out_file1" />
- <data format="qual" name="out_file2" />
- <data format="xml" name="out_file3" />
+ <data format="fastq" name="out_file1" >
+ <filter>fastq_output is True</filter>
+ </data>
+ <data format="xml" name="out_file2">
+ </data>
+ <data format="fasta" name="out_file3">
+ <filter>fastq_output is False</filter>
+ </data>
+ <data format="qual" name="out_file4">
+ <filter>fastq_output is False</filter>
+ </data>
</outputs>
<help>
**What it does**
1
0
details: http://www.bx.psu.edu/hg/galaxy/rev/218cfbba30ce
changeset: 3796:218cfbba30ce
user: fubar: ross Lazarus at gmail period com
date: Thu May 20 14:16:08 2010 -0400
description:
Added ldindep datatype to datatypes sample
Added snpwga tool sections to tool_conf.sample.main - need these
diffstat:
datatypes_conf.xml.sample | 4 ++++
tool_conf.xml.main | 28 ++++++++++++++++++++++++++++
2 files changed, 32 insertions(+), 0 deletions(-)
diffs (57 lines):
diff -r b7cc7a53364c -r 218cfbba30ce datatypes_conf.xml.sample
--- a/datatypes_conf.xml.sample Thu May 20 14:10:39 2010 -0400
+++ b/datatypes_conf.xml.sample Thu May 20 14:16:08 2010 -0400
@@ -206,6 +206,9 @@
<!-- genome graphs ucsc file - first col is always marker then numeric values to plot -->
<datatype extension="gg" type="galaxy.datatypes.genetics:GenomeGraphs"/>
<!-- part of linkage format pedigree -->
+ <!-- information redundancy (LD) filtered plink pbed -->
+ <datatype extension="ldindep" type="galaxy.datatypes.genetics:ldIndep" display_in_upload="true">
+ </datatype>
<datatype extension="malist" type="galaxy.datatypes.genetics:MAlist" display_in_upload="true"/>
<!-- linkage format pedigree (separate .map file) -->
<datatype extension="lped" type="galaxy.datatypes.genetics:Lped" display_in_upload="true">
@@ -215,6 +218,7 @@
<!-- plink compressed file - has bed extension unfortunately -->
<datatype extension="pbed" type="galaxy.datatypes.genetics:Pbed" display_in_upload="true">
<converter file="pbed_to_lped_converter.xml" target_datatype="lped"/>
+ <converter file="pbed_ldreduced_converter.xml" target_datatype="ldindep"/>
</datatype>
<datatype extension="pheno" type="galaxy.datatypes.genetics:Pheno"/>
<!-- phenotype file - plink format -->
diff -r b7cc7a53364c -r 218cfbba30ce tool_conf.xml.main
--- a/tool_conf.xml.main Thu May 20 14:10:39 2010 -0400
+++ b/tool_conf.xml.main Thu May 20 14:16:08 2010 -0400
@@ -328,4 +328,32 @@
<tool file="genetrack/genetrack_indexer.xml" />
<tool file="genetrack/genetrack_peak_prediction.xml" />
</section>
+ <section name="SNP/WGA: Data; Filters" id="rgdat">
+ <label text="Data: Import and upload" id="rgimport" />
+ <tool file="data_source/upload.xml"/>
+ <tool file="data_source/access_libraries.xml" />
+ <tool file="data_source/hapmapmart.xml" />
+ <label text="Data: Filter and Clean" id="rgfilter" />
+ <tool file="rgenetics/rgClean.xml"/>
+ <tool file="rgenetics/rgPedSub.xml"/>
+ <tool file="rgenetics/rgLDIndep.xml"/>
+ <label text="Simulate" id="rgsim" />
+ <tool file="rgenetics/rgfakePhe.xml"/>
+ <tool file="rgenetics/rgfakePed.xml"/>
+ </section>
+ <section name="SNP/WGA: QC; LD; Plots" id="rgqcplot">
+ <label text="QC; Eigenstrat" id="rgvisual" />
+ <tool file="rgenetics/rgQC.xml"/>
+ <tool file="rgenetics/rgEigPCA.xml"/>
+ <label text="LD; Manhattan/QQ; GRR" id="rgld" />
+ <tool file="rgenetics/rgHaploView.xml"/>
+ <tool file="rgenetics/rgManQQ.xml"/>
+ <tool file="rgenetics/rgGRR.xml"/>
+ </section>
+ <section name="SNP/WGA: Statistical Models" id="rgmodel">
+ <tool file="rgenetics/rgCaCo.xml"/>
+ <tool file="rgenetics/rgTDT.xml"/>
+ <tool file="rgenetics/rgGLM.xml"/>
+ <tool file="rgenetics/rgManQQ.xml"/>
+ </section>
</toolbox>
1
0

25 May '10
details: http://www.bx.psu.edu/hg/galaxy/rev/b7cc7a53364c
changeset: 3795:b7cc7a53364c
user: fubar: ross Lazarus at gmail period com
date: Thu May 20 14:10:39 2010 -0400
description:
Once more with even more feeling - welcome.html restored restored
diffstat:
static/welcome.html | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diffs (15 lines):
diff -r d79e9b48a0a3 -r b7cc7a53364c static/welcome.html
--- a/static/welcome.html Thu May 20 14:07:10 2010 -0400
+++ b/static/welcome.html Thu May 20 14:10:39 2010 -0400
@@ -8,9 +8,9 @@
<body>
<div class="document">
<div class="warningmessagelarge">
- <strong>Welcome to the <a href="http://rgenetics.org">Rgenetics</a> development site</strong>
+ <strong>Hello world! It's running...</strong>
<hr>
- This is a volatile and experimental resource - use the <a href="http://usegalaxy.org">main galaxy</a> for real research
+ To customize this page edit <code>static/welcome.html</code>
</div>
<br/>
<img src="images/noodles.png" alt="WWFSMD?" style="display: block; margin-left: auto; margin-right: auto;" />
1
0
details: http://www.bx.psu.edu/hg/galaxy/rev/d79e9b48a0a3
changeset: 3794:d79e9b48a0a3
user: fubar: ross Lazarus at gmail period com
date: Thu May 20 14:07:10 2010 -0400
description:
eeesh. hgignore for welcome.html didn't
diffstat:
static/welcome.html | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diffs (15 lines):
diff -r 5469b917d3fb -r d79e9b48a0a3 static/welcome.html
--- a/static/welcome.html Thu May 20 12:41:51 2010 -0400
+++ b/static/welcome.html Thu May 20 14:07:10 2010 -0400
@@ -8,9 +8,9 @@
<body>
<div class="document">
<div class="warningmessagelarge">
- <strong>Hello world! It's running...</strong>
+ <strong>Welcome to the <a href="http://rgenetics.org">Rgenetics</a> development site</strong>
<hr>
- To customize this page edit <code>static/welcome.html</code>
+ This is a volatile and experimental resource - use the <a href="http://usegalaxy.org">main galaxy</a> for real research
</div>
<br/>
<img src="images/noodles.png" alt="WWFSMD?" style="display: block; margin-left: auto; margin-right: auto;" />
1
0

25 May '10
details: http://www.bx.psu.edu/hg/galaxy/rev/5469b917d3fb
changeset: 3793:5469b917d3fb
user: fubar: ross Lazarus at gmail period com
date: Thu May 20 12:41:51 2010 -0400
description:
Removed redundant code from rgEigPCA.py now that it takes a pre-converted ldindep dataset.
diffstat:
tools/rgenetics/rgEigPCA.py | 67 +--------------------------------------------
1 files changed, 1 insertions(+), 66 deletions(-)
diffs (84 lines):
diff -r 2d49a94c8d28 -r 5469b917d3fb tools/rgenetics/rgEigPCA.py
--- a/tools/rgenetics/rgEigPCA.py Thu May 20 12:38:35 2010 -0400
+++ b/tools/rgenetics/rgEigPCA.py Thu May 20 12:41:51 2010 -0400
@@ -195,71 +195,6 @@
print >> sys.stdout, rlog
-def getInfiles(basename=None,infpath=None,outfpath=None,plinke='plink',forcerebuild=False):
- """
- openOrMakeLDreduced(basename,newfpath,plinke='plink',forcerebuild=False)
- ingeno = getLDreduced(infile,plinke)
- gbase,gext = os.path.splitext(ingeno)
- if gext == '.bed':
- inmap = '%s.bim' % gbase
- inped = '%s.fam' % gbase
- elif gext == '.ped':
- inmap = '%s.map' % gbase
- inped = '%s.ped' % gbase
- elif gext == '.tped':
- inmap = '%s.tmap' % gbase
- inped = '%s.tfam' % gbase
- """
- base,kind = getLDreducedFname(basename,infpath=infpath,outfpath=outfpath,plinke=plinke,forcerebuild=forcerebuild)
- assert kind in ['lped','pbed','tped'],'## kind=%s - not lped,pbed,tped' % str(kind)
- if kind=='lped':
- return '%s.ped' % base,'%s.map' % base,'%s.ped' % base
- elif kind=='pbed':
- return '%s.bed' % base,'%s.bim' % base,'%s.fam' % base
- elif kind == 'tped':
- return '%s.tped' % base,'%s.tmap' % base,'%s.tfam' % base
-
-
-def getInfilesOld(infile=None):
- """given a basename, find the best input files
- """
- mapexts = ['.map','.bim','.pedsnp']
- mapexts += [x.upper() for x in mapexts] # ya never know
- genoexts = ['.ped','.bed','.pedsnp']
- genoexts += [x.upper() for x in genoexts]
- indexts = ['.ped','.fam','.pedind']
- indexts += [x.upper() for x in indexts]
- flist = glob.glob('%s*' % infile) # this should list all available rgenetics data files
- exts = set([os.path.splitext(x)[-1] for x in flist]) # expect ['.ped','.map'] etc
- mapext = None
- genoext = None
- indext = None
- for e in mapexts:
- if e in exts:
- mapext = e
- inmap = '%s%s' % (infile,e)
- break
- for e in genoexts:
- if e in exts:
- genoext = e
- ingeno = '%s%s' % (infile,e)
- break
- for e in indexts:
- if e in exts:
- indext = e
- inped = '%s%s' % (infile,e)
- break
- if mapext == None:
- print '### no map (%s) file found - cannot run eigensoft' % ','.join(mapexts)
- sys.exit(1)
- if indext == None:
- print '### no ind (%s) file found - cannot run eigensoft' % ','.join(indexts)
- sys.exit(1)
- if genoext == None:
- print '### no geno (%s) file found - cannot run eigensoft' % ','.join(genoexts)
- sys.exit(1)
- return ingeno,inmap,inped
-
def getfSize(fpath,outpath):
"""
format a nice file size string
@@ -331,7 +266,7 @@
ofname = sys.argv[5]
progname = os.path.basename(sys.argv[0])
infile = sys.argv[1]
- infpath,base_name = os.path.split(infile) # can't leave anything here - readonly on PSU - so leave in outdir instead
+ infpath,base_name = os.path.split(infile) # now takes precomputed or autoconverted ldreduced dataset
title = sys.argv[2].translate(trantab) # must replace all of these for urls containing title
outfile1 = sys.argv[3]
newfilepath = sys.argv[4]
1
0

25 May '10
details: http://www.bx.psu.edu/hg/galaxy/rev/2d49a94c8d28
changeset: 3792:2d49a94c8d28
user: fubar: ross Lazarus at gmail period com
date: Thu May 20 12:38:35 2010 -0400
description:
More tweaks to some snp/wga composite output test comparisons - all png/pdf should be sim_size rather than lines_diff
Updated test outputs for snp/wga tools
Testing a new hgignore so welcome.html should not be overwritten
diffstat:
lib/galaxy/datatypes/converters/pbed_ldreduced_converter.py | 119 +
lib/galaxy/datatypes/converters/pbed_ldreduced_converter.xml | 18 +
lib/galaxy/datatypes/genetics.py | 51 +-
static/welcome.html | 6 +-
test-data/rgtestouts/rgEigPCA/Rplots.pdf | 46 +-
test-data/rgtestouts/rgEigPCA/rgEigPCAtest1.R | 2 +-
test-data/rgtestouts/rgEigPCA/rgEigPCAtest1.html | 31 +-
test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_PCAPlot.pdf | 50 +-
test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_eigensoftplot.pdf.pdf | 0
test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_eigensoftplot.pdf.ps | 2 +-
test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_eval.xls | 2 +-
test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_log.txt | 6 +-
test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_pca.xls | 80 +-
test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_pca.xls.par | 6 +-
test-data/rgtestouts/rgGRR/Log_rgGRRtest1.txt | 18 +-
test-data/rgtestouts/rgGRR/rgGRRtest1.html | 37 +-
test-data/rgtestouts/rgGRR/rgGRRtest1.svg | 529 ++-
test-data/rgtestouts/rgGRR/rgGRRtest1_table.xls | 1562 +++++-----
test-data/rgtestouts/rgHaploView/1_rgHaploViewtest1.pdf | 0
test-data/rgtestouts/rgHaploView/1_rgHaploViewtest1.png | 0
test-data/rgtestouts/rgHaploView/2_HapMap_YRI_22.pdf | 0
test-data/rgtestouts/rgHaploView/2_HapMap_YRI_22.png | 0
test-data/rgtestouts/rgHaploView/Chromosome22YRI.LD.PNG | 0
test-data/rgtestouts/rgHaploView/Log_rgHaploViewtest1.txt | 16 +-
test-data/rgtestouts/rgHaploView/alljoin.pdf | 0
test-data/rgtestouts/rgHaploView/allnup.pdf | 0
test-data/rgtestouts/rgHaploView/rgHaploViewtest1.html | 16 +-
test-data/rgtestouts/rgHaploView/rgHaploViewtest1.ped.LD.PNG | 0
test-data/rgtestouts/rgHaploView/rgHaploViewtest1.ped.TAGS | 18 +-
test-data/rgtestouts/rgHaploView/rgHaploViewtest1.ped.TESTS | 14 +-
test-data/rgtestouts/rgQC/FQNormtinywga_s_het_cum.jpg | 0
test-data/rgtestouts/rgQC/FQNormtinywga_s_het_cum.pdf | 182 +-
test-data/rgtestouts/rgQC/Ranked_Subject_Missing_Genotype.xls | 36 +-
test-data/rgtestouts/rgQC/SubjectDetails_rgQCtest1.xls | 72 +-
test-data/rgtestouts/rgQC/ldp_tinywga.bed | 2 +-
test-data/rgtestouts/rgQC/ldp_tinywga.bim | 10 +-
test-data/rgtestouts/rgQC/ldp_tinywga.log | 18 +-
test-data/rgtestouts/rgQC/rgQCtest1.html | 208 +-
test-data/rgtestouts/rgQC/tinywga.het | 80 +-
test-data/rgtestouts/rgQC/tinywga.log | 6 +-
test-data/rgtestouts/rgQC/tinywga.prune.in | 10 +-
test-data/rgtestouts/rgQC/tinywga.prune.out | 10 +-
test-data/rgtestouts/rgQC/tinywga_All_3x3.pdf | 0
test-data/rgtestouts/rgQC/tinywga_All_Paged-0.jpg | 0
test-data/rgtestouts/rgQC/tinywga_All_Paged-1.jpg | 0
test-data/rgtestouts/rgQC/tinywga_All_Paged-2.jpg | 0
test-data/rgtestouts/rgQC/tinywga_All_Paged-3.jpg | 0
test-data/rgtestouts/rgQC/tinywga_All_Paged-4.jpg | 0
test-data/rgtestouts/rgQC/tinywga_All_Paged.pdf | 0
test-data/rgtestouts/rgQC/tinywga_fracmiss.jpg | 0
test-data/rgtestouts/rgQC/tinywga_fracmiss.pdf | 50 +-
test-data/rgtestouts/rgQC/tinywga_fracmiss_cum.jpg | 0
test-data/rgtestouts/rgQC/tinywga_fracmiss_cum.pdf | 52 +-
test-data/rgtestouts/rgQC/tinywga_s_het.jpg | 0
test-data/rgtestouts/rgQC/tinywga_s_het.pdf | 343 +-
test-data/rgtestouts/rgQC/tinywga_s_het_cum.jpg | 0
test-data/rgtestouts/rgQC/tinywga_s_het_cum.pdf | 182 +-
test/functional/test_toolbox.py | 2 +-
tools/rgenetics/rgEigPCA.xml | 2 +-
tools/rgenetics/rgGRR.xml | 2 +-
tools/rgenetics/rgLDIndep.xml | 4 +-
tools/rgenetics/rgQC.xml | 10 +-
tools/rgenetics/rgutils.py | 81 -
63 files changed, 2104 insertions(+), 1887 deletions(-)
diffs (truncated from 5382 to 3000 lines):
diff -r 7f95e51e06f7 -r 2d49a94c8d28 lib/galaxy/datatypes/converters/pbed_ldreduced_converter.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/galaxy/datatypes/converters/pbed_ldreduced_converter.py Thu May 20 12:38:35 2010 -0400
@@ -0,0 +1,119 @@
+# converter for ldreduced rgenetics datatype
+# used for grr and eigenstrat - shellfish if we get around to it
+#
+
+import os,sys,tempfile,subprocess,time
+
+from galaxy import eggs
+
+prog="pbed_ldreduced_converter.py"
+
+galhtmlprefix = """<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Galaxy %s tool output - see http://g2.trac.bx.psu.edu/" />
+<title></title>
+<link rel="stylesheet" href="/static/style/base.css" type="text/css" />
+</head>
+<body>
+<div class="document">
+"""
+
+plinke = 'plink'
+
+
+def timenow():
+ """return current time as a string
+ """
+ return time.strftime('%d/%m/%Y %H:%M:%S', time.localtime(time.time()))
+
+
+def pruneLD(plinktasks=[],cd='./',vclbase = []):
+ """
+ """
+ fplog,plog = tempfile.mkstemp()
+ alog = []
+ alog.append('## Rgenetics: http://rgenetics.org Galaxy Tools rgQC.py Plink pruneLD runner\n')
+ for task in plinktasks: # each is a list
+ vcl = vclbase + task
+ sto = file(plog,'w')
+ x = subprocess.Popen(' '.join(vcl),shell=True,stdout=sto,stderr=sto,cwd=cd)
+ retval = x.wait()
+ sto.close()
+ try:
+ lplog = file(plog,'r').readlines()
+ lplog = [x for x in lplog if x.find('Pruning SNP') == -1]
+ alog += lplog
+ alog.append('\n')
+ os.unlink(plog) # no longer needed
+ except:
+ alog.append('### %s Strange - no std out from plink when running command line\n%s\n' % (timenow(),' '.join(vcl)))
+ return alog
+
+
+def makeLDreduced(basename,infpath=None,outfpath=None,plinke='plink',forcerebuild=False,returnFname=False,
+ winsize="60", winmove="40", r2thresh="0.1" ):
+ """ not there so make and leave in output dir for post job hook to copy back into input extra files path for next time
+ """
+ ldr = basename # we store ld reduced and thinned data
+ ldreduced = os.path.join(outfpath,ldr) # note where this is going
+ outbase = os.path.join(outfpath,basename)
+ inbase = os.path.join(infpath)
+ loglines = []
+ ldbedname = '%s.bed' % ldreduced
+ bedname = '%s.bed' % basename
+ ldbedfn = os.path.join(infpath,ldbedname)
+ bedfn = os.path.join(infpath,bedname)
+ bmap = os.path.join(infpath,'%s.bim' % basename)
+ plinktasks = []
+ vclbase = [plinke,'--noweb']
+ plinktasks += [['--bfile',inbase,'--indep-pairwise %s %s %s' % (winsize,winmove,r2thresh),'--out %s' % outbase],
+ ['--bfile',inbase,'--extract %s.prune.in --make-bed --out %s' % (outbase, outbase)]]
+ vclbase = [plinke,'--noweb']
+ loglines = pruneLD(plinktasks=plinktasks,cd=outfpath,vclbase = vclbase)
+
+def main():
+ """
+ need to work with rgenetics composite datatypes
+ so in and out are html files with data in extrafiles path
+ <command interpreter="python">
+ pbed_ldreduced_converter.py '$input1.extra_files_path/$input1.metadata.base_name' '$winsize' '$winmove' '$r2thresh'
+ '$output1' '$output1.files_path' 'plink'
+ </command>
+ """
+ nparm = 7
+ if len(sys.argv) < nparm:
+ sys.stderr.write('## %s called with %s - needs %d parameters \n' % (prog,sys.argv,nparm))
+ sys.exit(1)
+ inpedfilepath = sys.argv[1]
+ base_name = os.path.split(inpedfilepath)[-1]
+ winsize = sys.argv[2]
+ winmove = sys.argv[3]
+ r2thresh = sys.argv[4]
+ outhtmlname = sys.argv[5]
+ outfilepath = sys.argv[6]
+ try:
+ os.makedirs(outfilepath)
+ except:
+ pass
+ plink = sys.argv[7]
+ makeLDreduced(base_name,infpath=inpedfilepath,outfpath=outfilepath,plinke=plink,forcerebuild=False,returnFname=False,
+ winsize=winsize,winmove=winmove,r2thresh=r2thresh)
+ f = file(outhtmlname,'w')
+ f.write(galhtmlprefix % prog)
+ flist = os.listdir(outfilepath)
+ s1 = '## Rgenetics: http://rgenetics.org Galaxy Tools %s %s' % (prog,timenow()) # becomes info
+ s2 = 'Input %s, winsize=%s, winmove=%s, r2thresh=%s' % (base_name,winsize,winmove,r2thresh)
+ print '%s %s' % (s1,s2)
+ f.write('<div>%s\n%s\n<ol>' % (s1,s2))
+ for i, data in enumerate( flist ):
+ f.write('<li><a href="%s">%s</a></li>\n' % (os.path.split(data)[-1],os.path.split(data)[-1]))
+ f.write("</div></body></html>")
+ f.close()
+
+
+if __name__ == "__main__":
+ main()
+
diff -r 7f95e51e06f7 -r 2d49a94c8d28 lib/galaxy/datatypes/converters/pbed_ldreduced_converter.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/galaxy/datatypes/converters/pbed_ldreduced_converter.xml Thu May 20 12:38:35 2010 -0400
@@ -0,0 +1,18 @@
+<tool id="pbed2ldindepconvert" name="Convert plink pbed to ld reduced format" version="0.01">
+ <!-- <description>__NOT_USED_CURRENTLY_FOR_CONVERTERS__</description> -->
+ <!-- Used on the metadata edit page. -->
+ <command interpreter="python">
+ pbed_ldreduced_converter.py '$input1.extra_files_path/$input1.metadata.base_name' '60' '55' '0.1' '$output1' '$output1.files_path' 'plink'
+ </command>
+ <inputs>
+ <page>
+ <param format="pbed" name="input1" type="data" label="Choose a compressed Plink binary format genotype file"/>
+ </page>
+ </inputs>
+ <outputs>
+ <data format="ldindep" name="output1" metadata_source="input1"/>
+ </outputs>
+ <help>
+ </help>
+</tool>
+
diff -r 7f95e51e06f7 -r 2d49a94c8d28 lib/galaxy/datatypes/genetics.py
--- a/lib/galaxy/datatypes/genetics.py Wed May 19 10:28:41 2010 -0400
+++ b/lib/galaxy/datatypes/genetics.py Thu May 20 12:38:35 2010 -0400
@@ -349,18 +349,6 @@
return True
-class ldIndep(Rgenetics):
- """
- LD (a good measure of redundancy of information) depleted Plink Binary compressed 2bit/geno
- """
- file_ext="ldreduced"
-
- def __init__( self, **kwd ):
- Rgenetics.__init__(self, **kwd)
- self.add_composite_file( '%s_INDEP.bim', substitute_name_with_metadata = 'base_name', is_binary = True )
- self.add_composite_file( '%s_INDEP.bed', substitute_name_with_metadata = 'base_name', is_binary = True )
- self.add_composite_file( '%s_INDEP.fam', substitute_name_with_metadata = 'base_name', is_binary = True )
-
class SNPMatrix(Rgenetics):
"""
@@ -396,8 +384,8 @@
def __init__( self, **kwd ):
Rgenetics.__init__(self, **kwd)
- self.add_composite_file( '%s.ped', description = 'Pedigree File', substitute_name_with_metadata = 'base_name', is_binary = True )
- self.add_composite_file( '%s.map', description = 'Map File', substitute_name_with_metadata = 'base_name', is_binary = True )
+ self.add_composite_file( '%s.ped', description = 'Pedigree File', substitute_name_with_metadata = 'base_name', is_binary = False )
+ self.add_composite_file( '%s.map', description = 'Map File', substitute_name_with_metadata = 'base_name', is_binary = False )
class Pphe(Rgenetics):
@@ -408,7 +396,7 @@
def __init__( self, **kwd ):
Rgenetics.__init__(self, **kwd)
- self.add_composite_file( '%s.pphe', description = 'Plink Phenotype File', substitute_name_with_metadata = 'base_name', is_binary = True )
+ self.add_composite_file( '%s.pphe', description = 'Plink Phenotype File', substitute_name_with_metadata = 'base_name', is_binary = False )
@@ -432,7 +420,8 @@
def __init__( self, **kwd ):
Rgenetics.__init__(self, **kwd)
- self.add_composite_file( '%s.phe', description = 'Phenotype File', substitute_name_with_metadata = 'base_name' )
+ self.add_composite_file( '%s.phe', description = 'Phenotype File', substitute_name_with_metadata = 'base_name',
+ is_binary = False )
@@ -445,7 +434,8 @@
def __init__( self, **kwd ):
Rgenetics.__init__(self, **kwd)
- self.add_composite_file( '%s.fped', description = 'FBAT format pedfile', substitute_name_with_metadata = 'base_name' )
+ self.add_composite_file( '%s.fped', description = 'FBAT format pedfile', substitute_name_with_metadata = 'base_name',
+ is_binary = False )
class Pbed(Rgenetics):
@@ -456,9 +446,24 @@
def __init__( self, **kwd ):
Rgenetics.__init__(self, **kwd)
- self.add_composite_file( '%s.bim', substitute_name_with_metadata = 'base_name', is_binary = True )
+ self.add_composite_file( '%s.bim', substitute_name_with_metadata = 'base_name', is_binary = False )
self.add_composite_file( '%s.bed', substitute_name_with_metadata = 'base_name', is_binary = True )
- self.add_composite_file( '%s.fam', substitute_name_with_metadata = 'base_name', is_binary = True )
+ self.add_composite_file( '%s.fam', substitute_name_with_metadata = 'base_name', is_binary = False )
+
+class ldIndep(Rgenetics):
+ """
+ LD (a good measure of redundancy of information) depleted Plink Binary compressed 2bit/geno
+ This is really a plink binary, but some tools work better with less redundancy so are constrained to
+ these files
+ """
+ file_ext="ldreduced"
+
+ def __init__( self, **kwd ):
+ Rgenetics.__init__(self, **kwd)
+ self.add_composite_file( '%s.bim', substitute_name_with_metadata = 'base_name', is_binary = False )
+ self.add_composite_file( '%s.bed', substitute_name_with_metadata = 'base_name', is_binary = True )
+ self.add_composite_file( '%s.fam', substitute_name_with_metadata = 'base_name', is_binary = False )
+
class Eigenstratgeno(Rgenetics):
"""
@@ -470,9 +475,9 @@
def __init__( self, **kwd ):
Rgenetics.__init__(self, **kwd)
- self.add_composite_file( '%s.eigenstratgeno', substitute_name_with_metadata = 'base_name', is_binary = True )
- self.add_composite_file( '%s.ind', substitute_name_with_metadata = 'base_name', is_binary = True )
- self.add_composite_file( '%s.map', substitute_name_with_metadata = 'base_name', is_binary = True )
+ self.add_composite_file( '%s.eigenstratgeno', substitute_name_with_metadata = 'base_name', is_binary = False )
+ self.add_composite_file( '%s.ind', substitute_name_with_metadata = 'base_name', is_binary = False )
+ self.add_composite_file( '%s.map', substitute_name_with_metadata = 'base_name', is_binary = False )
@@ -524,7 +529,7 @@
def __init__( self, **kwd ):
Html.__init__(self,**kwd)
self.add_composite_file( '%s.pheno', description = 'Phenodata tab text file',
- substitute_name_with_metadata = 'base_name', is_binary=True)
+ substitute_name_with_metadata = 'base_name', is_binary=False)
def generate_primary_file( self, dataset = None ):
"""
diff -r 7f95e51e06f7 -r 2d49a94c8d28 static/welcome.html
--- a/static/welcome.html Wed May 19 10:28:41 2010 -0400
+++ b/static/welcome.html Thu May 20 12:38:35 2010 -0400
@@ -8,12 +8,12 @@
<body>
<div class="document">
<div class="warningmessagelarge">
- <strong>Welcome to the <a href="http://rgenetics.org">Rgenetics</a> development site</strong>
+ <strong>Hello world! It's running...</strong>
<hr>
- This is a volatile and experimental resource - use the <a href="http://usegalaxy.org">main galaxy</a> for real research
+ To customize this page edit <code>static/welcome.html</code>
</div>
<br/>
- <img src="images/Armitagep_manhattan.png" alt="One click manhattan plot anyone?" style="display: block; margin-left: auto; margin-right: auto;" />
+ <img src="images/noodles.png" alt="WWFSMD?" style="display: block; margin-left: auto; margin-right: auto;" />
<hr/>
This project is supported in part by <a target="_blank" class="reference" href="http://www.nsf.gov">NSF</a>, <a target="_blank" class="reference" href="http://www.genome.gov">NHGRI</a>, and <a target="_blank" class="reference" href="http://www.huck.psu.edu">the Huck Institutes of the Life Sciences</a>.
</div>
diff -r 7f95e51e06f7 -r 2d49a94c8d28 test-data/rgtestouts/rgEigPCA/Rplots.pdf
--- a/test-data/rgtestouts/rgEigPCA/Rplots.pdf Wed May 19 10:28:41 2010 -0400
+++ b/test-data/rgtestouts/rgEigPCA/Rplots.pdf Thu May 20 12:38:35 2010 -0400
@@ -2,8 +2,8 @@
%âãÏÓ\r
1 0 obj
<<
-/CreationDate (D:20100509212343)
-/ModDate (D:20100509212343)
+/CreationDate (D:20100519151448)
+/ModDate (D:20100519151448)
/Title (R Graphics Output)
/Producer (R 2.10.1)
/Creator (R)
@@ -34,42 +34,10 @@
5 0 obj
<<
/Type /Encoding
-/BaseEncoding /PDFDocEncoding
-/Differences [
- 0/.notdef 1/.notdef 2/.notdef 3/.notdef 4/.notdef 5/.notdef 6/.notdef 7/.notdef
- 8/.notdef 9/.notdef 10/.notdef 11/.notdef 12/.notdef 13/.notdef 14/.notdef 15/.notdef
- 16/.notdef 17/.notdef 18/.notdef 19/.notdef 20/.notdef 21/.notdef 22/.notdef 23/.notdef
- 24/.notdef 25/.notdef 26/.notdef 27/.notdef 28/.notdef 29/.notdef 30/.notdef 31/.notdef
- 32/space 33/exclam 34/quotedbl 35/numbersign 36/dollar 37/percent 38/ampersand 39/quoteright
- 40/parenleft 41/parenright 42/asterisk 43/plus 44/comma 45/minus 46/period 47/slash
- 48/zero 49/one 50/two 51/three 52/four 53/five 54/six 55/seven
- 56/eight 57/nine 58/colon 59/semicolon 60/less 61/equal 62/greater 63/question
- 64/at 65/A 66/B 67/C 68/D 69/E 70/F 71/G
- 72/H 73/I 74/J 75/K 76/L 77/M 78/N 79/O
- 80/P 81/Q 82/R 83/S 84/T 85/U 86/V 87/W
- 88/X 89/Y 90/Z 91/bracketleft 92/backslash 93/bracketright 94/asciicircum 95/underscore
- 96/quoteleft 97/a 98/b 99/c 100/d 101/e 102/f 103/g
- 104/h 105/i 106/j 107/k 108/l 109/m 110/n 111/o
- 112/p 113/q 114/r 115/s 116/t 117/u 118/v 119/w
- 120/x 121/y 122/z 123/braceleft 124/bar 125/braceright 126/asciitilde 127/.notdef
- 128/.notdef 129/.notdef 130/.notdef 131/.notdef 132/.notdef 133/.notdef 134/.notdef 135/.notdef
- 136/.notdef 137/.notdef 138/.notdef 139/.notdef 140/.notdef 141/.notdef 142/.notdef 143/.notdef
- 144/dotlessi 145/grave 146/acute 147/circumflex 148/tilde 149/macron 150/breve 151/dotaccent
- 152/dieresis 153/.notdef 154/ring 155/cedilla 156/.notdef 157/hungarumlaut 158/ogonek 159/caron
- 160/space 161/exclamdown 162/cent 163/sterling 164/Euro 165/yen 166/Scaron 167/section
- 168/scaron 169/copyright 170/ordfeminine 171/guillemotleft 172/logicalnot 173/hyphen 174/registered 175/macron
- 176/degree 177/plusminus 178/twosuperior 179/threesuperior 180/Zcaron 181/mu 182/paragraph 183/periodcentered
- 184/zcaron 185/onesuperior 186/ordmasculine 187/guillemotright 188/OE 189/oe 190/Ydieresis 191/questiondown
- 192/Agrave 193/Aacute 194/Acircumflex 195/Atilde 196/Adieresis 197/Aring 198/AE 199/Ccedilla
- 200/Egrave 201/Eacute 202/Ecircumflex 203/Edieresis 204/Igrave 205/Iacute 206/Icircumflex 207/Idieresis
- 208/Eth 209/Ntilde 210/Ograve 211/Oacute 212/Ocircumflex 213/Otilde 214/Odieresis 215/multiply
- 216/Oslash 217/Ugrave 218/Uacute 219/Ucircumflex 220/Udieresis 221/Yacute 222/Thorn 223/germandbls
- 224/agrave 225/aacute 226/acircumflex 227/atilde 228/adieresis 229/aring 230/ae 231/ccedilla
- 232/egrave 233/eacute 234/ecircumflex 235/edieresis 236/igrave 237/iacute 238/icircumflex 239/idieresis
- 240/eth 241/ntilde 242/ograve 243/oacute 244/ocircumflex 245/otilde 246/odieresis 247/divide
- 248/oslash 249/ugrave 250/uacute 251/ucircumflex 252/udieresis 253/yacute 254/thorn 255/ydieresis
-
-]
+/BaseEncoding /WinAnsiEncoding
+/Differences [ 45/minus 96/quoteleft
+144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent
+/dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space]
>>
endobj
xref
@@ -87,5 +55,5 @@
/Root 2 0 R
>>
startxref
-3154
+618
%%EOF
diff -r 7f95e51e06f7 -r 2d49a94c8d28 test-data/rgtestouts/rgEigPCA/rgEigPCAtest1.R
--- a/test-data/rgtestouts/rgEigPCA/rgEigPCAtest1.R Wed May 19 10:28:41 2010 -0400
+++ b/test-data/rgtestouts/rgEigPCA/rgEigPCAtest1.R Thu May 20 12:38:35 2010 -0400
@@ -16,4 +16,4 @@
legend("top",legend=llist,pch=glist,col=glist,title="Sample")
grid(nx = 10, ny = 10, col = "lightgray", lty = "dotted")
dev.off()
-#R script autogenerated by rgenetics/rgutils.py on 09/05/2010 21:23:43
+#R script autogenerated by rgenetics/rgutils.py on 19/05/2010 15:14:48
diff -r 7f95e51e06f7 -r 2d49a94c8d28 test-data/rgtestouts/rgEigPCA/rgEigPCAtest1.html
--- a/test-data/rgtestouts/rgEigPCA/rgEigPCAtest1.html Wed May 19 10:28:41 2010 -0400
+++ b/test-data/rgtestouts/rgEigPCA/rgEigPCAtest1.html Thu May 20 12:38:35 2010 -0400
@@ -9,27 +9,30 @@
</head>
<body>
<div class="document">
-<h4>Output from rgEigPCA.py run at 09/05/2010 21:23:43<br/>
+<h4>Output from rgEigPCA.py run at 19/05/2010 15:14:48<br/>
</h4>
-newfilepath=/share/shared/galaxy/test-data/rgtestouts/rgEigPCA, rexe=R(click on the image below to see a much higher quality PDF version)<table border="0" cellpadding="10" cellspacing="10"><tr><td>
+newfilepath=/opt/galaxy/test-data/rgtestouts/rgEigPCA, rexe=R(click on the image below to see a much higher quality PDF version)<table border="0" cellpadding="10" cellspacing="10"><tr><td>
<a href="rgEigPCAtest1_PCAPlot.pdf"><img src="rgEigPCAtest1_PCAPlot.pdf.png" alt="Samples plotted in first 2 eigenvector space" hspace="10" align="left" /></a></td></tr></table><br/>
-<div class="document">All Files:<ol><li><a href="rgEigPCAtest1.html">rgEigPCAtest1.html </a></li>
-<li><a href="rgEigPCAtest1_pca.xls.par">rgEigPCAtest1_pca.xls.par (338 B)</a></li>
+<div class="document">All Files:<ol><li><a href="Rplots.pdf">Rplots.pdf (813 B)</a></li>
+<li><a href="rgEigPCAtest1.R">rgEigPCAtest1.R (1.6 KB)</a></li>
+<li><a href="rgEigPCAtest1.html">rgEigPCAtest1.html </a></li>
<li><a href="rgEigPCAtest1.txt">rgEigPCAtest1.txt (3.3 KB)</a></li>
-<li><a href="rgEigPCAtest1_log.txt">rgEigPCAtest1_log.txt (6.1 KB)</a></li>
-<li><a href="rgEigPCAtest1_PCAPlot.pdf">rgEigPCAtest1_PCAPlot.pdf (10.4 KB)</a></li>
+<li><a href="rgEigPCAtest1_PCAPlot.pdf">rgEigPCAtest1_PCAPlot.pdf (7.9 KB)</a></li>
+<li><a href="rgEigPCAtest1_PCAPlot.pdf.png">rgEigPCAtest1_PCAPlot.pdf.png (27.1 KB)</a></li>
+<li><a href="rgEigPCAtest1_eigensoftplot.pdf.pdf">rgEigPCAtest1_eigensoftplot.pdf.pdf (2.1 KB)</a></li>
+<li><a href="rgEigPCAtest1_eigensoftplot.pdf.ps">rgEigPCAtest1_eigensoftplot.pdf.ps (13.6 KB)</a></li>
+<li><a href="rgEigPCAtest1_eigensoftplot.pdf.xtxt">rgEigPCAtest1_eigensoftplot.pdf.xtxt (257 B)</a></li>
<li><a href="rgEigPCAtest1_eval.xls">rgEigPCAtest1_eval.xls (507 B)</a></li>
-<li><a href="rgEigPCAtest1_pca.xls">rgEigPCAtest1_pca.xls (1.2 KB)</a></li>
-<li><a href="rgEigPCAtest1.R">rgEigPCAtest1.R (1.6 KB)</a></li>
-<li><a href="Rplots.pdf">Rplots.pdf (3.3 KB)</a></li>
+<li><a href="rgEigPCAtest1_log.txt">rgEigPCAtest1_log.txt (6.0 KB)</a></li>
+<li><a href="rgEigPCAtest1_pca.xls">rgEigPCAtest1_pca.xls (1.3 KB)</a></li>
<li><a href="rgEigPCAtest1_pca.xls.evec">rgEigPCAtest1_pca.xls.evec (3.3 KB)</a></li>
-<li><a href="rgEigPCAtest1_PCAPlot.pdf.png">rgEigPCAtest1_PCAPlot.pdf.png (27.1 KB)</a></li>
+<li><a href="rgEigPCAtest1_pca.xls.par">rgEigPCAtest1_pca.xls.par (311 B)</a></li>
</ol></div><div class="document">Log rgEigPCAtest1_log.txt contents follow below<p/><pre>parameter file: rgEigPCAtest1_pca.xls.par
### THE INPUT PARAMETERS
##PARAMETER NAME: VALUE
-genotypename: /share/shared/galaxy/test-data/tinywga.ped
-snpname: /share/shared/galaxy/test-data/tinywga.map
-indivname: /share/shared/galaxy/test-data/tinywga.ped
+genotypename: /opt/galaxy/test-data/tinywga.bed
+snpname: /opt/galaxy/test-data/tinywga.bim
+indivname: /opt/galaxy/test-data/tinywga.fam
evecoutname: rgEigPCAtest1_pca.xls.evec
evaloutname: rgEigPCAtest1_eval.xls
altnormstyle: NO
@@ -153,5 +156,5 @@
Correlation between eigenvector 3 (of 4) and Case/Control status is 0.193
Correlation between eigenvector 4 (of 4) and Case/Control status is -0.069
</pre></div>If you need to rerun this analysis, the command line used was
-smartpca.perl -i /share/shared/galaxy/test-data/tinywga.ped -a /share/shared/galaxy/test-data/tinywga.map -b /share/shared/galaxy/test-data/tinywga.ped -o rgEigPCAtest1_pca.xls -p rgEigPCAtest1_eigensoftplot.pdf -e rgEigPCAtest1_eval.xls -l rgEigPCAtest1_log.txt -k 4 -m 2 -t 2 -s 2
+smartpca.perl -i /opt/galaxy/test-data/tinywga.bed -a /opt/galaxy/test-data/tinywga.bim -b /opt/galaxy/test-data/tinywga.fam -o rgEigPCAtest1_pca.xls -p rgEigPCAtest1_eigensoftplot.pdf -e rgEigPCAtest1_eval.xls -l rgEigPCAtest1_log.txt -k 4 -m 2 -t 2 -s 2
<p/></div></body></html>
diff -r 7f95e51e06f7 -r 2d49a94c8d28 test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_PCAPlot.pdf
--- a/test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_PCAPlot.pdf Wed May 19 10:28:41 2010 -0400
+++ b/test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_PCAPlot.pdf Thu May 20 12:38:35 2010 -0400
@@ -2,8 +2,8 @@
%âãÏÓ\r
1 0 obj
<<
-/CreationDate (D:20100509212343)
-/ModDate (D:20100509212343)
+/CreationDate (D:20100519151448)
+/ModDate (D:20100519151448)
/Title (R Graphics Output)
/Producer (R 2.10.1)
/Creator (R)
@@ -410,42 +410,10 @@
8 0 obj
<<
/Type /Encoding
-/BaseEncoding /PDFDocEncoding
-/Differences [
- 0/.notdef 1/.notdef 2/.notdef 3/.notdef 4/.notdef 5/.notdef 6/.notdef 7/.notdef
- 8/.notdef 9/.notdef 10/.notdef 11/.notdef 12/.notdef 13/.notdef 14/.notdef 15/.notdef
- 16/.notdef 17/.notdef 18/.notdef 19/.notdef 20/.notdef 21/.notdef 22/.notdef 23/.notdef
- 24/.notdef 25/.notdef 26/.notdef 27/.notdef 28/.notdef 29/.notdef 30/.notdef 31/.notdef
- 32/space 33/exclam 34/quotedbl 35/numbersign 36/dollar 37/percent 38/ampersand 39/quoteright
- 40/parenleft 41/parenright 42/asterisk 43/plus 44/comma 45/minus 46/period 47/slash
- 48/zero 49/one 50/two 51/three 52/four 53/five 54/six 55/seven
- 56/eight 57/nine 58/colon 59/semicolon 60/less 61/equal 62/greater 63/question
- 64/at 65/A 66/B 67/C 68/D 69/E 70/F 71/G
- 72/H 73/I 74/J 75/K 76/L 77/M 78/N 79/O
- 80/P 81/Q 82/R 83/S 84/T 85/U 86/V 87/W
- 88/X 89/Y 90/Z 91/bracketleft 92/backslash 93/bracketright 94/asciicircum 95/underscore
- 96/quoteleft 97/a 98/b 99/c 100/d 101/e 102/f 103/g
- 104/h 105/i 106/j 107/k 108/l 109/m 110/n 111/o
- 112/p 113/q 114/r 115/s 116/t 117/u 118/v 119/w
- 120/x 121/y 122/z 123/braceleft 124/bar 125/braceright 126/asciitilde 127/.notdef
- 128/.notdef 129/.notdef 130/.notdef 131/.notdef 132/.notdef 133/.notdef 134/.notdef 135/.notdef
- 136/.notdef 137/.notdef 138/.notdef 139/.notdef 140/.notdef 141/.notdef 142/.notdef 143/.notdef
- 144/dotlessi 145/grave 146/acute 147/circumflex 148/tilde 149/macron 150/breve 151/dotaccent
- 152/dieresis 153/.notdef 154/ring 155/cedilla 156/.notdef 157/hungarumlaut 158/ogonek 159/caron
- 160/space 161/exclamdown 162/cent 163/sterling 164/Euro 165/yen 166/Scaron 167/section
- 168/scaron 169/copyright 170/ordfeminine 171/guillemotleft 172/logicalnot 173/hyphen 174/registered 175/macron
- 176/degree 177/plusminus 178/twosuperior 179/threesuperior 180/Zcaron 181/mu 182/paragraph 183/periodcentered
- 184/zcaron 185/onesuperior 186/ordmasculine 187/guillemotright 188/OE 189/oe 190/Ydieresis 191/questiondown
- 192/Agrave 193/Aacute 194/Acircumflex 195/Atilde 196/Adieresis 197/Aring 198/AE 199/Ccedilla
- 200/Egrave 201/Eacute 202/Ecircumflex 203/Edieresis 204/Igrave 205/Iacute 206/Icircumflex 207/Idieresis
- 208/Eth 209/Ntilde 210/Ograve 211/Oacute 212/Ocircumflex 213/Otilde 214/Odieresis 215/multiply
- 216/Oslash 217/Ugrave 218/Uacute 219/Ucircumflex 220/Udieresis 221/Yacute 222/Thorn 223/germandbls
- 224/agrave 225/aacute 226/acircumflex 227/atilde 228/adieresis 229/aring 230/ae 231/ccedilla
- 232/egrave 233/eacute 234/ecircumflex 235/edieresis 236/igrave 237/iacute 238/icircumflex 239/idieresis
- 240/eth 241/ntilde 242/ograve 243/oacute 244/ocircumflex 245/otilde 246/odieresis 247/divide
- 248/oslash 249/ugrave 250/uacute 251/ucircumflex 252/udieresis 253/yacute 254/thorn 255/ydieresis
-
-]
+/BaseEncoding /WinAnsiEncoding
+/Differences [ 45/minus 96/quoteleft
+144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent
+/dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space]
>>
endobj
9 0 obj <<
@@ -473,8 +441,8 @@
0000000293 00000 n
0000007168 00000 n
0000007363 00000 n
-0000010156 00000 n
-0000010252 00000 n
+0000007620 00000 n
+0000007716 00000 n
trailer
<<
/Size 11
@@ -482,5 +450,5 @@
/Root 2 0 R
>>
startxref
-10354
+7818
%%EOF
diff -r 7f95e51e06f7 -r 2d49a94c8d28 test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_eigensoftplot.pdf.pdf
Binary file test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_eigensoftplot.pdf.pdf has changed
diff -r 7f95e51e06f7 -r 2d49a94c8d28 test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_eigensoftplot.pdf.ps
--- a/test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_eigensoftplot.pdf.ps Wed May 19 10:28:41 2010 -0400
+++ b/test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_eigensoftplot.pdf.ps Thu May 20 12:38:35 2010 -0400
@@ -1,6 +1,6 @@
%!PS-Adobe-2.0
%%Creator: gnuplot 4.0 patchlevel 0
-%%CreationDate: Thu Mar 25 21:01:24 2010
+%%CreationDate: Wed May 19 15:14:48 2010
%%DocumentFonts: (atend)
%%BoundingBox: 50 50 554 770
%%Orientation: Landscape
diff -r 7f95e51e06f7 -r 2d49a94c8d28 test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_eval.xls
--- a/test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_eval.xls Wed May 19 10:28:41 2010 -0400
+++ b/test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_eval.xls Thu May 20 12:38:35 2010 -0400
@@ -24,6 +24,7 @@
0.000000
0.000000
0.000000
+ 0.000000
-0.000000
-0.000000
-0.000000
@@ -36,4 +37,3 @@
-0.000000
-0.000000
-0.000000
- -0.000000
diff -r 7f95e51e06f7 -r 2d49a94c8d28 test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_log.txt
--- a/test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_log.txt Wed May 19 10:28:41 2010 -0400
+++ b/test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_log.txt Thu May 20 12:38:35 2010 -0400
@@ -1,9 +1,9 @@
parameter file: rgEigPCAtest1_pca.xls.par
### THE INPUT PARAMETERS
##PARAMETER NAME: VALUE
-genotypename: /share/shared/galaxy/test-data/tinywga.ped
-snpname: /share/shared/galaxy/test-data/tinywga.map
-indivname: /share/shared/galaxy/test-data/tinywga.ped
+genotypename: /opt/galaxy/test-data/tinywga.bed
+snpname: /opt/galaxy/test-data/tinywga.bim
+indivname: /opt/galaxy/test-data/tinywga.fam
evecoutname: rgEigPCAtest1_pca.xls.evec
evaloutname: rgEigPCAtest1_eval.xls
altnormstyle: NO
diff -r 7f95e51e06f7 -r 2d49a94c8d28 test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_pca.xls
--- a/test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_pca.xls Wed May 19 10:28:41 2010 -0400
+++ b/test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_pca.xls Thu May 20 12:38:35 2010 -0400
@@ -3,43 +3,43 @@
7.7400
7.2550
4.2710
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
- 0.0000 0.0000 0.0000 0.0000
+ 0.3015 0.2159 0.0173 0.3393
+ -0.2453 -0.0165 -0.0856 0.0221
+ 0.0268 -0.0008 0.3404 -0.0369
+ 0.3015 0.2159 0.0173 0.3393
+ -0.2453 -0.0165 -0.0856 0.0221
+ 0.0268 -0.0008 0.3404 -0.0369
+ 0.3015 0.2159 0.0173 0.3393
+ -0.2453 -0.0165 -0.0856 0.0221
+ 0.0268 -0.0008 0.3404 -0.0369
+ 0.3015 0.2159 0.0173 0.3393
+ -0.2453 -0.0165 -0.0856 0.0221
+ 0.0268 -0.0008 0.3404 -0.0369
+ 0.3015 0.2159 0.0173 0.3393
+ -0.2453 -0.0165 -0.0856 0.0221
+ 0.0268 -0.0008 0.3404 -0.0369
+ 0.3015 0.2159 0.0173 0.3393
+ -0.2453 -0.0165 -0.0856 0.0221
+ 0.0268 -0.0008 0.3404 -0.0369
+ 0.3015 0.2159 0.0173 0.3393
+ -0.1608 -0.0349 0.0222 0.1244
+ -0.1027 0.2939 -0.1091 -0.1832
+ 0.2593 -0.1916 -0.2862 -0.1609
+ 0.0302 0.2348 0.0136 0.1216
+ -0.2453 -0.0165 -0.0856 0.0221
+ 0.3015 0.2159 0.0173 0.3393
+ -0.1608 -0.0349 0.0222 0.1244
+ -0.1027 0.2939 -0.1091 -0.1832
+ 0.2593 -0.1916 -0.2862 -0.1609
+ -0.2453 -0.0165 -0.0856 0.0221
+ -0.2493 -0.2867 -0.1811 0.1404
+ 0.3015 0.2159 0.0173 0.3393
+ -0.1027 0.2939 -0.1091 -0.1832
+ 0.2593 -0.1916 -0.2862 -0.1609
+ 0.0302 0.2348 0.0136 0.1216
+ -0.2453 -0.0165 -0.0856 0.0221
+ -0.2453 -0.0165 -0.0856 0.0221
+ 0.3015 0.2159 0.0173 0.3393
+ 0.2593 -0.1916 -0.2862 -0.1609
+ 0.0302 0.2348 0.0136 0.1216
+ 0.2593 -0.1916 -0.2862 -0.1609
diff -r 7f95e51e06f7 -r 2d49a94c8d28 test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_pca.xls.par
--- a/test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_pca.xls.par Wed May 19 10:28:41 2010 -0400
+++ b/test-data/rgtestouts/rgEigPCA/rgEigPCAtest1_pca.xls.par Thu May 20 12:38:35 2010 -0400
@@ -1,6 +1,6 @@
-genotypename: /share/shared/galaxy/test-data/tinywga.ped
-snpname: /share/shared/galaxy/test-data/tinywga.map
-indivname: /share/shared/galaxy/test-data/tinywga.ped
+genotypename: /opt/galaxy/test-data/tinywga.bed
+snpname: /opt/galaxy/test-data/tinywga.bim
+indivname: /opt/galaxy/test-data/tinywga.fam
evecoutname: rgEigPCAtest1_pca.xls.evec
evaloutname: rgEigPCAtest1_eval.xls
altnormstyle: NO
diff -r 7f95e51e06f7 -r 2d49a94c8d28 test-data/rgtestouts/rgGRR/Log_rgGRRtest1.txt
--- a/test-data/rgtestouts/rgGRR/Log_rgGRRtest1.txt Wed May 19 10:28:41 2010 -0400
+++ b/test-data/rgtestouts/rgGRR/Log_rgGRRtest1.txt Thu May 20 12:38:35 2010 -0400
@@ -1,14 +1,14 @@
-Reading genotypes for 40 subjects and 5 markers
+Reading genotypes for 40 subjects and 25 markers
Calculating 780 pairs...
Estimated time is 0.00 to 0.00 seconds ...
-T1: 0.00482821464539 T2: 0.0623338222504 T3: 0.000771522521973 TOT: 0.0691449642181 0 pairs with no (or not enough) comparable genotypes (0.0%)
-Relstate dupe: mean(mean)=nan sdev(mean)=0.00, mean(sdev)=nan sdev(sdev)=0.00
-Relstate parentchild: mean(mean)=1.73 sdev(mean)=0.20, mean(sdev)=0.38 sdev(sdev)=0.23
-Relstate sibpairs: mean(mean)=nan sdev(mean)=0.00, mean(sdev)=nan sdev(sdev)=0.00
-Relstate halfsibs: mean(mean)=nan sdev(mean)=0.00, mean(sdev)=nan sdev(sdev)=0.00
-Relstate parents: mean(mean)=1.63 sdev(mean)=0.20, mean(sdev)=0.54 sdev(sdev)=0.22
-Relstate unrelated: mean(mean)=1.55 sdev(mean)=0.24, mean(sdev)=0.59 sdev(sdev)=0.24
-Relstate unknown: mean(mean)=nan sdev(mean)=0.00, mean(sdev)=nan sdev(sdev)=0.00
+T1: 0.00254368782043 T2: 0.018296957016 T3: 0.000444173812866 TOT: 0.022047996521 0 pairs with no (or not enough) comparable genotypes (0.0%)
+Relstate dupe (n=0): mean(mean)=nan sdev(mean)=0.00, mean(sdev)=nan sdev(sdev)=0.00
+Relstate parentchild (n=26): mean(mean)=1.68 sdev(mean)=0.19, mean(sdev)=0.39 sdev(sdev)=0.19
+Relstate sibpairs (n=0): mean(mean)=nan sdev(mean)=0.00, mean(sdev)=nan sdev(sdev)=0.00
+Relstate halfsibs (n=0): mean(mean)=nan sdev(mean)=0.00, mean(sdev)=nan sdev(sdev)=0.00
+Relstate parents (n=40): mean(mean)=1.46 sdev(mean)=0.25, mean(sdev)=0.55 sdev(sdev)=0.17
+Relstate unrelated (n=714): mean(mean)=1.44 sdev(mean)=0.21, mean(sdev)=0.58 sdev(sdev)=0.15
+Relstate unknown (n=0): mean(mean)=nan sdev(mean)=0.00, mean(sdev)=nan sdev(sdev)=0.00
780 pairs are available of 780
Outliers: 0
Plotting ...
\ No newline at end of file
diff -r 7f95e51e06f7 -r 2d49a94c8d28 test-data/rgtestouts/rgGRR/rgGRRtest1.html
--- a/test-data/rgtestouts/rgGRR/rgGRRtest1.html Wed May 19 10:28:41 2010 -0400
+++ b/test-data/rgtestouts/rgGRR/rgGRRtest1.html Thu May 20 12:38:35 2010 -0400
@@ -9,39 +9,26 @@
</head>
<body>
<div class="document">
-<h4><div>Output from rgGRR.py run at 09/05/2010 21:23:42<br>
+<h4><div>Output from rgGRR.py run at 19/05/2010 15:14:41<br>
</h4>
If you need to rerun this analysis, the command line was
-<pre>'/share/shared/galaxy/tools/rgenetics/rgGRR.py' '/share/shared/galaxy/test-data/tinywga' 'tinywga' '/share/shared/galaxy/test-data/rgtestouts/rgGRR/rgGRRtest1.html' '/share/shared/galaxy/test-data/rgtestouts/rgGRR' 'rgGRRtest1' '100' '6' 'true'</pre>
+<pre>'/opt/galaxy/tools/rgenetics/rgGRR.py' '/opt/galaxy/test-data/tinywga' 'tinywga' '/opt/galaxy/test-data/rgtestouts/rgGRR/rgGRRtest1.html' '/opt/galaxy/test-data/rgtestouts/rgGRR' 'rgGRRtest1' '100' '6'</pre>
</div> <embed src="rgGRRtest1.svg" type="image/svg+xml" width="1150" height="600" /><div><h4>Click the links below to save output files and plots</h4><br><ol>
<li><a href="rgGRRtest1.svg" type="image/svg+xml" >rgGRR Plot (requires SVG)</a></li>
<li><a href="rgGRRtest1_table.xls">Mean by SD alleles shared - 780 rows</a></li>
+<li><a href="rgGRRtest1.html">rgGRRtest1.html</a></li>
<li><a href="Log_rgGRRtest1.txt">Log_rgGRRtest1.txt</a></li>
-<li><a href="rgGRRtest1.html">rgGRRtest1.html</a></li>
-</ol></div><div><h2>Outliers in tab delimited files linked above are also listed below</h2></div><div><hr><h3>Log from this job (also stored in Log_rgGRRtest1.txt)</h3><pre>Reading genotypes for 40 subjects and 5 markers
-
+</ol></div><div><h2>Outliers in tab delimited files linked above are also listed below</h2></div><div><hr><h3>Log from this job (also stored in Log_rgGRRtest1.txt)</h3><pre>Reading genotypes for 40 subjects and 25 markers
Calculating 780 pairs...
-
Estimated time is 0.00 to 0.00 seconds ...
-
-T1: 0.00482821464539 T2: 0.0623338222504 T3: 0.000771522521973 TOT: 0.0691449642181 0 pairs with no (or not enough) comparable genotypes (0.0%)
-
-Relstate dupe: mean(mean)=nan sdev(mean)=0.00, mean(sdev)=nan sdev(sdev)=0.00
-
-Relstate parentchild: mean(mean)=1.73 sdev(mean)=0.20, mean(sdev)=0.38 sdev(sdev)=0.23
-
-Relstate sibpairs: mean(mean)=nan sdev(mean)=0.00, mean(sdev)=nan sdev(sdev)=0.00
-
-Relstate halfsibs: mean(mean)=nan sdev(mean)=0.00, mean(sdev)=nan sdev(sdev)=0.00
-
-Relstate parents: mean(mean)=1.63 sdev(mean)=0.20, mean(sdev)=0.54 sdev(sdev)=0.22
-
-Relstate unrelated: mean(mean)=1.55 sdev(mean)=0.24, mean(sdev)=0.59 sdev(sdev)=0.24
-
-Relstate unknown: mean(mean)=nan sdev(mean)=0.00, mean(sdev)=nan sdev(sdev)=0.00
-
+T1: 0.00254368782043 T2: 0.018296957016 T3: 0.000444173812866 TOT: 0.022047996521 0 pairs with no (or not enough) comparable genotypes (0.0%)
+Relstate dupe (n=0): mean(mean)=nan sdev(mean)=0.00, mean(sdev)=nan sdev(sdev)=0.00
+Relstate parentchild (n=26): mean(mean)=1.68 sdev(mean)=0.19, mean(sdev)=0.39 sdev(sdev)=0.19
+Relstate sibpairs (n=0): mean(mean)=nan sdev(mean)=0.00, mean(sdev)=nan sdev(sdev)=0.00
+Relstate halfsibs (n=0): mean(mean)=nan sdev(mean)=0.00, mean(sdev)=nan sdev(sdev)=0.00
+Relstate parents (n=40): mean(mean)=1.46 sdev(mean)=0.25, mean(sdev)=0.55 sdev(sdev)=0.17
+Relstate unrelated (n=714): mean(mean)=1.44 sdev(mean)=0.21, mean(sdev)=0.58 sdev(sdev)=0.15
+Relstate unknown (n=0): mean(mean)=nan sdev(mean)=0.00, mean(sdev)=nan sdev(sdev)=0.00
780 pairs are available of 780
-
Outliers: 0
-
Plotting ...</pre><hr></div></body></html>
diff -r 7f95e51e06f7 -r 2d49a94c8d28 test-data/rgtestouts/rgGRR/rgGRRtest1.svg
--- a/test-data/rgtestouts/rgGRR/rgGRRtest1.svg Wed May 19 10:28:41 2010 -0400
+++ b/test-data/rgtestouts/rgGRR/rgGRRtest1.svg Thu May 20 12:38:35 2010 -0400
@@ -17,7 +17,7 @@
var style = {"font-family":"Arial,Helvetica", "fill":"black", "font-size":12};
var dist = 12;
var yOffset = 4;
-
+
//A checkBox for each relationship type dupe,parentchild,sibpair,halfsib,parents,unrel,unkn
checkBoxes["dupe"] = new checkBox("dupe","checkboxes",20,40,"cbRect","cbCross",true,"Duplicate",style,dist,yOffset,undefined,hideShowLayer);
checkBoxes["parentchild"] = new checkBox("parentchild","checkboxes",20,60,"cbRect","cbCross",true,"Parent-Child",style,dist,yOffset,undefined,hideShowLayer);
@@ -28,7 +28,7 @@
checkBoxes["unknown"] = new checkBox("unknown","checkboxes",20,160,"cbRect","cbCross",true,"Unknown",style,dist,yOffset,undefined,hideShowLayer);
}
-
+
function hideShowLayer(id, status, label) {
var vis = "hidden";
if (status) {
@@ -36,7 +36,7 @@
}
document.getElementById(id).setAttributeNS(null, 'visibility', vis);
}
-
+
function showBTT(evt, rel, mm, dm, md, dd, n, mg, dg, lg, hg) {
var x = parseInt(evt.pageX)-250;
var y = parseInt(evt.pageY)-110;
@@ -133,7 +133,7 @@
document.getElementById("otRmean").textContent = "relmean="+rmean;
document.getElementById("otRsdev").textContent = "relsdev="+rsdev;
document.getElementById("otHead").setAttribute('fill', fill);
-
+
var tt = document.getElementById("otTip");
tt.setAttribute("transform", "translate("+x+","+y+")");
tt.setAttribute('visibility', 'visible');
@@ -147,7 +147,7 @@
document.getElementById("otTip").setAttributeNS(null, 'visibility', 'hidden');
}
- ]]>
+ ]]>
</script>
<defs>
<!-- symbols for check boxes -->
@@ -179,7 +179,7 @@
<!-- Grid Lines -->
<g style="fill:none; stroke:#dddddd; stroke-width:1; stroke-dasharray:2,2; text-anchor:end; shape-rendering:crispEdges">
-
+
<!-- Vertical grid lines -->
<line x1="125" y1="0" x2="115" y2="600" />
<line x1="230" y1="0" x2="230" y2="600" />
@@ -215,16 +215,16 @@
<rect x="120" y="135" width="10" height="10" fill="gold" stroke="gold" stroke-width="1" cursor="pointer"/>
<rect x="120" y="155" width="10" height="10" fill="gray" stroke="gray" stroke-width="1" cursor="pointer"/>
<text x="15" y="195" style="fill:black; stroke:none" font-size="12" font-family="Arial" >Zscore gt 15</text>
- <circle cx="125" cy="192" r="6" style="stroke:red; fill:gold; fill-opacity:1.0; stroke-width:1;"/>
+ <circle cx="125" cy="192" r="6" style="stroke:red; fill:gold; fill-opacity:1.0; stroke-width:1;"/>
<text x="15" y="215" style="fill:black; stroke:none" font-size="12" font-family="Arial" >Zscore 4 to 15</text>
- <circle cx="125" cy="212" r="3" style="stroke:gold; fill:gold; fill-opacity:1.0; stroke-width:1;"/>
+ <circle cx="125" cy="212" r="3" style="stroke:gold; fill:gold; fill-opacity:1.0; stroke-width:1;"/>
<text x="15" y="235" style="fill:black; stroke:none" font-size="12" font-family="Arial" >Zscore lt 4</text>
- <circle cx="125" cy="232" r="2" style="stroke:gold; fill:gold; fill-opacity:1.0; stroke-width:1;"/>
+ <circle cx="125" cy="232" r="2" style="stroke:gold; fill:gold; fill-opacity:1.0; stroke-width:1;"/>
<g id="checkboxes">
</g>
</g>
-
+
<g style='fill:black; stroke:none' font-size="17" font-family="Arial">
<!-- X Axis Labels -->
<text x="480" y="660">Mean Alleles Shared</text>
@@ -232,7 +232,7 @@
<text x="277" y="630" >1.25</text>
<text x="564" y="630" >1.5</text>
<text x="842" y="630" >1.75</text>
- <text x="1140" y="630" >2.0</text>
+ <text x="1140" y="630" >2.0</text>
</g>
<g transform="rotate(270)" style="fill:black; stroke:none" font-size="17" font-family="Arial">
@@ -247,103 +247,492 @@
<!-- Plot Title -->
<g style="fill:black; stroke:none" font-size="18" font-family="Arial">
- <text x="425" y="-30">rgGRRtest1 (40 subjects, 5 snp)</text>
+ <text x="425" y="-30">rgGRRtest1 (40 subjects, 25 snp)</text>
</g>
<!-- One group/layer of points for each relationship type -->
<g id="unrelated" style="stroke:gold; fill:gold; fill-opacity:1.0; stroke-width:1;" cursor="pointer">
-<circle cx="-287" cy="25" r="2" onmouseover="showOTT(evt, 5, '13,2,0,0', '1344,1,12,13', 0.75, 0.96, 4, 1.55, 0.59)" onmouseout="hideOTT(evt)" />
-<circle cx="575" cy="0" r="2"
- onmouseover="showBTT(evt, 5, 1.50, 0.00, 1.00, 0.00, 11, 2, 0, 2, 2)"
+<circle cx="276" cy="202" r="2"
+ onmouseover="showBTT(evt, 5, 1.24, 0.00, 0.66, 0.00, 2, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
-<circle cx="919" cy="331" r="2"
- onmouseover="showBTT(evt, 5, 1.80, 0.00, 0.45, 0.00, 143, 2, 0, 2, 2)"
+<circle cx="479" cy="134" r="2"
+ onmouseover="showBTT(evt, 5, 1.42, 0.00, 0.78, 0.00, 2, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
-<circle cx="690" cy="63" r="2"
- onmouseover="showBTT(evt, 5, 1.60, 0.00, 0.89, 0.00, 20, 2, 0, 2, 2)"
+<circle cx="874" cy="338" r="2"
+ onmouseover="showBTT(evt, 5, 1.76, 0.00, 0.44, 0.00, 12, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
-<circle cx="862" cy="300" r="2"
- onmouseover="showBTT(evt, 5, 1.75, 0.00, 0.50, 0.00, 34, 2, 0, 2, 2)"
+<circle cx="230" cy="212" r="2"
+ onmouseover="showBTT(evt, 5, 1.20, 0.00, 0.65, 0.00, 7, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
-<circle cx="575" cy="253" r="2"
- onmouseover="showBTT(evt, 5, 1.50, 0.00, 0.58, 0.00, 28, 2, 0, 2, 2)"
+<circle cx="827" cy="325" r="2"
+ onmouseover="showBTT(evt, 5, 1.72, 0.00, 0.46, 0.00, 22, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
-<circle cx="287" cy="25" r="2"
- onmouseover="showBTT(evt, 5, 1.25, 0.00, 0.96, 0.00, 21, 2, 0, 2, 2)"
+<circle cx="183" cy="152" r="2" onmouseover="showOTT(evt, 5, '1340,9,0,0', '1345,12,0,0', 1.16, 0.75, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="873" cy="338" r="2"
+ onmouseover="showBTT(evt, 5, 1.76, 0.00, 0.44, 0.00, 3, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
-<circle cx="287" cy="300" r="2"
- onmouseover="showBTT(evt, 5, 1.25, 0.00, 0.50, 0.00, 9, 2, 0, 2, 2)"
+<circle cx="598" cy="208" r="2" onmouseover="showOTT(evt, 5, '117,2,0,0', '1334,12,0,0', 1.52, 0.65, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="799" cy="317" r="2" onmouseover="showOTT(evt, 5, '105,3,0,0', '13,2,0,0', 1.70, 0.47, 23, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="506" cy="50" r="2"
+ onmouseover="showBTT(evt, 5, 1.44, 0.00, 0.92, 0.00, 2, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
-<circle cx="459" cy="271" r="2"
- onmouseover="showBTT(evt, 5, 1.40, 0.00, 0.55, 0.00, 80, 2, 0, 2, 2)"
+<circle cx="550" cy="293" r="2"
+ onmouseover="showBTT(evt, 5, 1.48, 0.00, 0.51, 0.00, 7, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
-<circle cx="230" cy="-57" r="2"
- onmouseover="showBTT(evt, 5, 1.20, 0.00, 1.10, 0.00, 15, 2, 0, 2, 2)"
+<circle cx="414" cy="83" r="2" onmouseover="showOTT(evt, 5, '101,3,0,0', '1340,9,0,0', 1.36, 0.86, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="230" cy="80" r="2"
+ onmouseover="showBTT(evt, 5, 1.20, 0.00, 0.87, 0.00, 2, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
-<circle cx="459" cy="63" r="2"
- onmouseover="showBTT(evt, 5, 1.40, 0.00, 0.89, 0.00, 61, 2, 0, 2, 2)"
+<circle cx="92" cy="144" r="2" onmouseover="showOTT(evt, 5, '1334,12,0,0', '1344,1,12,13', 1.08, 0.76, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="414" cy="258" r="2"
+ onmouseover="showBTT(evt, 5, 1.36, 0.00, 0.57, 0.00, 6, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
+<circle cx="1099" cy="474" r="2"
+ onmouseover="showBTT(evt, 5, 1.96, 0.00, 0.21, 0.00, 4, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="46" cy="194" r="2" onmouseover="showOTT(evt, 5, '1341,11,0,0', '1345,12,0,0', 1.04, 0.68, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="479" cy="169" r="2" onmouseover="showOTT(evt, 5, '13,3,0,0', '1341,1,11,12', 1.42, 0.72, 24, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
<circle cx="1150" cy="600" r="2"
- onmouseover="showBTT(evt, 5, 2.00, 0.00, 0.00, 0.00, 41, 2, 0, 2, 2)"
+ onmouseover="showBTT(evt, 5, 2.00, 0.00, 0.00, 0.00, 7, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
-<circle cx="0" cy="175" r="2"
- onmouseover="showBTT(evt, 5, 1.00, 0.00, 0.71, 0.00, 5, 2, 0, 2, 2)"
+<circle cx="600" cy="293" r="2" onmouseover="showOTT(evt, 5, '112,3,0,0', '13,2,0,0', 1.52, 0.51, 23, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="183" cy="187" r="2" onmouseover="showOTT(evt, 5, '112,1,3,2', '1341,12,0,0', 1.16, 0.69, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="450" cy="300" r="2" onmouseover="showOTT(evt, 5, '13,2,0,0', '1334,10,0,0', 1.39, 0.50, 23, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="322" cy="65" r="2"
+ onmouseover="showBTT(evt, 5, 1.28, 0.00, 0.89, 0.00, 2, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
-<circle cx="230" cy="98" r="2"
- onmouseover="showBTT(evt, 5, 1.20, 0.00, 0.84, 0.00, 46, 2, 0, 2, 2)"
+<circle cx="459" cy="141" r="2"
+ onmouseover="showBTT(evt, 5, 1.40, 0.00, 0.76, 0.00, 5, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
-<circle cx="230" cy="331" r="2"
- onmouseover="showBTT(evt, 5, 1.20, 0.00, 0.45, 0.00, 7, 2, 0, 2, 2)"
+<circle cx="766" cy="311" r="2"
+ onmouseover="showBTT(evt, 5, 1.67, 0.00, 0.48, 0.00, 3, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
-<circle cx="0" cy="0" r="2"
- onmouseover="showBTT(evt, 5, 1.00, 0.00, 1.00, 0.00, 13, 2, 0, 2, 2)"
+<circle cx="95" cy="102" r="2" onmouseover="showOTT(evt, 5, '105,1,3,2', '13,1,3,2', 1.08, 0.83, 24, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="700" cy="300" r="2"
+ onmouseover="showBTT(evt, 5, 1.61, 0.00, 0.50, 0.00, 2, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
-<circle cx="690" cy="271" r="2"
- onmouseover="showBTT(evt, 5, 1.60, 0.00, 0.55, 0.00, 176, 2, 0, 2, 2)"
+<circle cx="527" cy="294" r="2"
+ onmouseover="showBTT(evt, 5, 1.46, 0.00, 0.51, 0.00, 2, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
-<circle cx="-229" cy="-57" r="2"
- onmouseover="showBTT(evt, 5, 0.80, 0.00, 1.10, 0.00, 3, 2, 0, 2, 2)"
+<circle cx="800" cy="317" r="2" onmouseover="showOTT(evt, 5, '12,3,0,0', '13,2,0,0', 1.70, 0.47, 23, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="431" cy="211" r="2" onmouseover="showOTT(evt, 5, '101,1,3,2', '1341,11,0,0', 1.37, 0.65, 24, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="275" cy="101" r="2" onmouseover="showOTT(evt, 5, '117,2,0,0', '1340,9,0,0', 1.24, 0.83, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="414" cy="145" r="2"
+ onmouseover="showBTT(evt, 5, 1.36, 0.00, 0.76, 0.00, 4, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="368" cy="60" r="2"
+ onmouseover="showBTT(evt, 5, 1.32, 0.00, 0.90, 0.00, 6, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="321" cy="193" r="2"
+ onmouseover="showBTT(evt, 5, 1.28, 0.00, 0.68, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="414" cy="217" r="2"
+ onmouseover="showBTT(evt, 5, 1.36, 0.00, 0.64, 0.00, 12, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="550" cy="244" r="2" onmouseover="showOTT(evt, 5, '105,2,0,0', '13,2,0,0', 1.48, 0.59, 23, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="367" cy="314" r="2"
+ onmouseover="showBTT(evt, 5, 1.32, 0.00, 0.48, 0.00, 6, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="598" cy="294" r="2"
+ onmouseover="showBTT(evt, 5, 1.52, 0.00, 0.51, 0.00, 12, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="183" cy="89" r="2" onmouseover="showOTT(evt, 5, '112,2,0,0', '1334,2,12,13', 1.16, 0.85, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="414" cy="113" r="2"
+ onmouseover="showBTT(evt, 5, 1.36, 0.00, 0.81, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="184" cy="225" r="2" onmouseover="showOTT(evt, 5, '101,3,0,0', '1345,12,0,0', 1.16, 0.62, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="670" cy="297" r="2"
+ onmouseover="showBTT(evt, 5, 1.58, 0.00, 0.50, 0.00, 3, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="383" cy="143" r="2" onmouseover="showOTT(evt, 5, '105,1,3,2', '1341,12,0,0', 1.33, 0.76, 24, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="367" cy="223" r="2"
+ onmouseover="showBTT(evt, 5, 1.32, 0.00, 0.63, 0.00, 3, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="275" cy="132" r="2"
+ onmouseover="showBTT(evt, 5, 1.24, 0.00, 0.78, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="287" cy="235" r="2"
+ onmouseover="showBTT(evt, 5, 1.25, 0.00, 0.61, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="644" cy="296" r="2"
+ onmouseover="showBTT(evt, 5, 1.56, 0.00, 0.51, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="368" cy="185" r="2"
+ onmouseover="showBTT(evt, 5, 1.32, 0.00, 0.69, 0.00, 9, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="828" cy="325" r="2"
+ onmouseover="showBTT(evt, 5, 1.72, 0.00, 0.46, 0.00, 4, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="958" cy="371" r="2" onmouseover="showOTT(evt, 5, '1340,12,0,0', '1341,1,11,12', 1.83, 0.38, 24, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="414" cy="179" r="2" onmouseover="showOTT(evt, 5, '13,1,3,2', '1341,12,0,0', 1.36, 0.70, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="239" cy="205" r="2"
+ onmouseover="showBTT(evt, 5, 1.21, 0.00, 0.66, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="450" cy="206" r="2"
+ onmouseover="showBTT(evt, 5, 1.39, 0.00, 0.66, 0.00, 3, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="368" cy="223" r="2"
+ onmouseover="showBTT(evt, 5, 1.32, 0.00, 0.63, 0.00, 4, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="643" cy="250" r="2"
+ onmouseover="showBTT(evt, 5, 1.56, 0.00, 0.58, 0.00, 5, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="782" cy="314" r="2"
+ onmouseover="showBTT(evt, 5, 1.68, 0.00, 0.48, 0.00, 9, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="229" cy="253" r="2"
+ onmouseover="showBTT(evt, 5, 1.20, 0.00, 0.58, 0.00, 3, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="506" cy="250" r="2"
+ onmouseover="showBTT(evt, 5, 1.44, 0.00, 0.58, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="950" cy="367" r="2"
+ onmouseover="showBTT(evt, 5, 1.83, 0.00, 0.39, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="184" cy="89" r="2"
+ onmouseover="showBTT(evt, 5, 1.16, 0.00, 0.85, 0.00, 3, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="736" cy="306" r="2"
+ onmouseover="showBTT(evt, 5, 1.64, 0.00, 0.49, 0.00, 7, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="383" cy="217" r="2" onmouseover="showOTT(evt, 5, '101,1,3,2', '1344,1,12,13', 1.33, 0.64, 24, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="735" cy="306" r="2"
+ onmouseover="showBTT(evt, 5, 1.64, 0.00, 0.49, 0.00, 24, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="552" cy="294" r="2"
+ onmouseover="showBTT(evt, 5, 1.48, 0.00, 0.51, 0.00, 25, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="275" cy="72" r="2"
+ onmouseover="showBTT(evt, 5, 1.24, 0.00, 0.88, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="505" cy="296" r="2" onmouseover="showOTT(evt, 5, '1334,12,0,0', '1340,12,0,0', 1.44, 0.51, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="551" cy="294" r="2" onmouseover="showOTT(evt, 5, '117,1,3,2', '1341,12,0,0', 1.48, 0.51, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="276" cy="132" r="2" onmouseover="showOTT(evt, 5, '101,3,0,0', '1334,2,12,13', 1.24, 0.78, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="460" cy="175" r="2"
+ onmouseover="showBTT(evt, 5, 1.40, 0.00, 0.71, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="143" cy="89" r="2"
+ onmouseover="showBTT(evt, 5, 1.13, 0.00, 0.85, 0.00, 4, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="506" cy="296" r="2"
+ onmouseover="showBTT(evt, 5, 1.44, 0.00, 0.51, 0.00, 35, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="-138" cy="-7" r="2" onmouseover="showOTT(evt, 5, '1340,9,0,0', '1344,1,12,13', 0.88, 1.01, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="349" cy="219" r="2" onmouseover="showOTT(evt, 5, '117,3,0,0', '13,2,0,0', 1.30, 0.63, 23, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="0" cy="166" r="2" onmouseover="showOTT(evt, 5, '101,1,3,2', '1340,9,0,0', 1.00, 0.72, 24, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="735" cy="258" r="2"
+ onmouseover="showBTT(evt, 5, 1.64, 0.00, 0.57, 0.00, 4, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="814" cy="321" r="2"
+ onmouseover="showBTT(evt, 5, 1.71, 0.00, 0.46, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="459" cy="253" r="2"
+ onmouseover="showBTT(evt, 5, 1.40, 0.00, 0.58, 0.00, 3, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="143" cy="232" r="2" onmouseover="showOTT(evt, 5, '1334,2,12,13', '1341,1,11,12', 1.13, 0.61, 24, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="431" cy="303" r="2"
+ onmouseover="showBTT(evt, 5, 1.37, 0.00, 0.49, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="479" cy="102" r="2"
+ onmouseover="showBTT(evt, 5, 1.42, 0.00, 0.83, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="690" cy="300" r="2"
+ onmouseover="showBTT(evt, 5, 1.60, 0.00, 0.50, 0.00, 18, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="322" cy="193" r="2"
+ onmouseover="showBTT(evt, 5, 1.28, 0.00, 0.68, 0.00, 7, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="-184" cy="152" r="2"
+ onmouseover="showBTT(evt, 5, 0.84, 0.00, 0.75, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="766" cy="143" r="2" onmouseover="showOTT(evt, 5, '1334,1,10,11', '1341,1,11,12', 1.67, 0.76, 24, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="335" cy="149" r="2"
+ onmouseover="showBTT(evt, 5, 1.29, 0.00, 0.75, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="919" cy="355" r="2"
+ onmouseover="showBTT(evt, 5, 1.80, 0.00, 0.41, 0.00, 16, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="383" cy="311" r="2" onmouseover="showOTT(evt, 5, '101,1,3,2', '112,3,0,0', 1.33, 0.48, 24, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="597" cy="294" r="2"
+ onmouseover="showBTT(evt, 5, 1.52, 0.00, 0.51, 0.00, 15, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="0" cy="212" r="2" onmouseover="showOTT(evt, 5, '13,3,0,0', '1334,2,12,13', 1.00, 0.65, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="527" cy="247" r="2" onmouseover="showOTT(evt, 5, '101,1,3,2', '117,1,3,2', 1.46, 0.59, 24, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="138" cy="239" r="2"
+ onmouseover="showBTT(evt, 5, 1.12, 0.00, 0.60, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="459" cy="80" r="2"
+ onmouseover="showBTT(evt, 5, 1.40, 0.00, 0.87, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="46" cy="276" r="2" onmouseover="showOTT(evt, 5, '13,3,0,0', '1341,12,0,0', 1.04, 0.54, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="138" cy="-7" r="2"
+ onmouseover="showBTT(evt, 5, 1.12, 0.00, 1.01, 0.00, 2, 3, 0, 3, 3)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="505" cy="209" r="2"
+ onmouseover="showBTT(evt, 5, 1.44, 0.00, 0.65, 0.00, 3, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="46" cy="159" r="2" onmouseover="showOTT(evt, 5, '101,2,0,0', '1340,9,0,0', 1.04, 0.73, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="575" cy="246" r="2" onmouseover="showOTT(evt, 5, '1341,1,11,12', '1344,1,12,13', 1.50, 0.59, 24, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="184" cy="119" r="2" onmouseover="showOTT(evt, 5, '117,3,0,0', '1340,9,0,0', 1.16, 0.80, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="0" cy="80" r="2"
+ onmouseover="showBTT(evt, 5, 1.00, 0.00, 0.87, 0.00, 5, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="0" cy="52" r="2" onmouseover="showOTT(evt, 5, '117,1,3,2', '1340,9,0,0', 1.00, 0.91, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="322" cy="157" r="2"
+ onmouseover="showBTT(evt, 5, 1.28, 0.00, 0.74, 0.00, 4, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="383" cy="261" r="2"
+ onmouseover="showBTT(evt, 5, 1.33, 0.00, 0.56, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="-138" cy="164" r="2"
+ onmouseover="showBTT(evt, 5, 0.88, 0.00, 0.73, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="966" cy="375" r="2"
+ onmouseover="showBTT(evt, 5, 1.84, 0.00, 0.37, 0.00, 3, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="335" cy="185" r="2"
+ onmouseover="showBTT(evt, 5, 1.29, 0.00, 0.69, 0.00, 5, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="622" cy="294" r="2"
+ onmouseover="showBTT(evt, 5, 1.54, 0.00, 0.51, 0.00, 11, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="575" cy="131" r="2" onmouseover="showOTT(evt, 5, '105,1,3,2', '1344,1,12,13', 1.50, 0.78, 24, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="622" cy="247" r="2"
+ onmouseover="showBTT(evt, 5, 1.54, 0.00, 0.59, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="413" cy="145" r="2"
+ onmouseover="showBTT(evt, 5, 1.36, 0.00, 0.76, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="335" cy="321" r="2"
+ onmouseover="showBTT(evt, 5, 1.29, 0.00, 0.46, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="781" cy="314" r="2"
+ onmouseover="showBTT(evt, 5, 1.68, 0.00, 0.48, 0.00, 12, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="383" cy="178" r="2" onmouseover="showOTT(evt, 5, '105,1,3,2', '12,3,0,0', 1.33, 0.70, 24, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="92" cy="257" r="2"
+ onmouseover="showBTT(evt, 5, 1.08, 0.00, 0.57, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="138" cy="100" r="2"
+ onmouseover="showBTT(evt, 5, 1.12, 0.00, 0.83, 0.00, 6, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="368" cy="265" r="2" onmouseover="showOTT(evt, 5, '1340,12,0,0', '1344,1,12,13', 1.32, 0.56, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="-191" cy="49" r="2" onmouseover="showOTT(evt, 5, '105,1,3,2', '1340,9,0,0', 0.83, 0.92, 24, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="414" cy="306" r="2"
+ onmouseover="showBTT(evt, 5, 1.36, 0.00, 0.49, 0.00, 16, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="479" cy="249" r="2" onmouseover="showOTT(evt, 5, '101,1,3,2', '1334,1,10,11', 1.42, 0.58, 24, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="450" cy="250" r="2"
+ onmouseover="showBTT(evt, 5, 1.39, 0.00, 0.58, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="321" cy="275" r="2" onmouseover="showOTT(evt, 5, '101,3,0,0', '105,3,0,0', 1.28, 0.54, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="92" cy="54" r="2"
+ onmouseover="showBTT(evt, 5, 1.08, 0.00, 0.91, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="597" cy="248" r="2"
+ onmouseover="showBTT(evt, 5, 1.52, 0.00, 0.59, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="239" cy="167" r="2"
+ onmouseover="showBTT(evt, 5, 1.21, 0.00, 0.72, 0.00, 3, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="479" cy="297" r="2"
+ onmouseover="showBTT(evt, 5, 1.42, 0.00, 0.50, 0.00, 4, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="92" cy="304" r="2" onmouseover="showOTT(evt, 5, '13,3,0,0', '1334,12,0,0', 1.08, 0.49, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="1011" cy="401" r="2" onmouseover="showOTT(evt, 5, '112,3,0,0', '1334,10,0,0', 1.88, 0.33, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="413" cy="306" r="2"
+ onmouseover="showBTT(evt, 5, 1.36, 0.00, 0.49, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="184" cy="375" r="2" onmouseover="showOTT(evt, 5, '13,3,0,0', '1334,10,0,0', 1.16, 0.37, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="191" cy="178" r="2"
+ onmouseover="showBTT(evt, 5, 1.17, 0.00, 0.70, 0.00, 3, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="575" cy="293" r="2"
+ onmouseover="showBTT(evt, 5, 1.50, 0.00, 0.51, 0.00, 4, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="0" cy="131" r="2" onmouseover="showOTT(evt, 5, '1340,9,0,0', '1341,1,11,12', 1.00, 0.78, 24, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="191" cy="217" r="2"
+ onmouseover="showBTT(evt, 5, 1.17, 0.00, 0.64, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="138" cy="164" r="2"
+ onmouseover="showBTT(evt, 5, 1.12, 0.00, 0.73, 0.00, 7, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="643" cy="296" r="2"
+ onmouseover="showBTT(evt, 5, 1.56, 0.00, 0.51, 0.00, 41, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="322" cy="325" r="2"
+ onmouseover="showBTT(evt, 5, 1.28, 0.00, 0.46, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="552" cy="248" r="2"
+ onmouseover="showBTT(evt, 5, 1.48, 0.00, 0.59, 0.00, 5, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="690" cy="253" r="2"
+ onmouseover="showBTT(evt, 5, 1.60, 0.00, 0.58, 0.00, 4, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="718" cy="303" r="2"
+ onmouseover="showBTT(evt, 5, 1.62, 0.00, 0.49, 0.00, 4, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="551" cy="248" r="2" onmouseover="showOTT(evt, 5, '105,3,0,0', '117,3,0,0', 1.48, 0.59, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="414" cy="180" r="2"
+ onmouseover="showBTT(evt, 5, 1.36, 0.00, 0.70, 0.00, 10, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="230" cy="141" r="2"
+ onmouseover="showBTT(evt, 5, 1.20, 0.00, 0.76, 0.00, 3, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="367" cy="265" r="2"
+ onmouseover="showBTT(evt, 5, 1.32, 0.00, 0.56, 0.00, 3, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="643" cy="209" r="2"
+ onmouseover="showBTT(evt, 5, 1.56, 0.00, 0.65, 0.00, 3, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="275" cy="165" r="2"
+ onmouseover="showBTT(evt, 5, 1.24, 0.00, 0.72, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="276" cy="165" r="2"
+ onmouseover="showBTT(evt, 5, 1.24, 0.00, 0.72, 0.00, 5, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="1103" cy="479" r="2"
+ onmouseover="showBTT(evt, 5, 1.96, 0.00, 0.20, 0.00, 3, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="552" cy="171" r="2" onmouseover="showOTT(evt, 5, '117,2,0,0', '1344,1,12,13', 1.48, 0.71, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="92" cy="215" r="2" onmouseover="showOTT(evt, 5, '112,2,0,0', '1334,10,0,0', 1.08, 0.64, 25, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="459" cy="300" r="2"
+ onmouseover="showBTT(evt, 5, 1.40, 0.00, 0.50, 0.00, 19, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="49" cy="105" r="2" onmouseover="showOTT(evt, 5, '13,2,0,0', '1344,1,12,13', 1.04, 0.82, 23, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="287" cy="194" r="2"
+ onmouseover="showBTT(evt, 5, 1.25, 0.00, 0.68, 0.00, 3, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="597" cy="208" r="2"
+ onmouseover="showBTT(evt, 5, 1.52, 0.00, 0.65, 0.00, 4, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="199" cy="209" r="2" onmouseover="showOTT(evt, 5, '13,2,0,0', '1345,12,0,0', 1.17, 0.65, 23, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="287" cy="334" r="2" onmouseover="showOTT(evt, 5, '101,1,3,2', '1341,12,0,0', 1.25, 0.44, 24, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="322" cy="231" r="2"
+ onmouseover="showBTT(evt, 5, 1.28, 0.00, 0.61, 0.00, 4, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="527" cy="167" r="2" onmouseover="showOTT(evt, 5, '105,1,3,2', '117,1,3,2', 1.46, 0.72, 24, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="199" cy="133" r="2" onmouseover="showOTT(evt, 5, '117,1,3,2', '13,2,0,0', 1.17, 0.78, 23, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="230" cy="175" r="2"
+ onmouseover="showBTT(evt, 5, 1.20, 0.00, 0.71, 0.00, 3, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="431" cy="138" r="2" onmouseover="showOTT(evt, 5, '105,1,3,2', '1345,12,0,0', 1.37, 0.77, 24, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="459" cy="212" r="2"
+ onmouseover="showBTT(evt, 5, 1.40, 0.00, 0.65, 0.00, 5, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="143" cy="155" r="2"
+ onmouseover="showBTT(evt, 5, 1.12, 0.00, 0.74, 0.00, 4, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="183" cy="225" r="2"
+ onmouseover="showBTT(evt, 5, 1.16, 0.00, 0.62, 0.00, 3, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="431" cy="254" r="2" onmouseover="showOTT(evt, 5, '101,1,3,2', '1334,12,0,0', 1.38, 0.58, 24, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="574" cy="166" r="2" onmouseover="showOTT(evt, 5, '12,3,0,0', '1341,1,11,12', 1.50, 0.72, 24, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="321" cy="65" r="2"
+ onmouseover="showBTT(evt, 5, 1.28, 0.00, 0.89, 0.00, 3, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="184" cy="152" r="2"
+ onmouseover="showBTT(evt, 5, 1.16, 0.00, 0.75, 0.00, 4, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="276" cy="241" r="2"
+ onmouseover="showBTT(evt, 5, 1.24, 0.00, 0.60, 0.00, 3, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="418" cy="163" r="2" onmouseover="showOTT(evt, 5, '13,2,0,0', '1341,1,11,12', 1.36, 0.73, 22, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="506" cy="209" r="2"
+ onmouseover="showBTT(evt, 5, 1.44, 0.00, 0.65, 0.00, 5, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="749" cy="307" r="2"
+ onmouseover="showBTT(evt, 5, 1.65, 0.00, 0.49, 0.00, 4, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="649" cy="295" r="2"
+ onmouseover="showBTT(evt, 5, 1.57, 0.00, 0.51, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="368" cy="314" r="2"
+ onmouseover="showBTT(evt, 5, 1.32, 0.00, 0.48, 0.00, 8, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="249" cy="240" r="2" onmouseover="showOTT(evt, 5, '117,2,0,0', '13,2,0,0', 1.22, 0.60, 23, 1.44, 0.58)" onmouseout="hideOTT(evt)" />
+<circle cx="322" cy="125" r="2"
+ onmouseover="showBTT(evt, 5, 1.28, 0.00, 0.79, 0.00, 8, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="250" cy="197" r="2"
+ onmouseover="showBTT(evt, 5, 1.22, 0.00, 0.67, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="368" cy="151" r="2"
+ onmouseover="showBTT(evt, 5, 1.32, 0.00, 0.75, 0.00, 4, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="287" cy="157" r="2"
+ onmouseover="showBTT(evt, 5, 1.25, 0.00, 0.74, 0.00, 3, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
</g>
<g id="parents" style="stroke:lightgreen; fill:lightgreen; fill-opacity:1.0; stroke-width:1;" cursor="pointer">
-<circle cx="287" cy="25" r="2" onmouseover="showOTT(evt, 4, '13,2,0,0', '13,3,0,0', 1.25, 0.96, 4, 1.63, 0.54)" onmouseout="hideOTT(evt)" />
-<circle cx="919" cy="331" r="2"
- onmouseover="showBTT(evt, 4, 1.80, 0.00, 0.45, 0.00, 12, 2, 0, 2, 2)"
+<circle cx="874" cy="338" r="2" onmouseover="showOTT(evt, 4, '117,2,0,0', '117,3,0,0', 1.76, 0.44, 25, 1.46, 0.55)" onmouseout="hideOTT(evt)" />
+<circle cx="827" cy="325" r="2"
+ onmouseover="showBTT(evt, 4, 1.72, 0.00, 0.46, 0.00, 2, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
-<circle cx="690" cy="63" r="2"
- onmouseover="showBTT(evt, 4, 1.60, 0.00, 0.89, 0.00, 2, 2, 0, 2, 2)"
+<circle cx="643" cy="296" r="2"
+ onmouseover="showBTT(evt, 4, 1.56, 0.00, 0.51, 0.00, 4, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
+<circle cx="230" cy="175" r="2" onmouseover="showOTT(evt, 4, '112,2,0,0', '112,3,0,0', 1.20, 0.71, 25, 1.46, 0.55)" onmouseout="hideOTT(evt)" />
+<circle cx="276" cy="165" r="2" onmouseover="showOTT(evt, 4, '1334,11,0,0', '1334,12,0,0', 1.24, 0.72, 25, 1.46, 0.55)" onmouseout="hideOTT(evt)" />
+<circle cx="549" cy="200" r="2" onmouseover="showOTT(evt, 4, '13,2,0,0', '13,3,0,0', 1.48, 0.67, 23, 1.46, 0.55)" onmouseout="hideOTT(evt)" />
+<circle cx="966" cy="375" r="2" onmouseover="showOTT(evt, 4, '1334,10,0,0', '1334,12,0,0', 1.84, 0.37, 25, 1.46, 0.55)" onmouseout="hideOTT(evt)" />
<circle cx="1150" cy="600" r="2"
- onmouseover="showBTT(evt, 4, 2.00, 0.00, 0.00, 0.00, 3, 2, 0, 2, 2)"
+ onmouseover="showBTT(evt, 4, 2.00, 0.00, 0.00, 0.00, 2, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
-<circle cx="459" cy="271" r="2"
- onmouseover="showBTT(evt, 4, 1.40, 0.00, 0.55, 0.00, 6, 2, 0, 2, 2)"
+<circle cx="183" cy="187" r="2"
+ onmouseover="showBTT(evt, 4, 1.16, 0.00, 0.69, 0.00, 3, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
-<circle cx="459" cy="63" r="2"
- onmouseover="showBTT(evt, 4, 1.40, 0.00, 0.89, 0.00, 3, 2, 0, 2, 2)"
+<circle cx="781" cy="314" r="2"
+ onmouseover="showBTT(evt, 4, 1.68, 0.00, 0.48, 0.00, 3, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
-<circle cx="230" cy="98" r="2" onmouseover="showOTT(evt, 4, '1340,2,11,12', '1340,9,0,0', 1.20, 0.84, 5, 1.63, 0.54)" onmouseout="hideOTT(evt)" />
-<circle cx="690" cy="271" r="2"
- onmouseover="showBTT(evt, 4, 1.60, 0.00, 0.55, 0.00, 12, 2, 0, 2, 2)"
+<circle cx="735" cy="306" r="2"
+ onmouseover="showBTT(evt, 4, 1.64, 0.00, 0.49, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="322" cy="231" r="2" onmouseover="showOTT(evt, 4, '1334,11,0,0', '1334,13,0,0', 1.28, 0.61, 25, 1.46, 0.55)" onmouseout="hideOTT(evt)" />
+<circle cx="506" cy="296" r="2" onmouseover="showOTT(evt, 4, '1340,11,0,0', '1340,9,0,0', 1.44, 0.51, 25, 1.46, 0.55)" onmouseout="hideOTT(evt)" />
+<circle cx="367" cy="314" r="2" onmouseover="showOTT(evt, 4, '1334,1,10,11', '1334,12,0,0', 1.32, 0.48, 25, 1.46, 0.55)" onmouseout="hideOTT(evt)" />
+<circle cx="183" cy="225" r="2" onmouseover="showOTT(evt, 4, '1334,1,10,11', '1334,2,12,13', 1.16, 0.62, 25, 1.46, 0.55)" onmouseout="hideOTT(evt)" />
+<circle cx="735" cy="258" r="2" onmouseover="showOTT(evt, 4, '105,2,0,0', '105,3,0,0', 1.64, 0.57, 25, 1.46, 0.55)" onmouseout="hideOTT(evt)" />
+<circle cx="184" cy="152" r="2" onmouseover="showOTT(evt, 4, '1340,2,11,12', '1340,9,0,0', 1.16, 0.75, 25, 1.46, 0.55)" onmouseout="hideOTT(evt)" />
+<circle cx="183" cy="89" r="2" onmouseover="showOTT(evt, 4, '1334,11,0,0', '1334,2,12,13', 1.16, 0.85, 25, 1.46, 0.55)" onmouseout="hideOTT(evt)" />
+<circle cx="184" cy="225" r="2" onmouseover="showOTT(evt, 4, '1340,12,0,0', '1340,9,0,0', 1.16, 0.62, 25, 1.46, 0.55)" onmouseout="hideOTT(evt)" />
+<circle cx="92" cy="215" r="2"
+ onmouseover="showBTT(evt, 4, 1.08, 0.00, 0.64, 0.00, 2, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="597" cy="294" r="2"
+ onmouseover="showBTT(evt, 4, 1.52, 0.00, 0.51, 0.00, 6, 2, 0, 2, 2)"
+ onmouseout="hideBTT(evt)" />
+<circle cx="335" cy="149" r="2"
+ onmouseover="showBTT(evt, 4, 1.29, 0.00, 0.75, 0.00, 3, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
</g>
<g id="parentchild" style="stroke:dodgerblue; fill:dodgerblue; fill-opacity:1.0; stroke-width:1;" cursor="pointer">
-<circle cx="919" cy="331" r="2"
- onmouseover="showBTT(evt, 1, 1.80, 0.00, 0.45, 0.00, 4, 2, 0, 2, 2)"
+<circle cx="699" cy="300" r="2" onmouseover="showOTT(evt, 1, '13,1,3,2', '13,2,0,0', 1.61, 0.50, 23, 1.68, 0.39)" onmouseout="hideOTT(evt)" />
+<circle cx="874" cy="338" r="2" onmouseover="showOTT(evt, 1, '1340,12,0,0', '1340,2,11,12', 1.76, 0.44, 25, 1.68, 0.39)" onmouseout="hideOTT(evt)" />
+<circle cx="966" cy="375" r="2" onmouseover="showOTT(evt, 1, '117,1,3,2', '117,3,0,0', 1.84, 0.37, 25, 1.68, 0.39)" onmouseout="hideOTT(evt)" />
+<circle cx="622" cy="294" r="2" onmouseover="showOTT(evt, 1, '101,1,3,2', '101,3,0,0', 1.54, 0.51, 24, 1.68, 0.39)" onmouseout="hideOTT(evt)" />
+<circle cx="690" cy="300" r="2" onmouseover="showOTT(evt, 1, '1334,1,10,11', '1334,11,0,0', 1.60, 0.50, 25, 1.68, 0.39)" onmouseout="hideOTT(evt)" />
+<circle cx="527" cy="294" r="2" onmouseover="showOTT(evt, 1, '105,1,3,2', '105,2,0,0', 1.46, 0.51, 24, 1.68, 0.39)" onmouseout="hideOTT(evt)" />
+<circle cx="479" cy="297" r="2" onmouseover="showOTT(evt, 1, '1341,1,11,12', '1341,11,0,0', 1.42, 0.50, 24, 1.68, 0.39)" onmouseout="hideOTT(evt)" />
+<circle cx="1150" cy="600" r="2"
+ onmouseover="showBTT(evt, 1, 2.00, 0.00, 0.00, 0.00, 5, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
-<circle cx="862" cy="300" r="2"
- onmouseover="showBTT(evt, 1, 1.75, 0.00, 0.50, 0.00, 3, 2, 0, 2, 2)"
+<circle cx="690" cy="299" r="2" onmouseover="showOTT(evt, 1, '117,1,3,2', '117,2,0,0', 1.60, 0.50, 25, 1.68, 0.39)" onmouseout="hideOTT(evt)" />
+<circle cx="827" cy="325" r="2"
+ onmouseover="showBTT(evt, 1, 1.72, 0.00, 0.46, 0.00, 3, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
-<circle cx="575" cy="253" r="2" onmouseover="showOTT(evt, 1, '13,1,3,2', '13,2,0,0', 1.50, 0.58, 4, 1.73, 0.38)" onmouseout="hideOTT(evt)" />
-<circle cx="1150" cy="600" r="2"
- onmouseover="showBTT(evt, 1, 2.00, 0.00, 0.00, 0.00, 7, 2, 0, 2, 2)"
+<circle cx="552" cy="294" r="2"
+ onmouseover="showBTT(evt, 1, 1.48, 0.00, 0.51, 0.00, 2, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
-<circle cx="459" cy="271" r="2"
- onmouseover="showBTT(evt, 1, 1.40, 0.00, 0.55, 0.00, 3, 2, 0, 2, 2)"
+<circle cx="965" cy="375" r="2" onmouseover="showOTT(evt, 1, '1334,12,0,0', '1334,2,12,13', 1.84, 0.37, 25, 1.68, 0.39)" onmouseout="hideOTT(evt)" />
+<circle cx="643" cy="296" r="2"
+ onmouseover="showBTT(evt, 1, 1.56, 0.00, 0.51, 0.00, 3, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
-<circle cx="690" cy="271" r="2"
- onmouseover="showBTT(evt, 1, 1.60, 0.00, 0.55, 0.00, 8, 2, 0, 2, 2)"
+<circle cx="718" cy="303" r="2" onmouseover="showOTT(evt, 1, '1341,1,11,12', '1341,12,0,0', 1.62, 0.49, 24, 1.68, 0.39)" onmouseout="hideOTT(evt)" />
+<circle cx="597" cy="294" r="2"
+ onmouseover="showBTT(evt, 1, 1.52, 0.00, 0.51, 0.00, 2, 2, 0, 2, 2)"
onmouseout="hideBTT(evt)" />
+<circle cx="575" cy="293" r="2" onmouseover="showOTT(evt, 1, '105,1,3,2', '105,3,0,0', 1.50, 0.51, 24, 1.68, 0.39)" onmouseout="hideOTT(evt)" />
</g>
<g id="unknown" style="stroke:gray; fill:gray; fill-opacity:1.0; stroke-width:1;" cursor="pointer">
</g>
diff -r 7f95e51e06f7 -r 2d49a94c8d28 test-data/rgtestouts/rgGRR/rgGRRtest1_table.xls
--- a/test-data/rgtestouts/rgGRR/rgGRRtest1_table.xls Wed May 19 10:28:41 2010 -0400
+++ b/test-data/rgtestouts/rgGRR/rgGRRtest1_table.xls Thu May 20 12:38:35 2010 -0400
@@ -1,781 +1,781 @@
-fid1 iid1 fid2 iid2 mean sdev zmean zsdev geno relcode
-101_1 101_2 1.400000 0.894427 1.351962 -1.627597 5 5
-101_1 101_3 1.400000 0.894427 0.105472 0.511563 5 5
-101_1 105_1 1.400000 0.894427 -0.219631 -0.070847 5 5
-101_1 105_2 1.400000 0.894427 0.821646 -0.397216 5 5
-101_1 105_3 1.400000 0.894427 0.821646 -0.397216 5 5
-101_1 112_1 1.400000 0.894427 -0.219631 1.712469 5 5
-101_1 112_2 1.400000 0.894427 -1.260908 1.532838 5 5
-101_1 112_3 1.400000 0.894427 -0.219631 -0.070847 5 5
-101_1 117_1 1.400000 0.894427 0.821646 -0.397216 5 5
-101_1 117_2 1.400000 0.894427 0.821646 -0.397216 5 5
-101_1 117_3 1.400000 0.894427 0.821646 -0.397216 5 5
-101_1 12_1 1.400000 0.894427 0.821646 -0.397216 5 5
-101_1 12_2 1.400000 0.894427 0.821646 -0.397216 5 5
-101_1 12_3 1.400000 0.894427 0.821646 -0.397216 5 5
-101_1 13_1 1.400000 0.894427 -0.219631 -0.070847 5 5
-101_1 13_2 1.400000 0.894427 -0.219631 1.712469 5 5
-101_1 13_3 1.400000 0.894427 0.821646 -0.397216 5 5
-101_1 1334_1 1.400000 0.894427 0.821646 -0.397216 5 5
-101_1 1334_10 1.400000 0.894427 -0.219631 -0.070847 5 5
-101_1 1334_11 1.400000 0.894427 -1.260908 1.532838 5 5
-101_1 1334_12 1.400000 0.894427 -1.260908 1.532838 5 5
-101_1 1334_13 1.400000 0.894427 -0.219631 -0.070847 5 5
-101_1 1334_2 1.400000 0.894427 -1.260908 1.532838 5 5
-101_1 1340_1 1.400000 0.894427 -0.219631 -0.070847 5 5
-101_1 1340_10 1.400000 0.894427 -0.219631 -0.070847 5 5
-101_1 1340_11 1.400000 0.894427 -0.219631 -0.070847 5 5
-101_1 1340_12 1.400000 0.894427 0.821646 -0.397216 5 5
-101_1 1340_2 1.400000 0.894427 -1.260908 -0.397216 5 5
-101_1 1340_9 1.400000 0.894427 -1.260908 1.532838 5 5
-101_1 1341_1 1.400000 0.894427 0.821646 -0.397216 5 5
-101_1 1341_11 1.400000 0.894427 -1.260908 1.532838 5 5
-101_1 1341_12 1.400000 0.894427 -0.219631 -0.070847 5 5
-101_1 1341_13 1.400000 0.894427 -0.219631 1.712469 5 5
-101_1 1341_14 1.400000 0.894427 -0.219631 1.712469 5 5
-101_1 1341_2 1.400000 0.894427 -0.219631 1.712469 5 5
-101_1 1344_1 1.400000 0.894427 -1.260908 1.532838 5 5
-101_1 1344_12 1.400000 0.894427 -1.260908 -0.397216 5 5
-101_1 1344_13 1.400000 0.894427 -1.260908 -0.397216 5 5
-101_1 1345_12 1.400000 0.894427 -0.219631 -0.070847 5 5
-101_2 101_3 1.400000 0.894427 -0.132290 0.048238 5 5
-101_2 105_1 1.400000 0.894427 -0.219631 -0.070847 5 5
-101_2 105_2 1.400000 0.894427 1.029902 -0.619941 5 5
-101_2 105_3 1.400000 0.894427 1.029902 -0.619941 5 5
-101_2 112_1 1.400000 0.894427 0.196880 1.267018 5 5
-101_2 112_2 1.400000 0.894427 -0.636142 1.267018 5 5
-101_2 112_3 1.400000 0.894427 0.196880 -0.195857 5 5
-101_2 117_1 1.400000 0.894427 1.029902 -0.619941 5 5
-101_2 117_2 1.400000 0.894427 1.029902 -0.619941 5 5
-101_2 117_3 1.400000 0.894427 1.029902 -0.619941 5 5
-101_2 12_1 1.400000 0.894427 1.029902 -0.619941 5 5
-101_2 12_2 1.400000 0.894427 1.029902 -0.619941 5 5
-101_2 12_3 1.400000 0.894427 1.029902 -0.619941 5 5
-101_2 13_1 1.400000 0.894427 0.196880 -0.195857 5 5
-101_2 13_2 1.400000 0.894427 -0.219631 1.712469 5 5
-101_2 13_3 1.400000 0.894427 1.029902 -0.619941 5 5
-101_2 1334_1 1.400000 0.894427 1.029902 -0.619941 5 5
-101_2 1334_10 1.400000 0.894427 0.196880 -0.195857 5 5
-101_2 1334_11 1.400000 0.894427 -0.636142 1.267018 5 5
-101_2 1334_12 1.400000 0.894427 -0.636142 1.267018 5 5
-101_2 1334_13 1.400000 0.894427 0.196880 -0.195857 5 5
-101_2 1334_2 1.400000 0.894427 -0.636142 1.267018 5 5
-101_2 1340_1 1.400000 0.894427 0.196880 -0.195857 5 5
-101_2 1340_10 1.400000 0.894427 0.196880 -0.195857 5 5
-101_2 1340_11 1.400000 0.894427 0.196880 -0.195857 5 5
-101_2 1340_12 1.400000 0.894427 1.029902 -0.619941 5 5
-101_2 1340_2 1.400000 0.894427 -0.636142 -0.195857 5 5
-101_2 1340_9 1.400000 0.894427 -0.636142 1.267018 5 5
-101_2 1341_1 1.400000 0.894427 1.029902 -0.619941 5 5
-101_2 1341_11 1.400000 0.894427 -0.636142 1.267018 5 5
-101_2 1341_12 1.400000 0.894427 0.196880 -0.195857 5 5
-101_2 1341_13 1.400000 0.894427 0.196880 1.267018 5 5
-101_2 1341_14 1.400000 0.894427 0.196880 1.267018 5 5
-101_2 1341_2 1.400000 0.894427 0.196880 1.267018 5 5
-101_2 1344_1 1.400000 0.894427 -0.636142 1.267018 5 5
-101_2 1344_12 1.400000 0.894427 -0.636142 -0.195857 5 5
-101_2 1344_13 1.400000 0.894427 -0.636142 -0.195857 5 5
-101_2 1345_12 1.400000 0.894427 0.196880 -0.195857 5 5
-101_3 105_1 1.400000 0.894427 -1.260908 1.532838 5 5
-101_3 105_2 1.400000 0.894427 -0.636142 -0.195857 5 5
-101_3 105_3 1.400000 0.894427 -0.636142 -0.195857 5 5
-101_3 112_1 1.400000 0.894427 -1.469163 1.023277 5 5
-101_3 112_2 1.400000 0.894427 -2.302185 1.712469 5 5
-101_3 112_3 1.400000 0.894427 0.196880 -0.195857 5 5
-101_3 117_1 1.400000 0.894427 -0.636142 -0.195857 5 5
-101_3 117_2 1.400000 0.894427 1.029902 -0.619941 5 5
-101_3 117_3 1.400000 0.894427 -0.636142 -0.195857 5 5
-101_3 12_1 1.400000 0.894427 1.029902 -0.619941 5 5
-101_3 12_2 1.400000 0.894427 1.029902 -0.619941 5 5
-101_3 12_3 1.400000 0.894427 -0.636142 -0.195857 5 5
-101_3 13_1 1.400000 0.894427 0.196880 -0.195857 5 5
-101_3 13_2 1.400000 0.894427 -1.260908 1.532838 5 5
-101_3 13_3 1.400000 0.894427 -0.636142 -0.195857 5 5
-101_3 1334_1 1.400000 0.894427 -0.636142 -0.195857 5 5
-101_3 1334_10 1.400000 0.894427 0.196880 -0.195857 5 5
-101_3 1334_11 1.400000 0.894427 -2.302185 1.712469 5 5
-101_3 1334_12 1.400000 0.894427 -0.636142 1.267018 5 5
-101_3 1334_13 1.400000 0.894427 -1.469163 -0.619941 5 5
-101_3 1334_2 1.400000 0.894427 -0.636142 1.267018 5 5
-101_3 1340_1 1.400000 0.894427 -1.469163 -0.619941 5 5
-101_3 1340_10 1.400000 0.894427 -1.469163 -0.619941 5 5
-101_3 1340_11 1.400000 0.894427 -1.469163 -0.619941 5 5
-101_3 1340_12 1.400000 0.894427 -0.636142 -0.195857 5 5
-101_3 1340_2 1.400000 0.894427 -2.302185 0.476644 5 5
-101_3 1340_9 1.400000 0.894427 -0.636142 1.267018 5 5
-101_3 1341_1 1.400000 0.894427 -0.636142 -0.195857 5 5
-101_3 1341_11 1.400000 0.894427 -2.302185 1.712469 5 5
-101_3 1341_12 1.400000 0.894427 0.196880 -0.195857 5 5
-101_3 1341_13 1.400000 0.894427 -1.469163 1.023277 5 5
-101_3 1341_14 1.400000 0.894427 -1.469163 1.023277 5 5
-101_3 1341_2 1.400000 0.894427 -1.469163 1.023277 5 5
-101_3 1344_1 1.400000 0.894427 -2.302185 1.712469 5 5
-101_3 1344_12 1.400000 0.894427 -2.302185 0.476644 5 5
-101_3 1344_13 1.400000 0.894427 -2.302185 0.476644 5 5
-101_3 1345_12 1.400000 0.894427 0.196880 -0.195857 5 5
-105_1 105_2 1.400000 0.894427 0.105472 0.511563 5 5
-105_1 105_3 1.400000 0.894427 0.105472 0.511563 5 5
-105_1 112_1 1.400000 0.894427 -0.219631 -0.070847 5 5
-105_1 112_2 1.400000 0.894427 0.821646 -0.397216 5 5
-105_1 112_3 1.400000 0.894427 -0.219631 1.712469 5 5
-105_1 117_1 1.400000 0.894427 -1.260908 -0.397216 5 5
-105_1 117_2 1.400000 0.894427 -1.260908 1.532838 5 5
-105_1 117_3 1.400000 0.894427 -1.260908 -0.397216 5 5
-105_1 12_1 1.400000 0.894427 -1.260908 1.532838 5 5
-105_1 12_2 1.400000 0.894427 -1.260908 1.532838 5 5
-105_1 12_3 1.400000 0.894427 0.821646 -0.397216 5 5
-105_1 13_1 1.400000 0.894427 -0.219631 1.712469 5 5
-105_1 13_2 1.400000 0.894427 -0.219631 -0.070847 5 5
-105_1 13_3 1.400000 0.894427 -1.260908 -0.397216 5 5
-105_1 1334_1 1.400000 0.894427 0.821646 -0.397216 5 5
-105_1 1334_10 1.400000 0.894427 -0.219631 1.712469 5 5
-105_1 1334_11 1.400000 0.894427 0.821646 -0.397216 5 5
-105_1 1334_12 1.400000 0.894427 -1.260908 1.532838 5 5
-105_1 1334_13 1.400000 0.894427 -0.219631 -0.070847 5 5
-105_1 1334_2 1.400000 0.894427 -1.260908 1.532838 5 5
-105_1 1340_1 1.400000 0.894427 -0.219631 -0.070847 5 5
-105_1 1340_10 1.400000 0.894427 -0.219631 -0.070847 5 5
-105_1 1340_11 1.400000 0.894427 -0.219631 -0.070847 5 5
-105_1 1340_12 1.400000 0.894427 0.821646 -0.397216 5 5
-105_1 1340_2 1.400000 0.894427 0.821646 -0.397216 5 5
-105_1 1340_9 1.400000 0.894427 -1.260908 1.532838 5 5
-105_1 1341_1 1.400000 0.894427 0.821646 -0.397216 5 5
-105_1 1341_11 1.400000 0.894427 0.821646 -0.397216 5 5
-105_1 1341_12 1.400000 0.894427 -0.219631 1.712469 5 5
-105_1 1341_13 1.400000 0.894427 -0.219631 -0.070847 5 5
-105_1 1341_14 1.400000 0.894427 -0.219631 -0.070847 5 5
-105_1 1341_2 1.400000 0.894427 -0.219631 -0.070847 5 5
-105_1 1344_1 1.400000 0.894427 -1.260908 1.532838 5 5
-105_1 1344_12 1.400000 0.894427 0.821646 -0.397216 5 5
-105_1 1344_13 1.400000 0.894427 0.821646 -0.397216 5 5
-105_1 1345_12 1.400000 0.894427 -0.219631 1.712469 5 5
-105_2 105_3 1.400000 0.894427 1.883560 -2.485480 5 5
-105_2 112_1 1.400000 0.894427 1.029902 -0.619941 5 5
-105_2 112_2 1.400000 0.894427 0.196880 -0.195857 5 5
-105_2 112_3 1.400000 0.894427 1.029902 -0.619941 5 5
-105_2 117_1 1.400000 0.894427 0.196880 -0.195857 5 5
-105_2 117_2 1.400000 0.894427 0.196880 -0.195857 5 5
-105_2 117_3 1.400000 0.894427 0.196880 -0.195857 5 5
-105_2 12_1 1.400000 0.894427 0.196880 -0.195857 5 5
-105_2 12_2 1.400000 0.894427 0.196880 -0.195857 5 5
-105_2 12_3 1.400000 0.894427 1.862924 -2.506901 5 5
-105_2 13_1 1.400000 0.894427 1.029902 -0.619941 5 5
-105_2 13_2 1.400000 0.894427 0.821646 -0.397216 5 5
-105_2 13_3 1.400000 0.894427 0.196880 -0.195857 5 5
-105_2 1334_1 1.400000 0.894427 1.862924 -2.506901 5 5
-105_2 1334_10 1.400000 0.894427 1.029902 -0.619941 5 5
-105_2 1334_11 1.400000 0.894427 0.196880 -0.195857 5 5
-105_2 1334_12 1.400000 0.894427 0.196880 -0.195857 5 5
-105_2 1334_13 1.400000 0.894427 1.029902 -0.619941 5 5
-105_2 1334_2 1.400000 0.894427 0.196880 -0.195857 5 5
-105_2 1340_1 1.400000 0.894427 1.029902 -0.619941 5 5
-105_2 1340_10 1.400000 0.894427 1.029902 -0.619941 5 5
-105_2 1340_11 1.400000 0.894427 1.029902 -0.619941 5 5
-105_2 1340_12 1.400000 0.894427 1.862924 -2.506901 5 5
-105_2 1340_2 1.400000 0.894427 0.196880 -0.195857 5 5
-105_2 1340_9 1.400000 0.894427 0.196880 -0.195857 5 5
-105_2 1341_1 1.400000 0.894427 1.862924 -2.506901 5 5
-105_2 1341_11 1.400000 0.894427 0.196880 -0.195857 5 5
-105_2 1341_12 1.400000 0.894427 1.029902 -0.619941 5 5
-105_2 1341_13 1.400000 0.894427 1.029902 -0.619941 5 5
-105_2 1341_14 1.400000 0.894427 1.029902 -0.619941 5 5
-105_2 1341_2 1.400000 0.894427 1.029902 -0.619941 5 5
-105_2 1344_1 1.400000 0.894427 -1.469163 1.023277 5 5
-105_2 1344_12 1.400000 0.894427 0.196880 -0.195857 5 5
-105_2 1344_13 1.400000 0.894427 0.196880 -0.195857 5 5
-105_2 1345_12 1.400000 0.894427 1.029902 -0.619941 5 5
-105_3 112_1 1.400000 0.894427 1.029902 -0.619941 5 5
-105_3 112_2 1.400000 0.894427 0.196880 -0.195857 5 5
-105_3 112_3 1.400000 0.894427 1.029902 -0.619941 5 5
-105_3 117_1 1.400000 0.894427 0.196880 -0.195857 5 5
-105_3 117_2 1.400000 0.894427 0.196880 -0.195857 5 5
-105_3 117_3 1.400000 0.894427 0.196880 -0.195857 5 5
-105_3 12_1 1.400000 0.894427 0.196880 -0.195857 5 5
-105_3 12_2 1.400000 0.894427 0.196880 -0.195857 5 5
-105_3 12_3 1.400000 0.894427 1.862924 -2.506901 5 5
-105_3 13_1 1.400000 0.894427 1.029902 -0.619941 5 5
-105_3 13_2 1.400000 0.894427 0.821646 -0.397216 5 5
-105_3 13_3 1.400000 0.894427 0.196880 -0.195857 5 5
-105_3 1334_1 1.400000 0.894427 1.862924 -2.506901 5 5
-105_3 1334_10 1.400000 0.894427 1.029902 -0.619941 5 5
-105_3 1334_11 1.400000 0.894427 0.196880 -0.195857 5 5
-105_3 1334_12 1.400000 0.894427 0.196880 -0.195857 5 5
-105_3 1334_13 1.400000 0.894427 1.029902 -0.619941 5 5
-105_3 1334_2 1.400000 0.894427 0.196880 -0.195857 5 5
-105_3 1340_1 1.400000 0.894427 1.029902 -0.619941 5 5
-105_3 1340_10 1.400000 0.894427 1.029902 -0.619941 5 5
-105_3 1340_11 1.400000 0.894427 1.029902 -0.619941 5 5
-105_3 1340_12 1.400000 0.894427 1.862924 -2.506901 5 5
-105_3 1340_2 1.400000 0.894427 0.196880 -0.195857 5 5
-105_3 1340_9 1.400000 0.894427 0.196880 -0.195857 5 5
-105_3 1341_1 1.400000 0.894427 1.862924 -2.506901 5 5
-105_3 1341_11 1.400000 0.894427 0.196880 -0.195857 5 5
-105_3 1341_12 1.400000 0.894427 1.029902 -0.619941 5 5
-105_3 1341_13 1.400000 0.894427 1.029902 -0.619941 5 5
-105_3 1341_14 1.400000 0.894427 1.029902 -0.619941 5 5
-105_3 1341_2 1.400000 0.894427 1.029902 -0.619941 5 5
-105_3 1344_1 1.400000 0.894427 -1.469163 1.023277 5 5
-105_3 1344_12 1.400000 0.894427 0.196880 -0.195857 5 5
-105_3 1344_13 1.400000 0.894427 0.196880 -0.195857 5 5
-105_3 1345_12 1.400000 0.894427 1.029902 -0.619941 5 5
-112_1 112_2 1.400000 0.894427 0.354770 0.285726 5 5
-112_1 112_3 1.400000 0.894427 -0.642422 0.715736 5 5
-112_1 117_1 1.400000 0.894427 -0.636142 1.267018 5 5
-112_1 117_2 1.400000 0.894427 -0.636142 1.267018 5 5
-112_1 117_3 1.400000 0.894427 -0.636142 1.267018 5 5
-112_1 12_1 1.400000 0.894427 -0.636142 1.267018 5 5
-112_1 12_2 1.400000 0.894427 -0.636142 1.267018 5 5
-112_1 12_3 1.400000 0.894427 1.029902 -0.619941 5 5
-112_1 13_1 1.400000 0.894427 0.196880 -0.195857 5 5
-112_1 13_2 1.400000 0.894427 1.862924 -2.506901 5 5
-112_1 13_3 1.400000 0.894427 -0.636142 1.267018 5 5
-112_1 1334_1 1.400000 0.894427 1.029902 -0.619941 5 5
-112_1 1334_10 1.400000 0.894427 0.196880 -0.195857 5 5
-112_1 1334_11 1.400000 0.894427 1.029902 -0.619941 5 5
-112_1 1334_12 1.400000 0.894427 1.029902 -0.619941 5 5
-112_1 1334_13 1.400000 0.894427 0.196880 -0.195857 5 5
-112_1 1334_2 1.400000 0.894427 1.029902 -0.619941 5 5
-112_1 1340_1 1.400000 0.894427 0.196880 -0.195857 5 5
-112_1 1340_10 1.400000 0.894427 0.196880 -0.195857 5 5
-112_1 1340_11 1.400000 0.894427 0.196880 -0.195857 5 5
-112_1 1340_12 1.400000 0.894427 1.029902 -0.619941 5 5
-112_1 1340_2 1.400000 0.894427 -0.636142 -0.195857 5 5
-112_1 1340_9 1.400000 0.894427 1.029902 -0.619941 5 5
-112_1 1341_1 1.400000 0.894427 1.029902 -0.619941 5 5
-112_1 1341_11 1.400000 0.894427 1.029902 -0.619941 5 5
-112_1 1341_12 1.400000 0.894427 0.196880 -0.195857 5 5
-112_1 1341_13 1.400000 0.894427 1.862924 -2.506901 5 5
-112_1 1341_14 1.400000 0.894427 1.862924 -2.506901 5 5
-112_1 1341_2 1.400000 0.894427 1.862924 -2.506901 5 5
-112_1 1344_1 1.400000 0.894427 -2.302185 1.712469 5 5
-112_1 1344_12 1.400000 0.894427 -0.636142 -0.195857 5 5
-112_1 1344_13 1.400000 0.894427 -0.636142 -0.195857 5 5
-112_1 1345_12 1.400000 0.894427 0.196880 -0.195857 5 5
-112_2 112_3 1.400000 0.894427 -1.140216 1.652064 5 5
-112_2 117_1 1.400000 0.894427 -1.469163 1.023277 5 5
-112_2 117_2 1.400000 0.894427 -1.469163 2.115187 5 5
-112_2 117_3 1.400000 0.894427 -1.469163 1.023277 5 5
-112_2 12_1 1.400000 0.894427 -1.469163 2.115187 5 5
-112_2 12_2 1.400000 0.894427 -1.469163 2.115187 5 5
-112_2 12_3 1.400000 0.894427 0.196880 -0.195857 5 5
-112_2 13_1 1.400000 0.894427 -0.636142 1.267018 5 5
-112_2 13_2 1.400000 0.894427 0.821646 -0.397216 5 5
-112_2 13_3 1.400000 0.894427 -1.469163 1.023277 5 5
-112_2 1334_1 1.400000 0.894427 0.196880 -0.195857 5 5
-112_2 1334_10 1.400000 0.894427 -0.636142 1.267018 5 5
-112_2 1334_11 1.400000 0.894427 1.862924 -2.506901 5 5
-112_2 1334_12 1.400000 0.894427 0.196880 1.267018 5 5
-112_2 1334_13 1.400000 0.894427 -0.636142 -0.195857 5 5
-112_2 1334_2 1.400000 0.894427 0.196880 1.267018 5 5
-112_2 1340_1 1.400000 0.894427 -0.636142 -0.195857 5 5
-112_2 1340_10 1.400000 0.894427 -0.636142 -0.195857 5 5
-112_2 1340_11 1.400000 0.894427 -0.636142 -0.195857 5 5
-112_2 1340_12 1.400000 0.894427 0.196880 -0.195857 5 5
-112_2 1340_2 1.400000 0.894427 0.196880 -0.195857 5 5
-112_2 1340_9 1.400000 0.894427 0.196880 1.267018 5 5
-112_2 1341_1 1.400000 0.894427 0.196880 -0.195857 5 5
-112_2 1341_11 1.400000 0.894427 1.862924 -2.506901 5 5
-112_2 1341_12 1.400000 0.894427 -0.636142 1.267018 5 5
-112_2 1341_13 1.400000 0.894427 1.029902 -0.619941 5 5
-112_2 1341_14 1.400000 0.894427 1.029902 -0.619941 5 5
-112_2 1341_2 1.400000 0.894427 1.029902 -0.619941 5 5
-112_2 1344_1 1.400000 0.894427 -1.469163 2.115187 5 5
-112_2 1344_12 1.400000 0.894427 0.196880 -0.195857 5 5
-112_2 1344_13 1.400000 0.894427 0.196880 -0.195857 5 5
-112_2 1345_12 1.400000 0.894427 -0.636142 1.267018 5 5
-112_3 117_1 1.400000 0.894427 -0.636142 -0.195857 5 5
-112_3 117_2 1.400000 0.894427 1.029902 -0.619941 5 5
-112_3 117_3 1.400000 0.894427 -0.636142 -0.195857 5 5
-112_3 12_1 1.400000 0.894427 1.029902 -0.619941 5 5
-112_3 12_2 1.400000 0.894427 1.029902 -0.619941 5 5
-112_3 12_3 1.400000 0.894427 1.029902 -0.619941 5 5
-112_3 13_1 1.400000 0.894427 1.862924 -2.506901 5 5
-112_3 13_2 1.400000 0.894427 -0.219631 -0.070847 5 5
-112_3 13_3 1.400000 0.894427 -0.636142 -0.195857 5 5
-112_3 1334_1 1.400000 0.894427 1.029902 -0.619941 5 5
-112_3 1334_10 1.400000 0.894427 1.862924 -2.506901 5 5
-112_3 1334_11 1.400000 0.894427 -0.636142 1.267018 5 5
-112_3 1334_12 1.400000 0.894427 1.029902 -0.619941 5 5
-112_3 1334_13 1.400000 0.894427 0.196880 -0.195857 5 5
-112_3 1334_2 1.400000 0.894427 1.029902 -0.619941 5 5
-112_3 1340_1 1.400000 0.894427 0.196880 -0.195857 5 5
-112_3 1340_10 1.400000 0.894427 0.196880 -0.195857 5 5
-112_3 1340_11 1.400000 0.894427 0.196880 -0.195857 5 5
-112_3 1340_12 1.400000 0.894427 1.029902 -0.619941 5 5
-112_3 1340_2 1.400000 0.894427 -0.636142 1.267018 5 5
-112_3 1340_9 1.400000 0.894427 1.029902 -0.619941 5 5
-112_3 1341_1 1.400000 0.894427 1.029902 -0.619941 5 5
-112_3 1341_11 1.400000 0.894427 -0.636142 1.267018 5 5
-112_3 1341_12 1.400000 0.894427 1.862924 -2.506901 5 5
-112_3 1341_13 1.400000 0.894427 0.196880 -0.195857 5 5
-112_3 1341_14 1.400000 0.894427 0.196880 -0.195857 5 5
-112_3 1341_2 1.400000 0.894427 0.196880 -0.195857 5 5
-112_3 1344_1 1.400000 0.894427 -2.302185 1.712469 5 5
-112_3 1344_12 1.400000 0.894427 -0.636142 1.267018 5 5
-112_3 1344_13 1.400000 0.894427 -0.636142 1.267018 5 5
-112_3 1345_12 1.400000 0.894427 1.862924 -2.506901 5 5
-117_1 117_2 1.400000 0.894427 -0.642422 0.715736 5 5
-117_1 117_3 1.400000 0.894427 1.351962 -1.627597 5 5
-117_1 12_1 1.400000 0.894427 0.196880 -0.195857 5 5
-117_1 12_2 1.400000 0.894427 0.196880 -0.195857 5 5
-117_1 12_3 1.400000 0.894427 0.196880 -0.195857 5 5
-117_1 13_1 1.400000 0.894427 -0.636142 -0.195857 5 5
-117_1 13_2 1.400000 0.894427 -1.260908 1.532838 5 5
-117_1 13_3 1.400000 0.894427 0.196880 -0.195857 5 5
-117_1 1334_1 1.400000 0.894427 0.196880 -0.195857 5 5
-117_1 1334_10 1.400000 0.894427 -0.636142 -0.195857 5 5
-117_1 1334_11 1.400000 0.894427 -1.469163 1.023277 5 5
-117_1 1334_12 1.400000 0.894427 -1.469163 1.023277 5 5
-117_1 1334_13 1.400000 0.894427 1.029902 -0.619941 5 5
-117_1 1334_2 1.400000 0.894427 -1.469163 1.023277 5 5
-117_1 1340_1 1.400000 0.894427 -0.636142 -0.195857 5 5
-117_1 1340_10 1.400000 0.894427 -0.636142 -0.195857 5 5
-117_1 1340_11 1.400000 0.894427 1.029902 -0.619941 5 5
-117_1 1340_12 1.400000 0.894427 0.196880 -0.195857 5 5
-117_1 1340_2 1.400000 0.894427 0.196880 -0.195857 5 5
-117_1 1340_9 1.400000 0.894427 -1.469163 1.023277 5 5
-117_1 1341_1 1.400000 0.894427 0.196880 -0.195857 5 5
-117_1 1341_11 1.400000 0.894427 -1.469163 1.023277 5 5
-117_1 1341_12 1.400000 0.894427 -0.636142 -0.195857 5 5
-117_1 1341_13 1.400000 0.894427 -0.636142 1.267018 5 5
-117_1 1341_14 1.400000 0.894427 -0.636142 1.267018 5 5
-117_1 1341_2 1.400000 0.894427 -0.636142 1.267018 5 5
-117_1 1344_1 1.400000 0.894427 0.196880 -0.195857 5 5
-117_1 1344_12 1.400000 0.894427 0.196880 -0.195857 5 5
-117_1 1344_13 1.400000 0.894427 0.196880 -0.195857 5 5
-117_1 1345_12 1.400000 0.894427 -0.636142 -0.195857 5 5
-117_2 117_3 1.400000 0.894427 -0.132290 0.048238 5 5
-117_2 12_1 1.400000 0.894427 1.862924 -2.506901 5 5
-117_2 12_2 1.400000 0.894427 1.862924 -2.506901 5 5
-117_2 12_3 1.400000 0.894427 0.196880 -0.195857 5 5
-117_2 13_1 1.400000 0.894427 1.029902 -0.619941 5 5
-117_2 13_2 1.400000 0.894427 -1.260908 1.532838 5 5
-117_2 13_3 1.400000 0.894427 0.196880 -0.195857 5 5
-117_2 1334_1 1.400000 0.894427 0.196880 -0.195857 5 5
-117_2 1334_10 1.400000 0.894427 1.029902 -0.619941 5 5
-117_2 1334_11 1.400000 0.894427 -1.469163 2.115187 5 5
-117_2 1334_12 1.400000 0.894427 0.196880 1.267018 5 5
-117_2 1334_13 1.400000 0.894427 -0.636142 -0.195857 5 5
-117_2 1334_2 1.400000 0.894427 0.196880 1.267018 5 5
-117_2 1340_1 1.400000 0.894427 -0.636142 -0.195857 5 5
-117_2 1340_10 1.400000 0.894427 -0.636142 -0.195857 5 5
-117_2 1340_11 1.400000 0.894427 -0.636142 -0.195857 5 5
-117_2 1340_12 1.400000 0.894427 0.196880 -0.195857 5 5
-117_2 1340_2 1.400000 0.894427 -1.469163 1.023277 5 5
-117_2 1340_9 1.400000 0.894427 0.196880 1.267018 5 5
-117_2 1341_1 1.400000 0.894427 0.196880 -0.195857 5 5
-117_2 1341_11 1.400000 0.894427 -1.469163 2.115187 5 5
-117_2 1341_12 1.400000 0.894427 1.029902 -0.619941 5 5
-117_2 1341_13 1.400000 0.894427 -0.636142 1.267018 5 5
-117_2 1341_14 1.400000 0.894427 -0.636142 1.267018 5 5
-117_2 1341_2 1.400000 0.894427 -0.636142 1.267018 5 5
-117_2 1344_1 1.400000 0.894427 -1.469163 2.115187 5 5
-117_2 1344_12 1.400000 0.894427 -1.469163 1.023277 5 5
-117_2 1344_13 1.400000 0.894427 -1.469163 1.023277 5 5
-117_2 1345_12 1.400000 0.894427 1.029902 -0.619941 5 5
-117_3 12_1 1.400000 0.894427 0.196880 -0.195857 5 5
-117_3 12_2 1.400000 0.894427 0.196880 -0.195857 5 5
-117_3 12_3 1.400000 0.894427 0.196880 -0.195857 5 5
-117_3 13_1 1.400000 0.894427 -0.636142 -0.195857 5 5
-117_3 13_2 1.400000 0.894427 -1.260908 1.532838 5 5
-117_3 13_3 1.400000 0.894427 0.196880 -0.195857 5 5
-117_3 1334_1 1.400000 0.894427 0.196880 -0.195857 5 5
-117_3 1334_10 1.400000 0.894427 -0.636142 -0.195857 5 5
-117_3 1334_11 1.400000 0.894427 -1.469163 1.023277 5 5
-117_3 1334_12 1.400000 0.894427 -1.469163 1.023277 5 5
-117_3 1334_13 1.400000 0.894427 1.029902 -0.619941 5 5
-117_3 1334_2 1.400000 0.894427 -1.469163 1.023277 5 5
-117_3 1340_1 1.400000 0.894427 -0.636142 -0.195857 5 5
-117_3 1340_10 1.400000 0.894427 -0.636142 -0.195857 5 5
-117_3 1340_11 1.400000 0.894427 1.029902 -0.619941 5 5
-117_3 1340_12 1.400000 0.894427 0.196880 -0.195857 5 5
-117_3 1340_2 1.400000 0.894427 0.196880 -0.195857 5 5
-117_3 1340_9 1.400000 0.894427 -1.469163 1.023277 5 5
-117_3 1341_1 1.400000 0.894427 0.196880 -0.195857 5 5
-117_3 1341_11 1.400000 0.894427 -1.469163 1.023277 5 5
-117_3 1341_12 1.400000 0.894427 -0.636142 -0.195857 5 5
-117_3 1341_13 1.400000 0.894427 -0.636142 1.267018 5 5
-117_3 1341_14 1.400000 0.894427 -0.636142 1.267018 5 5
-117_3 1341_2 1.400000 0.894427 -0.636142 1.267018 5 5
-117_3 1344_1 1.400000 0.894427 0.196880 -0.195857 5 5
-117_3 1344_12 1.400000 0.894427 0.196880 -0.195857 5 5
-117_3 1344_13 1.400000 0.894427 0.196880 -0.195857 5 5
-117_3 1345_12 1.400000 0.894427 -0.636142 -0.195857 5 5
-12_1 12_2 1.400000 0.894427 1.351962 -1.627597 5 5
-12_1 12_3 1.400000 0.894427 -0.642422 0.715736 5 5
-12_1 13_1 1.400000 0.894427 1.029902 -0.619941 5 5
-12_1 13_2 1.400000 0.894427 -1.260908 1.532838 5 5
-12_1 13_3 1.400000 0.894427 0.196880 -0.195857 5 5
-12_1 1334_1 1.400000 0.894427 0.196880 -0.195857 5 5
-12_1 1334_10 1.400000 0.894427 1.029902 -0.619941 5 5
-12_1 1334_11 1.400000 0.894427 -1.469163 2.115187 5 5
-12_1 1334_12 1.400000 0.894427 0.196880 1.267018 5 5
-12_1 1334_13 1.400000 0.894427 -0.636142 -0.195857 5 5
-12_1 1334_2 1.400000 0.894427 0.196880 1.267018 5 5
-12_1 1340_1 1.400000 0.894427 -0.636142 -0.195857 5 5
-12_1 1340_10 1.400000 0.894427 -0.636142 -0.195857 5 5
-12_1 1340_11 1.400000 0.894427 -0.636142 -0.195857 5 5
-12_1 1340_12 1.400000 0.894427 0.196880 -0.195857 5 5
-12_1 1340_2 1.400000 0.894427 -1.469163 1.023277 5 5
-12_1 1340_9 1.400000 0.894427 0.196880 1.267018 5 5
-12_1 1341_1 1.400000 0.894427 0.196880 -0.195857 5 5
-12_1 1341_11 1.400000 0.894427 -1.469163 2.115187 5 5
-12_1 1341_12 1.400000 0.894427 1.029902 -0.619941 5 5
-12_1 1341_13 1.400000 0.894427 -0.636142 1.267018 5 5
-12_1 1341_14 1.400000 0.894427 -0.636142 1.267018 5 5
-12_1 1341_2 1.400000 0.894427 -0.636142 1.267018 5 5
-12_1 1344_1 1.400000 0.894427 -1.469163 2.115187 5 5
-12_1 1344_12 1.400000 0.894427 -1.469163 1.023277 5 5
-12_1 1344_13 1.400000 0.894427 -1.469163 1.023277 5 5
-12_1 1345_12 1.400000 0.894427 1.029902 -0.619941 5 5
-12_2 12_3 1.400000 0.894427 -0.132290 0.048238 5 5
-12_2 13_1 1.400000 0.894427 1.029902 -0.619941 5 5
-12_2 13_2 1.400000 0.894427 -1.260908 1.532838 5 5
-12_2 13_3 1.400000 0.894427 0.196880 -0.195857 5 5
-12_2 1334_1 1.400000 0.894427 0.196880 -0.195857 5 5
-12_2 1334_10 1.400000 0.894427 1.029902 -0.619941 5 5
-12_2 1334_11 1.400000 0.894427 -1.469163 2.115187 5 5
-12_2 1334_12 1.400000 0.894427 0.196880 1.267018 5 5
-12_2 1334_13 1.400000 0.894427 -0.636142 -0.195857 5 5
-12_2 1334_2 1.400000 0.894427 0.196880 1.267018 5 5
-12_2 1340_1 1.400000 0.894427 -0.636142 -0.195857 5 5
-12_2 1340_10 1.400000 0.894427 -0.636142 -0.195857 5 5
-12_2 1340_11 1.400000 0.894427 -0.636142 -0.195857 5 5
-12_2 1340_12 1.400000 0.894427 0.196880 -0.195857 5 5
-12_2 1340_2 1.400000 0.894427 -1.469163 1.023277 5 5
-12_2 1340_9 1.400000 0.894427 0.196880 1.267018 5 5
-12_2 1341_1 1.400000 0.894427 0.196880 -0.195857 5 5
-12_2 1341_11 1.400000 0.894427 -1.469163 2.115187 5 5
-12_2 1341_12 1.400000 0.894427 1.029902 -0.619941 5 5
-12_2 1341_13 1.400000 0.894427 -0.636142 1.267018 5 5
-12_2 1341_14 1.400000 0.894427 -0.636142 1.267018 5 5
-12_2 1341_2 1.400000 0.894427 -0.636142 1.267018 5 5
-12_2 1344_1 1.400000 0.894427 -1.469163 2.115187 5 5
-12_2 1344_12 1.400000 0.894427 -1.469163 1.023277 5 5
-12_2 1344_13 1.400000 0.894427 -1.469163 1.023277 5 5
-12_2 1345_12 1.400000 0.894427 1.029902 -0.619941 5 5
-12_3 13_1 1.400000 0.894427 1.029902 -0.619941 5 5
-12_3 13_2 1.400000 0.894427 0.821646 -0.397216 5 5
-12_3 13_3 1.400000 0.894427 0.196880 -0.195857 5 5
-12_3 1334_1 1.400000 0.894427 1.862924 -2.506901 5 5
-12_3 1334_10 1.400000 0.894427 1.029902 -0.619941 5 5
-12_3 1334_11 1.400000 0.894427 0.196880 -0.195857 5 5
-12_3 1334_12 1.400000 0.894427 0.196880 -0.195857 5 5
-12_3 1334_13 1.400000 0.894427 1.029902 -0.619941 5 5
-12_3 1334_2 1.400000 0.894427 0.196880 -0.195857 5 5
-12_3 1340_1 1.400000 0.894427 1.029902 -0.619941 5 5
-12_3 1340_10 1.400000 0.894427 1.029902 -0.619941 5 5
-12_3 1340_11 1.400000 0.894427 1.029902 -0.619941 5 5
-12_3 1340_12 1.400000 0.894427 1.862924 -2.506901 5 5
-12_3 1340_2 1.400000 0.894427 0.196880 -0.195857 5 5
-12_3 1340_9 1.400000 0.894427 0.196880 -0.195857 5 5
-12_3 1341_1 1.400000 0.894427 1.862924 -2.506901 5 5
-12_3 1341_11 1.400000 0.894427 0.196880 -0.195857 5 5
-12_3 1341_12 1.400000 0.894427 1.029902 -0.619941 5 5
-12_3 1341_13 1.400000 0.894427 1.029902 -0.619941 5 5
-12_3 1341_14 1.400000 0.894427 1.029902 -0.619941 5 5
-12_3 1341_2 1.400000 0.894427 1.029902 -0.619941 5 5
-12_3 1344_1 1.400000 0.894427 -1.469163 1.023277 5 5
-12_3 1344_12 1.400000 0.894427 0.196880 -0.195857 5 5
-12_3 1344_13 1.400000 0.894427 0.196880 -0.195857 5 5
-12_3 1345_12 1.400000 0.894427 1.029902 -0.619941 5 5
-13_1 13_2 1.400000 0.894427 -1.141018 0.842492 5 5
-13_1 13_3 1.400000 0.894427 -1.639614 0.715736 5 5
-13_1 1334_1 1.400000 0.894427 1.029902 -0.619941 5 5
-13_1 1334_10 1.400000 0.894427 1.862924 -2.506901 5 5
-13_1 1334_11 1.400000 0.894427 -0.636142 1.267018 5 5
-13_1 1334_12 1.400000 0.894427 1.029902 -0.619941 5 5
-13_1 1334_13 1.400000 0.894427 0.196880 -0.195857 5 5
-13_1 1334_2 1.400000 0.894427 1.029902 -0.619941 5 5
-13_1 1340_1 1.400000 0.894427 0.196880 -0.195857 5 5
-13_1 1340_10 1.400000 0.894427 0.196880 -0.195857 5 5
-13_1 1340_11 1.400000 0.894427 0.196880 -0.195857 5 5
-13_1 1340_12 1.400000 0.894427 1.029902 -0.619941 5 5
-13_1 1340_2 1.400000 0.894427 -0.636142 1.267018 5 5
-13_1 1340_9 1.400000 0.894427 1.029902 -0.619941 5 5
-13_1 1341_1 1.400000 0.894427 1.029902 -0.619941 5 5
-13_1 1341_11 1.400000 0.894427 -0.636142 1.267018 5 5
-13_1 1341_12 1.400000 0.894427 1.862924 -2.506901 5 5
-13_1 1341_13 1.400000 0.894427 0.196880 -0.195857 5 5
-13_1 1341_14 1.400000 0.894427 0.196880 -0.195857 5 5
-13_1 1341_2 1.400000 0.894427 0.196880 -0.195857 5 5
-13_1 1344_1 1.400000 0.894427 -2.302185 1.712469 5 5
-13_1 1344_12 1.400000 0.894427 -0.636142 1.267018 5 5
-13_1 1344_13 1.400000 0.894427 -0.636142 1.267018 5 5
-13_1 1345_12 1.400000 0.894427 1.862924 -2.506901 5 5
-13_2 13_3 1.400000 0.894427 -1.896159 1.943496 5 5
-13_2 1334_1 1.400000 0.894427 0.821646 -0.397216 5 5
-13_2 1334_10 1.400000 0.894427 -0.219631 -0.070847 5 5
-13_2 1334_11 1.400000 0.894427 0.821646 -0.397216 5 5
-13_2 1334_12 1.400000 0.894427 0.821646 -0.397216 5 5
-13_2 1334_13 1.400000 0.894427 -0.219631 -0.070847 5 5
-13_2 1334_2 1.400000 0.894427 0.821646 -0.397216 5 5
-13_2 1340_1 1.400000 0.894427 -0.219631 -0.070847 5 5
-13_2 1340_10 1.400000 0.894427 -0.219631 -0.070847 5 5
-13_2 1340_11 1.400000 0.894427 -0.219631 -0.070847 5 5
-13_2 1340_12 1.400000 0.894427 0.821646 -0.397216 5 5
-13_2 1340_2 1.400000 0.894427 -1.260908 -0.397216 5 5
-13_2 1340_9 1.400000 0.894427 0.821646 -0.397216 5 5
-13_2 1341_1 1.400000 0.894427 0.821646 -0.397216 5 5
-13_2 1341_11 1.400000 0.894427 0.821646 -0.397216 5 5
-13_2 1341_12 1.400000 0.894427 -0.219631 -0.070847 5 5
-13_2 1341_13 1.400000 0.894427 1.862924 -2.506901 5 5
-13_2 1341_14 1.400000 0.894427 1.862924 -2.506901 5 5
-13_2 1341_2 1.400000 0.894427 1.862924 -2.506901 5 5
-13_2 1344_1 1.400000 0.894427 -3.343462 1.532838 5 5
-13_2 1344_12 1.400000 0.894427 -1.260908 -0.397216 5 5
-13_2 1344_13 1.400000 0.894427 -1.260908 -0.397216 5 5
-13_2 1345_12 1.400000 0.894427 -0.219631 -0.070847 5 5
-13_3 1334_1 1.400000 0.894427 0.196880 -0.195857 5 5
-13_3 1334_10 1.400000 0.894427 -0.636142 -0.195857 5 5
-13_3 1334_11 1.400000 0.894427 -1.469163 1.023277 5 5
-13_3 1334_12 1.400000 0.894427 -1.469163 1.023277 5 5
-13_3 1334_13 1.400000 0.894427 -0.636142 -0.195857 5 5
-13_3 1334_2 1.400000 0.894427 -1.469163 1.023277 5 5
-13_3 1340_1 1.400000 0.894427 1.029902 -0.619941 5 5
-13_3 1340_10 1.400000 0.894427 1.029902 -0.619941 5 5
-13_3 1340_11 1.400000 0.894427 -0.636142 -0.195857 5 5
-13_3 1340_12 1.400000 0.894427 0.196880 -0.195857 5 5
-13_3 1340_2 1.400000 0.894427 -1.469163 -0.619941 5 5
-13_3 1340_9 1.400000 0.894427 -1.469163 1.023277 5 5
-13_3 1341_1 1.400000 0.894427 0.196880 -0.195857 5 5
-13_3 1341_11 1.400000 0.894427 -1.469163 1.023277 5 5
-13_3 1341_12 1.400000 0.894427 -0.636142 -0.195857 5 5
-13_3 1341_13 1.400000 0.894427 -0.636142 1.267018 5 5
-13_3 1341_14 1.400000 0.894427 -0.636142 1.267018 5 5
-13_3 1341_2 1.400000 0.894427 -0.636142 1.267018 5 5
-13_3 1344_1 1.400000 0.894427 -1.469163 1.023277 5 5
-13_3 1344_12 1.400000 0.894427 -1.469163 -0.619941 5 5
-13_3 1344_13 1.400000 0.894427 -1.469163 -0.619941 5 5
-13_3 1345_12 1.400000 0.894427 -0.636142 -0.195857 5 5
-1334_1 1334_10 1.400000 0.894427 0.354770 0.285726 5 5
-1334_1 1334_11 1.400000 0.894427 -0.642422 0.715736 5 5
-1334_1 1334_12 1.400000 0.894427 -0.132290 0.048238 5 5
-1334_1 1334_13 1.400000 0.894427 0.875635 -0.416708 5 5
-1334_1 1334_2 1.400000 0.894427 -0.132290 0.048238 5 5
-1334_1 1340_1 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_1 1340_10 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_1 1340_11 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_1 1340_12 1.400000 0.894427 1.862924 -2.506901 5 5
-1334_1 1340_2 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_1 1340_9 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_1 1341_1 1.400000 0.894427 1.862924 -2.506901 5 5
-1334_1 1341_11 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_1 1341_12 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_1 1341_13 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_1 1341_14 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_1 1341_2 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_1 1344_1 1.400000 0.894427 -1.469163 1.023277 5 5
-1334_1 1344_12 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_1 1344_13 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_1 1345_12 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_10 1334_11 1.400000 0.894427 -1.140216 1.652064 5 5
-1334_10 1334_12 1.400000 0.894427 0.875635 -0.416708 5 5
-1334_10 1334_13 1.400000 0.894427 -0.132290 0.048238 5 5
-1334_10 1334_2 1.400000 0.894427 0.875635 -0.416708 5 5
-1334_10 1340_1 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_10 1340_10 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_10 1340_11 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_10 1340_12 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_10 1340_2 1.400000 0.894427 -0.636142 1.267018 5 5
-1334_10 1340_9 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_10 1341_1 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_10 1341_11 1.400000 0.894427 -0.636142 1.267018 5 5
-1334_10 1341_12 1.400000 0.894427 1.862924 -2.506901 5 5
-1334_10 1341_13 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_10 1341_14 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_10 1341_2 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_10 1344_1 1.400000 0.894427 -2.302185 1.712469 5 5
-1334_10 1344_12 1.400000 0.894427 -0.636142 1.267018 5 5
-1334_10 1344_13 1.400000 0.894427 -0.636142 1.267018 5 5
-1334_10 1345_12 1.400000 0.894427 1.862924 -2.506901 5 5
-1334_11 1334_12 1.400000 0.894427 -0.132290 1.652064 5 5
-1334_11 1334_13 1.400000 0.894427 -1.140216 0.048238 5 5
-1334_11 1334_2 1.400000 0.894427 -0.132290 1.652064 5 5
-1334_11 1340_1 1.400000 0.894427 -0.636142 -0.195857 5 5
-1334_11 1340_10 1.400000 0.894427 -0.636142 -0.195857 5 5
-1334_11 1340_11 1.400000 0.894427 -0.636142 -0.195857 5 5
-1334_11 1340_12 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_11 1340_2 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_11 1340_9 1.400000 0.894427 0.196880 1.267018 5 5
-1334_11 1341_1 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_11 1341_11 1.400000 0.894427 1.862924 -2.506901 5 5
-1334_11 1341_12 1.400000 0.894427 -0.636142 1.267018 5 5
-1334_11 1341_13 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_11 1341_14 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_11 1341_2 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_11 1344_1 1.400000 0.894427 -1.469163 2.115187 5 5
-1334_11 1344_12 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_11 1344_13 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_11 1345_12 1.400000 0.894427 -0.636142 1.267018 5 5
-1334_12 1334_13 1.400000 0.894427 -1.140216 0.048238 5 5
-1334_12 1334_2 1.400000 0.894427 1.351962 -1.627597 5 5
-1334_12 1340_1 1.400000 0.894427 -0.636142 -0.195857 5 5
-1334_12 1340_10 1.400000 0.894427 -0.636142 -0.195857 5 5
-1334_12 1340_11 1.400000 0.894427 -0.636142 -0.195857 5 5
-1334_12 1340_12 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_12 1340_2 1.400000 0.894427 -1.469163 1.023277 5 5
-1334_12 1340_9 1.400000 0.894427 1.862924 -2.506901 5 5
-1334_12 1341_1 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_12 1341_11 1.400000 0.894427 0.196880 1.267018 5 5
-1334_12 1341_12 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_12 1341_13 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_12 1341_14 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_12 1341_2 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_12 1344_1 1.400000 0.894427 -3.135207 2.115187 5 5
-1334_12 1344_12 1.400000 0.894427 -1.469163 1.023277 5 5
-1334_12 1344_13 1.400000 0.894427 -1.469163 1.023277 5 5
-1334_12 1345_12 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_13 1334_2 1.400000 0.894427 -1.639614 0.715736 5 5
-1334_13 1340_1 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_13 1340_10 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_13 1340_11 1.400000 0.894427 1.862924 -2.506901 5 5
-1334_13 1340_12 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_13 1340_2 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_13 1340_9 1.400000 0.894427 -0.636142 -0.195857 5 5
-1334_13 1341_1 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_13 1341_11 1.400000 0.894427 -0.636142 -0.195857 5 5
-1334_13 1341_12 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_13 1341_13 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_13 1341_14 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_13 1341_2 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_13 1344_1 1.400000 0.894427 -0.636142 -0.195857 5 5
-1334_13 1344_12 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_13 1344_13 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_13 1345_12 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_2 1340_1 1.400000 0.894427 -0.636142 -0.195857 5 5
-1334_2 1340_10 1.400000 0.894427 -0.636142 -0.195857 5 5
-1334_2 1340_11 1.400000 0.894427 -0.636142 -0.195857 5 5
-1334_2 1340_12 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_2 1340_2 1.400000 0.894427 -1.469163 1.023277 5 5
-1334_2 1340_9 1.400000 0.894427 1.862924 -2.506901 5 5
-1334_2 1341_1 1.400000 0.894427 0.196880 -0.195857 5 5
-1334_2 1341_11 1.400000 0.894427 0.196880 1.267018 5 5
-1334_2 1341_12 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_2 1341_13 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_2 1341_14 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_2 1341_2 1.400000 0.894427 1.029902 -0.619941 5 5
-1334_2 1344_1 1.400000 0.894427 -3.135207 2.115187 5 5
-1334_2 1344_12 1.400000 0.894427 -1.469163 1.023277 5 5
-1334_2 1344_13 1.400000 0.894427 -1.469163 1.023277 5 5
-1334_2 1345_12 1.400000 0.894427 1.029902 -0.619941 5 5
-1340_1 1340_10 1.400000 0.894427 1.351962 -1.627597 5 5
-1340_1 1340_11 1.400000 0.894427 -0.132290 0.048238 5 5
-1340_1 1340_12 1.400000 0.894427 0.875635 -0.416708 5 5
-1340_1 1340_2 1.400000 0.894427 -1.140216 0.048238 5 5
-1340_1 1340_9 1.400000 0.894427 -1.639614 0.715736 5 5
-1340_1 1341_1 1.400000 0.894427 1.029902 -0.619941 5 5
-1340_1 1341_11 1.400000 0.894427 -0.636142 -0.195857 5 5
-1340_1 1341_12 1.400000 0.894427 0.196880 -0.195857 5 5
-1340_1 1341_13 1.400000 0.894427 0.196880 -0.195857 5 5
-1340_1 1341_14 1.400000 0.894427 0.196880 -0.195857 5 5
-1340_1 1341_2 1.400000 0.894427 0.196880 -0.195857 5 5
-1340_1 1344_1 1.400000 0.894427 -2.302185 0.476644 5 5
-1340_1 1344_12 1.400000 0.894427 -0.636142 -0.195857 5 5
-1340_1 1344_13 1.400000 0.894427 -0.636142 -0.195857 5 5
-1340_1 1345_12 1.400000 0.894427 0.196880 -0.195857 5 5
-1340_10 1340_11 1.400000 0.894427 -0.132290 0.048238 5 5
-1340_10 1340_12 1.400000 0.894427 0.875635 -0.416708 5 5
-1340_10 1340_2 1.400000 0.894427 -1.140216 0.048238 5 5
-1340_10 1340_9 1.400000 0.894427 -1.140216 0.048238 5 5
-1340_10 1341_1 1.400000 0.894427 1.029902 -0.619941 5 5
-1340_10 1341_11 1.400000 0.894427 -0.636142 -0.195857 5 5
-1340_10 1341_12 1.400000 0.894427 0.196880 -0.195857 5 5
-1340_10 1341_13 1.400000 0.894427 0.196880 -0.195857 5 5
-1340_10 1341_14 1.400000 0.894427 0.196880 -0.195857 5 5
-1340_10 1341_2 1.400000 0.894427 0.196880 -0.195857 5 5
-1340_10 1344_1 1.400000 0.894427 -2.302185 0.476644 5 5
-1340_10 1344_12 1.400000 0.894427 -0.636142 -0.195857 5 5
-1340_10 1344_13 1.400000 0.894427 -0.636142 -0.195857 5 5
-1340_10 1345_12 1.400000 0.894427 0.196880 -0.195857 5 5
-1340_11 1340_12 1.400000 0.894427 0.875635 -0.416708 5 5
-1340_11 1340_2 1.400000 0.894427 0.354770 0.285726 5 5
-1340_11 1340_9 1.400000 0.894427 -1.140216 0.048238 5 5
-1340_11 1341_1 1.400000 0.894427 1.029902 -0.619941 5 5
-1340_11 1341_11 1.400000 0.894427 -0.636142 -0.195857 5 5
-1340_11 1341_12 1.400000 0.894427 0.196880 -0.195857 5 5
-1340_11 1341_13 1.400000 0.894427 0.196880 -0.195857 5 5
-1340_11 1341_14 1.400000 0.894427 0.196880 -0.195857 5 5
-1340_11 1341_2 1.400000 0.894427 0.196880 -0.195857 5 5
-1340_11 1344_1 1.400000 0.894427 -0.636142 -0.195857 5 5
-1340_11 1344_12 1.400000 0.894427 1.029902 -0.619941 5 5
-1340_11 1344_13 1.400000 0.894427 1.029902 -0.619941 5 5
-1340_11 1345_12 1.400000 0.894427 0.196880 -0.195857 5 5
-1340_12 1340_2 1.400000 0.894427 -0.642422 0.715736 5 5
-1340_12 1340_9 1.400000 0.894427 -0.132290 0.048238 5 5
-1340_12 1341_1 1.400000 0.894427 1.862924 -2.506901 5 5
-1340_12 1341_11 1.400000 0.894427 0.196880 -0.195857 5 5
-1340_12 1341_12 1.400000 0.894427 1.029902 -0.619941 5 5
-1340_12 1341_13 1.400000 0.894427 1.029902 -0.619941 5 5
-1340_12 1341_14 1.400000 0.894427 1.029902 -0.619941 5 5
-1340_12 1341_2 1.400000 0.894427 1.029902 -0.619941 5 5
-1340_12 1344_1 1.400000 0.894427 -1.469163 1.023277 5 5
-1340_12 1344_12 1.400000 0.894427 0.196880 -0.195857 5 5
-1340_12 1344_13 1.400000 0.894427 0.196880 -0.195857 5 5
-1340_12 1345_12 1.400000 0.894427 1.029902 -0.619941 5 5
-1340_2 1340_9 1.400000 0.894427 -2.148141 1.384838 5 5
-1340_2 1341_1 1.400000 0.894427 0.196880 -0.195857 5 5
-1340_2 1341_11 1.400000 0.894427 0.196880 -0.195857 5 5
-1340_2 1341_12 1.400000 0.894427 -0.636142 1.267018 5 5
-1340_2 1341_13 1.400000 0.894427 -0.636142 -0.195857 5 5
-1340_2 1341_14 1.400000 0.894427 -0.636142 -0.195857 5 5
-1340_2 1341_2 1.400000 0.894427 -0.636142 -0.195857 5 5
-1340_2 1344_1 1.400000 0.894427 0.196880 -0.195857 5 5
-1340_2 1344_12 1.400000 0.894427 1.862924 -2.506901 5 5
-1340_2 1344_13 1.400000 0.894427 1.862924 -2.506901 5 5
-1340_2 1345_12 1.400000 0.894427 -0.636142 1.267018 5 5
-1340_9 1341_1 1.400000 0.894427 0.196880 -0.195857 5 5
-1340_9 1341_11 1.400000 0.894427 0.196880 1.267018 5 5
-1340_9 1341_12 1.400000 0.894427 1.029902 -0.619941 5 5
-1340_9 1341_13 1.400000 0.894427 1.029902 -0.619941 5 5
-1340_9 1341_14 1.400000 0.894427 1.029902 -0.619941 5 5
-1340_9 1341_2 1.400000 0.894427 1.029902 -0.619941 5 5
-1340_9 1344_1 1.400000 0.894427 -3.135207 2.115187 5 5
-1340_9 1344_12 1.400000 0.894427 -1.469163 1.023277 5 5
-1340_9 1344_13 1.400000 0.894427 -1.469163 1.023277 5 5
-1340_9 1345_12 1.400000 0.894427 1.029902 -0.619941 5 5
-1341_1 1341_11 1.400000 0.894427 -0.642422 0.715736 5 5
-1341_1 1341_12 1.400000 0.894427 0.354770 0.285726 5 5
-1341_1 1341_13 1.400000 0.894427 0.875635 -0.416708 5 5
-1341_1 1341_14 1.400000 0.894427 0.875635 -0.416708 5 5
-1341_1 1341_2 1.400000 0.894427 0.875635 -0.416708 5 5
-1341_1 1344_1 1.400000 0.894427 -1.469163 1.023277 5 5
-1341_1 1344_12 1.400000 0.894427 0.196880 -0.195857 5 5
-1341_1 1344_13 1.400000 0.894427 0.196880 -0.195857 5 5
-1341_1 1345_12 1.400000 0.894427 1.029902 -0.619941 5 5
-1341_11 1341_12 1.400000 0.894427 -1.140216 1.652064 5 5
-1341_11 1341_13 1.400000 0.894427 0.875635 -0.416708 5 5
-1341_11 1341_14 1.400000 0.894427 0.875635 -0.416708 5 5
-1341_11 1341_2 1.400000 0.894427 0.875635 -0.416708 5 5
-1341_11 1344_1 1.400000 0.894427 -1.469163 2.115187 5 5
-1341_11 1344_12 1.400000 0.894427 0.196880 -0.195857 5 5
-1341_11 1344_13 1.400000 0.894427 0.196880 -0.195857 5 5
-1341_11 1345_12 1.400000 0.894427 -0.636142 1.267018 5 5
-1341_12 1341_13 1.400000 0.894427 -0.132290 0.048238 5 5
-1341_12 1341_14 1.400000 0.894427 -0.132290 0.048238 5 5
-1341_12 1341_2 1.400000 0.894427 -0.132290 0.048238 5 5
-1341_12 1344_1 1.400000 0.894427 -2.302185 1.712469 5 5
-1341_12 1344_12 1.400000 0.894427 -0.636142 1.267018 5 5
-1341_12 1344_13 1.400000 0.894427 -0.636142 1.267018 5 5
-1341_12 1345_12 1.400000 0.894427 1.862924 -2.506901 5 5
-1341_13 1341_14 1.400000 0.894427 1.883560 -2.485480 5 5
-1341_13 1341_2 1.400000 0.894427 1.351962 -1.627597 5 5
-1341_13 1344_1 1.400000 0.894427 -2.302185 1.712469 5 5
-1341_13 1344_12 1.400000 0.894427 -0.636142 -0.195857 5 5
-1341_13 1344_13 1.400000 0.894427 -0.636142 -0.195857 5 5
-1341_13 1345_12 1.400000 0.894427 0.196880 -0.195857 5 5
-1341_14 1341_2 1.400000 0.894427 1.351962 -1.627597 5 5
-1341_14 1344_1 1.400000 0.894427 -2.302185 1.712469 5 5
-1341_14 1344_12 1.400000 0.894427 -0.636142 -0.195857 5 5
-1341_14 1344_13 1.400000 0.894427 -0.636142 -0.195857 5 5
-1341_14 1345_12 1.400000 0.894427 0.196880 -0.195857 5 5
-1341_2 1344_1 1.400000 0.894427 -2.302185 1.712469 5 5
-1341_2 1344_12 1.400000 0.894427 -0.636142 -0.195857 5 5
-1341_2 1344_13 1.400000 0.894427 -0.636142 -0.195857 5 5
-1341_2 1345_12 1.400000 0.894427 0.196880 -0.195857 5 5
-1344_1 1344_12 1.400000 0.894427 -0.642422 0.715735 5 5
-1344_1 1344_13 1.400000 0.894427 -0.642422 0.715735 5 5
-1344_1 1345_12 1.400000 0.894427 -2.302185 1.712469 5 5
-1344_12 1344_13 1.400000 0.894427 1.883560 -2.485480 5 5
-1344_12 1345_12 1.400000 0.894427 -0.636142 1.267018 5 5
-1344_13 1345_12 1.400000 0.894427 -0.636142 1.267018 5 5
+fid1_iid1 fid2_iid2 mean sdev zmean zsdev geno relcode pid1 mid1 pid2 mid2
+101_1 101_2 1.200000 0.577350 1.693329 -2.011511 25 parentchild 3 2 0 0
+101_1 101_3 1.200000 0.577350 -0.717628 0.612530 25 parentchild 3 2 0 0
+101_1 105_1 1.200000 0.577350 0.670010 -0.504142 25 unrelated 3 2 3 2
+101_1 105_2 1.200000 0.577350 0.870921 -0.566551 25 unrelated 3 2 0 0
+101_1 105_3 1.200000 0.577350 1.071833 -0.655899 25 unrelated 3 2 0 0
+101_1 112_1 1.200000 0.577350 -0.736371 0.779435 25 unrelated 3 2 3 2
+101_1 112_2 1.200000 0.577350 -0.937282 0.679102 25 unrelated 3 2 0 0
+101_1 112_3 1.200000 0.577350 -0.535459 -0.655899 25 unrelated 3 2 0 0
+101_1 117_1 1.200000 0.577350 0.067275 0.077804 25 unrelated 3 2 3 2
+101_1 117_2 1.200000 0.577350 0.469098 -0.467231 25 unrelated 3 2 0 0
+101_1 117_3 1.200000 0.577350 0.469098 0.077804 25 unrelated 3 2 0 0
+101_1 12_1 1.200000 0.577350 0.469098 -0.467230 25 unrelated 3 2 3 2
+101_1 12_2 1.200000 0.577350 0.469098 -0.467230 25 unrelated 3 2 0 0
+101_1 12_3 1.200000 0.577350 1.071833 -0.655899 25 unrelated 3 2 0 0
+101_1 13_1 1.200000 0.577350 -0.133637 -0.504142 25 unrelated 3 2 3 2
+101_1 13_2 1.200000 0.577350 -0.255930 0.042025 25 unrelated 3 2 0 0
+101_1 13_3 1.200000 0.577350 1.071832 -0.655899 25 unrelated 3 2 0 0
+101_1 1334_1 1.200000 0.577350 -0.133636 0.045908 25 unrelated 3 2 10 11
+101_1 1334_10 1.200000 0.577350 -0.334548 -0.566551 25 unrelated 3 2 0 0
+101_1 1334_11 1.200000 0.577350 -0.937282 0.679102 25 unrelated 3 2 0 0
+101_1 1334_12 1.200000 0.577350 -0.334548 -0.007823 25 unrelated 3 2 0 0
+101_1 1334_13 1.200000 0.577350 -0.133636 -0.504142 25 unrelated 3 2 0 0
+101_1 1334_2 1.200000 0.577350 -0.736370 1.194476 25 unrelated 3 2 12 13
+101_1 1340_1 1.200000 0.577350 -0.535459 -0.084293 25 unrelated 3 2 9 10
+101_1 1340_10 1.200000 0.577350 -0.535459 -0.084293 25 unrelated 3 2 0 0
+101_1 1340_11 1.200000 0.577350 -0.133636 -0.504142 25 unrelated 3 2 0 0
+101_1 1340_12 1.200000 0.577350 0.469098 -0.467231 25 unrelated 3 2 0 0
+101_1 1340_2 1.200000 0.577350 0.469098 -0.467231 25 unrelated 3 2 11 12
+101_1 1340_9 1.200000 0.577350 -2.142751 0.999931 25 unrelated 3 2 0 0
+101_1 1341_1 1.200000 0.577350 0.163363 -0.455013 25 unrelated 3 2 11 12
+101_1 1341_11 1.200000 0.577350 -0.334549 0.481281 25 unrelated 3 2 0 0
+101_1 1341_12 1.200000 0.577350 -0.937282 -0.925605 25 unrelated 3 2 0 0
+101_1 1341_13 1.200000 0.577350 -0.736371 0.779435 25 unrelated 3 2 0 0
+101_1 1341_14 1.200000 0.577350 -0.736371 0.779435 25 unrelated 3 2 0 0
+101_1 1341_2 1.200000 0.577350 -0.736371 0.779435 25 unrelated 3 2 13 14
+101_1 1344_1 1.200000 0.577350 -0.535459 0.413356 25 unrelated 3 2 12 13
+101_1 1344_12 1.200000 0.577350 0.469098 -0.467231 25 unrelated 3 2 0 0
+101_1 1344_13 1.200000 0.577350 0.469098 -0.467231 25 unrelated 3 2 0 0
+101_1 1345_12 1.200000 0.577350 -0.736370 -0.774446 25 unrelated 3 2 0 0
+101_2 101_3 1.200000 0.577350 0.236040 -0.228179 25 parents 0 0 0 0
+101_2 105_1 1.200000 0.577350 0.670010 -0.504142 25 unrelated 0 0 3 2
+101_2 105_2 1.200000 0.577350 0.943250 -0.598443 25 unrelated 0 0 0 0
+101_2 105_3 1.200000 0.577350 1.136125 -0.693367 25 unrelated 0 0 0 0
+101_2 112_1 1.200000 0.577350 -0.599751 0.780517 25 unrelated 0 0 3 2
+101_2 112_2 1.200000 0.577350 -0.792626 0.696771 25 unrelated 0 0 0 0
+101_2 112_3 1.200000 0.577350 -0.406876 -0.598443 25 unrelated 0 0 0 0
+101_2 117_1 1.200000 0.577350 0.171750 0.062100 25 unrelated 0 0 3 2
+101_2 117_2 1.200000 0.577350 0.557499 -0.483424 25 unrelated 0 0 0 0
+101_2 117_3 1.200000 0.577350 0.557499 0.042491 25 unrelated 0 0 0 0
+101_2 12_1 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 3 2
+101_2 12_2 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 0 0
+101_2 12_3 1.200000 0.577350 1.136124 -0.693367 25 unrelated 0 0 0 0
+101_2 13_1 1.200000 0.577350 -0.021126 -0.483423 25 unrelated 0 0 3 2
+101_2 13_2 1.200000 0.577350 -0.255930 0.042025 25 unrelated 0 0 0 0
+101_2 13_3 1.200000 0.577350 1.136124 -0.693367 25 unrelated 0 0 0 0
+101_2 1334_1 1.200000 0.577350 -0.021125 0.042491 25 unrelated 0 0 10 11
+101_2 1334_10 1.200000 0.577350 -0.214001 -0.528970 25 unrelated 0 0 0 0
+101_2 1334_11 1.200000 0.577350 -0.792626 0.696771 25 unrelated 0 0 0 0
+101_2 1334_12 1.200000 0.577350 -0.214001 0.002982 25 unrelated 0 0 0 0
+101_2 1334_13 1.200000 0.577350 -0.021126 -0.483424 25 unrelated 0 0 0 0
+101_2 1334_2 1.200000 0.577350 -0.599751 1.178851 25 unrelated 0 0 12 13
+101_2 1340_1 1.200000 0.577350 -0.406876 -0.057030 25 unrelated 0 0 9 10
+101_2 1340_10 1.200000 0.577350 -0.406876 -0.057030 25 unrelated 0 0 0 0
+101_2 1340_11 1.200000 0.577350 -0.021126 -0.483424 25 unrelated 0 0 0 0
+101_2 1340_12 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 0 0
+101_2 1340_2 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 11 12
+101_2 1340_9 1.200000 0.577350 -1.949876 1.086115 25 unrelated 0 0 0 0
+101_2 1341_1 1.200000 0.577350 0.268187 -0.455013 25 unrelated 0 0 11 12
+101_2 1341_11 1.200000 0.577350 -0.214002 0.471641 25 unrelated 0 0 0 0
+101_2 1341_12 1.200000 0.577350 -0.792626 -0.816040 25 unrelated 0 0 0 0
+101_2 1341_13 1.200000 0.577350 -0.599751 0.780517 25 unrelated 0 0 0 0
+101_2 1341_14 1.200000 0.577350 -0.599751 0.780517 25 unrelated 0 0 0 0
+101_2 1341_2 1.200000 0.577350 -0.599751 0.780517 25 unrelated 0 0 13 14
+101_2 1344_1 1.200000 0.577350 -0.406876 0.418047 25 unrelated 0 0 12 13
+101_2 1344_12 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 0 0
+101_2 1344_13 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 0 0
+101_2 1345_12 1.200000 0.577350 -0.599751 -0.693367 25 unrelated 0 0 0 0
+101_3 105_1 1.200000 0.577350 -1.540017 1.879362 25 unrelated 0 0 3 2
+101_3 105_2 1.200000 0.577350 0.171750 -0.460872 25 unrelated 0 0 0 0
+101_3 105_3 1.200000 0.577350 -0.792627 -0.242861 25 unrelated 0 0 0 0
+101_3 112_1 1.200000 0.577350 -0.599750 0.780517 25 unrelated 0 0 3 2
+101_3 112_2 1.200000 0.577350 -0.792626 2.157894 25 unrelated 0 0 0 0
+101_3 112_3 1.200000 0.577350 -0.021126 -0.483423 25 unrelated 0 0 0 0
+101_3 117_1 1.200000 0.577350 -0.599751 1.178851 25 unrelated 0 0 3 2
+101_3 117_2 1.200000 0.577350 1.329000 -0.816040 25 unrelated 0 0 0 0
+101_3 117_3 1.200000 0.577350 0.171750 0.062100 25 unrelated 0 0 0 0
+101_3 12_1 1.200000 0.577350 2.486250 -2.592124 25 unrelated 0 0 3 2
+101_3 12_2 1.200000 0.577350 2.486250 -2.592124 25 unrelated 0 0 0 0
+101_3 12_3 1.200000 0.577350 1.136124 -0.693367 25 unrelated 0 0 0 0
+101_3 13_1 1.200000 0.577350 1.521875 -0.969866 25 unrelated 0 0 3 2
+101_3 13_2 1.200000 0.577350 -0.255930 0.546459 25 unrelated 0 0 0 0
+101_3 13_3 1.200000 0.577350 1.136125 -0.693367 25 unrelated 0 0 0 0
+101_3 1334_1 1.200000 0.577350 -0.021126 -0.483424 25 unrelated 0 0 10 11
+101_3 1334_10 1.200000 0.577350 -0.599750 -0.693367 25 unrelated 0 0 0 0
+101_3 1334_11 1.200000 0.577350 -0.792626 2.157894 25 unrelated 0 0 0 0
+101_3 1334_12 1.200000 0.577350 -0.599751 0.345553 25 unrelated 0 0 0 0
+101_3 1334_13 1.200000 0.577350 -0.406876 -0.598443 25 unrelated 0 0 0 0
+101_3 1334_2 1.200000 0.577350 -0.985501 1.388993 25 unrelated 0 0 12 13
+101_3 1340_1 1.200000 0.577350 -0.406876 -0.598443 25 unrelated 0 0 9 10
+101_3 1340_10 1.200000 0.577350 -0.406876 -0.598443 25 unrelated 0 0 0 0
+101_3 1340_11 1.200000 0.577350 -0.406876 -0.598443 25 unrelated 0 0 0 0
+101_3 1340_12 1.200000 0.577350 -0.599750 -0.693367 25 unrelated 0 0 0 0
+101_3 1340_2 1.200000 0.577350 -0.599751 0.345552 25 unrelated 0 0 11 12
+101_3 1340_9 1.200000 0.577350 -0.406876 1.948414 25 unrelated 0 0 0 0
+101_3 1341_1 1.200000 0.577350 -1.339106 0.413355 25 unrelated 0 0 11 12
+101_3 1341_11 1.200000 0.577350 -1.371251 1.881413 25 unrelated 0 0 0 0
+101_3 1341_12 1.200000 0.577350 -1.564126 0.158748 25 unrelated 0 0 0 0
+101_3 1341_13 1.200000 0.577350 -0.599750 0.780517 25 unrelated 0 0 0 0
+101_3 1341_14 1.200000 0.577350 -0.599750 0.780517 25 unrelated 0 0 0 0
+101_3 1341_2 1.200000 0.577350 -0.599750 0.780517 25 unrelated 0 0 13 14
+101_3 1344_1 1.200000 0.577350 -0.792626 2.157893 25 unrelated 0 0 12 13
+101_3 1344_12 1.200000 0.577350 -0.599751 0.345552 25 unrelated 0 0 0 0
+101_3 1344_13 1.200000 0.577350 -0.599751 0.345552 25 unrelated 0 0 0 0
+101_3 1345_12 1.200000 0.577350 -1.371251 0.327238 25 unrelated 0 0 0 0
+105_1 105_2 1.200000 0.577350 -1.155984 0.612530 25 parentchild 3 2 0 0
+105_1 105_3 1.200000 0.577350 -0.936806 0.621689 25 parentchild 3 2 0 0
+105_1 112_1 1.200000 0.577350 -1.540017 1.127651 25 unrelated 3 2 3 2
+105_1 112_2 1.200000 0.577350 -0.133636 1.738452 25 unrelated 3 2 0 0
+105_1 112_3 1.200000 0.577350 -1.339105 0.859974 25 unrelated 3 2 0 0
+105_1 117_1 1.200000 0.577350 0.067275 0.991299 25 unrelated 3 2 3 2
+105_1 117_2 1.200000 0.577350 -1.138194 0.991299 25 unrelated 3 2 0 0
+105_1 117_3 1.200000 0.577350 -0.736371 0.779434 25 unrelated 3 2 0 0
+105_1 12_1 1.200000 0.577350 -1.540017 1.879362 25 unrelated 3 2 3 2
+105_1 12_2 1.200000 0.577350 -1.540017 1.879362 25 unrelated 3 2 0 0
+105_1 12_3 1.200000 0.577350 -0.535459 0.859974 25 unrelated 3 2 0 0
+105_1 13_1 1.200000 0.577350 -1.740928 1.738452 25 unrelated 3 2 3 2
+105_1 13_2 1.200000 0.577350 -1.094517 0.648831 25 unrelated 3 2 0 0
+105_1 13_3 1.200000 0.577350 -0.937282 0.679103 25 unrelated 3 2 0 0
+105_1 1334_1 1.200000 0.577350 -0.937283 1.102364 25 unrelated 3 2 10 11
+105_1 1334_10 1.200000 0.577350 -1.138194 0.991300 25 unrelated 3 2 0 0
+105_1 1334_11 1.200000 0.577350 -0.133636 1.738452 25 unrelated 3 2 0 0
+105_1 1334_12 1.200000 0.577350 -1.138194 0.991300 25 unrelated 3 2 0 0
+105_1 1334_13 1.200000 0.577350 -0.937282 0.213207 25 unrelated 3 2 0 0
+105_1 1334_2 1.200000 0.577350 -1.540016 1.879362 25 unrelated 3 2 12 13
+105_1 1340_1 1.200000 0.577350 -1.339106 0.859974 25 unrelated 3 2 9 10
+105_1 1340_10 1.200000 0.577350 -1.339106 0.859974 25 unrelated 3 2 0 0
+105_1 1340_11 1.200000 0.577350 -0.937282 0.213207 25 unrelated 3 2 0 0
+105_1 1340_12 1.200000 0.577350 -0.334548 -0.566551 25 unrelated 3 2 0 0
+105_1 1340_2 1.200000 0.577350 0.469098 -0.467231 25 unrelated 3 2 11 12
+105_1 1340_9 1.200000 0.577350 -2.946397 2.337655 25 unrelated 3 2 0 0
+105_1 1341_1 1.200000 0.577350 0.582657 -0.481725 25 unrelated 3 2 11 12
+105_1 1341_11 1.200000 0.577350 0.469098 0.077804 25 unrelated 3 2 0 0
+105_1 1341_12 1.200000 0.577350 -0.535459 1.268636 25 unrelated 3 2 0 0
+105_1 1341_13 1.200000 0.577350 -1.540017 1.127651 25 unrelated 3 2 0 0
+105_1 1341_14 1.200000 0.577350 -1.540017 1.127651 25 unrelated 3 2 0 0
+105_1 1341_2 1.200000 0.577350 -1.540017 1.127651 25 unrelated 3 2 13 14
+105_1 1344_1 1.200000 0.577350 0.268187 1.397944 25 unrelated 3 2 12 13
+105_1 1344_12 1.200000 0.577350 0.469098 -0.467231 25 unrelated 3 2 0 0
+105_1 1344_13 1.200000 0.577350 0.469098 -0.467231 25 unrelated 3 2 0 0
+105_1 1345_12 1.200000 0.577350 -0.334549 1.325597 25 unrelated 3 2 0 0
+105_2 105_3 1.200000 0.577350 0.722984 0.122716 25 parents 0 0 0 0
+105_2 112_1 1.200000 0.577350 -0.021126 0.507014 25 unrelated 0 0 3 2
+105_2 112_2 1.200000 0.577350 -0.214001 0.471641 25 unrelated 0 0 0 0
+105_2 112_3 1.200000 0.577350 0.943249 -0.598443 25 unrelated 0 0 0 0
+105_2 117_1 1.200000 0.577350 0.750376 -0.528970 25 unrelated 0 0 3 2
+105_2 117_2 1.200000 0.577350 1.521875 -0.969866 25 unrelated 0 0 0 0
+105_2 117_3 1.200000 0.577350 1.521875 -0.969867 25 unrelated 0 0 0 0
+105_2 12_1 1.200000 0.577350 0.364625 -0.460872 25 unrelated 0 0 3 2
+105_2 12_2 1.200000 0.577350 0.364625 -0.460872 25 unrelated 0 0 0 0
+105_2 12_3 1.200000 0.577350 0.943251 -0.598443 25 unrelated 0 0 0 0
+105_2 13_1 1.200000 0.577350 -0.214002 -0.528970 25 unrelated 0 0 3 2
+105_2 13_2 1.200000 0.577350 0.163363 0.111360 25 unrelated 0 0 0 0
+105_2 13_3 1.200000 0.577350 0.943249 -0.598444 25 unrelated 0 0 0 0
+105_2 1334_1 1.200000 0.577350 1.328999 -0.816040 25 unrelated 0 0 10 11
+105_2 1334_10 1.200000 0.577350 0.364624 -0.460872 25 unrelated 0 0 0 0
+105_2 1334_11 1.200000 0.577350 -0.214001 0.471641 25 unrelated 0 0 0 0
+105_2 1334_12 1.200000 0.577350 -0.021126 0.042491 25 unrelated 0 0 0 0
+105_2 1334_13 1.200000 0.577350 0.943249 -0.598443 25 unrelated 0 0 0 0
+105_2 1334_2 1.200000 0.577350 -0.792626 1.101688 25 unrelated 0 0 12 13
+105_2 1340_1 1.200000 0.577350 0.557499 -0.483424 25 unrelated 0 0 9 10
+105_2 1340_10 1.200000 0.577350 0.557499 -0.483424 25 unrelated 0 0 0 0
+105_2 1340_11 1.200000 0.577350 0.943249 -0.598443 25 unrelated 0 0 0 0
+105_2 1340_12 1.200000 0.577350 1.907625 -1.394354 25 unrelated 0 0 0 0
+105_2 1340_2 1.200000 0.577350 1.521875 -0.969866 25 unrelated 0 0 11 12
+105_2 1340_9 1.200000 0.577350 -1.371251 1.163511 25 unrelated 0 0 0 0
+105_2 1341_1 1.200000 0.577350 1.272743 -0.774447 25 unrelated 0 0 11 12
+105_2 1341_11 1.200000 0.577350 0.364624 0.524595 25 unrelated 0 0 0 0
+105_2 1341_12 1.200000 0.577350 -0.599751 -0.693367 25 unrelated 0 0 0 0
+105_2 1341_13 1.200000 0.577350 -0.021126 0.507014 25 unrelated 0 0 0 0
+105_2 1341_14 1.200000 0.577350 -0.021126 0.507014 25 unrelated 0 0 0 0
+105_2 1341_2 1.200000 0.577350 -0.021126 0.507014 25 unrelated 0 0 13 14
+105_2 1344_1 1.200000 0.577350 0.171750 0.062100 25 unrelated 0 0 12 13
+105_2 1344_12 1.200000 0.577350 1.521875 -0.969866 25 unrelated 0 0 0 0
+105_2 1344_13 1.200000 0.577350 1.521875 -0.969866 25 unrelated 0 0 0 0
+105_2 1345_12 1.200000 0.577350 -0.406876 -0.598443 25 unrelated 0 0 0 0
+105_3 112_1 1.200000 0.577350 0.943249 -0.057030 25 unrelated 0 0 3 2
+105_3 112_2 1.200000 0.577350 -0.406876 -0.057030 25 unrelated 0 0 0 0
+105_3 112_3 1.200000 0.577350 0.750375 -0.528970 25 unrelated 0 0 0 0
+105_3 117_1 1.200000 0.577350 -0.599751 -0.138508 25 unrelated 0 0 3 2
+105_3 117_2 1.200000 0.577350 -0.214002 0.002982 25 unrelated 0 0 0 0
+105_3 117_3 1.200000 0.577350 0.171749 0.062100 25 unrelated 0 0 0 0
+105_3 12_1 1.200000 0.577350 -0.599752 -0.138508 25 unrelated 0 0 3 2
+105_3 12_2 1.200000 0.577350 -0.599752 -0.138508 25 unrelated 0 0 0 0
+105_3 12_3 1.200000 0.577350 0.364625 -0.460872 25 unrelated 0 0 0 0
+105_3 13_1 1.200000 0.577350 0.364624 -0.460872 25 unrelated 0 0 3 2
+105_3 13_2 1.200000 0.577350 1.211597 -0.732039 25 unrelated 0 0 0 0
+105_3 13_3 1.200000 0.577350 -0.406876 -0.057030 25 unrelated 0 0 0 0
+105_3 1334_1 1.200000 0.577350 -0.021126 -0.483423 25 unrelated 0 0 10 11
+105_3 1334_10 1.200000 0.577350 0.943250 -0.598444 25 unrelated 0 0 0 0
+105_3 1334_11 1.200000 0.577350 -0.406876 -0.057030 25 unrelated 0 0 0 0
+105_3 1334_12 1.200000 0.577350 1.329000 -0.816040 25 unrelated 0 0 0 0
+105_3 1334_13 1.200000 0.577350 1.136125 -0.693367 25 unrelated 0 0 0 0
+105_3 1334_2 1.200000 0.577350 0.943249 -0.598443 25 unrelated 0 0 12 13
+105_3 1340_1 1.200000 0.577350 0.750375 -0.528970 25 unrelated 0 0 9 10
+105_3 1340_10 1.200000 0.577350 0.750375 -0.528970 25 unrelated 0 0 0 0
+105_3 1340_11 1.200000 0.577350 1.136125 -0.693367 25 unrelated 0 0 0 0
+105_3 1340_12 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 0 0
+105_3 1340_2 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 11 12
+105_3 1340_9 1.200000 0.577350 -0.406876 -0.057030 25 unrelated 0 0 0 0
+105_3 1341_1 1.200000 0.577350 -0.133637 -0.504142 25 unrelated 0 0 11 12
+105_3 1341_11 1.200000 0.577350 0.171749 0.062100 25 unrelated 0 0 0 0
+105_3 1341_12 1.200000 0.577350 -0.021125 -0.483423 25 unrelated 0 0 0 0
+105_3 1341_13 1.200000 0.577350 0.943249 -0.057030 25 unrelated 0 0 0 0
+105_3 1341_14 1.200000 0.577350 0.943249 -0.057030 25 unrelated 0 0 0 0
+105_3 1341_2 1.200000 0.577350 0.943249 -0.057030 25 unrelated 0 0 13 14
+105_3 1344_1 1.200000 0.577350 -1.178375 0.471641 25 unrelated 0 0 12 13
+105_3 1344_12 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 0 0
+105_3 1344_13 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 0 0
+105_3 1345_12 1.200000 0.577350 0.171749 -0.460872 25 unrelated 0 0 0 0
+112_1 112_2 1.200000 0.577350 0.220453 0.351043 25 parentchild 3 2 0 0
+112_1 112_3 1.200000 0.577350 -1.042010 0.617297 25 parentchild 3 2 0 0
+112_1 117_1 1.200000 0.577350 -1.564126 1.758837 25 unrelated 3 2 3 2
+112_1 117_2 1.200000 0.577350 -1.178376 0.471641 25 unrelated 3 2 0 0
+112_1 117_3 1.200000 0.577350 -0.792626 0.696771 25 unrelated 3 2 0 0
+112_1 12_1 1.200000 0.577350 -0.406876 0.846466 25 unrelated 3 2 3 2
+112_1 12_2 1.200000 0.577350 -0.406876 0.846466 25 unrelated 3 2 0 0
+112_1 12_3 1.200000 0.577350 0.943249 -0.598443 25 unrelated 3 2 0 0
+112_1 13_1 1.200000 0.577350 0.557499 0.042491 25 unrelated 3 2 3 2
+112_1 13_2 1.200000 0.577350 2.469478 -2.533568 25 unrelated 3 2 0 0
+112_1 13_3 1.200000 0.577350 -0.214002 1.284973 25 unrelated 3 2 0 0
+112_1 1334_1 1.200000 0.577350 0.943249 -0.598443 25 unrelated 3 2 10 11
+112_1 1334_10 1.200000 0.577350 -0.406876 -0.598443 25 unrelated 3 2 0 0
+112_1 1334_11 1.200000 0.577350 1.328999 -0.816040 25 unrelated 3 2 0 0
+112_1 1334_12 1.200000 0.577350 0.364625 -0.460872 25 unrelated 3 2 0 0
+112_1 1334_13 1.200000 0.577350 0.557499 -0.483423 25 unrelated 3 2 0 0
+112_1 1334_2 1.200000 0.577350 -0.021126 -0.483423 25 unrelated 3 2 12 13
+112_1 1340_1 1.200000 0.577350 1.714749 -1.159963 25 unrelated 3 2 9 10
+112_1 1340_10 1.200000 0.577350 1.714749 -1.159963 25 unrelated 3 2 0 0
+112_1 1340_11 1.200000 0.577350 0.557499 -0.483423 25 unrelated 3 2 0 0
+112_1 1340_12 1.200000 0.577350 -0.021126 -0.483423 25 unrelated 3 2 0 0
+112_1 1340_2 1.200000 0.577350 -0.021125 -0.483423 25 unrelated 3 2 11 12
+112_1 1340_9 1.200000 0.577350 1.328999 -0.816040 25 unrelated 3 2 0 0
+112_1 1341_1 1.200000 0.577350 -0.736370 1.194477 25 unrelated 3 2 11 12
+112_1 1341_11 1.200000 0.577350 0.364624 -0.460872 25 unrelated 3 2 0 0
+112_1 1341_12 1.200000 0.577350 -1.371252 0.763887 25 unrelated 3 2 0 0
+112_1 1341_13 1.200000 0.577350 2.679125 -3.967559 25 unrelated 3 2 0 0
+112_1 1341_14 1.200000 0.577350 2.679125 -3.967559 25 unrelated 3 2 0 0
+112_1 1341_2 1.200000 0.577350 2.679125 -3.967559 25 unrelated 3 2 13 14
+112_1 1344_1 1.200000 0.577350 -2.142751 1.988253 25 unrelated 3 2 12 13
+112_1 1344_12 1.200000 0.577350 -0.021125 -0.483423 25 unrelated 3 2 0 0
+112_1 1344_13 1.200000 0.577350 -0.021125 -0.483423 25 unrelated 3 2 0 0
+112_1 1345_12 1.200000 0.577350 -1.564126 1.023334 25 unrelated 3 2 0 0
+112_2 112_3 1.200000 0.577350 -1.062477 0.950221 25 parents 0 0 0 0
+112_2 117_1 1.200000 0.577350 -1.757001 2.285255 25 unrelated 0 0 3 2
+112_2 117_2 1.200000 0.577350 -1.371251 1.881413 25 unrelated 0 0 0 0
+112_2 117_3 1.200000 0.577350 -0.985502 1.388993 25 unrelated 0 0 0 0
+112_2 12_1 1.200000 0.577350 -0.599751 2.221902 25 unrelated 0 0 3 2
+112_2 12_2 1.200000 0.577350 -0.599751 2.221902 25 unrelated 0 0 0 0
+112_2 12_3 1.200000 0.577350 0.750375 -0.528970 25 unrelated 0 0 0 0
+112_2 13_1 1.200000 0.577350 -0.792626 1.476572 25 unrelated 0 0 3 2
+112_2 13_2 1.200000 0.577350 1.001950 -0.618478 25 unrelated 0 0 0 0
+112_2 13_3 1.200000 0.577350 -0.406876 1.239757 25 unrelated 0 0 0 0
+112_2 1334_1 1.200000 0.577350 0.750375 -0.528970 25 unrelated 0 0 10 11
+112_2 1334_10 1.200000 0.577350 -1.757001 0.435984 25 unrelated 0 0 0 0
+112_2 1334_11 1.200000 0.577350 2.679125 -3.967559 25 unrelated 0 0 0 0
+112_2 1334_12 1.200000 0.577350 -0.985501 1.007515 25 unrelated 0 0 0 0
+112_2 1334_13 1.200000 0.577350 -0.792626 0.253184 25 unrelated 0 0 0 0
+112_2 1334_2 1.200000 0.577350 -1.371251 1.881413 25 unrelated 0 0 12 13
+112_2 1340_1 1.200000 0.577350 0.364624 -0.460872 25 unrelated 0 0 9 10
+112_2 1340_10 1.200000 0.577350 0.364624 -0.460872 25 unrelated 0 0 0 0
+112_2 1340_11 1.200000 0.577350 -0.792626 0.253184 25 unrelated 0 0 0 0
+112_2 1340_12 1.200000 0.577350 -0.214002 -0.528970 25 unrelated 0 0 0 0
+112_2 1340_2 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 11 12
+112_2 1340_9 1.200000 0.577350 -0.021126 2.335479 25 unrelated 0 0 0 0
+112_2 1341_1 1.200000 0.577350 -0.937282 1.102365 25 unrelated 0 0 11 12
+112_2 1341_11 1.200000 0.577350 1.714749 -1.159963 25 unrelated 0 0 0 0
+112_2 1341_12 1.200000 0.577350 -2.721377 1.023334 25 unrelated 0 0 0 0
+112_2 1341_13 1.200000 0.577350 1.328999 -0.816040 25 unrelated 0 0 0 0
+112_2 1341_14 1.200000 0.577350 1.328999 -0.816040 25 unrelated 0 0 0 0
+112_2 1341_2 1.200000 0.577350 1.328999 -0.816040 25 unrelated 0 0 13 14
+112_2 1344_1 1.200000 0.577350 -1.564126 3.000713 25 unrelated 0 0 12 13
+112_2 1344_12 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 0 0
+112_2 1344_13 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 0 0
+112_2 1345_12 1.200000 0.577350 -2.914252 1.163511 25 unrelated 0 0 0 0
+112_3 117_1 1.200000 0.577350 0.171750 -0.460872 25 unrelated 0 0 3 2
+112_3 117_2 1.200000 0.577350 1.328999 -0.816040 25 unrelated 0 0 0 0
+112_3 117_3 1.200000 0.577350 0.943249 -0.598443 25 unrelated 0 0 0 0
+112_3 12_1 1.200000 0.577350 0.171750 -0.460872 25 unrelated 0 0 3 2
+112_3 12_2 1.200000 0.577350 0.171750 -0.460872 25 unrelated 0 0 0 0
+112_3 12_3 1.200000 0.577350 -0.021124 -0.483424 25 unrelated 0 0 0 0
+112_3 13_1 1.200000 0.577350 1.136124 -0.693367 25 unrelated 0 0 3 2
+112_3 13_2 1.200000 0.577350 0.373011 -0.455013 25 unrelated 0 0 0 0
+112_3 13_3 1.200000 0.577350 -0.792626 -0.816040 25 unrelated 0 0 0 0
+112_3 1334_1 1.200000 0.577350 0.364624 -0.460872 25 unrelated 0 0 10 11
+112_3 1334_10 1.200000 0.577350 2.100499 -1.686657 25 unrelated 0 0 0 0
+112_3 1334_11 1.200000 0.577350 -1.178376 0.895341 25 unrelated 0 0 0 0
+112_3 1334_12 1.200000 0.577350 1.714749 -1.159963 25 unrelated 0 0 0 0
+112_3 1334_13 1.200000 0.577350 1.907625 -1.394355 25 unrelated 0 0 0 0
+112_3 1334_2 1.200000 0.577350 0.943249 -0.598443 25 unrelated 0 0 12 13
+112_3 1340_1 1.200000 0.577350 0.750375 -0.528970 25 unrelated 0 0 9 10
+112_3 1340_10 1.200000 0.577350 0.750375 -0.528970 25 unrelated 0 0 0 0
+112_3 1340_11 1.200000 0.577350 1.907625 -1.394355 25 unrelated 0 0 0 0
+112_3 1340_12 1.200000 0.577350 0.943249 -0.598443 25 unrelated 0 0 0 0
+112_3 1340_2 1.200000 0.577350 0.557499 0.507014 25 unrelated 0 0 11 12
+112_3 1340_9 1.200000 0.577350 0.364624 -0.460872 25 unrelated 0 0 0 0
+112_3 1341_1 1.200000 0.577350 0.268187 -0.455013 25 unrelated 0 0 11 12
+112_3 1341_11 1.200000 0.577350 -0.599750 1.178850 25 unrelated 0 0 0 0
+112_3 1341_12 1.200000 0.577350 1.136124 -0.693367 25 unrelated 0 0 0 0
+112_3 1341_13 1.200000 0.577350 0.171750 -0.460872 25 unrelated 0 0 0 0
+112_3 1341_14 1.200000 0.577350 0.171750 -0.460872 25 unrelated 0 0 0 0
+112_3 1341_2 1.200000 0.577350 0.171750 -0.460872 25 unrelated 0 0 13 14
+112_3 1344_1 1.200000 0.577350 -0.792626 0.696771 25 unrelated 0 0 12 13
+112_3 1344_12 1.200000 0.577350 0.557499 0.507014 25 unrelated 0 0 0 0
+112_3 1344_13 1.200000 0.577350 0.557499 0.507014 25 unrelated 0 0 0 0
+112_3 1345_12 1.200000 0.577350 0.943249 -0.598444 25 unrelated 0 0 0 0
+117_1 117_2 1.200000 0.577350 -0.410778 0.566247 25 parentchild 3 2 0 0
+117_1 117_3 1.200000 0.577350 0.851686 -0.082493 25 parentchild 3 2 0 0
+117_1 12_1 1.200000 0.577350 -0.406875 1.239757 25 unrelated 3 2 3 2
+117_1 12_2 1.200000 0.577350 -0.406875 1.239757 25 unrelated 3 2 0 0
+117_1 12_3 1.200000 0.577350 -0.599751 1.178851 25 unrelated 3 2 0 0
+117_1 13_1 1.200000 0.577350 -0.985501 1.007515 25 unrelated 3 2 3 2
+117_1 13_2 1.200000 0.577350 -1.304164 1.380495 25 unrelated 3 2 0 0
+117_1 13_3 1.200000 0.577350 -0.214000 0.895341 25 unrelated 3 2 0 0
+117_1 1334_1 1.200000 0.577350 -0.214001 1.284973 25 unrelated 3 2 10 11
+117_1 1334_10 1.200000 0.577350 -0.406876 -0.598443 25 unrelated 3 2 0 0
+117_1 1334_11 1.200000 0.577350 -1.757001 2.285255 25 unrelated 3 2 0 0
+117_1 1334_12 1.200000 0.577350 -0.792626 0.253184 25 unrelated 3 2 0 0
+117_1 1334_13 1.200000 0.577350 0.557499 -0.483424 25 unrelated 3 2 0 0
+117_1 1334_2 1.200000 0.577350 -1.564126 1.023334 25 unrelated 3 2 12 13
+117_1 1340_1 1.200000 0.577350 -0.985502 1.007515 25 unrelated 3 2 9 10
+117_1 1340_10 1.200000 0.577350 -0.985502 1.007515 25 unrelated 3 2 0 0
+117_1 1340_11 1.200000 0.577350 0.557499 -0.483424 25 unrelated 3 2 0 0
+117_1 1340_12 1.200000 0.577350 0.364624 -0.460872 25 unrelated 3 2 0 0
+117_1 1340_2 1.200000 0.577350 0.364625 -0.460872 25 unrelated 3 2 11 12
+117_1 1340_9 1.200000 0.577350 -2.142751 2.310417 25 unrelated 3 2 0 0
+117_1 1341_1 1.200000 0.577350 1.272744 -0.774446 25 unrelated 3 2 11 12
+117_1 1341_11 1.200000 0.577350 -1.178376 1.284973 25 unrelated 3 2 0 0
+117_1 1341_12 1.200000 0.577350 0.171749 -0.460872 25 unrelated 3 2 0 0
+117_1 1341_13 1.200000 0.577350 -1.564126 1.758837 25 unrelated 3 2 0 0
+117_1 1341_14 1.200000 0.577350 -1.564126 1.758837 25 unrelated 3 2 0 0
+117_1 1341_2 1.200000 0.577350 -1.564126 1.758837 25 unrelated 3 2 13 14
+117_1 1344_1 1.200000 0.577350 1.714749 -1.159963 25 unrelated 3 2 12 13
+117_1 1344_12 1.200000 0.577350 0.364625 -0.460872 25 unrelated 3 2 0 0
+117_1 1344_13 1.200000 0.577350 0.364625 -0.460872 25 unrelated 3 2 0 0
+117_1 1345_12 1.200000 0.577350 0.364624 -0.460872 25 unrelated 3 2 0 0
+117_2 117_3 1.200000 0.577350 1.209928 -0.670439 25 parents 0 0 0 0
+117_2 12_1 1.200000 0.577350 1.521875 -0.969866 25 unrelated 0 0 3 2
+117_2 12_2 1.200000 0.577350 1.521875 -0.969866 25 unrelated 0 0 0 0
+117_2 12_3 1.200000 0.577350 0.171750 -0.460872 25 unrelated 0 0 0 0
+117_2 13_1 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 3 2
+117_2 13_2 1.200000 0.577350 -1.094518 0.156935 25 unrelated 0 0 0 0
+117_2 13_3 1.200000 0.577350 0.557499 -0.483424 25 unrelated 0 0 0 0
+117_2 1334_1 1.200000 0.577350 0.171750 -0.460872 25 unrelated 0 0 10 11
+117_2 1334_10 1.200000 0.577350 0.750375 -0.528970 25 unrelated 0 0 0 0
+117_2 1334_11 1.200000 0.577350 -1.371251 1.881413 25 unrelated 0 0 0 0
+117_2 1334_12 1.200000 0.577350 0.364625 0.524595 25 unrelated 0 0 0 0
+117_2 1334_13 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 0 0
+117_2 1334_2 1.200000 0.577350 -0.406876 1.605361 25 unrelated 0 0 12 13
+117_2 1340_1 1.200000 0.577350 -0.599751 -0.693367 25 unrelated 0 0 9 10
+117_2 1340_10 1.200000 0.577350 -0.599751 -0.693367 25 unrelated 0 0 0 0
+117_2 1340_11 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 0 0
+117_2 1340_12 1.200000 0.577350 0.750375 -0.528970 25 unrelated 0 0 0 0
+117_2 1340_2 1.200000 0.577350 0.364624 0.524596 25 unrelated 0 0 11 12
+117_2 1340_9 1.200000 0.577350 -0.985502 1.745055 25 unrelated 0 0 0 0
+117_2 1341_1 1.200000 0.577350 0.067275 -0.467231 25 unrelated 0 0 11 12
+117_2 1341_11 1.200000 0.577350 -0.792626 2.157893 25 unrelated 0 0 0 0
+117_2 1341_12 1.200000 0.577350 -0.214002 -0.528970 25 unrelated 0 0 0 0
+117_2 1341_13 1.200000 0.577350 -1.178376 0.471641 25 unrelated 0 0 0 0
+117_2 1341_14 1.200000 0.577350 -1.178376 0.471641 25 unrelated 0 0 0 0
+117_2 1341_2 1.200000 0.577350 -1.178376 0.471641 25 unrelated 0 0 13 14
+117_2 1344_1 1.200000 0.577350 0.171750 0.943729 25 unrelated 0 0 12 13
+117_2 1344_12 1.200000 0.577350 0.364624 0.524596 25 unrelated 0 0 0 0
+117_2 1344_13 1.200000 0.577350 0.364624 0.524596 25 unrelated 0 0 0 0
+117_2 1345_12 1.200000 0.577350 -0.021126 -0.483423 25 unrelated 0 0 0 0
+117_3 12_1 1.200000 0.577350 0.364624 0.062100 25 unrelated 0 0 3 2
+117_3 12_2 1.200000 0.577350 0.364624 0.062100 25 unrelated 0 0 0 0
+117_3 12_3 1.200000 0.577350 0.171750 0.062100 25 unrelated 0 0 0 0
+117_3 13_1 1.200000 0.577350 -0.214002 0.002982 25 unrelated 0 0 3 2
+117_3 13_2 1.200000 0.577350 -0.675224 0.399109 25 unrelated 0 0 0 0
+117_3 13_3 1.200000 0.577350 0.171750 -0.460872 25 unrelated 0 0 0 0
+117_3 1334_1 1.200000 0.577350 0.557499 -0.483424 25 unrelated 0 0 10 11
+117_3 1334_10 1.200000 0.577350 0.364624 -0.460872 25 unrelated 0 0 0 0
+117_3 1334_11 1.200000 0.577350 -0.985502 1.388993 25 unrelated 0 0 0 0
+117_3 1334_12 1.200000 0.577350 -0.021126 0.507013 25 unrelated 0 0 0 0
+117_3 1334_13 1.200000 0.577350 1.328999 -0.816040 25 unrelated 0 0 0 0
+117_3 1334_2 1.200000 0.577350 -0.792626 1.476572 25 unrelated 0 0 12 13
+117_3 1340_1 1.200000 0.577350 -0.214002 -0.528970 25 unrelated 0 0 9 10
+117_3 1340_10 1.200000 0.577350 -0.214002 -0.528970 25 unrelated 0 0 0 0
+117_3 1340_11 1.200000 0.577350 1.328999 -0.816040 25 unrelated 0 0 0 0
+117_3 1340_12 1.200000 0.577350 1.136124 -0.693367 25 unrelated 0 0 0 0
+117_3 1340_2 1.200000 0.577350 1.136125 -0.693367 25 unrelated 0 0 11 12
+117_3 1340_9 1.200000 0.577350 -1.371251 1.534184 25 unrelated 0 0 0 0
+117_3 1341_1 1.200000 0.577350 0.469098 -0.467231 25 unrelated 0 0 11 12
+117_3 1341_11 1.200000 0.577350 -0.406876 1.605361 25 unrelated 0 0 0 0
+117_3 1341_12 1.200000 0.577350 -0.599751 -0.693367 25 unrelated 0 0 0 0
+117_3 1341_13 1.200000 0.577350 -0.792626 0.696771 25 unrelated 0 0 0 0
+117_3 1341_14 1.200000 0.577350 -0.792626 0.696771 25 unrelated 0 0 0 0
+117_3 1341_2 1.200000 0.577350 -0.792626 0.696771 25 unrelated 0 0 13 14
+117_3 1344_1 1.200000 0.577350 0.943249 -0.598444 25 unrelated 0 0 12 13
+117_3 1344_12 1.200000 0.577350 1.136125 -0.693367 25 unrelated 0 0 0 0
+117_3 1344_13 1.200000 0.577350 1.136125 -0.693367 25 unrelated 0 0 0 0
+117_3 1345_12 1.200000 0.577350 -0.406876 -0.598443 25 unrelated 0 0 0 0
+12_1 12_2 1.200000 0.577350 1.693329 -2.011511 25 parentchild 3 2 0 0
+12_1 12_3 1.200000 0.577350 0.220453 0.351043 25 parentchild 3 2 0 0
+12_1 13_1 1.200000 0.577350 1.714749 -1.159963 25 unrelated 3 2 3 2
+12_1 13_2 1.200000 0.577350 -0.255930 0.546459 25 unrelated 3 2 0 0
+12_1 13_3 1.200000 0.577350 1.329000 -0.816040 25 unrelated 3 2 0 0
+12_1 1334_1 1.200000 0.577350 0.171750 -0.460872 25 unrelated 3 2 10 11
+12_1 1334_10 1.200000 0.577350 -0.406876 -0.598443 25 unrelated 3 2 0 0
+12_1 1334_11 1.200000 0.577350 -0.599751 2.221902 25 unrelated 3 2 0 0
+12_1 1334_12 1.200000 0.577350 -0.406876 0.418047 25 unrelated 3 2 0 0
+12_1 1334_13 1.200000 0.577350 -0.214002 -0.528970 25 unrelated 3 2 0 0
+12_1 1334_2 1.200000 0.577350 -0.792626 1.476572 25 unrelated 3 2 12 13
+12_1 1340_1 1.200000 0.577350 -0.214001 -0.528970 25 unrelated 3 2 9 10
+12_1 1340_10 1.200000 0.577350 -0.214001 -0.528970 25 unrelated 3 2 0 0
+12_1 1340_11 1.200000 0.577350 -0.214002 -0.528970 25 unrelated 3 2 0 0
+12_1 1340_12 1.200000 0.577350 -0.406876 -0.598444 25 unrelated 3 2 0 0
+12_1 1340_2 1.200000 0.577350 -0.406876 0.418047 25 unrelated 3 2 11 12
+12_1 1340_9 1.200000 0.577350 -0.214001 1.988253 25 unrelated 3 2 0 0
+12_1 1341_1 1.200000 0.577350 -1.138194 0.557661 25 unrelated 3 2 11 12
+12_1 1341_11 1.200000 0.577350 -1.178375 1.988253 25 unrelated 3 2 0 0
+12_1 1341_12 1.200000 0.577350 -1.371251 0.327238 25 unrelated 3 2 0 0
+12_1 1341_13 1.200000 0.577350 -0.406876 0.846466 25 unrelated 3 2 0 0
+12_1 1341_14 1.200000 0.577350 -0.406876 0.846466 25 unrelated 3 2 0 0
+12_1 1341_2 1.200000 0.577350 -0.406876 0.846466 25 unrelated 3 2 13 14
+12_1 1344_1 1.200000 0.577350 -0.599751 2.221902 25 unrelated 3 2 12 13
+12_1 1344_12 1.200000 0.577350 -0.406876 0.418047 25 unrelated 3 2 0 0
+12_1 1344_13 1.200000 0.577350 -0.406876 0.418047 25 unrelated 3 2 0 0
+12_1 1345_12 1.200000 0.577350 -1.178376 0.471641 25 unrelated 3 2 0 0
+12_2 12_3 1.200000 0.577350 1.047613 -0.536780 25 parents 0 0 0 0
+12_2 13_1 1.200000 0.577350 1.714749 -1.159963 25 unrelated 0 0 3 2
+12_2 13_2 1.200000 0.577350 -0.255930 0.546459 25 unrelated 0 0 0 0
+12_2 13_3 1.200000 0.577350 1.329000 -0.816040 25 unrelated 0 0 0 0
+12_2 1334_1 1.200000 0.577350 0.171750 -0.460872 25 unrelated 0 0 10 11
+12_2 1334_10 1.200000 0.577350 -0.406876 -0.598443 25 unrelated 0 0 0 0
+12_2 1334_11 1.200000 0.577350 -0.599751 2.221902 25 unrelated 0 0 0 0
+12_2 1334_12 1.200000 0.577350 -0.406876 0.418047 25 unrelated 0 0 0 0
+12_2 1334_13 1.200000 0.577350 -0.214002 -0.528970 25 unrelated 0 0 0 0
+12_2 1334_2 1.200000 0.577350 -0.792626 1.476572 25 unrelated 0 0 12 13
+12_2 1340_1 1.200000 0.577350 -0.214001 -0.528970 25 unrelated 0 0 9 10
+12_2 1340_10 1.200000 0.577350 -0.214001 -0.528970 25 unrelated 0 0 0 0
+12_2 1340_11 1.200000 0.577350 -0.214002 -0.528970 25 unrelated 0 0 0 0
+12_2 1340_12 1.200000 0.577350 -0.406876 -0.598444 25 unrelated 0 0 0 0
+12_2 1340_2 1.200000 0.577350 -0.406876 0.418047 25 unrelated 0 0 11 12
+12_2 1340_9 1.200000 0.577350 -0.214001 1.988253 25 unrelated 0 0 0 0
+12_2 1341_1 1.200000 0.577350 -1.138194 0.557661 25 unrelated 0 0 11 12
+12_2 1341_11 1.200000 0.577350 -1.178375 1.988253 25 unrelated 0 0 0 0
+12_2 1341_12 1.200000 0.577350 -1.371251 0.327238 25 unrelated 0 0 0 0
+12_2 1341_13 1.200000 0.577350 -0.406876 0.846466 25 unrelated 0 0 0 0
+12_2 1341_14 1.200000 0.577350 -0.406876 0.846466 25 unrelated 0 0 0 0
+12_2 1341_2 1.200000 0.577350 -0.406876 0.846466 25 unrelated 0 0 13 14
+12_2 1344_1 1.200000 0.577350 -0.599751 2.221902 25 unrelated 0 0 12 13
+12_2 1344_12 1.200000 0.577350 -0.406876 0.418047 25 unrelated 0 0 0 0
+12_2 1344_13 1.200000 0.577350 -0.406876 0.418047 25 unrelated 0 0 0 0
+12_2 1345_12 1.200000 0.577350 -1.178376 0.471641 25 unrelated 0 0 0 0
+12_3 13_1 1.200000 0.577350 1.136124 -0.693367 25 unrelated 0 0 3 2
+12_3 13_2 1.200000 0.577350 1.211598 -0.732039 25 unrelated 0 0 0 0
+12_3 13_3 1.200000 0.577350 1.521874 -0.969866 25 unrelated 0 0 0 0
+12_3 1334_1 1.200000 0.577350 1.521875 -0.969866 25 unrelated 0 0 10 11
+12_3 1334_10 1.200000 0.577350 -0.599752 -0.693367 25 unrelated 0 0 0 0
+12_3 1334_11 1.200000 0.577350 0.750375 -0.528970 25 unrelated 0 0 0 0
+12_3 1334_12 1.200000 0.577350 -0.599752 -0.693367 25 unrelated 0 0 0 0
+12_3 1334_13 1.200000 0.577350 0.364624 -0.460872 25 unrelated 0 0 0 0
+12_3 1334_2 1.200000 0.577350 -0.985501 0.594245 25 unrelated 0 0 12 13
+12_3 1340_1 1.200000 0.577350 1.136125 -0.693367 25 unrelated 0 0 9 10
+12_3 1340_10 1.200000 0.577350 1.136125 -0.693367 25 unrelated 0 0 0 0
+12_3 1340_11 1.200000 0.577350 0.364624 -0.460872 25 unrelated 0 0 0 0
+12_3 1340_12 1.200000 0.577350 0.943250 -0.598443 25 unrelated 0 0 0 0
+12_3 1340_2 1.200000 0.577350 0.943250 -0.598443 25 unrelated 0 0 11 12
+12_3 1340_9 1.200000 0.577350 -0.406876 0.846466 25 unrelated 0 0 0 0
+12_3 1341_1 1.200000 0.577350 0.268186 0.999931 25 unrelated 0 0 11 12
+12_3 1341_11 1.200000 0.577350 0.171750 -0.460872 25 unrelated 0 0 0 0
+12_3 1341_12 1.200000 0.577350 -1.564126 0.158748 25 unrelated 0 0 0 0
+12_3 1341_13 1.200000 0.577350 0.943249 -0.598443 25 unrelated 0 0 0 0
+12_3 1341_14 1.200000 0.577350 0.943249 -0.598443 25 unrelated 0 0 0 0
+12_3 1341_2 1.200000 0.577350 0.943249 -0.598443 25 unrelated 0 0 13 14
+12_3 1344_1 1.200000 0.577350 -1.178376 1.284973 25 unrelated 0 0 12 13
+12_3 1344_12 1.200000 0.577350 0.943250 -0.598443 25 unrelated 0 0 0 0
+12_3 1344_13 1.200000 0.577350 0.943250 -0.598443 25 unrelated 0 0 0 0
+12_3 1345_12 1.200000 0.577350 -1.757001 -0.036923 25 unrelated 0 0 0 0
+13_1 13_2 1.200000 0.577350 -0.365038 0.561147 25 parentchild 3 2 0 0
+13_1 13_3 1.200000 0.577350 -0.831601 0.617297 25 parentchild 3 2 0 0
+13_1 1334_1 1.200000 0.577350 -0.021126 -0.483424 25 unrelated 3 2 10 11
+13_1 1334_10 1.200000 0.577350 0.557500 -0.483423 25 unrelated 3 2 0 0
+13_1 1334_11 1.200000 0.577350 -0.792626 1.476572 25 unrelated 3 2 0 0
+13_1 1334_12 1.200000 0.577350 0.557500 -0.483423 25 unrelated 3 2 0 0
+13_1 1334_13 1.200000 0.577350 0.750375 -0.528970 25 unrelated 3 2 0 0
+13_1 1334_2 1.200000 0.577350 0.171750 -0.460872 25 unrelated 3 2 12 13
+13_1 1340_1 1.200000 0.577350 0.750375 -0.528970 25 unrelated 3 2 9 10
+13_1 1340_10 1.200000 0.577350 0.750375 -0.528970 25 unrelated 3 2 0 0
+13_1 1340_11 1.200000 0.577350 0.750375 -0.528970 25 unrelated 3 2 0 0
+13_1 1340_12 1.200000 0.577350 -0.599751 -0.693367 25 unrelated 3 2 0 0
+13_1 1340_2 1.200000 0.577350 -0.599751 0.345553 25 unrelated 3 2 11 12
+13_1 1340_9 1.200000 0.577350 0.750375 0.002982 25 unrelated 3 2 0 0
+13_1 1341_1 1.200000 0.577350 -1.339105 0.413356 25 unrelated 3 2 11 12
+13_1 1341_11 1.200000 0.577350 -1.371251 1.163511 25 unrelated 3 2 0 0
+13_1 1341_12 1.200000 0.577350 -0.406875 0.846467 25 unrelated 3 2 0 0
+13_1 1341_13 1.200000 0.577350 0.557499 0.042491 25 unrelated 3 2 0 0
+13_1 1341_14 1.200000 0.577350 0.557499 0.042491 25 unrelated 3 2 0 0
+13_1 1341_2 1.200000 0.577350 0.557499 0.042491 25 unrelated 3 2 13 14
+13_1 1344_1 1.200000 0.577350 -1.564126 1.758837 25 unrelated 3 2 12 13
+13_1 1344_12 1.200000 0.577350 -0.599751 0.345553 25 unrelated 3 2 0 0
+13_1 1344_13 1.200000 0.577350 -0.599751 0.345553 25 unrelated 3 2 0 0
+13_1 1345_12 1.200000 0.577350 -0.214000 0.895341 25 unrelated 3 2 0 0
+13_2 13_3 1.200000 0.577350 0.066668 0.700690 25 parents 0 0 0 0
+13_2 1334_1 1.200000 0.577350 1.001950 -0.618478 25 unrelated 0 0 10 11
+13_2 1334_10 1.200000 0.577350 -0.255930 -0.535772 25 unrelated 0 0 0 0
+13_2 1334_11 1.200000 0.577350 1.001950 -0.618478 25 unrelated 0 0 0 0
+13_2 1334_12 1.200000 0.577350 0.582657 -0.481725 25 unrelated 0 0 0 0
+13_2 1334_13 1.200000 0.577350 0.792305 -0.535772 25 unrelated 0 0 0 0
+13_2 1334_2 1.200000 0.577350 0.163363 -0.455013 25 unrelated 0 0 12 13
+13_2 1340_1 1.200000 0.577350 1.840538 -1.302285 25 unrelated 0 0 9 10
+13_2 1340_10 1.200000 0.577350 1.840538 -1.302285 25 unrelated 0 0 0 0
+13_2 1340_11 1.200000 0.577350 0.792305 -0.535772 25 unrelated 0 0 0 0
+13_2 1340_12 1.200000 0.577350 0.163363 -0.455013 25 unrelated 0 0 0 0
+13_2 1340_2 1.200000 0.577350 0.163363 -0.455013 25 unrelated 0 0 11 12
+13_2 1340_9 1.200000 0.577350 1.001950 -0.618478 25 unrelated 0 0 0 0
+13_2 1341_1 1.200000 0.577350 -0.389342 1.030303 25 unrelated 0 0 11 12
+13_2 1341_11 1.200000 0.577350 0.163363 -0.455013 25 unrelated 0 0 0 0
+13_2 1341_12 1.200000 0.577350 -1.094517 0.648831 25 unrelated 0 0 0 0
+13_2 1341_13 1.200000 0.577350 2.469478 -2.533568 25 unrelated 0 0 0 0
+13_2 1341_14 1.200000 0.577350 2.469478 -2.533568 25 unrelated 0 0 0 0
+13_2 1341_2 1.200000 0.577350 2.469478 -2.533568 25 unrelated 0 0 13 14
+13_2 1344_1 1.200000 0.577350 -1.933105 1.702849 25 unrelated 0 0 12 13
+13_2 1344_12 1.200000 0.577350 0.163363 -0.455013 25 unrelated 0 0 0 0
+13_2 1344_13 1.200000 0.577350 0.163363 -0.455013 25 unrelated 0 0 0 0
+13_2 1345_12 1.200000 0.577350 -1.304164 0.504855 25 unrelated 0 0 0 0
+13_3 1334_1 1.200000 0.577350 0.750375 0.002982 25 unrelated 0 0 10 11
+13_3 1334_10 1.200000 0.577350 -1.371251 -1.394354 25 unrelated 0 0 0 0
+13_3 1334_11 1.200000 0.577350 -0.406876 1.239757 25 unrelated 0 0 0 0
+13_3 1334_12 1.200000 0.577350 -1.757001 -0.575128 25 unrelated 0 0 0 0
+13_3 1334_13 1.200000 0.577350 -0.406876 -0.598443 25 unrelated 0 0 0 0
+13_3 1334_2 1.200000 0.577350 -2.142751 0.471641 25 unrelated 0 0 12 13
+13_3 1340_1 1.200000 0.577350 0.750375 0.002982 25 unrelated 0 0 9 10
+13_3 1340_10 1.200000 0.577350 0.750375 0.002982 25 unrelated 0 0 0 0
+13_3 1340_11 1.200000 0.577350 -0.406876 -0.598443 25 unrelated 0 0 0 0
+13_3 1340_12 1.200000 0.577350 0.171750 -0.460872 25 unrelated 0 0 0 0
+13_3 1340_2 1.200000 0.577350 0.171750 -0.460872 25 unrelated 0 0 11 12
+13_3 1340_9 1.200000 0.577350 -1.564126 1.758837 25 unrelated 0 0 0 0
+13_3 1341_1 1.200000 0.577350 -0.133636 0.965314 25 unrelated 0 0 11 12
+13_3 1341_11 1.200000 0.577350 -0.985501 0.594245 25 unrelated 0 0 0 0
+13_3 1341_12 1.200000 0.577350 -1.949876 -0.264085 25 unrelated 0 0 0 0
+13_3 1341_13 1.200000 0.577350 -0.214002 1.284973 25 unrelated 0 0 0 0
+13_3 1341_14 1.200000 0.577350 -0.214002 1.284973 25 unrelated 0 0 0 0
+13_3 1341_2 1.200000 0.577350 -0.214002 1.284973 25 unrelated 0 0 13 14
+13_3 1344_1 1.200000 0.577350 -0.406875 1.239757 25 unrelated 0 0 12 13
+13_3 1344_12 1.200000 0.577350 0.171750 -0.460872 25 unrelated 0 0 0 0
+13_3 1344_13 1.200000 0.577350 0.171750 -0.460872 25 unrelated 0 0 0 0
+13_3 1345_12 1.200000 0.577350 -1.757000 -0.036923 25 unrelated 0 0 0 0
+1334_1 1334_10 1.200000 0.577350 -1.042011 0.617297 25 parentchild 10 11 0 0
+1334_1 1334_11 1.200000 0.577350 -0.410778 0.566247 25 parentchild 10 11 0 0
+1334_1 1334_12 1.200000 0.577350 -0.575534 -0.430191 25 parents 10 11 0 0
+1334_1 1334_13 1.200000 0.577350 0.236040 -0.228179 25 parents 10 11 0 0
+1334_1 1334_2 1.200000 0.577350 -1.224792 0.456602 25 parents 10 11 12 13
+1334_1 1340_1 1.200000 0.577350 1.521875 -0.969867 25 unrelated 10 11 9 10
+1334_1 1340_10 1.200000 0.577350 1.521875 -0.969867 25 unrelated 10 11 0 0
+1334_1 1340_11 1.200000 0.577350 0.364624 -0.460872 25 unrelated 10 11 0 0
+1334_1 1340_12 1.200000 0.577350 1.714749 -1.159963 25 unrelated 10 11 0 0
+1334_1 1340_2 1.200000 0.577350 0.943249 -0.598444 25 unrelated 10 11 11 12
+1334_1 1340_9 1.200000 0.577350 -0.406876 0.846466 25 unrelated 10 11 0 0
+1334_1 1341_1 1.200000 0.577350 1.071833 1.268636 25 unrelated 10 11 11 12
+1334_1 1341_11 1.200000 0.577350 -0.214002 -0.528970 25 unrelated 10 11 0 0
+1334_1 1341_12 1.200000 0.577350 -0.792626 1.101689 25 unrelated 10 11 0 0
+1334_1 1341_13 1.200000 0.577350 0.943249 -0.598443 25 unrelated 10 11 0 0
+1334_1 1341_14 1.200000 0.577350 0.943249 -0.598443 25 unrelated 10 11 0 0
+1334_1 1341_2 1.200000 0.577350 0.943249 -0.598443 25 unrelated 10 11 13 14
+1334_1 1344_1 1.200000 0.577350 -1.178376 1.284973 25 unrelated 10 11 12 13
+1334_1 1344_12 1.200000 0.577350 0.943249 -0.598444 25 unrelated 10 11 0 0
+1334_1 1344_13 1.200000 0.577350 0.943249 -0.598444 25 unrelated 10 11 0 0
+1334_1 1345_12 1.200000 0.577350 -0.985501 1.007515 25 unrelated 10 11 0 0
+1334_10 1334_11 1.200000 0.577350 -1.549421 0.551090 25 parents 0 0 0 0
+1334_10 1334_12 1.200000 0.577350 1.534557 -1.039272 25 parents 0 0 0 0
+1334_10 1334_13 1.200000 0.577350 1.047613 -0.536780 25 parents 0 0 0 0
+1334_10 1334_2 1.200000 0.577350 0.885298 -0.430191 25 parents 0 0 12 13
+1334_10 1340_1 1.200000 0.577350 0.171750 -0.460872 25 unrelated 0 0 9 10
+1334_10 1340_10 1.200000 0.577350 0.171750 -0.460872 25 unrelated 0 0 0 0
+1334_10 1340_11 1.200000 0.577350 1.328999 -0.816040 25 unrelated 0 0 0 0
+1334_10 1340_12 1.200000 0.577350 0.750375 -0.528970 25 unrelated 0 0 0 0
+1334_10 1340_2 1.200000 0.577350 -0.021126 0.507014 25 unrelated 0 0 11 12
+1334_10 1340_9 1.200000 0.577350 -0.214002 -0.528970 25 unrelated 0 0 0 0
+1334_10 1341_1 1.200000 0.577350 0.067275 -0.467230 25 unrelated 0 0 11 12
+1334_10 1341_11 1.200000 0.577350 -1.178376 0.895341 25 unrelated 0 0 0 0
+1334_10 1341_12 1.200000 0.577350 1.714749 -1.159963 25 unrelated 0 0 0 0
+1334_10 1341_13 1.200000 0.577350 -0.406876 -0.598443 25 unrelated 0 0 0 0
+1334_10 1341_14 1.200000 0.577350 -0.406876 -0.598443 25 unrelated 0 0 0 0
+1334_10 1341_2 1.200000 0.577350 -0.406876 -0.598443 25 unrelated 0 0 13 14
+1334_10 1344_1 1.200000 0.577350 -1.371251 0.327238 25 unrelated 0 0 12 13
+1334_10 1344_12 1.200000 0.577350 -0.021126 0.507014 25 unrelated 0 0 0 0
+1334_10 1344_13 1.200000 0.577350 -0.021126 0.507014 25 unrelated 0 0 0 0
+1334_10 1345_12 1.200000 0.577350 1.521875 -0.969866 25 unrelated 0 0 0 0
+1334_11 1334_12 1.200000 0.577350 -0.900162 1.047688 25 parents 0 0 0 0
+1334_11 1334_13 1.200000 0.577350 -0.737848 0.392257 25 parents 0 0 0 0
+1334_11 1334_2 1.200000 0.577350 -1.224792 1.807009 25 parents 0 0 12 13
+1334_11 1340_1 1.200000 0.577350 0.364624 -0.460872 25 unrelated 0 0 9 10
+1334_11 1340_10 1.200000 0.577350 0.364624 -0.460872 25 unrelated 0 0 0 0
+1334_11 1340_11 1.200000 0.577350 -0.792626 0.253184 25 unrelated 0 0 0 0
+1334_11 1340_12 1.200000 0.577350 -0.214002 -0.528970 25 unrelated 0 0 0 0
+1334_11 1340_2 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 11 12
+1334_11 1340_9 1.200000 0.577350 -0.021126 2.335479 25 unrelated 0 0 0 0
+1334_11 1341_1 1.200000 0.577350 -0.937282 1.102365 25 unrelated 0 0 11 12
+1334_11 1341_11 1.200000 0.577350 1.714749 -1.159963 25 unrelated 0 0 0 0
+1334_11 1341_12 1.200000 0.577350 -2.721377 1.023334 25 unrelated 0 0 0 0
+1334_11 1341_13 1.200000 0.577350 1.328999 -0.816040 25 unrelated 0 0 0 0
+1334_11 1341_14 1.200000 0.577350 1.328999 -0.816040 25 unrelated 0 0 0 0
+1334_11 1341_2 1.200000 0.577350 1.328999 -0.816040 25 unrelated 0 0 13 14
+1334_11 1344_1 1.200000 0.577350 -1.564126 3.000713 25 unrelated 0 0 12 13
+1334_11 1344_12 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 0 0
+1334_11 1344_13 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 0 0
+1334_11 1345_12 1.200000 0.577350 -2.914252 1.163511 25 unrelated 0 0 0 0
+1334_12 1334_13 1.200000 0.577350 0.722984 -0.347713 25 parents 0 0 0 0
+1334_12 1334_2 1.200000 0.577350 0.851685 -0.082493 25 parentchild 0 0 12 13
+1334_12 1340_1 1.200000 0.577350 -0.214001 -0.528970 25 unrelated 0 0 9 10
+1334_12 1340_10 1.200000 0.577350 -0.214001 -0.528970 25 unrelated 0 0 0 0
+1334_12 1340_11 1.200000 0.577350 0.943249 -0.598443 25 unrelated 0 0 0 0
+1334_12 1340_12 1.200000 0.577350 -0.021126 -0.483423 25 unrelated 0 0 0 0
+1334_12 1340_2 1.200000 0.577350 -0.406876 0.418047 25 unrelated 0 0 11 12
+1334_12 1340_9 1.200000 0.577350 0.557499 -0.483424 25 unrelated 0 0 0 0
+1334_12 1341_1 1.200000 0.577350 -0.736370 -0.774446 25 unrelated 0 0 11 12
+1334_12 1341_11 1.200000 0.577350 -0.406876 1.239757 25 unrelated 0 0 0 0
+1334_12 1341_12 1.200000 0.577350 0.943249 -0.598444 25 unrelated 0 0 0 0
+1334_12 1341_13 1.200000 0.577350 0.364625 -0.460872 25 unrelated 0 0 0 0
+1334_12 1341_14 1.200000 0.577350 0.364625 -0.460872 25 unrelated 0 0 0 0
+1334_12 1341_2 1.200000 0.577350 0.364625 -0.460872 25 unrelated 0 0 13 14
+1334_12 1344_1 1.200000 0.577350 -1.757001 1.254873 25 unrelated 0 0 12 13
+1334_12 1344_12 1.200000 0.577350 -0.406876 0.418047 25 unrelated 0 0 0 0
+1334_12 1344_13 1.200000 0.577350 -0.406876 0.418047 25 unrelated 0 0 0 0
+1334_12 1345_12 1.200000 0.577350 0.750376 -0.528970 25 unrelated 0 0 0 0
+1334_13 1334_2 1.200000 0.577350 -0.621190 0.600391 25 parentchild 0 0 12 13
+1334_13 1340_1 1.200000 0.577350 1.136124 -0.693367 25 unrelated 0 0 9 10
+1334_13 1340_10 1.200000 0.577350 1.136124 -0.693367 25 unrelated 0 0 0 0
+1334_13 1340_11 1.200000 0.577350 2.679125 -3.967559 25 unrelated 0 0 0 0
+1334_13 1340_12 1.200000 0.577350 0.943249 -0.598443 25 unrelated 0 0 0 0
+1334_13 1340_2 1.200000 0.577350 1.328999 -0.816040 25 unrelated 0 0 11 12
+1334_13 1340_9 1.200000 0.577350 -0.021125 -0.483423 25 unrelated 0 0 0 0
+1334_13 1341_1 1.200000 0.577350 0.268187 -0.455013 25 unrelated 0 0 11 12
+1334_13 1341_11 1.200000 0.577350 -0.214002 0.471641 25 unrelated 0 0 0 0
+1334_13 1341_12 1.200000 0.577350 0.364625 -0.460872 25 unrelated 0 0 0 0
+1334_13 1341_13 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 0 0
+1334_13 1341_14 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 0 0
+1334_13 1341_2 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 13 14
+1334_13 1344_1 1.200000 0.577350 -0.021125 -0.483423 25 unrelated 0 0 12 13
+1334_13 1344_12 1.200000 0.577350 1.328999 -0.816040 25 unrelated 0 0 0 0
+1334_13 1344_13 1.200000 0.577350 1.328999 -0.816040 25 unrelated 0 0 0 0
+1334_13 1345_12 1.200000 0.577350 0.171750 -0.460872 25 unrelated 0 0 0 0
+1334_2 1340_1 1.200000 0.577350 -0.599751 -0.693367 25 unrelated 12 13 9 10
+1334_2 1340_10 1.200000 0.577350 -0.599751 -0.693367 25 unrelated 12 13 0 0
+1334_2 1340_11 1.200000 0.577350 0.557499 -0.483423 25 unrelated 12 13 0 0
+1334_2 1340_12 1.200000 0.577350 -0.792626 0.696771 25 unrelated 12 13 0 0
+1334_2 1340_2 1.200000 0.577350 -0.792626 1.476572 25 unrelated 12 13 11 12
+1334_2 1340_9 1.200000 0.577350 1.328999 -0.816040 25 unrelated 12 13 0 0
+1334_2 1341_1 1.200000 0.577350 -1.540016 0.243836 25 unrelated 12 13 11 12
+1334_2 1341_11 1.200000 0.577350 -0.792626 2.157893 25 unrelated 12 13 0 0
+1334_2 1341_12 1.200000 0.577350 0.171750 -0.460872 25 unrelated 12 13 0 0
+1334_2 1341_13 1.200000 0.577350 -0.021126 -0.483423 25 unrelated 12 13 0 0
+1334_2 1341_14 1.200000 0.577350 -0.021126 -0.483423 25 unrelated 12 13 0 0
+1334_2 1341_2 1.200000 0.577350 -0.021126 -0.483423 25 unrelated 12 13 13 14
+1334_2 1344_1 1.200000 0.577350 -2.142751 1.988253 25 unrelated 12 13 12 13
+1334_2 1344_12 1.200000 0.577350 -0.792626 1.476572 25 unrelated 12 13 0 0
+1334_2 1344_13 1.200000 0.577350 -0.792626 1.476572 25 unrelated 12 13 0 0
+1334_2 1345_12 1.200000 0.577350 -0.021126 -0.483423 25 unrelated 12 13 0 0
+1340_1 1340_10 1.200000 0.577350 1.693329 -2.011511 25 parentchild 9 10 0 0
+1340_1 1340_11 1.200000 0.577350 0.885298 -0.430191 25 parents 9 10 0 0
+1340_1 1340_12 1.200000 0.577350 0.398354 -0.247774 25 parents 9 10 0 0
+1340_1 1340_2 1.200000 0.577350 0.398354 -0.247774 25 parents 9 10 11 12
+1340_1 1340_9 1.200000 0.577350 -0.831601 0.617297 25 parentchild 9 10 0 0
+1340_1 1341_1 1.200000 0.577350 -0.133636 1.365911 25 unrelated 9 10 11 12
+1340_1 1341_11 1.200000 0.577350 -0.599751 -0.693367 25 unrelated 9 10 0 0
+1340_1 1341_12 1.200000 0.577350 -0.792626 1.101689 25 unrelated 9 10 0 0
+1340_1 1341_13 1.200000 0.577350 1.714749 -1.159963 25 unrelated 9 10 0 0
+1340_1 1341_14 1.200000 0.577350 1.714749 -1.159963 25 unrelated 9 10 0 0
+1340_1 1341_2 1.200000 0.577350 1.714749 -1.159963 25 unrelated 9 10 13 14
+1340_1 1344_1 1.200000 0.577350 -1.564126 1.023334 25 unrelated 9 10 12 13
+1340_1 1344_12 1.200000 0.577350 0.557499 -0.483424 25 unrelated 9 10 0 0
+1340_1 1344_13 1.200000 0.577350 0.557499 -0.483424 25 unrelated 9 10 0 0
+1340_1 1345_12 1.200000 0.577350 -0.985501 1.007514 25 unrelated 9 10 0 0
+1340_10 1340_11 1.200000 0.577350 0.885298 -0.430191 25 parents 0 0 0 0
+1340_10 1340_12 1.200000 0.577350 0.398354 -0.247774 25 parents 0 0 0 0
+1340_10 1340_2 1.200000 0.577350 0.398354 -0.247774 25 parents 0 0 11 12
+1340_10 1340_9 1.200000 0.577350 0.236040 -0.228179 25 parents 0 0 0 0
+1340_10 1341_1 1.200000 0.577350 -0.133636 1.365911 25 unrelated 0 0 11 12
+1340_10 1341_11 1.200000 0.577350 -0.599751 -0.693367 25 unrelated 0 0 0 0
+1340_10 1341_12 1.200000 0.577350 -0.792626 1.101689 25 unrelated 0 0 0 0
+1340_10 1341_13 1.200000 0.577350 1.714749 -1.159963 25 unrelated 0 0 0 0
+1340_10 1341_14 1.200000 0.577350 1.714749 -1.159963 25 unrelated 0 0 0 0
+1340_10 1341_2 1.200000 0.577350 1.714749 -1.159963 25 unrelated 0 0 13 14
+1340_10 1344_1 1.200000 0.577350 -1.564126 1.023334 25 unrelated 0 0 12 13
+1340_10 1344_12 1.200000 0.577350 0.557499 -0.483424 25 unrelated 0 0 0 0
+1340_10 1344_13 1.200000 0.577350 0.557499 -0.483424 25 unrelated 0 0 0 0
+1340_10 1345_12 1.200000 0.577350 -0.985501 1.007514 25 unrelated 0 0 0 0
+1340_11 1340_12 1.200000 0.577350 0.722984 -0.347713 25 parents 0 0 0 0
+1340_11 1340_2 1.200000 0.577350 0.220453 0.351043 25 parentchild 0 0 11 12
+1340_11 1340_9 1.200000 0.577350 -0.088589 -0.247773 25 parents 0 0 0 0
+1340_11 1341_1 1.200000 0.577350 0.268187 -0.455013 25 unrelated 0 0 11 12
+1340_11 1341_11 1.200000 0.577350 -0.214002 0.471641 25 unrelated 0 0 0 0
+1340_11 1341_12 1.200000 0.577350 0.364625 -0.460872 25 unrelated 0 0 0 0
+1340_11 1341_13 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 0 0
+1340_11 1341_14 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 0 0
+1340_11 1341_2 1.200000 0.577350 0.557499 -0.483423 25 unrelated 0 0 13 14
+1340_11 1344_1 1.200000 0.577350 -0.021125 -0.483423 25 unrelated 0 0 12 13
+1340_11 1344_12 1.200000 0.577350 1.328999 -0.816040 25 unrelated 0 0 0 0
+1340_11 1344_13 1.200000 0.577350 1.328999 -0.816040 25 unrelated 0 0 0 0
+1340_11 1345_12 1.200000 0.577350 0.171750 -0.460872 25 unrelated 0 0 0 0
+1340_12 1340_2 1.200000 0.577350 0.430865 0.235726 25 parentchild 0 0 11 12
+1340_12 1340_9 1.200000 0.577350 -1.224791 0.456602 25 parents 0 0 0 0
+1340_12 1341_1 1.200000 0.577350 1.875479 -1.349462 25 unrelated 0 0 11 12
+1340_12 1341_11 1.200000 0.577350 0.750375 -0.528970 25 unrelated 0 0 0 0
+1340_12 1341_12 1.200000 0.577350 0.171750 -0.460872 25 unrelated 0 0 0 0
+1340_12 1341_13 1.200000 0.577350 -0.021126 -0.483423 25 unrelated 0 0 0 0
+1340_12 1341_14 1.200000 0.577350 -0.021126 -0.483423 25 unrelated 0 0 0 0
+1340_12 1341_2 1.200000 0.577350 -0.021126 -0.483423 25 unrelated 0 0 13 14
+1340_12 1344_1 1.200000 0.577350 -0.599751 -0.138508 25 unrelated 0 0 12 13
+1340_12 1344_12 1.200000 0.577350 1.521875 -0.969867 25 unrelated 0 0 0 0
+1340_12 1344_13 1.200000 0.577350 1.521875 -0.969867 25 unrelated 0 0 0 0
+1340_12 1345_12 1.200000 0.577350 -0.021126 -0.483423 25 unrelated 0 0 0 0
+1340_2 1340_9 1.200000 0.577350 -1.224791 1.183231 25 parents 11 12 0 0
+1340_2 1341_1 1.200000 0.577350 0.870921 -0.566551 25 unrelated 11 12 11 12
+1340_2 1341_11 1.200000 0.577350 1.136124 -0.693367 25 unrelated 11 12 0 0
+1340_2 1341_12 1.200000 0.577350 -0.985501 0.139601 25 unrelated 11 12 0 0
+1340_2 1341_13 1.200000 0.577350 -0.021125 -0.483423 25 unrelated 11 12 0 0
+1340_2 1341_14 1.200000 0.577350 -0.021125 -0.483423 25 unrelated 11 12 0 0
+1340_2 1341_2 1.200000 0.577350 -0.021125 -0.483423 25 unrelated 11 12 13 14
+1340_2 1344_1 1.200000 0.577350 0.557499 -0.483423 25 unrelated 11 12 12 13
+1340_2 1344_12 1.200000 0.577350 2.679125 -3.967559 25 unrelated 11 12 0 0
+1340_2 1344_13 1.200000 0.577350 2.679125 -3.967559 25 unrelated 11 12 0 0
+1340_2 1345_12 1.200000 0.577350 -1.178377 0.002982 25 unrelated 11 12 0 0
+1340_9 1341_1 1.200000 0.577350 -2.142751 1.397943 25 unrelated 0 0 11 12
+1340_9 1341_11 1.200000 0.577350 -0.985502 2.080189 25 unrelated 0 0 0 0
+1340_9 1341_12 1.200000 0.577350 -1.178376 0.895341 25 unrelated 0 0 0 0
+1340_9 1341_13 1.200000 0.577350 1.328999 -0.816040 25 unrelated 0 0 0 0
+1340_9 1341_14 1.200000 0.577350 1.328999 -0.816040 25 unrelated 0 0 0 0
+1340_9 1341_2 1.200000 0.577350 1.328999 -0.816040 25 unrelated 0 0 13 14
+1340_9 1344_1 1.200000 0.577350 -2.721377 3.000713 25 unrelated 0 0 12 13
+1340_9 1344_12 1.200000 0.577350 -1.371251 1.163511 25 unrelated 0 0 0 0
+1340_9 1344_13 1.200000 0.577350 -1.371251 1.163511 25 unrelated 0 0 0 0
+1340_9 1345_12 1.200000 0.577350 -1.371251 1.163511 25 unrelated 0 0 0 0
+1341_1 1341_11 1.200000 0.577350 -1.375162 0.584859 25 parentchild 11 12 0 0
+1341_1 1341_12 1.200000 0.577350 -0.279272 0.538074 25 parentchild 11 12 0 0
+1341_1 1341_13 1.200000 0.577350 -0.690506 1.210137 25 parents 11 12 0 0
+1341_1 1341_14 1.200000 0.577350 -0.690506 1.210137 25 parents 11 12 0 0
+1341_1 1341_2 1.200000 0.577350 -0.690506 1.210137 25 parents 11 12 13 14
+1341_1 1344_1 1.200000 0.577350 0.268187 0.088380 25 unrelated 11 12 12 13
+1341_1 1344_12 1.200000 0.577350 0.870921 -0.566551 25 unrelated 11 12 0 0
+1341_1 1344_13 1.200000 0.577350 0.870921 -0.566551 25 unrelated 11 12 0 0
+1341_1 1345_12 1.200000 0.577350 0.670011 -0.504142 25 unrelated 11 12 0 0
+1341_11 1341_12 1.200000 0.577350 -1.549421 0.551090 25 parents 0 0 0 0
+1341_11 1341_13 1.200000 0.577350 0.236040 -0.228179 25 parents 0 0 0 0
+1341_11 1341_14 1.200000 0.577350 0.236040 -0.228179 25 parents 0 0 0 0
+1341_11 1341_2 1.200000 0.577350 0.236040 -0.228179 25 parents 0 0 13 14
+1341_11 1344_1 1.200000 0.577350 -0.985502 2.080189 25 unrelated 0 0 12 13
+1341_11 1344_12 1.200000 0.577350 1.136124 -0.693367 25 unrelated 0 0 0 0
+1341_11 1344_13 1.200000 0.577350 1.136124 -0.693367 25 unrelated 0 0 0 0
+1341_11 1345_12 1.200000 0.577350 -1.949876 0.679840 25 unrelated 0 0 0 0
+1341_12 1341_13 1.200000 0.577350 -1.224792 0.836001 25 parents 0 0 0 0
+1341_12 1341_14 1.200000 0.577350 -1.224792 0.836001 25 parents 0 0 0 0
+1341_12 1341_2 1.200000 0.577350 -1.224792 0.836001 25 parents 0 0 13 14
+1341_12 1344_1 1.200000 0.577350 -0.792626 0.696770 25 unrelated 0 0 12 13
+1341_12 1344_12 1.200000 0.577350 -0.985501 0.139601 25 unrelated 0 0 0 0
+1341_12 1344_13 1.200000 0.577350 -0.985501 0.139601 25 unrelated 0 0 0 0
+1341_12 1345_12 1.200000 0.577350 2.486250 -2.592123 25 unrelated 0 0 0 0
+1341_13 1341_14 1.200000 0.577350 2.183816 -3.275103 25 parents 0 0 0 0
+1341_13 1341_2 1.200000 0.577350 1.693329 -2.011511 25 parentchild 0 0 13 14
+1341_13 1344_1 1.200000 0.577350 -2.142751 1.988253 25 unrelated 0 0 12 13
+1341_13 1344_12 1.200000 0.577350 -0.021125 -0.483423 25 unrelated 0 0 0 0
+1341_13 1344_13 1.200000 0.577350 -0.021125 -0.483423 25 unrelated 0 0 0 0
+1341_13 1345_12 1.200000 0.577350 -1.564126 1.023334 25 unrelated 0 0 0 0
+1341_14 1341_2 1.200000 0.577350 1.693329 -2.011511 25 parentchild 0 0 13 14
+1341_14 1344_1 1.200000 0.577350 -2.142751 1.988253 25 unrelated 0 0 12 13
+1341_14 1344_12 1.200000 0.577350 -0.021125 -0.483423 25 unrelated 0 0 0 0
+1341_14 1344_13 1.200000 0.577350 -0.021125 -0.483423 25 unrelated 0 0 0 0
+1341_14 1345_12 1.200000 0.577350 -1.564126 1.023334 25 unrelated 0 0 0 0
+1341_2 1344_1 1.200000 0.577350 -2.142751 1.988253 25 unrelated 13 14 12 13
+1341_2 1344_12 1.200000 0.577350 -0.021125 -0.483423 25 unrelated 13 14 0 0
+1341_2 1344_13 1.200000 0.577350 -0.021125 -0.483423 25 unrelated 13 14 0 0
+1341_2 1345_12 1.200000 0.577350 -1.564126 1.023334 25 unrelated 13 14 0 0
+1344_1 1344_12 1.200000 0.577350 -0.621190 0.600391 25 parentchild 12 13 0 0
+1344_1 1344_13 1.200000 0.577350 -0.621190 0.600391 25 parentchild 12 13 0 0
+1344_1 1345_12 1.200000 0.577350 -0.599751 0.780517 25 unrelated 12 13 0 0
+1344_12 1344_13 1.200000 0.577350 2.183816 -3.275103 25 parents 0 0 0 0
+1344_12 1345_12 1.200000 0.577350 -1.178377 0.002982 25 unrelated 0 0 0 0
+1344_13 1345_12 1.200000 0.577350 -1.178377 0.002982 25 unrelated 0 0 0 0
diff -r 7f95e51e06f7 -r 2d49a94c8d28 test-data/rgtestouts/rgHaploView/1_rgHaploViewtest1.pdf
Binary file test-data/rgtestouts/rgHaploView/1_rgHaploViewtest1.pdf has changed
diff -r 7f95e51e06f7 -r 2d49a94c8d28 test-data/rgtestouts/rgHaploView/1_rgHaploViewtest1.png
Binary file test-data/rgtestouts/rgHaploView/1_rgHaploViewtest1.png has changed
diff -r 7f95e51e06f7 -r 2d49a94c8d28 test-data/rgtestouts/rgHaploView/2_HapMap_YRI_22.pdf
Binary file test-data/rgtestouts/rgHaploView/2_HapMap_YRI_22.pdf has changed
diff -r 7f95e51e06f7 -r 2d49a94c8d28 test-data/rgtestouts/rgHaploView/2_HapMap_YRI_22.png
Binary file test-data/rgtestouts/rgHaploView/2_HapMap_YRI_22.png has changed
diff -r 7f95e51e06f7 -r 2d49a94c8d28 test-data/rgtestouts/rgHaploView/Chromosome22YRI.LD.PNG
Binary file test-data/rgtestouts/rgHaploView/Chromosome22YRI.LD.PNG has changed
diff -r 7f95e51e06f7 -r 2d49a94c8d28 test-data/rgtestouts/rgHaploView/Log_rgHaploViewtest1.txt
--- a/test-data/rgtestouts/rgHaploView/Log_rgHaploViewtest1.txt Wed May 19 10:28:41 2010 -0400
+++ b/test-data/rgtestouts/rgHaploView/Log_rgHaploViewtest1.txt Thu May 20 12:38:35 2010 -0400
@@ -1,7 +1,7 @@
-PATH=/share/apps:/share/shared/lx26-amd64/bin:/udd/rerla/bin:/share/shared/lx26-amd64/bin:/opt/gridengine/bin/lx26-amd64:/opt/gridengine/bin/lx26-amd64:/usr/kerberos/bin:/usr/java/latest/bin:/usr/local/bin:/bin:/usr/bin:/opt/eclipse:/opt/ganglia/bin:/opt/ganglia/sbin:/opt/maven/bin:/opt/openmpi/bin/:/opt/rocks/bin:/opt/rocks/sbin:/opt/gridengine/bin:/opt/gridengine:/bin/lx26-amd64:/usr/X11R6/bin
+PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/rerla/bin
## rgHaploView.py looking for 10 rs (['rs2283802', 'rs2267000', 'rs16997606', 'rs4820537', 'rs3788347'])## rgHaploView.py: wrote 10 markers, 40 subjects for region
-## executing java -jar /share/shared/galaxy/tool-data/rg/bin/haploview.jar -n -memory 2048 -pairwiseTagging -pedfile /share/shared/galaxy/test-data/rgtestouts/rgHaploView/rgHaploViewtest1.ped -info /share/shared/galaxy/test-data/rgtestouts/rgHaploView/rgHaploViewtest1.info -tagrsqcounts -tagrsqcutoff 0.8 -ldcolorscheme RSQ -log /share/shared/galaxy/test-data/tinywga.log -maxDistance 200000 -compressedpng -chromosome 22 returned 0
+## executing java -jar /opt/galaxy/tool-data/rg/bin/haploview.jar -n -memory 2048 -pairwiseTagging -pedfile /opt/galaxy/test-data/rgtestouts/rgHaploView/rgHaploViewtest1.ped -info /opt/galaxy/test-data/rgtestouts/rgHaploView/rgHaploViewtest1.info -tagrsqcounts -tagrsqcutoff 0.8 -ldcolorscheme RSQ -log /opt/galaxy/test-data/tinywga.log -maxDistance 200000 -compressedpng -chromosome 22 returned 0
## executing mogrify -resize 800x400! *.PNG returned 0
## executing convert -resize 800x400! rgHaploViewtest1.ped.LD.PNG rgHaploViewtest1.tmp.png returned 0
## executing convert -pointsize 25 -fill maroon -draw "text 10,300 'rgHaploViewtest1'" rgHaploViewtest1.tmp.png 1_rgHaploViewtest1.png returned 0
@@ -12,16 +12,16 @@
## executing pdfjoin "*.pdf" --fitpaper true --outfile alljoin.pdf returned 0
## executing pdfnup alljoin.pdf --nup 1x2 --outfile allnup.pdf returned 0
*****************************************************
-Haploview 4.2 Java Version: 1.6.0_13
+Haploview 4.2 Java Version: 1.6.0_03
*****************************************************
-Arguments: -n -pairwiseTagging -pedfile /share/shared/galaxy/test-data/rgtestouts/rgHaploView/rgHaploViewtest1.ped -info /share/shared/galaxy/test-data/rgtestouts/rgHaploView/rgHaploViewtest1.info -tagrsqcounts -tagrsqcutoff 0.8 -ldcolorscheme RSQ -log /share/shared/galaxy/test-data/tinywga.log -maxDistance 200000 -compressedpng -chromosome 22
+Arguments: -n -pairwiseTagging -pedfile /opt/galaxy/test-data/rgtestouts/rgHaploView/rgHaploViewtest1.ped -info /opt/galaxy/test-data/rgtestouts/rgHaploView/rgHaploViewtest1.info -tagrsqcounts -tagrsqcutoff 0.8 -ldcolorscheme RSQ -log /opt/galaxy/test-data/tinywga.log -maxDistance 200000 -compressedpng -chromosome 22
Max LD comparison distance = 200000kb
-Using data file: /share/shared/galaxy/test-data/rgtestouts/rgHaploView/rgHaploViewtest1.ped
-Using marker information file: /share/shared/galaxy/test-data/rgtestouts/rgHaploView/rgHaploViewtest1.info
+Using data file: /opt/galaxy/test-data/rgtestouts/rgHaploView/rgHaploViewtest1.ped
+Using marker information file: /opt/galaxy/test-data/rgtestouts/rgHaploView/rgHaploViewtest1.info
10 out of 10 markers passed the MAF threshold.
10 out of 10 markers passed the Mendel threshold.
10 out of 10 markers passed the genotyping threshold.
@@ -33,11 +33,11 @@
Writing output to rgHaploViewtest1.ped.TESTS
Writing output to rgHaploViewtest1.ped.CHAPS
*****************************************************
-Haploview 4.2 Java Version: 1.6.0_13
+Haploview 4.2 Java Version: 1.6.0_03
*****************************************************
-Arguments: -n -chromosome 22 -panel YRI -hapmapDownload -startpos 21784 -endpos 21905 -ldcolorscheme RSQ -log /share/shared/galaxy/test-data/tinywga.log -maxDistance 200000 -compressedpng
+Arguments: -n -chromosome 22 -panel YRI -hapmapDownload -startpos 21784 -endpos 21905 -ldcolorscheme RSQ -log /opt/galaxy/test-data/tinywga.log -maxDistance 200000 -compressedpng
Max LD comparison distance = 200000kb
diff -r 7f95e51e06f7 -r 2d49a94c8d28 test-data/rgtestouts/rgHaploView/alljoin.pdf
Binary file test-data/rgtestouts/rgHaploView/alljoin.pdf has changed
diff -r 7f95e51e06f7 -r 2d49a94c8d28 test-data/rgtestouts/rgHaploView/allnup.pdf
Binary file test-data/rgtestouts/rgHaploView/allnup.pdf has changed
diff -r 7f95e51e06f7 -r 2d49a94c8d28 test-data/rgtestouts/rgHaploView/rgHaploViewtest1.html
--- a/test-data/rgtestouts/rgHaploView/rgHaploViewtest1.html Wed May 19 10:28:41 2010 -0400
+++ b/test-data/rgtestouts/rgHaploView/rgHaploViewtest1.html Thu May 20 12:38:35 2010 -0400
@@ -23,13 +23,13 @@
<li><a href="rgHaploViewtest1.ped.LD.PNG">rgHaploViewtest1.ped.LD.PNG - rgHaploViewtest1.ped.LD.PNG</a></li>
<li><a href="rgHaploViewtest1.ped.TAGS">rgHaploViewtest1.ped.TAGS - rgHaploViewtest1.ped.TAGS Tagger output</a></li>
<li><a href="rgHaploViewtest1.ped.TESTS">rgHaploViewtest1.ped.TESTS - rgHaploViewtest1.ped.TESTS Tagger output</a></li>
-</ol><br></div><div><hr>Job Log follows below (see Log_rgHaploViewtest1.txt)<pre>PATH=/share/apps:/share/shared/lx26-amd64/bin:/udd/rerla/bin:/share/shared/lx26-amd64/bin:/opt/gridengine/bin/lx26-amd64:/opt/gridengine/bin/lx26-amd64:/usr/kerberos/bin:/usr/java/latest/bin:/usr/local/bin:/bin:/usr/bin:/opt/eclipse:/opt/ganglia/bin:/opt/ganglia/sbin:/opt/maven/bin:/opt/openmpi/bin/:/opt/rocks/bin:/opt/rocks/sbin:/opt/gridengine/bin:/opt/gridengine:/bin/lx26-amd64:/usr/X11R6/bin
+</ol><br></div><div><hr>Job Log follows below (see Log_rgHaploViewtest1.txt)<pre>PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/rerla/bin
## rgHaploView.py looking for 10 rs (['rs2283802', 'rs2267000', 'rs16997606', 'rs4820537', 'rs3788347'])## rgHaploView.py: wrote 10 markers, 40 subjects for region
-## executing java -jar /share/shared/galaxy/tool-data/rg/bin/haploview.jar -n -memory 2048 -pairwiseTagging -pedfile /share/shared/galaxy/test-data/rgtestouts/rgHaploView/rgHaploViewtest1.ped -info /share/shared/galaxy/test-data/rgtestouts/rgHaploView/rgHaploViewtest1.info -tagrsqcounts -tagrsqcutoff 0.8 -ldcolorscheme RSQ -log /share/shared/galaxy/test-data/tinywga.log -maxDistance 200000 -compressedpng -chromosome 22 returned 0
+## executing java -jar /opt/galaxy/tool-data/rg/bin/haploview.jar -n -memory 2048 -pairwiseTagging -pedfile /opt/galaxy/test-data/rgtestouts/rgHaploView/rgHaploViewtest1.ped -info /opt/galaxy/test-data/rgtestouts/rgHaploView/rgHaploViewtest1.info -tagrsqcounts -tagrsqcutoff 0.8 -ldcolorscheme RSQ -log /opt/galaxy/test-data/tinywga.log -maxDistance 200000 -compressedpng -chromosome 22 returned 0
## executing mogrify -resize 800x400! *.PNG returned 0
@@ -51,7 +51,7 @@
1
0

25 May '10
details: http://www.bx.psu.edu/hg/galaxy/rev/7f95e51e06f7
changeset: 3791:7f95e51e06f7
user: fubar: ross Lazarus at gmail period com
date: Wed May 19 10:28:41 2010 -0400
description:
Added ldIndep datatype to genetics.py and datatypes_conf for ld reduced datasets - these are pbed
files that have had one of each pair of redundant SNP in high LD with each other removed for GRR and ancestry PCA
where the redundancy adds no additional information but slows things down
Added converter for pbed to ldindep to converters and to datatypes_conf
Adjusted rgGRR and rgEigPCA tools to use these
diffstat:
lib/galaxy/datatypes/genetics.py | 13 +
static/welcome.html | 6 +-
tools/rgenetics/rgEigPCA.py | 118 +-
tools/rgenetics/rgEigPCA.xml | 4 +-
tools/rgenetics/rgEigPCA_code.py | 69 +-
tools/rgenetics/rgGRR.py | 2178 ++++++++++++++++++------------------
tools/rgenetics/rgGRR.xml | 7 +-
tools/rgenetics/rgGRR_code.py | 60 +-
tools/rgenetics/rgtest_one_tool.sh | 2 +-
tools/rgenetics/rgutils.py | 155 +-
10 files changed, 1346 insertions(+), 1266 deletions(-)
diffs (2954 lines):
diff -r 6a065c0f350e -r 7f95e51e06f7 lib/galaxy/datatypes/genetics.py
--- a/lib/galaxy/datatypes/genetics.py Mon May 17 10:58:16 2010 -0400
+++ b/lib/galaxy/datatypes/genetics.py Wed May 19 10:28:41 2010 -0400
@@ -349,6 +349,19 @@
return True
+class ldIndep(Rgenetics):
+ """
+ LD (a good measure of redundancy of information) depleted Plink Binary compressed 2bit/geno
+ """
+ file_ext="ldreduced"
+
+ def __init__( self, **kwd ):
+ Rgenetics.__init__(self, **kwd)
+ self.add_composite_file( '%s_INDEP.bim', substitute_name_with_metadata = 'base_name', is_binary = True )
+ self.add_composite_file( '%s_INDEP.bed', substitute_name_with_metadata = 'base_name', is_binary = True )
+ self.add_composite_file( '%s_INDEP.fam', substitute_name_with_metadata = 'base_name', is_binary = True )
+
+
class SNPMatrix(Rgenetics):
"""
BioC SNPMatrix Rgenetics data collections
diff -r 6a065c0f350e -r 7f95e51e06f7 static/welcome.html
--- a/static/welcome.html Mon May 17 10:58:16 2010 -0400
+++ b/static/welcome.html Wed May 19 10:28:41 2010 -0400
@@ -8,12 +8,12 @@
<body>
<div class="document">
<div class="warningmessagelarge">
- <strong>Hello world! It's running...</strong>
+ <strong>Welcome to the <a href="http://rgenetics.org">Rgenetics</a> development site</strong>
<hr>
- To customize this page edit <code>static/welcome.html</code>
+ This is a volatile and experimental resource - use the <a href="http://usegalaxy.org">main galaxy</a> for real research
</div>
<br/>
- <img src="images/noodles.png" alt="WWFSMD?" style="display: block; margin-left: auto; margin-right: auto;" />
+ <img src="images/Armitagep_manhattan.png" alt="One click manhattan plot anyone?" style="display: block; margin-left: auto; margin-right: auto;" />
<hr/>
This project is supported in part by <a target="_blank" class="reference" href="http://www.nsf.gov">NSF</a>, <a target="_blank" class="reference" href="http://www.genome.gov">NHGRI</a>, and <a target="_blank" class="reference" href="http://www.huck.psu.edu">the Huck Institutes of the Life Sciences</a>.
</div>
diff -r 6a065c0f350e -r 7f95e51e06f7 tools/rgenetics/rgEigPCA.py
--- a/tools/rgenetics/rgEigPCA.py Mon May 17 10:58:16 2010 -0400
+++ b/tools/rgenetics/rgEigPCA.py Wed May 19 10:28:41 2010 -0400
@@ -1,5 +1,5 @@
"""
-run smartpca
+run smartpca
This uses galaxy code developed by Dan to deal with
arbitrary output files using an html dataset with it's own
@@ -25,8 +25,8 @@
5 different input formats are supported. See ../CONVERTF/README
for documentation on using the convertf program to convert between formats.
-The syntax of smartpca is "../bin/smartpca -p parfile". We illustrate
-how parfile works via a toy example (see example.perl in this directory).
+The syntax of smartpca is "../bin/smartpca -p parfile". We illustrate
+how parfile works via a toy example (see example.perl in this directory).
This example takes input in EIGENSTRAT format. The syntax of how to take input
in other formats is analogous to the convertf program, see ../CONVERTF/README.
@@ -56,9 +56,9 @@
numoutevec: number of eigenvectors to output. Default is 10.
numoutlieriter: maximum number of outlier removal iterations.
Default is 5. To turn off outlier removal, set this parameter to 0.
-numoutlierevec: number of principal components along which to
+numoutlierevec: number of principal components along which to
remove outliers during each outlier removal iteration. Default is 10.
-outliersigmathresh: number of standard deviations which an individual must
+outliersigmathresh: number of standard deviations which an individual must
exceed, along one of the top (numoutlierevec) principal components, in
order for that individual to be removed as an outlier. Default is 6.0.
outlieroutname: output logfile of outlier individuals removed. If not specified,
@@ -78,17 +78,17 @@
Default is 0 (no LD correction). If desiring LD correction, we recommend 2.
maxdistldregress: If doing LD correction, this is the maximum genetic distance
(in Morgans) for previous SNPs used in LD correction. Default is no maximum.
-poplistname: If wishing to infer eigenvectors using only individuals from a
- subset of populations, and then project individuals from all populations
+poplistname: If wishing to infer eigenvectors using only individuals from a
+ subset of populations, and then project individuals from all populations
onto those eigenvectors, this input file contains a list of population names,
- one population name per line, which will be used to infer eigenvectors.
- It is assumed that the population of each individual is specified in the
+ one population name per line, which will be used to infer eigenvectors.
+ It is assumed that the population of each individual is specified in the
indiv file. Default is to use individuals from all populations.
phylipoutname: output file containing an fst matrix which can be used as input
to programs in the PHYLIP package, such as the "fitch" program for
constructing phylogenetic trees.
noxdata: if set to YES, all SNPs on X chr are excluded from the data set.
- The smartpca default for this parameter is YES, since different variances
+ The smartpca default for this parameter is YES, since different variances
for males vs. females on X chr may confound PCA analysis.
nomalexhet: if set to YES, any het genotypes on X chr for males are changed
to missing data. The smartpca default for this parameter is YES.
@@ -96,11 +96,11 @@
Same format as example.snp. Cannot be used if input is in
PACKEDPED or PACKEDANCESTRYMAP format.
popsizelimit: If set to a positive integer, the result is that only the first
- popsizelimit individuals from each population will be included in the
- analysis. It is assumed that the population of each individual is specified
+ popsizelimit individuals from each population will be included in the
+ analysis. It is assumed that the population of each individual is specified
in the indiv file. Default is to use all individuals in the analysis.
-The next 5 optional parameters allow the user to output genotype, snp and
+The next 5 optional parameters allow the user to output genotype, snp and
indiv files which will be identical to the input files except that:
Any individuals set to Ignore in the input indiv file will be
removed from the data set (see ../CONVERTF/README)
@@ -112,22 +112,11 @@
snpoutname: output snp file
indivoutname: output indiv file
outputgroup: see documentation in ../CONVERTF/README
-
-
"""
import sys,os,time,subprocess,string,glob
-from rgutils import RRun, galhtmlprefix, galhtmlpostfix, timenow, smartpca, rexe
-
+from rgutils import RRun, galhtmlprefix, galhtmlpostfix, timenow, smartpca, rexe, plinke
verbose = False
-mapexts = ['.map','.bim','.pedsnp']
-mapexts += [x.upper() for x in mapexts] # ya never know
-genoexts = ['.ped','.bed','.pedsnp']
-genoexts += [x.upper() for x in genoexts]
-indexts = ['.ped','.fam','.pedind']
-indexts += [x.upper() for x in indexts]
-
-
def makePlot(eigpca='test.pca',title='test',pdfname='test.pdf',h=8,w=10,nfp=None,rexe=''):
"""
the eigenvec file has a # row with the eigenvectors, then subject ids, eigenvecs and lastly
@@ -205,9 +194,43 @@
print >> sys.stdout, '\n'.join(R)
print >> sys.stdout, rlog
-def getInfiles(infile=None):
+
+def getInfiles(basename=None,infpath=None,outfpath=None,plinke='plink',forcerebuild=False):
+ """
+ openOrMakeLDreduced(basename,newfpath,plinke='plink',forcerebuild=False)
+ ingeno = getLDreduced(infile,plinke)
+ gbase,gext = os.path.splitext(ingeno)
+ if gext == '.bed':
+ inmap = '%s.bim' % gbase
+ inped = '%s.fam' % gbase
+ elif gext == '.ped':
+ inmap = '%s.map' % gbase
+ inped = '%s.ped' % gbase
+ elif gext == '.tped':
+ inmap = '%s.tmap' % gbase
+ inped = '%s.tfam' % gbase
+ """
+ base,kind = getLDreducedFname(basename,infpath=infpath,outfpath=outfpath,plinke=plinke,forcerebuild=forcerebuild)
+ assert kind in ['lped','pbed','tped'],'## kind=%s - not lped,pbed,tped' % str(kind)
+ if kind=='lped':
+ return '%s.ped' % base,'%s.map' % base,'%s.ped' % base
+ elif kind=='pbed':
+ return '%s.bed' % base,'%s.bim' % base,'%s.fam' % base
+ elif kind == 'tped':
+ return '%s.tped' % base,'%s.tmap' % base,'%s.tfam' % base
+
+
+def getInfilesOld(infile=None):
+ """given a basename, find the best input files
+ """
+ mapexts = ['.map','.bim','.pedsnp']
+ mapexts += [x.upper() for x in mapexts] # ya never know
+ genoexts = ['.ped','.bed','.pedsnp']
+ genoexts += [x.upper() for x in genoexts]
+ indexts = ['.ped','.fam','.pedind']
+ indexts += [x.upper() for x in indexts]
flist = glob.glob('%s*' % infile) # this should list all available rgenetics data files
- exts = [os.path.splitext(x)[-1] for x in flist] # expect ['.ped','.map'] etc
+ exts = set([os.path.splitext(x)[-1] for x in flist]) # expect ['.ped','.map'] etc
mapext = None
genoext = None
indext = None
@@ -234,7 +257,7 @@
sys.exit(1)
if genoext == None:
print '### no geno (%s) file found - cannot run eigensoft' % ','.join(genoexts)
- sys.exit(1)
+ sys.exit(1)
return ingeno,inmap,inped
def getfSize(fpath,outpath):
@@ -252,18 +275,18 @@
elif n > 0:
size = ' (%d B)' % (int(n))
return size
-
+
def runEigen():
""" run the smartpca prog - documentation follows
- smartpca.perl -i fakeped_100.eigenstratgeno -a fakeped_100.map -b fakeped_100.ind -p fakeped_100 -e fakeped_100.eigenvals -l
+ smartpca.perl -i fakeped_100.eigenstratgeno -a fakeped_100.map -b fakeped_100.ind -p fakeped_100 -e fakeped_100.eigenvals -l
fakeped_100.eigenlog -o fakeped_100.eigenout
DOCUMENTATION OF smartpca.perl program:
-This program calls the smartpca program (see ../POPGEN/README).
-For this to work, the bin directory containing smartpca MUST be in your path.
+This program calls the smartpca program (see ../POPGEN/README).
+For this to work, the bin directory containing smartpca MUST be in your path.
See ./example.perl for a toy example.
../bin/smartpca.perl
@@ -279,7 +302,7 @@
-l example.log : output logfile
-m maxiter : (Default is 5) maximum number of outlier removal iterations.
To turn off outlier removal, set -m 0.
--t topk : (Default is 10) number of principal components along which
+-t topk : (Default is 10) number of principal components along which
to remove outliers during each outlier removal iteration.
-s sigma : (Default is 6.0) number of standard deviations which an
individual must exceed, along one of topk top principal
@@ -293,9 +316,9 @@
<command interpreter="python">
rgEigPCA.py "$i.extra_files_path/$i.metadata.base_name" "$title" "$out_file1"
- "$out_file1.files_path" "$k" "$m" "$t" "$s" "$pca"
+ "$out_file1.files_path" "$k" "$m" "$t" "$s" "$pca"
</command>
-
+
"""
if len(sys.argv) < 9:
print 'Need an input genotype file root, a title, a temp id and the temp file path for outputs,'
@@ -305,9 +328,10 @@
print >> sys.stdout, 'rgEigPCA.py got %s' % (' '.join(sys.argv))
skillme = ' %s' % string.punctuation
trantab = string.maketrans(skillme,'_'*len(skillme))
- ofname = sys.argv[5]
+ ofname = sys.argv[5]
progname = os.path.basename(sys.argv[0])
infile = sys.argv[1]
+ infpath,base_name = os.path.split(infile) # can't leave anything here - readonly on PSU - so leave in outdir instead
title = sys.argv[2].translate(trantab) # must replace all of these for urls containing title
outfile1 = sys.argv[3]
newfilepath = sys.argv[4]
@@ -328,8 +352,8 @@
eigentitle = os.path.join(newfilepath,title)
explanations=['Samples plotted in first 2 eigenvector space','Principle components','Eigenvalues',
'Smartpca log (contents shown below)']
- rplotname = 'PCAPlot.pdf'
- eigenexts = [rplotname, "pca.xls", "eval.xls"]
+ rplotname = 'PCAPlot.pdf'
+ eigenexts = [rplotname, "pca.xls", "eval.xls"]
newfiles = ['%s_%s' % (title,x) for x in eigenexts] # produced by eigenstrat
rplotout = os.path.join(newfilepath,newfiles[0]) # for R plots
eigenouts = [x for x in newfiles]
@@ -342,15 +366,12 @@
os.makedirs(newfilepath)
except:
pass
- ingeno,inmap,inped = getInfiles(infile=infile) # figure out what input files to feed smartpca
- # this is a mess. todo clean up - should each datatype have it's own directory? Yes
- # probably. Then titles are universal - but userId libraries are separate.
- smartCL = '%s -i %s -a %s -b %s -o %s -p %s -e %s -l %s -k %s -m %s -t %s -s %s' % \
- (smartpca,ingeno, inmap, inped, eigenouts[1],'%s_eigensoftplot.pdf' % title,eigenouts[2],eigenlogf, \
+ smartCL = '%s -i %s.bed -a %s.bim -b %s.fam -o %s -p %s -e %s -l %s -k %s -m %s -t %s -s %s' % \
+ (smartpca,infile, infile, infile, eigenouts[1],'%s_eigensoftplot.pdf' % title,eigenouts[2],eigenlogf, \
eigen_k, eigen_m, eigen_t, eigen_s)
env = os.environ
- p=subprocess.Popen(smartCL,shell=True,cwd=newfilepath)
- retval = p.wait()
+ p=subprocess.Popen(smartCL,shell=True,cwd=newfilepath)
+ retval = p.wait()
# copy the eigenvector output file needed for adjustment to the user's eigenstrat library directory
elog = file(os.path.join(newfilepath,eigenlogf),'r').read()
eeigen = os.path.join(newfilepath,'%s.evec' % eigenouts[1]) # need these for adjusting
@@ -360,7 +381,7 @@
eigpcaRes = ''
file(eigpca,'w').write(eigpcaRes)
makePlot(eigpca=eigpca,pdfname=newfiles[0],title=title,nfp=newfilepath,rexe=rexe)
- s = 'Output from %s run at %s<br/>\n' % (progname,timenow())
+ s = 'Output from %s run at %s<br/>\n' % (progname,timenow())
lf.write('<h4>%s</h4>\n' % s)
lf.write('newfilepath=%s, rexe=%s' % (newfilepath,rexe))
lf.write('(click on the image below to see a much higher quality PDF version)')
@@ -370,9 +391,10 @@
lf.write('<a href="%s"><img src="%s" alt="%s" hspace="10" align="left" /></a></td></tr></table><br/>\n' \
% (newfiles[0],thumbnail,explanations[0]))
allfiles = os.listdir(newfilepath)
+ allfiles.sort()
sizes = [getfSize(x,newfilepath) for x in allfiles]
- allfiles = ['<li><a href="%s">%s %s</a></li>\n' % (x,x,sizes[i]) for i,x in enumerate(allfiles)] # html list
- lf.write('<div class="document">All Files:<ol>%s</ol></div>' % ''.join(allfiles))
+ lallfiles = ['<li><a href="%s">%s %s</a></li>\n' % (x,x,sizes[i]) for i,x in enumerate(allfiles)] # html list
+ lf.write('<div class="document">All Files:<ol>%s</ol></div>' % ''.join(lallfiles))
lf.write('<div class="document">Log %s contents follow below<p/>' % eigenlogf)
lf.write('<pre>%s</pre></div>' % elog) # the eigenlog
s = 'If you need to rerun this analysis, the command line used was\n%s\n<p/>' % (smartCL)
diff -r 6a065c0f350e -r 7f95e51e06f7 tools/rgenetics/rgEigPCA.xml
--- a/tools/rgenetics/rgEigPCA.xml Mon May 17 10:58:16 2010 -0400
+++ b/tools/rgenetics/rgEigPCA.xml Wed May 19 10:28:41 2010 -0400
@@ -10,7 +10,7 @@
<inputs>
<param name="i" type="data" label="Input genotype data file"
- size="120" format="eigenstratgeno,lped,pbed" />
+ size="120" format="ldindep" />
<param name="title" type="text" value="Ancestry PCA" label="Title for outputs from this run"
size="80" />
<param name="k" type="integer" value="4" label="Number of principal components to output"
@@ -35,7 +35,7 @@
<tests>
<test>
- <param name='i' value='tinywga' ftype='pbed' >
+ <param name='i' value='tinywga' ftype='ldindep' >
<metadata name='base_name' value='tinywga' />
<composite_data value='tinywga.bim' />
<composite_data value='tinywga.bed' />
diff -r 6a065c0f350e -r 7f95e51e06f7 tools/rgenetics/rgEigPCA_code.py
--- a/tools/rgenetics/rgEigPCA_code.py Mon May 17 10:58:16 2010 -0400
+++ b/tools/rgenetics/rgEigPCA_code.py Wed May 19 10:28:41 2010 -0400
@@ -1,27 +1,42 @@
-from galaxy import datatypes,model
-import sys,time,string
-
-def timenow():
- """return current time as a string
- """
- return time.strftime('%d/%m/%Y %H:%M:%S', time.localtime(time.time()))
-
-def exec_after_process(app, inp_data, out_data, param_dict, tool, stdout, stderr):
- """Sets the name of the html output file
- """
- indatname = inp_data['i'].name
- job_name = param_dict.get( 'title', 'Eigenstrat run' )
- job_name = job_name.encode()
- killme = string.punctuation + string.whitespace
- trantab = string.maketrans(killme,'_'*len(killme))
- job_name = job_name.translate(trantab)
- info = '%s rgEigPCA2 on %s at %s' % (job_name,indatname,timenow())
- exts = ['html','txt']
- for i,ofname in enumerate(['out_file1','pca']):
- data = out_data[ofname]
- ext = exts[i]
- newname = '%s.%s' % (job_name,ext)
- data.name = newname
- data.info = info
- out_data[ofname] = data
- app.model.context.flush()
+from galaxy import datatypes,model
+import sys,time,string,shutil,os
+
+def timenow():
+ """return current time as a string
+ """
+ return time.strftime('%d/%m/%Y %H:%M:%S', time.localtime(time.time()))
+
+def exec_after_process(app, inp_data, out_data, param_dict, tool, stdout, stderr):
+ """Sets the name of the html output file
+ if we created a set of ldreduced files, we need to move them into the input files_path
+ so it doesn't need to be done again
+ """
+ indat = inp_data['i']
+ indatname = indat.name
+ base_name = indat.metadata.base_name
+ todir = indat.extra_files_path # where the ldreduced stuff should be
+ job_name = param_dict.get( 'title', 'Eigenstrat run' )
+ job_name = job_name.encode()
+ killme = string.punctuation + string.whitespace
+ trantab = string.maketrans(killme,'_'*len(killme))
+ job_name = job_name.translate(trantab)
+ info = '%s rgEigPCA2 on %s at %s' % (job_name,indatname,timenow())
+ exts = ['html','txt']
+ for i,ofname in enumerate(['out_file1','pca']):
+ data = out_data[ofname]
+ ext = exts[i]
+ newname = '%s.%s' % (job_name,ext)
+ data.name = newname
+ data.info = info
+ out_data[ofname] = data
+ if i == 0:
+ fromdir = data.extra_files_path
+ ldfname = '%s_INDEP_THIN' % base_name # we store ld reduced and thinned data
+ ldout = os.path.join(todir,ldfname)
+ ldin = os.path.join(fromdir,ldfname)
+ if os.path.exists('%s.bed' % ldin) and not os.path.exists('%s.bed' % ldout): # copy ldreduced to input for next time
+ for ext in ['bim','bed','fam']:
+ src = '%s.%s' % (ldin,ext)
+ dest = '%s.%s' % (ldout,ext)
+ shutil.copy(src,dest)
+ app.model.context.flush()
diff -r 6a065c0f350e -r 7f95e51e06f7 tools/rgenetics/rgGRR.py
--- a/tools/rgenetics/rgGRR.py Mon May 17 10:58:16 2010 -0400
+++ b/tools/rgenetics/rgGRR.py Wed May 19 10:28:41 2010 -0400
@@ -1,1089 +1,1089 @@
-"""
-# july 2009: Need to see outliers so need to draw them last?
-# could use clustering on the zscores to guess real relationships for unrelateds
-# but definitely need to draw last
-# added MAX_SHOW_ROWS to limit the length of the main report page
-# Changes for Galaxy integration
-# added more robust knuth method for one pass mean and sd
-# no difference really - let's use scipy.mean() and scipy.std() instead...
-# fixed labels and changed to .xls for outlier reports so can open in excel
-# interesting - with a few hundred subjects, 5k gives good resolution
-# and 100k gives better but not by much
-# TODO remove non autosomal markers
-# TODO it would be best if label had the zmean and zsd as these are what matter for
-# outliers rather than the group mean/sd
-# mods to rgGRR.py from channing CVS which John Ziniti has rewritten to produce SVG plots
-# to make a Galaxy tool - we need the table of mean and SD for interesting pairs, the SVG and the log
-# so the result should be an HTML file
-
-# rgIBS.py
-# use a random subset of markers for a quick ibs
-# to identify sample dups and closely related subjects
-# try snpMatrix and plink and see which one works best for us?
-# abecasis grr plots mean*sd for every subject to show clusters
-# mods june 23 rml to avoid non-autosomal markers
-# we seem to be distinguishing parent-child by gender - 2 clouds!
-
-
-snpMatrix from David Clayton has:
-ibs.stats function to calculate the identity-by-state stats of a group of samples
-Description
-Given a snp.matrix-class or a X.snp.matrix-class object with N samples, calculates some statistics
-about the relatedness of every pair of samples within.
-
-Usage
-ibs.stats(x)
-8 ibs.stats
-Arguments
-x a snp.matrix-class or a X.snp.matrix-class object containing N samples
-Details
-No-calls are excluded from consideration here.
-Value
-A data.frame containing N(N - 1)/2 rows, where the row names are the sample name pairs separated
-by a comma, and the columns are:
-Count count of identical calls, exclusing no-calls
-Fraction fraction of identical calls comparied to actual calls being made in both samples
-Warning
-In some applications, it may be preferable to subset a (random) selection of SNPs first - the
-calculation
-time increases as N(N - 1)M/2 . Typically for N = 800 samples and M = 3000 SNPs, the
-calculation time is about 1 minute. A full GWA scan could take hours, and quite unnecessary for
-simple applications such as checking for duplicate or related samples.
-Note
-This is mostly written to find mislabelled and/or duplicate samples.
-Illumina indexes their SNPs in alphabetical order so the mitochondria SNPs comes first - for most
-purpose it is undesirable to use these SNPs for IBS purposes.
-TODO: Worst-case S4 subsetting seems to make 2 copies of a large object, so one might want to
-subset before rbind(), etc; a future version of this routine may contain a built-in subsetting facility
-"""
-import sys,os,time,random,string,copy,optparse
-
-try:
- set
-except NameError:
- from Sets import Set as set
-
-from rgutils import timenow,pruneLD,plinke,openOrMakeLDreduced
-
-import plinkbinJZ
-
-
-opts = None
-verbose = False
-
-showPolygons = False
-
-class NullDevice:
- def write(self, s):
- pass
-
-tempstderr = sys.stderr # save
-sys.stderr = NullDevice()
-# need to avoid blather about deprecation and other strange stuff from scipy
-# the current galaxy job runner assumes that
-# the job is in error if anything appears on sys.stderr
-# grrrrr. James wants to keep it that way instead of using the
-# status flag for some strange reason. Presumably he doesn't use R or (in this case, scipy)
-import numpy
-import scipy
-from scipy import weave
-
-
-sys.stderr=tempstderr
-
-
-PROGNAME = os.path.split(sys.argv[0])[-1]
-X_AXIS_LABEL = 'Mean Alleles Shared'
-Y_AXIS_LABEL = 'SD Alleles Shared'
-LEGEND_ALIGN = 'topleft'
-LEGEND_TITLE = 'Relationship'
-DEFAULT_SYMBOL_SIZE = 1.0 # default symbol size
-DEFAULT_SYMBOL_SIZE = 0.5 # default symbol size
-
-### Some colors for R/rpy
-R_BLACK = 1
-R_RED = 2
-R_GREEN = 3
-R_BLUE = 4
-R_CYAN = 5
-R_PURPLE = 6
-R_YELLOW = 7
-R_GRAY = 8
-
-### ... and some point-styles
-
-###
-PLOT_HEIGHT = 600
-PLOT_WIDTH = 1150
-
-
-#SVG_COLORS = ('black', 'darkblue', 'blue', 'deepskyblue', 'firebrick','maroon','crimson')
-#SVG_COLORS = ('cyan','dodgerblue','mediumpurple', 'fuchsia', 'red','gold','gray')
-SVG_COLORS = ('cyan','dodgerblue','mediumpurple','forestgreen', 'lightgreen','gold','gray')
-# dupe,parentchild,sibpair,halfsib,parents,unrel,unkn
-#('orange', 'red', 'green', 'chartreuse', 'blue', 'purple', 'gray')
-
-OUTLIERS_HEADER = 'Mean\tSdev\tZ(mean)\tZ(sdev)\tFID1\tIID1\tFID2\tIID2\tMean(Rel_Mean)\tSdev(Rel_Mean)\tMean(Rel_Sdev)\tSdev(Rel_Sdev)\n'
-OUTLIERS_HEADER_list = ['Mean','Sdev','ZMean','ZSdev','FID1','IID1','FID2','IID2',
-'RGMean_M','RGMean_SD','RGSD_M','RGSD_SD']
-TABLE_HEADER='fid1 iid1\tfid2 iid2\tmean\tsdev\tzmean\tzsdev\tgeno\trelcode\n'
-
-
-### Relationship codes, text, and lookups/mappings
-N_RELATIONSHIP_TYPES = 7
-REL_DUPE, REL_PARENTCHILD, REL_SIBS, REL_HALFSIBS, REL_RELATED, REL_UNRELATED, REL_UNKNOWN = range(N_RELATIONSHIP_TYPES)
-REL_LOOKUP = {
- REL_DUPE: ('dupe', R_BLUE, 1),
- REL_PARENTCHILD: ('parentchild', R_YELLOW, 1),
- REL_SIBS: ('sibpairs', R_RED, 1),
- REL_HALFSIBS: ('halfsibs', R_GREEN, 1),
- REL_RELATED: ('parents', R_PURPLE, 1),
- REL_UNRELATED: ('unrelated', R_CYAN, 1),
- REL_UNKNOWN: ('unknown', R_GRAY, 1),
- }
-OUTLIER_STDEVS = {
- REL_DUPE: 2,
- REL_PARENTCHILD: 2,
- REL_SIBS: 2,
- REL_HALFSIBS: 2,
- REL_RELATED: 2,
- REL_UNRELATED: 3,
- REL_UNKNOWN: 2,
- }
-# note now Z can be passed in
-
-REL_STATES = [REL_LOOKUP[r][0] for r in range(N_RELATIONSHIP_TYPES)]
-REL_COLORS = SVG_COLORS
-REL_POINTS = [REL_LOOKUP[r][2] for r in range(N_RELATIONSHIP_TYPES)]
-
-DEFAULT_MAX_SAMPLE_SIZE = 10000
-
-REF_COUNT_HOM1 = 3
-REF_COUNT_HET = 2
-REF_COUNT_HOM2 = 1
-MISSING = 0
-MAX_SHOW_ROWS = 100 # framingham has millions - delays showing output page - so truncate and explain
-MARKER_PAIRS_PER_SECOND_SLOW = 15000000.0
-MARKER_PAIRS_PER_SECOND_FAST = 70000000.0
-
-
-galhtmlprefix = """<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="generator" content="Galaxy %s tool output - see http://g2.trac.bx.psu.edu/" />
-<title></title>
-<link rel="stylesheet" href="/static/style/base.css" type="text/css" />
-</head>
-<body>
-<div class="document">
-"""
-
-
-SVG_HEADER = '''<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.2//EN" "http://www.w3.org/Graphics/SVG/1.2/DTD/svg12.dtd">
-
-<svg width="1280" height="800"
- xmlns="http://www.w3.org/2000/svg" version="1.2"
- xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1280 800" onload="init()">
-
- <script type="text/ecmascript" xlink:href="/static/scripts/checkbox_and_radiobutton.js"/>
- <script type="text/ecmascript" xlink:href="/static/scripts/helper_functions.js"/>
- <script type="text/ecmascript" xlink:href="/static/scripts/timer.js"/>
- <script type="text/ecmascript">
- <![CDATA[
- var checkBoxes = new Array();
- var radioGroupBandwidth;
- var colours = ['%s','%s','%s','%s','%s','%s','%s'];
- function init() {
- var style = {"font-family":"Arial,Helvetica", "fill":"black", "font-size":12};
- var dist = 12;
- var yOffset = 4;
-
- //A checkBox for each relationship type dupe,parentchild,sibpair,halfsib,parents,unrel,unkn
- checkBoxes["dupe"] = new checkBox("dupe","checkboxes",20,40,"cbRect","cbCross",true,"Duplicate",style,dist,yOffset,undefined,hideShowLayer);
- checkBoxes["parentchild"] = new checkBox("parentchild","checkboxes",20,60,"cbRect","cbCross",true,"Parent-Child",style,dist,yOffset,undefined,hideShowLayer);
- checkBoxes["sibpairs"] = new checkBox("sibpairs","checkboxes",20,80,"cbRect","cbCross",true,"Sib-pairs",style,dist,yOffset,undefined,hideShowLayer);
- checkBoxes["halfsibs"] = new checkBox("halfsibs","checkboxes",20,100,"cbRect","cbCross",true,"Half-sibs",style,dist,yOffset,undefined,hideShowLayer);
- checkBoxes["parents"] = new checkBox("parents","checkboxes",20,120,"cbRect","cbCross",true,"Parents",style,dist,yOffset,undefined,hideShowLayer);
- checkBoxes["unrelated"] = new checkBox("unrelated","checkboxes",20,140,"cbRect","cbCross",true,"Unrelated",style,dist,yOffset,undefined,hideShowLayer);
- checkBoxes["unknown"] = new checkBox("unknown","checkboxes",20,160,"cbRect","cbCross",true,"Unknown",style,dist,yOffset,undefined,hideShowLayer);
-
- }
-
- function hideShowLayer(id, status, label) {
- var vis = "hidden";
- if (status) {
- vis = "visible";
- }
- document.getElementById(id).setAttributeNS(null, 'visibility', vis);
- }
-
- function showBTT(evt, rel, mm, dm, md, dd, n, mg, dg, lg, hg) {
- var x = parseInt(evt.pageX)-250;
- var y = parseInt(evt.pageY)-110;
- switch(rel) {
- case 0:
- fill = colours[rel];
- relt = "dupe";
- break;
- case 1:
- fill = colours[rel];
- relt = "parentchild";
- break;
- case 2:
- fill = colours[rel];
- relt = "sibpairs";
- break;
- case 3:
- fill = colours[rel];
- relt = "halfsibs";
- break;
- case 4:
- fill = colours[rel];
- relt = "parents";
- break;
- case 5:
- fill = colours[rel];
- relt = "unrelated";
- break;
- case 6:
- fill = colours[rel];
- relt = "unknown";
- break;
- default:
- fill = "cyan";
- relt = "ERROR_CODE: "+rel;
- }
-
- document.getElementById("btRel").textContent = "GROUP: "+relt;
- document.getElementById("btMean").textContent = "mean="+mm+" +/- "+dm;
- document.getElementById("btSdev").textContent = "sdev="+dm+" +/- "+dd;
- document.getElementById("btPair").textContent = "npairs="+n;
- document.getElementById("btGeno").textContent = "ngenos="+mg+" +/- "+dg+" (min="+lg+", max="+hg+")";
- document.getElementById("btHead").setAttribute('fill', fill);
-
- var tt = document.getElementById("btTip");
- tt.setAttribute("transform", "translate("+x+","+y+")");
- tt.setAttribute('visibility', 'visible');
- }
-
- function showOTT(evt, rel, s1, s2, mean, sdev, ngeno, rmean, rsdev) {
- var x = parseInt(evt.pageX)-150;
- var y = parseInt(evt.pageY)-180;
-
- switch(rel) {
- case 0:
- fill = colours[rel];
- relt = "dupe";
- break;
- case 1:
- fill = colours[rel];
- relt = "parentchild";
- break;
- case 2:
- fill = colours[rel];
- relt = "sibpairs";
- break;
- case 3:
- fill = colours[rel];
- relt = "halfsibs";
- break;
- case 4:
- fill = colours[rel];
- relt = "parents";
- break;
- case 5:
- fill = colours[rel];
- relt = "unrelated";
- break;
- case 6:
- fill = colours[rel];
- relt = "unknown";
- break;
- default:
- fill = "cyan";
- relt = "ERROR_CODE: "+rel;
- }
-
- document.getElementById("otRel").textContent = "PAIR: "+relt;
- document.getElementById("otS1").textContent = "s1="+s1;
- document.getElementById("otS2").textContent = "s2="+s2;
- document.getElementById("otMean").textContent = "mean="+mean;
- document.getElementById("otSdev").textContent = "sdev="+sdev;
- document.getElementById("otGeno").textContent = "ngenos="+ngeno;
- document.getElementById("otRmean").textContent = "relmean="+rmean;
- document.getElementById("otRsdev").textContent = "relsdev="+rsdev;
- document.getElementById("otHead").setAttribute('fill', fill);
-
- var tt = document.getElementById("otTip");
- tt.setAttribute("transform", "translate("+x+","+y+")");
- tt.setAttribute('visibility', 'visible');
- }
-
- function hideBTT(evt) {
- document.getElementById("btTip").setAttributeNS(null, 'visibility', 'hidden');
- }
-
- function hideOTT(evt) {
- document.getElementById("otTip").setAttributeNS(null, 'visibility', 'hidden');
- }
-
- ]]>
- </script>
- <defs>
- <!-- symbols for check boxes -->
- <symbol id="cbRect" overflow="visible">
- <rect x="-5" y="-5" width="10" height="10" fill="white" stroke="dimgray" stroke-width="1" cursor="pointer"/>
- </symbol>
- <symbol id="cbCross" overflow="visible">
- <g pointer-events="none" stroke="black" stroke-width="1">
- <line x1="-3" y1="-3" x2="3" y2="3"/>
- <line x1="3" y1="-3" x2="-3" y2="3"/>
- </g>
- </symbol>
- </defs>
-
-<desc>Developer Works Dynamic Scatter Graph Scaling Example</desc>
-
-<!-- Now Draw the main X and Y axis -->
-<g style="stroke-width:1.0; stroke:black; shape-rendering:crispEdges">
- <!-- X Axis top and bottom -->
- <path d="M 100 100 L 1250 100 Z"/>
- <path d="M 100 700 L 1250 700 Z"/>
-
- <!-- Y Axis left and right -->
- <path d="M 100 100 L 100 700 Z"/>
- <path d="M 1250 100 L 1250 700 Z"/>
-</g>
-
-<g transform="translate(100,100)">
-
- <!-- Grid Lines -->
- <g style="fill:none; stroke:#dddddd; stroke-width:1; stroke-dasharray:2,2; text-anchor:end; shape-rendering:crispEdges">
-
- <!-- Vertical grid lines -->
- <line x1="125" y1="0" x2="115" y2="600" />
- <line x1="230" y1="0" x2="230" y2="600" />
- <line x1="345" y1="0" x2="345" y2="600" />
- <line x1="460" y1="0" x2="460" y2="600" />
- <line x1="575" y1="0" x2="575" y2="600" style="stroke-dasharray:none;" />
- <line x1="690" y1="0" x2="690" y2="600" />
- <line x1="805" y1="0" x2="805" y2="600" />
- <line x1="920" y1="0" x2="920" y2="600" />
- <line x1="1035" y1="0" x2="1035" y2="600" />
-
- <!-- Horizontal grid lines -->
- <line x1="0" y1="60" x2="1150" y2="60" />
- <line x1="0" y1="120" x2="1150" y2="120" />
- <line x1="0" y1="180" x2="1150" y2="180" />
- <line x1="0" y1="240" x2="1150" y2="240" />
- <line x1="0" y1="300" x2="1150" y2="300" style="stroke-dasharray:none;" />
- <line x1="0" y1="360" x2="1150" y2="360" />
- <line x1="0" y1="420" x2="1150" y2="420" />
- <line x1="0" y1="480" x2="1150" y2="480" />
- <line x1="0" y1="540" x2="1150" y2="540" />
- </g>
-
- <!-- Legend -->
- <g style="fill:black; stroke:none" font-size="12" font-family="Arial" transform="translate(25,25)">
- <rect width="160" height="270" style="fill:none; stroke:black; shape-rendering:crispEdges" />
- <text x="5" y="20" style="fill:black; stroke:none;" font-size="13" font-weight="bold">Given Pair Relationship</text>
- <rect x="120" y="35" width="10" height="10" fill="%s" stroke="%s" stroke-width="1" cursor="pointer"/>
- <rect x="120" y="55" width="10" height="10" fill="%s" stroke="%s" stroke-width="1" cursor="pointer"/>
- <rect x="120" y="75" width="10" height="10" fill="%s" stroke="%s" stroke-width="1" cursor="pointer"/>
- <rect x="120" y="95" width="10" height="10" fill="%s" stroke="%s" stroke-width="1" cursor="pointer"/>
- <rect x="120" y="115" width="10" height="10" fill="%s" stroke="%s" stroke-width="1" cursor="pointer"/>
- <rect x="120" y="135" width="10" height="10" fill="%s" stroke="%s" stroke-width="1" cursor="pointer"/>
- <rect x="120" y="155" width="10" height="10" fill="%s" stroke="%s" stroke-width="1" cursor="pointer"/>
- <text x="15" y="195" style="fill:black; stroke:none" font-size="12" font-family="Arial" >Zscore gt 15</text>
- <circle cx="125" cy="192" r="6" style="stroke:red; fill:gold; fill-opacity:1.0; stroke-width:1;"/>
- <text x="15" y="215" style="fill:black; stroke:none" font-size="12" font-family="Arial" >Zscore 4 to 15</text>
- <circle cx="125" cy="212" r="3" style="stroke:gold; fill:gold; fill-opacity:1.0; stroke-width:1;"/>
- <text x="15" y="235" style="fill:black; stroke:none" font-size="12" font-family="Arial" >Zscore lt 4</text>
- <circle cx="125" cy="232" r="2" style="stroke:gold; fill:gold; fill-opacity:1.0; stroke-width:1;"/>
- <g id="checkboxes">
- </g>
- </g>
-
-
- <g style='fill:black; stroke:none' font-size="17" font-family="Arial">
- <!-- X Axis Labels -->
- <text x="480" y="660">Mean Alleles Shared</text>
- <text x="0" y="630" >1.0</text>
- <text x="277" y="630" >1.25</text>
- <text x="564" y="630" >1.5</text>
- <text x="842" y="630" >1.75</text>
- <text x="1140" y="630" >2.0</text>
- </g>
-
- <g transform="rotate(270)" style="fill:black; stroke:none" font-size="17" font-family="Arial">
- <!-- Y Axis Labels -->
- <text x="-350" y="-40">SD Alleles Shared</text>
- <text x="-20" y="-10" >1.0</text>
- <text x="-165" y="-10" >0.75</text>
- <text x="-310" y="-10" >0.5</text>
- <text x="-455" y="-10" >0.25</text>
- <text x="-600" y="-10" >0.0</text>
- </g>
-
-<!-- Plot Title -->
-<g style="fill:black; stroke:none" font-size="18" font-family="Arial">
- <text x="425" y="-30">%s</text>
-</g>
-
-<!-- One group/layer of points for each relationship type -->
-'''
-
-SVG_FOOTER = '''
-<!-- End of Data -->
-</g>
-<g id="btTip" visibility="hidden" style="stroke-width:1.0; fill:black; stroke:none;" font-size="10" font-family="Arial">
- <rect width="250" height="110" style="fill:silver" rx="2" ry="2"/>
- <rect id="btHead" width="250" height="20" rx="2" ry="2" />
- <text id="btRel" y="14" x="85">unrelated</text>
- <text id="btMean" y="40" x="4">mean=1.5 +/- 0.04</text>
- <text id="btSdev" y="60" x="4">sdev=0.7 +/- 0.03</text>
- <text id="btPair" y="80" x="4">npairs=1152</text>
- <text id="btGeno" y="100" x="4">ngenos=4783 +/- 24 (min=1000, max=5000)</text>
-</g>
-
-<g id="otTip" visibility="hidden" style="stroke-width:1.0; fill:black; stroke:none;" font-size="10" font-family="Arial">
- <rect width="150" height="180" style="fill:silver" rx="2" ry="2"/>
- <rect id="otHead" width="150" height="20" rx="2" ry="2" />
- <text id="otRel" y="14" x="40">sibpairs</text>
- <text id="otS1" y="40" x="4">s1=fid1,iid1</text>
- <text id="otS2" y="60" x="4">s2=fid2,iid2</text>
- <text id="otMean" y="80" x="4">mean=1.82</text>
- <text id="otSdev" y="100" x="4">sdev=0.7</text>
- <text id="otGeno" y="120" x="4">ngeno=4487</text>
- <text id="otRmean" y="140" x="4">relmean=1.85</text>
- <text id="otRsdev" y="160" x="4">relsdev=0.65</text>
-</g>
-</svg>
-'''
-
-OUTLIERS_HEADER = 'Mean\tSdev\tZ(mean)\tZ(sdev)\tFID1\tIID1\tFID2\tIID2\tMean(Mean)\tSdev(Mean)\tMean(Sdev)\tSdev(Sdev)\n'
-
-DEFAULT_MAX_SAMPLE_SIZE = 5000
-
-REF_COUNT_HOM1 = 3
-REF_COUNT_HET = 2
-REF_COUNT_HOM2 = 1
-MISSING = 0
-
-MARKER_PAIRS_PER_SECOND_SLOW = 15000000
-MARKER_PAIRS_PER_SECOND_FAST = 70000000
-
-POLYGONS = {
- REL_UNRELATED: ((1.360, 0.655), (1.385, 0.730), (1.620, 0.575), (1.610, 0.505)),
- REL_HALFSIBS: ((1.630, 0.500), (1.630, 0.550), (1.648, 0.540), (1.648, 0.490)),
- REL_SIBS: ((1.660, 0.510), (1.665, 0.560), (1.820, 0.410), (1.820, 0.390)),
- REL_PARENTCHILD: ((1.650, 0.470), (1.650, 0.490), (1.750, 0.440), (1.750, 0.420)),
- REL_DUPE: ((1.970, 0.000), (1.970, 0.150), (2.000, 0.150), (2.000, 0.000)),
- }
-
-def distance(point1, point2):
- """ Calculate the distance between two points
- """
- (x1,y1) = [float(d) for d in point1]
- (x2,y2) = [float(d) for d in point2]
- dx = abs(x1 - x2)
- dy = abs(y1 - y2)
- return math.sqrt(dx**2 + dy**2)
-
-def point_inside_polygon(x, y, poly):
- """ Determine if a point (x,y) is inside a given polygon or not
- poly is a list of (x,y) pairs.
-
- Taken from: http://www.ariel.com.au/a/python-point-int-poly.html
- """
-
- n = len(poly)
- inside = False
-
- p1x,p1y = poly[0]
- for i in range(n+1):
- p2x,p2y = poly[i % n]
- if y > min(p1y,p2y):
- if y <= max(p1y,p2y):
- if x <= max(p1x,p2x):
- if p1y != p2y:
- xinters = (y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x
- if p1x == p2x or x <= xinters:
- inside = not inside
- p1x,p1y = p2x,p2y
- return inside
-
-def readMap(pedfile):
- """
- """
- mapfile = pedfile.replace('.ped', '.map')
- marker_list = []
- if os.path.exists(mapfile):
- print 'readMap: %s' % (mapfile)
- fh = file(mapfile, 'r')
- for line in fh:
- marker_list.append(line.strip().split())
- fh.close()
- print 'readMap: %s markers' % (len(marker_list))
- return marker_list
-
-def calcMeanSD(useme):
- """
- A numerically stable algorithm is given below. It also computes the mean.
- This algorithm is due to Knuth,[1] who cites Welford.[2]
- n = 0
- mean = 0
- M2 = 0
-
- foreach x in data:
- n = n + 1
- delta = x - mean
- mean = mean + delta/n
- M2 = M2 + delta*(x - mean) // This expression uses the new value of mean
- end for
-
- variance_n = M2/n
- variance = M2/(n - 1)
- """
- mean = 0.0
- M2 = 0.0
- sd = 0.0
- n = len(useme)
- if n > 1:
- for i,x in enumerate(useme):
- delta = x - mean
- mean = mean + delta/(i+1) # knuth uses n+=1 at start
- M2 = M2 + delta*(x - mean) # This expression uses the new value of mean
- variance = M2/(n-1) # assume is sample so lose 1 DOF
- sd = pow(variance,0.5)
- return mean,sd
-
-
-def doIBSpy(ped=None,basename='',outdir=None,logf=None,
- nrsSamples=10000,title='title',pdftoo=0,Zcutoff=2.0):
- #def doIBS(pedName, title, nrsSamples=None, pdftoo=False):
- """ started with snpmatrix but GRR uses actual IBS counts and sd's
- """
- repOut = [] # text strings to add to the html display
- refallele = {}
- tblf = '%s_table.xls' % (title)
- tbl = file(os.path.join(outdir,tblf), 'w')
- tbl.write(TABLE_HEADER)
- svgf = '%s.svg' % (title)
- svg = file(os.path.join(outdir,svgf), 'w')
-
- nMarkers = len(ped._markers)
- if nMarkers < 5:
- print sys.stderr, '### ERROR - %d is too few markers for reliable estimation in %s - terminating' % (nMarkers,PROGNAME)
- sys.exit(1)
- nSubjects = len(ped._subjects)
- nrsSamples = min(nMarkers, nrsSamples)
- if opts and opts.use_mito:
- markers = range(nMarkers)
- nrsSamples = min(len(markers), nrsSamples)
- sampleIndexes = sorted(random.sample(markers, nrsSamples))
- else:
- autosomals = ped.autosomal_indices()
- nrsSamples = min(len(autosomals), nrsSamples)
- sampleIndexes = sorted(random.sample(autosomals, nrsSamples))
-
- print ''
- print 'Getting random.sample of %s from %s total' % (nrsSamples, nMarkers)
- npairs = (nSubjects*(nSubjects-1))/2 # total rows in table
- newfiles=[svgf,tblf]
- explanations = ['rgGRR Plot (requires SVG)','Mean by SD alleles shared - %d rows' % npairs]
- # these go with the output file links in the html file
- s = 'Reading genotypes for %s subjects and %s markers\n' % (nSubjects, nrsSamples)
- logf.write(s)
- minUsegenos = nrsSamples/2 # must have half?
- nGenotypes = nSubjects*nrsSamples
- stime = time.time()
- emptyRows = set()
- genos = numpy.zeros((nSubjects, nrsSamples), dtype=int)
- for s in xrange(nSubjects):
- nValid = 0
- #getGenotypesByIndices(self, s, mlist, format)
- genos[s] = ped.getGenotypesByIndices(s, sampleIndexes, format='ref')
- nValid = sum([1 for g in genos[s] if g])
- if not nValid:
- emptyRows.add(s)
- sub = ped.getSubject(s)
- print 'All missing for row %d (%s)' % (s, sub)
- logf.write('All missing for row %d (%s)\n' % (s, sub))
- rtime = time.time() - stime
- if verbose:
- print '@@Read %s genotypes in %s seconds' % (nGenotypes, rtime)
-
-
- ### Now the expensive part. For each pair of subjects, we get the mean number
- ### and standard deviation of shared alleles over all of the markers where both
- ### subjects have a known genotype. Identical subjects should have mean shared
- ### alleles very close to 2.0 with a standard deviation very close to 0.0.
- tot = nSubjects*(nSubjects-1)/2
- nprog = tot/10
- nMarkerpairs = tot * nrsSamples
- estimatedTimeSlow = nMarkerpairs/MARKER_PAIRS_PER_SECOND_SLOW
- estimatedTimeFast = nMarkerpairs/MARKER_PAIRS_PER_SECOND_FAST
-
- pairs = []
- pair_data = {}
- means = [] ## Mean IBS for each pair
- ngenoL = [] ## Count of comparable genotypes for each pair
- sdevs = [] ## Standard dev for each pair
- rels = [] ## A relationship code for each pair
- zmeans = [0.0 for x in xrange(tot)] ## zmean score for each pair for the relgroup
- zstds = [0.0 for x in xrange(tot)] ## zstd score for each pair for the relgrp
- skip = set()
- ndone = 0 ## How many have been done so far
-
- logf.write('Calculating %d pairs...\n' % (tot))
- logf.write('Estimated time is %2.2f to %2.2f seconds ...\n' % (estimatedTimeFast, estimatedTimeSlow))
-
- t1sum = 0
- t2sum = 0
- t3sum = 0
- now = time.time()
- scache = {}
- _founder_cache = {}
- C_CODE = """
- #include "math.h"
- int i;
- int sumibs = 0;
- int ssqibs = 0;
- int ngeno = 0;
- float mean = 0;
- float M2 = 0;
- float delta = 0;
- float sdev=0;
- float variance=0;
- for (i=0; i<nrsSamples; i++) {
- int a1 = g1[i];
- int a2 = g2[i];
- if (a1 != 0 && a2 != 0) {
- ngeno += 1;
- int shared = 2-abs(a1-a2);
- delta = shared - mean;
- mean = mean + delta/ngeno;
- M2 += delta*(shared-mean);
- // yes that second time, the updated mean is used see calcmeansd above;
- //printf("%d %d %d %d %d %d\\n", i, a1, a2, ngeno, shared, squared);
- }
- }
- if (ngeno > 1) {
- variance = M2/(ngeno-1);
- sdev = sqrt(variance);
- //printf("OK: %d %3.2f %3.2f\\n", ngeno, mean, sdev);
- }
- //printf("%d %d %d %1.2f %1.2f\\n", ngeno, sumibs, ssqibs, mean, sdev);
- result[0] = ngeno;
- result[1] = mean;
- result[2] = sdev;
- return_val = ngeno;
- """
- started = time.time()
- for s1 in xrange(nSubjects):
- if s1 in emptyRows:
- continue
- (fid1,iid1,did1,mid1,sex1,phe1,iid1,d_sid1,m_sid1) = scache.setdefault(s1, ped.getSubject(s1))
-
- isFounder1 = _founder_cache.setdefault(s1, (did1==mid1))
- g1 = genos[s1]
-
- for s2 in xrange(s1+1, nSubjects):
- if s2 in emptyRows:
- continue
- t1s = time.time()
-
- (fid2,iid2,did2,mid2,sex2,phe2,iid2,d_sid2,m_sid2) = scache.setdefault(s2, ped.getSubject(s2))
-
- g2 = genos[s2]
- isFounder2 = _founder_cache.setdefault(s2, (did2==mid2))
-
- # Determine the relationship for this pair
- relcode = REL_UNKNOWN
- if (fid2 == fid1):
- if iid1 == iid2:
- relcode = REL_DUPE
- elif (did2 == did1) and (mid2 == mid1) and did1 != mid1:
- relcode = REL_SIBS
- elif (iid1 == mid2) or (iid1 == did2) or (iid2 == mid1) or (iid2 == did1):
- relcode = REL_PARENTCHILD
- elif (str(did1) != '0' and (did2 == did1)) or (str(mid1) != '0' and (mid2 == mid1)):
- relcode = REL_HALFSIBS
- else:
- # People in the same family should be marked as some other
- # form of related. In general, these people will have a
- # pretty random spread of similarity. This distinction is
- # probably not very useful most of the time
- relcode = REL_RELATED
- else:
- ### Different families
- relcode = REL_UNRELATED
-
- t1e = time.time()
- t1sum += t1e-t1s
-
-
- ### Calculate sum(2-abs(a1-a2)) and sum((2-abs(a1-a2))**2) and count
- ### the number of contributing genotypes. These values are not actually
- ### calculated here, but instead are looked up in a table for speed.
- ### FIXME: This is still too slow ...
- result = [0.0, 0.0, 0.0]
- ngeno = weave.inline(C_CODE, ['g1', 'g2', 'nrsSamples', 'result'])
- if ngeno >= minUsegenos:
- _, mean, sdev = result
- means.append(mean)
- sdevs.append(sdev)
- ngenoL.append(ngeno)
- pairs.append((s1, s2))
- rels.append(relcode)
- else:
- skip.add(ndone) # signal no comparable genotypes for this pair
- ndone += 1
- t2e = time.time()
- t2sum += t2e-t1e
- t3e = time.time()
- t3sum += t3e-t2e
-
- logme = [ 'T1: %s' % (t1sum), 'T2: %s' % (t2sum), 'T3: %s' % (t3sum),'TOT: %s' % (t3e-now),
- '%s pairs with no (or not enough) comparable genotypes (%3.1f%%)' % (len(skip),
- float(len(skip))/float(tot)*100)]
- logf.write('%s\n' % '\t'.join(logme))
- ### Calculate mean and standard deviation of scores on a per relationship
- ### type basis, allowing us to flag outliers for each particular relationship
- ### type
- relstats = {}
- relCounts = {}
- outlierFiles = {}
- for relCode, relInfo in REL_LOOKUP.items():
- relName, relColor, relStyle = relInfo
- useme = [means[x] for x in xrange(len(means)) if rels[x] == relCode]
- relCounts[relCode] = len(useme)
- mm = scipy.mean(useme)
- ms = scipy.std(useme)
- useme = [sdevs[x] for x in xrange(len(sdevs)) if rels[x] == relCode]
- sm = scipy.mean(useme)
- ss = scipy.std(useme)
- relstats[relCode] = {'sd':(sm,ss), 'mean':(mm,ms)}
- logf.write('Relstate %s: mean(mean)=%3.2f sdev(mean)=%3.2f, mean(sdev)=%3.2f sdev(sdev)=%3.2f\n' % (relName, mm, ms, sm, ss))
-
- ### now fake z scores for each subject like abecasis recommends max(|zmu|,|zsd|)
- ### within each group, for each pair, z=(groupmean-pairmean)/groupsd
- available = len(means)
- logf.write('%d pairs are available of %d\n' % (available, tot))
- ### s = '\nOutliers:\nrelationship\tzmean\tzsd\tped1\tped2\tmean\tsd\trmeanmean\trmeansd\trsdmean\trsdsd\n'
- ### logf.write(s)
- pairnum = 0
- offset = 0
- nOutliers = 0
- cexs = []
- outlierRecords = dict([(r, []) for r in range(N_RELATIONSHIP_TYPES)])
- zsdmax = 0
- for s1 in range(nSubjects):
- if s1 in emptyRows:
- continue
- (fid1,iid1,did1,mid1,sex1,aff1,ok1,d_sid1,m_sid1) = scache[s1]
- for s2 in range(s1+1, nSubjects):
- if s2 in emptyRows:
- continue
- if pairnum not in skip:
- ### Get group stats for this relationship
- (fid2,iid2,did2,mid2,sex2,aff2,ok2,d_sid2,m_sid2) = scache[s2]
- try:
- r = rels[offset]
- except IndexError:
- logf.write('###OOPS offset %d available %d pairnum %d len(rels) %d', offset, available, pairnum, len(rels))
- rmm,rmd = relstats[r]['mean'] # group mean, group meansd alleles shared
- rdm,rdd = relstats[r]['sd'] # group sdmean, group sdsd alleles shared
-
- try:
- zsd = (sdevs[offset] - rdm)/rdd # distance from group mean in group sd units
- except:
- zsd = 1
- if abs(zsd) > zsdmax:
- zsdmax = zsd # keep for sort scaling
- try:
- zmean = (means[offset] - rmm)/rmd # distance from group mean
- except:
- zmean = 1
- zmeans[offset] = zmean
- zstds[offset] = zsd
- pid=(s1,s2)
- zrad = max(zsd,zmean)
- if zrad < 4:
- zrad = 2
- elif 4 < zrad < 15:
- zrad = 3 # to 9
- else: # > 15 6=24+
- zrad=zrad/4
- zrad = min(zrad,6) # scale limit
- zrad = max(2,max(zsd,zmean)) # as > 2, z grows
- pair_data[pid] = (zmean,zsd,r,zrad)
- if max(zsd,zmean) > Zcutoff: # is potentially interesting
- mean = means[offset]
- sdev = sdevs[offset]
- outlierRecords[r].append((mean, sdev, zmean, zsd, fid1, iid1, fid2, iid2, rmm, rmd, rdm, rdd))
- nOutliers += 1
- tbl.write('%s_%s\t%s_%s\t%f\t%f\t%f\t%f\t%d\t%s\n' % \
- (fid1, iid1, fid2, iid2, mean, sdev, zmean,zsd, ngeno, relcode))
- offset += 1
- pairnum += 1
- logf.write( 'Outliers: %s\n' % (nOutliers))
-
- ### Write outlier files for each relationship type
- repOut.append('<h2>Outliers in tab delimited files linked above are also listed below</h2>')
- lzsd = round(numpy.log10(zsdmax)) + 1
- scalefactor = 10**lzsd
- for relCode, relInfo in REL_LOOKUP.items():
- relName, _, _ = relInfo
- outliers = outlierRecords[relCode]
- if not outliers:
- continue
- outliers = [(scalefactor*int(abs(x[3]))+ int(abs(x[2])),x) for x in outliers] # decorate
- outliers.sort()
- outliers.reverse() # largest deviation first
- outliers = [x[1] for x in outliers] # undecorate
- nrows = len(outliers)
- truncated = 0
- if nrows > MAX_SHOW_ROWS:
- s = '<h3>%s outlying pairs (top %d of %d) from %s</h3><table border="0" cellpadding="3">' % (relName,
- MAX_SHOW_ROWS,nrows,title)
- truncated = nrows - MAX_SHOW_ROWS
- else:
- s = '<h3>%s outlying pairs (n=%d) from %s</h3><table border="0" cellpadding="3">' % (relName,nrows,title)
- repOut.append(s)
- fhname = '%s_rgGRR_%s_outliers.xls' % (title, relName)
- fhpath = os.path.join(outdir,fhname)
- fh = open(fhpath, 'w')
- newfiles.append(fhname)
- explanations.append('%s Outlier Pairs %s, N=%d, Cutoff SD=%f' % (relName,title,len(outliers),Zcutoff))
- fh.write(OUTLIERS_HEADER)
- s = ''.join(['<th>%s</th>' % x for x in OUTLIERS_HEADER_list])
- repOut.append('<tr align="center">%s</tr>' % s)
- for n,rec in enumerate(outliers):
- #(mean, sdev, zmean, zsd, fid1, iid1, fid2, iid2, rmm, rmd, rdm, rdd) = rec
- fh.write('%f\t%f\t%f\t%f\t%s\t%s\t%s\t%s\t%f\t%f\t%f\t%f\n' % tuple(rec))
- # (mean, sdev, zmean, zsd, fid1, iid1, fid2, iid2, rmm, rmd, rdm, rdd))
- s = '''<td>%f</td><td>%f</td><td>%f</td><td>%f</td><td>%s</td><td>%s</td>
- <td>%s</td><td>%s</td><td>%f</td><td>%f</td><td>%f</td><td>%f</td>''' % tuple(rec)
- if n < MAX_SHOW_ROWS:
- repOut.append('<tr align="center">%s</tr>' % s)
- if truncated > 0:
- repOut.append('<H2>WARNING: %d rows truncated - see outlier file for all %d rows</H2>' % (truncated,
- nrows))
- fh.close()
- repOut.append('</table><p>')
-
- ### Now, draw the plot in jpeg and svg formats, and optionally in the PDF format
- ### if requested
- logf.write('Plotting ...')
- pointColors = [REL_COLORS[rel] for rel in rels]
- pointStyles = [REL_POINTS[rel] for rel in rels]
-
- mainTitle = '%s (%s subjects, %d snp)' % (title, nSubjects, nrsSamples)
- svg.write(SVG_HEADER % (SVG_COLORS[0],SVG_COLORS[1],SVG_COLORS[2],SVG_COLORS[3],SVG_COLORS[4],
- SVG_COLORS[5],SVG_COLORS[6],SVG_COLORS[0],SVG_COLORS[0],SVG_COLORS[1],SVG_COLORS[1],
- SVG_COLORS[2],SVG_COLORS[2],SVG_COLORS[3],SVG_COLORS[3],SVG_COLORS[4],SVG_COLORS[4],
- SVG_COLORS[5],SVG_COLORS[5],SVG_COLORS[6],SVG_COLORS[6],mainTitle))
- #rpy.r.jpeg(filename='%s.jpg' % (title), width=1600, height=1200, pointsize=12, quality=100, bg='white')
- #rpy.r.par(mai=(1,1,1,0.5))
- #rpy.r('par(xaxs="i",yaxs="i")')
- #rpy.r.plot(means, sdevs, main=mainTitle, ylab=Y_AXIS_LABEL, xlab=X_AXIS_LABEL, cex=cexs, col=pointColors, pch=pointStyles, xlim=(0,2), ylim=(0,2))
- #rpy.r.legend(LEGEND_ALIGN, legend=REL_STATES, pch=REL_POINTS, col=REL_COLORS, title=LEGEND_TITLE)
- #rpy.r.grid(nx=10, ny=10, col='lightgray', lty='dotted')
- #rpy.r.dev_off()
-
- ### We will now go through each relationship type to partition plot points
- ### into "bulk" and "outlier" groups. Bulk points will represent common
- ### mean/sdev pairs and will cover the majority of the points in the plot --
- ### they will use generic tooltip informtion about all of the pairs
- ### represented by that point. "Outlier" points will be uncommon pairs,
- ### with very specific information in their tooltips. It would be nice to
- ### keep hte total number of plotted points in the SVG representation to
- ### ~10000 (certainly less than 100000?)
- pointMap = {}
- orderedRels = [y[1] for y in reversed(sorted([(relCounts.get(x, 0),x) for x in REL_LOOKUP.keys()]))]
- # do we really want this? I want out of zone points last and big
- for relCode in orderedRels:
- svgColor = SVG_COLORS[relCode]
- relName, relColor, relStyle = REL_LOOKUP[relCode]
- svg.write('<g id="%s" style="stroke:%s; fill:%s; fill-opacity:1.0; stroke-width:1;" cursor="pointer">\n' % (relName, svgColor, svgColor))
- pMap = pointMap.setdefault(relCode, {})
- nPoints = 0
- rpairs=[]
- rgenos=[]
- rmeans=[]
- rsdevs=[]
- rz = []
- for x,rel in enumerate(rels): # all pairs
- if rel == relCode:
- s1,s2 = pairs[x]
- pid=(s1,s2)
- zmean,zsd,r,zrad = pair_data[pid][:4]
- rpairs.append(pairs[x])
- rgenos.append(ngenoL[x])
- rmeans.append(means[x])
- rsdevs.append(sdevs[x])
- rz.append(zrad)
- ### Now add the svg point group for this relationship to the svg file
- for x in range(len(rmeans)):
- svgX = '%d' % ((rmeans[x] - 1.0) * PLOT_WIDTH) # changed so mean scale is 1-2
- svgY = '%d' % (PLOT_HEIGHT - (rsdevs[x] * PLOT_HEIGHT)) # changed so sd scale is 0-1
- s1, s2 = rpairs[x]
- (fid1,uid1,did1,mid1,sex1,phe1,iid1,d_sid1,m_sid1) = scache[s1]
- (fid2,uid2,did2,mid2,sex2,phe2,iid2,d_sid2,m_sid2) = scache[s2]
- ngenos = rgenos[x]
- nPoints += 1
- point = pMap.setdefault((svgX, svgY), [])
- point.append((rmeans[x], rsdevs[x], fid1, iid1, did1, mid1, fid2, iid2, did2, mid2, ngenos,rz[x]))
- for (svgX, svgY) in pMap:
- points = pMap[(svgX, svgY)]
- svgX = int(svgX)
- svgY = int(svgY)
- if len(points) > 1:
- mmean,dmean = calcMeanSD([p[0] for p in points])
- msdev,dsdev = calcMeanSD([p[1] for p in points])
- mgeno,dgeno = calcMeanSD([p[-1] for p in points])
- mingeno = min([p[-1] for p in points])
- maxgeno = max([p[-1] for p in points])
- svg.write("""<circle cx="%d" cy="%d" r="2"
- onmouseover="showBTT(evt, %d, %1.2f, %1.2f, %1.2f, %1.2f, %d, %d, %d, %d, %d)"
- onmouseout="hideBTT(evt)" />\n""" % (svgX, svgY, relCode, mmean, dmean, msdev, dsdev, len(points), mgeno, dgeno, mingeno, maxgeno))
- else:
- mean, sdev, fid1, iid1, did1, mid1, fid2, iid2, did2, mid2, ngenos, zrad = points[0][:12]
- rmean = float(relstats[relCode]['mean'][0])
- rsdev = float(relstats[relCode]['sd'][0])
- if zrad < 4:
- zrad = 2
- elif 4 < zrad < 9:
- zrad = 3 # to 9
- else: # > 9 5=15+
- zrad=zrad/3
- zrad = min(zrad,5) # scale limit
- if zrad <= 3:
- svg.write('<circle cx="%d" cy="%d" r="%s" onmouseover="showOTT(evt, %d, \'%s,%s,%s,%s\', \'%s,%s,%s,%s\', %1.2f, %1.2f, %s, %1.2f, %1.2f)" onmouseout="hideOTT(evt)" />\n' % (svgX, svgY, zrad, relCode, fid1, iid1, did1, mid1, fid2, iid2, did2, mid2, mean, sdev, ngenos, rmean, rsdev))
- else: # highlight pairs a long way from expectation by outlining circle in red
- svg.write("""<circle cx="%d" cy="%d" r="%s" style="stroke:red; fill:%s; fill-opacity:1.0; stroke-width:1;"
- onmouseover="showOTT(evt, %d, \'%s,%s,%s,%s\', \'%s,%s,%s,%s\', %1.2f, %1.2f, %s, %1.2f, %1.2f)"
- onmouseout="hideOTT(evt)" />\n""" % \
- (svgX, svgY, zrad, svgColor, relCode, fid1, iid1, did1, mid1, fid2, iid2, did2, mid2, mean, sdev, ngenos, rmean, rsdev))
- svg.write('</g>\n')
-
- ### Create a pdf as well if indicated on the command line
- ### WARNING! for framingham share, with about 50M pairs, this is a 5.5GB pdf!
-## if pdftoo:
-## pdfname = '%s.pdf' % (title)
-## rpy.r.pdf(pdfname, 6, 6)
-## rpy.r.par(mai=(1,1,1,0.5))
-## rpy.r('par(xaxs="i",yaxs="i")')
-## rpy.r.plot(means, sdevs, main='%s, %d snp' % (title, nSamples), ylab=Y_AXIS_LABEL, xlab=X_AXIS_LABEL, cex=cexs, col=pointColors, pch=pointStyles, xlim=(0,2), ylim=(0,2))
-## rpy.r.legend(LEGEND_ALIGN, legend=REL_STATES, pch=REL_POINTS, col=REL_COLORS, title=LEGEND_TITLE)
-## rpy.r.grid(nx=10, ny=10, col='lightgray', lty='dotted')
-## rpy.r.dev_off()
-
- ### Draw polygons
- if showPolygons:
- svg.write('<g id="polygons" cursor="pointer">\n')
- for rel, poly in POLYGONS.items():
- points = ' '.join(['%s,%s' % ((p[0]-1.0)*float(PLOT_WIDTH), (PLOT_HEIGHT - p[1]*PLOT_HEIGHT)) for p in poly])
- svg.write('<polygon points="%s" fill="transparent" style="stroke:%s; stroke-width:1"/>\n' % (points, SVG_COLORS[rel]))
- svg.write('</g>\n')
-
-
- svg.write(SVG_FOOTER)
- svg.close()
- return newfiles,explanations,repOut
-
-def doIBS(n=100):
- """parse parameters from galaxy
- expect 'input pbed path' 'basename' 'outpath' 'title' 'logpath' 'n'
- <command interpreter="python">
- rgGRR.py $i.extra_files_path/$i.metadata.base_name "$i.metadata.base_name"
- '$out_file1' '$out_file1.files_path' "$title1" '$n' '$Z' '$force'
- </command>
-
- """
- u="""<command interpreter="python">
- rgGRR.py $i.extra_files_path/$i.metadata.base_name "$i.metadata.base_name"
- '$out_file1' '$out_file1.files_path' "$title" '$n' '$Z' '$force'
- </command>"""
-
- if len(sys.argv) < 9:
- print >> sys.stdout, 'Need pbed inpath, basename, out_htmlname, outpath, title, logpath, nSNP, Zcutoff on command line please'
- print >> sys.stdout, u
- sys.exit(1)
- ts = '%s%s' % (string.punctuation,string.whitespace)
- ptran = string.maketrans(ts,'_'*len(ts))
- inpath = sys.argv[1]
- ldpath = os.path.split(inpath)[0]
- basename = sys.argv[2]
- outhtml = sys.argv[3]
- newfilepath = sys.argv[4]
- title = sys.argv[5].translate(ptran)
- logfname = 'Log_%s.txt' % title
- logpath = os.path.join(newfilepath,logfname) # log was a child - make part of html extra_files_path zoo
- n = int(sys.argv[6])
- try:
- Zcutoff = float(sys.argv[7])
- except:
- Zcutoff = 2.0
- if sys.argv[7].lower()=='true':
- forcerebuild = True
- else:
- forcerebuild = False
- try:
- os.makedirs(newfilepath)
- except:
- pass
- logf = file(logpath,'w')
- efp,ibase_name = os.path.split(inpath) # need to use these for outputs in files_path
- ped,loglines = openOrMakeLDreduced(basename,ldpath,plinke,forcerebuild)
- if ped == None:
- print >> sys.stderr, '## doIBSpy problem - cannot open %s or %s - cannot run' % (ldreduced,basename)
- sys.exit(1)
- if len(loglines) > 0:
- logf.write('### first time for this input file - log from creating an ld reduced and thinned data set:\n')
- logf.write(''.join(loglines))
- logf.write('\n')
- newfiles,explanations,repOut = doIBSpy(ped=ped,basename=basename,outdir=newfilepath,
- logf=logf,nrsSamples=n,title=title,pdftoo=0,Zcutoff=Zcutoff)
- logf.close()
- logfs = file(logpath,'r').readlines()
- lf = file(outhtml,'w')
- lf.write(galhtmlprefix % PROGNAME)
- # this is a mess. todo clean up - should each datatype have it's own directory? Yes
- # probably. Then titles are universal - but userId libraries are separate.
- s = '<div>Output from %s run at %s<br>\n' % (PROGNAME,timenow())
- lf.write('<h4>%s</h4>\n' % s)
- fixed = ["'%s'" % x for x in sys.argv] # add quotes just in case
- s = 'If you need to rerun this analysis, the command line was\n<pre>%s</pre>\n</div>' % (' '.join(fixed))
- lf.write(s)
- # various ways of displaying svg - experiments related to missing svg mimetype on test (!)
- #s = """<object data="%s" type="image/svg+xml" width="%d" height="%d">
- # <embed src="%s" type="image/svg+xml" width="%d" height="%d" />
- # </object>""" % (newfiles[0],PLOT_WIDTH,PLOT_HEIGHT,newfiles[0],PLOT_WIDTH,PLOT_HEIGHT)
- s = """ <embed src="%s" type="image/svg+xml" width="%d" height="%d" />""" % (newfiles[0],PLOT_WIDTH,PLOT_HEIGHT)
- #s = """ <iframe src="%s" type="image/svg+xml" width="%d" height="%d" />""" % (newfiles[0],PLOT_WIDTH,PLOT_HEIGHT)
- lf.write(s)
- lf.write('<div><h4>Click the links below to save output files and plots</h4><br><ol>\n')
- for i in range(len(newfiles)):
- if i == 0:
- lf.write('<li><a href="%s" type="image/svg+xml" >%s</a></li>\n' % (newfiles[i],explanations[i]))
- else:
- lf.write('<li><a href="%s">%s</a></li>\n' % (newfiles[i],explanations[i]))
- flist = os.listdir(newfilepath)
- for fname in flist:
- if not fname in newfiles:
- lf.write('<li><a href="%s">%s</a></li>\n' % (fname,fname))
- lf.write('</ol></div>')
- lf.write('<div>%s</div>' % ('\n'.join(repOut))) # repOut is a list of tables
- lf.write('<div><hr><h3>Log from this job (also stored in %s)</h3><pre>%s</pre><hr></div>' % (logfname,'\n'.join(logfs)))
- lf.write('</body></html>\n')
- lf.close()
- logf.close()
-
-if __name__ == '__main__':
- doIBS()
+"""
+# july 2009: Need to see outliers so need to draw them last?
+# could use clustering on the zscores to guess real relationships for unrelateds
+# but definitely need to draw last
+# added MAX_SHOW_ROWS to limit the length of the main report page
+# Changes for Galaxy integration
+# added more robust knuth method for one pass mean and sd
+# no difference really - let's use scipy.mean() and scipy.std() instead...
+# fixed labels and changed to .xls for outlier reports so can open in excel
+# interesting - with a few hundred subjects, 5k gives good resolution
+# and 100k gives better but not by much
+# TODO remove non autosomal markers
+# TODO it would be best if label had the zmean and zsd as these are what matter for
+# outliers rather than the group mean/sd
+# mods to rgGRR.py from channing CVS which John Ziniti has rewritten to produce SVG plots
+# to make a Galaxy tool - we need the table of mean and SD for interesting pairs, the SVG and the log
+# so the result should be an HTML file
+
+# rgIBS.py
+# use a random subset of markers for a quick ibs
+# to identify sample dups and closely related subjects
+# try snpMatrix and plink and see which one works best for us?
+# abecasis grr plots mean*sd for every subject to show clusters
+# mods june 23 rml to avoid non-autosomal markers
+# we seem to be distinguishing parent-child by gender - 2 clouds!
+
+
+snpMatrix from David Clayton has:
+ibs.stats function to calculate the identity-by-state stats of a group of samples
+Description
+Given a snp.matrix-class or a X.snp.matrix-class object with N samples, calculates some statistics
+about the relatedness of every pair of samples within.
+
+Usage
+ibs.stats(x)
+8 ibs.stats
+Arguments
+x a snp.matrix-class or a X.snp.matrix-class object containing N samples
+Details
+No-calls are excluded from consideration here.
+Value
+A data.frame containing N(N - 1)/2 rows, where the row names are the sample name pairs separated
+by a comma, and the columns are:
+Count count of identical calls, exclusing no-calls
+Fraction fraction of identical calls comparied to actual calls being made in both samples
+Warning
+In some applications, it may be preferable to subset a (random) selection of SNPs first - the
+calculation
+time increases as N(N - 1)M/2 . Typically for N = 800 samples and M = 3000 SNPs, the
+calculation time is about 1 minute. A full GWA scan could take hours, and quite unnecessary for
+simple applications such as checking for duplicate or related samples.
+Note
+This is mostly written to find mislabelled and/or duplicate samples.
+Illumina indexes their SNPs in alphabetical order so the mitochondria SNPs comes first - for most
+purpose it is undesirable to use these SNPs for IBS purposes.
+TODO: Worst-case S4 subsetting seems to make 2 copies of a large object, so one might want to
+subset before rbind(), etc; a future version of this routine may contain a built-in subsetting facility
+"""
+import sys,os,time,random,string,copy,optparse
+
+try:
+ set
+except NameError:
+ from Sets import Set as set
+
+from rgutils import timenow,plinke
+
+import plinkbinJZ
+
+
+opts = None
+verbose = False
+
+showPolygons = False
+
+class NullDevice:
+ def write(self, s):
+ pass
+
+tempstderr = sys.stderr # save
+sys.stderr = NullDevice()
+# need to avoid blather about deprecation and other strange stuff from scipy
+# the current galaxy job runner assumes that
+# the job is in error if anything appears on sys.stderr
+# grrrrr. James wants to keep it that way instead of using the
+# status flag for some strange reason. Presumably he doesn't use R or (in this case, scipy)
+import numpy
+import scipy
+from scipy import weave
+
+
+sys.stderr=tempstderr
+
+
+PROGNAME = os.path.split(sys.argv[0])[-1]
+X_AXIS_LABEL = 'Mean Alleles Shared'
+Y_AXIS_LABEL = 'SD Alleles Shared'
+LEGEND_ALIGN = 'topleft'
+LEGEND_TITLE = 'Relationship'
+DEFAULT_SYMBOL_SIZE = 1.0 # default symbol size
+DEFAULT_SYMBOL_SIZE = 0.5 # default symbol size
+
+### Some colors for R/rpy
+R_BLACK = 1
+R_RED = 2
+R_GREEN = 3
+R_BLUE = 4
+R_CYAN = 5
+R_PURPLE = 6
+R_YELLOW = 7
+R_GRAY = 8
+
+### ... and some point-styles
+
+###
+PLOT_HEIGHT = 600
+PLOT_WIDTH = 1150
+
+
+#SVG_COLORS = ('black', 'darkblue', 'blue', 'deepskyblue', 'firebrick','maroon','crimson')
+#SVG_COLORS = ('cyan','dodgerblue','mediumpurple', 'fuchsia', 'red','gold','gray')
+SVG_COLORS = ('cyan','dodgerblue','mediumpurple','forestgreen', 'lightgreen','gold','gray')
+# dupe,parentchild,sibpair,halfsib,parents,unrel,unkn
+#('orange', 'red', 'green', 'chartreuse', 'blue', 'purple', 'gray')
+
+OUTLIERS_HEADER_list = ['Mean','Sdev','ZMean','ZSdev','FID1','IID1','FID2','IID2','RelMean_M','RelMean_SD','RelSD_M','RelSD_SD','PID1','MID1','PID2','MID2','Ped']
+OUTLIERS_HEADER = '\t'.join(OUTLIERS_HEADER_list)
+TABLE_HEADER='fid1_iid1\tfid2_iid2\tmean\tsdev\tzmean\tzsdev\tgeno\trelcode\tpid1\tmid1\tpid2\tmid2\n'
+
+
+### Relationship codes, text, and lookups/mappings
+N_RELATIONSHIP_TYPES = 7
+REL_DUPE, REL_PARENTCHILD, REL_SIBS, REL_HALFSIBS, REL_RELATED, REL_UNRELATED, REL_UNKNOWN = range(N_RELATIONSHIP_TYPES)
+REL_LOOKUP = {
+ REL_DUPE: ('dupe', R_BLUE, 1),
+ REL_PARENTCHILD: ('parentchild', R_YELLOW, 1),
+ REL_SIBS: ('sibpairs', R_RED, 1),
+ REL_HALFSIBS: ('halfsibs', R_GREEN, 1),
+ REL_RELATED: ('parents', R_PURPLE, 1),
+ REL_UNRELATED: ('unrelated', R_CYAN, 1),
+ REL_UNKNOWN: ('unknown', R_GRAY, 1),
+ }
+OUTLIER_STDEVS = {
+ REL_DUPE: 2,
+ REL_PARENTCHILD: 2,
+ REL_SIBS: 2,
+ REL_HALFSIBS: 2,
+ REL_RELATED: 2,
+ REL_UNRELATED: 3,
+ REL_UNKNOWN: 2,
+ }
+# note now Z can be passed in
+
+REL_STATES = [REL_LOOKUP[r][0] for r in range(N_RELATIONSHIP_TYPES)]
+REL_COLORS = SVG_COLORS
+REL_POINTS = [REL_LOOKUP[r][2] for r in range(N_RELATIONSHIP_TYPES)]
+
+DEFAULT_MAX_SAMPLE_SIZE = 10000
+
+REF_COUNT_HOM1 = 3
+REF_COUNT_HET = 2
+REF_COUNT_HOM2 = 1
+MISSING = 0
+MAX_SHOW_ROWS = 100 # framingham has millions - delays showing output page - so truncate and explain
+MARKER_PAIRS_PER_SECOND_SLOW = 15000000.0
+MARKER_PAIRS_PER_SECOND_FAST = 70000000.0
+
+
+galhtmlprefix = """<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Galaxy %s tool output - see http://g2.trac.bx.psu.edu/" />
+<title></title>
+<link rel="stylesheet" href="/static/style/base.css" type="text/css" />
+</head>
+<body>
+<div class="document">
+"""
+
+
+SVG_HEADER = '''<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.2//EN" "http://www.w3.org/Graphics/SVG/1.2/DTD/svg12.dtd">
+
+<svg width="1280" height="800"
+ xmlns="http://www.w3.org/2000/svg" version="1.2"
+ xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1280 800" onload="init()">
+
+ <script type="text/ecmascript" xlink:href="/static/scripts/checkbox_and_radiobutton.js"/>
+ <script type="text/ecmascript" xlink:href="/static/scripts/helper_functions.js"/>
+ <script type="text/ecmascript" xlink:href="/static/scripts/timer.js"/>
+ <script type="text/ecmascript">
+ <![CDATA[
+ var checkBoxes = new Array();
+ var radioGroupBandwidth;
+ var colours = ['%s','%s','%s','%s','%s','%s','%s'];
+ function init() {
+ var style = {"font-family":"Arial,Helvetica", "fill":"black", "font-size":12};
+ var dist = 12;
+ var yOffset = 4;
+
+ //A checkBox for each relationship type dupe,parentchild,sibpair,halfsib,parents,unrel,unkn
+ checkBoxes["dupe"] = new checkBox("dupe","checkboxes",20,40,"cbRect","cbCross",true,"Duplicate",style,dist,yOffset,undefined,hideShowLayer);
+ checkBoxes["parentchild"] = new checkBox("parentchild","checkboxes",20,60,"cbRect","cbCross",true,"Parent-Child",style,dist,yOffset,undefined,hideShowLayer);
+ checkBoxes["sibpairs"] = new checkBox("sibpairs","checkboxes",20,80,"cbRect","cbCross",true,"Sib-pairs",style,dist,yOffset,undefined,hideShowLayer);
+ checkBoxes["halfsibs"] = new checkBox("halfsibs","checkboxes",20,100,"cbRect","cbCross",true,"Half-sibs",style,dist,yOffset,undefined,hideShowLayer);
+ checkBoxes["parents"] = new checkBox("parents","checkboxes",20,120,"cbRect","cbCross",true,"Parents",style,dist,yOffset,undefined,hideShowLayer);
+ checkBoxes["unrelated"] = new checkBox("unrelated","checkboxes",20,140,"cbRect","cbCross",true,"Unrelated",style,dist,yOffset,undefined,hideShowLayer);
+ checkBoxes["unknown"] = new checkBox("unknown","checkboxes",20,160,"cbRect","cbCross",true,"Unknown",style,dist,yOffset,undefined,hideShowLayer);
+
+ }
+
+ function hideShowLayer(id, status, label) {
+ var vis = "hidden";
+ if (status) {
+ vis = "visible";
+ }
+ document.getElementById(id).setAttributeNS(null, 'visibility', vis);
+ }
+
+ function showBTT(evt, rel, mm, dm, md, dd, n, mg, dg, lg, hg) {
+ var x = parseInt(evt.pageX)-250;
+ var y = parseInt(evt.pageY)-110;
+ switch(rel) {
+ case 0:
+ fill = colours[rel];
+ relt = "dupe";
+ break;
+ case 1:
+ fill = colours[rel];
+ relt = "parentchild";
+ break;
+ case 2:
+ fill = colours[rel];
+ relt = "sibpairs";
+ break;
+ case 3:
+ fill = colours[rel];
+ relt = "halfsibs";
+ break;
+ case 4:
+ fill = colours[rel];
+ relt = "parents";
+ break;
+ case 5:
+ fill = colours[rel];
+ relt = "unrelated";
+ break;
+ case 6:
+ fill = colours[rel];
+ relt = "unknown";
+ break;
+ default:
+ fill = "cyan";
+ relt = "ERROR_CODE: "+rel;
+ }
+
+ document.getElementById("btRel").textContent = "GROUP: "+relt;
+ document.getElementById("btMean").textContent = "mean="+mm+" +/- "+dm;
+ document.getElementById("btSdev").textContent = "sdev="+dm+" +/- "+dd;
+ document.getElementById("btPair").textContent = "npairs="+n;
+ document.getElementById("btGeno").textContent = "ngenos="+mg+" +/- "+dg+" (min="+lg+", max="+hg+")";
+ document.getElementById("btHead").setAttribute('fill', fill);
+
+ var tt = document.getElementById("btTip");
+ tt.setAttribute("transform", "translate("+x+","+y+")");
+ tt.setAttribute('visibility', 'visible');
+ }
+
+ function showOTT(evt, rel, s1, s2, mean, sdev, ngeno, rmean, rsdev) {
+ var x = parseInt(evt.pageX)-150;
+ var y = parseInt(evt.pageY)-180;
+
+ switch(rel) {
+ case 0:
+ fill = colours[rel];
+ relt = "dupe";
+ break;
+ case 1:
+ fill = colours[rel];
+ relt = "parentchild";
+ break;
+ case 2:
+ fill = colours[rel];
+ relt = "sibpairs";
+ break;
+ case 3:
+ fill = colours[rel];
+ relt = "halfsibs";
+ break;
+ case 4:
+ fill = colours[rel];
+ relt = "parents";
+ break;
+ case 5:
+ fill = colours[rel];
+ relt = "unrelated";
+ break;
+ case 6:
+ fill = colours[rel];
+ relt = "unknown";
+ break;
+ default:
+ fill = "cyan";
+ relt = "ERROR_CODE: "+rel;
+ }
+
+ document.getElementById("otRel").textContent = "PAIR: "+relt;
+ document.getElementById("otS1").textContent = "s1="+s1;
+ document.getElementById("otS2").textContent = "s2="+s2;
+ document.getElementById("otMean").textContent = "mean="+mean;
+ document.getElementById("otSdev").textContent = "sdev="+sdev;
+ document.getElementById("otGeno").textContent = "ngenos="+ngeno;
+ document.getElementById("otRmean").textContent = "relmean="+rmean;
+ document.getElementById("otRsdev").textContent = "relsdev="+rsdev;
+ document.getElementById("otHead").setAttribute('fill', fill);
+
+ var tt = document.getElementById("otTip");
+ tt.setAttribute("transform", "translate("+x+","+y+")");
+ tt.setAttribute('visibility', 'visible');
+ }
+
+ function hideBTT(evt) {
+ document.getElementById("btTip").setAttributeNS(null, 'visibility', 'hidden');
+ }
+
+ function hideOTT(evt) {
+ document.getElementById("otTip").setAttributeNS(null, 'visibility', 'hidden');
+ }
+
+ ]]>
+ </script>
+ <defs>
+ <!-- symbols for check boxes -->
+ <symbol id="cbRect" overflow="visible">
+ <rect x="-5" y="-5" width="10" height="10" fill="white" stroke="dimgray" stroke-width="1" cursor="pointer"/>
+ </symbol>
+ <symbol id="cbCross" overflow="visible">
+ <g pointer-events="none" stroke="black" stroke-width="1">
+ <line x1="-3" y1="-3" x2="3" y2="3"/>
+ <line x1="3" y1="-3" x2="-3" y2="3"/>
+ </g>
+ </symbol>
+ </defs>
+
+<desc>Developer Works Dynamic Scatter Graph Scaling Example</desc>
+
+<!-- Now Draw the main X and Y axis -->
+<g style="stroke-width:1.0; stroke:black; shape-rendering:crispEdges">
+ <!-- X Axis top and bottom -->
+ <path d="M 100 100 L 1250 100 Z"/>
+ <path d="M 100 700 L 1250 700 Z"/>
+
+ <!-- Y Axis left and right -->
+ <path d="M 100 100 L 100 700 Z"/>
+ <path d="M 1250 100 L 1250 700 Z"/>
+</g>
+
+<g transform="translate(100,100)">
+
+ <!-- Grid Lines -->
+ <g style="fill:none; stroke:#dddddd; stroke-width:1; stroke-dasharray:2,2; text-anchor:end; shape-rendering:crispEdges">
+
+ <!-- Vertical grid lines -->
+ <line x1="125" y1="0" x2="115" y2="600" />
+ <line x1="230" y1="0" x2="230" y2="600" />
+ <line x1="345" y1="0" x2="345" y2="600" />
+ <line x1="460" y1="0" x2="460" y2="600" />
+ <line x1="575" y1="0" x2="575" y2="600" style="stroke-dasharray:none;" />
+ <line x1="690" y1="0" x2="690" y2="600" />
+ <line x1="805" y1="0" x2="805" y2="600" />
+ <line x1="920" y1="0" x2="920" y2="600" />
+ <line x1="1035" y1="0" x2="1035" y2="600" />
+
+ <!-- Horizontal grid lines -->
+ <line x1="0" y1="60" x2="1150" y2="60" />
+ <line x1="0" y1="120" x2="1150" y2="120" />
+ <line x1="0" y1="180" x2="1150" y2="180" />
+ <line x1="0" y1="240" x2="1150" y2="240" />
+ <line x1="0" y1="300" x2="1150" y2="300" style="stroke-dasharray:none;" />
+ <line x1="0" y1="360" x2="1150" y2="360" />
+ <line x1="0" y1="420" x2="1150" y2="420" />
+ <line x1="0" y1="480" x2="1150" y2="480" />
+ <line x1="0" y1="540" x2="1150" y2="540" />
+ </g>
+
+ <!-- Legend -->
+ <g style="fill:black; stroke:none" font-size="12" font-family="Arial" transform="translate(25,25)">
+ <rect width="160" height="270" style="fill:none; stroke:black; shape-rendering:crispEdges" />
+ <text x="5" y="20" style="fill:black; stroke:none;" font-size="13" font-weight="bold">Given Pair Relationship</text>
+ <rect x="120" y="35" width="10" height="10" fill="%s" stroke="%s" stroke-width="1" cursor="pointer"/>
+ <rect x="120" y="55" width="10" height="10" fill="%s" stroke="%s" stroke-width="1" cursor="pointer"/>
+ <rect x="120" y="75" width="10" height="10" fill="%s" stroke="%s" stroke-width="1" cursor="pointer"/>
+ <rect x="120" y="95" width="10" height="10" fill="%s" stroke="%s" stroke-width="1" cursor="pointer"/>
+ <rect x="120" y="115" width="10" height="10" fill="%s" stroke="%s" stroke-width="1" cursor="pointer"/>
+ <rect x="120" y="135" width="10" height="10" fill="%s" stroke="%s" stroke-width="1" cursor="pointer"/>
+ <rect x="120" y="155" width="10" height="10" fill="%s" stroke="%s" stroke-width="1" cursor="pointer"/>
+ <text x="15" y="195" style="fill:black; stroke:none" font-size="12" font-family="Arial" >Zscore gt 15</text>
+ <circle cx="125" cy="192" r="6" style="stroke:red; fill:gold; fill-opacity:1.0; stroke-width:1;"/>
+ <text x="15" y="215" style="fill:black; stroke:none" font-size="12" font-family="Arial" >Zscore 4 to 15</text>
+ <circle cx="125" cy="212" r="3" style="stroke:gold; fill:gold; fill-opacity:1.0; stroke-width:1;"/>
+ <text x="15" y="235" style="fill:black; stroke:none" font-size="12" font-family="Arial" >Zscore lt 4</text>
+ <circle cx="125" cy="232" r="2" style="stroke:gold; fill:gold; fill-opacity:1.0; stroke-width:1;"/>
+ <g id="checkboxes">
+ </g>
+ </g>
+
+
+ <g style='fill:black; stroke:none' font-size="17" font-family="Arial">
+ <!-- X Axis Labels -->
+ <text x="480" y="660">Mean Alleles Shared</text>
+ <text x="0" y="630" >1.0</text>
+ <text x="277" y="630" >1.25</text>
+ <text x="564" y="630" >1.5</text>
+ <text x="842" y="630" >1.75</text>
+ <text x="1140" y="630" >2.0</text>
+ </g>
+
+ <g transform="rotate(270)" style="fill:black; stroke:none" font-size="17" font-family="Arial">
+ <!-- Y Axis Labels -->
+ <text x="-350" y="-40">SD Alleles Shared</text>
+ <text x="-20" y="-10" >1.0</text>
+ <text x="-165" y="-10" >0.75</text>
+ <text x="-310" y="-10" >0.5</text>
+ <text x="-455" y="-10" >0.25</text>
+ <text x="-600" y="-10" >0.0</text>
+ </g>
+
+<!-- Plot Title -->
+<g style="fill:black; stroke:none" font-size="18" font-family="Arial">
+ <text x="425" y="-30">%s</text>
+</g>
+
+<!-- One group/layer of points for each relationship type -->
+'''
+
+SVG_FOOTER = '''
+<!-- End of Data -->
+</g>
+<g id="btTip" visibility="hidden" style="stroke-width:1.0; fill:black; stroke:none;" font-size="10" font-family="Arial">
+ <rect width="250" height="110" style="fill:silver" rx="2" ry="2"/>
+ <rect id="btHead" width="250" height="20" rx="2" ry="2" />
+ <text id="btRel" y="14" x="85">unrelated</text>
+ <text id="btMean" y="40" x="4">mean=1.5 +/- 0.04</text>
+ <text id="btSdev" y="60" x="4">sdev=0.7 +/- 0.03</text>
+ <text id="btPair" y="80" x="4">npairs=1152</text>
+ <text id="btGeno" y="100" x="4">ngenos=4783 +/- 24 (min=1000, max=5000)</text>
+</g>
+
+<g id="otTip" visibility="hidden" style="stroke-width:1.0; fill:black; stroke:none;" font-size="10" font-family="Arial">
+ <rect width="150" height="180" style="fill:silver" rx="2" ry="2"/>
+ <rect id="otHead" width="150" height="20" rx="2" ry="2" />
+ <text id="otRel" y="14" x="40">sibpairs</text>
+ <text id="otS1" y="40" x="4">s1=fid1,iid1</text>
+ <text id="otS2" y="60" x="4">s2=fid2,iid2</text>
+ <text id="otMean" y="80" x="4">mean=1.82</text>
+ <text id="otSdev" y="100" x="4">sdev=0.7</text>
+ <text id="otGeno" y="120" x="4">ngeno=4487</text>
+ <text id="otRmean" y="140" x="4">relmean=1.85</text>
+ <text id="otRsdev" y="160" x="4">relsdev=0.65</text>
+</g>
+</svg>
+'''
+
+
+DEFAULT_MAX_SAMPLE_SIZE = 5000
+
+REF_COUNT_HOM1 = 3
+REF_COUNT_HET = 2
+REF_COUNT_HOM2 = 1
+MISSING = 0
+
+MARKER_PAIRS_PER_SECOND_SLOW = 15000000
+MARKER_PAIRS_PER_SECOND_FAST = 70000000
+
+POLYGONS = {
+ REL_UNRELATED: ((1.360, 0.655), (1.385, 0.730), (1.620, 0.575), (1.610, 0.505)),
+ REL_HALFSIBS: ((1.630, 0.500), (1.630, 0.550), (1.648, 0.540), (1.648, 0.490)),
+ REL_SIBS: ((1.660, 0.510), (1.665, 0.560), (1.820, 0.410), (1.820, 0.390)),
+ REL_PARENTCHILD: ((1.650, 0.470), (1.650, 0.490), (1.750, 0.440), (1.750, 0.420)),
+ REL_DUPE: ((1.970, 0.000), (1.970, 0.150), (2.000, 0.150), (2.000, 0.000)),
+ }
+
+def distance(point1, point2):
+ """ Calculate the distance between two points
+ """
+ (x1,y1) = [float(d) for d in point1]
+ (x2,y2) = [float(d) for d in point2]
+ dx = abs(x1 - x2)
+ dy = abs(y1 - y2)
+ return math.sqrt(dx**2 + dy**2)
+
+def point_inside_polygon(x, y, poly):
+ """ Determine if a point (x,y) is inside a given polygon or not
+ poly is a list of (x,y) pairs.
+
+ Taken from: http://www.ariel.com.au/a/python-point-int-poly.html
+ """
+
+ n = len(poly)
+ inside = False
+
+ p1x,p1y = poly[0]
+ for i in range(n+1):
+ p2x,p2y = poly[i % n]
+ if y > min(p1y,p2y):
+ if y <= max(p1y,p2y):
+ if x <= max(p1x,p2x):
+ if p1y != p2y:
+ xinters = (y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x
+ if p1x == p2x or x <= xinters:
+ inside = not inside
+ p1x,p1y = p2x,p2y
+ return inside
+
+def readMap(pedfile):
+ """
+ """
+ mapfile = pedfile.replace('.ped', '.map')
+ marker_list = []
+ if os.path.exists(mapfile):
+ print 'readMap: %s' % (mapfile)
+ fh = file(mapfile, 'r')
+ for line in fh:
+ marker_list.append(line.strip().split())
+ fh.close()
+ print 'readMap: %s markers' % (len(marker_list))
+ return marker_list
+
+def calcMeanSD(useme):
+ """
+ A numerically stable algorithm is given below. It also computes the mean.
+ This algorithm is due to Knuth,[1] who cites Welford.[2]
+ n = 0
+ mean = 0
+ M2 = 0
+
+ foreach x in data:
+ n = n + 1
+ delta = x - mean
+ mean = mean + delta/n
+ M2 = M2 + delta*(x - mean) // This expression uses the new value of mean
+ end for
+
+ variance_n = M2/n
+ variance = M2/(n - 1)
+ """
+ mean = 0.0
+ M2 = 0.0
+ sd = 0.0
+ n = len(useme)
+ if n > 1:
+ for i,x in enumerate(useme):
+ delta = x - mean
+ mean = mean + delta/(i+1) # knuth uses n+=1 at start
+ M2 = M2 + delta*(x - mean) # This expression uses the new value of mean
+ variance = M2/(n-1) # assume is sample so lose 1 DOF
+ sd = pow(variance,0.5)
+ return mean,sd
+
+
+def doIBSpy(ped=None,basename='',outdir=None,logf=None,
+ nrsSamples=10000,title='title',pdftoo=0,Zcutoff=2.0):
+ #def doIBS(pedName, title, nrsSamples=None, pdftoo=False):
+ """ started with snpmatrix but GRR uses actual IBS counts and sd's
+ """
+ repOut = [] # text strings to add to the html display
+ refallele = {}
+ tblf = '%s_table.xls' % (title)
+ tbl = file(os.path.join(outdir,tblf), 'w')
+ tbl.write(TABLE_HEADER)
+ svgf = '%s.svg' % (title)
+ svg = file(os.path.join(outdir,svgf), 'w')
+
+ nMarkers = len(ped._markers)
+ if nMarkers < 5:
+ print sys.stderr, '### ERROR - %d is too few markers for reliable estimation in %s - terminating' % (nMarkers,PROGNAME)
+ sys.exit(1)
+ nSubjects = len(ped._subjects)
+ nrsSamples = min(nMarkers, nrsSamples)
+ if opts and opts.use_mito:
+ markers = range(nMarkers)
+ nrsSamples = min(len(markers), nrsSamples)
+ sampleIndexes = sorted(random.sample(markers, nrsSamples))
+ else:
+ autosomals = ped.autosomal_indices()
+ nrsSamples = min(len(autosomals), nrsSamples)
+ sampleIndexes = sorted(random.sample(autosomals, nrsSamples))
+
+ print ''
+ print 'Getting random.sample of %s from %s total' % (nrsSamples, nMarkers)
+ npairs = (nSubjects*(nSubjects-1))/2 # total rows in table
+ newfiles=[svgf,tblf]
+ explanations = ['rgGRR Plot (requires SVG)','Mean by SD alleles shared - %d rows' % npairs]
+ # these go with the output file links in the html file
+ s = 'Reading genotypes for %s subjects and %s markers\n' % (nSubjects, nrsSamples)
+ logf.write(s)
+ minUsegenos = nrsSamples/2 # must have half?
+ nGenotypes = nSubjects*nrsSamples
+ stime = time.time()
+ emptyRows = set()
+ genos = numpy.zeros((nSubjects, nrsSamples), dtype=int)
+ for s in xrange(nSubjects):
+ nValid = 0
+ #getGenotypesByIndices(self, s, mlist, format)
+ genos[s] = ped.getGenotypesByIndices(s, sampleIndexes, format='ref')
+ nValid = sum([1 for g in genos[s] if g])
+ if not nValid:
+ emptyRows.add(s)
+ sub = ped.getSubject(s)
+ print 'All missing for row %d (%s)' % (s, sub)
+ logf.write('All missing for row %d (%s)\n' % (s, sub))
+ rtime = time.time() - stime
+ if verbose:
+ print '@@Read %s genotypes in %s seconds' % (nGenotypes, rtime)
+
+
+ ### Now the expensive part. For each pair of subjects, we get the mean number
+ ### and standard deviation of shared alleles over all of the markers where both
+ ### subjects have a known genotype. Identical subjects should have mean shared
+ ### alleles very close to 2.0 with a standard deviation very close to 0.0.
+ tot = nSubjects*(nSubjects-1)/2
+ nprog = tot/10
+ nMarkerpairs = tot * nrsSamples
+ estimatedTimeSlow = nMarkerpairs/MARKER_PAIRS_PER_SECOND_SLOW
+ estimatedTimeFast = nMarkerpairs/MARKER_PAIRS_PER_SECOND_FAST
+
+ pairs = []
+ pair_data = {}
+ means = [] ## Mean IBS for each pair
+ ngenoL = [] ## Count of comparable genotypes for each pair
+ sdevs = [] ## Standard dev for each pair
+ rels = [] ## A relationship code for each pair
+ zmeans = [0.0 for x in xrange(tot)] ## zmean score for each pair for the relgroup
+ zstds = [0.0 for x in xrange(tot)] ## zstd score for each pair for the relgrp
+ skip = set()
+ ndone = 0 ## How many have been done so far
+
+ logf.write('Calculating %d pairs...\n' % (tot))
+ logf.write('Estimated time is %2.2f to %2.2f seconds ...\n' % (estimatedTimeFast, estimatedTimeSlow))
+
+ t1sum = 0
+ t2sum = 0
+ t3sum = 0
+ now = time.time()
+ scache = {}
+ _founder_cache = {}
+ C_CODE = """
+ #include "math.h"
+ int i;
+ int sumibs = 0;
+ int ssqibs = 0;
+ int ngeno = 0;
+ float mean = 0;
+ float M2 = 0;
+ float delta = 0;
+ float sdev=0;
+ float variance=0;
+ for (i=0; i<nrsSamples; i++) {
+ int a1 = g1[i];
+ int a2 = g2[i];
+ if (a1 != 0 && a2 != 0) {
+ ngeno += 1;
+ int shared = 2-abs(a1-a2);
+ delta = shared - mean;
+ mean = mean + delta/ngeno;
+ M2 += delta*(shared-mean);
+ // yes that second time, the updated mean is used see calcmeansd above;
+ //printf("%d %d %d %d %d %d\\n", i, a1, a2, ngeno, shared, squared);
+ }
+ }
+ if (ngeno > 1) {
+ variance = M2/(ngeno-1);
+ sdev = sqrt(variance);
+ //printf("OK: %d %3.2f %3.2f\\n", ngeno, mean, sdev);
+ }
+ //printf("%d %d %d %1.2f %1.2f\\n", ngeno, sumibs, ssqibs, mean, sdev);
+ result[0] = ngeno;
+ result[1] = mean;
+ result[2] = sdev;
+ return_val = ngeno;
+ """
+ started = time.time()
+ for s1 in xrange(nSubjects):
+ if s1 in emptyRows:
+ continue
+ (fid1,iid1,did1,mid1,sex1,phe1,iid1,d_sid1,m_sid1) = scache.setdefault(s1, ped.getSubject(s1))
+
+ isFounder1 = _founder_cache.setdefault(s1, (did1==mid1))
+ g1 = genos[s1]
+
+ for s2 in xrange(s1+1, nSubjects):
+ if s2 in emptyRows:
+ continue
+ t1s = time.time()
+
+ (fid2,iid2,did2,mid2,sex2,phe2,iid2,d_sid2,m_sid2) = scache.setdefault(s2, ped.getSubject(s2))
+
+ g2 = genos[s2]
+ isFounder2 = _founder_cache.setdefault(s2, (did2==mid2))
+
+ # Determine the relationship for this pair
+ relcode = REL_UNKNOWN
+ if (fid2 == fid1):
+ if iid1 == iid2:
+ relcode = REL_DUPE
+ elif (did2 == did1) and (mid2 == mid1) and did1 != mid1:
+ relcode = REL_SIBS
+ elif (iid1 == mid2) or (iid1 == did2) or (iid2 == mid1) or (iid2 == did1):
+ relcode = REL_PARENTCHILD
+ elif (str(did1) != '0' and (did2 == did1)) or (str(mid1) != '0' and (mid2 == mid1)):
+ relcode = REL_HALFSIBS
+ else:
+ # People in the same family should be marked as some other
+ # form of related. In general, these people will have a
+ # pretty random spread of similarity. This distinction is
+ # probably not very useful most of the time
+ relcode = REL_RELATED
+ else:
+ ### Different families
+ relcode = REL_UNRELATED
+
+ t1e = time.time()
+ t1sum += t1e-t1s
+
+
+ ### Calculate sum(2-abs(a1-a2)) and sum((2-abs(a1-a2))**2) and count
+ ### the number of contributing genotypes. These values are not actually
+ ### calculated here, but instead are looked up in a table for speed.
+ ### FIXME: This is still too slow ...
+ result = [0.0, 0.0, 0.0]
+ ngeno = weave.inline(C_CODE, ['g1', 'g2', 'nrsSamples', 'result'])
+ if ngeno >= minUsegenos:
+ _, mean, sdev = result
+ means.append(mean)
+ sdevs.append(sdev)
+ ngenoL.append(ngeno)
+ pairs.append((s1, s2))
+ rels.append(relcode)
+ else:
+ skip.add(ndone) # signal no comparable genotypes for this pair
+ ndone += 1
+ t2e = time.time()
+ t2sum += t2e-t1e
+ t3e = time.time()
+ t3sum += t3e-t2e
+
+ logme = [ 'T1: %s' % (t1sum), 'T2: %s' % (t2sum), 'T3: %s' % (t3sum),'TOT: %s' % (t3e-now),
+ '%s pairs with no (or not enough) comparable genotypes (%3.1f%%)' % (len(skip),
+ float(len(skip))/float(tot)*100)]
+ logf.write('%s\n' % '\t'.join(logme))
+ ### Calculate mean and standard deviation of scores on a per relationship
+ ### type basis, allowing us to flag outliers for each particular relationship
+ ### type
+ relstats = {}
+ relCounts = {}
+ outlierFiles = {}
+ for relCode, relInfo in REL_LOOKUP.items():
+ relName, relColor, relStyle = relInfo
+ useme = [means[x] for x in xrange(len(means)) if rels[x] == relCode]
+ relCounts[relCode] = len(useme)
+ mm = scipy.mean(useme)
+ ms = scipy.std(useme)
+ useme = [sdevs[x] for x in xrange(len(sdevs)) if rels[x] == relCode]
+ sm = scipy.mean(useme)
+ ss = scipy.std(useme)
+ relstats[relCode] = {'sd':(sm,ss), 'mean':(mm,ms)}
+ s = 'Relstate %s (n=%d): mean(mean)=%3.2f sdev(mean)=%3.2f, mean(sdev)=%3.2f sdev(sdev)=%3.2f\n' % \
+ (relName,relCounts[relCode], mm, ms, sm, ss)
+ logf.write(s)
+
+ ### now fake z scores for each subject like abecasis recommends max(|zmu|,|zsd|)
+ ### within each group, for each pair, z=(groupmean-pairmean)/groupsd
+ available = len(means)
+ logf.write('%d pairs are available of %d\n' % (available, tot))
+ ### s = '\nOutliers:\nrelationship\tzmean\tzsd\tped1\tped2\tmean\tsd\trmeanmean\trmeansd\trsdmean\trsdsd\n'
+ ### logf.write(s)
+ pairnum = 0
+ offset = 0
+ nOutliers = 0
+ cexs = []
+ outlierRecords = dict([(r, []) for r in range(N_RELATIONSHIP_TYPES)])
+ zsdmax = 0
+ for s1 in range(nSubjects):
+ if s1 in emptyRows:
+ continue
+ (fid1,iid1,did1,mid1,sex1,aff1,ok1,d_sid1,m_sid1) = scache[s1]
+ for s2 in range(s1+1, nSubjects):
+ if s2 in emptyRows:
+ continue
+ if pairnum not in skip:
+ ### Get group stats for this relationship
+ (fid2,iid2,did2,mid2,sex2,aff2,ok2,d_sid2,m_sid2) = scache[s2]
+ try:
+ r = rels[offset]
+ except IndexError:
+ logf.write('###OOPS offset %d available %d pairnum %d len(rels) %d', offset, available, pairnum, len(rels))
+ notfound = ('?',('?','0','0'))
+ relInfo = REL_LOOKUP.get(r,notfound)
+ relName, relColor, relStyle = relInfo
+ rmm,rmd = relstats[r]['mean'] # group mean, group meansd alleles shared
+ rdm,rdd = relstats[r]['sd'] # group sdmean, group sdsd alleles shared
+
+ try:
+ zsd = (sdevs[offset] - rdm)/rdd # distance from group mean in group sd units
+ except:
+ zsd = 1
+ if abs(zsd) > zsdmax:
+ zsdmax = zsd # keep for sort scaling
+ try:
+ zmean = (means[offset] - rmm)/rmd # distance from group mean
+ except:
+ zmean = 1
+ zmeans[offset] = zmean
+ zstds[offset] = zsd
+ pid=(s1,s2)
+ zrad = max(zsd,zmean)
+ if zrad < 4:
+ zrad = 2
+ elif 4 < zrad < 15:
+ zrad = 3 # to 9
+ else: # > 15 6=24+
+ zrad=zrad/4
+ zrad = min(zrad,6) # scale limit
+ zrad = max(2,max(zsd,zmean)) # as > 2, z grows
+ pair_data[pid] = (zmean,zsd,r,zrad)
+ if max(zsd,zmean) > Zcutoff: # is potentially interesting
+ mean = means[offset]
+ sdev = sdevs[offset]
+ outlierRecords[r].append((mean, sdev, zmean, zsd, fid1, iid1, fid2, iid2, rmm, rmd, rdm, rdd,did1,mid1,did2,mid2))
+ nOutliers += 1
+ tbl.write('%s_%s\t%s_%s\t%f\t%f\t%f\t%f\t%d\t%s\t%s\t%s\t%s\t%s\n' % \
+ (fid1, iid1, fid2, iid2, mean, sdev, zmean,zsd, ngeno, relName, did1,mid1,did2,mid2))
+ offset += 1
+ pairnum += 1
+ logf.write( 'Outliers: %s\n' % (nOutliers))
+
+ ### Write outlier files for each relationship type
+ repOut.append('<h2>Outliers in tab delimited files linked above are also listed below</h2>')
+ lzsd = round(numpy.log10(zsdmax)) + 1
+ scalefactor = 10**lzsd
+ for relCode, relInfo in REL_LOOKUP.items():
+ relName, _, _ = relInfo
+ outliers = outlierRecords[relCode]
+ if not outliers:
+ continue
+ outliers = [(scalefactor*int(abs(x[3]))+ int(abs(x[2])),x) for x in outliers] # decorate
+ outliers.sort()
+ outliers.reverse() # largest deviation first
+ outliers = [x[1] for x in outliers] # undecorate
+ nrows = len(outliers)
+ truncated = 0
+ if nrows > MAX_SHOW_ROWS:
+ s = '<h3>%s outlying pairs (top %d of %d) from %s</h3><table border="0" cellpadding="3">' % \
+ (relName,MAX_SHOW_ROWS,nrows,title)
+ truncated = nrows - MAX_SHOW_ROWS
+ else:
+ s = '<h3>%s outlying pairs (n=%d) from %s</h3><table border="0" cellpadding="3">' % (relName,nrows,title)
+ repOut.append(s)
+ fhname = '%s_rgGRR_%s_outliers.xls' % (title, relName)
+ fhpath = os.path.join(outdir,fhname)
+ fh = open(fhpath, 'w')
+ newfiles.append(fhname)
+ explanations.append('%s Outlier Pairs %s, N=%d, Cutoff SD=%f' % (relName,title,len(outliers),Zcutoff))
+ fh.write(OUTLIERS_HEADER)
+ s = ''.join(['<th>%s</th>' % x for x in OUTLIERS_HEADER_list])
+ repOut.append('<tr align="center">%s</tr>' % s)
+ for n,rec in enumerate(outliers):
+ #(mean, sdev, zmean, zsd, fid1, iid1, fid2, iid2, rmm, rmd, rdm, rdd) = rec
+ s = '%f\t%f\t%f\t%f\t%s\t%s\t%s\t%s\t%f\t%f\t%f\t%f\t%s\t%s\t%s\t%s\t' % tuple(rec)
+ fh.write('%s%s\n' % (s,relName))
+ # (mean, sdev, zmean, zsd, fid1, iid1, fid2, iid2, rmm, rmd, rdm, rdd, did1,mid1,did2,mid2))
+ s = '''<td>%f</td><td>%f</td><td>%f</td><td>%f</td><td>%s</td><td>%s</td>
+ <td>%s</td><td>%s</td><td>%f</td><td>%f</td><td>%f</td><td>%f</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td>''' % tuple(rec)
+ s = '%s<td>%s</td>' % (s,relName)
+ if n < MAX_SHOW_ROWS:
+ repOut.append('<tr align="center">%s</tr>' % s)
+ if truncated > 0:
+ repOut.append('<H2>WARNING: %d rows truncated - see outlier file for all %d rows</H2>' % (truncated,
+ nrows))
+ fh.close()
+ repOut.append('</table><p>')
+
+ ### Now, draw the plot in jpeg and svg formats, and optionally in the PDF format
+ ### if requested
+ logf.write('Plotting ...')
+ pointColors = [REL_COLORS[rel] for rel in rels]
+ pointStyles = [REL_POINTS[rel] for rel in rels]
+
+ mainTitle = '%s (%s subjects, %d snp)' % (title, nSubjects, nrsSamples)
+ svg.write(SVG_HEADER % (SVG_COLORS[0],SVG_COLORS[1],SVG_COLORS[2],SVG_COLORS[3],SVG_COLORS[4],
+ SVG_COLORS[5],SVG_COLORS[6],SVG_COLORS[0],SVG_COLORS[0],SVG_COLORS[1],SVG_COLORS[1],
+ SVG_COLORS[2],SVG_COLORS[2],SVG_COLORS[3],SVG_COLORS[3],SVG_COLORS[4],SVG_COLORS[4],
+ SVG_COLORS[5],SVG_COLORS[5],SVG_COLORS[6],SVG_COLORS[6],mainTitle))
+ #rpy.r.jpeg(filename='%s.jpg' % (title), width=1600, height=1200, pointsize=12, quality=100, bg='white')
+ #rpy.r.par(mai=(1,1,1,0.5))
+ #rpy.r('par(xaxs="i",yaxs="i")')
+ #rpy.r.plot(means, sdevs, main=mainTitle, ylab=Y_AXIS_LABEL, xlab=X_AXIS_LABEL, cex=cexs, col=pointColors, pch=pointStyles, xlim=(0,2), ylim=(0,2))
+ #rpy.r.legend(LEGEND_ALIGN, legend=REL_STATES, pch=REL_POINTS, col=REL_COLORS, title=LEGEND_TITLE)
+ #rpy.r.grid(nx=10, ny=10, col='lightgray', lty='dotted')
+ #rpy.r.dev_off()
+
+ ### We will now go through each relationship type to partition plot points
+ ### into "bulk" and "outlier" groups. Bulk points will represent common
+ ### mean/sdev pairs and will cover the majority of the points in the plot --
+ ### they will use generic tooltip informtion about all of the pairs
+ ### represented by that point. "Outlier" points will be uncommon pairs,
+ ### with very specific information in their tooltips. It would be nice to
+ ### keep hte total number of plotted points in the SVG representation to
+ ### ~10000 (certainly less than 100000?)
+ pointMap = {}
+ orderedRels = [y[1] for y in reversed(sorted([(relCounts.get(x, 0),x) for x in REL_LOOKUP.keys()]))]
+ # do we really want this? I want out of zone points last and big
+ for relCode in orderedRels:
+ svgColor = SVG_COLORS[relCode]
+ relName, relColor, relStyle = REL_LOOKUP[relCode]
+ svg.write('<g id="%s" style="stroke:%s; fill:%s; fill-opacity:1.0; stroke-width:1;" cursor="pointer">\n' % (relName, svgColor, svgColor))
+ pMap = pointMap.setdefault(relCode, {})
+ nPoints = 0
+ rpairs=[]
+ rgenos=[]
+ rmeans=[]
+ rsdevs=[]
+ rz = []
+ for x,rel in enumerate(rels): # all pairs
+ if rel == relCode:
+ s1,s2 = pairs[x]
+ pid=(s1,s2)
+ zmean,zsd,r,zrad = pair_data[pid][:4]
+ rpairs.append(pairs[x])
+ rgenos.append(ngenoL[x])
+ rmeans.append(means[x])
+ rsdevs.append(sdevs[x])
+ rz.append(zrad)
+ ### Now add the svg point group for this relationship to the svg file
+ for x in range(len(rmeans)):
+ svgX = '%d' % ((rmeans[x] - 1.0) * PLOT_WIDTH) # changed so mean scale is 1-2
+ svgY = '%d' % (PLOT_HEIGHT - (rsdevs[x] * PLOT_HEIGHT)) # changed so sd scale is 0-1
+ s1, s2 = rpairs[x]
+ (fid1,uid1,did1,mid1,sex1,phe1,iid1,d_sid1,m_sid1) = scache[s1]
+ (fid2,uid2,did2,mid2,sex2,phe2,iid2,d_sid2,m_sid2) = scache[s2]
+ ngenos = rgenos[x]
+ nPoints += 1
+ point = pMap.setdefault((svgX, svgY), [])
+ point.append((rmeans[x], rsdevs[x], fid1, iid1, did1, mid1, fid2, iid2, did2, mid2, ngenos,rz[x]))
+ for (svgX, svgY) in pMap:
+ points = pMap[(svgX, svgY)]
+ svgX = int(svgX)
+ svgY = int(svgY)
+ if len(points) > 1:
+ mmean,dmean = calcMeanSD([p[0] for p in points])
+ msdev,dsdev = calcMeanSD([p[1] for p in points])
+ mgeno,dgeno = calcMeanSD([p[-1] for p in points])
+ mingeno = min([p[-1] for p in points])
+ maxgeno = max([p[-1] for p in points])
+ svg.write("""<circle cx="%d" cy="%d" r="2"
+ onmouseover="showBTT(evt, %d, %1.2f, %1.2f, %1.2f, %1.2f, %d, %d, %d, %d, %d)"
+ onmouseout="hideBTT(evt)" />\n""" % (svgX, svgY, relCode, mmean, dmean, msdev, dsdev, len(points), mgeno, dgeno, mingeno, maxgeno))
+ else:
+ mean, sdev, fid1, iid1, did1, mid1, fid2, iid2, did2, mid2, ngenos, zrad = points[0][:12]
+ rmean = float(relstats[relCode]['mean'][0])
+ rsdev = float(relstats[relCode]['sd'][0])
+ if zrad < 4:
+ zrad = 2
+ elif 4 < zrad < 9:
+ zrad = 3 # to 9
+ else: # > 9 5=15+
+ zrad=zrad/3
+ zrad = min(zrad,5) # scale limit
+ if zrad <= 3:
+ svg.write('<circle cx="%d" cy="%d" r="%s" onmouseover="showOTT(evt, %d, \'%s,%s,%s,%s\', \'%s,%s,%s,%s\', %1.2f, %1.2f, %s, %1.2f, %1.2f)" onmouseout="hideOTT(evt)" />\n' % (svgX, svgY, zrad, relCode, fid1, iid1, did1, mid1, fid2, iid2, did2, mid2, mean, sdev, ngenos, rmean, rsdev))
+ else: # highlight pairs a long way from expectation by outlining circle in red
+ svg.write("""<circle cx="%d" cy="%d" r="%s" style="stroke:red; fill:%s; fill-opacity:1.0; stroke-width:1;"
+ onmouseover="showOTT(evt, %d, \'%s,%s,%s,%s\', \'%s,%s,%s,%s\', %1.2f, %1.2f, %s, %1.2f, %1.2f)"
+ onmouseout="hideOTT(evt)" />\n""" % \
+ (svgX, svgY, zrad, svgColor, relCode, fid1, iid1, did1, mid1, fid2, iid2, did2, mid2, mean, sdev, ngenos, rmean, rsdev))
+ svg.write('</g>\n')
+
+ ### Create a pdf as well if indicated on the command line
+ ### WARNING! for framingham share, with about 50M pairs, this is a 5.5GB pdf!
+## if pdftoo:
+## pdfname = '%s.pdf' % (title)
+## rpy.r.pdf(pdfname, 6, 6)
+## rpy.r.par(mai=(1,1,1,0.5))
+## rpy.r('par(xaxs="i",yaxs="i")')
+## rpy.r.plot(means, sdevs, main='%s, %d snp' % (title, nSamples), ylab=Y_AXIS_LABEL, xlab=X_AXIS_LABEL, cex=cexs, col=pointColors, pch=pointStyles, xlim=(0,2), ylim=(0,2))
+## rpy.r.legend(LEGEND_ALIGN, legend=REL_STATES, pch=REL_POINTS, col=REL_COLORS, title=LEGEND_TITLE)
+## rpy.r.grid(nx=10, ny=10, col='lightgray', lty='dotted')
+## rpy.r.dev_off()
+
+ ### Draw polygons
+ if showPolygons:
+ svg.write('<g id="polygons" cursor="pointer">\n')
+ for rel, poly in POLYGONS.items():
+ points = ' '.join(['%s,%s' % ((p[0]-1.0)*float(PLOT_WIDTH), (PLOT_HEIGHT - p[1]*PLOT_HEIGHT)) for p in poly])
+ svg.write('<polygon points="%s" fill="transparent" style="stroke:%s; stroke-width:1"/>\n' % (points, SVG_COLORS[rel]))
+ svg.write('</g>\n')
+
+
+ svg.write(SVG_FOOTER)
+ svg.close()
+ return newfiles,explanations,repOut
+
+def doIBS(n=100):
+ """parse parameters from galaxy
+ expect 'input pbed path' 'basename' 'outpath' 'title' 'logpath' 'n'
+ <command interpreter="python">
+ rgGRR.py $i.extra_files_path/$i.metadata.base_name "$i.metadata.base_name"
+ '$out_file1' '$out_file1.files_path' "$title1" '$n' '$Z'
+ </command>
+
+ """
+ u="""<command interpreter="python">
+ rgGRR.py $i.extra_files_path/$i.metadata.base_name "$i.metadata.base_name"
+ '$out_file1' '$out_file1.files_path' "$title1" '$n' '$Z'
+ </command>
+ """
+
+
+ if len(sys.argv) < 7:
+ print >> sys.stdout, 'Need pbed inpath, basename, out_htmlname, outpath, title, logpath, nSNP, Zcutoff on command line please'
+ print >> sys.stdout, u
+ sys.exit(1)
+ ts = '%s%s' % (string.punctuation,string.whitespace)
+ ptran = string.maketrans(ts,'_'*len(ts))
+ inpath = sys.argv[1]
+ ldinpath = os.path.split(inpath)[0]
+ basename = sys.argv[2]
+ outhtml = sys.argv[3]
+ newfilepath = sys.argv[4]
+ title = sys.argv[5].translate(ptran)
+ logfname = 'Log_%s.txt' % title
+ logpath = os.path.join(newfilepath,logfname) # log was a child - make part of html extra_files_path zoo
+ n = int(sys.argv[6])
+ try:
+ Zcutoff = float(sys.argv[7])
+ except:
+ Zcutoff = 2.0
+ try:
+ os.makedirs(newfilepath)
+ except:
+ pass
+ logf = file(logpath,'w')
+ efp,ibase_name = os.path.split(inpath) # need to use these for outputs in files_path
+ ped = plinkbinJZ.BPed(inpath)
+ ped.parse(quick=True)
+ if ped == None:
+ print >> sys.stderr, '## doIBSpy problem - cannot open %s or %s - cannot run' % (ldreduced,basename)
+ sys.exit(1)
+ newfiles,explanations,repOut = doIBSpy(ped=ped,basename=basename,outdir=newfilepath,
+ logf=logf,nrsSamples=n,title=title,pdftoo=0,Zcutoff=Zcutoff)
+ logf.close()
+ logfs = file(logpath,'r').readlines()
+ lf = file(outhtml,'w')
+ lf.write(galhtmlprefix % PROGNAME)
+ # this is a mess. todo clean up - should each datatype have it's own directory? Yes
+ # probably. Then titles are universal - but userId libraries are separate.
+ s = '<div>Output from %s run at %s<br>\n' % (PROGNAME,timenow())
+ lf.write('<h4>%s</h4>\n' % s)
+ fixed = ["'%s'" % x for x in sys.argv] # add quotes just in case
+ s = 'If you need to rerun this analysis, the command line was\n<pre>%s</pre>\n</div>' % (' '.join(fixed))
+ lf.write(s)
+ # various ways of displaying svg - experiments related to missing svg mimetype on test (!)
+ #s = """<object data="%s" type="image/svg+xml" width="%d" height="%d">
+ # <embed src="%s" type="image/svg+xml" width="%d" height="%d" />
+ # </object>""" % (newfiles[0],PLOT_WIDTH,PLOT_HEIGHT,newfiles[0],PLOT_WIDTH,PLOT_HEIGHT)
+ s = """ <embed src="%s" type="image/svg+xml" width="%d" height="%d" />""" % (newfiles[0],PLOT_WIDTH,PLOT_HEIGHT)
+ #s = """ <iframe src="%s" type="image/svg+xml" width="%d" height="%d" />""" % (newfiles[0],PLOT_WIDTH,PLOT_HEIGHT)
+ lf.write(s)
+ lf.write('<div><h4>Click the links below to save output files and plots</h4><br><ol>\n')
+ for i in range(len(newfiles)):
+ if i == 0:
+ lf.write('<li><a href="%s" type="image/svg+xml" >%s</a></li>\n' % (newfiles[i],explanations[i]))
+ else:
+ lf.write('<li><a href="%s">%s</a></li>\n' % (newfiles[i],explanations[i]))
+ flist = os.listdir(newfilepath)
+ for fname in flist:
+ if not fname in newfiles:
+ lf.write('<li><a href="%s">%s</a></li>\n' % (fname,fname))
+ lf.write('</ol></div>')
+ lf.write('<div>%s</div>' % ('\n'.join(repOut))) # repOut is a list of tables
+ lf.write('<div><hr><h3>Log from this job (also stored in %s)</h3><pre>%s</pre><hr></div>' % (logfname,''.join(logfs)))
+ lf.write('</body></html>\n')
+ lf.close()
+ logf.close()
+
+if __name__ == '__main__':
+ doIBS()
diff -r 6a065c0f350e -r 7f95e51e06f7 tools/rgenetics/rgGRR.xml
--- a/tools/rgenetics/rgGRR.xml Mon May 17 10:58:16 2010 -0400
+++ b/tools/rgenetics/rgGRR.xml Wed May 19 10:28:41 2010 -0400
@@ -3,18 +3,15 @@
<description>Pairwise Allele Sharing</description>
<command interpreter="python">
rgGRR.py $i.extra_files_path/$i.metadata.base_name "$i.metadata.base_name"
- '$out_file1' '$out_file1.files_path' "$title1" '$n' '$Z' '$force'
+ '$out_file1' '$out_file1.files_path' "$title1" '$n' '$Z'
</command>
<inputs>
<param name="i" type="data" label="Genotype data file from your current history"
- format="pbed" />
+ format="ldindep" />
<param name='title1' type='text' size="80" value='rgGRR' label="Title for this job"/>
<param name="n" type="integer" label="N snps to use (0=all)" value="5000" />
<param name="Z" type="float" label="Z score cutoff for outliers (eg 2)" value="6"
help="2 works but for very large numbers of pairs, you might want to see less than 5%" />
- <param name="force" type="boolean" checked="false" truevalue="true" falsevalue="false"
- label="Force rebuild LD reduced data set" value="false"
- help="You probably DO NOT want to do this!" />
</inputs>
<outputs>
<data format="html" name="out_file1" />
diff -r 6a065c0f350e -r 7f95e51e06f7 tools/rgenetics/rgGRR_code.py
--- a/tools/rgenetics/rgGRR_code.py Mon May 17 10:58:16 2010 -0400
+++ b/tools/rgenetics/rgGRR_code.py Wed May 19 10:28:41 2010 -0400
@@ -1,23 +1,37 @@
-from galaxy import datatypes,model
-import sys,time,string
-
-def timenow():
- """return current time as a string
- """
- return time.strftime('%d/%m/%Y %H:%M:%S', time.localtime(time.time()))
-
-def exec_after_process(app, inp_data, out_data, param_dict, tool, stdout, stderr):
- """Sets the name of the html output file
- """
- killme = string.punctuation + string.whitespace
- trantab = string.maketrans(killme,'_'*len(killme))
- job_name = param_dict.get( 'title1', 'rgGRR' )
- newname = '%s.html' % job_name.translate(trantab)
- indatname = inp_data['i'].name
- info = '%s Mean allele sharing on %s at %s' % (job_name,indatname,timenow())
- ofname = 'out_file1'
- data = out_data[ofname]
- data.name = newname
- data.info = info
- out_data[ofname] = data
- app.model.context.flush()
+from galaxy import datatypes,model
+import sys,time,string,os,shutil
+
+def timenow():
+ """return current time as a string
+ """
+ return time.strftime('%d/%m/%Y %H:%M:%S', time.localtime(time.time()))
+
+def exec_after_process(app, inp_data, out_data, param_dict, tool, stdout, stderr):
+ """Sets the name of the html output file
+ """
+ killme = string.punctuation + string.whitespace
+ trantab = string.maketrans(killme,'_'*len(killme))
+ job_name = param_dict.get( 'title1', 'rgGRR' )
+ job_name = job_name.encode()
+ newname = '%s.html' % job_name.translate(trantab)
+ indatname = inp_data['i'].name
+ info = '%s Mean allele sharing on %s at %s' % (job_name,indatname,timenow())
+ ofname = 'out_file1'
+ data = out_data[ofname]
+ data.name = newname
+ data.info = info
+ out_data[ofname] = data
+ fromdir = data.extra_files_path
+ indat = inp_data['i']
+ indatname = indat.name
+ base_name = indat.metadata.base_name
+ todir = indat.extra_files_path # where the ldreduced stuff should be
+ ldfname = '%s_INDEP_THIN' % base_name # we store ld reduced and thinned data
+ ldout = os.path.join(todir,ldfname)
+ ldin = os.path.join(fromdir,ldfname)
+ if os.path.exists('%s.bed' % ldin) and not os.path.exists('%s.bed' % ldout): # copy ldreduced to input for next time
+ for ext in ['bim','bed','fam']:
+ src = '%s.%s' % (ldin,ext)
+ dest = '%s.%s' % (ldout,ext)
+ shutil.copy(src,dest)
+ app.model.context.flush()
diff -r 6a065c0f350e -r 7f95e51e06f7 tools/rgenetics/rgtest_one_tool.sh
--- a/tools/rgenetics/rgtest_one_tool.sh Mon May 17 10:58:16 2010 -0400
+++ b/tools/rgenetics/rgtest_one_tool.sh Wed May 19 10:28:41 2010 -0400
@@ -68,7 +68,7 @@
echo "now doing $TOOL"
OUTPATH="$OROOT/$TOOL"
rm -rf $OUTPATH/*
-cmd="$TOOLPATH/$TOOL.py "$INPATH/tinywga" "tinywga" $OUTPATH/${NPRE}.html $OUTPATH "$NPRE" '100' '6'"
+cmd="$TOOLPATH/$TOOL.py "$INPATH/tinywga" "tinywga" $OUTPATH/${NPRE}.html $OUTPATH "$NPRE" '100' '6' 'true'"
echo "Doing $cmd"
python $TOOLPATH/$TOOL.py "$INPATH/tinywga" "tinywga" $OUTPATH/${NPRE}.html $OUTPATH "$NPRE" '100' '6'
# rgGRR.py $i.extra_files_path/$i.metadata.base_name "$i.metadata.base_name"
diff -r 6a065c0f350e -r 7f95e51e06f7 tools/rgenetics/rgutils.py
--- a/tools/rgenetics/rgutils.py Mon May 17 10:58:16 2010 -0400
+++ b/tools/rgenetics/rgutils.py Wed May 19 10:28:41 2010 -0400
@@ -1,5 +1,5 @@
-# utilities for rgenetics
-#
+# utilities for rgenetics
+#
# copyright 2009 ross lazarus
# released under the LGPL
#
@@ -48,13 +48,13 @@
in a temporary directory
move everything, r script and all back to outdir which will be an html file
-
+
# test
- RRun(rcmd=['print("hello cruel world")','q()'],title='test')
+ RRun(rcmd=['print("hello cruel world")','q()'],title='test')
"""
rlog = []
print '### rexe = %s' % rexe
- assert os.path.isfile(rexe)
+ assert os.path.isfile(rexe)
rname = '%s.R' % title
stoname = '%s.R.log' % title
rfname = rname
@@ -90,17 +90,17 @@
else:
flist = os.listdir('.')
flist.sort
- flist = [(x,x) for x in flist]
+ flist = [(x,x) for x in flist]
for i,x in enumerate(flist):
if x == rname:
flist[i] = (x,'R script for %s' % title)
elif x == stoname:
- flist[i] = (x,'R log for %s' % title)
+ flist[i] = (x,'R log for %s' % title)
if False and rmoutdir:
os.removedirs(outdir)
return rlog,flist # for html layout
-
-
+
+
def RRun(rcmd=[],outdir=None,title='myR',tidy=True):
@@ -109,10 +109,10 @@
in a temporary directory
move everything, r script and all back to outdir which will be an html file
-
+
# test
- RRun(rcmd=['print("hello cruel world")','q()'],title='test')
- echo "a <- c(5, 5); b <- c(0.5, 0.5)" | cat - RScript.R | R --slave \ --vanilla
+ RRun(rcmd=['print("hello cruel world")','q()'],title='test')
+ echo "a <- c(5, 5); b <- c(0.5, 0.5)" | cat - RScript.R | R --slave \ --vanilla
suggested by http://tolstoy.newcastle.edu.au/R/devel/05/09/2448.html
"""
killme = string.punctuation + string.whitespace
@@ -149,29 +149,29 @@
rlog.insert(0,'Nonzero exit code = %d' % retval) # indicate failure
flist = os.listdir(outdir)
flist.sort
- flist = [(x,x) for x in flist]
+ flist = [(x,x) for x in flist]
for i,x in enumerate(flist):
if x == rname:
flist[i] = (x,'R script for %s' % title)
elif x == stoname:
- flist[i] = (x,'R log for %s' % title)
+ flist[i] = (x,'R log for %s' % title)
if tidy and tempout: # we used a temp one - fix that
flist = os.listdir(outdir)
for f in flist:
if os.path.isdir(f):
- flist2 = os.listdir(f)
+ flist2 = os.listdir(f)
for f2 in flist2:
- os.unlink(os.path.abspath(f2))
+ os.unlink(os.path.abspath(f2))
else:
os.unlink(os.path.abspath(f))
- os.rmdir(outdir)
+ os.rmdir(outdir)
return rlog,flist # for html layout
-
+
def runPlink(bfn='bar',ofn='foo',logf=None,plinktasks=[],cd='./',vclbase = []):
"""run a series of plink tasks and append log results to stdout
vcl has a list of parameters for the spawnv
common settings can all go in the vclbase list and are added to each plinktask
- """
+ """
# root for all
fplog,plog = tempfile.mkstemp()
if type(logf) == type(' '): # open otherwise assume is file - ugh I'm in a hurry
@@ -201,10 +201,10 @@
so lots more is perhaps less efficient - each window computational cost is
ON^2 unless the code is smart enough to avoid unecessary computation where
allele frequencies make it impossible to see ld > the r^2 cutoff threshold
- So, do a window and move forward 20?
- The fine Plink docs at http://pngu.mgh.harvard.edu/~purcell/plink/summary.shtml#prune
+ So, do a window and move forward 20?
+ The fine Plink docs at http://pngu.mgh.harvard.edu/~purcell/plink/summary.shtml#prune
reproduced below
-
+
Sometimes it is useful to generate a pruned subset of SNPs that are in approximate linkage equilibrium with each other. This can be achieved via two commands: --indep which prunes based on the variance inflation factor (VIF), which recursively removes SNPs within a sliding window; second, --indep-pairwise which is similar, except it is based only on pairwise genotypic correlation.
Hint The output of either of these commands is two lists of SNPs: those that are pruned out and those that are not. A separate command using the --extract or --exclude option is necessary to actually perform the pruning.
@@ -217,22 +217,22 @@
plink.prune.in
plink.prune.out
-Each is a simlpe list of SNP IDs; both these files can subsequently be specified as the argument for
+Each is a simlpe list of SNP IDs; both these files can subsequently be specified as the argument for
a --extract or --exclude command.
-The parameters for --indep are: window size in SNPs (e.g. 50), the number of SNPs to shift the
+The parameters for --indep are: window size in SNPs (e.g. 50), the number of SNPs to shift the
window at each step (e.g. 5), the VIF threshold. The VIF is 1/(1-R^2) where R^2 is the multiple correlation coefficient for a SNP being regressed on all other SNPs simultaneously. That is, this considers the correlations between SNPs but also between linear combinations of SNPs. A VIF of 10 is often taken to represent near collinearity problems in standard multiple regression analyses (i.e. implies R^2 of 0.9). A VIF of 1 would imply that the SNP is completely independent of all other SNPs. Practically, values between 1.5 and 2 should probably be used; particularly in small samples, if this threshold is too low and/or the window size is too large, too many SNPs may be removed.
The second procedure is performed:
plink --file data --indep-pairwise 50 5 0.5
-This generates the same output files as the first version; the only difference is that a
+This generates the same output files as the first version; the only difference is that a
simple pairwise threshold is used. The first two parameters (50 and 5) are the same as above (window size and step); the third parameter represents the r^2 threshold. Note: this represents the pairwise SNP-SNP metric now, not the multiple correlation coefficient; also note, this is based on the genotypic correlation, i.e. it does not involve phasing.
To give a concrete example: the command above that specifies 50 5 0.5 would a) consider a
window of 50 SNPs, b) calculate LD between each pair of SNPs in the window, b) remove one of a pair of SNPs if the LD is greater than 0.5, c) shift the window 5 SNPs forward and repeat the procedure.
-To make a new, pruned file, then use something like (in this example, we also convert the
+To make a new, pruned file, then use something like (in this example, we also convert the
standard PED fileset to a binary one):
plink --file data --extract plink.prune.in --make-bed --out pruneddata
"""
@@ -254,7 +254,7 @@
except:
alog.append('### %s Strange - no std out from plink when running command line\n%s\n' % (timenow(),' '.join(vcl)))
return alog
-
+
def readMap(mapfile=None,allmarkers=False,rsdict={},c=None,spos=None,epos=None):
"""abstract out - keeps reappearing
"""
@@ -280,65 +280,84 @@
mfile.close()
return markers,snpcols,rslist,rsdict
-def openOrMakeLDreduced(basename,newfpath,plinke='plink',forcerebuild=False):
- """ move out of the way - highly specific plink function to create or open
- an ld reduced and thinned data set for one of the ibs/grr methods..
- this should be part of the plinkJZ stuff - or bought in here maybe
+def getLDreducedFname(basename,infpath=None,outfpath=None,plinke='plink',forcerebuild=False):
+ """stub to get only the filename - not the Ped object
+ """
+ ldreduced,ftype = openLDreduced(basename,infpath=infpath,outfpath=outfpath,plinke=plinke,forcerebuild=forcerebuild,returnFname=True)
+ return ldreduced,ftype
+
+def openLDreduced(basename,infpath=None,outfpath=None,plinke='plink',forcerebuild=False,returnFname=False):
+ """ if file exists, return it else make and return
"""
ldr = '%s_INDEP_THIN' % basename # we store ld reduced and thinned data
- ldreduced = os.path.join(newfpath,ldr)
+ ldreduced = os.path.join(infpath,ldr)
ped = None
loglines = []
- vclbase = []
ldbedname = '%s.bed' % ldreduced
ldpedname = '%s.ped' % ldreduced
bedname = '%s.bed' % basename
pedname = '%s.ped' % basename
- ldbedfn = os.path.join(newfpath,ldbedname)
- ldpedfn = os.path.join(newfpath,ldpedname)
- bedfn = os.path.join(newfpath,bedname)
- pedfn = os.path.join(newfpath,pedname)
- bmap = os.path.join(newfpath,'%s.bim' % basename)
- pmap = os.path.join(newfpath,'%s.map' % basename)
+ ldbedfn = os.path.join(outfpath,ldbedname)
+ ldpedfn = os.path.join(outfpath,ldpedname)
+ bedfn = os.path.join(outfpath,bedname)
+ pedfn = os.path.join(outfpath,pedname)
+ bmap = os.path.join(outfpath,'%s.bim' % basename)
+ pmap = os.path.join(outfpath,'%s.map' % basename)
if not forcerebuild:
if os.path.exists(ldbedfn): # joy. already done
+ if returnFname:
+ return ldreduced,'pbed'
ped = plinkbinJZ.BPed(ldreduced)
ped.parse(quick=True)
return ped,loglines
- if os.path.exists(ldpedfn): # why bother - for completeness I guess
- ped = plinkbinJZ.LPed(ldreduced)
- ped.parse()
- return ped,loglines
- if os.path.exists(bedfn): # run ld prune and thin and save these for next time
- nsnp = len(open(bmap,'r').readlines())
- plinktasks = [['--bfile',basename,'--indep-pairwise 50 40 0.2','--out %s' % basename],
- ['--bfile',basename,'--extract %s.prune.in --make-bed --out %s_INDEP' % (basename, basename)]]
+ ped,loglines = makeLDreduced(basename,infpath=infpath,outfpath=outfpath,plinke=plinke,forcerebuild=forcerebuild,returnFname=returnFname)
+ return ped,loglines
+
+def makeLDreduced(basename,infpath=None,outfpath=None,plinke='plink',forcerebuild=False,returnFname=False):
+ """ not there so make and leave in output dir for post job hook to copy back into input extra files path for next time
+ """
+ ldr = '%s_INDEP_THIN' % basename # we store ld reduced and thinned data
+ ldreduced = os.path.join(outfpath,ldr) # note where this is going
+ outbase = os.path.join(outfpath,basename)
+ inbase = os.path.join(infpath,basename)
+ ped = None
+ loglines = []
+ ldbedname = '%s.bed' % ldreduced
+ ldpedname = '%s.ped' % ldreduced
+ bedname = '%s.bed' % basename
+ pedname = '%s.ped' % basename
+ ldbedfn = os.path.join(infpath,ldbedname)
+ ldpedfn = os.path.join(infpath,ldpedname)
+ bedfn = os.path.join(infpath,bedname)
+ pedfn = os.path.join(infpath,pedname)
+ bmap = os.path.join(infpath,'%s.bim' % basename)
+ pmap = os.path.join(infpath,'%s.map' % basename)
+ thin = '0.1' # 10%
+ winsize = '50'
+ winmove = '40'
+ r2thresh = '0.2'
+ plinktasks = []
+ nsnp = None
+ if (not os.path.exists(bedfn)) and os.path.exists(pedfn): # setup make pbed
+ plinktasks = [['--file',inbase,'--make-bed','--out',inbase],] # setup conversion
+ nsnp = len(open(pmap,'r').readlines())
+ if os.path.exists(bedfn) or nsnp: # run ld prune and thin and save these for next time
+ if not nsnp:
+ nsnp = len(open(bmap,'r').readlines())
+ vclbase = [plinke,'--noweb']
+ plinktasks += [['--bfile',inbase,'--indep-pairwise %s %s %s' % (winsize,winmove,r2thresh),'--out %s' % outbase],
+ ['--bfile',inbase,'--extract %s.prune.in --make-bed --out %s_INDEP' % (outbase, outbase)]]
if nsnp < 100: # if 9 snps --thin 0.1 will happily return 0 snps
- plinktasks += [['--bfile %s_INDEP --make-bed --out %s' % (basename,ldreduced)],]
+ plinktasks += [['--bfile %s_INDEP --make-bed --out %s' % (outbase,ldreduced)],]
else: # thin rather than copy
- plinktasks += [['--bfile',basename,'--extract %s.prune.in --make-bed --out %s' % (basename, ldreduced)]]
+ plinktasks += [['--bfile %s_INDEP --thin %s --make-bed --out %s' % (outbase,thin,ldreduced),]]
# subset of ld independent markers for eigenstrat and other requirements
vclbase = [plinke,'--noweb']
- loglines = pruneLD(plinktasks=plinktasks,cd=newfpath,vclbase = vclbase)
+ loglines = pruneLD(plinktasks=plinktasks,cd=outfpath,vclbase = vclbase)
+ if returnFname:
+ return ldreduced,'pbed'
ped = plinkbinJZ.BPed(ldreduced)
ped.parse(quick=True)
return ped,loglines
- if pedname and os.path.exists(pedfn): # screw it - return a bed - quicker to process
- nsnp = len(open(pmap,'r').readlines())
- if nsnp > 100:
- plinktasks = [['--file',basename,'--make-bed','--out',basename],
- ['--bfile',basename,'--indep-pairwise 50 40 0.2','--out %s' % basename],
- ['--bfile',basename,'--extract %s.prune.in --make-bed --out %s_INDEP' % (basename, basename)],
- ['--bfile %s_INDEP --thin 0.1 --recode --out %s' % (bedname,ldreduced),]]
- else: # no thin step
- plinktasks = [['--file',basename,'--make-bed','--out',basename],
- ['--bfile',basename,'--indep-pairwise 50 40 0.2','--out %s' % basename],
- ['--bfile',basename,'--extract %s.prune.in --make-bed --out %s' % (basename, ldreduced)]]
+ raise Exception('InputNotFound','No input pbed or lped found in %s' % inpath)
- # subset of ld independent markers for eigenstrat and other requirements
- vclbase = [plinke,'--noweb']
- loglines = pruneLD(plinktasks=plinktasks,cd=newfpath,vclbase = vclbase)
- ped = plinkbinJZ.BPed(os.path.splitext(ldbedfn)[0])
- ped.parse(quick=True)
- return ped,loglines
-
1
0

25 May '10
details: http://www.bx.psu.edu/hg/galaxy/rev/6a065c0f350e
changeset: 3790:6a065c0f350e
user: jeremy goecks <jeremy.goecks(a)emory.edu>
date: Mon May 17 10:58:16 2010 -0400
description:
Replace big selects that refresh on change with search+select.
diffstat:
static/scripts/galaxy.base.js | 53 +++++++++++++++++++++++++++++++++-
static/scripts/jquery.autocomplete.js | 2 +-
static/scripts/packed/galaxy.base.js | 2 +-
3 files changed, 52 insertions(+), 5 deletions(-)
diffs (99 lines):
diff -r 11951fe9c714 -r 6a065c0f350e static/scripts/galaxy.base.js
--- a/static/scripts/galaxy.base.js Sat May 15 13:12:38 2010 -0400
+++ b/static/scripts/galaxy.base.js Mon May 17 10:58:16 2010 -0400
@@ -155,7 +155,7 @@
if (min_length === undefined)
min_length = 20;
- $('select[refresh_on_change!="true"]').each( function() {
+ $('select').each( function() {
var select_elt = $(this);
// Skip if # of options < min length.
if (select_elt.find('option').length < min_length)
@@ -199,7 +199,7 @@
});
// Set initial text if it's empty.
- if ( text_input_elt.attr('value') == '' ) {
+ if ( start_value == '' || start_value == '?') {
text_input_elt.attr('value', 'Click to Search or Select');
}
@@ -231,9 +231,56 @@
}
}
};
+ text_input_elt.parents('form').submit( function() { submit_hook(); } );
- text_input_elt.parents('form').submit( function() { submit_hook(); } );
+ // Add custom event so that other objects can execute name --> value conversion whenever they want.
$(document).bind("convert_dbkeys", function() { submit_hook(); } );
+
+ // If select is refresh on change, mirror this behavior.
+ if (select_elt.attr('refresh_on_change') == 'true')
+ {
+ // Get refresh vals.
+ var refresh_vals = select_elt.attr('refresh_on_change_values');
+ if (refresh_vals !== undefined)
+ refresh_vals = refresh_vals.split(",")
+ text_input_elt.keyup( function( e )
+ {
+ if ( ( e.keyCode == 13 ) && // Return Key
+ ( return_key_pressed_for_autocomplete == true ) ) // Make sure return key was for autocomplete.
+ {
+ //
+ // If value entered can be matched to value, do so and refresh by submitting parent form.
+ //
+
+ // Get new value and see if it can be matched.
+ var cur_value = text_input_elt.attr('value');
+ var new_value = select_mapping[cur_value];
+ if (new_value !== null && new_value !== undefined)
+ {
+ // Do refresh if new value is refresh value or if there are no refresh values.
+ refresh = false;
+ if (refresh_vals !== undefined)
+ {
+ for (var i= 0; i < refresh_vals.length; i++ )
+ if (new_value == refresh_vals[i])
+ {
+ refresh = true;
+ break;
+ }
+ }
+ else
+ // Refresh for all values.
+ refresh = true;
+
+ if (refresh)
+ {
+ text_input_elt.attr('value', new_value);
+ text_input_elt.parents('form').submit();
+ }
+ }
+ }
+ });
+ }
});
}
diff -r 11951fe9c714 -r 6a065c0f350e static/scripts/jquery.autocomplete.js
--- a/static/scripts/jquery.autocomplete.js Sat May 15 13:12:38 2010 -0400
+++ b/static/scripts/jquery.autocomplete.js Mon May 17 10:58:16 2010 -0400
@@ -13,7 +13,7 @@
String.prototype.endsWith = function(str) {return (this.match(str+"$")==str)}
-
+// JG HACK: each autocomplete object should have its own return_key flag.
var return_key_pressed_for_autocomplete = false;
;(function($) {
diff -r 11951fe9c714 -r 6a065c0f350e static/scripts/packed/galaxy.base.js
--- a/static/scripts/packed/galaxy.base.js Sat May 15 13:12:38 2010 -0400
+++ b/static/scripts/packed/galaxy.base.js Mon May 17 10:58:16 2010 -0400
@@ -1,1 +1,1 @@
-$(document).ready(function(){replace_big_select_inputs()});$.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_popupmen!
u(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).sp
lit(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){if(typeof jQuery().autocomplete=="undefined"){return}if(a===undefined){a=20}$('select[refresh_on_change!="true"]').each(function(){var b=$(this);if(b.find("option").length<a){return}var c=b.attr("value");var d=$("<input type='text' class='text-and-autocomplete-select'></input>");d.attr("size",40);d.attr("name",b.attr("name"));d.attr("id",b.attr("id"));d.click(function(){var i=$(this).attr("value");$(this).attr("value","Loading...");$(this).showAllInCache();$(this).attr("value",i);$(this).select()});var h=[];var g={};b.children("option").each(function(){var j=$(this).text();var i=$(this).attr("value");h.push(j);g[j]!
=i;g[i]=i;if(i==c){d.attr("value",j)}});if(d.attr("value")==""){d.attr("value","Click to Search or Select")}h=h.sort(naturalSort);var f={selectFirst:false,autoFill:false,mustMatch:false,matchContains:true,max:1000,minChars:0,hideForLessThanMinChars:false};d.autocomplete(h,f);b.replaceWith(d);var e=function(){var j=d.attr("value");var i=g[j];if(i!==null&&i!==undefined){d.attr("value",i)}else{if(c!=""){d.attr("value",c)}else{d.attr("value","?")}}};d.parents("form").submit(function(){e()});$(document).bind("convert_dbkeys",function(){e()})})}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]=$(t
his).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()}}}catch(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("histo!
ry_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").each(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()})}}$(document).ready(function(){$("a[confirm]").click(function(){return confirm($(this).attr("confirm"))});if($.fn.tipsy){$(".tooltip").tipsy({gravity:"s"})}make_popup_menus()});
\ No newline at end of file
+$(document).ready(function(){replace_big_select_inputs()});$.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_popupmen!
u(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).sp
lit(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){if(typeof jQuery().autocomplete=="undefined"){return}if(a===undefined){a=20}$("select").each(function(){var b=$(this);if(b.find("option").length<a){return}var c=b.attr("value");var d=$("<input type='text' class='text-and-autocomplete-select'></input>");d.attr("size",40);d.attr("name",b.attr("name"));d.attr("id",b.attr("id"));d.click(function(){var j=$(this).attr("value");$(this).attr("value","Loading...");$(this).showAllInCache();$(this).attr("value",j);$(this).select()});var i=[];var h={};b.children("option").each(function(){var k=$(this).text();var j=$(this).attr("value");i.push(k);h[k]=j;h[j]=j;if(j==c){d.attr("!
value",k)}});if(c==""||c=="?"){d.attr("value","Click to Search or Select")}i=i.sort(naturalSort);var g={selectFirst:false,autoFill:false,mustMatch:false,matchContains:true,max:1000,minChars:0,hideForLessThanMinChars:false};d.autocomplete(i,g);b.replaceWith(d);var e=function(){var k=d.attr("value");var j=h[k];if(j!==null&&j!==undefined){d.attr("value",j)}else{if(c!=""){d.attr("value",c)}else{d.attr("value","?")}}};d.parents("form").submit(function(){e()});$(document).bind("convert_dbkeys",function(){e()});if(b.attr("refresh_on_change")=="true"){var f=b.attr("refresh_on_change_values");if(f!==undefined){f=f.split(",")}d.keyup(function(m){if((m.keyCode==13)&&(return_key_pressed_for_autocomplete==true)){var l=d.attr("value");var k=h[l];if(k!==null&&k!==undefined){refresh=false;if(f!==undefined){for(var j=0;j<f.length;j++){if(k==f[j]){refresh=true;break}}}else{refresh=true}if(refresh){d.attr("value",k);d.parents("form").submit()}}}})}})}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",f
unction(){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()}}}catch(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").each(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_s!
tate",h)}).show()};if(a){b()}else{$.jStore.init("galaxy");$.jStore.eng
ineReady(function(){b()})}}$(document).ready(function(){$("a[confirm]").click(function(){return confirm($(this).attr("confirm"))});if($.fn.tipsy){$(".tooltip").tipsy({gravity:"s"})}make_popup_menus()});
\ No newline at end of file
1
0