galaxy-dev
Threads by month
- ----- 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
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
October 2009
- 18 participants
- 172 discussions
02 Oct '09
details: http://www.bx.psu.edu/hg/galaxy/rev/3bd7acfe34cc
changeset: 2809:3bd7acfe34cc
user: Greg Von Kuster <greg(a)bx.psu.edu>
date: Wed Sep 30 15:35:05 2009 -0400
description:
Allow for a specified target for display links, rahter than forcing it to be _blank - this will allow external tools like GeneTrack to run inside the Galaxy frame set.
3 file(s) affected in this change:
lib/galaxy/datatypes/data.py
lib/galaxy/datatypes/tracks.py
templates/root/history_common.mako
diffs (64 lines):
diff -r 9cc7a17e0ac7 -r 3bd7acfe34cc lib/galaxy/datatypes/data.py
--- a/lib/galaxy/datatypes/data.py Wed Sep 30 14:47:17 2009 -0400
+++ b/lib/galaxy/datatypes/data.py Wed Sep 30 15:35:05 2009 -0400
@@ -171,11 +171,11 @@
def get_mime(self):
"""Returns the mime type of the datatype"""
return 'application/octet-stream'
- def add_display_app (self, app_id, label, file_function, links_function ):
+ def add_display_app ( self, app_id, label, file_function, links_function ):
"""
Adds a display app to the datatype.
app_id is a unique id
- label is the primary display label, ie display at 'UCSC'
+ label is the primary display label, e.g., display at 'UCSC'
file_function is a string containing the name of the function that returns a properly formatted display
links_function is a string containing the name of the function that returns a list of (link_name,link)
"""
@@ -205,7 +205,7 @@
except:
log.exception('Function %s is referred to in datatype %s for displaying as type %s, but is not accessible' % (self.supported_display_apps[type]['file_function'], self.__class__.__name__, type) )
return "This display type (%s) is not implemented for this datatype (%s)." % ( type, dataset.ext)
- def get_display_links(self, dataset, type, app, base_url, **kwd):
+ def get_display_links( self, dataset, type, app, base_url, target_frame='_blank', **kwd ):
"""
Returns a list of tuples of (name, link) for a particular display type. No check on
'access' permissions is done here - if you can view the dataset, you can also save it
@@ -214,7 +214,7 @@
"""
try:
if type in self.get_display_types():
- return getattr (self, self.supported_display_apps[type]['links_function']) (dataset, type, app, base_url, **kwd)
+ return target_frame, getattr ( self, self.supported_display_apps[type]['links_function'] ) ( dataset, type, app, base_url, **kwd )
except:
log.exception( 'Function %s is referred to in datatype %s for generating links for type %s, but is not accessible' \
% ( self.supported_display_apps[type]['links_function'], self.__class__.__name__, type ) )
diff -r 9cc7a17e0ac7 -r 3bd7acfe34cc lib/galaxy/datatypes/tracks.py
--- a/lib/galaxy/datatypes/tracks.py Wed Sep 30 14:47:17 2009 -0400
+++ b/lib/galaxy/datatypes/tracks.py Wed Sep 30 15:35:05 2009 -0400
@@ -27,6 +27,8 @@
def __init__(self, **kwargs):
super( GeneTrack, self ).__init__( **kwargs )
self.add_display_app( 'genetrack', 'View in GeneTrack', '', 'genetrack_link' )
+ def get_display_links( self, dataset, type, app, base_url, target_frame='galaxy_main', **kwd ):
+ return data.Binary.get_display_links( self, dataset, type, app, base_url, target_frame=target_frame, **kwd )
def genetrack_link( self, hda, type, app, base_url ):
ret_val = []
if hda.has_data:
diff -r 9cc7a17e0ac7 -r 3bd7acfe34cc templates/root/history_common.mako
--- a/templates/root/history_common.mako Wed Sep 30 14:47:17 2009 -0400
+++ b/templates/root/history_common.mako Wed Sep 30 15:35:05 2009 -0400
@@ -83,11 +83,11 @@
<a href="${h.url_for( action='display', id=data.id, tofile='yes', toext=data.ext )}" target="_blank">save</a>
| <a href="${h.url_for( controller='tool_runner', action='rerun', id=data.id )}" target="galaxy_main">rerun</a>
%for display_app in data.datatype.get_display_types():
- <% display_links = data.datatype.get_display_links( data, display_app, app, request.base ) %>
+ <% target_frame, display_links = data.datatype.get_display_links( data, display_app, app, request.base ) %>
%if len( display_links ) > 0:
| ${data.datatype.get_display_label(display_app)}
%for display_name, display_link in display_links:
- <a target="_blank" href="${display_link}">${_(display_name)}</a>
+ <a target="${target_frame}" href="${display_link}">${_(display_name)}</a>
%endfor
%endif
%endfor
1
0
02 Oct '09
details: http://www.bx.psu.edu/hg/galaxy/rev/268ab95fc8a7
changeset: 2806:268ab95fc8a7
user: Dan Blankenberg <dan(a)bx.psu.edu>
date: Wed Sep 30 14:06:06 2009 -0400
description:
Fix reporting number of regions processed in MAF Stats tool.
1 file(s) affected in this change:
tools/maf/maf_stats.py
diffs (22 lines):
diff -r c63a444cd7ba -r 268ab95fc8a7 tools/maf/maf_stats.py
--- a/tools/maf/maf_stats.py Wed Sep 30 11:40:09 2009 -0400
+++ b/tools/maf/maf_stats.py Wed Sep 30 14:06:06 2009 -0400
@@ -54,7 +54,7 @@
out = open(output_filename, 'w')
- num_region = 0
+ num_region = None
species_summary = {}
total_length = 0
#loop through interval file
@@ -97,7 +97,8 @@
for spec in species_summary:
out.write( "%s\t%s\t%.4f\n" % ( spec, species_summary[spec], float( species_summary[spec] ) / total_length ) )
out.close()
- print "%i regions were processed with a total length of %i." % ( num_region, total_length )
+ if num_region is not None:
+ print "%i regions were processed with a total length of %i." % ( num_region + 1, total_length )
maf_utilities.remove_temp_index_file( index_filename )
if __name__ == "__main__": __main__()
1
0
02 Oct '09
details: http://www.bx.psu.edu/hg/galaxy/rev/aafecc059ba6
changeset: 2807:aafecc059ba6
user: Anton Nekrutenko <anton(a)bx.psu.edu>
date: Wed Sep 30 14:11:01 2009 -0400
description:
Added text trimmer that can be used to groom fastq data
6 file(s) affected in this change:
test-data/trimmer_a_f_c0_s1_e13_i62.dat
test-data/trimmer_a_f_c2_s1_e2_i62.dat
test-data/trimmer_tab_delimited.dat
tool_conf.xml.sample
tools/filters/trimmer.py
tools/filters/trimmer.xml
diffs (273 lines):
diff -r 268ab95fc8a7 -r aafecc059ba6 test-data/trimmer_a_f_c0_s1_e13_i62.dat
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/trimmer_a_f_c0_s1_e13_i62.dat Wed Sep 30 14:11:01 2009 -0400
@@ -0,0 +1,5 @@
+12345 abcdef
+67890 ghjkl g
+>assa lljlj ljlj
+sasas hghg hg
+@dgf gfgf gfg
diff -r 268ab95fc8a7 -r aafecc059ba6 test-data/trimmer_a_f_c2_s1_e2_i62.dat
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/trimmer_a_f_c2_s1_e2_i62.dat Wed Sep 30 14:11:01 2009 -0400
@@ -0,0 +1,5 @@
+12345 ab xyz
+67890 gh ghjt
+>assa lljlj ljlj
+sasas hg hghg
+@dgf gf gfgf
diff -r 268ab95fc8a7 -r aafecc059ba6 test-data/trimmer_tab_delimited.dat
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/trimmer_tab_delimited.dat Wed Sep 30 14:11:01 2009 -0400
@@ -0,0 +1,5 @@
+12345 abcdef xyz
+67890 ghjkl ghjt
+>assa lljlj ljlj
+sasas hghg hghg
+@dgf gfgf gfgf
diff -r 268ab95fc8a7 -r aafecc059ba6 tool_conf.xml.sample
--- a/tool_conf.xml.sample Wed Sep 30 14:06:06 2009 -0400
+++ b/tool_conf.xml.sample Wed Sep 30 14:11:01 2009 -0400
@@ -45,6 +45,7 @@
<tool file="filters/remove_beginning.xml" />
<tool file="filters/headWrapper.xml" />
<tool file="filters/tailWrapper.xml" />
+ <tool file="filters/trimmer.xml" />
</section>
<section name="Filter and Sort" id="filter">
<tool file="stats/filtering.xml" />
diff -r 268ab95fc8a7 -r aafecc059ba6 tools/filters/trimmer.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/filters/trimmer.py Wed Sep 30 14:11:01 2009 -0400
@@ -0,0 +1,108 @@
+#!/usr/bin/env python
+
+import sys
+import optparse
+
+def stop_err( msg ):
+ sys.stderr.write( msg )
+ sys.exit()
+
+def main():
+ usage = """%prog [options]
+
+options (listed below) default to 'None' if omitted
+ """
+ parser = optparse.OptionParser(usage=usage)
+
+ parser.add_option(
+ '-a','--ascii',
+ dest='ascii',
+ action='store_true',
+ default = False,
+ help='Use ascii codes to defined ignored beginnings instead of raw characters')
+
+ parser.add_option(
+ '-q','--fastq',
+ dest='fastq',
+ action='store_true',
+ default = False,
+ help='The input data in fastq format. It selected the script skips every even line since they contain sequence ids')
+
+ parser.add_option(
+ '-i','--ignore',
+ dest='ignore',
+ help='A comma separated list on ignored beginnings (e.g., ">,@"), or its ascii codes (e.g., "60,42") if option -a is enabled')
+
+ parser.add_option(
+ '-s','--start',
+ dest='start',
+ default = '0',
+ help='Trim from beginning to here (1-based)')
+
+ parser.add_option(
+ '-e','--end',
+ dest='end',
+ default = '0',
+ help='Trim from here to the ned (1-based)')
+
+ parser.add_option(
+ '-f','--file',
+ dest='input_txt',
+ default = False,
+ help='Name of file to be chopped. STDIN is default')
+
+ parser.add_option(
+ '-c','--column',
+ dest='col',
+ default = '0',
+ help='Column to chop. If 0 = chop the whole line')
+
+
+ options, args = parser.parse_args()
+ invalid_starts = []
+
+ if options.input_txt:
+ infile = open ( options.input_txt, 'r')
+ else:
+ infile = sys.stdin
+
+ if options.ignore and options.ignore != "None":
+ invalid_starts = options.ignore.split(',')
+
+ if options.ascii and options.ignore and options.ignore != "None":
+ for i, item in enumerate( invalid_starts ):
+ invalid_starts[i] = chr( int( item ) )
+
+ col = int( options.col )
+
+ for i, line in enumerate( infile ):
+ line = line.rstrip( '\r\n' )
+ if line:
+
+ if options.fastq and i % 2 == 0:
+ print line
+ continue
+
+ if options.fastq and line.startswith('@'):
+ stop_err('Malformed fastq file: even numbered line starts with @')
+
+ if line[0] not in invalid_starts:
+ if col == 0:
+ if int( options.end ) > 0:
+ line = line[ int( options.start )-1 : int( options.end ) ]
+ else:
+ line = line[ int( options.start )-1 : ]
+ else:
+ fields = line.split( '\t' )
+ if col-1 > len( fields ):
+ stop_err('Column %d does not exist. Check input parameters\n' % col)
+
+ if int( options.end ) > 0:
+ fields[col - 1] = fields[col - 1][ int( options.start )-1 : int( options.end ) ]
+ else:
+ fields[col - 1] = fields[col - 1][ int( options.start )-1 : ]
+ line = '\t'.join(fields)
+ print line
+
+if __name__ == "__main__": main()
+
diff -r 268ab95fc8a7 -r aafecc059ba6 tools/filters/trimmer.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/filters/trimmer.xml Wed Sep 30 14:11:01 2009 -0400
@@ -0,0 +1,119 @@
+<tool id="trimmer" name="Trim" version="0.0.1">
+ <description>leading or trailing characters</description>
+ <command interpreter="python">
+ chopper.py -a -f $input1 -c $col -s $start -e $end -i $ignore $fastq > $out_file1
+ </command>
+ <inputs>
+ <param format="tabular,text" name="input1" type="data" label="this dataset"/>
+ <param name="col" type="integer" value="0" label="Trim this column only" help="0 = process entire line" />
+ <param name="start" type="integer" size="10" value="1" label="Trim from the beginning to this position" help="1 = do not trim the beginning"/>
+ <param name="end" type="integer" size="10" value="0" label="Remove everything from this position to the end" help="0 = do not trim the end"/>
+ <param name="fastq" type="select" label="Is input dataset in fastq format?" help="If set to YES, the tool will not trim evenly numbered lines (0, 2, 4, etc...)">
+ <option value="-q">Yes</option>
+ <option value="">No</option>
+ </param>
+ <param name="ignore" type="select" display="checkboxes" multiple="True" label="Ignore lines beginning with these characters" help="lines beginning with these are not trimmed">
+ <option value="62">></option>
+ <option value="64">@</option>
+ <option value="43">+</option>
+ <option value="60"><</option>
+ <option value="42">*</option>
+ <option value="45">-</option>
+ <option value="61">=</option>
+ <option value="124">|</option>
+ <option value="63">?</option>
+ <option value="36">$</option>
+ <option value="46">.</option>
+ <option value="58">:</option>
+ <option value="38">&</option>
+ <option value="37">%</option>
+ <option value="94">^</option>
+ </param>
+ </inputs>
+ <outputs>
+ <data name="out_file1" format="input" metadata_source="input1"/>
+ </outputs>
+ <tests>
+ <test>
+ <param name="input1" value="trimmer_tab_delimited.dat"/>
+ <param name="col" value="0"/>
+ <param name="start" value="1"/>
+ <param name="end" value="13"/>
+ <param name="ignore" value="62"/>
+ <param name="fastq" value="No"/>
+ <output name="out_file1" file="trimmer_a_f_c0_s1_e13_i62.dat"/>
+ </test>
+ <test>
+ <param name="input1" value="trimmer_tab_delimited.dat"/>
+ <param name="col" value="2"/>
+ <param name="start" value="1"/>
+ <param name="end" value="2"/>
+ <param name="ignore" value="62"/>
+ <param name="fastq" value="No"/>
+ <output name="out_file1" file="trimmer_a_f_c2_s1_e2_i62.dat"/>
+ </test>
+
+ </tests>
+
+ <help>
+
+
+**What it does**
+
+Trims specified number of characters from a dataset or its field (if dataset is tab-delimited).
+
+-----
+
+**Example 1**
+
+Trimming this dataset::
+
+ 1234567890
+ abcdefghijk
+
+by setting **Trim from the beginning to this position** to *2* and **Remove everything from this position to the end** to *6* will produce::
+
+ 23456
+ bcdef
+
+-----
+
+**Eaxmple 2**
+
+Trimming column 2 of this dataset::
+
+ bcde 12345 fghij 67890
+ fghij 67890 abcde 12345
+
+by setting **Trim content of this column only** to *2*, **Trim from the beginning to this position** to *2*, and **Remove everything from this position to the end** to *4* will produce::
+
+ abcde 234 fghij 67890
+ fghij 789 abcde 12345
+
+-----
+
+**Trimming FASTQ datasets**
+
+This tool can be used to trim sequences and quality strings in fastq datasets. This is done by selected *Yes* from the **Is input dataset in fastq format?** dropdown. If set to *Yes*, the tool will skip all even numbered lines (see warning below). For example, trimming last 5 bases of this dataset::
+
+ @081017-and-081020:1:1:1715:1759
+ GGACTCAGATAGTAATCCACGCTCCTTTAAAATATC
+ +
+ II#IIIIIII$5+.(9IIIIIII$%*$G$A31I&&B
+
+cab done by setting **Remove everything from this position to the end** to 31::
+
+ @081017-and-081020:1:1:1715:1759
+ GGACTCAGATAGTAATCCACGCTCCTTTAAA
+ +
+ II#IIIIIII$5+.(9IIIIIII$%*$G$A3
+
+**Note** that headers are skipped.
+
+.. class:: warningmark
+
+**WARNING:** This tool will only work on properly formatted fastq datasets where (1) each read and quality string occupy one line and (2) '@' (read header) and "+" (quality header) lines are evenly numbered like in the above example.
+
+
+ </help>
+</tool>
1
0
02 Oct '09
details: http://www.bx.psu.edu/hg/galaxy/rev/c63a444cd7ba
changeset: 2805:c63a444cd7ba
user: rc
date: Wed Sep 30 11:40:09 2009 -0400
description:
Requests functional tests: fixed a hack in user address creation
1 file(s) affected in this change:
test/functional/test_forms_and_requests.py
diffs (60 lines):
diff -r 3e5428b298b1 -r c63a444cd7ba test/functional/test_forms_and_requests.py
--- a/test/functional/test_forms_and_requests.py Wed Sep 30 10:40:08 2009 -0400
+++ b/test/functional/test_forms_and_requests.py Wed Sep 30 11:40:09 2009 -0400
@@ -12,14 +12,14 @@
( 'Received', 'Sample tube received' ),
( 'Done', 'Sequence run complete' ) ]
address1 = dict( short_desc="Office",
- name="James Bond",
+ name="James+Bond",
institution="MI6" ,
- address1="MI6 Headquaters",
+ address1="MI6+Headquarters",
address2="",
city="London",
state="London",
postal_code="007",
- country="United Kingdom",
+ country="United+Kingdom",
phone="007-007-0007" )
@@ -165,26 +165,21 @@
self.visit_url( '%s/library_admin/browse_library?obj_id=%s' % ( self.url, str( library_one.id ) ) )
self.check_page_for_string( name )
# create address
- #self.create_address( user_address1 )
- #self.check_page_for_string( 'Address <b>%s</b> has been added' % user_address1[ 'short_desc' ] )
- ## TODO: FIX HACK
- ## the user address creation should be done as a test.
+ self.logout()
+ self.login( email='test1(a)bx.psu.edu' )
+ self.home()
+ url_str = '%s/user/new_address?short_desc=%s&name=%s&institution=%s&address1=%s&address2=%s&city=%s&state=%s&postal_code=%s&country=%s&phone=%s' \
+ % ( self.url, address1[ 'short_desc' ], address1[ 'name' ], address1[ 'institution' ],
+ address1[ 'address1' ], address1[ 'address2' ], address1[ 'city' ], address1[ 'state' ],
+ address1[ 'postal_code' ], address1[ 'country' ], address1[ 'phone' ] )
+ print url_str
+ self.visit_url( url_str )
+ self.check_page_for_string( 'Address <b>%s</b> has been added' % address1[ 'short_desc' ] )
global regular_user
regular_user = galaxy.model.User.filter( galaxy.model.User.table.c.email=='test1(a)bx.psu.edu' ).first()
global user_address
- user_address = galaxy.model.UserAddress()
- user_address.user = regular_user
- user_address.desc = address1[ 'short_desc' ]
- user_address.name = address1[ 'name' ]
- user_address.institution = address1[ 'institution' ]
- user_address.address = address1[ 'address1' ]+' '+address1[ 'address2' ]
- user_address.city = address1[ 'city' ]
- user_address.state = address1[ 'state' ]
- user_address.postal_code = address1[ 'postal_code' ]
- user_address.country = address1[ 'country' ]
- user_address.phone = address1[ 'phone' ]
- user_address.flush()
- user_address.user.refresh()
+ user_address = galaxy.model.UserAddress.filter( and_( galaxy.model.UserAddress.table.c.desc==address1[ 'short_desc' ],
+ galaxy.model.UserAddress.table.c.deleted==False ) ).first()
def test_030_create_request( self ):
"""Testing creating, editing and submitting a request as a regular user"""
# login as a regular user
1
0
02 Oct '09
details: http://www.bx.psu.edu/hg/galaxy/rev/88fdb7f40b0e
changeset: 2803:88fdb7f40b0e
user: Nate Coraor <nate(a)bx.psu.edu>
date: Wed Sep 30 09:22:02 2009 -0400
description:
Prevent script tags in uploads as reported by Mitsuteru Nakao
1 file(s) affected in this change:
tools/data_source/upload.py
diffs (16 lines):
diff -r feec758a8774 -r 88fdb7f40b0e tools/data_source/upload.py
--- a/tools/data_source/upload.py Wed Sep 30 08:28:31 2009 -0400
+++ b/tools/data_source/upload.py Wed Sep 30 09:22:02 2009 -0400
@@ -49,10 +49,11 @@
regexp2 = re.compile( "<IFRAME[^>]*>", re.I )
regexp3 = re.compile( "<FRAMESET[^>]*>", re.I )
regexp4 = re.compile( "<META[^>]*>", re.I )
+ regexp5 = re.compile( "<SCRIPT[^>]*>", re.I )
lineno = 0
for line in temp:
lineno += 1
- matches = regexp1.search( line ) or regexp2.search( line ) or regexp3.search( line ) or regexp4.search( line )
+ matches = regexp1.search( line ) or regexp2.search( line ) or regexp3.search( line ) or regexp4.search( line ) or regexp5.search( line )
if matches:
if chunk is None:
temp.close()
1
0
details: http://www.bx.psu.edu/hg/galaxy/rev/3e5428b298b1
changeset: 2804:3e5428b298b1
user: rc
date: Wed Sep 30 10:40:08 2009 -0400
description:
More functional tests for Requests
2 file(s) affected in this change:
templates/admin/forms/show_form_read_only.mako
test/functional/test_forms_and_requests.py
diffs (141 lines):
diff -r 88fdb7f40b0e -r 3e5428b298b1 templates/admin/forms/show_form_read_only.mako
--- a/templates/admin/forms/show_form_read_only.mako Wed Sep 30 09:22:02 2009 -0400
+++ b/templates/admin/forms/show_form_read_only.mako Wed Sep 30 10:40:08 2009 -0400
@@ -62,7 +62,11 @@
</%def>
<div class="toolForm">
- <div class="toolFormTitle">${form.name} - <i>${form.desc}</i></div>
+ %if form.desc:
+ <div class="toolFormTitle">${form.name} - <i>${form.desc}</i></div>
+ %else:
+ <div class="toolFormTitle">${form.name}</div>
+ %endif
<form name="library" action="${h.url_for( controller='forms', action='manage' )}" method="post" >
%if form.type == trans.app.model.FormDefinition.types.SAMPLE:
%if not len(form.layout):
diff -r 88fdb7f40b0e -r 3e5428b298b1 test/functional/test_forms_and_requests.py
--- a/test/functional/test_forms_and_requests.py Wed Sep 30 09:22:02 2009 -0400
+++ b/test/functional/test_forms_and_requests.py Wed Sep 30 10:40:08 2009 -0400
@@ -169,9 +169,11 @@
#self.check_page_for_string( 'Address <b>%s</b> has been added' % user_address1[ 'short_desc' ] )
## TODO: FIX HACK
## the user address creation should be done as a test.
+ global regular_user
+ regular_user = galaxy.model.User.filter( galaxy.model.User.table.c.email=='test1(a)bx.psu.edu' ).first()
global user_address
user_address = galaxy.model.UserAddress()
- user_address.user = galaxy.model.User.filter( galaxy.model.User.table.c.email=='test1(a)bx.psu.edu' ).first()
+ user_address.user = regular_user
user_address.desc = address1[ 'short_desc' ]
user_address.name = address1[ 'name' ]
user_address.institution = address1[ 'institution' ]
@@ -211,14 +213,22 @@
for field_value in fields:
self.check_page_for_string( field_value )
# edit this request
- fields = ['field one value (editted)', 'field two value (editted)', str(user_address.id)]
+ fields = ['field one value (edited)', 'field two value (edited)', str(user_address.id)]
self.edit_request(request_one.id, request_one.name, request_one.name+' (Renamed)', request_one.desc+' (Re-described)', library_one.id, folder_one.id, fields)
request_one.refresh()
self.check_page_for_string( request_name+' (Renamed)' )
self.check_page_for_string( request_desc+' (Re-described)' )
+ # check if the request is showing in the 'unsubmitted' filter
+ self.home()
+ self.visit_url( '%s/requests/list?show_filter=Unsubmitted' % self.url )
+ self.check_page_for_string( request_one.name )
# submit the request
self.submit_request( request_one.id, request_one.name )
request_one.refresh()
+ # check if the request is showing in the 'submitted' filter
+ self.home()
+ self.visit_url( '%s/requests/list?show_filter=Submitted' % self.url )
+ self.check_page_for_string( request_one.name )
# check if the request's state is now set to 'submitted'
assert request_one.state is not request_one.states.SUBMITTED, "The state of the request '%s' should be set to '%s'" % ( request_one.name, request_one.states.SUBMITTED )
def test_035_request_lifecycle( self ):
@@ -250,40 +260,50 @@
self.visit_url('%s/requests_admin/list?show_filter=Complete' % self.url)
self.check_page_for_string( request_one.name )
assert request_one.state is not request_one.states.COMPLETE, "The state of the request '%s' should be set to '%s'" % ( request_one.name, request_one.states.COMPLETE )
-# def test_40_admin_create_request_on_behalf_of_regular_user( self ):
-# """Testing creating and submitting a request as an admin on behalf of a regular user"""
-# self.logout()
-# self.login( email='test(a)bx.psu.edu' )
-## permissions_in = [ k for k, v in galaxy.model.Library.permitted_actions.items() ]
-## permissions_out = []
-## self.set_library_permissions( str( library_one.id ), library_one.name, str( admin_user_private_role.id ), permissions_in, permissions_out )
-# # set field values
-# fields = ['field one value', 'field two value', str(user_address.id)]
-# # create the request
-# request_name, request_desc = 'Request Two', 'Request Two Description'
-# self.create_request_admin(request_type.id, regular_user1.id, request_name, request_desc, library_one.id, fields)
-# self.check_page_for_string( request_name )
-# self.check_page_for_string( request_desc )
-# global request_two
-# request_one = galaxy.model.Request.filter( and_( galaxy.model.Request.table.c.name==request_name,
-# galaxy.model.Request.table.c.deleted==False ) ).first()
-# # check if the request's state is now set to 'unsubmitted'
-# assert request_two.state is not request_two.states.UNSUBMITTED, "The state of the request '%s' should be set to '%s'" % ( request_two.name, request_two.states.UNSUBMITTED )
-# # sample fields
-# samples = [ ( 'Sample One', [ 'S1 Field 0 Value' ] ),
-# ( 'Sample Two', [ 'S2 Field 0 Value' ] ) ]
-# # add samples to this request
-# self.add_samples( request_two.id, request_two.name, samples )
-# for sample_name, fields in samples:
-# self.check_page_for_string( sample_name )
-# self.check_page_for_string( 'Unsubmitted' )
-# for field_value in fields:
-# self.check_page_for_string( field_value )
-# # submit the request
-# self.submit_request( request_two.id, request_two.name )
-# request_two.refresh()
-# # check if the request's state is now set to 'submitted'
-# assert request_two.state is not request_two.states.SUBMITTED, "The state of the request '%s' should be set to '%s'" % ( request_two.name, request_two.states.SUBMITTED )
+ def test_40_admin_create_request_on_behalf_of_regular_user( self ):
+ """Testing creating and submitting a request as an admin on behalf of a regular user"""
+ self.logout()
+ self.login( email='test(a)bx.psu.edu' )
+ request_name = "RequestTwo"
+ # simulate request creation
+ url_str = '%s/requests_admin/new?create=True&create_request_button=Save&select_request_type=%i&select_user=%i&name=%s&library_id=%i&folder_id=%i&refresh=True&field_1=%s&field_2=%i' \
+ % ( self.url, request_type.id, regular_user.id, request_name, library_one.id, library_one.root_folder.id, "field_1_value", user_address.id )
+ self.home()
+ self.visit_url( url_str )
+ self.check_page_for_string( "The new request named %s has been created" % request_name )
+ global request_two
+ request_two = galaxy.model.Request.filter( and_( galaxy.model.Request.table.c.name==request_name,
+ galaxy.model.Request.table.c.deleted==False ) ).first()
+ # check if the request is showing in the 'unsubmitted' filter
+ self.home()
+ self.visit_url( '%s/requests_admin/list?show_filter=Unsubmitted' % self.url )
+ self.check_page_for_string( request_two.name )
+ # check if the request's state is now set to 'unsubmitted'
+ assert request_two.state is not request_two.states.UNSUBMITTED, "The state of the request '%s' should be set to '%s'" % ( request_two.name, request_two.states.UNSUBMITTED )
+ # sample fields
+ samples = [ ( 'Sample One', [ 'S1 Field 0 Value' ] ),
+ ( 'Sample Two', [ 'S2 Field 0 Value' ] ) ]
+ # add samples to this request
+ self.add_samples( request_two.id, request_two.name, samples )
+ for sample_name, fields in samples:
+ self.check_page_for_string( sample_name )
+ self.check_page_for_string( 'Unsubmitted' )
+ for field_value in fields:
+ self.check_page_for_string( field_value )
+ # submit the request
+ self.submit_request( request_two.id, request_two.name )
+ request_two.refresh()
+ # check if the request is showing in the 'submitted' filter
+ self.home()
+ self.visit_url( '%s/requests_admin/list?show_filter=Submitted' % self.url )
+ self.check_page_for_string( request_two.name )
+ # check if the request's state is now set to 'submitted'
+ assert request_two.state is not request_two.states.SUBMITTED, "The state of the request '%s' should be set to '%s'" % ( request_two.name, request_two.states.SUBMITTED )
+ # check if both the requests is showing in the 'All' filter
+ self.home()
+ self.visit_url( '%s/requests_admin/list?show_filter=All' % self.url )
+ self.check_page_for_string( request_one.name )
+ self.check_page_for_string( request_two.name )
1
0
02 Oct '09
details: http://www.bx.psu.edu/hg/galaxy/rev/feec758a8774
changeset: 2802:feec758a8774
user: Greg Von Kuster <greg(a)bx.psu.edu>
date: Wed Sep 30 08:28:31 2009 -0400
description:
Functional test fixes for uploading and sniffing metadata - not sure when the behavior for these changed.
1 file(s) affected in this change:
test/functional/test_sniffing_and_metadata_settings.py
diffs (48 lines):
diff -r 22addc979108 -r feec758a8774 test/functional/test_sniffing_and_metadata_settings.py
--- a/test/functional/test_sniffing_and_metadata_settings.py Wed Sep 30 05:16:17 2009 -0400
+++ b/test/functional/test_sniffing_and_metadata_settings.py Wed Sep 30 08:28:31 2009 -0400
@@ -32,7 +32,7 @@
self.check_metadata_for_string( 'value="1.bed" value="\?"' )
self.check_metadata_for_string( 'Chrom column: <option value="1" selected> Start column: <option value="2" selected>' )
self.check_metadata_for_string( 'End column: <option value="3" selected> Strand column <option value="6" selected>' )
- self.check_metadata_for_string( 'Convert to new format <option value="bed">Genomic Intervals To BED <option value="gff">BED to GFF' )
+ self.check_metadata_for_string( 'Convert to new format value="bed">Convert Genomic Intervals To BED <option value="gff">Convert BED to GFF' )
self.check_metadata_for_string( 'Change data type selected value="bed" selected="yes"' )
latest_hda = galaxy.model.HistoryDatasetAssociation.query() \
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ).first()
@@ -97,7 +97,7 @@
self.verify_dataset_correctness( '5.gff' )
self.check_history_for_string( '5.gff format: <span class="gff">gff</span>, database: \? Info: uploaded file' )
self.check_metadata_for_string( 'value="5.gff" value="\?"' )
- self.check_metadata_for_string( 'Convert to new format <option value="bed">GFF to BED' )
+ self.check_metadata_for_string( 'Convert to new format <option value="bed">Convert GFF to BED' )
self.check_metadata_for_string( 'Change data type selected value="gff" selected="yes"' )
latest_hda = galaxy.model.HistoryDatasetAssociation.query() \
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ).first()
@@ -110,7 +110,7 @@
self.verify_dataset_correctness( '5.gff3' )
self.check_history_for_string( '5.gff3 format: <span class="gff3">gff3</span>, database: \? Info: uploaded file' )
self.check_metadata_for_string( 'value="5.gff3" value="\?"' )
- self.check_metadata_for_string( 'Convert to new format <option value="bed">GFF to BED' )
+ self.check_metadata_for_string( 'Convert to new format <option value="bed">Convert GFF to BED' )
self.check_metadata_for_string( 'Change data type selected value="gff3" selected="yes"' )
latest_hda = galaxy.model.HistoryDatasetAssociation.query() \
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ).first()
@@ -138,7 +138,7 @@
self.check_metadata_for_string( 'value="1.interval" value="\?"' )
self.check_metadata_for_string( 'Chrom column: <option value="1" selected> Start column: <option value="2" selected>' )
self.check_metadata_for_string( 'End column: <option value="3" selected> Strand column <option value="6" selected>' )
- self.check_metadata_for_string( 'Convert to new format <option value="bed">Genomic Intervals To BED' )
+ self.check_metadata_for_string( 'Convert to new format <option value="bed">Convert Genomic Intervals To BED' )
self.check_metadata_for_string( 'Change data type selected value="interval" selected="yes"' )
latest_hda = galaxy.model.HistoryDatasetAssociation.query() \
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ).first()
@@ -163,7 +163,7 @@
self.verify_dataset_correctness( '3.maf' )
self.check_history_for_string( '3.maf format: <span class="maf">maf</span>, database: \? Info: uploaded file' )
self.check_metadata_for_string( 'value="3.maf" value="\?"' )
- self.check_metadata_for_string( 'Convert to new format <option value="interval">MAF to Genomic Intervals <option value="fasta">MAF to Fasta' )
+ self.check_metadata_for_string( 'Convert to new format <option value="interval">Convert MAF to Genomic Intervals <option value="fasta">Convert MAF to Fasta' )
self.check_metadata_for_string( 'Change data type selected value="maf" selected="yes"' )
latest_hda = galaxy.model.HistoryDatasetAssociation.query() \
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ).first()
1
0
02 Oct '09
details: http://www.bx.psu.edu/hg/galaxy/rev/22addc979108
changeset: 2801:22addc979108
user: Greg Von Kuster <greg(a)bx.psu.edu>
date: Wed Sep 30 05:16:17 2009 -0400
description:
Refactored the library_dataset_dataset_association methods in the library_admin and library controllers, renamed the library_dataset controller to be library_common and moved several common methods to it, and some other code cleanup.
43 file(s) affected in this change:
lib/galaxy/web/controllers/library.py
lib/galaxy/web/controllers/library_admin.py
lib/galaxy/web/controllers/library_common.py
lib/galaxy/web/controllers/library_dataset.py
templates/admin/center.mako
templates/admin/library/browse_libraries.mako
templates/admin/library/browse_library.mako
templates/admin/library/common.mako
templates/admin/library/folder_info.mako
templates/admin/library/folder_permissions.mako
templates/admin/library/ldda_edit_info.mako
templates/admin/library/ldda_info.mako
templates/admin/library/ldda_permissions.mako
templates/admin/library/library_dataset_info.mako
templates/admin/library/library_dataset_permissions.mako
templates/admin/library/library_info.mako
templates/admin/library/library_permissions.mako
templates/admin/library/new_folder.mako
templates/admin/library/select_info_template.mako
templates/admin/library/upload.mako
templates/admin/requests/show_request.mako
templates/base_panels.mako
templates/library/browse_libraries.mako
templates/library/browse_library.mako
templates/library/common.mako
templates/library/folder_info.mako
templates/library/folder_permissions.mako
templates/library/ldda_edit_info.mako
templates/library/ldda_info.mako
templates/library/ldda_permissions.mako
templates/library/library_dataset_common.mako
templates/library/library_dataset_info.mako
templates/library/library_dataset_permissions.mako
templates/library/library_info.mako
templates/library/library_permissions.mako
templates/library/new_folder.mako
templates/library/select_info_template.mako
templates/library/upload.mako
templates/mobile/manage_library.mako
templates/requests/show_request.mako
test/base/twilltestcase.py
test/functional/test_forms_and_requests.py
test/functional/test_security_and_libraries.py
diffs (truncated from 4989 to 3000 lines):
diff -r 6a066b05c94f -r 22addc979108 lib/galaxy/web/controllers/library.py
--- a/lib/galaxy/web/controllers/library.py Tue Sep 29 21:51:51 2009 -0400
+++ b/lib/galaxy/web/controllers/library.py Wed Sep 30 05:16:17 2009 -0400
@@ -3,7 +3,6 @@
from galaxy.datatypes import sniff
from galaxy import util
from galaxy.util.odict import odict
-from galaxy.web.controllers.forms import get_all_forms
from galaxy.util.streamball import StreamBall
import logging, tempfile, zipfile, tarfile, os, sys
@@ -94,8 +93,8 @@
params = util.Params( kwd )
msg = util.restore_text( params.get( 'msg', '' ) )
messagetype = params.get( 'messagetype', 'done' )
- id = params.get( 'id', None )
- if not id:
+ library_id = params.get( 'obj_id', None )
+ if not library_id:
# To handle bots
msg = "You must specify a library id."
return trans.response.send_redirect( web.url_for( controller='library',
@@ -103,10 +102,10 @@
default_action=params.get( 'default_action', None ),
msg=util.sanitize_text( msg ),
messagetype='error' ) )
- library = library=trans.app.model.Library.get( id )
+ library = library=trans.app.model.Library.get( library_id )
if not library:
# To handle bots
- msg = "Invalid library id ( %s )."
+ msg = "Invalid library id ( %s )." % str( library_id )
return trans.response.send_redirect( web.url_for( controller='library',
action='browse_libraries',
default_action=params.get( 'default_action', None ),
@@ -126,10 +125,11 @@
msg=msg,
messagetype=messagetype )
@web.expose
- def library( self, trans, id=None, **kwd ):
+ def library( self, trans, **kwd ):
params = util.Params( kwd )
msg = util.restore_text( params.get( 'msg', '' ) )
messagetype = params.get( 'messagetype', 'done' )
+ library_id = params.get( 'obj_id', None )
# TODO: eventually we'll want the ability for users to create libraries
if params.get( 'delete', False ):
action = 'delete'
@@ -137,15 +137,15 @@
action = 'permissions'
else:
action = 'information'
- if not id:
+ if not library_id:
msg = "You must specify a library."
return trans.response.send_redirect( web.url_for( controller='library',
action='browse_libraries',
msg=util.sanitize_text( msg ),
messagetype='error' ) )
- library = trans.app.model.Library.get( int( id ) )
+ library = trans.app.model.Library.get( int( library_id ) )
if not library:
- msg = "Invalid library id ( %s ) specified." % str( id )
+ msg = "Invalid library id ( %s ) specified." % str( obj_id )
return trans.response.send_redirect( web.url_for( controller='library',
action='browse_libraries',
msg=util.sanitize_text( msg ),
@@ -175,7 +175,7 @@
msg = "Library '%s' has been renamed to '%s'" % ( old_name, new_name )
return trans.response.send_redirect( web.url_for( controller='library',
action='library',
- id=id,
+ obj_id=library.id,
edit_info=True,
msg=util.sanitize_text( msg ),
messagetype='done' ) )
@@ -198,7 +198,7 @@
msg = "Permissions updated for library '%s'" % library.name
return trans.response.send_redirect( web.url_for( controller='library',
action='library',
- id=id,
+ obj_id=library.id,
permissions=True,
msg=util.sanitize_text( msg ),
messagetype='done' ) )
@@ -207,157 +207,127 @@
msg=msg,
messagetype=messagetype )
@web.expose
- def datasets( self, trans, library_id, ldda_ids='', **kwd ):
- # This method is used by the select list labeled "Perform action on selected datasets"
- # on the analysis library browser.
- if not ldda_ids:
- msg = "You must select at least one dataset"
- return trans.response.send_redirect( web.url_for( controller='library',
- action='browse_library',
- id=library_id,
- msg=util.sanitize_text( msg ),
- messagetype='error' ) )
- ldda_ids = util.listify( ldda_ids )
+ def folder( self, trans, obj_id, library_id, **kwd ):
params = util.Params( kwd )
msg = util.restore_text( params.get( 'msg', '' ) )
messagetype = params.get( 'messagetype', 'done' )
- if not params.do_action:
- msg = "You must select an action to perform on selected datasets"
+ if params.get( 'new', False ):
+ action = 'new'
+ elif params.get( 'delete', False ):
+ action = 'delete'
+ elif params.get( 'permissions', False ):
+ action = 'permissions'
+ else:
+ # 'information' will be the default
+ action = 'information'
+ folder = trans.app.model.LibraryFolder.get( int( obj_id ) )
+ if not folder:
+ msg = "Invalid folder specified, id: %s" % str( obj_id )
return trans.response.send_redirect( web.url_for( controller='library',
action='browse_library',
- id=library_id,
+ obj_id=library_id,
msg=util.sanitize_text( msg ),
messagetype='error' ) )
- if params.do_action == 'add':
- history = trans.get_history()
- for ldda_id in ldda_ids:
- ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( ldda_id )
- hda = ldda.to_history_dataset_association( target_history=history, add_to_history = True )
- history.flush()
- msg = "%i dataset(s) have been imported into your history" % len( ldda_ids )
- return trans.response.send_redirect( web.url_for( controller='library',
- action='browse_library',
- id=library_id,
- msg=util.sanitize_text( msg ),
- messagetype='done' ) )
- elif params.do_action == 'manage_permissions':
- # We need the folder containing the LibraryDatasetDatasetAssociation(s)
- ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( ldda_ids[0] )
- trans.response.send_redirect( web.url_for( controller='library',
- action='library_dataset_dataset_association',
- library_id=library_id,
- folder_id=ldda.library_dataset.folder.id,
- id=','.join( ldda_ids ),
- permissions=True,
- msg=util.sanitize_text( msg ),
- messagetype=messagetype ) )
- else:
- try:
- if params.do_action == 'zip':
- # Can't use mkstemp - the file must not exist first
- tmpd = tempfile.mkdtemp()
- tmpf = os.path.join( tmpd, 'library_download.' + params.do_action )
- if ziptype == '64':
- archive = zipfile.ZipFile( tmpf, 'w', zipfile.ZIP_DEFLATED, True )
- else:
- archive = zipfile.ZipFile( tmpf, 'w', zipfile.ZIP_DEFLATED )
- archive.add = lambda x, y: archive.write( x, y.encode('CP437') )
- elif params.do_action == 'tgz':
- archive = util.streamball.StreamBall( 'w|gz' )
- elif params.do_action == 'tbz':
- archive = util.streamball.StreamBall( 'w|bz2' )
- except (OSError, zipfile.BadZipFile):
- log.exception( "Unable to create archive for download" )
- msg = "Unable to create archive for download, please report this error"
+ user, roles = trans.get_user_and_roles()
+ if action == 'new':
+ if params.new == 'submitted':
+ new_folder = trans.app.model.LibraryFolder( name=util.restore_text( params.name ),
+ description=util.restore_text( params.description ) )
+ # We are associating the last used genome build with folders, so we will always
+ # initialize a new folder with the first dbkey in util.dbnames which is currently
+ # ? unspecified (?)
+ new_folder.genome_build = util.dbnames.default_value
+ folder.add_folder( new_folder )
+ new_folder.flush()
+ # New folders default to having the same permissions as their parent folder
+ trans.app.security_agent.copy_library_permissions( folder, new_folder )
+ msg = "New folder named '%s' has been added to the library" % new_folder.name
return trans.response.send_redirect( web.url_for( controller='library',
action='browse_library',
- id=library_id,
+ obj_id=library_id,
msg=util.sanitize_text( msg ),
- messagetype='error' ) )
- seen = []
- user, roles = trans.get_user_and_roles()
- for id in ldda_ids:
- ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( id )
- if not ldda or not trans.app.security_agent.can_access_dataset( roles, ldda.dataset ):
- continue
- path = ""
- parent_folder = ldda.library_dataset.folder
- while parent_folder is not None:
- # Exclude the now-hidden "root folder"
- if parent_folder.parent is None:
- path = os.path.join( parent_folder.library_root[0].name, path )
- break
- path = os.path.join( parent_folder.name, path )
- parent_folder = parent_folder.parent
- path += ldda.name
- while path in seen:
- path += '_'
- seen.append( path )
- try:
- archive.add( ldda.dataset.file_name, path )
- except IOError:
- log.exception( "Unable to write to temporary library download archive" )
- msg = "Unable to create archive for download, please report this error"
+ messagetype='done' ) )
+ return trans.fill_template( '/library/new_folder.mako',
+ library_id=library_id,
+ folder=folder,
+ msg=msg,
+ messagetype=messagetype )
+ elif action == 'information':
+ # See if we have any associated templates
+ widgets = folder.get_template_widgets( trans )
+ if params.get( 'rename_folder_button', False ):
+ if trans.app.security_agent.can_modify_library_item( user, roles, folder ):
+ old_name = folder.name
+ new_name = util.restore_text( params.name )
+ new_description = util.restore_text( params.description )
+ if not new_name:
+ msg = 'Enter a valid name'
+ return trans.fill_template( "/library/folder_info.mako",
+ folder=folder,
+ library_id=library_id,
+ widgets=widgets,
+ msg=msg,
+ messagetype='error' )
+ else:
+ folder.name = new_name
+ folder.description = new_description
+ folder.flush()
+ msg = "Folder '%s' has been renamed to '%s'" % ( old_name, new_name )
+ return trans.response.send_redirect( web.url_for( controller='library',
+ action='folder',
+ obj_id=folder.id,
+ library_id=library_id,
+ rename=True,
+ msg=util.sanitize_text( msg ),
+ messagetype='done' ) )
+ else:
+ msg = "You are not authorized to edit this folder"
+ return trans.fill_template( "/library/folder_info.mako",
+ folder=folder,
+ library_id=library_id,
+ widgets=widgets,
+ msg=msg,
+ messagetype='error' )
+ return trans.fill_template( '/library/folder_info.mako',
+ folder=folder,
+ library_id=library_id,
+ widgets=widgets,
+ msg=msg,
+ messagetype=messagetype )
+ elif action == 'permissions':
+ if params.get( 'update_roles_button', False ):
+ # The user clicked the Save button on the 'Associate With Roles' form
+ if trans.app.security_agent.can_manage_library_item( user, roles, folder ):
+ permissions = {}
+ for k, v in trans.app.model.Library.permitted_actions.items():
+ in_roles = [ trans.app.model.Role.get( int( x ) ) for x in util.listify( params.get( k + '_in', [] ) ) ]
+ permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles
+ trans.app.security_agent.set_all_library_permissions( folder, permissions )
+ folder.refresh()
+ msg = 'Permissions updated for folder %s' % folder.name
return trans.response.send_redirect( web.url_for( controller='library',
- action='browse_library',
- id=library_id,
+ action='folder',
+ obj_id=folder.id,
+ library_id=library_id,
+ permissions=True,
+ msg=util.sanitize_text( msg ),
+ messagetype='done' ) )
+ else:
+ msg = "You are not authorized to manage permissions on this folder"
+ return trans.response.send_redirect( web.url_for( controller='library',
+ action='folder',
+ obj_id=folder.id,
+ library_id=library_id,
+ permissions=True,
msg=util.sanitize_text( msg ),
messagetype='error' ) )
- if params.do_action == 'zip':
- archive.close()
- tmpfh = open( tmpf )
- # clean up now
- try:
- os.unlink( tmpf )
- os.rmdir( tmpd )
- except OSError:
- log.exception( "Unable to remove temporary library download archive and directory" )
- msg = "Unable to create archive for download, please report this error"
- return trans.response.send_redirect( web.url_for( controller='library',
- action='browse_library',
- id=library_id,
- msg=util.sanitize_text( msg ),
- messagetype='error' ) )
- trans.response.set_content_type( "application/x-zip-compressed" )
- trans.response.headers[ "Content-Disposition" ] = "attachment; filename=GalaxyLibraryFiles.%s" % params.do_action
- return tmpfh
- else:
- trans.response.set_content_type( "application/x-tar" )
- trans.response.headers[ "Content-Disposition" ] = "attachment; filename=GalaxyLibraryFiles.%s" % params.do_action
- archive.wsgi_status = trans.response.wsgi_status()
- archive.wsgi_headeritems = trans.response.wsgi_headeritems()
- return archive.stream
+ return trans.fill_template( '/library/folder_permissions.mako',
+ folder=folder,
+ library_id=library_id,
+ msg=msg,
+ messagetype=messagetype )
@web.expose
- def download_dataset_from_folder(self, trans, id, library_id=None, **kwd):
- """Catches the dataset id and displays file contents as directed"""
- # id must refer to a LibraryDatasetDatasetAssociation object
- ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( id )
- if not ldda.dataset:
- msg = 'Invalid LibraryDatasetDatasetAssociation id %s received for file downlaod' % str( id )
- return trans.response.send_redirect( web.url_for( controller='library',
- action='browse_library',
- id=library_id,
- msg=msg,
- messagetype='error' ) )
- mime = trans.app.datatypes_registry.get_mimetype_by_extension( ldda.extension.lower() )
- trans.response.set_content_type( mime )
- fStat = os.stat( ldda.file_name )
- trans.response.headers[ 'Content-Length' ] = int( fStat.st_size )
- valid_chars = '.,^_-()[]0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
- fname = ldda.name
- fname = ''.join( c in valid_chars and c or '_' for c in fname )[ 0:150 ]
- trans.response.headers[ "Content-Disposition" ] = "attachment; filename=GalaxyLibraryDataset-%s-[%s]" % ( str( id ), fname )
- try:
- return open( ldda.file_name )
- except:
- msg = 'This dataset contains no content'
- return trans.response.send_redirect( web.url_for( controller='library',
- action='browse_library',
- id=library_id,
- msg=msg,
- messagetype='error' ) )
- @web.expose
- def library_dataset( self, trans, id, library_id, **kwd ):
+ def library_dataset( self, trans, obj_id, library_id, **kwd ):
params = util.Params( kwd )
msg = util.restore_text( params.get( 'msg', '' ) )
messagetype = params.get( 'messagetype', 'done' )
@@ -365,12 +335,12 @@
action = 'permissions'
else:
action = 'information'
- library_dataset = trans.app.model.LibraryDataset.get( id )
+ library_dataset = trans.app.model.LibraryDataset.get( obj_id )
if not library_dataset:
- msg = "Invalid library dataset specified, id: %s" %str( id )
+ msg = "Invalid library dataset specified, id: %s" %str( obj_id )
return trans.response.send_redirect( web.url_for( controller='library',
action='browse_library',
- id=library_id,
+ obj_id=library_id,
msg=util.sanitize_text( msg ),
messagetype='error' ) )
user, roles = trans.get_user_and_roles()
@@ -424,7 +394,248 @@
msg=msg,
messagetype=messagetype )
@web.expose
- def library_dataset_dataset_association( self, trans, library_id, folder_id, id=None, **kwd ):
+ def ldda_edit_info( self, trans, library_id, folder_id, obj_id, **kwd ):
+ params = util.Params( kwd )
+ msg = util.restore_text( params.get( 'msg', '' ) )
+ messagetype = params.get( 'messagetype', 'done' )
+ ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( obj_id )
+ if not ldda:
+ msg = "Invalid LibraryDatasetDatasetAssociation specified, obj_id: %s" % str( obj_id )
+ return trans.response.send_redirect( web.url_for( controller='library',
+ action='browse_library',
+ obj_id=library_id,
+ msg=util.sanitize_text( msg ),
+ messagetype='error' ) )
+ dbkey = params.get( 'dbkey', '?' )
+ if isinstance( dbkey, list ):
+ dbkey = dbkey[0]
+ user, roles = trans.get_user_and_roles()
+ file_formats = [ dtype_name for dtype_name, dtype_value in trans.app.datatypes_registry.datatypes_by_extension.iteritems() if dtype_value.allow_datatype_change ]
+ file_formats.sort()
+ # See if we have any associated templates
+ widgets = ldda.get_template_widgets( trans )
+ if params.get( 'change', False ):
+ # The user clicked the Save button on the 'Change data type' form
+ if trans.app.security_agent.can_modify_library_item( user, roles, ldda ):
+ if ldda.datatype.allow_datatype_change and trans.app.datatypes_registry.get_datatype_by_extension( params.datatype ).allow_datatype_change:
+ trans.app.datatypes_registry.change_datatype( ldda, params.datatype )
+ trans.app.model.flush()
+ msg = "Data type changed for library dataset '%s'" % ldda.name
+ messagetype = 'done'
+ else:
+ msg = "You are unable to change datatypes in this manner. Changing %s to %s is not allowed." % ( ldda.extension, params.datatype )
+ messagetype = 'error'
+ else:
+ msg = "You are not authorized to change the data type of dataset '%s'" % ldda.name
+ messagetype = 'error'
+ return trans.fill_template( "/library/ldda_edit_info.mako",
+ ldda=ldda,
+ library_id=library_id,
+ file_formats=file_formats,
+ widgets=widgets,
+ msg=msg,
+ messagetype=messagetype )
+ elif params.get( 'save', False ):
+ # The user clicked the Save button on the 'Edit Attributes' form
+ if trans.app.security_agent.can_modify_library_item( user, roles, ldda ):
+ old_name = ldda.name
+ new_name = util.restore_text( params.get( 'name', '' ) )
+ new_info = util.restore_text( params.get( 'info', '' ) )
+ new_message = util.restore_text( params.get( 'message', '' ) )
+ if not new_name:
+ msg = 'Enter a valid name'
+ messagetype = 'error'
+ else:
+ ldda.name = new_name
+ ldda.info = new_info
+ ldda.message = new_message
+ # The following for loop will save all metadata_spec items
+ for name, spec in ldda.datatype.metadata_spec.items():
+ if spec.get("readonly"):
+ continue
+ optional = params.get( "is_" + name, None )
+ if optional and optional == 'true':
+ # optional element... == 'true' actually means it is NOT checked (and therefore ommitted)
+ setattr( ldda.metadata, name, None )
+ else:
+ setattr( ldda.metadata, name, spec.unwrap( params.get ( name, None ) ) )
+ ldda.metadata.dbkey = dbkey
+ ldda.datatype.after_edit( ldda )
+ trans.app.model.flush()
+ msg = 'Attributes updated for library dataset %s' % ldda.name
+ messagetype = 'done'
+ else:
+ msg = "you are not authorized to edit the attributes of dataset '%s'" % ldda.name
+ messagetype = 'error'
+ return trans.fill_template( "/library/ldda_edit_info.mako",
+ ldda=ldda,
+ library_id=library_id,
+ file_formats=file_formats,
+ widgets=widgets,
+ msg=msg,
+ messagetype=messagetype )
+ elif params.get( 'detect', False ):
+ # The user clicked the Auto-detect button on the 'Edit Attributes' form
+ if trans.app.security_agent.can_modify_library_item( user, roles, ldda ):
+ for name, spec in ldda.datatype.metadata_spec.items():
+ # We need to be careful about the attributes we are resetting
+ if name not in [ 'name', 'info', 'dbkey' ]:
+ if spec.get( 'default' ):
+ setattr( ldda.metadata, name, spec.unwrap( spec.get( 'default' ) ) )
+ ldda.datatype.set_meta( ldda )
+ ldda.datatype.after_edit( ldda )
+ trans.app.model.flush()
+ msg = 'Attributes updated for library dataset %s' % ldda.name
+ messagetype = 'done'
+ else:
+ msg = "you are not authorized to edit the attributes of dataset '%s'" % ldda.name
+ messagetype = 'error'
+ return trans.fill_template( "/library/ldda_edit_info.mako",
+ ldda=ldda,
+ library_id=library_id,
+ file_formats=file_formats,
+ widgets=widgets,
+ msg=msg,
+ messagetype=messagetype )
+ elif params.get( 'delete', False ):
+ if trans.app.security_agent.can_modify_library_item( user, roles, folder ):
+ ldda.deleted = True
+ ldda.flush()
+ msg = 'Dataset %s has been removed from this data library' % ldda.name
+ messagetype = 'done'
+ else:
+ msg = "you are not authorized to delete dataset '%s'" % ldda.name
+ messagetype = 'error'
+ return trans.fill_template( "/library/ldda_edit_info.mako",
+ ldda=ldda,
+ library_id=library_id,
+ file_formats=file_formats,
+ widgets=widgets,
+ msg=msg,
+ messagetype=messagetype )
+ if trans.app.security_agent.can_modify_library_item( user, roles, ldda ):
+ ldda.datatype.before_edit( ldda )
+ if "dbkey" in ldda.datatype.metadata_spec and not ldda.metadata.dbkey:
+ # Copy dbkey into metadata, for backwards compatability
+ # This looks like it does nothing, but getting the dbkey
+ # returns the metadata dbkey unless it is None, in which
+ # case it resorts to the old dbkey. Setting the dbkey
+ # sets it properly in the metadata
+ ldda.metadata.dbkey = ldda.dbkey
+ return trans.fill_template( "/library/ldda_edit_info.mako",
+ ldda=ldda,
+ library_id=library_id,
+ file_formats=file_formats,
+ widgets=widgets,
+ msg=msg,
+ messagetype=messagetype )
+ @web.expose
+ def ldda_display_info( self, trans, library_id, folder_id, obj_id, **kwd ):
+ params = util.Params( kwd )
+ msg = util.restore_text( params.get( 'msg', '' ) )
+ messagetype = params.get( 'messagetype', 'done' )
+ ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( obj_id )
+ if not ldda:
+ msg = "Invalid LibraryDatasetDatasetAssociation specified, id: %s" % str( obj_id )
+ return trans.response.send_redirect( web.url_for( controller='admin',
+ action='browse_library',
+ obj_id=library_id,
+ msg=util.sanitize_text( msg ),
+ messagetype='error' ) )
+ # See if we have any associated templates
+ widgets = ldda.get_template_widgets( trans )
+ return trans.fill_template( '/library/ldda_info.mako',
+ ldda=ldda,
+ library_id=library_id,
+ widgets=widgets,
+ msg=msg,
+ messagetype=messagetype )
+ @web.expose
+ def ldda_manage_permissions( self, trans, library_id, folder_id, obj_id, **kwd ):
+ params = util.Params( kwd )
+ msg = util.restore_text( params.get( 'msg', '' ) )
+ messagetype = params.get( 'messagetype', 'done' )
+ obj_ids = util.listify( obj_id )
+ # Display permission form, permissions will be updated for all lddas simultaneously.
+ lddas = []
+ for obj_id in [ int( obj_id ) for obj_id in obj_ids ]:
+ ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( obj_id )
+ if ldda is None:
+ msg = 'You specified an invalid LibraryDatasetDatasetAssociation id: %s' %str( obj_id )
+ trans.response.send_redirect( web.url_for( controller='library',
+ action='browse_library',
+ obj_id=library_id,
+ msg=util.sanitize_text( msg ),
+ messagetype='error' ) )
+ lddas.append( ldda )
+ if params.get( 'update_roles_button', False ):
+ if trans.app.security_agent.can_manage_library_item( user, roles, ldda ) and \
+ trans.app.security_agent.can_manage_dataset( roles, ldda.dataset ):
+ permissions = {}
+ for k, v in trans.app.model.Dataset.permitted_actions.items():
+ in_roles = [ trans.app.model.Role.get( x ) for x in util.listify( params.get( k + '_in', [] ) ) ]
+ permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles
+ for ldda in lddas:
+ # Set the DATASET permissions on the Dataset
+ trans.app.security_agent.set_all_dataset_permissions( ldda.dataset, permissions )
+ ldda.dataset.refresh()
+ permissions = {}
+ for k, v in trans.app.model.Library.permitted_actions.items():
+ in_roles = [ trans.app.model.Role.get( x ) for x in util.listify( kwd.get( k + '_in', [] ) ) ]
+ permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles
+ for ldda in lddas:
+ # Set the LIBRARY permissions on the LibraryDataset
+ # NOTE: the LibraryDataset and LibraryDatasetDatasetAssociation will be set with the same permissions
+ trans.app.security_agent.set_all_library_permissions( ldda.library_dataset, permissions )
+ ldda.library_dataset.refresh()
+ # Set the LIBRARY permissions on the LibraryDatasetDatasetAssociation
+ trans.app.security_agent.set_all_library_permissions( ldda, permissions )
+ ldda.refresh()
+ msg = 'Permissions and roles have been updated on %d datasets' % len( lddas )
+ messagetype = 'done'
+ else:
+ msg = "You are not authorized to change the permissions of dataset '%s'" % ldda.name
+ messagetype = 'error'
+ return trans.fill_template( "/library/ldda_permissions.mako",
+ ldda=lddas,
+ library_id=library_id,
+ msg=msg,
+ messagetype=messagetype )
+ if trans.app.security_agent.can_manage_library_item( user, roles, ldda ) and \
+ trans.app.security_agent.can_manage_dataset( roles, ldda.dataset ):
+ # Ensure that the permissions across all library items are identical, otherwise we can't update them together.
+ check_list = []
+ for ldda in lddas:
+ permissions = []
+ # Check the library level permissions - the permissions on the LibraryDatasetDatasetAssociation
+ # will always be the same as the permissions on the associated LibraryDataset, so we only need to
+ # check one Library object
+ for library_permission in trans.app.security_agent.get_library_dataset_permissions( ldda.library_dataset ):
+ if library_permission.action not in permissions:
+ permissions.append( library_permission.action )
+ for dataset_permission in trans.app.security_agent.get_dataset_permissions( ldda.dataset ):
+ if dataset_permission.action not in permissions:
+ permissions.append( dataset_permission.action )
+ permissions.sort()
+ if not check_list:
+ check_list = permissions
+ if permissions != check_list:
+ msg = 'The datasets you selected do not have identical permissions, so they can not be updated together'
+ trans.response.send_redirect( web.url_for( controller='library',
+ action='browse_library',
+ obj_id=library_id,
+ msg=util.sanitize_text( msg ),
+ messagetype='error' ) )
+ else:
+ msg = "You are not authorized to change the permissions of dataset '%s'" % ldda.name
+ messagetype = 'error'
+ return trans.fill_template( "/library/ldda_permissions.mako",
+ ldda=lddas,
+ library_id=library_id,
+ msg=msg,
+ messagetype=messagetype )
+ @web.expose
+ def upload_library_dataset( self, trans, library_id, folder_id, **kwd ):
params = util.Params( kwd )
msg = util.restore_text( params.get( 'msg', '' ) )
messagetype = params.get( 'messagetype', 'done' )
@@ -444,279 +655,6 @@
else:
replace_dataset = None
user, roles = trans.get_user_and_roles()
- # Let's not overwrite the imported datatypes module with the variable datatypes?
- # The built-in 'id' is overwritten in lots of places as well
- ldatatypes = [ dtype_name for dtype_name, dtype_value in trans.app.datatypes_registry.datatypes_by_extension.iteritems() if dtype_value.allow_datatype_change ]
- ldatatypes.sort()
- if id:
- if params.get( 'permissions', False ):
- action = 'permissions'
- elif params.get( 'edit_info', False ):
- action = 'edit_info'
- else:
- action = 'info'
- if id.count( ',' ):
- ids = id.split( ',' )
- id = None
- else:
- ids = None
- else:
- ids = None
- if id:
- # ldda_id specified, display attributes form
- ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( id )
- if not ldda:
- msg = "Invalid LibraryDatasetDatasetAssociation specified, id: %s" % str( id )
- return trans.response.send_redirect( web.url_for( controller='library',
- action='browse_library',
- id=library_id,
- msg=util.sanitize_text( msg ),
- messagetype='error' ) )
- # See if we have any associated templates
- widgets = ldda.get_template_widgets( trans )
- if action == 'permissions':
- if params.get( 'update_roles_button', False ):
- # The user clicked the Save button on the 'Associate With Roles' form
- if trans.app.security_agent.can_manage_library_item( user, roles, ldda ) and \
- trans.app.security_agent.can_manage_dataset( roles, ldda.dataset ):
- permissions = {}
- for k, v in trans.app.model.Dataset.permitted_actions.items():
- in_roles = [ trans.app.model.Role.get( x ) for x in util.listify( params.get( k + '_in', [] ) ) ]
- permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles
- # Set the DATASET permissions on the Dataset
- trans.app.security_agent.set_all_dataset_permissions( ldda.dataset, permissions )
- ldda.dataset.refresh()
- permissions = {}
- for k, v in trans.app.model.Library.permitted_actions.items():
- in_roles = [ trans.app.model.Role.get( x ) for x in util.listify( kwd.get( k + '_in', [] ) ) ]
- permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles
- # Set the LIBRARY permissions on the LibraryDataset
- # NOTE: the LibraryDataset and LibraryDatasetDatasetAssociation will be set with the same permissions
- trans.app.security_agent.set_all_library_permissions( ldda.library_dataset, permissions )
- ldda.library_dataset.refresh()
- # Set the LIBRARY permissions on the LibraryDatasetDatasetAssociation
- trans.app.security_agent.set_all_library_permissions( ldda, permissions )
- ldda.refresh()
- msg = "Permissions updated for dataset '%s'" % ldda.name
- messagetype = 'done'
- else:
- msg = "You are not authorized to change the permissions of dataset '%s'" % ldda.name
- messagetype = 'error'
- return trans.fill_template( '/library/ldda_permissions.mako',
- ldda=ldda,
- library_id=library_id,
- msg=msg,
- messagetype=messagetype )
- elif action == 'info':
- return trans.fill_template( '/library/ldda_info.mako',
- ldda=ldda,
- library_id=library_id,
- widgets=widgets,
- msg=msg,
- messagetype=messagetype )
- elif action == 'edit_info':
- if params.get( 'change', False ):
- # The user clicked the Save button on the 'Change data type' form
- if trans.app.security_agent.can_modify_library_item( user, roles, ldda ):
- if ldda.datatype.allow_datatype_change and trans.app.datatypes_registry.get_datatype_by_extension( params.datatype ).allow_datatype_change:
- trans.app.datatypes_registry.change_datatype( ldda, params.datatype )
- trans.app.model.flush()
- msg = "Data type changed for library dataset '%s'" % ldda.name
- messagetype = 'done'
- else:
- msg = "You are unable to change datatypes in this manner. Changing %s to %s is not allowed." % ( ldda.extension, params.datatype )
- messagetype = 'error'
- else:
- msg = "You are not authorized to change the data type of dataset '%s'" % ldda.name
- messagetype = 'error'
- return trans.fill_template( "/library/ldda_edit_info.mako",
- ldda=ldda,
- library_id=library_id,
- datatypes=ldatatypes,
- widgets=widgets,
- msg=msg,
- messagetype=messagetype )
- elif params.get( 'save', False ):
- # The user clicked the Save button on the 'Edit Attributes' form
- if trans.app.security_agent.can_modify_library_item( user, roles, ldda ):
- old_name = ldda.name
- new_name = util.restore_text( params.get( 'name', '' ) )
- new_info = util.restore_text( params.get( 'info', '' ) )
- new_message = util.restore_text( params.get( 'message', '' ) )
- if not new_name:
- msg = 'Enter a valid name'
- messagetype = 'error'
- else:
- ldda.name = new_name
- ldda.info = new_info
- ldda.message = new_message
- # The following for loop will save all metadata_spec items
- for name, spec in ldda.datatype.metadata_spec.items():
- if spec.get("readonly"):
- continue
- optional = params.get( "is_" + name, None )
- if optional and optional == 'true':
- # optional element... == 'true' actually means it is NOT checked (and therefore ommitted)
- setattr( ldda.metadata, name, None )
- else:
- setattr( ldda.metadata, name, spec.unwrap( params.get ( name, None ) ) )
- ldda.metadata.dbkey = dbkey
- ldda.datatype.after_edit( ldda )
- trans.app.model.flush()
- msg = 'Attributes updated for library dataset %s' % ldda.name
- messagetype = 'done'
- else:
- msg = "you are not authorized to edit the attributes of dataset '%s'" % ldda.name
- messagetype = 'error'
- return trans.fill_template( "/library/ldda_edit_info.mako",
- ldda=ldda,
- library_id=library_id,
- datatypes=ldatatypes,
- widgets=widgets,
- msg=msg,
- messagetype=messagetype )
- elif params.get( 'detect', False ):
- # The user clicked the Auto-detect button on the 'Edit Attributes' form
- if trans.app.security_agent.can_modify_library_item( user, roles, ldda ):
- for name, spec in ldda.datatype.metadata_spec.items():
- # We need to be careful about the attributes we are resetting
- if name not in [ 'name', 'info', 'dbkey' ]:
- if spec.get( 'default' ):
- setattr( ldda.metadata, name, spec.unwrap( spec.get( 'default' ) ) )
- ldda.datatype.set_meta( ldda )
- ldda.datatype.after_edit( ldda )
- trans.app.model.flush()
- msg = 'Attributes updated for library dataset %s' % ldda.name
- messagetype = 'done'
- else:
- msg = "you are not authorized to edit the attributes of dataset '%s'" % ldda.name
- messagetype = 'error'
- return trans.fill_template( "/library/ldda_edit_info.mako",
- ldda=ldda,
- library_id=library_id,
- datatypes=ldatatypes,
- widgets=widgets,
- msg=msg,
- messagetype=messagetype )
- elif params.get( 'delete', False ):
- if trans.app.security_agent.can_modify_library_item( user, roles, folder ):
- ldda.deleted = True
- ldda.flush()
- msg = 'Dataset %s has been removed from this library' % ldda.name
- messagetype = 'done'
- else:
- msg = "you are not authorized to delete dataset '%s'" % ldda.name
- messagetype = 'error'
- return trans.fill_template( "/library/ldda_edit_info.mako",
- ldda=ldda,
- library_id=library_id,
- datatypes=ldatatypes,
- widgets=widgets,
- msg=msg,
- messagetype=messagetype )
- if trans.app.security_agent.can_modify_library_item( user, roles, ldda ):
- ldda.datatype.before_edit( ldda )
- if "dbkey" in ldda.datatype.metadata_spec and not ldda.metadata.dbkey:
- # Copy dbkey into metadata, for backwards compatability
- # This looks like it does nothing, but getting the dbkey
- # returns the metadata dbkey unless it is None, in which
- # case it resorts to the old dbkey. Setting the dbkey
- # sets it properly in the metadata
- ldda.metadata.dbkey = ldda.dbkey
- return trans.fill_template( "/library/ldda_edit_info.mako",
- ldda=ldda,
- library_id=library_id,
- datatypes=ldatatypes,
- widgets=widgets,
- msg=msg,
- messagetype=messagetype )
- elif ids:
- # Multiple ids specified, display permission form, permissions will be updated for all simultaneously.
- lddas = []
- for id in [ int( id ) for id in ids ]:
- ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( id )
- if ldda is None:
- msg = 'You specified an invalid LibraryDatasetDatasetAssociation id: %s' %str( id )
- trans.response.send_redirect( web.url_for( controller='library',
- action='browse_library',
- id=library_id,
- msg=util.sanitize_text( msg ),
- messagetype='error' ) )
- lddas.append( ldda )
- if len( lddas ) < 2:
- msg = 'You must specify at least two datasets on which to modify permissions, ids you sent: %s' % str( ids )
- trans.response.send_redirect( web.url_for( controller='library',
- action='browse_library',
- id=library_id,
- msg=util.sanitize_text( msg ),
- messagetype='error' ) )
- if action == 'permissions':
- if params.get( 'update_roles_button', False ):
- if trans.app.security_agent.can_manage_library_item( user, roles, ldda ) and \
- trans.app.security_agent.can_manage_dataset( roles, ldda.dataset ):
- permissions = {}
- for k, v in trans.app.model.Dataset.permitted_actions.items():
- in_roles = [ trans.app.model.Role.get( x ) for x in util.listify( params.get( k + '_in', [] ) ) ]
- permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles
- for ldda in lddas:
- # Set the DATASET permissions on the Dataset
- trans.app.security_agent.set_all_dataset_permissions( ldda.dataset, permissions )
- ldda.dataset.refresh()
- permissions = {}
- for k, v in trans.app.model.Library.permitted_actions.items():
- in_roles = [ trans.app.model.Role.get( x ) for x in util.listify( kwd.get( k + '_in', [] ) ) ]
- permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles
- for ldda in lddas:
- # Set the LIBRARY permissions on the LibraryDataset
- # NOTE: the LibraryDataset and LibraryDatasetDatasetAssociation will be set with the same permissions
- trans.app.security_agent.set_all_library_permissions( ldda.library_dataset, permissions )
- ldda.library_dataset.refresh()
- # Set the LIBRARY permissions on the LibraryDatasetDatasetAssociation
- trans.app.security_agent.set_all_library_permissions( ldda, permissions )
- ldda.refresh()
- msg = 'Permissions and roles have been updated on %d datasets' % len( lddas )
- messagetype = 'done'
- else:
- msg = "You are not authorized to change the permissions of dataset '%s'" % ldda.name
- messagetype = 'error'
- return trans.fill_template( "/library/ldda_permissions.mako",
- ldda=lddas,
- library_id=library_id,
- msg=msg,
- messagetype=messagetype )
- if trans.app.security_agent.can_manage_library_item( user, roles, ldda ) and \
- trans.app.security_agent.can_manage_dataset( roles, ldda.dataset ):
- # Ensure that the permissions across all library items are identical, otherwise we can't update them together.
- check_list = []
- for ldda in lddas:
- permissions = []
- # Check the library level permissions - the permissions on the LibraryDatasetDatasetAssociation
- # will always be the same as the permissions on the associated LibraryDataset, so we only need to
- # check one Library object
- for library_permission in trans.app.security_agent.get_library_dataset_permissions( ldda.library_dataset ):
- if library_permission.action not in permissions:
- permissions.append( library_permission.action )
- for dataset_permission in trans.app.security_agent.get_dataset_permissions( ldda.dataset ):
- if dataset_permission.action not in permissions:
- permissions.append( dataset_permission.action )
- permissions.sort()
- if not check_list:
- check_list = permissions
- if permissions != check_list:
- msg = 'The datasets you selected do not have identical permissions, so they can not be updated together'
- trans.response.send_redirect( web.url_for( controller='library',
- action='browse_library',
- id=library_id,
- msg=util.sanitize_text( msg ),
- messagetype='error' ) )
- else:
- msg = "You are not authorized to change the permissions of dataset '%s'" % ldda.name
- messagetype = 'error'
- return trans.fill_template( "/library/ldda_permissions.mako",
- ldda=lddas,
- library_id=library_id,
- msg=msg,
- messagetype=messagetype )
if trans.app.security_agent.can_add_library_item( user, roles, folder ) or \
( replace_dataset and trans.app.security_agent.can_modify_library_item( user, roles, replace_dataset ) ):
if params.get( 'runtool_btn', False ) or params.get( 'ajax_upload', False ):
@@ -729,7 +667,7 @@
template_id = 'None'
widgets = []
upload_option = params.get( 'upload_option', 'upload_file' )
- created_outputs = trans.webapp.controllers[ 'library_dataset' ].upload_dataset( trans,
+ created_outputs = trans.webapp.controllers[ 'library_common' ].upload_dataset( trans,
controller='library',
library_id=library_id,
folder_id=folder_id,
@@ -761,7 +699,7 @@
default_action = 'add'
trans.response.send_redirect( web.url_for( controller='library',
action='browse_library',
- id=library_id,
+ obj_id=library_id,
default_action=default_action,
created_ldda_ids=",".join( ldda_id_list ),
msg=util.sanitize_text( msg ),
@@ -771,45 +709,44 @@
msg = "Upload failed"
trans.response.send_redirect( web.url_for( controller='library',
action='browse_library',
- id=library_id,
+ obj_id=library_id,
created_ldda_ids=",".join( ldda_id_list ),
msg=util.sanitize_text( msg ),
messagetype='error' ) )
- if not id or replace_dataset:
- # See if we have any inherited templates, but do not inherit contents.
- widgets = folder.get_template_widgets( trans, get_contents=False )
- upload_option = params.get( 'upload_option', 'upload_file' )
- # No dataset(s) specified, so display the upload form. Send list of data formats to the form
- # so the "extension" select list can be populated dynamically
- file_formats = trans.app.datatypes_registry.upload_file_formats
- # Send list of genome builds to the form so the "dbkey" select list can be populated dynamically
- def get_dbkey_options( last_used_build ):
- for dbkey, build_name in util.dbnames:
- yield build_name, dbkey, ( dbkey==last_used_build )
- dbkeys = get_dbkey_options( last_used_build )
- # Send list of roles to the form so the dataset can be associated with 1 or more of them.
- roles = trans.app.model.Role.filter( trans.app.model.Role.table.c.deleted==False ).order_by( trans.app.model.Role.c.name ).all()
- # Send the current history to the form to enable importing datasets from history to library
- history = trans.get_history()
- history.refresh()
- # If we're using nginx upload, override the form action
- action = web.url_for( controller='library', action='library_dataset_dataset_association' )
- if upload_option == 'upload_file' and trans.app.config.nginx_upload_path:
- action = web.url_for( trans.app.config.nginx_upload_path ) + '?nginx_redir=' + action
- return trans.fill_template( '/library/upload.mako',
- upload_option=upload_option,
- action=action,
- library_id=library_id,
- folder_id=folder_id,
- replace_dataset=replace_dataset,
- file_formats=file_formats,
- dbkeys=dbkeys,
- last_used_build=last_used_build,
- roles=roles,
- history=history,
- widgets=widgets,
- msg=msg,
- messagetype=messagetype )
+ # See if we have any inherited templates, but do not inherit contents.
+ widgets = folder.get_template_widgets( trans, get_contents=False )
+ upload_option = params.get( 'upload_option', 'upload_file' )
+ # No dataset(s) specified, so display the upload form. Send list of data formats to the form
+ # so the "extension" select list can be populated dynamically
+ file_formats = trans.app.datatypes_registry.upload_file_formats
+ # Send list of genome builds to the form so the "dbkey" select list can be populated dynamically
+ def get_dbkey_options( last_used_build ):
+ for dbkey, build_name in util.dbnames:
+ yield build_name, dbkey, ( dbkey==last_used_build )
+ dbkeys = get_dbkey_options( last_used_build )
+ # Send list of roles to the form so the dataset can be associated with 1 or more of them.
+ roles = trans.app.model.Role.filter( trans.app.model.Role.table.c.deleted==False ).order_by( trans.app.model.Role.c.name ).all()
+ # Send the current history to the form to enable importing datasets from history to library
+ history = trans.get_history()
+ history.refresh()
+ # If we're using nginx upload, override the form action
+ action = web.url_for( controller='library', action='upload_library_dataset' )
+ if upload_option == 'upload_file' and trans.app.config.nginx_upload_path:
+ action = web.url_for( trans.app.config.nginx_upload_path ) + '?nginx_redir=' + action
+ return trans.fill_template( '/library/upload.mako',
+ upload_option=upload_option,
+ action=action,
+ library_id=library_id,
+ folder_id=folder_id,
+ replace_dataset=replace_dataset,
+ file_formats=file_formats,
+ dbkeys=dbkeys,
+ last_used_build=last_used_build,
+ roles=roles,
+ history=history,
+ widgets=widgets,
+ msg=msg,
+ messagetype=messagetype )
@web.expose
def add_history_datasets_to_library( self, trans, library_id, folder_id, hda_ids='', **kwd ):
params = util.Params( kwd )
@@ -821,7 +758,7 @@
msg = "Invalid folder id: %s" % str( folder_id )
return trans.response.send_redirect( web.url_for( controller='library',
action='browse_library',
- id=library_id,
+ obj_id=library_id,
msg=util.sanitize_text( msg ),
messagetype='error' ) )
replace_id = params.get( 'replace_id', None )
@@ -836,7 +773,7 @@
msg = 'Your current history is empty'
return trans.response.send_redirect( web.url_for( controller='library',
action='browse_library',
- id=library_id,
+ obj_id=library_id,
msg=util.sanitize_text( msg ),
messagetype='error' ) )
if params.get( 'add_history_datasets_to_library_button', False ):
@@ -861,7 +798,7 @@
msg = "The requested HistoryDatasetAssociation id %s is invalid" % str( hda_id )
return trans.response.send_redirect( web.url_for( controller='library',
action='browse_library',
- id=library_id,
+ obj_id=library_id,
msg=util.sanitize_text( msg ),
messagetype='error' ) )
if created_ldda_ids:
@@ -890,7 +827,7 @@
default_action = 'add'
return trans.response.send_redirect( web.url_for( controller='library',
action='browse_library',
- id=library_id,
+ obj_id=library_id,
created_ldda_ids=created_ldda_ids.lstrip( ',' ),
default_action=default_action,
msg=util.sanitize_text( msg ),
@@ -923,264 +860,152 @@
msg=msg,
messagetype=messagetype )
@web.expose
- def folder( self, trans, id, library_id, **kwd ):
+ def download_dataset_from_folder(self, trans, obj_id, library_id=None, **kwd):
+ """Catches the dataset id and displays file contents as directed"""
+ # id must refer to a LibraryDatasetDatasetAssociation object
+ ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( obj_id )
+ if not ldda.dataset:
+ msg = 'Invalid LibraryDatasetDatasetAssociation id %s received for file downlaod' % str( obj_id )
+ return trans.response.send_redirect( web.url_for( controller='library',
+ action='browse_library',
+ obj_id=library_id,
+ msg=msg,
+ messagetype='error' ) )
+ mime = trans.app.datatypes_registry.get_mimetype_by_extension( ldda.extension.lower() )
+ trans.response.set_content_type( mime )
+ fStat = os.stat( ldda.file_name )
+ trans.response.headers[ 'Content-Length' ] = int( fStat.st_size )
+ valid_chars = '.,^_-()[]0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
+ fname = ldda.name
+ fname = ''.join( c in valid_chars and c or '_' for c in fname )[ 0:150 ]
+ trans.response.headers[ "Content-Disposition" ] = "attachment; filename=GalaxyLibraryDataset-%s-[%s]" % ( str( obj_id ), fname )
+ try:
+ return open( ldda.file_name )
+ except:
+ msg = 'This dataset contains no content'
+ return trans.response.send_redirect( web.url_for( controller='library',
+ action='browse_library',
+ obj_id=library_id,
+ msg=msg,
+ messagetype='error' ) )
+ @web.expose
+ def datasets( self, trans, library_id, ldda_ids='', **kwd ):
+ # This method is used by the select list labeled "Perform action on selected datasets"
+ # on the analysis library browser.
+ if not ldda_ids:
+ msg = "You must select at least one dataset"
+ return trans.response.send_redirect( web.url_for( controller='library',
+ action='browse_library',
+ obj_id=library_id,
+ msg=util.sanitize_text( msg ),
+ messagetype='error' ) )
+ ldda_ids = util.listify( ldda_ids )
params = util.Params( kwd )
msg = util.restore_text( params.get( 'msg', '' ) )
messagetype = params.get( 'messagetype', 'done' )
- if params.get( 'new', False ):
- action = 'new'
- elif params.get( 'delete', False ):
- action = 'delete'
- elif params.get( 'permissions', False ):
- action = 'permissions'
- else:
- # 'information' will be the default
- action = 'information'
- folder = trans.app.model.LibraryFolder.get( int( id ) )
- if not folder:
- msg = "Invalid folder specified, id: %s" % str( id )
+ if not params.do_action:
+ msg = "You must select an action to perform on selected datasets"
return trans.response.send_redirect( web.url_for( controller='library',
action='browse_library',
- id=library_id,
+ obj_id=library_id,
msg=util.sanitize_text( msg ),
messagetype='error' ) )
- user, roles = trans.get_user_and_roles()
- if action == 'new':
- if params.new == 'submitted':
- new_folder = trans.app.model.LibraryFolder( name=util.restore_text( params.name ),
- description=util.restore_text( params.description ) )
- # We are associating the last used genome build with folders, so we will always
- # initialize a new folder with the first dbkey in util.dbnames which is currently
- # ? unspecified (?)
- new_folder.genome_build = util.dbnames.default_value
- folder.add_folder( new_folder )
- new_folder.flush()
- # New folders default to having the same permissions as their parent folder
- trans.app.security_agent.copy_library_permissions( folder, new_folder )
- msg = "New folder named '%s' has been added to the library" % new_folder.name
+ if params.do_action == 'add':
+ history = trans.get_history()
+ for ldda_id in ldda_ids:
+ ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( ldda_id )
+ hda = ldda.to_history_dataset_association( target_history=history, add_to_history = True )
+ history.flush()
+ msg = "%i dataset(s) have been imported into your history" % len( ldda_ids )
+ return trans.response.send_redirect( web.url_for( controller='library',
+ action='browse_library',
+ obj_id=library_id,
+ msg=util.sanitize_text( msg ),
+ messagetype='done' ) )
+ elif params.do_action == 'manage_permissions':
+ # We need the folder containing the LibraryDatasetDatasetAssociation(s)
+ ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( ldda_ids[0] )
+ trans.response.send_redirect( web.url_for( controller='library',
+ action='upload_library_dataset',
+ library_id=library_id,
+ folder_id=ldda.library_dataset.folder.id,
+ obj_id=','.join( ldda_ids ),
+ permissions=True,
+ msg=util.sanitize_text( msg ),
+ messagetype=messagetype ) )
+ else:
+ try:
+ if params.do_action == 'zip':
+ # Can't use mkstemp - the file must not exist first
+ tmpd = tempfile.mkdtemp()
+ tmpf = os.path.join( tmpd, 'library_download.' + params.do_action )
+ if ziptype == '64':
+ archive = zipfile.ZipFile( tmpf, 'w', zipfile.ZIP_DEFLATED, True )
+ else:
+ archive = zipfile.ZipFile( tmpf, 'w', zipfile.ZIP_DEFLATED )
+ archive.add = lambda x, y: archive.write( x, y.encode('CP437') )
+ elif params.do_action == 'tgz':
+ archive = util.streamball.StreamBall( 'w|gz' )
+ elif params.do_action == 'tbz':
+ archive = util.streamball.StreamBall( 'w|bz2' )
+ except (OSError, zipfile.BadZipFile):
+ log.exception( "Unable to create archive for download" )
+ msg = "Unable to create archive for download, please report this error"
return trans.response.send_redirect( web.url_for( controller='library',
action='browse_library',
- id=library_id,
+ obj_id=library_id,
msg=util.sanitize_text( msg ),
- messagetype='done' ) )
- return trans.fill_template( '/library/new_folder.mako',
- library_id=library_id,
- folder=folder,
- msg=msg,
- messagetype=messagetype )
- elif action == 'information':
- # See if we have any associated templates
- widgets = folder.get_template_widgets( trans )
- if params.get( 'rename_folder_button', False ):
- if trans.app.security_agent.can_modify_library_item( user, roles, folder ):
- old_name = folder.name
- new_name = util.restore_text( params.name )
- new_description = util.restore_text( params.description )
- if not new_name:
- msg = 'Enter a valid name'
- return trans.fill_template( "/library/folder_info.mako",
- folder=folder,
- library_id=library_id,
- widgets=widgets,
- msg=msg,
- messagetype='error' )
- else:
- folder.name = new_name
- folder.description = new_description
- folder.flush()
- msg = "Folder '%s' has been renamed to '%s'" % ( old_name, new_name )
- return trans.response.send_redirect( web.url_for( controller='library',
- action='folder',
- id=id,
- library_id=library_id,
- rename=True,
- msg=util.sanitize_text( msg ),
- messagetype='done' ) )
- else:
- msg = "You are not authorized to edit this folder"
- return trans.fill_template( "/library/folder_info.mako",
- folder=folder,
- library_id=library_id,
- widgets=widgets,
- msg=msg,
- messagetype='error' )
- return trans.fill_template( '/library/folder_info.mako',
- folder=folder,
- library_id=library_id,
- widgets=widgets,
- msg=msg,
- messagetype=messagetype )
- elif action == 'permissions':
- if params.get( 'update_roles_button', False ):
- # The user clicked the Save button on the 'Associate With Roles' form
- if trans.app.security_agent.can_manage_library_item( user, roles, folder ):
- permissions = {}
- for k, v in trans.app.model.Library.permitted_actions.items():
- in_roles = [ trans.app.model.Role.get( int( x ) ) for x in util.listify( params.get( k + '_in', [] ) ) ]
- permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles
- trans.app.security_agent.set_all_library_permissions( folder, permissions )
- folder.refresh()
- msg = 'Permissions updated for folder %s' % folder.name
+ messagetype='error' ) )
+ seen = []
+ user, roles = trans.get_user_and_roles()
+ for ldda_id in ldda_ids:
+ ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( ldda_id )
+ if not ldda or not trans.app.security_agent.can_access_dataset( roles, ldda.dataset ):
+ continue
+ path = ""
+ parent_folder = ldda.library_dataset.folder
+ while parent_folder is not None:
+ # Exclude the now-hidden "root folder"
+ if parent_folder.parent is None:
+ path = os.path.join( parent_folder.library_root[0].name, path )
+ break
+ path = os.path.join( parent_folder.name, path )
+ parent_folder = parent_folder.parent
+ path += ldda.name
+ while path in seen:
+ path += '_'
+ seen.append( path )
+ try:
+ archive.add( ldda.dataset.file_name, path )
+ except IOError:
+ log.exception( "Unable to write to temporary library download archive" )
+ msg = "Unable to create archive for download, please report this error"
return trans.response.send_redirect( web.url_for( controller='library',
- action='folder',
- id=id,
- library_id=library_id,
- permissions=True,
- msg=util.sanitize_text( msg ),
- messagetype='done' ) )
- else:
- msg = "You are not authorized to manage permissions on this folder"
- return trans.response.send_redirect( web.url_for( controller='library',
- action='folder',
- id=id,
- library_id=library_id,
- permissions=True,
+ action='browse_library',
+ obj_id=library_id,
msg=util.sanitize_text( msg ),
messagetype='error' ) )
- return trans.fill_template( '/library/folder_permissions.mako',
- folder=folder,
- library_id=library_id,
- msg=msg,
- messagetype=messagetype )
- @web.expose
- def info_template( self, trans, library_id, id=None, folder_id=None, ldda_id=None, **kwd ):
- params = util.Params( kwd )
- msg = util.restore_text( params.get( 'msg', '' ) )
- messagetype = params.get( 'messagetype', 'done' )
- if id:
- library_item = trans.app.model.FormDefinition.get( int( id ) )
- library_item_desc = 'information template'
- response_action = 'info_template'
- response_id = id
- elif folder_id:
- library_item = trans.app.model.LibraryFolder.get( int( folder_id ) )
- library_item_desc = 'folder'
- response_action = 'folder'
- response_id = folder_id
- elif ldda_id:
- library_item = trans.app.model.LibraryDatasetDatasetAssociation.get( int( ldda_id ) )
- library_item_desc = 'library dataset'
- response_action = 'library_dataset_dataset_association'
- response_id = ldda_id
- else:
- library_item = trans.app.model.Library.get( int( library_id ) )
- library_item_desc = 'library'
- response_action = 'browse_library'
- response_id = library_id
- forms = get_all_forms( trans,
- filter=dict( deleted=False ),
- form_type=trans.app.model.FormDefinition.types.LIBRARY_INFO_TEMPLATE )
- if not forms:
- msg = "There are no forms on which to base the template, so create a form and "
- msg += "try again to add the information template to the %s." % library_item_desc
- trans.response.send_redirect( web.url_for( controller='forms',
- action='new',
- new=True,
- msg=msg,
- messagetype='done' ) )
- if params.get( 'add', False ):
- if params.get( 'add_info_template_button', False ):
- form = trans.app.model.FormDefinition.get( int( kwd[ 'form_id' ] ) )
- #fields = list( copy.deepcopy( form.fields ) )
- form_values = trans.app.model.FormValues( form, [] )
- form_values.flush()
- if folder_id:
- assoc = trans.app.model.LibraryFolderInfoAssociation( library_item, form, form_values )
- elif ldda_id:
- assoc = trans.app.model.LibraryDatasetDatasetInfoAssociation( library_item, form, form_values )
- else:
- assoc = trans.app.model.LibraryInfoAssociation( library_item, form, form_values )
- assoc.flush()
- msg = 'An information template based on the form "%s" has been added to this %s.' % ( form.name, library_item_desc )
- trans.response.send_redirect( web.url_for( controller='library',
- action=response_action,
- id=response_id,
- msg=msg,
- message_type='done' ) )
- return trans.fill_template( '/admin/library/select_info_template.mako',
- library_item_name=library_item.name,
- library_item_desc=library_item_desc,
- library_id=library_id,
- folder_id=folder_id,
- ldda_id=ldda_id,
- forms=forms,
- msg=msg,
- messagetype=messagetype )
- @web.expose
- def edit_template_info( self, trans, library_id, num_widgets, library_item_id=None, library_item_type=None, **kwd ):
- params = util.Params( kwd )
- msg = util.restore_text( params.get( 'msg', '' ) )
- messagetype = params.get( 'messagetype', 'done' )
- folder_id = None
- if library_item_type == 'library':
- library_item = trans.app.model.Library.get( library_item_id )
- elif library_item_type == 'library_dataset':
- library_item = trans.app.model.LibraryDataset.get( library_item_id )
- elif library_item_type == 'folder':
- library_item = trans.app.model.LibraryFolder.get( library_item_id )
- elif library_item_type == 'library_dataset_dataset_association':
- library_item = trans.app.model.LibraryDatasetDatasetAssociation.get( library_item_id )
- # This response_action method requires a folder_id
- folder_id = library_item.library_dataset.folder.id
- else:
- msg = "Invalid library item type ( %s ) specified, id ( %s )" % ( str( library_item_type ), str( library_item_id ) )
- return trans.response.send_redirect( web.url_for( controller='library',
- action='browse_library',
- id=library_id,
- msg=util.sanitize_text( msg ),
- messagetype='error' ) )
- # Save updated template field contents
- field_values = []
- for index in range( int( num_widgets ) ):
- field_values.append( util.restore_text( params.get( 'field_%i' % ( index ), '' ) ) )
- info = library_item.info_association[0].info
- form_values = trans.app.model.FormValues.get( info.id )
- form_values.content = field_values
- form_values.flush()
- msg = 'The information has been updated.'
- return trans.response.send_redirect( web.url_for( controller='library',
- action=library_item_type,
- id=library_item.id,
- library_id=library_id,
- folder_id=folder_id,
- edit_info=True,
- msg=util.sanitize_text( msg ),
- messagetype='done' ) )
-
-# ---- Utility methods -------------------------------------------------------
-
-def active_folders( trans, folder ):
- # Much faster way of retrieving all active sub-folders within a given folder than the
- # performance of the mapper. This query also eagerloads the permissions on each folder.
- return trans.sa_session.query( trans.app.model.LibraryFolder ) \
- .filter_by( parent=folder, deleted=False ) \
- .options( eagerload_all( "actions" ) ) \
- .order_by( trans.app.model.LibraryFolder.table.c.name ) \
- .all()
-def activatable_folders( trans, folder ):
- return trans.sa_session.query( trans.app.model.LibraryFolder ) \
- .filter_by( parent=folder, purged=False ) \
- .options( eagerload_all( "actions" ) ) \
- .order_by( trans.app.model.LibraryFolder.table.c.name ) \
- .all()
-def active_folders_and_lddas( trans, folder ):
- folders = active_folders( trans, folder )
- # This query is much faster than the folder.active_library_datasets property
- lddas = trans.sa_session.query( trans.app.model.LibraryDatasetDatasetAssociation ) \
- .filter_by( deleted=False ) \
- .join( "library_dataset" ) \
- .filter( trans.app.model.LibraryDataset.table.c.folder_id==folder.id ) \
- .order_by( trans.app.model.LibraryDatasetDatasetAssociation.table.c.name ) \
- .all()
- return folders, lddas
-def activatable_folders_and_lddas( trans, folder ):
- folders = activatable_folders( trans, folder )
- # This query is much faster than the folder.activatable_library_datasets property
- lddas = trans.sa_session.query( trans.app.model.LibraryDatasetDatasetAssociation ) \
- .join( "library_dataset" ) \
- .filter( trans.app.model.LibraryDataset.table.c.folder_id==folder.id ) \
- .join( "dataset" ) \
- .filter( trans.app.model.Dataset.table.c.deleted==False ) \
- .order_by( trans.app.model.LibraryDatasetDatasetAssociation.table.c.name ) \
- .all()
- return folders, lddas
+ if params.do_action == 'zip':
+ archive.close()
+ tmpfh = open( tmpf )
+ # clean up now
+ try:
+ os.unlink( tmpf )
+ os.rmdir( tmpd )
+ except OSError:
+ log.exception( "Unable to remove temporary library download archive and directory" )
+ msg = "Unable to create archive for download, please report this error"
+ return trans.response.send_redirect( web.url_for( controller='library',
+ action='browse_library',
+ obj_id=library_id,
+ msg=util.sanitize_text( msg ),
+ messagetype='error' ) )
+ trans.response.set_content_type( "application/x-zip-compressed" )
+ trans.response.headers[ "Content-Disposition" ] = "attachment; filename=GalaxyLibraryFiles.%s" % params.do_action
+ return tmpfh
+ else:
+ trans.response.set_content_type( "application/x-tar" )
+ trans.response.headers[ "Content-Disposition" ] = "attachment; filename=GalaxyLibraryFiles.%s" % params.do_action
+ archive.wsgi_status = trans.response.wsgi_status()
+ archive.wsgi_headeritems = trans.response.wsgi_headeritems()
+ return archive.stream
diff -r 6a066b05c94f -r 22addc979108 lib/galaxy/web/controllers/library_admin.py
--- a/lib/galaxy/web/controllers/library_admin.py Tue Sep 29 21:51:51 2009 -0400
+++ b/lib/galaxy/web/controllers/library_admin.py Wed Sep 30 05:16:17 2009 -0400
@@ -2,7 +2,6 @@
from galaxy import util
from galaxy.web.base.controller import *
from galaxy.model.orm import *
-from galaxy.web.controllers.forms import get_all_forms
# Older py compatibility
try:
set()
@@ -32,18 +31,19 @@
params = util.Params( kwd )
msg = util.restore_text( params.get( 'msg', '' ) )
messagetype = params.get( 'messagetype', 'done' )
- id = params.get( 'id', None )
- deleted = util.string_as_bool( params.get( 'deleted', False ) )
- show_deleted = util.string_as_bool( params.get( 'show_deleted', False ) )
- if not id:
+ library_id = params.get( 'obj_id', None )
+ if not library_id:
+ # To handle bots
msg = "You must specify a library id."
return trans.response.send_redirect( web.url_for( controller='library_admin',
action='browse_libraries',
msg=util.sanitize_text( msg ),
messagetype='error' ) )
- library = library=trans.app.model.Library.get( id )
+ deleted = util.string_as_bool( params.get( 'deleted', False ) )
+ show_deleted = util.string_as_bool( params.get( 'show_deleted', False ) )
+ library = library=trans.app.model.Library.get( library_id )
if not library:
- msg = "Invalid library id ( %s )."
+ msg = "Invalid library id ( %s )." % str( library_id )
return trans.response.send_redirect( web.url_for( controller='library_admin',
action='browse_libraries',
msg=util.sanitize_text( msg ),
@@ -55,17 +55,17 @@
return trans.fill_template( '/admin/library/browse_library.mako',
library=library,
deleted=deleted,
+ show_deleted=show_deleted,
created_ldda_ids=created_ldda_ids,
- forms=get_all_forms( trans, filter=dict(deleted=False) ),
msg=msg,
- messagetype=messagetype,
- show_deleted=show_deleted )
+ messagetype=messagetype )
@web.expose
@web.require_admin
- def library( self, trans, id=None, **kwd ):
+ def library( self, trans, **kwd ):
params = util.Params( kwd )
msg = util.restore_text( params.get( 'msg', '' ) )
messagetype = params.get( 'messagetype', 'done' )
+ library_id = params.get( 'obj_id', None )
if params.get( 'new', False ):
action = 'new'
elif params.get( 'delete', False ):
@@ -74,14 +74,14 @@
action = 'permissions'
else:
action = 'information'
- if not id and not action == 'new':
+ if not library_id and not action == 'new':
msg = "You must specify a library to %s." % action
return trans.response.send_redirect( web.url_for( controller='library_admin',
action='browse_libraries',
msg=util.sanitize_text( msg ),
messagetype='error' ) )
if not action == 'new':
- library = trans.app.model.Library.get( int( id ) )
+ library = trans.app.model.Library.get( int( library_id ) )
if action == 'new':
if params.new == 'submitted':
library = trans.app.model.Library( name = util.restore_text( params.name ),
@@ -93,7 +93,7 @@
msg = "The new library named '%s' has been created" % library.name
return trans.response.send_redirect( web.url_for( controller='library_admin',
action='browse_library',
- id=library.id,
+ obj_id=library.id,
msg=util.sanitize_text( msg ),
messagetype='done' ) )
return trans.fill_template( '/admin/library/new_library.mako', msg=msg, messagetype=messagetype )
@@ -122,7 +122,7 @@
msg = "Library '%s' has been renamed to '%s'" % ( old_name, new_name )
return trans.response.send_redirect( web.url_for( controller='library_admin',
action='library',
- id=id,
+ obj_id=library.id,
edit_info=True,
msg=util.sanitize_text( msg ),
messagetype='done' ) )
@@ -171,7 +171,7 @@
msg = "Permissions updated for library '%s'" % library.name
return trans.response.send_redirect( web.url_for( controller='library_admin',
action='library',
- id=id,
+ obj_id=library.id,
permissions=True,
msg=util.sanitize_text( msg ),
messagetype='done' ) )
@@ -198,7 +198,7 @@
@web.require_admin
def purge_library( self, trans, **kwd ):
params = util.Params( kwd )
- library = trans.app.model.Library.get( int( params.id ) )
+ library = trans.app.model.Library.get( int( params.obj_id ) )
def purge_folder( library_folder ):
for lf in library_folder.folders:
purge_folder( lf )
@@ -240,7 +240,7 @@
messagetype='done' ) )
@web.expose
@web.require_admin
- def folder( self, trans, id, library_id, **kwd ):
+ def folder( self, trans, obj_id, library_id, **kwd ):
params = util.Params( kwd )
msg = util.restore_text( params.get( 'msg', '' ) )
messagetype = params.get( 'messagetype', 'done' )
@@ -253,12 +253,12 @@
else:
# 'information' will be the default
action = 'information'
- folder = trans.app.model.LibraryFolder.get( int( id ) )
+ folder = trans.app.model.LibraryFolder.get( int( obj_id ) )
if not folder:
- msg = "Invalid folder specified, id: %s" % str( id )
+ msg = "Invalid folder specified, id: %s" % str( obj_id )
return trans.response.send_redirect( web.url_for( controller='library_admin',
action='browse_library',
- id=library_id,
+ obj_id=library_id,
msg=util.sanitize_text( msg ),
messagetype='error' ) )
if action == 'new':
@@ -276,7 +276,7 @@
msg = "New folder named '%s' has been added to the library" % new_folder.name
return trans.response.send_redirect( web.url_for( controller='library_admin',
action='browse_library',
- id=library_id,
+ obj_id=library_id,
msg=util.sanitize_text( msg ),
messagetype='done' ) )
return trans.fill_template( '/admin/library/new_folder.mako',
@@ -306,7 +306,7 @@
msg = "Folder '%s' has been renamed to '%s'" % ( old_name, new_name )
return trans.response.send_redirect( web.url_for( controller='library_admin',
action='folder',
- id=id,
+ obj_id=folder.id,
library_id=library_id,
edit_info=True,
msg=util.sanitize_text( msg ),
@@ -322,7 +322,7 @@
folder.flush()
msg = "Folder '%s' and all of its contents have been marked deleted" % folder.name
return trans.response.send_redirect( web.url_for( action='browse_library',
- id=library_id,
+ obj_id=library_id,
msg=util.sanitize_text( msg ),
messagetype='done' ) )
elif action =='permissions':
@@ -337,7 +337,7 @@
msg = "Permissions updated for folder '%s'" % folder.name
return trans.response.send_redirect( web.url_for( controller='library_admin',
action='folder',
- id=id,
+ obj_id=folder.id,
library_id=library_id,
permissions=True,
msg=util.sanitize_text( msg ),
@@ -349,7 +349,7 @@
messagetype=messagetype )
@web.expose
@web.require_admin
- def library_dataset( self, trans, id, library_id, **kwd ):
+ def library_dataset( self, trans, obj_id, library_id, **kwd ):
params = util.Params( kwd )
msg = util.restore_text( params.get( 'msg', '' ) )
messagetype = params.get( 'messagetype', 'done' )
@@ -357,12 +357,12 @@
action = 'permissions'
else:
action = 'information'
- library_dataset = trans.app.model.LibraryDataset.get( id )
+ library_dataset = trans.app.model.LibraryDataset.get( obj_id )
if not library_dataset:
- msg = "Invalid library dataset specified, id: %s" %str( id )
+ msg = "Invalid library dataset specified, id: %s" %str( obj_id )
return trans.response.send_redirect( web.url_for( controller='library_admin',
action='browse_library',
- id=library_id,
+ obj_id=library_id,
msg=util.sanitize_text( msg ),
messagetype='error' ) )
if action == 'information':
@@ -406,13 +406,261 @@
messagetype=messagetype )
@web.expose
@web.require_admin
- def library_dataset_dataset_association( self, trans, library_id, folder_id, id=None, **kwd ):
+ def ldda_edit_info( self, trans, library_id, folder_id, obj_id, **kwd ):
+ params = util.Params( kwd )
+ msg = util.restore_text( params.get( 'msg', '' ) )
+ messagetype = params.get( 'messagetype', 'done' )
+ ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( obj_id )
+ if not ldda:
+ msg = "Invalid LibraryDatasetDatasetAssociation specified, obj_id: %s" % str( obj_id )
+ return trans.response.send_redirect( web.url_for( controller='library_admin',
+ action='browse_library',
+ obj_id=library_id,
+ msg=util.sanitize_text( msg ),
+ messagetype='error' ) )
+ dbkey = params.get( 'dbkey', '?' )
+ if isinstance( dbkey, list ):
+ dbkey = dbkey[0]
+ file_formats = [ dtype_name for dtype_name, dtype_value in trans.app.datatypes_registry.datatypes_by_extension.iteritems() if dtype_value.allow_datatype_change ]
+ file_formats.sort()
+ # See if we have any associated templates
+ widgets = ldda.get_template_widgets( trans )
+ if params.get( 'change', False ):
+ # The user clicked the Save button on the 'Change data type' form
+ if ldda.datatype.allow_datatype_change and trans.app.datatypes_registry.get_datatype_by_extension( params.datatype ).allow_datatype_change:
+ trans.app.datatypes_registry.change_datatype( ldda, params.datatype )
+ trans.app.model.flush()
+ msg = "Data type changed for library dataset '%s'" % ldda.name
+ return trans.fill_template( "/admin/library/ldda_edit_info.mako",
+ ldda=ldda,
+ library_id=library_id,
+ file_formats=file_formats,
+ widgets=widgets,
+ msg=msg,
+ messagetype=messagetype )
+ else:
+ return trans.show_error_message( "You are unable to change datatypes in this manner. Changing %s to %s is not allowed." % \
+ ( ldda.extension, params.datatype ) )
+ elif params.get( 'save', False ):
+ # The user clicked the Save button on the 'Edit Attributes' form
+ old_name = ldda.name
+ new_name = util.restore_text( params.get( 'name', '' ) )
+ new_info = util.restore_text( params.get( 'info', '' ) )
+ new_message = util.restore_text( params.get( 'message', '' ) )
+ if not new_name:
+ msg = 'Enter a valid name'
+ messagetype = 'error'
+ else:
+ ldda.name = new_name
+ ldda.info = new_info
+ ldda.message = new_message
+ # The following for loop will save all metadata_spec items
+ for name, spec in ldda.datatype.metadata_spec.items():
+ if spec.get("readonly"):
+ continue
+ optional = params.get( "is_" + name, None )
+ if optional and optional == 'true':
+ # optional element... == 'true' actually means it is NOT checked (and therefore ommitted)
+ setattr( ldda.metadata, name, None )
+ else:
+ setattr( ldda.metadata, name, spec.unwrap( params.get ( name, None ) ) )
+ ldda.metadata.dbkey = dbkey
+ ldda.datatype.after_edit( ldda )
+ trans.app.model.flush()
+ msg = 'Attributes updated for library dataset %s' % ldda.name
+ messagetype = 'done'
+ return trans.fill_template( "/admin/library/ldda_edit_info.mako",
+ ldda=ldda,
+ library_id=library_id,
+ file_formats=file_formats,
+ widgets=widgets,
+ msg=msg,
+ messagetype=messagetype )
+ elif params.get( 'detect', False ):
+ # The user clicked the Auto-detect button on the 'Edit Attributes' form
+ for name, spec in ldda.datatype.metadata_spec.items():
+ # We need to be careful about the attributes we are resetting
+ if name not in [ 'name', 'info', 'dbkey' ]:
+ if spec.get( 'default' ):
+ setattr( ldda.metadata, name, spec.unwrap( spec.get( 'default' ) ) )
+ ldda.datatype.set_meta( ldda )
+ ldda.datatype.after_edit( ldda )
+ trans.app.model.flush()
+ msg = 'Attributes updated for library dataset %s' % ldda.name
+ return trans.fill_template( "/admin/library/ldda_edit_info.mako",
+ ldda=ldda,
+ library_id=library_id,
+ file_formats=file_formats,
+ widgets=widgets,
+ msg=msg,
+ messagetype=messagetype )
+ elif params.get( 'delete', False ):
+ ldda.deleted = True
+ ldda.flush()
+ msg = 'Dataset %s has been removed from this data library' % ldda.name
+ return trans.fill_template( "/admin/library/ldda_edit_info.mako",
+ ldda=ldda,
+ library_id=library_id,
+ file_formats=file_formats,
+ widgets=widgets,
+ msg=msg,
+ messagetype=messagetype )
+ ldda.datatype.before_edit( ldda )
+ if "dbkey" in ldda.datatype.metadata_spec and not ldda.metadata.dbkey:
+ # Copy dbkey into metadata, for backwards compatability
+ # This looks like it does nothing, but getting the dbkey
+ # returns the metadata dbkey unless it is None, in which
+ # case it resorts to the old dbkey. Setting the dbkey
+ # sets it properly in the metadata
+ ldda.metadata.dbkey = ldda.dbkey
+ return trans.fill_template( "/admin/library/ldda_edit_info.mako",
+ ldda=ldda,
+ library_id=library_id,
+ file_formats=file_formats,
+ widgets=widgets,
+ msg=msg,
+ messagetype=messagetype )
+ @web.expose
+ @web.require_admin
+ def ldda_display_info( self, trans, library_id, folder_id, obj_id, **kwd ):
+ params = util.Params( kwd )
+ msg = util.restore_text( params.get( 'msg', '' ) )
+ messagetype = params.get( 'messagetype', 'done' )
+ show_deleted = util.string_as_bool( params.get( 'show_deleted', False ) )
+ ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( obj_id )
+ if not ldda:
+ msg = "Invalid LibraryDatasetDatasetAssociation specified, obj_id: %s" % str( obj_id )
+ return trans.response.send_redirect( web.url_for( controller='library_admin',
+ action='browse_library',
+ obj_id=library_id,
+ msg=util.sanitize_text( msg ),
+ messagetype='error' ) )
+ # See if we have any associated templates
+ widgets = ldda.get_template_widgets( trans )
+ return trans.fill_template( '/admin/library/ldda_info.mako',
+ ldda=ldda,
+ library_id=library_id,
+ show_deleted=show_deleted,
+ widgets=widgets,
+ msg=msg,
+ messagetype=messagetype )
+ @web.expose
+ @web.require_admin
+ def ldda_manage_permissions( self, trans, library_id, folder_id, obj_id, **kwd ):
+ params = util.Params( kwd )
+ msg = util.restore_text( params.get( 'msg', '' ) )
+ messagetype = params.get( 'messagetype', 'done' )
+ obj_ids = util.listify( obj_id )
+ # Display permission form, permissions will be updated for all lddas simultaneously.
+ lddas = []
+ for obj_id in [ int( obj_id ) for obj_id in obj_ids ]:
+ ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( obj_id )
+ if ldda is None:
+ msg = 'You specified an invalid LibraryDatasetDatasetAssociation obj_id: %s' %str( obj_id )
+ trans.response.send_redirect( web.url_for( controller='library_admin',
+ action='browse_library',
+ obj_id=library_id,
+ msg=util.sanitize_text( msg ),
+ messagetype='error' ) )
+ lddas.append( ldda )
+ if params.get( 'update_roles_button', False ):
+ permissions = {}
+ accessible = False
+ for k, v in trans.app.model.Dataset.permitted_actions.items():
+ in_roles = [ trans.app.model.Role.get( x ) for x in util.listify( params.get( k + '_in', [] ) ) ]
+ # At least 1 user must have every role associated with this dataset, or the dataset is inaccessible
+ if v == trans.app.security_agent.permitted_actions.DATASET_ACCESS:
+ if len( in_roles ) > 1:
+ # Get the set of all users that are being associated with the dataset
+ in_roles_set = set()
+ for role in in_roles:
+ in_roles_set.add( role )
+ users_set = set()
+ for role in in_roles:
+ for ura in role.users:
+ users_set.add( ura.user )
+ # Make sure that at least 1 user has every role being associated with the dataset
+ for user in users_set:
+ user_roles_set = set()
+ for ura in user.roles:
+ user_roles_set.add( ura.role )
+ if in_roles_set.issubset( user_roles_set ):
+ accessible = True
+ break
+ else:
+ accessible = True
+ if not accessible and v == trans.app.security_agent.permitted_actions.DATASET_ACCESS:
+ # Don't set the permissions for DATASET_ACCESS if inaccessbile, but set all other permissions
+ # TODO: keep access permissions as they originally were, rather than automatically making public
+ permissions[ trans.app.security_agent.get_action( v.action ) ] = []
+ else:
+ permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles
+ for ldda in lddas:
+ # Set the DATASET permissions on the Dataset
+ trans.app.security_agent.set_all_dataset_permissions( ldda.dataset, permissions )
+ ldda.dataset.refresh()
+ permissions = {}
+ for k, v in trans.app.model.Library.permitted_actions.items():
+ in_roles = [ trans.app.model.Role.get( x ) for x in util.listify( kwd.get( k + '_in', [] ) ) ]
+ permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles
+ for ldda in lddas:
+ # Set the LIBRARY permissions on the LibraryDataset
+ # NOTE: the LibraryDataset and LibraryDatasetDatasetAssociation will be set with the same permissions
+ trans.app.security_agent.set_all_library_permissions( ldda.library_dataset, permissions )
+ ldda.library_dataset.refresh()
+ # Set the LIBRARY permissions on the LibraryDatasetDatasetAssociation
+ trans.app.security_agent.set_all_library_permissions( ldda, permissions )
+ ldda.refresh()
+ if not accessible:
+ msg = "At least 1 user must have every role associated with accessing these %d datasets. " % len( lddas )
+ msg += "The roles you attempted to associate for access would make these datasets inaccessible by everyone, "
+ msg += "so access permissions were not set. All other permissions were updated for the datasets."
+ messagetype = 'error'
+ else:
+ msg = "Permissions have been updated on %d datasets" % len( lddas )
+ return trans.fill_template( "/admin/library/ldda_permissions.mako",
+ lddas=lddas,
+ library_id=library_id,
+ msg=msg,
+ messagetype=messagetype )
+ if len( obj_ids ) > 1:
+ # Ensure that the permissions across all library items are identical, otherwise we can't update them together.
+ check_list = []
+ for ldda in lddas:
+ permissions = []
+ # Check the library level permissions - the permissions on the LibraryDatasetDatasetAssociation
+ # will always be the same as the permissions on the associated LibraryDataset, so we only need to
+ # check one Library object
+ for library_permission in trans.app.security_agent.get_library_dataset_permissions( ldda.library_dataset ):
+ if library_permission.action not in permissions:
+ permissions.append( library_permission.action )
+ for dataset_permission in trans.app.security_agent.get_dataset_permissions( ldda.dataset ):
+ if dataset_permission.action not in permissions:
+ permissions.append( dataset_permission.action )
+ permissions.sort()
+ if not check_list:
+ check_list = permissions
+ if permissions != check_list:
+ msg = 'The datasets you selected do not have identical permissions, so they can not be updated together'
+ trans.response.send_redirect( web.url_for( controller='library_admin',
+ action='browse_library',
+ obj_id=library_id,
+ msg=util.sanitize_text( msg ),
+ messagetype='error' ) )
+ return trans.fill_template( "/admin/library/ldda_permissions.mako",
+ lddas=lddas,
+ library_id=library_id,
+ msg=msg,
+ messagetype=messagetype )
+ @web.expose
+ @web.require_admin
+ def upload_library_dataset( self, trans, library_id, folder_id, **kwd ):
params = util.Params( kwd )
msg = util.restore_text( params.get( 'msg', '' ) )
messagetype = params.get( 'messagetype', 'done' )
deleted = util.string_as_bool( params.get( 'deleted', False ) )
show_deleted = util.string_as_bool( params.get( 'show_deleted', False ) )
- dbkey = params.get( 'dbkey', None )
+ dbkey = params.get( 'dbkey', '?' )
if isinstance( dbkey, list ):
last_used_build = dbkey[0]
else:
@@ -427,10 +675,6 @@
last_used_build = replace_dataset.library_dataset_dataset_association.dbkey
else:
replace_dataset = None
- # Let's not overwrite the imported datatypes module with the variable datatypes?
- # The built-in 'id' is overwritten in lots of places as well
- ldatatypes = [ dtype_name for dtype_name, dtype_value in trans.app.datatypes_registry.datatypes_by_extension.iteritems() if dtype_value.allow_datatype_change ]
- ldatatypes.sort()
if params.get( 'runtool_btn', False ) or params.get( 'ajax_upload', False ):
# See if we have any inherited templates, but do not inherit contents.
info_association, inherited = folder.get_info_association( inherited=True )
@@ -441,7 +685,7 @@
template_id = 'None'
widgets = []
upload_option = params.get( 'upload_option', 'upload_file' )
- created_outputs = trans.webapp.controllers[ 'library_dataset' ].upload_dataset( trans,
+ created_outputs = trans.webapp.controllers[ 'library_common' ].upload_dataset( trans,
controller='library_admin',
library_id=library_id,
folder_id=folder_id,
@@ -466,345 +710,44 @@
messagetype='error'
trans.response.send_redirect( web.url_for( controller='library_admin',
action='browse_library',
- id=library_id,
+ obj_id=library_id,
created_ldda_ids=",".join( [ str( v.id ) for v in created_outputs.values() ] ),
msg=util.sanitize_text( msg ),
messagetype=messagetype ) )
- elif not id or replace_dataset:
- # See if we have any inherited templates, but do not inherit contents.
- widgets = folder.get_template_widgets( trans, get_contents=False )
- upload_option = params.get( 'upload_option', 'upload_file' )
- # No dataset(s) specified, so display the upload form. Send list of data formats to the form
- # so the "extension" select list can be populated dynamically
- file_formats = trans.app.datatypes_registry.upload_file_formats
- # Send list of genome builds to the form so the "dbkey" select list can be populated dynamically
- def get_dbkey_options( last_used_build ):
- for dbkey, build_name in util.dbnames:
- yield build_name, dbkey, ( dbkey==last_used_build )
- dbkeys = get_dbkey_options( last_used_build )
- # Send list of roles to the form so the dataset can be associated with 1 or more of them.
- roles = trans.app.model.Role.filter( trans.app.model.Role.table.c.deleted==False ).order_by( trans.app.model.Role.c.name ).all()
- # Send the current history to the form to enable importing datasets from history to library
- history = trans.get_history()
- history.refresh()
- # If we're using nginx upload, override the form action
- action = web.url_for( controller='library_admin', action='library_dataset_dataset_association' )
- if upload_option == 'upload_file' and trans.app.config.nginx_upload_path:
- action = web.url_for( trans.app.config.nginx_upload_path ) + '?nginx_redir=' + action
- return trans.fill_template( '/admin/library/upload.mako',
- upload_option=upload_option,
- action=action,
- library_id=library_id,
- folder_id=folder_id,
- replace_dataset=replace_dataset,
- file_formats=file_formats,
- dbkeys=dbkeys,
- last_used_build=last_used_build,
- roles=roles,
- history=history,
- widgets=widgets,
- msg=msg,
- messagetype=messagetype )
- else:
- if params.get( 'permissions', False ):
- action = 'permissions'
- elif params.get( 'edit_info', False ):
- action = 'edit_info'
- else:
- action = 'info'
- if id.count( ',' ):
- ids = id.split( ',' )
- id = None
- else:
- ids = None
- if id:
- # ldda_id specified, display attributes form
- ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( id )
- if not ldda:
- msg = "Invalid LibraryDatasetDatasetAssociation specified, id: %s" % str( id )
- return trans.response.send_redirect( web.url_for( controller='library_admin',
- action='browse_library',
- id=library_id,
- msg=util.sanitize_text( msg ),
- messagetype='error' ) )
- # See if we have any associated templates
- widgets = ldda.get_template_widgets( trans )
- if action == 'permissions':
- if params.get( 'update_roles_button', False ):
- permissions = {}
- accessible = False
- for k, v in trans.app.model.Dataset.permitted_actions.items():
- # TODO: need to handle case where a user has the DATASET_MANAGE_PERMISSIONS permission, but not
- # the DATASET_ACCESS permission, making the former useless. Need to display a warning message.
- in_roles = [ trans.app.model.Role.get( x ) for x in util.listify( params.get( k + '_in', [] ) ) ]
- # At least 1 user must have every role associated with this dataset, or the dataset is inaccessible
- if v == trans.app.security_agent.permitted_actions.DATASET_ACCESS:
- if len( in_roles ) > 1:
- # Get the set of all users that are being associated with the dataset
- in_roles_set = set()
- for role in in_roles:
- in_roles_set.add( role )
- users_set = set()
- for role in in_roles:
- for ura in role.users:
- users_set.add( ura.user )
- # Make sure that at least 1 user has every role being associated with the dataset
- for user in users_set:
- user_roles_set = set()
- for ura in user.roles:
- user_roles_set.add( ura.role )
- if in_roles_set.issubset( user_roles_set ):
- accessible = True
- break
- else:
- accessible = True
- if not accessible and v == trans.app.security_agent.permitted_actions.DATASET_ACCESS:
- # Don't set the permissions for DATASET_ACCESS if inaccessbile, but set all other permissions
- # TODO: keep access permissions as they originally were, rather than automatically making public
- permissions[ trans.app.security_agent.get_action( v.action ) ] = []
- else:
- permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles
- # Set the DATASET permissions on the Dataset
- trans.app.security_agent.set_all_dataset_permissions( ldda.dataset, permissions )
- ldda.dataset.refresh()
- permissions = {}
- for k, v in trans.app.model.Library.permitted_actions.items():
- in_roles = [ trans.app.model.Role.get( x ) for x in util.listify( kwd.get( k + '_in', [] ) ) ]
- permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles
- # Set the LIBRARY permissions on the LibraryDataset
- # NOTE: the LibraryDataset and LibraryDatasetDatasetAssociation will be set with the same permissions
- trans.app.security_agent.set_all_library_permissions( ldda.library_dataset, permissions )
- ldda.library_dataset.refresh()
- # Set the LIBRARY permissions on the LibraryDatasetDatasetAssociation
- trans.app.security_agent.set_all_library_permissions( ldda, permissions )
- ldda.refresh()
- if not accessible:
- msg = "At least 1 user must have every role associated with accessing dataset '%s'. " % ldda.name
- msg += "The roles you attempted to associate for access would make this dataset inaccessible by everyone, "
- msg += "so access permissions were not set. All other permissions were updated for the dataset."
- messagetype = 'error'
- else:
- msg = "Permissions updated for dataset '%s'" % ldda.name
- return trans.fill_template( '/admin/library/ldda_permissions.mako',
- ldda=ldda,
- library_id=library_id,
- msg=msg,
- messagetype=messagetype )
- elif action == 'info':
- return trans.fill_template( '/admin/library/ldda_info.mako',
- ldda=ldda,
- library_id=library_id,
- deleted=deleted,
- show_deleted=show_deleted,
- widgets=widgets,
- msg=msg,
- messagetype=messagetype )
- elif action == 'edit_info':
- if params.get( 'change', False ):
- # The user clicked the Save button on the 'Change data type' form
- if ldda.datatype.allow_datatype_change and trans.app.datatypes_registry.get_datatype_by_extension( params.datatype ).allow_datatype_change:
- trans.app.datatypes_registry.change_datatype( ldda, params.datatype )
- trans.app.model.flush()
- msg = "Data type changed for library dataset '%s'" % ldda.name
- return trans.fill_template( "/admin/library/ldda_edit_info.mako",
- ldda=ldda,
- library_id=library_id,
- datatypes=ldatatypes,
- widgets=widgets,
- msg=msg,
- messagetype=messagetype )
- else:
- return trans.show_error_message( "You are unable to change datatypes in this manner. Changing %s to %s is not allowed." % ( ldda.extension, params.datatype ) )
- elif params.get( 'save', False ):
- # The user clicked the Save button on the 'Edit Attributes' form
- old_name = ldda.name
- new_name = util.restore_text( params.get( 'name', '' ) )
- new_info = util.restore_text( params.get( 'info', '' ) )
- new_message = util.restore_text( params.get( 'message', '' ) )
- if not new_name:
- msg = 'Enter a valid name'
- messagetype = 'error'
- else:
- ldda.name = new_name
- ldda.info = new_info
- ldda.message = new_message
- # The following for loop will save all metadata_spec items
- for name, spec in ldda.datatype.metadata_spec.items():
- if spec.get("readonly"):
- continue
- optional = params.get( "is_" + name, None )
- if optional and optional == 'true':
- # optional element... == 'true' actually means it is NOT checked (and therefore ommitted)
- setattr( ldda.metadata, name, None )
- else:
- setattr( ldda.metadata, name, spec.unwrap( params.get ( name, None ) ) )
- ldda.metadata.dbkey = dbkey
- ldda.datatype.after_edit( ldda )
- trans.app.model.flush()
- msg = 'Attributes updated for library dataset %s' % ldda.name
- messagetype = 'done'
- return trans.fill_template( "/admin/library/ldda_edit_info.mako",
- ldda=ldda,
- library_id=library_id,
- datatypes=ldatatypes,
- widgets=widgets,
- msg=msg,
- messagetype=messagetype )
- elif params.get( 'detect', False ):
- # The user clicked the Auto-detect button on the 'Edit Attributes' form
- for name, spec in ldda.datatype.metadata_spec.items():
- # We need to be careful about the attributes we are resetting
- if name not in [ 'name', 'info', 'dbkey' ]:
- if spec.get( 'default' ):
- setattr( ldda.metadata, name, spec.unwrap( spec.get( 'default' ) ) )
- ldda.datatype.set_meta( ldda )
- ldda.datatype.after_edit( ldda )
- trans.app.model.flush()
- msg = 'Attributes updated for library dataset %s' % ldda.name
- return trans.fill_template( "/admin/library/ldda_edit_info.mako",
- ldda=ldda,
- library_id=library_id,
- datatypes=ldatatypes,
- widgets=widgets,
- msg=msg,
- messagetype=messagetype )
- elif params.get( 'delete', False ):
- ldda.deleted = True
- ldda.flush()
- msg = 'Dataset %s has been removed from this library' % ldda.name
- return trans.fill_template( "/admin/library/ldda_edit_info.mako",
- ldda=ldda,
- library_id=library_id,
- datatypes=ldatatypes,
- widgets=widgets,
- msg=msg,
- messagetype=messagetype )
- ldda.datatype.before_edit( ldda )
- if "dbkey" in ldda.datatype.metadata_spec and not ldda.metadata.dbkey:
- # Copy dbkey into metadata, for backwards compatability
- # This looks like it does nothing, but getting the dbkey
- # returns the metadata dbkey unless it is None, in which
- # case it resorts to the old dbkey. Setting the dbkey
- # sets it properly in the metadata
- ldda.metadata.dbkey = ldda.dbkey
- return trans.fill_template( "/admin/library/ldda_edit_info.mako",
- ldda=ldda,
- library_id=library_id,
- datatypes=ldatatypes,
- widgets=widgets,
- msg=msg,
- messagetype=messagetype )
- elif ids:
- # Multiple ids specfied, display permission form, permissions will be updated for all simultaneously.
- lddas = []
- for id in [ int( id ) for id in ids ]:
- ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( id )
- if ldda is None:
- msg = 'You specified an invalid LibraryDatasetDatasetAssociation id: %s' %str( id )
- trans.response.send_redirect( web.url_for( controller='library_admin',
- action='browse_library',
- id=library_id,
- msg=util.sanitize_text( msg ),
- messagetype='error' ) )
- lddas.append( ldda )
- if len( lddas ) < 2:
- msg = 'You must specify at least two datasets on which to modify permissions, ids you sent: %s' % str( ids )
- trans.response.send_redirect( web.url_for( controller='library_admin',
- action='browse_library',
- id=library_id,
- msg=util.sanitize_text( msg ),
- messagetype='error' ) )
- if action == 'permissions':
- if params.get( 'update_roles_button', False ):
- permissions = {}
- accessible = False
- for k, v in trans.app.model.Dataset.permitted_actions.items():
- # TODO: need to handle case where a user has the DATASET_MANAGE_PERMISSIONS permission, but not
- # the DATASET_ACCESS permission, making the former useless. Need to display a warning message.
- in_roles = [ trans.app.model.Role.get( x ) for x in util.listify( params.get( k + '_in', [] ) ) ]
- # At least 1 user must have every role associated with this dataset, or the dataset is inaccessible
- if v == trans.app.security_agent.permitted_actions.DATASET_ACCESS:
- if len( in_roles ) > 1:
- # Get the set of all users that are being associated with the dataset
- in_roles_set = set()
- for role in in_roles:
- in_roles_set.add( role )
- users_set = set()
- for role in in_roles:
- for ura in role.users:
- users_set.add( ura.user )
- # Make sure that at least 1 user has every role being associated with the dataset
- for user in users_set:
- user_roles_set = set()
- for ura in user.roles:
- user_roles_set.add( ura.role )
- if in_roles_set.issubset( user_roles_set ):
- accessible = True
- break
- else:
- accessible = True
- if not accessible and v == trans.app.security_agent.permitted_actions.DATASET_ACCESS:
- # Don't set the permissions for DATASET_ACCESS if inaccessbile, but set all other permissions
- # TODO: keep access permissions as they originally were, rather than automatically making public
- permissions[ trans.app.security_agent.get_action( v.action ) ] = []
- else:
- permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles
- for ldda in lddas:
- # Set the DATASET permissions on the Dataset
- trans.app.security_agent.set_all_dataset_permissions( ldda.dataset, permissions )
- ldda.dataset.refresh()
- permissions = {}
- for k, v in trans.app.model.Library.permitted_actions.items():
- in_roles = [ trans.app.model.Role.get( x ) for x in util.listify( kwd.get( k + '_in', [] ) ) ]
- permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles
- for ldda in lddas:
- # Set the LIBRARY permissions on the LibraryDataset
- # NOTE: the LibraryDataset and LibraryDatasetDatasetAssociation will be set with the same permissions
- trans.app.security_agent.set_all_library_permissions( ldda.library_dataset, permissions )
- ldda.library_dataset.refresh()
- # Set the LIBRARY permissions on the LibraryDatasetDatasetAssociation
- trans.app.security_agent.set_all_library_permissions( ldda, permissions )
- ldda.refresh()
- if not accessible:
- msg = "At least 1 user must have every role associated with accessing these %d datasets. " % len( lddas )
- msg += "The roles you attempted to associate for access would make these datasets inaccessible by everyone, "
- msg += "so access permissions were not set. All other permissions were updated for the datasets."
- messagetype = 'error'
- else:
- msg = "Permissions have been updated on %d datasets" % len( lddas )
- return trans.fill_template( "/admin/library/ldda_permissions.mako",
- ldda=lddas,
- library_id=library_id,
- msg=msg,
- messagetype=messagetype )
- # Ensure that the permissions across all library items are identical, otherwise we can't update them together.
- check_list = []
- for ldda in lddas:
- permissions = []
- # Check the library level permissions - the permissions on the LibraryDatasetDatasetAssociation
- # will always be the same as the permissions on the associated LibraryDataset, so we only need to
- # check one Library object
- for library_permission in trans.app.security_agent.get_library_dataset_permissions( ldda.library_dataset ):
- if library_permission.action not in permissions:
- permissions.append( library_permission.action )
- for dataset_permission in trans.app.security_agent.get_dataset_permissions( ldda.dataset ):
- if dataset_permission.action not in permissions:
- permissions.append( dataset_permission.action )
- permissions.sort()
- if not check_list:
- check_list = permissions
- if permissions != check_list:
- msg = 'The datasets you selected do not have identical permissions, so they can not be updated together'
- trans.response.send_redirect( web.url_for( controller='library_admin',
- action='browse_library',
- id=library_id,
- msg=util.sanitize_text( msg ),
- messagetype='error' ) )
- return trans.fill_template( "/admin/library/ldda_permissions.mako",
- ldda=lddas,
- library_id=library_id,
- msg=msg,
- messagetype=messagetype )
+ # See if we have any inherited templates, but do not inherit contents.
+ widgets = folder.get_template_widgets( trans, get_contents=False )
+ upload_option = params.get( 'upload_option', 'upload_file' )
+ # No dataset(s) specified, so display the upload form. Send list of data formats to the form
+ # so the "extension" select list can be populated dynamically
+ file_formats = trans.app.datatypes_registry.upload_file_formats
+ # Send list of genome builds to the form so the "dbkey" select list can be populated dynamically
+ def get_dbkey_options( last_used_build ):
+ for dbkey, build_name in util.dbnames:
+ yield build_name, dbkey, ( dbkey==last_used_build )
+ dbkeys = get_dbkey_options( last_used_build )
+ # Send list of roles to the form so the dataset can be associated with 1 or more of them.
+ roles = trans.app.model.Role.filter( trans.app.model.Role.table.c.deleted==False ).order_by( trans.app.model.Role.c.name ).all()
+ # Send the current history to the form to enable importing datasets from history to library
+ history = trans.get_history()
+ history.refresh()
+ # If we're using nginx upload, override the form action
+ action = web.url_for( controller='library_admin', action='upload_library_dataset' )
+ if upload_option == 'upload_file' and trans.app.config.nginx_upload_path:
+ action = web.url_for( trans.app.config.nginx_upload_path ) + '?nginx_redir=' + action
+ return trans.fill_template( '/admin/library/upload.mako',
+ upload_option=upload_option,
+ action=action,
+ library_id=library_id,
+ folder_id=folder_id,
+ replace_dataset=replace_dataset,
+ file_formats=file_formats,
+ dbkeys=dbkeys,
+ last_used_build=last_used_build,
+ roles=roles,
+ history=history,
+ widgets=widgets,
+ msg=msg,
+ messagetype=messagetype )
@web.expose
@web.require_admin
def add_history_datasets_to_library( self, trans, library_id, folder_id, hda_ids='', **kwd ):
@@ -817,7 +760,7 @@
msg = "Invalid folder id: %s" % str( folder_id )
return trans.response.send_redirect( web.url_for( controller='library_admin',
action='browse_library',
- id=library_id,
+ obj_id=library_id,
msg=util.sanitize_text( msg ),
messagetype='error' ) )
replace_id = params.get( 'replace_id', None )
@@ -832,7 +775,7 @@
msg = 'Your current history is empty'
return trans.response.send_redirect( web.url_for( controller='library_admin',
action='browse_library',
- id=library_id,
+ obj_id=library_id,
msg=util.sanitize_text( msg ),
messagetype='error' ) )
if params.get( 'add_history_datasets_to_library_button', False ):
@@ -857,7 +800,7 @@
msg = "The requested HistoryDatasetAssociation id %s is invalid" % str( hda_id )
return trans.response.send_redirect( web.url_for( controller='library_admin',
action='browse_library',
- id=library_id,
+ obj_id=library_id,
msg=util.sanitize_text( msg ),
messagetype='error' ) )
if created_ldda_ids:
@@ -875,7 +818,7 @@
msg += "Click the Go button at the bottom of this page to edit the permissions on these datasets if necessary."
return trans.response.send_redirect( web.url_for( controller='library_admin',
action='browse_library',
- id=library_id,
+ obj_id=library_id,
created_ldda_ids=created_ldda_ids,
msg=util.sanitize_text( msg ),
messagetype='done' ) )
@@ -908,146 +851,15 @@
messagetype=messagetype )
@web.expose
@web.require_admin
- def info_template( self, trans, library_id, id=None, folder_id=None, ldda_id=None, **kwd ):
- params = util.Params( kwd )
- msg = util.restore_text( params.get( 'msg', '' ) )
- messagetype = params.get( 'messagetype', 'done' )
- if id:
- library_item = trans.app.model.FormDefinition.get( int( id ) )
- library_item_desc = 'information template'
- response_action = 'info_template'
- response_id = id
- elif folder_id:
- library_item = trans.app.model.LibraryFolder.get( int( folder_id ) )
- library_item_desc = 'folder'
- response_action = 'folder'
- response_id = folder_id
- elif ldda_id:
- library_item = trans.app.model.LibraryDatasetDatasetAssociation.get( int( ldda_id ) )
- library_item_desc = 'library dataset'
- response_action = 'library_dataset_dataset_association'
- response_id = ldda_id
- else:
- library_item = trans.app.model.Library.get( int( library_id ) )
- library_item_desc = 'library'
- response_action = 'browse_library'
- response_id = library_id
- forms = get_all_forms( trans,
- filter=dict( deleted=False ),
- form_type=trans.app.model.FormDefinition.types.LIBRARY_INFO_TEMPLATE )
- if not forms:
- msg = "There are no forms on which to base the template, so create a form and "
- msg += "try again to add the information template to the %s." % library_item_desc
- trans.response.send_redirect( web.url_for( controller='forms',
- action='new',
- new=True,
- msg=msg,
- messagetype='done' ) )
- if params.get( 'add', False ):
- if params.get( 'add_info_template_button', False ):
- form = trans.app.model.FormDefinition.get( int( kwd[ 'form_id' ] ) )
- #fields = list( copy.deepcopy( form.fields ) )
- form_values = trans.app.model.FormValues( form, [] )
- form_values.flush()
- if folder_id:
- assoc = trans.app.model.LibraryFolderInfoAssociation( library_item, form, form_values )
- elif ldda_id:
- assoc = trans.app.model.LibraryDatasetDatasetInfoAssociation( library_item, form, form_values )
- else:
- assoc = trans.app.model.LibraryInfoAssociation( library_item, form, form_values )
- assoc.flush()
- msg = 'An information template based on the form "%s" has been added to this %s.' % ( form.name, library_item_desc )
- trans.response.send_redirect( web.url_for( controller='library_admin',
- action=response_action,
- id=response_id,
- msg=msg,
- message_type='done' ) )
- return trans.fill_template( '/admin/library/select_info_template.mako',
- library_item_name=library_item.name,
- library_item_desc=library_item_desc,
- library_id=library_id,
- folder_id=folder_id,
- ldda_id=ldda_id,
- forms=forms,
- msg=msg,
- messagetype=messagetype )
- @web.expose
- @web.require_admin
- def edit_template_info( self, trans, library_id, num_widgets, library_item_id=None, library_item_type=None, **kwd ):
- params = util.Params( kwd )
- msg = util.restore_text( params.get( 'msg', '' ) )
- messagetype = params.get( 'messagetype', 'done' )
- folder_id = None
- if library_item_type == 'library':
- library_item = trans.app.model.Library.get( library_item_id )
- elif library_item_type == 'library_dataset':
- library_item = trans.app.model.LibraryDataset.get( library_item_id )
- elif library_item_type == 'folder':
- library_item = trans.app.model.LibraryFolder.get( library_item_id )
- elif library_item_type == 'library_dataset_dataset_association':
- library_item = trans.app.model.LibraryDatasetDatasetAssociation.get( library_item_id )
- # This response_action method requires a folder_id
- folder_id = library_item.library_dataset.folder.id
- else:
- msg = "Invalid library item type ( %s ) specified, id ( %s )" % ( str( library_item_type ), str( library_item_id ) )
+ def download_dataset_from_folder(self, trans, obj_id, library_id=None, **kwd):
+ """Catches the dataset id and displays file contents as directed"""
+ # id must refer to a LibraryDatasetDatasetAssociation object
+ ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( obj_id )
+ if not ldda.dataset:
+ msg = 'Invalid LibraryDatasetDatasetAssociation id %s received for file downlaod' % str( obj_id )
return trans.response.send_redirect( web.url_for( controller='library_admin',
action='browse_library',
- id=library_id,
- msg=util.sanitize_text( msg ),
- messagetype='error' ) )
- # Save updated template field contents
- field_contents = []
- for index in range( int( num_widgets ) ):
- field_contents.append( util.restore_text( params.get( 'field_%i' % ( index ), '' ) ) )
- if field_contents:
- # Since information templates are inherited, the template fields can be displayed on the information
- # page for a folder or library dataset when it has no info_association object. If the user has added
- # field contents on an inherited template via a parent's info_association, we'll need to create a new
- # form_values and info_association for the current object. The value for the returned inherited variable
- # is not applicable at this level.
- info_association, inherited = library_item.get_info_association( restrict=True )
- if info_association:
- template = info_association.template
- info = info_association.info
- form_values = trans.app.model.FormValues.get( info.id )
- # Update existing content only if it has changed
- if form_values.content != field_contents:
- form_values.content = field_contents
- form_values.flush()
- else:
- # Inherit the next available info_association so we can get the template
- info_association, inherited = library_item.get_info_association()
- template = info_association.template
- # Create a new FormValues object
- form_values = trans.app.model.FormValues( template, field_contents )
- form_values.flush()
- # Create a new info_association between the current library item and form_values
- if library_item_type == 'folder':
- info_association = trans.app.model.LibraryFolderInfoAssociation( library_item, template, form_values )
- info_association.flush()
- elif library_item_type == 'library_dataset_dataset_association':
- info_association = trans.app.model.LibraryDatasetDatasetInfoAssociation( library_item, template, form_values )
- info_association.flush()
- msg = 'The information has been updated.'
- return trans.response.send_redirect( web.url_for( controller='library_admin',
- action=library_item_type,
- id=library_item.id,
- library_id=library_id,
- folder_id=folder_id,
- edit_info=True,
- msg=util.sanitize_text( msg ),
- messagetype='done' ) )
- @web.expose
- @web.require_admin
- def download_dataset_from_folder(self, trans, id, library_id=None, **kwd):
- """Catches the dataset id and displays file contents as directed"""
- # id must refer to a LibraryDatasetDatasetAssociation object
- ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( id )
- if not ldda.dataset:
- msg = 'Invalid LibraryDatasetDatasetAssociation id %s received for file downlaod' % str( id )
- return trans.response.send_redirect( web.url_for( controller='library_admin',
- action='browse_library',
- id=library_id,
+ obj_id=library_id,
msg=util.sanitize_text( msg ),
messagetype='error' ) )
mime = trans.app.datatypes_registry.get_mimetype_by_extension( ldda.extension.lower() )
@@ -1057,14 +869,14 @@
valid_chars = '.,^_-()[]0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
fname = ldda.name
fname = ''.join( c in valid_chars and c or '_' for c in fname )[ 0:150 ]
- trans.response.headers[ "Content-Disposition" ] = "attachment; filename=GalaxyLibraryDataset-%s-[%s]" % ( str( id ), fname )
+ trans.response.headers[ "Content-Disposition" ] = "attachment; filename=GalaxyLibraryDataset-%s-[%s]" % ( str( obj_id ), fname )
try:
return open( ldda.file_name )
except:
msg = 'This dataset contains no content'
return trans.response.send_redirect( web.url_for( controller='library_admin',
action='browse_library',
- id=library_id,
+ obj_id=library_id,
msg=util.sanitize_text( msg ),
messagetype='error' ) )
@web.expose
@@ -1076,48 +888,40 @@
msg = util.restore_text( params.get( 'msg', '' ) )
messagetype = params.get( 'messagetype', 'done' )
if params.get( 'action_on_datasets_button', False ):
- if not params.ldda_ids:
+ ldda_ids = util.listify( params.get( 'ldda_ids', None ) )
+ if not ldda_ids:
msg = "At least one dataset must be selected for %s" % params.action
trans.response.send_redirect( web.url_for( controller='library_admin',
action='browse_library',
- id=library_id,
+ obj_id=library_id,
msg=util.sanitize_text( msg ),
messagetype='error' ) )
- ldda_ids = util.listify( params.ldda_ids )
- if params.action == 'edit':
+ if params.action == 'manage_permissions':
# We need the folder containing the LibraryDatasetDatasetAssociation(s)
- ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( ldda_ids[0] )
+ ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( int( ldda_ids[0] ) )
trans.response.send_redirect( web.url_for( controller='library_admin',
- action='library_dataset_dataset_association',
+ action='ldda_manage_permissions',
library_id=library_id,
folder_id=ldda.library_dataset.folder.id,
- id=",".join( ldda_ids ),
- permissions=True,
+ obj_id=",".join( ldda_ids ),
msg=util.sanitize_text( msg ),
messagetype=messagetype ) )
elif params.action == 'delete':
- for id in ldda_ids:
- ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( id )
+ for ldda_id in ldda_ids:
+ ldda = trans.app.model.LibraryDatasetDatasetAssociation.get( ldda_id )
ldda.deleted = True
ldda.flush()
- msg = "The selected datasets have been removed from this library"
+ msg = "The selected datasets have been removed from this data library"
trans.response.send_redirect( web.url_for( controller='library_admin',
action='browse_library',
- id=library_id,
+ obj_id=library_id,
show_deleted=False,
msg=util.sanitize_text( msg ),
messagetype='done' ) )
- else:
- msg = "Action %s is not yet implemented" % str( params.action )
- trans.response.send_redirect( web.url_for( controller='library_admin',
- action='browse_library',
- id=library_id,
- msg=util.sanitize_text( msg ),
- messagetype='error' ) )
else:
trans.response.send_redirect( web.url_for( controller='library_admin',
action='browse_library',
- id=library_id,
+ obj_id=library_id,
msg=util.sanitize_text( msg ),
messagetype=messagetype ) )
@web.expose
@@ -1149,7 +953,10 @@
if library_item_type == 'library':
return self.browse_libraries( trans, msg=msg, messagetype=messagetype )
else:
- return self.browse_library( trans, id=library_id , msg=msg, messagetype=messagetype )
+ return self.browse_library( trans,
+ obj_id=library_id,
+ msg=msg,
+ messagetype=messagetype )
@web.expose
@web.require_admin
def undelete_library_item( self, trans, library_id, library_item_id, library_item_type ):
@@ -1177,4 +984,7 @@
if library_item_type == 'library':
return self.browse_libraries( trans, msg=msg, messagetype=messagetype )
else:
- return self.browse_library( trans, id=library_id , msg=msg, messagetype=messagetype )
+ return self.browse_library( trans,
+ obj_id=library_id,
+ msg=msg,
+ messagetype=messagetype )
diff -r 6a066b05c94f -r 22addc979108 lib/galaxy/web/controllers/library_common.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/galaxy/web/controllers/library_common.py Wed Sep 30 05:16:17 2009 -0400
@@ -0,0 +1,300 @@
+import os, os.path, shutil, urllib, StringIO, re, gzip, tempfile, shutil, zipfile
+from galaxy.web.base.controller import *
+from galaxy import util, jobs
+from galaxy.datatypes import sniff
+from galaxy.security import RBACAgent
+from galaxy.util.json import to_json_string
+from galaxy.tools.actions import upload_common
+from galaxy.web.controllers.forms import get_all_forms
+from galaxy.model.orm import *
+
+log = logging.getLogger( __name__ )
+
+class LibraryCommon( BaseController ):
+ @web.json
+ def library_item_updates( self, trans, ids=None, states=None ):
+ # Avoid caching
+ trans.response.headers['Pragma'] = 'no-cache'
+ trans.response.headers['Expires'] = '0'
+ # Create new HTML for any that have changed
+ rval = {}
+ if ids is not None and states is not None:
+ ids = map( int, ids.split( "," ) )
+ states = states.split( "," )
+ for id, state in zip( ids, states ):
+ data = self.app.model.LibraryDatasetDatasetAssociation.get( id )
+ if data.state != state:
+ job_ldda = data
+ while job_ldda.copied_from_library_dataset_dataset_association:
+ job_ldda = job_ldda.copied_from_library_dataset_dataset_association
+ force_history_refresh = False
+ rval[id] = {
+ "state": data.state,
+ "html": unicode( trans.fill_template( "library/library_item_info.mako", ldda=data ), 'utf-8' )
+ #"force_history_refresh": force_history_refresh
+ }
+ return rval
+ def upload_dataset( self, trans, controller, library_id, folder_id, replace_dataset=None, **kwd ):
+ # Set up the traditional tool state/params
+ tool_id = 'upload1'
+ tool = trans.app.toolbox.tools_by_id[ tool_id ]
+ state = tool.new_state( trans )
+ errors = tool.update_state( trans, tool.inputs_by_page[0], state.inputs, kwd, changed_dependencies={} )
+ tool_params = state.inputs
+ dataset_upload_inputs = []
+ for input_name, input in tool.inputs.iteritems():
+ if input.type == "upload_dataset":
+ dataset_upload_inputs.append( input )
+ # Library-specific params
+ params = util.Params( kwd ) # is this filetoolparam safe?
+ library_bunch = upload_common.handle_library_params( trans, params, folder_id, replace_dataset )
+ msg = util.restore_text( params.get( 'msg', '' ) )
+ messagetype = params.get( 'messagetype', 'done' )
+ server_dir = util.restore_text( params.get( 'server_dir', '' ) )
+ if replace_dataset not in [ None, 'None' ]:
+ replace_id = replace_dataset.id
+ else:
+ replace_id = None
+ upload_option = params.get( 'upload_option', 'upload_file' )
+ err_redirect = False
+ if upload_option == 'upload_directory':
+ if server_dir in [ None, 'None', '' ]:
+ err_redirect = True
+ if controller == 'library_admin':
+ import_dir = trans.app.config.library_import_dir
+ import_dir_desc = 'library_import_dir'
+ full_dir = os.path.join( import_dir, server_dir )
+ else:
+ import_dir = trans.app.config.user_library_import_dir
+ import_dir_desc = 'user_library_import_dir'
+ if server_dir == trans.user.email:
+ full_dir = os.path.join( import_dir, server_dir )
+ else:
+ full_dir = os.path.join( import_dir, trans.user.email, server_dir )
+ if import_dir:
+ msg = 'Select a directory'
+ else:
+ msg = '"%s" is not defined in the Galaxy configuration file' % import_dir_desc
+ # Proceed with (mostly) regular upload processing
+ precreated_datasets = upload_common.get_precreated_datasets( trans, tool_params, trans.app.model.LibraryDatasetDatasetAssociation, controller=controller )
+ if upload_option == 'upload_file':
+ tool_params = upload_common.persist_uploads( tool_params )
+ uploaded_datasets = upload_common.get_uploaded_datasets( trans, tool_params, precreated_datasets, dataset_upload_inputs, library_bunch=library_bunch )
+ elif upload_option == 'upload_directory':
+ uploaded_datasets = self.get_server_dir_uploaded_datasets( trans, params, full_dir, import_dir_desc, library_bunch, err_redirect, msg )
+ upload_common.cleanup_unused_precreated_datasets( precreated_datasets )
+ if upload_option == 'upload_file' and not uploaded_datasets:
+ msg = 'Select a file, enter a URL or enter text'
+ err_redirect = True
+ if err_redirect:
+ trans.response.send_redirect( web.url_for( controller=controller,
+ action='upload_library_dataset',
+ library_id=library_id,
+ folder_id=folder_id,
+ replace_id=replace_id,
+ upload_option=upload_option,
+ msg=util.sanitize_text( msg ),
+ messagetype='error' ) )
+ json_file_path = upload_common.create_paramfile( uploaded_datasets )
+ data_list = [ ud.data for ud in uploaded_datasets ]
+ return upload_common.create_job( trans, tool_params, tool, json_file_path, data_list, folder=library_bunch.folder )
+ def get_server_dir_uploaded_datasets( self, trans, params, full_dir, import_dir_desc, library_bunch, err_redirect, msg ):
+ files = []
+ try:
+ for entry in os.listdir( full_dir ):
+ # Only import regular files
+ if os.path.isfile( os.path.join( full_dir, entry ) ):
+ files.append( entry )
+ except Exception, e:
+ msg = "Unable to get file list for configured %s, error: %s" % ( import_dir_desc, str( e ) )
+ err_redirect = True
+ return None
+ if not files:
+ msg = "The directory '%s' contains no valid files" % full_dir
+ err_redirect = True
+ return None
+ uploaded_datasets = []
+ for file in files:
+ library_bunch.replace_dataset = None
+ uploaded_dataset = util.bunch.Bunch()
+ uploaded_dataset.path = os.path.join( full_dir, file )
+ if not os.path.isfile( uploaded_dataset.path ):
+ continue
+ uploaded_dataset.type = 'server_dir'
+ uploaded_dataset.name = file
+ uploaded_dataset.ext = None
+ uploaded_dataset.file_type = params.file_type
+ uploaded_dataset.dbkey = params.dbkey
+ uploaded_dataset.space_to_tab = params.space_to_tab
+ uploaded_dataset.data = upload_common.new_upload( trans, uploaded_dataset, library_bunch )
+ uploaded_datasets.append( uploaded_dataset )
+ return uploaded_datasets
+ @web.expose
+ def info_template( self, trans, cntrller, library_id, response_action='library', obj_id=None, folder_id=None, ldda_id=None, **kwd ):
+ # Only adding a new templAte to a library or folder is currently allowed. Editing an existing template is
+ # a future enhancement. The response_action param is the name of the method to which this method will redirect
+ # if a new template is being added to a library or folder.
+ params = util.Params( kwd )
+ msg = util.restore_text( params.get( 'msg', '' ) )
+ messagetype = params.get( 'messagetype', 'done' )
+ if obj_id:
+ library_item = trans.app.model.FormDefinition.get( int( obj_id ) )
+ library_item_desc = 'information template'
+ response_id = obj_id
+ elif folder_id:
+ library_item = trans.app.model.LibraryFolder.get( int( folder_id ) )
+ library_item_desc = 'folder'
+ response_id = folder_id
+ elif ldda_id:
+ library_item = trans.app.model.LibraryDatasetDatasetAssociation.get( int( ldda_id ) )
+ library_item_desc = 'library dataset'
+ response_id = ldda_id
+ else:
+ library_item = trans.app.model.Library.get( int( library_id ) )
+ library_item_desc = 'library'
+ response_id = library_id
+ forms = get_all_forms( trans,
+ filter=dict( deleted=False ),
+ form_type=trans.app.model.FormDefinition.types.LIBRARY_INFO_TEMPLATE )
+ if not forms:
+ msg = "There are no forms on which to base the template, so create a form and "
+ msg += "try again to add the information template to the %s." % library_item_desc
+ trans.response.send_redirect( web.url_for( controller='forms',
+ action='new',
+ new=True,
+ msg=msg,
+ messagetype='done' ) )
+ if params.get( 'add_info_template_button', False ):
+ form = trans.app.model.FormDefinition.get( int( kwd[ 'form_id' ] ) )
+ #fields = list( copy.deepcopy( form.fields ) )
+ form_values = trans.app.model.FormValues( form, [] )
+ form_values.flush()
+ if folder_id:
+ assoc = trans.app.model.LibraryFolderInfoAssociation( library_item, form, form_values )
+ elif ldda_id:
+ assoc = trans.app.model.LibraryDatasetDatasetInfoAssociation( library_item, form, form_values )
+ else:
+ assoc = trans.app.model.LibraryInfoAssociation( library_item, form, form_values )
+ assoc.flush()
+ msg = 'An information template based on the form "%s" has been added to this %s.' % ( form.name, library_item_desc )
+ trans.response.send_redirect( web.url_for( controller=cntrller,
+ action=response_action,
+ obj_id=response_id,
+ msg=msg,
+ message_type='done' ) )
+ # TODO: handle this better
+ if cntrller == 'library_admin':
+ tmplt = '/admin/library/select_info_template.mako'
+ else:
+ tmplt = '/ibrary/select_info_template.mako'
+ return trans.fill_template( tmplt,
+ library_item_name=library_item.name,
+ library_item_desc=library_item_desc,
+ library_id=library_id,
+ folder_id=folder_id,
+ ldda_id=ldda_id,
+ forms=forms,
+ msg=msg,
+ messagetype=messagetype )
+ @web.expose
+ def edit_template_info( self, trans, cntrller, library_id, response_action, num_widgets, library_item_id=None, library_item_type=None, **kwd ):
+ params = util.Params( kwd )
+ msg = util.restore_text( params.get( 'msg', '' ) )
+ messagetype = params.get( 'messagetype', 'done' )
+ folder_id = None
+ if library_item_type == 'library':
+ library_item = trans.app.model.Library.get( library_item_id )
+ elif library_item_type == 'library_dataset':
+ library_item = trans.app.model.LibraryDataset.get( library_item_id )
+ elif library_item_type == 'folder':
+ library_item = trans.app.model.LibraryFolder.get( library_item_id )
+ elif library_item_type == 'library_dataset_dataset_association':
+ library_item = trans.app.model.LibraryDatasetDatasetAssociation.get( library_item_id )
+ # This response_action method requires a folder_id
+ folder_id = library_item.library_dataset.folder.id
+ else:
+ msg = "Invalid library item type ( %s ) specified, id ( %s )" % ( str( library_item_type ), str( library_item_id ) )
+ return trans.response.send_redirect( web.url_for( controller=cntrller,
+ action='browse_library',
+ obj_id=library_id,
+ msg=util.sanitize_text( msg ),
+ messagetype='error' ) )
+ # Save updated template field contents
+ field_contents = []
+ for index in range( int( num_widgets ) ):
+ field_contents.append( util.restore_text( params.get( 'field_%i' % ( index ), '' ) ) )
+ if field_contents:
+ # Since information templates are inherited, the template fields can be displayed on the information
+ # page for a folder or library dataset when it has no info_association object. If the user has added
+ # field contents on an inherited template via a parent's info_association, we'll need to create a new
+ # form_values and info_association for the current object. The value for the returned inherited variable
+ # is not applicable at this level.
+ info_association, inherited = library_item.get_info_association( restrict=True )
+ if info_association:
+ template = info_association.template
+ info = info_association.info
+ form_values = trans.app.model.FormValues.get( info.id )
+ # Update existing content only if it has changed
+ if form_values.content != field_contents:
+ form_values.content = field_contents
+ form_values.flush()
+ else:
+ # Inherit the next available info_association so we can get the template
+ info_association, inherited = library_item.get_info_association()
+ template = info_association.template
+ # Create a new FormValues object
+ form_values = trans.app.model.FormValues( template, field_contents )
+ form_values.flush()
+ # Create a new info_association between the current library item and form_values
+ if library_item_type == 'folder':
+ info_association = trans.app.model.LibraryFolderInfoAssociation( library_item, template, form_values )
+ info_association.flush()
+ elif library_item_type == 'library_dataset_dataset_association':
+ info_association = trans.app.model.LibraryDatasetDatasetInfoAssociation( library_item, template, form_values )
+ info_association.flush()
+ msg = 'The information has been updated.'
+ return trans.response.send_redirect( web.url_for( controller=cntrller,
+ action=response_action,
+ library_id=library_id,
+ folder_id=folder_id,
+ obj_id=library_item.id,
+ msg=util.sanitize_text( msg ),
+ messagetype='done' ) )
+
+# ---- Utility methods -------------------------------------------------------
+
+def active_folders( trans, folder ):
+ # Much faster way of retrieving all active sub-folders within a given folder than the
+ # performance of the mapper. This query also eagerloads the permissions on each folder.
+ return trans.sa_session.query( trans.app.model.LibraryFolder ) \
+ .filter_by( parent=folder, deleted=False ) \
+ .options( eagerload_all( "actions" ) ) \
+ .order_by( trans.app.model.LibraryFolder.table.c.name ) \
+ .all()
+def activatable_folders( trans, folder ):
+ return trans.sa_session.query( trans.app.model.LibraryFolder ) \
+ .filter_by( parent=folder, purged=False ) \
+ .options( eagerload_all( "actions" ) ) \
+ .order_by( trans.app.model.LibraryFolder.table.c.name ) \
+ .all()
+def active_folders_and_lddas( trans, folder ):
+ folders = active_folders( trans, folder )
+ # This query is much faster than the folder.active_library_datasets property
+ lddas = trans.sa_session.query( trans.app.model.LibraryDatasetDatasetAssociation ) \
+ .filter_by( deleted=False ) \
+ .join( "library_dataset" ) \
+ .filter( trans.app.model.LibraryDataset.table.c.folder_id==folder.id ) \
+ .order_by( trans.app.model.LibraryDatasetDatasetAssociation.table.c.name ) \
+ .all()
+ return folders, lddas
+def activatable_folders_and_lddas( trans, folder ):
+ folders = activatable_folders( trans, folder )
+ # This query is much faster than the folder.activatable_library_datasets property
+ lddas = trans.sa_session.query( trans.app.model.LibraryDatasetDatasetAssociation ) \
+ .join( "library_dataset" ) \
+ .filter( trans.app.model.LibraryDataset.table.c.folder_id==folder.id ) \
+ .join( "dataset" ) \
+ .filter( trans.app.model.Dataset.table.c.deleted==False ) \
+ .order_by( trans.app.model.LibraryDatasetDatasetAssociation.table.c.name ) \
+ .all()
+ return folders, lddas
diff -r 6a066b05c94f -r 22addc979108 lib/galaxy/web/controllers/library_dataset.py
--- a/lib/galaxy/web/controllers/library_dataset.py Tue Sep 29 21:51:51 2009 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,129 +0,0 @@
-import os, os.path, shutil, urllib, StringIO, re, gzip, tempfile, shutil, zipfile
-from galaxy.web.base.controller import *
-from galaxy import util, jobs
-from galaxy.datatypes import sniff
-from galaxy.security import RBACAgent
-from galaxy.util.json import to_json_string
-from galaxy.tools.actions import upload_common
-
-log = logging.getLogger( __name__ )
-
-class UploadLibraryDataset( BaseController ):
- @web.json
- def library_item_updates( self, trans, ids=None, states=None ):
- # Avoid caching
- trans.response.headers['Pragma'] = 'no-cache'
- trans.response.headers['Expires'] = '0'
- # Create new HTML for any that have changed
- rval = {}
- if ids is not None and states is not None:
- ids = map( int, ids.split( "," ) )
- states = states.split( "," )
- for id, state in zip( ids, states ):
- data = self.app.model.LibraryDatasetDatasetAssociation.get( id )
- if data.state != state:
- job_ldda = data
- while job_ldda.copied_from_library_dataset_dataset_association:
- job_ldda = job_ldda.copied_from_library_dataset_dataset_association
- force_history_refresh = False
- rval[id] = {
- "state": data.state,
- "html": unicode( trans.fill_template( "library/library_item_info.mako", ldda=data ), 'utf-8' )
- #"force_history_refresh": force_history_refresh
- }
- return rval
- def upload_dataset( self, trans, controller, library_id, folder_id, replace_dataset=None, **kwd ):
- # Set up the traditional tool state/params
- tool_id = 'upload1'
- tool = trans.app.toolbox.tools_by_id[ tool_id ]
- state = tool.new_state( trans )
- errors = tool.update_state( trans, tool.inputs_by_page[0], state.inputs, kwd, changed_dependencies={} )
- tool_params = state.inputs
- dataset_upload_inputs = []
- for input_name, input in tool.inputs.iteritems():
- if input.type == "upload_dataset":
- dataset_upload_inputs.append( input )
- # Library-specific params
- params = util.Params( kwd ) # is this filetoolparam safe?
- library_bunch = upload_common.handle_library_params( trans, params, folder_id, replace_dataset )
- msg = util.restore_text( params.get( 'msg', '' ) )
- messagetype = params.get( 'messagetype', 'done' )
- server_dir = util.restore_text( params.get( 'server_dir', '' ) )
- if replace_dataset not in [ None, 'None' ]:
- replace_id = replace_dataset.id
- else:
- replace_id = None
- upload_option = params.get( 'upload_option', 'upload_file' )
- err_redirect = False
- if upload_option == 'upload_directory':
- if server_dir in [ None, 'None', '' ]:
- err_redirect = True
- if controller == 'library_admin':
- import_dir = trans.app.config.library_import_dir
- import_dir_desc = 'library_import_dir'
- full_dir = os.path.join( import_dir, server_dir )
- else:
- import_dir = trans.app.config.user_library_import_dir
- import_dir_desc = 'user_library_import_dir'
- if server_dir == trans.user.email:
- full_dir = os.path.join( import_dir, server_dir )
- else:
- full_dir = os.path.join( import_dir, trans.user.email, server_dir )
- if import_dir:
- msg = 'Select a directory'
- else:
- msg = '"%s" is not defined in the Galaxy configuration file' % import_dir_desc
- # Proceed with (mostly) regular upload processing
- precreated_datasets = upload_common.get_precreated_datasets( trans, tool_params, trans.app.model.LibraryDatasetDatasetAssociation, controller=controller )
- if upload_option == 'upload_file':
- tool_params = upload_common.persist_uploads( tool_params )
- uploaded_datasets = upload_common.get_uploaded_datasets( trans, tool_params, precreated_datasets, dataset_upload_inputs, library_bunch=library_bunch )
- elif upload_option == 'upload_directory':
- uploaded_datasets = self.get_server_dir_uploaded_datasets( trans, params, full_dir, import_dir_desc, library_bunch, err_redirect, msg )
- upload_common.cleanup_unused_precreated_datasets( precreated_datasets )
- if upload_option == 'upload_file' and not uploaded_datasets:
- msg = 'Select a file, enter a URL or enter text'
- err_redirect = True
- if err_redirect:
- trans.response.send_redirect( web.url_for( controller=controller,
- action='library_dataset_dataset_association',
- library_id=library_id,
- folder_id=folder_id,
- replace_id=replace_id,
- upload_option=upload_option,
- msg=util.sanitize_text( msg ),
- messagetype='error' ) )
- json_file_path = upload_common.create_paramfile( uploaded_datasets )
- data_list = [ ud.data for ud in uploaded_datasets ]
- return upload_common.create_job( trans, tool_params, tool, json_file_path, data_list, folder=library_bunch.folder )
- def get_server_dir_uploaded_datasets( self, trans, params, full_dir, import_dir_desc, library_bunch, err_redirect, msg ):
- files = []
- try:
- for entry in os.listdir( full_dir ):
- # Only import regular files
- if os.path.isfile( os.path.join( full_dir, entry ) ):
- files.append( entry )
- except Exception, e:
- msg = "Unable to get file list for configured %s, error: %s" % ( import_dir_desc, str( e ) )
- err_redirect = True
1
0
02 Oct '09
details: http://www.bx.psu.edu/hg/galaxy/rev/e7b9d15e8e93
changeset: 2797:e7b9d15e8e93
user: jeremy goecks <jeremy.goecks at emory.edu>
date: Tue Sep 29 17:57:45 2009 -0400
description:
Added grid to view/filter datasets. To view datasets grid: User (tab)-->My Data-->Datasets
7 file(s) affected in this change:
lib/galaxy/web/controllers/dataset.py
lib/galaxy/web/controllers/root.py
lib/galaxy/web/framework/helpers/grids.py
templates/base_panels.mako
templates/dataset/grid.mako
templates/history/grid.mako
templates/my_data.mako
diffs (590 lines):
diff -r b819249af24d -r e7b9d15e8e93 lib/galaxy/web/controllers/dataset.py
--- a/lib/galaxy/web/controllers/dataset.py Tue Sep 29 17:14:20 2009 -0400
+++ b/lib/galaxy/web/controllers/dataset.py Tue Sep 29 17:57:45 2009 -0400
@@ -1,6 +1,8 @@
import logging, os, string, shutil, re, socket, mimetypes, smtplib, urllib
from galaxy.web.base.controller import *
+from galaxy.tags.tag_handler import TagHandler
+from galaxy.web.framework.helpers import time_ago, iff, grids
from galaxy import util, datatypes, jobs, web, model
from cgi import escape, FieldStorage
@@ -42,7 +44,97 @@
(This is an automated message).
"""
+class HistoryDatasetAssociationListGrid( grids.Grid ):
+ class StatusColumn( grids.GridColumn ):
+ def get_value( self, trans, grid, hda ):
+ if hda.deleted:
+ return "deleted"
+ return ""
+ def get_link( self, trans, grid, hda ):
+ return None
+ class TagsColumn( grids.GridColumn ):
+ def __init__(self, col_name, key, filterable):
+ grids.GridColumn.__init__(self, col_name, key=key, filterable=filterable)
+ # Tags cannot be sorted.
+ self.sortable = False
+ self.tag_elt_id_gen = 0
+ def get_value( self, trans, grid, hda ):
+ self.tag_elt_id_gen += 1
+ elt_id="tagging-elt" + str( self.tag_elt_id_gen )
+ div_elt = "<div id=%s></div>" % elt_id
+ return div_elt + trans.fill_template( "/tagging_common.mako", trans=trans, tagged_item=hda,
+ elt_id = elt_id, in_form="true", input_size="20", tag_click_fn="add_tag_to_grid_filter" )
+ def filter( self, db_session, query, column_filter ):
+ """ Modify query to include only hdas with tags in column_filter. """
+ if column_filter == "All":
+ pass
+ elif column_filter:
+ # Parse filter to extract multiple tags.
+ tag_handler = TagHandler()
+ raw_tags = tag_handler.parse_tags( column_filter.encode("utf-8") )
+ for name, value in raw_tags.items():
+ tag = tag_handler.get_tag_by_name( db_session, name )
+ if tag:
+ query = query.filter( model.HistoryDatasetAssociation.tags.any( tag_id=tag.id ) )
+ if value:
+ query = query.filter( model.HistoryDatasetAssociation.tags.any( value=value.lower() ) )
+ else:
+ # Tag doesn't exist; unclear what to do here, but the literal thing to do is add the criterion, which
+ # will then yield a query that returns no results.
+ query = query.filter( model.HistoryDatasetAssociation.tags.any( user_tname=name ) )
+ return query
+ def get_accepted_filters( self ):
+ """ Returns a list of accepted filters for this column. """
+ accepted_filter_labels_and_vals = { "All": "All" }
+ accepted_filters = []
+ for label, val in accepted_filter_labels_and_vals.items():
+ args = { self.key: val }
+ accepted_filters.append( grids.GridColumnFilter( label, args) )
+ return accepted_filters
+
+ class StatusColumn( grids.GridColumn ):
+ def get_value( self, trans, grid, hda ):
+ if hda.deleted:
+ return "deleted"
+ return ""
+ def get_accepted_filters( self ):
+ """ Returns a list of accepted filters for this column. """
+ accepted_filter_labels_and_vals = { "Active" : "False", "Deleted" : "True", "All": "All" }
+ accepted_filters = []
+ for label, val in accepted_filter_labels_and_vals.items():
+ args = { self.key: val }
+ accepted_filters.append( grids.GridColumnFilter( label, args) )
+ return accepted_filters
+
+ # Grid definition
+ title = "Stored datasets"
+ model_class = model.HistoryDatasetAssociation
+ template='/dataset/grid.mako'
+ default_sort_key = "-create_time"
+ columns = [
+ grids.GridColumn( "Name", key="name",
+ # Link name to dataset's history.
+ link=( lambda item: iff( item.history.deleted, None, dict( operation="switch", id=item.id ) ) ) ),
+ TagsColumn( "Tags", key="tags", filterable=True ),
+ StatusColumn( "Status", key="deleted", attach_popup=False ),
+ grids.GridColumn( "Created", key="create_time", format=time_ago ),
+ grids.GridColumn( "Last Updated", key="update_time", format=time_ago ),
+ ]
+ operations = []
+ standard_filters = []
+ default_filter = dict( deleted="False", tags="All" )
+ preserve_state = False
+ use_paging = True
+ num_rows_per_page = 10
+ def apply_default_filter( self, trans, query, **kwargs ):
+ # This is a somewhat obtuse way to join the History and HDA tables. However, it's necessary
+ # because the initial query in build_initial_query is specificied on the HDA table (this is reasonable)
+ # and there's no simple property in the HDA to do the join.
+ return query.select_from( model.HistoryDatasetAssociation.table.join( model.History.table ) ).filter( model.History.user == trans.user )
+
class DatasetInterface( BaseController ):
+
+ stored_list_grid = HistoryDatasetAssociationListGrid()
@web.expose
def errors( self, trans, id ):
@@ -136,7 +228,50 @@
raise paste.httpexceptions.HTTPNotFound( "File Not Found (%s)." % ( filename ) )
else:
return trans.show_error_message( "You are not allowed to access this dataset" )
-
+
+ @web.expose
+ @web.require_login( "see all available datasets" )
+ def list( self, trans, **kwargs ):
+ """List all available datasets"""
+ status = message = None
+
+ if 'operation' in kwargs:
+ operation = kwargs['operation'].lower()
+ hda_ids = util.listify( kwargs.get( 'id', [] ) )
+
+ # Display no message by default
+ status, message = None, None
+
+ # Load the hdas and ensure they all belong to the current user
+ hdas = []
+ for encoded_hda_id in hda_ids:
+ hda_id = trans.security.decode_id( encoded_hda_id )
+ hda = trans.sa_session.query( model.HistoryDatasetAssociation ).filter_by( id=hda_id ).first()
+ if hda:
+ # Ensure history is owned by current user
+ if hda.history.user_id != None and trans.user:
+ assert trans.user.id == hda.history.user_id, "HistoryDatasetAssocation does not belong to current user"
+ hdas.append( hda )
+ else:
+ log.warn( "Invalid history_dataset_association id '%r' passed to list", hda_id )
+
+ if hdas:
+
+ if operation == "switch":
+ # Convert hda to histories.
+ histories = []
+ for hda in hdas:
+ histories.append( hda.history )
+
+ # Use history controller to switch the history. TODO: is this reasonable?
+ status, message = trans.webapp.controllers['history']._list_switch( trans, histories )
+
+ # Current history changed, refresh history frame
+ trans.template_context['refresh_frames'] = ['history']
+
+ # Render the list view
+ return self.stored_list_grid( trans, status=status, message=message, **kwargs )
+
@web.expose
def display_at( self, trans, dataset_id, filename=None, **kwd ):
"""Sets up a dataset permissions so it is viewable at an external site"""
@@ -222,7 +357,7 @@
new_history = trans.app.model.History()
if new_history_name:
new_history.name = new_history_name
- new_history.user = user
+ new_history_name = user
new_history.flush()
target_history_ids.append( new_history.id )
if user:
diff -r b819249af24d -r e7b9d15e8e93 lib/galaxy/web/controllers/root.py
--- a/lib/galaxy/web/controllers/root.py Tue Sep 29 17:14:20 2009 -0400
+++ b/lib/galaxy/web/controllers/root.py Tue Sep 29 17:57:45 2009 -0400
@@ -46,6 +46,13 @@
yield "</body></html>"
## ---- Root history display ---------------------------------------------
+
+ @web.expose
+ def my_data( self, trans ):
+ """
+ Display user's data.
+ """
+ return trans.fill_template_mako( "/my_data.mako" )
@web.expose
def history( self, trans, as_xml=False, show_deleted=False ):
diff -r b819249af24d -r e7b9d15e8e93 lib/galaxy/web/framework/helpers/grids.py
--- a/lib/galaxy/web/framework/helpers/grids.py Tue Sep 29 17:14:20 2009 -0400
+++ b/lib/galaxy/web/framework/helpers/grids.py Tue Sep 29 17:57:45 2009 -0400
@@ -70,18 +70,19 @@
use_default_filter_str = kwargs.get( 'use_default_filter' )
use_default_filter = False
if use_default_filter_str:
- use_default_filter = use_default_filter_str.lower() == 'true'
+ use_default_filter = ( use_default_filter_str.lower() == 'true' )
# Process filtering arguments to (a) build a query that represents the filter and (b) builds a
# dictionary that denotes the current filter.
cur_filter_dict = {}
for column in self.columns:
if column.key:
- # Get the filter criterion for the column. Precedence is (a) if using default filter, look there; (b) look in kwargs; and (c) look in
- # base filter.
+ # Get the filter criterion for the column. Precedence is (a) if using default filter, only look there; otherwise,
+ # (b) look in kwargs; and (c) look in base filter.
column_filter = None
- if use_default_filter and self.default_filter:
- column_filter = self.default_filter.get( column.key )
+ if use_default_filter:
+ if self.default_filter:
+ column_filter = self.default_filter.get( column.key )
elif "f-" + column.key in kwargs:
column_filter = kwargs.get( "f-" + column.key )
elif column.key in base_filter:
@@ -130,7 +131,6 @@
# be computed.
total_num_rows = query.count()
query = query.limit( self.num_rows_per_page ).offset( ( page_num-1 ) * self.num_rows_per_page )
-
num_pages = int ( math.ceil( float( total_num_rows ) / self.num_rows_per_page ) )
else:
# Defaults.
diff -r b819249af24d -r e7b9d15e8e93 templates/base_panels.mako
--- a/templates/base_panels.mako Tue Sep 29 17:14:20 2009 -0400
+++ b/templates/base_panels.mako Tue Sep 29 17:57:45 2009 -0400
@@ -217,6 +217,7 @@
</ul>
<ul class="loggedin-only" style="${style2}">
<li>Logged in as <span id="user-email">${user_email}</span></li>
+ <li><a target="galaxy_main" href="${h.url_for( controller='root', action='my_data' )}">My Data</a></li>
%if app.config.use_remote_user:
%if app.config.remote_user_logout_href:
<li><a href="${app.config.remote_user_logout_href}" target="_top">Logout</a></li>
diff -r b819249af24d -r e7b9d15e8e93 templates/dataset/grid.mako
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/dataset/grid.mako Tue Sep 29 17:57:45 2009 -0400
@@ -0,0 +1,322 @@
+<%! from galaxy.web.framework.helpers.grids import GridColumnFilter %>
+
+<%inherit file="/base.mako"/>
+<%def name="title()">${grid.title}</%def>
+
+%if message:
+ <p>
+ <div class="${message_type}message transient-message">${message}</div>
+ <div style="clear: both"></div>
+ </p>
+%endif
+
+<%def name="javascripts()">
+ ${parent.javascripts()}
+ ${h.js("jquery.autocomplete", "autocomplete_tagging" )}
+ <script type="text/javascript">
+ ## TODO: generalize and move into galaxy.base.js
+ $(document).ready(function() {
+ $(".grid").each( function() {
+ var grid = this;
+ var checkboxes = $(this).find("input.grid-row-select-checkbox");
+ var update = $(this).find( "span.grid-selected-count" );
+ $(checkboxes).each( function() {
+ $(this).change( function() {
+ var n = $(checkboxes).filter("[checked]").size();
+ update.text( n );
+ });
+ })
+ });
+
+ // Set up autocomplete for tag filter input.
+ var t = $("#input-tag-filter");
+ t.keyup( function( e )
+ {
+ if ( e.keyCode == 27 )
+ {
+ // Escape key
+ $(this).trigger( "blur" );
+ } else if (
+ ( e.keyCode == 13 ) || // Return Key
+ ( e.keyCode == 188 ) || // Comma
+ ( e.keyCode == 32 ) // Space
+ )
+ {
+ //
+ // Check input.
+ //
+
+ new_value = this.value;
+
+ // Do nothing if return key was used to autocomplete.
+ if (return_key_pressed_for_autocomplete == true)
+ {
+ return_key_pressed_for_autocomplete = false;
+ return false;
+ }
+
+ // Suppress space after a ":"
+ if ( new_value.indexOf(": ", new_value.length - 2) != -1)
+ {
+ this.value = new_value.substring(0, new_value.length-1);
+ return false;
+ }
+
+ // Remove trigger keys from input.
+ if ( (e.keyCode == 188) || (e.keyCode == 32) )
+ new_value = new_value.substring( 0 , new_value.length - 1 );
+
+ // Trim whitespace.
+ new_value = new_value.replace(/^\s+|\s+$/g,"");
+
+ // Too short?
+ if (new_value.length < 3)
+ return false;
+
+ //
+ // New tag OK.
+ //
+ }
+ });
+
+ // Add autocomplete to input.
+ var format_item_func = function(key, row_position, num_rows, value, search_term)
+ {
+ tag_name_and_value = value.split(":");
+ return (tag_name_and_value.length == 1 ? tag_name_and_value[0] :tag_name_and_value[1]);
+ //var array = new Array(key, value, row_position, num_rows,
+ //search_term ); return "\"" + array.join("*") + "\"";
+ }
+ var autocomplete_options =
+ { selectFirst: false, formatItem : format_item_func, autoFill: false, highlight: false, mustMatch: true };
+
+ t.autocomplete("${h.url_for( controller='tag', action='tag_autocomplete_data', item_class='HistoryDatasetAssociation' )}", autocomplete_options);
+
+ //t.addClass("tag-input");
+
+ return t;
+ });
+ ## Can this be moved into base.mako?
+ %if refresh_frames:
+ %if 'masthead' in refresh_frames:
+ ## Refresh masthead == user changes (backward compatibility)
+ if ( parent.user_changed ) {
+ %if trans.user:
+ parent.user_changed( "${trans.user.email}", ${int( app.config.is_admin_user( trans.user ) )} );
+ %else:
+ parent.user_changed( null, false );
+ %endif
+ }
+ %endif
+ %if 'history' in refresh_frames:
+ if ( parent.frames && parent.frames.galaxy_history ) {
+ parent.frames.galaxy_history.location.href="${h.url_for( controller='root', action='history')}";
+ if ( parent.force_right_panel ) {
+ parent.force_right_panel( 'show' );
+ }
+ }
+ %endif
+ %if 'tools' in refresh_frames:
+ if ( parent.frames && parent.frames.galaxy_tools ) {
+ parent.frames.galaxy_tools.location.href="${h.url_for( controller='root', action='tool_menu')}";
+ if ( parent.force_left_panel ) {
+ parent.force_left_panel( 'show' );
+ }
+ }
+ %endif
+ %endif
+
+ //
+ // Add a tag to the current grid filter; this adds the tag to the filter and then issues a request to refresh the grid.
+ //
+ function add_tag_to_grid_filter(tag_name, tag_value)
+ {
+ // Use tag as a filter: replace TAGNAME with tag_name and issue query.
+ <%
+ url_args = {}
+ if "tags" in cur_filter_dict and cur_filter_dict["tags"] != "All":
+ url_args["f-tags"] = cur_filter_dict["tags"].encode("utf-8") + ", TAGNAME"
+ else:
+ url_args["f-tags"] = "TAGNAME"
+ %>
+ var url_base = "${url( url_args )}";
+ var url = url_base.replace("TAGNAME", tag_name);
+ self.location = url;
+ }
+
+ </script>
+</%def>
+
+<%def name="stylesheets()">
+ ${h.css( "base", "autocomplete_tagging" )}
+ <style>
+ ## Not generic to all grids -- move to base?
+ .count-box {
+ min-width: 1.1em;
+ padding: 5px;
+ border-width: 1px;
+ border-style: solid;
+ text-align: center;
+ display: inline-block;
+ }
+ </style>
+</%def>
+
+<div class="grid-header">
+ <h2>${grid.title}</h2>
+
+ ## Print grid filter.
+ <form name="dataset_actions" action="javascript:add_tag_to_grid_filter($('#input-tag-filter').attr('value'))" method="get" >
+ <strong>Filter: </strong>
+ %for column in grid.columns:
+ %if column.filterable:
+ <span> by ${column.label.lower()}:</span>
+ ## For now, include special case to handle tags.
+ %if column.key == "tags":
+ %if cur_filter_dict[column.key] != "All":
+ <span class="filter" "style='font-style: italic'">
+ ${cur_filter_dict[column.key]}
+ </span>
+ <span>|</span>
+ %endif
+ <input id="input-tag-filter" name="f-tags" type="text" value="" size="15"/>
+ <span>|</span>
+ %endif
+
+ ## Handle other columns.
+ %for i, filter in enumerate( column.get_accepted_filters() ):
+ %if i > 0:
+ <span>|</span>
+ %endif
+ %if cur_filter_dict[column.key] == filter.args[column.key]:
+ <span class="filter" "style='font-style: italic'">${filter.label}</span>
+ %else:
+ <span class="filter"><a href="${url( filter.get_url_args() )}">${filter.label}</a></span>
+ %endif
+ %endfor
+ <span> </span>
+ %endif
+ %endfor
+ </form>
+</div>
+<form name="dataset_actions" action="${url()}" method="post" >
+ <table class="grid">
+ <thead>
+ <tr>
+ %for column in grid.columns:
+ %if column.visible:
+ <%
+ href = ""
+ extra = ""
+ if column.sortable:
+ if sort_key == column.key:
+ if sort_order == "asc":
+ href = url( sort=( "-" + column.key ) )
+ extra = "↓"
+ else:
+ href = url( sort=( column.key ) )
+ extra = "↑"
+ else:
+ href = url( sort=column.key )
+ %>
+ <th\
+ %if column.ncells > 1:
+ colspan="${column.ncells}"
+ %endif
+ >
+ %if href:
+ <a href="${href}">${column.label}</a>
+ %else:
+ ${column.label}
+ %endif
+ <span>${extra}</span>
+ </th>
+ %endif
+ %endfor
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+ %for i, item in enumerate( query ):
+ <tr \
+ %if current_item == item:
+ class="current" \
+ %endif
+ >
+ ## Data columns
+ %for column in grid.columns:
+ %if column.visible:
+ <%
+ # Link
+ link = column.get_link( trans, grid, item )
+ if link:
+ href = url( **link )
+ else:
+ href = None
+ # Value (coerced to list so we can loop)
+ value = column.get_value( trans, grid, item )
+ if column.ncells == 1:
+ value = [ value ]
+ %>
+ %for cellnum, v in enumerate( value ):
+ <%
+ # Attach popup menu?
+ if column.attach_popup and cellnum == 0:
+ extra = '<a id="grid-%d-popup" class="arrow" style="display: none;"><span>▼</span></a>' % i
+ else:
+ extra = ""
+ %>
+ %if href:
+ <td><div class="menubutton split" style="float: left;"><a class="label" href="${href}">${v}${extra}</a> </td>
+ %else:
+ <td >${v}${extra}</td>
+ %endif
+ %endfor
+ %endif
+ %endfor
+ ## Actions column
+ <td>
+ <div popupmenu="grid-${i}-popup">
+ %for operation in grid.operations:
+ %if operation.allowed( item ):
+ <a class="action-button" href="${url( operation=operation.label, id=item.id )}">${operation.label}</a>
+ %endif
+ %endfor
+ </div>
+ </td>
+ </tr>
+ %endfor
+ </tbody>
+ <tfoot>
+ %if num_pages > 1:
+ <tr>
+ <td></td>
+ <td colspan="100" style="text-align: right">
+ Page:
+ %for page_index in range(1, num_pages + 1):
+ %if page_index == cur_page_num:
+ <span style="font-style: italic">${page_index}</span>
+ %else:
+ <% args = { "page" : page_index } %>
+ <span><a href="${url( args )}">${page_index}</a></span>
+ %endif
+ %endfor
+ </td>
+ </tr>
+ %endif
+ %if grid.operations:
+ <tr>
+ <td></td>
+ <td colspan="100">
+ For <span class="grid-selected-count"></span> selected histories:
+ %for operation in grid.operations:
+ %if operation.allow_multiple:
+ <input type="submit" name="operation" value="${operation.label}" class="action-button">
+ %endif
+ %endfor
+ </td>
+ </tr>
+ %endif
+ </tfoot>
+ </table>
+</form>
diff -r b819249af24d -r e7b9d15e8e93 templates/history/grid.mako
--- a/templates/history/grid.mako Tue Sep 29 17:14:20 2009 -0400
+++ b/templates/history/grid.mako Tue Sep 29 17:57:45 2009 -0400
@@ -303,7 +303,7 @@
%if num_pages > 1:
<tr>
<td></td>
- <td colspan="100" style="font-size: 90%; text-align: right">
+ <td colspan="100" style="text-align: right">
Page:
%for page_index in range(1, num_pages + 1):
%if page_index == cur_page_num:
diff -r b819249af24d -r e7b9d15e8e93 templates/my_data.mako
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/my_data.mako Tue Sep 29 17:57:45 2009 -0400
@@ -0,0 +1,13 @@
+<%inherit file="/base.mako"/>
+
+<%def name="stylesheets()">
+ ${h.css( "base" )}
+</%def>
+
+<h2>Available Galaxy Data</h2>
+
+<ul>
+ <li><a href='${h.url_for( controller='history', action='list' )}'>Histories</li>
+ <li><a href='${h.url_for( controller='dataset', action='list' )}'>Datasets</li>
+</ul>
+
1
0
details: http://www.bx.psu.edu/hg/galaxy/rev/ff37fcf14bd5
changeset: 2798:ff37fcf14bd5
user: Dan Blankenberg <dan(a)bx.psu.edu>
date: Tue Sep 29 21:47:59 2009 -0400
description:
Fix limiting species in interval2maf tool.
3 file(s) affected in this change:
test-data/interval2maf_3from28way.maf
tools/maf/interval2maf.py
tools/maf/interval2maf.xml
diffs (1344 lines):
diff -r e7b9d15e8e93 -r ff37fcf14bd5 test-data/interval2maf_3from28way.maf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/interval2maf_3from28way.maf Tue Sep 29 21:47:59 2009 -0400
@@ -0,0 +1,1301 @@
+##maf version=1
+a score=378218.0
+s hg18.chr1 99287304 223 - 247249719 TCCTCTATGCAAGAGTACACTAGCTATTCTGTGGACAGGAGCCAGACAATGTGAGCTGTACATAAGAATTATTTTTGCAGTGTCAAAAGCCATTCTAGGTGGAATCCAAATCACCACTTGCCTTAGACAGACACCCCCTCAGCTTCACTGCAGGTCCAGAGTCAGCCGAGGCCAGAGAGAGAACCACCAGGAGTGGAAGCAACACTCTCTAGGTTCTCTGCAC
+s panTro2.chr1 101234886 223 - 229974691 TCCTCTATGCAAGAGTACACTAGCTATTCTATGGACAGGAGCCAGACAATGTGAGCTGTACATAAGAATTATTTTTGCAGTGTCAAAAGCCATTCTAGGTGGAATCCAAATCACCACTTGCCTTAGACAGACACCCCCTCAGCTTCACTGCAGGTCCAGAGTCAGCCGAGGCCACAGAGAGAACCACCAGGAGTGGAAGCAACACTCTCTAGGTTCTCTGCAC
+
+a score=10640.0
+s hg18.chr1 99287270 34 - 247249719 GCTGTAAGATGCCATGTATTTTGTGATTCTACAA
+s panTro2.chr1 101234852 34 - 229974691 GCTGTAAGATGCCATGTATTTTGTGATTCTACAA
+
+a score=43023.0
+s hg18.chr1 99287229 41 - 247249719 AGGGCCCAGAGGATCTGGCCATGTTCTCATGGCATCATTGA
+s panTro2.chr1 101234811 41 - 229974691 AGGGCCCAGAGGATCTGGCCATGTTCTCATGGCATCATTGA
+
+a score=120618.0
+s hg18.chr1 99287139 90 - 247249719 TCCTTGAAAGGGAAAGACTCTAAAACTTTTCTCTGAATTATGGCCCTGCCACCCCAGCTGGGTTTTTCTCTCAAAGGGAGACAGTAATGA
+s panTro2.chr1 101234721 90 - 229974691 TCCTTGAAAGGGAAAGACTCTAAAACTTTTCTCTGAATTACGGCCCTGCCACCCCAGCTGGGTTTTTCTCTCAAAGGGAGACAGTAATGA
+
+a score=39239.0
+s hg18.chr1 147984545 50 + 247249719 AGAAAAACTTTAGTGGAAACAACCAGTACTTAAAGACCATTTTATGAGGC
+s panTro2.chr1 128764240 50 + 229974691 AGAAAAACTTTAGTGGAAACAACCAGTACTTAAAGACCATTTTATGAGGC
+i panTro2.chr1 C 0 C 0
+
+a score=93901.0
+s hg18.chr1 147984595 35 + 247249719 TGTCATTTACGTATTATCTCTTTTGCTGTTTTTGT
+s panTro2.chr1 128764290 35 + 229974691 TGTCATTTACATATTATCTCTTTTGCTGTTTTTGT
+i panTro2.chr1 C 0 C 0
+
+a score=-5867.0
+s hg18.chr1 99171300 19 - 247249719 CGTGGGGAGAACTGCGCTG
+s panTro2.chr1 101114588 19 - 229974691 CGGGGGGAGAACTGCGCTG
+
+a score=-4312.0
+s hg18.chr1 99171258 42 - 247249719 GGGAAATGACCACCTCGGCCTCGCCGGGGTTCTGCGGACAAA
+s panTro2.chr1 101114546 42 - 229974691 GGGAAATGACCACCTCGGCCTCGCCGGGGTTCTGCGGGCAAA
+
+a score=-5717.0
+s hg18.chr1 99171247 11 - 247249719 CCGGCTAGGGA
+s panTro2.chr1 101114535 11 - 229974691 CCGGCTAGGGA
+
+a score=-26975.0
+s hg18.chr1 99171193 54 - 247249719 GAGCGCCACACGCCCGTGCTTCGCGCCCAAACCGGCCTCACCCGGCGCGGCCAT
+s panTro2.chr1 101114481 54 - 229974691 GAGCGCCACACGCCCGTGCTTCGCGCCCAAACCGGCCTCACCCGGCGCGGCCAT
+
+a score=-60785.0
+s hg18.chr1 99171137 56 - 247249719 ACTAGGGGGACGCTCAGGGCTCGCGGTCCTGAGCGCGGCTGGCCTTTGCGGAAGTG
+s panTro2.chr1 101114425 56 - 229974691 ACTAGGGGGACGCTCAGGGCTCGCGGTCCTGAGCGCGGCTGGCCTTTGCGGAAGTG
+
+a score=151634.0
+s hg18.chr1 148185136 140 + 247249719 acgtctgtaatcccagctactcgtgaggctgatgcaggagaatcacttgaacctgggaagtggaggttgctgtgagccaagattgtgccactgcatttcagcctggctgacagagcaagacttcctctgaaaaaaaaaaa
+s panTro2.chr1 128947445 139 + 229974691 acgtctgtaatcccagctactcgtgaggctaatgcaggagaatcacttgaacctgggaagtggaggttgctgtgagccaagattgtgccactgcatttcagcctgggtgacagagcaagacttcctctg-gaaaaaaaaa
+i panTro2.chr1 C 0 C 0
+
+a score=518150.0
+s hg18.chr10 80123058 56 - 135374737 ACAATATTGTCGAGGGAACTGAAAAACAATCTCACAGTCAATCTACTTCACTGTAA
+s mm8.chr10 74075614 56 + 129959148 TTAGAGTTGTTGAGGGAATTGACGTGCAACCTCACAGTCAATCAACATCTTTGTAA
+s panTro2.chr10 82310642 56 - 135001995 ACAATATTGTCGAGGGAACTGAAAAACAATCTCACAGTCAATCTACTTCACTGTAA
+
+a score=200210.0
+s hg18.chr10 80122998 60 - 135374737 TGTGCCCTTCAGAAGTAACAAATATGGAAATCACATCTGAACAAAACAAGGGGAGTTTGA
+s panTro2.chr10 82310582 60 - 135001995 TGTGCCCTTCGGAAGTAACAAATATGGAAATCACATTTGAACAAAACAAGGAGAATTTGA
+s mm8.chr10 74075554 60 + 129959148 TTTGCCCTGCAGAGAAAACAGGCATGAAAATCACACATGACCAGAGCCAGGAAACGTTGG
+
+a score=136193.0
+s hg18.chr10 80122957 41 - 135374737 AAAAAACTATCTACGCACAAATGTTTCAGAACTTCAAACTA
+s panTro2.chr10 82310541 41 - 135001995 AAAAAACTATCTACGCACAAATGTTTCAGAACTTCAAACTA
+s mm8.chr10 74075513 41 + 129959148 AAAAAACTGCCCACCTGCAGATCCCTCAAAACTACACACGT
+
+a score=1023171.0
+s hg18.chr10 80122882 75 - 135374737 AAAAGGCATCCTCAGACACGTTAAAAACTTAGCAGAACTTGAAAAATCAGTAGCTAACATGTACAGTCAAATAGA
+s panTro2.chr10 82310466 75 - 135001995 AAAAGGCATCCTCAGACATGTTAAAAACTTAGCAGAACTTGAAAAATCAGTAGCTAACATGTACAGTCAAATAGA
+s mm8.chr10 74075438 75 + 129959148 AAAAGGGATCCTCAGACATGTGAAAAACTTGGCAGAGCTCGAGAAATCAGTGTCTAACATGTACAGTCACATAGA
+
+a score=-29743.0
+s hg18.chr10 80122851 31 - 135374737 CAGTGTGTAAAACAGACCCTCAGAGAGAACC
+s panTro2.chr10 82310435 31 - 135001995 CAGTGTGTAAAACAGACCCTCAGAGAGAACC
+s mm8.chr10 74075407 31 + 129959148 CGCAGTGGGGGGCAGAACCCCACAGACATCC
+
+a score=121521.0
+s hg18.chr10 80122808 43 - 135374737 GCCGAGAAAATTAAGTCCTCTATGACACAGCTATCAACAACGA
+s panTro2.chr10 82310392 43 - 135001995 GCCGAGAAAATTAAGTCCTCTATGACACAGCTATCAACAACGA
+s mm8.chr10 74075364 40 + 129959148 GCCAGAGAAACCA---CGTCTACGACACAGCCACCAGCATCCA
+
+a score=101339.0
+s hg18.chr10 80122748 60 - 135374737 TTTCTGTCCACAGAGTGTGTCTGTATAACAGGTGTTAAATGCACGACCAACTTGATGCCT
+s panTro2.chr10 82310332 60 - 135001995 TTTCTGTCCACAGAGTGTGTCTGTATAACAGGTGTTGAATGCACGACCAACATGATGCCT
+s mm8.chr10 74075304 60 + 129959148 ATTCCATCCACAGACAGCATCTCTGCACCAGCTGCTAAATGCACTGCCAGTGCCACACAC
+
+a score=153575.0
+s hg18.chr10 80122616 132 - 135374737 cctcctcctACATTTTTTCCACTTTCCGTTTCAACGTCTGGTCCCCCAACA------------ccacctcttctacctccatttccaactcctcttcctccaccacctccttctattccttgccctccacctccttcAGCTTCA
+s panTro2.chr10 82310207 125 - 135001995 -------ctACATTTTTTCCACTTTCCATTTCAACGTCTGGTCCCCCAACA------------ccacctcttctacctccatttccaactcctcttcctccaccacctccttctattccttgccctccacctccttcAGCTTCA
+s mm8.chr10 74075167 137 + 129959148 ----ccccacaacttgttacattttctcttcccatttctacaccccctacttcttctctacctcttcctcctccactgtcacttcctcctc---ctcctcGGCCACCAGCTCCCCGCCTCTTCCCACAGCCTCCTTCCACGTCC
+
+a score=-80842.0
+s hg18.chr10 80122576 40 - 135374737 ttgtcctcctccctctcctccttctatccctcttcctctt
+s panTro2.chr10 82310184 23 - 135001995 ttgtcctcctccctctcctcctt-----------------
+s mm8.chr10 74075144 23 + 129959148 cctttctccccctaaccctcctc-----------------
+
+a score=15475.0
+s hg18.chr10 80122507 69 - 135374737 tcctccttctcctcctcctgctcctgctcctcttgctcctcctcctgacatttctcctttttctctttt
+s mm8.chr10 74075096 48 + 129959148 tccgcctcttcctagacct---------------------cccattgcctttaccacttttcctcttcc
+s panTro2.chr10 82310115 69 - 135001995 tcctccttctcctcctcctgctcctgctcctcttgctcctcctcctgacatttctcctttttctctttt
+
+a score=-32513.0
+s hg18.chr10 80122465 42 - 135374737 CTCTCCTTCTGCCTGtccccttccccctcctcctcctatttc
+s mm8.chr10 74075078 18 + 129959148 CTC------------------------TGctcccctcccaca
+s panTro2.chr10 82310073 42 - 135001995 CTCTCCTTCTGCCTGtccccttcctcctccttctcctatttc
+
+a score=286554.0
+s hg18.chr10 80122411 54 - 135374737 ACCTATTGAAACCGAAAGAAATATTTTTGAAAATTTTGCCCATCCACCAAACAT
+s panTro2.chr10 82310019 54 - 135001995 ACCTGTTGAAACCGAAAGAAATATGTTTGAAAATTTTGCCCATCCACCAAACAT
+s mm8.chr10 74075024 54 + 129959148 AGATACAGAACCAAAAAGGAACTCTTTTGAGATCGCTCCCCATCCACCTAGCAT
+
+a score=1014462.0
+s hg18.chr10 80122238 173 - 135374737 CCCAGGCCTCACTTCTCATTCTCCACTTTGCCAACTGTTTCAAGAACTGTGGAACTCAAATCAGAACCTAATGTCATCAGTTCTCCTGCTGAGTGTTCCTTGGAACTTTCTCCTT---CAAGGCCTTGTGTTTTACATTCTTCACTCTCTAGGAGAGAGACACCTATTTGTATGTT
+s mm8.chr10 74074848 176 + 129959148 TCTTGGTCTCACTTTTCTTTCTCAACTCTGCCAACGATTTCCAGAGCGGTGGAACTCGGGTCGGAACCTAATGTGGTCACTTCTCCCGCTGACTGCACCTTGGAACTTTCTCCTCCTCTGAGACCCCGTATTTTAAACTCCTTAAGCTCTAAGAGAGAGACTCCCACATGTGCATC
+s panTro2.chr10 82309846 173 - 135001995 CCCAGGCCTCACTTCTCATTCTCCACTTTGCCAACTGTTTCAAGAACTGTGGAACTCAAATCAGAACCTAATGTCATCAGTTCTCCTGCTGAGTGTTCCTTGGAACTTTCTCCTT---CAAGGCCTTGTGTTTTAAATTCTTCACTCTCTAGGAGAGCGACACCTATTTGTATGTT
+
+a score=337224.0
+s hg18.chr10 80122083 155 - 135374737 GAATCTGTACAAACAAAAGAGGTAGCAGCAATCCATTGCTTACAACTGAAGAGGCAAATTTGACAGAGAAAGAGGAAATAAGGCAAGGTGAAACACTGATGATAGAAGGAACAGAACAGTTGAAATCTCTCTCTTCAGACTCTTCATTTTGCTTT
+s panTro2.chr10 82309691 155 - 135001995 GAATCTGTACAAACAAAAGAGGTAGCAGCAATCCATTGCTTACAACTGAAGAGGCAAATTTGACAGAGAAAGAGGAAATAAGGCAAGGTGACACACTGATTATGAAAGGAAGAGAACAGTTGAAATCTCTCTCTTCAGACTCTTCATTTTGCTTT
+s mm8.chr10 74074696 152 + 129959148 GATGCCACCCAAGCCAGAGAGGTAGCAGCAACGTTCTGCTGGCAACTGAAGATGCCCACGAGTCAGAGAA---AGAAGGGGGACACAGAGACACCCTAATCGTCCAGCAAACAGAGCAGCTGAAATCTCTGTCTTCTGGCTCTTCTTTTTCCTCC
+
+a score=196272.0
+s hg18.chr10 80122035 48 - 135374737 TGCAGCAGTGGCAAGGCACCAGGCAGAAAGCTGAAAATGAAAACACTG
+s panTro2.chr10 82309643 48 - 135001995 TGCAGCAGTGGCAAGGCACCAGGCAGAAAGCTGAAAATGAAAACACTG
+s mm8.chr10 74074648 48 + 129959148 TGGTGGAGTGGCAGATCACCAATCAGAGAGCTGAATGCGAAAGCGCCA
+
+a score=267386.0
+s hg18.chr10 80121994 41 - 135374737 GCTGATGAGGAAAGTTCCAAATAGACCAGAGATCATAGATC
+s panTro2.chr10 82309602 41 - 135001995 GCTGATGAGGAAAGTTCCAAATAGACCAGAGATCATAGATC
+s mm8.chr10 74074607 41 + 129959148 GCTCATGTGGAAAGCCCCAAACAGGCCAGAGACCATAGACC
+
+a score=799420.0
+s hg18.chr10 80121885 109 - 135374737 ATTTTGTAGACCCATTTTCACCCAAAATACAAGCCAAGAGTAAGTCTCTGAGGGGCCCAAGAGAAAAGATTCAGAGGCTGTGGAGTCAGTCAGTCAGCTTACCCAGGAG
+s panTro2.chr10 82309493 109 - 135001995 ATTTTGTAGACCTATTTTCACCCAAAGTACAAGCCAAGAGTAAGTCTCTGAGGGGCCCAAGAGAAAAGATTCAGAGGCTGTGGAGTCAGTCAGTCAGCTTACCCAGGAG
+s mm8.chr10 74074498 109 + 129959148 ATTTTGAAGAGCTGTTGGCACCCAGAACACAAGTTAAGAGTCAGTCTCTGAGGGGCCCAAGAGAAAAGATCCAGAGGGTGTGGAATCAGTCTGTGAGCTTTCCTAGGCG
+
+a score=212883.0
+s hg18.chr10 80121842 43 - 135374737 ATAAGTCAAGTATCAACAAATTCAGACATTTCACAGAGAACAG
+s panTro2.chr10 82309450 43 - 135001995 ATAAGTCAAGTATCAACAAATTCAGACATTTCACAGAGAACAG
+s mm8.chr10 74074455 43 + 129959148 ATAGGTCAAAGGTCAACAAACTCAGACCTTCAGCCACGAACAG
+
+a score=804771.0
+s hg18.chr10 80121755 87 - 135374737 AGCAACAAACTGAAGTCTGCAAGAAAATTCACATTTCTATCTGATGAGGATGACTTAAGTGCCCATAATCCCCTTTATAAGGAAAAC
+s panTro2.chr10 82309363 87 - 135001995 AGCAACAAACTGAAGGCTGCAAGAAAATTCACATTTCTATCTGATGAGGATGACTTAAGTGCCCATAATCCCCTTTATAAGGAAAAC
+s mm8.chr10 74074368 87 + 129959148 GAGAGCCAGCCTAACCCAGCAAGGACGTTCTCATTTGTTCCTGATGAGGATAACTTAAGTACCCATAATCCCCTTTACATGGAAAGT
+
+a score=2273365.0
+s hg18.chr10 80121613 142 - 135374737 TCTTTTCCTTCTCTACCATTTTCAACAAAGCAGGGGAAATAACTCAGTCTCAGAAGACAGGAAACATCAACAAGTTGTGATGCCCTTTTCTTCCAATACTATTGAGGCTCACAAGTCAGCTCATGTAGACGGATCACTTAAG
+s panTro2.chr10 82309221 142 - 135001995 TATTTTCCTTCTCTACCATTTTCAACAAAGCAGGGGAAATAACTCAGTCTCAGAAGACAGGAAACATCAACAAGTTGTGATGCCCTTTTCTTCCAATACTATTGAGGCTCACAAGTCAGCTCATGTAGACGGATCACTTAAG
+s mm8.chr10 74074226 142 + 129959148 TCTTTTCCTTCTCTACCATTTTGAACAAAGCAGGGGAAATAACTCAGTCCCAGAAGACAGGAGCAGTCATCGCGATGGGATGGCCTTTTCCTCCAGTACCACTGAGTCTCATGAGCCAGCTCATGTAGAGGGACCACTTAAG
+
+a score=591281.0
+s hg18.chr11 18327947 30 - 134452384 GCCTACAAATGGAGTGTTGAGGATATGTAA
+s mm8.chr9 46049473 30 + 124000669 GCCTACAAGTGGAGTGTGGAGGATATGTGA
+s panTro2.chr11 18640018 30 - 134204764 GCCTACAAATGGAGTGTTGAGGATATGTAA
+
+a score=887677.0
+s hg18.chr11 18327884 63 - 134452384 TCCAATGGATTTGAACAGAAGCGCTTTGCCAGGCTTGCCAGCAAGAAGGCAGTGGAGGAACTT
+s panTro2.chr11 18639955 63 - 134204764 TCCAATGGATTTGAACAGAAGCGCTTTGCCAGGCTTGCCAGCAAGAAGGCAGTGGAGGAACTT
+s mm8.chr9 46049410 63 + 124000669 TCCAATGGCTTTGAACAGAAGCGCTTTGCCAGGCTCGCCAGCAAGAAGGCTGTGGAGGAGCTT
+
+a score=63327.0
+s hg18.chr11 18327883 1 - 134452384 A
+s panTro2.chr11 18639954 1 - 134204764 A
+s mm8.chr9 46049409 1 + 124000669 A
+
+a score=156152.0
+s hg18.chr11 116206508 6 + 134452384 ATGCAG
+s mm8.chr9 78014961 6 - 124000669 ATGCAG
+i mm8.chr9 C 0 C 0
+s panTro2.chr11 115648111 6 + 134204764 ATGCAG
+i panTro2.chr11 C 0 C 0
+
+a score=204572.0
+s hg18.chr11 116206514 49 + 134452384 CCCCGGGTACTCCTTGTTGTTGCCCTCCTGGCGCTCCTGGCCTCTGCCC
+s panTro2.chr11 115648117 49 + 134204764 CCCCGGGTACTCCTTGTTGTTGCCCTCCTGGCGCTCCTGGCCTCTGCCC
+i panTro2.chr11 C 0 C 0
+s mm8.chr9 78014967 49 - 124000669 CCCCGGACGCTCCTCACTGTGGCCCTCTTGGCTCTCCTGGCATCTGCCC
+i mm8.chr9 C 0 C 0
+
+a score=27414.0
+s hg18.chr11 18240627 24 - 134452384 ACTAAGAAGCTCAACACCCAGTGA
+s panTro2.chr11 18551568 24 - 134204764 ACTAAGAAGCTCAACACCCAGTGA
+s mm8.chr9 45981373 24 + 124000669 AGCGAGACTCTGACTGCCCAGTGA
+
+a score=65817.0
+s hg18.chr11 18240590 37 - 134452384 CTTCAAGGTCAGCTTCCTGAGCGCTCTCGAGGAGTAC
+s panTro2.chr11 18551531 37 - 134204764 CTTCAAGGTCAGCTTCCTGAGCGCTCTCGAGGAGTAC
+s mm8.chr9 45981336 37 + 124000669 GCTTAAGACCCAAGTCCAGAGTGTGATCGACAAGGCC
+
+a score=121894.0
+s hg18.chr11 18240544 46 - 134452384 CCGCGCTCGAGGACCTCCGCCAAGGCCTGCTGCCCGTGCTGGAGAG
+s mm8.chr9 45981290 46 + 124000669 CTGCGCTGGAGGACCTGCGCCATAGTCTGATGCCCATGCTGGAGAC
+s panTro2.chr11 18551485 46 - 134204764 CCGCGCTCGAGGACCTCCGCCAGGGCCTGCTGCCCGTGCTGGAGAG
+
+a score=368735.0
+s hg18.chr11 18240366 178 - 134452384 GACCGCGCGCGCGCCCATGTGGACGCGCTGCGCACGCATCTGGCCCCCTACAGCGACGAGCTGCGCCAGCGCTTGGCCGCGCGCCTTGAGGCTCTCAAGGAGAACGGCGGCGCCAGACTGGCCGAGTACCACGCCAAGGCCACCGAGCATCTGAGCACGCTCAGCGAGAAGGCCAAGC
+s panTro2.chr11 18551307 178 - 134204764 GACCGCGCGCGCGCCCATGTGGACGCGCTGCGCACGCATCTGGCCCCCTACAGCGACGAGCTGCGCCAGCGCTTGGCCGCGCGCCTTGAGGCTCTCAAGGAGAACGGCGGCGCCAGACTGGCCGAGTACCACGCCAAGGCCACCGAGCATCTGAGCACGCTCAGCGAGAAGGCCAAGC
+s mm8.chr9 45981118 172 + 124000669 GACCGCATGCGCACACACGTAGACTCTCTGCGCACACAGCTAGCGCCCCACAGCGAACAGATGCGCGAGAGCCTGGCCCAGCGCCTGGCTGAGCTCAAGA------GCAACCCTACCTTGAACGAGTACCACACCAGGGCCAAAACCCACCTGAAGACACTTGGCGAGAAAGCCAGAC
+
+a score=97575.0
+s hg18.chr11 18240323 43 - 134452384 CGAGCTGCAAGAGAAGCTGAGCCCACTGGGCGAGGAGATGCGC
+s panTro2.chr11 18551264 43 - 134204764 CGAGCTGCAAGAGAAGCTGAGCCCACTGGGCGAGGAGATGCGC
+s mm8.chr9 45981075 43 + 124000669 GGAGCTGCAAGGGAGACTGTCCCCTGTGGCTGAGGAATTTCGC
+
+a score=580950.0
+s hg18.chr11 18240123 200 - 134452384 CAGGAGTTCTGGGATAACCTGGAAAAGGAGACAGAGGGCCTGAGGCAGGAGATGAGCAAGGATCTGGAGGAGGTGAAGGCCAAGGTGCAGCCCTACCTGGACGACTTCCAGAAGAAGTGGCAGGAGGAGATGGAGCTCTACCGCCAGAAGGTGGAGCCGCTGCGCGCAGAGCTCCAAGAGGGCGCGCGCCAGAAGCTGCA
+s panTro2.chr11 18551064 200 - 134204764 CAGGAGTTCTGGGATAACCTGGAAAAGGAGACAGAGGGCCTGAGGCAGGAGATGAGCAAGGATCTGGAGGAGGTGAAGGCCAAGGTGCAGCCCTACCTGGACGACTTCCAGAAGAAGTGGCAGGAGGAGATGGAGCTCTACCGCCAGAAGGTGGAGCCGCTGCGCGCCGAGCTCCAAGAGGGCGCGCGCCAGAAGCTGCA
+s mm8.chr9 45980875 200 + 124000669 CGGGACTTCTGGGATAACCTGGAGAAAGAAACAGATTGGGTGAGACAGGAGATGAACAAGGACCTAGAGGAAGTGAAACAGAAGGTGCAGCCCTACCTGGACGAATTCCAGAAGAAATGGAAAGAGGATGTGGAGCTCTACCGCCAGAAGGTGGCGCCTCTGGGCGCCGAGCTGCAGGAGAGCGCGCGCCAGAAGCTGCA
+
+a score=49052.0
+s hg18.chr11 18240102 21 - 134452384 GAACAGCTCGGCCCTGTGACC
+s panTro2.chr11 18551043 21 - 134204764 GAACAGCTCGGCCCTGTGACC
+s mm8.chr9 45980854 21 + 124000669 GAACGGCTGGGCCCATTGACT
+
+a score=167437.0
+s hg18.chr11 18240047 55 - 134452384 CCTAAAGCTCCTTGACAACTGGGACAGCGTGACCTCCACCTTCAGCAAGCTGCGC
+s panTro2.chr11 18550988 55 - 134204764 CCTAAAGCTCCTTGACAACTGGGACAGCGTGACCTCCACCTTCAGCAAGCTGCGC
+s mm8.chr9 45980799 55 + 124000669 CCTGAATCTCCTGGAAAACTGGGACACTCTGGGTTCAACCGTTAGTCAGCTGCAG
+
+a score=-14919.0
+s hg18.chr11 1812377 30 + 134452384 ATGCTCCACCTGCATGGCTGGCAAACCATG
+s mm8.chr7 142247071 26 + 145134094 ----CCAACTGGACTACCGTGTAGAAGATG
+i mm8.chr7 C 0 C 0
+s panTro2.chr11 1858435 30 + 134204764 ATGCTCCACCTGTATGGCTGGCAAACCACG
+i panTro2.chr11 C 0 C 0
+
+a score=117382.0
+s hg18.chr12 93909439 1 - 132349534 A
+s panTro2.chr12 50116182 1 + 135371336 A
+s mm8.chr15 12392656 1 - 103492577 A
+
+a score=2422168.0
+s hg18.chr12 93909303 136 - 132349534 AAATTGAATCACTCTTTGACAACAGGCTATGTACATGTGGCACTTCAGATTCTGATGAAGGGAGATATATTGAATATATTCGGGTAAAGGGAAGTAACTATCATCTTTCTGACAATGATGCTTCTGATGTGGAATA
+s panTro2.chr12 50116046 136 + 135371336 AAATTGAATCACTCTTTGACAACAGGCTATGTACATGTGGCACTTCAGATTCTGATGAAGGGAGATATATTGAATATATTCGGGTAAAGGGAAGTAACTATCATCTTTCTGACAATGATGCTTCTGATGTGGAATA
+s mm8.chr15 12392520 136 - 103492577 AAATCGAATCGCTCTTTGACCACCGGCTATGTTCATGTGGCGCTGCCGACTCGGATGAAGGGAGGTACATTGAGTACATCCGCGTGAAGGGAAGCAACTATCATCTCTCCGACAACGACGCTTCTGACGTGGAGTA
+
+a score=1478304.0
+s hg18.chr12 93909213 90 - 132349534 GAGCTTTCTTCCTCTATGCTGGATTTGCTGCTGTGGGACTCCTTTTCATCTATGGCTGTCTTCCTGAGACCAAAGGCAAAAAATTAGAGG
+s panTro2.chr12 50115956 90 + 135371336 GAGCTTTCTTCCTCTATGCTGGATTTGCTGCTGTGGGACTCCTTTTCGTCTACGGCTGTCTTCCTGAGACCAAAGGCAAAAAATTAGAGG
+s mm8.chr15 12392430 90 - 103492577 GAGCATTCTTCCTCTACGCCGGATTCGCCGCTGTGGGACTGCTTTTTGTCTATGGCTGCCTCCCTGAAACCAAGGGGAAAAAATTGGAGG
+
+a score=129525.0
+s hg18.chr13 112381694 1 + 114142980 A
+s panTro2.chr13 114131566 1 + 115868456 A
+i panTro2.chr13 C 0 C 0
+s mm8.chr8 12748309 1 + 132085098 A
+i mm8.chr8 C 0 C 0
+
+a score=39963.0
+s hg18.chr13 112381695 121 + 114142980 TGAACTCACCAGAGGCGAGGCTCTGCGTTGCTCAATGCAGAGACTCTTACCCAGGGTGTCAGCCTCTGAAAGATACACGTGCCTGGGCCTCTTCCCTGAAGATGGACCCGGCAGGTCTGGA
+s panTro2.chr13 114131567 121 + 115868456 TGAACTCACCAGAGGCGAGGCTCTGCGTTGCTCAATGCAGAGACTCTTACCCAGGGTGTCAGCCTCTGAAAGATACACGTGCCTGGGCCTCTTCCCTGAAGATGGACCCGGCAGGTCTGGA
+i panTro2.chr13 C 0 C 0
+s mm8.chr8 12748310 91 + 132085098 TTTGTTCACCAGAGT----GTCCTGGCCTCCTGCCTATGTGGACTCATTCCCAAGG-ACCAGCCT-TGAAGGACGCA-ATGTAGGG-----CTCCATGGA------------------GGA
+i mm8.chr8 C 0 C 0
+
+a score=1055.0
+s hg18.chr13 112381816 44 + 114142980 GGGAGGCCCCCGTGATGAATCCCGTGATGAGCCGCCGATCCGAG
+s panTro2.chr13 114131688 44 + 115868456 GGGAGGCCCCTGTGATGAATCCCGTGATGAGCCGCTGATCCGAG
+i panTro2.chr13 C 0 C 0
+s mm8.chr8 12748401 15 + 132085098 GGGAGGTCTGTGTGA-----------------------------
+i mm8.chr8 C 0 C 0
+
+a score=-16674.0
+s hg18.chr13 112381860 93 + 114142980 CTCAGGCTGCGTCATGGGACCAGCCACAAGGTTGCCTGACC-TATAAAGGTCGCAGGAGTGCCTCAGGGACACAGAAGCAGTTACAGCTGCCAG
+s panTro2.chr13 114131732 93 + 115868456 CTCGGGCTGCGTCATGGGACCAGCCACAAGGTTGCCTGACC-TATAAAGGTCACAGGAGTGCCTCAGGGAGACAGAAGCAGTTACAGCTGTCAG
+i panTro2.chr13 C 0 C 0
+s mm8.chr8 12748416 81 + 132085098 -----------CACTGGGACTTGCCACAGGTCAG--TGATTGTTCAGAGGTCACAGGAGTGCCACCCTCAGGCAGAGTCATCTGTCTTTTCCAG
+i mm8.chr8 C 0 C 0
+
+a score=1627846.0
+s hg18.chr14 7658261 84 - 106368585 ACCCTGGAGAAACACATGAAAAAGTGGCACGGCGAGCACTTGCTGACTAACGACGTCAAAATCGAGCAGGCCGAGAGGAGCTAA
+s panTro2.chr14 7807052 84 - 107349158 ACCCTGGAGAAACACATGAAAAAGTGGCACGGCGAGCACTTGCTGACTAACGACGTCAAAATCGAGCAGGCCGAGAGGAGCTAA
+s mm8.chr12 12099869 84 - 120463159 ACCCTGGAGAAACACATGAAAAAGTGGCACGGTGAACACTTGCTGACTAATGATGTCAAAATCGAGCAGGCTGAGAGGAGCTAA
+
+a score=2813413.0
+s hg18.chr14 7658104 157 - 106368585 GCGGAGCCACACCGGCGAGCGGCCTTACAAGTGCGAGCTGTGCAACTACGCGTGCGCGCAGAGCAGCAAGCTCACGCGCCACATGAAGACGCACGGGCAGATCGGCAAGGAGGTGTACCGCTGCGACATCTGCCAGATGCCCTTCAGCGTCTACAGC
+s panTro2.chr14 7806895 157 - 107349158 GCGGAGCCACACCGGCGAGCGGCCTTACAAGTGCGAGCTGTGCAACTACGCGTGCGCGCAGAGCAGCAAGCTCACGCGCCACATGAAGACGCACGGGCAGATCGGCAAGGAGGTGTACCGCTGCGACATCTGCCAGATGCCCTTCAGCGTCTACAGC
+s mm8.chr12 12099712 157 - 120463159 GAGGAGCCACACCGGCGAGCGGCCTTACAAGTGCGAGCTGTGCAACTACGCGTGCGCGCAGAGCAGCAAGCTCACGCGCCACATGAAGACGCACGGGCAGATCGGCAAGGAGGTGTACCGCTGCGACATCTGCCAGATGCCCTTCAGCGTCTACAGC
+
+a score=1778334.0
+s hg18.chr14 7657988 116 - 106368585 CCGCACCTgggcggcccgggccccgggcggcccAGCTCCAAGGAGGGCCGCCGCAGCGACACGTGCGAGTACTGCGGCAAGGTGTTCAAGAACTGCAGCAACTTGACGGTGCACCG
+s panTro2.chr14 7806779 116 - 107349158 CCGCACCTgggcggcccgggccccgggcggcccAGCTCCAAGGAGGGCCGCCGCAGCGACACGTGCGAGTACTGCGGCAAGGTGTTCAAGAACTGCAGCAACTTGACGGTGCACCG
+s mm8.chr12 12099596 116 - 120463159 CCTCACCTGGGTGGTCCGGGTCCTGGGAGGCCGAGCTCCAAGGAGGGCCGCCGCAGCGACACATGTGAGTACTGCGGCAAGGTCTTCAAGAACTGTAGCAACCTGACGGTGCACCG
+
+a score=448798.0
+s hg18.chr14 7657957 31 - 106368585 CCGCAGCGGCACGGCCAGCGGAGGCAGCACC
+s panTro2.chr14 7806748 31 - 107349158 CCGCAGCGGCACGGCCAGCGGGGGCAGCACC
+s mm8.chr12 12099565 31 - 120463159 GCGCAGTGGCACGGCGAGCGGGGGCAGCACA
+
+a score=951272.0
+s hg18.chr14 7657896 61 - 106368585 AGAACGGCAGCCTGCGCTTCTCCACGCCGCCCGGGGACCTGCTGGACGGCGGCCTCTCGGG
+s panTro2.chr14 7806687 61 - 107349158 AGAACGGCAGCCTGCGCTTCTCCACGCCGCCCGGGGACCTGCTGGACGGCGGCCTCTCGGG
+s mm8.chr12 12099504 61 - 120463159 AGAACGGCAGCCTGCGCTTCTCAACGCCACCCGGGGACCTGCTGGACGGCGGGCTGTCCGG
+
+a score=2903485.0
+s hg18.chr14 7657646 250 - 106368585 GAGCCCTTCCCCGGGCTCTTCCCGCGCAAGCCCGCGCCGCTGCCCAGCCCCGGGCTCAACAG------------CGCCGCCAAGCGCATCAAGGTGGAGAAGGACCTGGAGCTGCCGCCCGCCGCGCTCATCCCGTCCGAGAACGTGTACTCGCAGTGGCTGGTGGGCTACGCGGCGTCGCGGCACTTCATGAAGGACCCCTTCCTGGGCTTCACGGACGCACGACAGTCGCCCTTCGCCACGTCGTCCGAGCACTCGTCCG
+s panTro2.chr14 7806437 250 - 107349158 GAGCCCTTCCCCGGGCTCTTCCCGCGCAAGCCCGCGCCGCTGCCCAGCCCCGGGCTCAACAG------------CTCCGCCAAGCGCATCAAGGTGGAGAAGGACCTGGAGCTGCCGCCCGCCGCGCTCATCCCGTCCGAGAACGTGTACTCGCAGTGGCTGGTGGGCTACGCGGCGTCGCGGCACTTCATGAAGGACCCCTTCCTGGGCTTCACGGACGCACGACAGTCGCCCTTCGCCACGTCGTCCGAGCACTCGTCCG
+s mm8.chr12 12099242 262 - 120463159 GAGCCCTTTCCAGCTCTCTTCCCACGCAAGCCAGCACCGCTGCCCAGCCCTGGGCTCGGTGGTCCCGCGCTGCACGCGGCCAAGCGCATCAAGGTGGAGAAAGACCTGGAGCTGCCACCTGCCGCCCTCATCCCATCTGAGAACGTGTACTCGCAGTGGCTCGTGGGCTACGCAGCATCGCGCCACTTCATGAAGGACCCATTCCTGGGCTTCACGGATGCGCGCCAGTCGCCTTTCGCCACATCGTCGGAACATTCCTCTG
+
+a score=152242.0
+s hg18.chr14 7657593 53 - 106368585 cgggcgcgggcggcgcggtcaacgggcgcgggggcggCTTCGCGCCAGGCACC
+s panTro2.chr14 7806384 53 - 107349158 cgggcgcgggcggcgcggtcaacgggcgcgggggcggCTTCGCGCCAGGCACC
+s mm8.chr12 12099189 53 - 120463159 CGGGTGCACCGGGTGCAGTGAACGGGCGCGGCGGGGCCTTCGCGCCAGGCGCA
+
+a score=564664.0
+s hg18.chr14 7657449 144 - 106368585 AGGTCATGGAGAACGTGGGCCTAGGCGCACTGCCGCAGTACGGCGAGCTCCTGGCCGACAAGCAGAAGCGCGGCGCCTTCCTGAAGCGTGCggcgggcggcggggacgcgggc---gacgacgacgacgcgggcggctgcggggacg
+s panTro2.chr14 7806240 144 - 107349158 AGGTCATGGAGAACGTGGGCCTAGGCGCACTGCCGCAGTACGGCGAGCTCCTGGCCGACAAGCAGAAGCGCGGCGCCTTCCTGAAGCGTGCggcgggcggcggggacgcgggc---gacgacgacgacgcgggcggctgcggggacg
+s mm8.chr12 12099075 114 - 120463159 AGGTGATGGAGGACGCAGGGCTGGGCGCACTGCCGCAGTATGGGGAG------------------AAGCGGGGCGCCTTCCTGAAGCGTGCAGGC---------------GACACGGGTGATGCCGGAGCTGTTGGCTGTGGGGACG
+
+a score=158337.0
+s hg18.chr14 7657397 52 - 106368585 gggggcggcgcggccAAGGCGCTGGCTGACGAGAAGGCGCTGGTGCTGGGCA
+s panTro2.chr14 7806188 52 - 107349158 gggggcggcgcggccAAGGCGCTGGCTGACGAGAAGGCGCTGGTGCTGGGCA
+s mm8.chr12 12099026 49 - 120463159 GGGGC---TGCAGCTGCGGCTCTGGCGGATGAGAAGGCTCTGGCCCTGGGCA
+
+a score=706451.0
+s hg18.chr14 7657293 104 - 106368585 TACTGGAGAACGAGAGCCGGCCCGAGTCGAGCTTCAGCATGGACTCGGAGCTGAGCCGCAACCGCGAGAACGGCGGTGGTGGGGTgcccggggtcccgggcgcg
+s panTro2.chr14 7806084 104 - 107349158 TACTGGAGAACGAGAGCCGGCCCGAGTCGAGCTTCAGCATGGACTCGGAGCTGAGCCGCAACCGCGAGAACGGCGGTGGTGGGGTgcccggggtcccgggcgcg
+s mm8.chr12 12098922 104 - 120463159 TGCTGGAGAACGAGAGCCGGCCTGAGTCGAGCTTCAGCATGGACTCGGAGCTGGGCCGTGGCCGCGAGAACGGAGGTGGCGTGCCACCGGGGGTGGCGGGCGCA
+
+a score=424364.0
+s hg18.chr14 7657246 47 - 106368585 GCCggaggaggaggacgaggaggaggaggaggaggaggaggagCTGC
+s panTro2.chr14 7806037 47 - 107349158 GCCggaggaggaggacgaggaggaggaggaggaggaggaggagCTGC
+s mm8.chr12 12098878 44 - 120463159 GCCTgaggacga---cgaggacgaggaggaggaagaagaggagCTGC
+
+a score=0.0
+s hg18.chr14 7657213 33 - 106368585 CCACCACGAGAGCGACCCGTCGCTGGGCCACGA
+
+a score=1620466.0
+s hg18.chr14 7657080 133 - 106368585 TGAAGACGCACATGCACAAGGCCGGCTCGCTGGCCGGCCGCTCCGACGACGGGCTCTCGGCCGCCAGCTCCCCCGAGCCCGGCACCAGCGAGCTGGCGGGCGAGGGCCTCAAGGCGGCCGACGGTGACTTCCG
+s panTro2.chr14 7805871 133 - 107349158 TGAAGACGCACATGCACAAGGCCGGCTCGCTGGCCGGCCGCTCCGACGACGGGCTCTCGGCCGCCAGCTCCCCCGAGCCCGGCACCAGCGAGCTGGCGGGCGAGGGCCTCAAGGCGGCCGACGGCGACTTCCG
+s mm8.chr12 12098715 130 - 120463159 TGAAGACGCACATGCACAAGGCGGGCTCTCTGGCTGGCCGCTCAGACGACGGGCTCTCAGCTGCCAGCTCCCCTGAGCCGGGCACCAGCGAGCTGCCAGGTGA---CCTGAAAGCGGCCGATGGCGACTTCCG
+
+a score=1419683.0
+s hg18.chr14 7657003 77 - 106368585 TCACACGGGCGAGAAGCCCTACAAGTGCCAGCTGTGCGACCACGCGTGCTCGCAGGCCAGCAAGCTCAAGCGCCACA
+s panTro2.chr14 7805794 77 - 107349158 TCACACGGGCGAGAAGCCCTACAAGTGCCAGCTGTGCGACCACGCGTGCTCGCAGGCCAGCAAGCTCAAGCGCCACA
+s mm8.chr12 12098638 77 - 120463159 CCACACGGGCGAGAAGCCCTACAAGTGCCAGCTGTGCGACCATGCGTGCTCGCAGGCGAGCAAGCTCAAGCGCCACA
+
+a score=2586302.0
+s hg18.chr14 7656851 152 - 106368585 AGCCCCAAGTCCCCGTTCCTGAGCACGCCGCCGCTGCCGCCCATGCCCCCTGGCGGCACGCCGCCCCCGCAGCCGCCAGCCAAGAGCAAGTCGTGCGAGTTCTGCGGCAAGACCTTCAAGTTCCAGAGCAATCTCATCGTGCACCGGCGCAG
+s panTro2.chr14 7805642 152 - 107349158 AGCCCCAAGTCCCCGTTCCTGAGCACGCCGCCGCTGCCGCCCATGCCCCCTGGCGGCACGCCGCCCCCGCAGCCGCCGGCCAAGAGCAAGTCGTGCGAGTTCTGCGGCAAGACCTTCAAGTTCCAGAGCAATCTCATCGTGCACCGGCGCAG
+s mm8.chr12 12098489 149 - 120463159 AGTCCCAAGTCCCCGTTCCTCAGCACGCCACCGCTGCCACCCATGCCTGCGGGC---ACACCGCCACCGCAGCCGCCTGCCAAGAGCAAGTCCTGTGAGTTCTGCGGCAAGACCTTCAAGTTCCAGAGCAATCTCATCGTGCACCGGCGCAG
+
+a score=2626021.0
+s hg18.chr14 7656695 156 - 106368585 GACCGAGTCATGCGCCTGAACCCCATGGCCATCGACTCGCCCGCCATGGACTTCTCGCGGCGGCTCCGCGAGCTGGCGGGCAACAGCTCCACGCCGCCGCCCGTGTCCCCGGGCCGCGGCAACCCTATGCACCGGCTCCTGAACCCCTTCCAGCCC
+s panTro2.chr14 7805486 156 - 107349158 GACCGAGTCATGCGCCTGAACCCCATGGCCATCGACTCGCCCGCCATGGACTTCTCGCGGCGGCTCCGCGAGCTGGCGGGCAACAGCTCCACGCCGCCGCCCGTGTCCCCGGGCCGCGGCAACCCTATGCACCGGCTCCTGAACCCCTTCCAGCCC
+s mm8.chr12 12098333 156 - 120463159 GACCGAGTCATGCGCCTGAACCCCATGGCCATAGACTCTCCTGCCATGGACTTCTCCCGGCGGCTGCGAGAACTGGCCGGCAACAGCTCCACGCCGCCGCCCGTGTCCCCAGGCCGTGGCAACCCTATGCACCGGCTGCTGAACCCTTTCCAGCCC
+
+a score=2119797.0
+s hg18.chr14 7656589 106 - 106368585 GCCGGGCACGCCGCCTCTCTTCAGTCCCCCGCCGCGCCACCACCTGGACCCGCACCGCCTCAGTGCCGAGGAGATGGGGCTCGTCGCCCAGCACCCCAGTGCCTTC
+s panTro2.chr14 7805380 106 - 107349158 GCCGGGCACGCCGCCTCTCTTCAGTCCCCCGCCGCGCCACCACCTGGACCCGCACCGCCTCAGTGCCGAGGAGATGGGGCTCGTCGCCCAGCACCCCAGTGCCTTC
+s mm8.chr12 12098227 106 - 120463159 GCCAGGTACGCCACCGCTCTTCAGCCCACCGCCACGCCATCACTTGGACCCACACCGCCTCAGTGCAGAGGAGATGGGGCTCGTGGCCCAGCACCCCAGTGCCTTC
+
+a score=4942642.0
+s hg18.chr14 7656300 289 - 106368585 GTAAAGATGAGCCTTCCAGCTACATTTGCACAACATGCAAGCAGCCCTTCAACAGCGCGTGGTTCCTGCTGCAGCACGCGCAGAACACGCACGGCTTCCGCATCTACCTGGAGCCCGGGCCGGCCAGCAGCTCGCTCACGCCGCGGCTCACCATCCCGCCGCCGCTCGGGCCGGAGGCCGTGGCGCAGTCCCCGCTCATGAATTTCCTGGGCGACAGCAACCCCTTCAACCTGCTGCGCATGACGGGCCCCATCCTGCGGGACCACCCGGGCTTCGGCGAGGGCCGCCT
+s panTro2.chr14 7805091 289 - 107349158 GTAAAGATGAGCCTTCCAGCTACATTTGCACAACATGCAAGCAGCCCTTCAACAGCGCGTGGTTCCTGCTGCAGCACGCGCAGAACACGCACGGCTTCCGCATCTACCTGGAGCCCGGGCCGGCCAGCAGCTCGCTCACGCCGCGGCTCACCATCCCGCCGCCGCTCGGGCCGGAGGCCGTGGCGCAGTCCCCGCTCATGAATTTCCTGGGCGACAGCAACCCCTTCAACCTGCTGCGCATGACGGGCCCCATCCTGCGGGACCACCCGGGCTTCGGCGAGGGCCGCCT
+s mm8.chr12 12097938 289 - 120463159 GTAAAGATGAGCCTTCCAGCTACATTTGCACAACATGCAAGCAGCCCTTCAACAGCGCCTGGTTCCTGCTGCAGCACGCACAGAACACACATGGCTTCCGAATCTACCTGGAGCCTGGGCCGGCCAGCACCTCGCTCACGCCCAGGCTCACCATCCCGCCACCGCTCGGGCCGGAGACCGTGGCGCAGTCCCCACTCATGAATTTCCTGGGGGACAGCAATCCTTTCAACCTGCTGCGCATGACGGGCCCCATCCTGCGGGACCACCCTGGCTTCGGTGAGGGCCGCTT
+
+a score=629708.0
+s hg18.chr15 58852016 27 - 100338915 TATAAACACGATTATGTTTCTCACTAA
+s mm8.chr2 61086875 27 - 181976762 TATAAACATGATTATGTTTCTCACTAA
+s panTro2.chr15 59529448 27 - 100063422 TATAAACACGATTATGTTTCTCACTAA
+
+a score=373301.0
+s hg18.chr15 58851981 35 - 100338915 TTGGGGAGAGAATTGGATTCAAGCAGCATCCAAAA
+s panTro2.chr15 59529413 35 - 100063422 TTGGGGAGAGAATTGGATTCAAGCAGCATCCAAAA
+s mm8.chr2 61086840 35 - 181976762 TTGGGGAGAGAATTGGATTCAAGCAGCATCCAAAA
+
+a score=2237520.0
+s hg18.chr15 58851855 126 - 100338915 ATATTGCTTTAGGGGTATTTGATGTGGTGGTGACGGACCCCTCATGCCCAGCCTCGGTGCTGAAGTGTGCTGAAGCATTGCAGCTGCCTGTGGTGTCACAAGAGTGGGTGATCCAGTGCCTCATTG
+s panTro2.chr15 59529287 126 - 100063422 ATATTGCTTTGGGGGTATTTGATGTGGTGGTGACGGACCCCTCATGCCCAGCCTCGGTGCTGAAGTGTGCTGAAGCATTGCAGCTGCCTGTGGTGTCACAAGAGTGGGTGATCCAGTGCCTCATTG
+s mm8.chr2 61086714 126 - 181976762 ACATTGCTTTAGGGGTATTTGATGTGGTGGTGACAGACCCCTCATGCCCAGCCTCGGTGCTCAAGTGTGCTGAAGCCTTGCAACTGCCTGTGGTATCACAAGAATGGGTGATCCAGTGCCTCATTG
+
+a score=562984.0
+s hg18.chr15 41673708 75 + 100338915 ATGGCTGGTCCCTTCTCCCGTCTGCTGTCCGCCCGCCCGGGACTCAGGCTCCTGGCTTTGGCCGGAGCGGGGTCT
+s panTro2.chr15 40727968 75 + 100063422 ATGGCTGGTCCCTTCTCCCGTCTGCTGTCCGCCCGCCCGGGACTCAGGCTCCTGGCTTTGGCCGGAGCGGGGTCT
+i panTro2.chr15 C 0 C 0
+s mm8.chr2 121050290 75 + 181976762 ATGGCTGGTCCCTTCTCCCGTCTGCTGTCTGCCCGCCCTGGACTCAGGCTCCTGGCTTTGGCTGGAGCTGGGTCT
+i mm8.chr2 C 0 C 0
+
+a score=535926.0
+s hg18.chr15 41673783 74 + 100338915 CTAGCCGCTGGGTTTCTGCTCCGACCGGAACCTGTACGA---GCTGCCAGTGAACGACGGAGGCTGTATCCCCCGAG
+s panTro2.chr15 40728043 74 + 100063422 CTAGCCGCTGGGTTTCTGCTCCGACCGGAACCTGTACGA---GCGGCCAGTGAACGACGGAGGCTGTATCCCCCGAG
+i panTro2.chr15 C 0 C 0
+s mm8.chr2 121050365 77 + 181976762 CTCACCGCCGGGATTCTGCTCCGCCCGGAATCTGTAGGAGCTGCCGCTGCTGAACGGAGGAGACTGTATCCCCCGAG
+i mm8.chr2 C 0 C 0
+
+a score=1893961.0
+s hg18.chr15 58659665 89 - 100338915 GTCGAAGTACAGCCTGGGGCCTCCAGGACTGGTCACGACCTTCCTGGTCCCTGGTATTGACTATCAGCTTCCTTGGCCACCTGCTATGA
+s panTro2.chr15 59329615 89 - 100063422 GTCGAAGTACAGCCTGGGGCCTCCAGGACTGGTCACGACCTTCCTGGTCCCTGGTATTGACTATCAGCTTCCTTGGCCACCTGCTATGA
+s mm8.chr2 60921257 89 - 181976762 GTCGAAACTCAGCCTGGGGTCTCTACGACTGGTTCCAAGCCTCCTGGGCCCTGGCATTGCCCGTCAGCATTTTTGGCCACCTATTATGA
+
+a score=118616.0
+s hg18.chr15 41826029 31 + 100338915 ATGCGCCTCCGCCGCCTAGCGCTGTTCCCGG
+s mm8.chr2 121105479 31 + 181976762 ATGCGCTTCAGCTGCCTAGCTCTGCTCCCGG
+i mm8.chr2 C 0 C 0
+s panTro2.chr15 40866268 31 + 100063422 ATGCGCCTCCGCCGCCTAGCGCTGTTCCCGG
+i panTro2.chr15 C 0 C 0
+
+a score=284293.0
+s hg18.chr15 41826060 57 + 100338915 GTGTGGCGCTGCTTCTTGCCGCGGCCCGCCTCGCCGCTGCCTCCGACGTGCTAGAAC
+s panTro2.chr15 40866299 57 + 100063422 GTGTGGCGCTGCTTCTTGCCGCGGCCCGCCTCGCCGCTGCCTCCGACGTGCTAGAAC
+i panTro2.chr15 C 0 C 0
+s mm8.chr2 121105510 57 + 181976762 GCGTGGCGCTGCTGCTCGCCTCGGCCCGTCTCGCCGCCGCCTCCGATGTGTTGGAAC
+i mm8.chr2 C 0 C 0
+
+a score=259946.0
+s hg18.chr15 41826117 36 + 100338915 TCACGGACGACAACTTCGAGAGTCGCATCTCCGACA
+s mm8.chr2 121105567 36 + 181976762 TGACGGACGAAAACTTCGAGAGTCGCGTCTCCGACA
+i mm8.chr2 C 0 C 0
+s panTro2.chr15 40866356 36 + 100063422 TCACGGACGACAACTTCGAGAGTCGCATCTCCGACA
+i panTro2.chr15 C 0 C 0
+
+a score=478199.0
+s hg18.chr15 41826153 43 + 100338915 CGGGCTCTGCGGGCCTCATGCTCGTCGAGTTCTTCGCCCCCTG
+s panTro2.chr15 40866392 43 + 100063422 CGGGCTCTGCGGGCCTCATGCTCGTCGAGTTCTTCGCCCCCTG
+i panTro2.chr15 C 0 C 0
+s mm8.chr2 121105603 43 + 181976762 CGGGCTCGGCGGGGCTCATGCTAGTCGAGTTCTTCGCCCCCTG
+i mm8.chr2 C 0 C 0
+
+a score=71812.0
+s hg18.chr16 142908 17 + 88827254 ATGTCTCTGACCAAGAC
+s mm8.chr11 32176663 17 + 121798632 ATGTCTCTGATGAAGAA
+i mm8.chr11 C 0 C 0
+s panTro2.chr16 146323 17 + 90682376 ATGTCTCTGACCAAGAC
+i panTro2.chr16 C 0 C 0
+
+a score=320391.0
+s hg18.chr16 142925 78 + 88827254 TGAGAGGACCATCATTGTGTCCATGTGGGCCAAGATCTCCACGCAGGCCGACACCATCGGCACCGAGACTCTGGAGAG
+s mm8.chr11 32176680 78 + 121798632 TGAGAGAGCTATCATCATGTCCATGTGGGAGAAGATGGCTGCTCAGGCCGAGCCCATTGGCACTGAGACTCTAGAGAG
+i mm8.chr11 C 0 C 0
+s panTro2.chr16 146340 78 + 90682376 TGAGGGGACCATCATTGTGTCCATGTGGGCCAAGATCTCCACGCAGGCCGACACCATCGGCACCGAGACTCTGGAGAG
+i panTro2.chr16 C 0 C 0
+
+a score=1751098.0
+s hg18.chr16 88647174 117 - 88827254 CGGAAATTGTCCCGGTCCCGGTCCCGAGATAGACATCGGCGCCACCGCAGCCGTTCCCGGAGCCACAGCCGGGGACATCGTCGGGCTTCCCGGGACCGAAGTGCGAAATACAAGTAA
+s panTro2.chr16 90501243 117 - 90682376 CGGAAATTGTCCCGGTCCCGGTCCCGAGATAGACATCGGCGCCACCGCAGCCGTTCCCGGAGCCACAGCCGGGGACATCGTCGGGCTTCCCGGGACCGGAGTGCGAAATACAAGTAA
+s mm8.chr17 26007615 117 + 95177420 CGGAAGTTTTCCCGTTCCAGATCCCGAGATAGATACAGGCGCCATCGCAGCCGTTCCCGGAGCCACAGCCGGGGTCACCGCCGGGCTTCCAGGGACCGGAGTACAAAATACAAGTAA
+
+a score=362047.0
+s hg18.chr16 88647119 55 - 88827254 GTCACGCTCCCGGGATCGGCGTCGGAGGCGGTCAAGATCTACCTCCCGAGAGCGA
+s panTro2.chr16 90501188 55 - 90682376 GTCACGCTCCCGGGATCGGCGTCGGAGGCGGTCAAGATCTACCTCCCGAGAGCGA
+s mm8.chr17 26007560 55 + 95177420 GTCACGCTCCCGGGATCGTCGACGGAGGCGGTCTAGGTCTACCTCCAGAGAGCGG
+
+a score=119311.0
+s hg18.chr16 244413 4 + 88827254 ATGT
+s panTro2.chr16 250030 4 + 90682376 ATGT
+i panTro2.chr16 C 0 C 0
+s mm8.chr17 69229272 4 - 95177420 ATGA
+i mm8.chr17 C 0 C 0
+
+a score=805217.0
+s hg18.chr16 244417 122 + 88827254 TGGACCACAAGGACTTAGAGGCCGAAATCCACCCCTTGAAAAATGAAGAAAGAAAATCGCAGGAAAATCTGGGAAATCCATCAAAAAATGAGGATAACGTGAAAAGCGCGCCTCCACAGTCC
+s panTro2.chr16 250034 122 + 90682376 TGGACCACAAGGACTTAGAAGCCGAAATCCACCCCTTGAAAAATGAAGAAAGAAAATCGCAGGAAAATCTGGGAAATCCATCAAAAAATGAGGATAACGTGAAAAGCGCGCCTCCACAGTCC
+i panTro2.chr16 C 0 C 0
+s mm8.chr17 69229276 122 - 95177420 TGGACAACAAGGACTTAGAAGCTGAAATACACCCCTTGAAGAATGAGGACAAGAAATCACAGGAAAACCCAGGAAACCTACCAAGAAACGAAGATAACTTGAAGAGCAAGCCTGTGCCTTCC
+i mm8.chr17 C 0 C 0
+
+a score=459982.0
+s hg18.chr16 244539 41 + 88827254 CGGCTCTCCCGGTGCCGAGCGGCGGCGTTTTTTCTTTCATT
+s panTro2.chr16 250156 41 + 90682376 CGGCTCTCCCGGTGCCGAGCGGCGGCGTTTTTTCTTTCATT
+i panTro2.chr16 C 0 C 0
+s mm8.chr17 69229398 41 - 95177420 CGCTTGTCCCGGTGCCGCACAGTGGCATTTTTCCTTTCCCT
+i mm8.chr17 C 0 C 0
+
+a score=699262.0
+s hg18.chr16 244580 60 + 88827254 GTTTCTCTGCCTTTTTGTGGTGTTCGTCGTCTCATTCGTCATCCCGTGTCCAGACCGGCC
+s panTro2.chr16 250197 60 + 90682376 GTTTCTCTGCCTTTTTGTGGTGTTCGTCGCCTCATTCGTCATCCCGTGTCCAGACCGGCC
+i panTro2.chr16 C 0 C 0
+s mm8.chr17 69229439 60 - 95177420 GTTCACCTGCCTCTTCGTGGTGTTTGTCCTGTCTTTCATCATCCCATGTCCAGACCGTCC
+i mm8.chr17 C 0 C 0
+
+a score=263619.0
+s hg18.chr16 244640 41 + 88827254 GGCGTCACAGCGAATGTGGAGGATAGACTACAGTGCCGCTG
+s panTro2.chr16 250257 41 + 90682376 GGCGTCACAGCAAATGTGGAGGATAGACTACAGTGCCGCTG
+i panTro2.chr16 C 0 C 0
+s mm8.chr17 69229499 41 - 95177420 CTCCTCACAGGGCACGTGGAAGCTTGACTACAACAATGCAG
+i mm8.chr17 C 0 C 0
+
+a score=-184929.0
+s hg18.chr16 88567958 28 - 88827254 CCCTGGGGGTGGAGATGGGGTGGCCTAG
+s panTro2.chr16 90415110 23 - 90682376 -----GGGGTGGAGATGGGGTGGCCTAG
+s mm8.chr17 25938305 28 + 95177420 CCCTGAAGGTGCCGATGGGGAGTAGTAG
+
+a score=-142475.0
+s hg18.chr16 88567938 20 - 88827254 GAGCCCACAGCGGCTTGTGG
+s mm8.chr17 25938285 20 + 95177420 GAGCCTGCAGCAACCAGTTC
+
+a score=-5251.0
+s hg18.chr16 88567925 13 - 88827254 TCCCACCCCTGTG
+s mm8.chr17 25938272 13 + 95177420 GTCTACCCCCAGG
+
+a score=428688.0
+s hg18.chr16 88567871 54 - 88827254 CGTGTTCCCGTTTACGTGGAGGCCACGGCACTCGAGCCCCAGCCCTGCACTCCT
+s panTro2.chr16 90414601 54 - 90682376 CGTGTTCCCAATTACGTGGAGGCCACGGCACTCGAGCCCCAGCCCTGCACTCCT
+s mm8.chr17 25938218 54 + 95177420 GCCATTTCCATTCTTGCGGAAGCCTCTGCACTCAAGCCCCAGCCCTGCTCTCCA
+
+a score=1837801.0
+s hg18.chr18 52330965 74 - 76117153 ACTATGATTACCTGAACGACTGGGGGCCACGGTTCAAGAAACTTGCTGACATGTATGGTGGAGGTGATGACTGA
+s panTro2.chr18 53421695 74 - 77261746 ACTATGATTACCTGAACGACTGGGGGCCACGGTTCAAGAAACTTGCTGACATGTATGGTGGAGGTGATGACTGA
+s mm8.chr18 74003599 74 - 90736837 ACTATGACTACCTGAATGACTGGGGACCCCGCTTCAAGAAACTGGCGGACATGTACGGCGGTGGTGACGACTGA
+
+a score=469497.0
+s hg18.chr18 52330944 21 - 76117153 CAAGTAGTGGTGGTGAGCAGG
+s panTro2.chr18 53421674 21 - 77261746 CAAGTAGTGGTGGTGAGCAGG
+s mm8.chr18 74003578 21 - 90736837 CCAGTAGCGGTGGGGACCAGG
+
+a score=2266476.0
+s hg18.chr18 52330832 112 - 76117153 GGCCTTAAAGCGGCTGACAATGACCCCACAGCTCCACCATATGACTCCCTGTTAGTGTTTGACTATGAAGGCAGTGGCTCCACTGCTGGGTCCTTGAGCTCCCTTAATTCCT
+s panTro2.chr18 53421562 112 - 77261746 GGCCTTAAAGCGGCTGACAATGACCCGACAGCTCCACCATATGACTCCCTGTTAGTGTTTGACTATGAAGGCAGTGGCTCCACTGCTGGGTCCTTGAGCTCCCTTAATTCCT
+s mm8.chr18 74003466 112 - 90736837 GGCCTTAAAGCTGCTGACAACGACCCCACGGCGCCACCGTATGACTCCCTCTTAGTCTTTGACTACGAGGGCAGCGGCTCCACGGCTGGCTCCTTGAGCTCCCTCAACTCCT
+
+a score=1391235.0
+s hg18.chr18 59406881 165 + 76117153 ATGGATTCACTTGGCGCCGTCAGCACTCGACTTGGGTTTGATCTTTTCAAAGAGCTGAAGAAAACAAATGATGGCAACATCTTCTTTTCCCCTGTGGGCATCTTGACTGCAATTGGCATGGTCCTCCTGGGGACCCGAGGAGCCACCGCTTCCCAGTTGGAGGAG
+s panTro2.chr18 60102164 165 + 77261746 ATGGATTCACTTGGCGCCGTCAGCACTCGACTTGGGTTTGATCTTTTCAAAGAGCTGAAGAAAACAAATGATGGCAACATCTTCTTTTCCCCTGTGGGCATCTTGACTGCAATTGGCATGCTCCTCCTGGGGACCCGAGGAGCCACCGCTTCCCAGTTGGAGGAG
+i panTro2.chr18 C 0 C 0
+s mm8.chr1 108809701 165 + 197069962 ATGGACTCACTAGGCACAGCAGCCACACAGTTCCTGTTTGATCTTTTCAAAGAACTGAATAAAACAAATGATGGCAACGTCTTCTTTTCCCCTGTGGGCATCTCAACAGCCATTGGCATGATCATCCTGGGGACCCGAGGAGCCACTGCTTCTGAGTTACAGAAG
+i mm8.chr1 C 0 C 0
+
+a score=725586.0
+s hg18.chr18 16661111 110 - 76117153 CATCTCCTTCAACTAATGAAGAGTTCTGTTGTAATCACCCTTTCCTATTCTTCATAAGGCAAAATAAGACCAACAGCATCCTCTTCTATGGCAGATTCTCATCCCCATAG
+s panTro2.chr18 17099295 110 - 77261746 CATCTCCTTCAACTAATGAAGAGTTCCGTTGTAATCACCCTTTCCTATTCTTCATAAGGCAAAATAAGACCAACAGCATCCTCTTCTATGGCAGATTCTCATCCCCGTAG
+s mm8.chr1 88222178 101 - 197069962 TATCTTTACAGATTACAGAAGATTTCTATTGTGATCATCCATTG---------GTCAAGCACAGTAAGACCAACAGCATCCTCTTCTTTGGCACAATCTCTTCCCCTTAA
+
+a score=-126872.0
+s hg18.chr18 16661103 8 - 76117153 CGAATTAT
+s panTro2.chr18 17099287 8 - 77261746 CGAATTAT
+s mm8.chr1 88222173 5 - 197069962 TA---ATT
+
+a score=1725446.0
+s hg18.chr18 16660844 259 - 76117153 TGATGGAATGGACAAGTTTGCAGAATATGAGAGAGACATGTGTCGATTTACACTTACCTCGGTTCAAAATGGAAGAGAGCTATGACCTCAAGGACACGTTGAGAACCATGGGAATGGTGAATATCTTCAATG---GGGATGCAGACCTCTCAGGCATGACCTGGAGCCACGGTCTCTCAGTATCTAAAGTCCTACACAAGGCCTTTGTGGAGGTCACTGAGGAGGGAGTGGAAGCTGCAGCTGCCACCGCTGTAGTAGTAGT
+s panTro2.chr18 17099028 259 - 77261746 TGATGGAATGGACAAGTTTGCAGAATATGAGAGAGACACATGTCGATTTACACTTACCTCGGTTCAAAATGGAAGAGAGCTATGACCTCAAGGACACGTTGAGAACCATGGGAATGGTGAATATCTTCAATG---GGGATGCAGACCTCTCAGGCATGACTGGGAGCCGCGGTCTCTCGGTATCTAAAGTCCTACACAAGGCCTTTGTGGAGGTCACTGAGGAGGGAGCGGAAGCTGCAGCTGCCACCGCTGTAGTAGTAGT
+s mm8.chr1 88221911 262 - 197069962 TACTAGAATGGACAAGAGCAGAAAATATGCATATGACCGAGTTGTATTTATCTTTGCCTCGGTTCAAAGTGGAAGAGAAGTATGACCTCTCAGTTCCATTGAAACACATGGGGATGGTTGGCGCCTTTGATCCACAGAAGGCTGACTTCTCTGGCATGAACAGCACTCAAGGTCTTGTGGTGTCTAAAGTTTTACACAAGTCCTTTGTGGAGGTAAATGAAGAGGGAACAGAAGCTGCTGCTACCACGGGGATAAAATCCCA
+
+a score=231361.0
+s hg18.chr18 16660816 28 - 76117153 CTTGAAGAGAAACTCACTGCTGAGAAAT
+s panTro2.chr18 17099000 28 - 77261746 CTTGAAGAGAAACTCACTGCTGAGAAAT
+s mm8.chr1 88221883 28 - 197069962 CTTGAAGAACAACTCTCTACTGAAAAGT
+
+a score=2290170.0
+s hg18.chr18 59600586 154 + 76117153 ATGGCCTCCCTTGCTGCAGCAAATGCAGAGTTTTGCTTCAACCTGTTCAGAGAGATGGATGACAATCAAGGAAATGGAAATGTGTTCTTTTCCTCTCTGAGCCTCTTCGCTGCCCTGGCCCTGGTCCGCTTGGGCGCTCAAGATGACTCCCTCT
+s panTro2.chr18 60332677 154 + 77261746 ATGGCCTCCCTTGCTGCAGCAAATGCAGAGTTTTGCTTCAACCTGTTCAGAGAGATGGATGACAATCAAGGAAATGGAAATGTGTTCTTTTCCTCTCTGAGCCTCTTCGCTGCCCTGGCCCTGGTCCGCTTGGGCGCTCAAGATGACTCTCTCT
+i panTro2.chr18 C 0 C 0
+s mm8.chr1 109255795 154 + 197069962 ATGGCCTCCCTTGCTGCAGCAAATGCAGAATTTGGCTTCGACTTATTCAGAGAGATGGATAGTAGCCAAGGAAATGGAAATGTATTCTTCTCTTCCCTGAGCATCTTCACTGCCCTGACCCTAATCCGTCTGGGTGCTCGAGGTGACTGTGCAC
+i mm8.chr1 C 0 C 0
+
+a score=17919.0
+s hg18.chr18 59600740 14 + 76117153 CTCAGATTGATAAG
+s panTro2.chr18 60332831 14 + 77261746 CTCAGATTGATAAG
+i panTro2.chr18 C 0 C 0
+s mm8.chr1 109255949 14 + 197069962 GTCAGATTGACAAG
+i mm8.chr1 C 0 C 0
+
+a score=177042.0
+s hg18.chr19 59068595 42 + 63811651 ATGCCAGTGACGGTAACCCGCACCACCATCACAACCACCACG
+s panTro2.chr19 59561975 42 + 64473437 ATGCCAGTGACGGTAACCCGCACCACCATCACAACCACCACG
+i panTro2.chr19 C 0 C 0
+s mm8.chr7_random 82256 42 - 243910 ATGCCGGTAACAGTAACTCGTACAACCATCACGACTACAACG
+i mm8.chr7_random C 0 C 0
+
+a score=-114935.0
+s hg18.chr19 59068637 25 + 63811651 ACGTCATCTTCGGGCCTGGGGTCCC
+s panTro2.chr19 59562017 25 + 64473437 ACGTCATCTTCGGGCCTGGGGTCCC
+i panTro2.chr19 C 0 C 0
+s mm8.chr7_random 82298 7 - 243910 TCA------------------TCCT
+i mm8.chr7_random C 0 C 0
+
+a score=340234.0
+s hg18.chr19 59068662 63 + 63811651 CCATGATCGTGGGGTCCCCTCGGGCCCTGACACAGCCCCTGGGTCTCCTTCGCCTGCTGCAGC
+s mm8.chr7_random 82305 63 - 243910 CCACCACTGTGGGGTCCGCTCGGGCGCTGACCCAGCCGCTGGGCCTCCTCCGCCTCCTGCAGC
+i mm8.chr7_random C 0 C 0
+s panTro2.chr19 59562042 63 + 64473437 CCACGATCGTGGGGTCCCCTCGGGCCCTGACACAGCCCCTGGGTCTCCTTCGCCTGCTGCAGC
+i panTro2.chr19 C 0 C 0
+
+a score=295172.0
+s hg18.chr19 59068725 23 + 63811651 TGGTGTCTACCTGCGTGGCCTTC
+s mm8.chr7_random 82368 23 - 243910 TAATATCCACCTGTGTGGCTTTC
+i mm8.chr7_random C 0 C 0
+s panTro2.chr19 59562105 23 + 64473437 TGGTGTCTACCTGCGTGGCCTTC
+i panTro2.chr19 C 0 C 0
+
+a score=161030.0
+s hg18.chr19 59068748 38 + 63811651 TCGCTGGTGGCTAGCGTGGGCGCCTGGACGGGGTCCAT
+s panTro2.chr19 59562128 38 + 64473437 TCGCTGGTGGCTAGCGTGGACGCCTGGACGGGGTCCAT
+i panTro2.chr19 C 0 C 0
+s mm8.chr7_random 82391 38 - 243910 TCGCTGGTGGCCAGTGTGGGTGCCTGGACAGGGCCCAT
+i mm8.chr7_random C 0 C 0
+
+a score=1769153.0
+s hg18.chr19 59068786 173 + 63811651 GGGCAACTGGTCCATGTTCACCTGGTGCTTCTGCTTCTCCGTGACCCTGATCATCCTCATCGTGGAGCTGTGCGGGCTCCAGGCCCGCTTCCCCCTGTCTTGGCGCAACTTCCCCATCACCTTCGCCTGCTATGCGGCCCTCTTCTGCCTCTCGGCCTCCATCATCTACCCCA
+s panTro2.chr19 59562166 173 + 64473437 GGGCAACTGGTCCATGTTCACCTGGTGCTTCTGCTTCTCCGTGACCCTGATCATCCTCATCGTGGAGCTGTGCGGGCTCCAGGCCCGCTTCCCCCTGTCTTGGCGCAACTTCCCCATCACCTTCGCCTGCTACGCGGCCCTCTTCTGCCTCTCGGCCTCCATCATCTACCCCA
+i panTro2.chr19 C 0 C 0
+s mm8.chr7_random 82429 173 - 243910 GGGTAACTGGGCCATGTTCACCTGGTGTTTCTGCTTTGCTGTTACCCTCATCATCCTGATTGTGGAGTTAGGTGGACTCCAGGCCCACTTCCCCCTGTCATGGCGAAACTTCCCCATCACCTTTGCCTGCTACGCGGCCCTCTTCTGCCTGTCGTCTTCCATCATCTATCCCA
+i mm8.chr7_random C 0 C 0
+
+a score=1066893.0
+s hg18.chr19 59068959 145 + 63811651 CCACCTATGTCCAGTTCCTGTCCCACGGCCGTTCGCGGGACCACGCCATCGCCGCCACCTTCTTCTCCTGCATCGCGTGTGTGGCTTACGCCACCGAAGTGGCCTGGACCCGGGCCCGGCCCGGCGAGATCACTGGCTATATGGC
+s panTro2.chr19 59562339 145 + 64473437 CCACCTATGTCCAGTTCCTGCCCCACGGTCGTTCGCGGGACCACGCCATCGCCGCCACCTTCTTCTCCTGCATCGCGTGTGTGGCTTACGCCACCGAAGTGGCCTGGACCCGGGCCCGGCCCGGCGAGATCACTGGCTATATGGC
+i panTro2.chr19 C 0 C 0
+s mm8.chr7_random 82602 145 - 243910 CCACCTATGTGCAGTTCCTAGCTCATGGACGTACCCGGGACCATGCCATCGCTGCCACCACTTTCTCCTGCGTTGCCTGTTTGGCGTATGCCACTGAAGTGGCCTGGACCCGTGCAAGGCCCGGTGAGATCACTGGCTATATGGC
+i mm8.chr7_random C 0 C 0
+
+a score=925227.0
+s hg18.chr19 59069104 98 + 63811651 CACCGTACCCGGGCTGCTGAAGGTGCTGGAGACCTTCGTTGCCTGCATCATCTTCGCGTTCATCAGCGACCCCAACCTGTACCAGCACCAGCCGGCCC
+s panTro2.chr19 59562484 98 + 64473437 CACCGTACCCGGGCTGCTGAAGGTGCTGGAGACCTTCGTGGCCTGCATCATCTTCGCGTTCATCAGCGACCCCAACCTGTACCAGCACCAGCCGGCCC
+i panTro2.chr19 C 0 C 0
+s mm8.chr7_random 82747 98 - 243910 TACCGTGCCAGGGCTGCTCAAAGTTTTTGAGACCTTCGTAGCCTGTATCATCTTTGCCTTCATCAGTGAGCCGCTCCTGTATAATCAGAAGCCAGCCC
+i mm8.chr7_random C 0 C 0
+
+a score=900583.0
+s hg18.chr19 59069202 89 + 63811651 TGGAGTGGTGCGTGGCGGTGTACGCCATCTGCTTCATCCTAGCGGCCATCGCCATCCTGCTGAACCTGGGGGAGTGCACCAACGTGCTA
+s panTro2.chr19 59562582 89 + 64473437 TGGAGTGGTGCGTGGCGGTGTACGCCATCTGCTTCATCCTAGCGGCCATCGCCATCCTGCTGAACCTGGGGGAGTGCACCAACGTGCTA
+i panTro2.chr19 C 0 C 0
+s mm8.chr7_random 82845 89 - 243910 TGGAGTGGTGTGTGGCAGTCTATGCCATCTGCTTCATACTAGCAGGGGTGACCATCCTGCTCAACCTGGGGGATTGTACCAACGTGTTG
+i mm8.chr7_random C 0 C 0
+
+a score=962595.0
+s hg18.chr19 59069291 193 + 63811651 CCCATCCCCTTCCCCAGCTTCCTGTCGGGGCTGGCCTTGCTGTCTGTCCTCCTCTATGCCACCGCCCTTGTTCTCTGGCCCCTCTACCAGTTCGATGAGAAGTATGGCGGCCAGCCTCGGCGCTCGAGAGATGTAAGCTGCAGCCG------CAGCCATG------CCTACTACGTGTGTGCCTGGGACCGCCGACTGGCTGTGG
+s panTro2.chr19 59562671 193 + 64473437 CCCATCCCCTTCCCCAGCTTCCTGTCGGGGCTGGCCTTGCTGTCTGTCCTCCTCTATGCCACTGCCCTTGTTCTCTGGCCCCTCTACCAGTTCGATGAGAAGTATGGCGGCCAGCCTCGGCGCTCGAGAGATGTAAGCTGCAGCCG------CAGCCATG------CCTACTACGTGTGTGCCTGGGACCGCCGACTGGCTGTGG
+i panTro2.chr19 C 0 C 0
+s mm8.chr7_random 82934 205 - 243910 CCCATCCCTTTCCCCACCTTCCTCTCAGGCTTGGCCTTACTCTCTGTTCTCTTTTACGCCACTGCCATCGTCCTCTGGCCCCTCTACCAATTTGATCAGAGATATCAGGGCCAACCCCGCCGTTCAATGGATCCAAGCTGCACTCGTAGTATTAGTTATATACAACCCAACACGGTGTGTTTCTGGGACCGACGACTGGCGGTGT
+i mm8.chr7_random C 0 C 0
+
+a score=613379.0
+s hg18.chr19 59069484 80 + 63811651 CCATCCTGACGGCCATCAACCTACTGGCGTATGTGGCTGACCTGGTGCACTCTGCCCACCTGGTTTTTGTCAAGGTCTAA
+s panTro2.chr19 59562864 80 + 64473437 CCATCCTGACGGCCATCAACCTACTGGCGTATGTGGCTGACCTGGTGCACTCTGCCCACCTGGTTTTTGTCAAGGTCTAA
+i panTro2.chr19 C 0 C 0
+s mm8.chr7_random 83139 80 - 243910 CCATCCTGACAGGTATCAACCTGCTGGCATATGTGTCTGATCTGGTGTACTCCACTCGTCTGGTGTTCGTCAAGGTCTGA
+i mm8.chr7_random C 0 C 0
+
+a score=200956.0
+s hg18.chr19 4575513 112 - 63811651 CCCCCAAGGAGTGACCTATGCTGAGCTAAGCACCAGCGCCCTGTCTGAGGCAGCTTCAGACACCACCCAGGAGCCCCCAGGATCTCATGAATATGCGGCACTGAAAGTGTAG
+s panTro2.chr19 4741219 112 - 64473437 CCCCCAAGGAGTGACCTATGCTGAGCTAAGCACCAGCGCCCTGTCTGAGGCAGCTTCAGACACCACCCAGGAGCCCCCAGGATCTCGTGAATATGCGGCACTGAAAGTGTAG
+
+a score=102826.0
+s hg18.chr19 4575505 8 - 63811651 ACGGCAGA
+s panTro2.chr19 4741211 8 - 64473437 ACGGCAGA
+
+a score=177230.0
+s hg18.chr19 59297998 10 + 63811651 ATGGCTGCGA
+s panTro2.chr19 59803934 10 + 64473437 ATGGCTGCGA
+i panTro2.chr19 C 0 N 0
+s mm8.chr7 3220484 10 + 145134094 ATGGCCGGGA
+i mm8.chr7 C 0 C 0
+
+a score=406760.0
+s hg18.chr19 4509426 57 - 63811651 CGGGGTCCAGACAAACTGCTGCCCTACCCGACCCTGGCCAGCCCAGCCTCTGACTGA
+s panTro2.chr19 4667557 57 - 64473437 CGGGGTCCAGACAAACTGCTGCCCTACCCGACCCTGGCCAGCCCAGCCTCTGACTGA
+s mm8.chr7 141910596 57 - 145134094 CGAGAGCCAGACAAATTGCTACCCTACCCTACCCTGGCCAGCCCACCCTTTGACTAA
+
+a score=455500.0
+s hg18.chr19 4509363 63 - 63811651 ATTAAGGTTGAGGAAGACTTTGGCTTTGAAGCAGATGAGGCCCTGGATTCCAGTTGGGTTTCT
+s panTro2.chr19 4667494 63 - 64473437 ATTAAGGTTGAGGAAGACTTTGGCTTTGAAGCAGATGAGGCCCTGGATTCCAGTTGGGTTTCT
+s mm8.chr7 141910533 63 - 145134094 ATTAAGGTTGAGGAAGACTTTGGCTTTGAAGCAGATGAGGCCTTGGATTCAAGTTGGGTTTCC
+
+a score=-197707.0
+s hg18.chr2 118288583 6 + 242951149 GTCTCG
+s mm8.chr1 73674351 6 - 197069962 GAGTCG
+i mm8.chr1 I 86 C 0
+s panTro2.chr2b 118424760 6 + 248603653 GTCTCG
+i panTro2.chr2b I 7 C 0
+
+a score=207197.0
+s hg18.chr2 118288589 79 + 242951149 CTTCCACTTCTCCAGGGGGCGCTGCAAAGATTTTGGTCGCCAAAGATATCACGGTGCGCGCGTCTGGAAGCATTTCCGC
+s panTro2.chr2b 118424766 79 + 248603653 CTTCCACTTCTCCAGGGGGCGCTGCAAAGATTTTGGTCGCCAAAGGTATCACGGTGCGCGCGTCTGGAAGCATTTCCGC
+i panTro2.chr2b C 0 C 0
+s mm8.chr1 73674357 77 - 197069962 TCCTCCAGTCGCCAGGGGGCGCTGCAGGAAATTCGGTCTCCAAAGGGAACCCAGCTCTCA--CCAGGAACTGTTTCCGC
+i mm8.chr1 C 0 C 0
+
+a score=1362965.0
+s hg18.chr2 124556947 54 - 242951149 ACA-------GTAAACAC-GTGG----CTTGGATAACACCCATCATCCTATGAAGAATATAGGGAG
+s panTro2.chr2b 130071925 54 - 248603653 ACA-------GTAAACAC-GTGG----CTTGGATAACACCCATCATCCTATGAAGAATATGGGGAG
+s mm8.chr1 123328978 54 + 197069962 AGCCCTACAAA---GAACCGTGGGCAGTGTGGATGACACTCAGAGCCC---------CATAGGCAG
+
+a score=44574.0
+s hg18.chr2 220190202 12 + 242951149 atggcttaagct
+s panTro2.chr2b 225564868 12 + 248603653 atggcttaagct
+i panTro2.chr2b C 0 C 0
+
+a score=189610.0
+s hg18.chr2 220190214 28 + 242951149 aattcgaagcaagtatgagccaccaaga
+s panTro2.chr2b 225564880 28 + 248603653 aattcgaagcaagtatgagccaccaaga
+i panTro2.chr2b C 0 C 0
+
+a score=129775.0
+s hg18.chr2 22721476 64 - 242951149 aagaaactgccaaactgttttccagagtggttgtcccattttacctttccactggtaatgtatg
+s panTro2.chr2b 22992739 64 - 248603653 aagaaactgccaaactgttttccagagtggttgtcccattttacctttccactggtaatgtatg
+
+a score=208210.0
+s hg18.chr2 22721289 187 - 242951149 atcactgcaccattcaccattcacccattaaaggacatctgcattgtctcagtttttggctattgcaaataaaactgctataaacatttgtttagtttattgtgtgaatataagtcttcctttctttgtgataaatgcccaagagtgcaattgctgagtcatatggtagttgtatgtttaggttttt
+s panTro2.chr2b 22992552 187 - 248603653 atcactgcaccattaaccattcacccattaaaggacatctgcattgtctcagtttttggctattgcaaataaaactgctataaacatttgtttagtttattgtgtgaatataagtcttcctttctttgtgataaatgcccaagagtgcaattgctgcgtcatatggtagttgtatgtttaggttttt
+
+a score=27396.0
+s hg18.chr2 22721263 26 - 242951149 ttgtgtgcgtcaaaagcttattcttt
+s panTro2.chr2b 22992526 26 - 248603653 ttgtttgcgtcaaaagcttattcttt
+
+a score=336518.0
+s hg18.chr2 22721013 250 - 242951149 Tagtgtcacaaccaaaatattgacatggacggggcaaaattagagaacatttcaatcacaataatggtcccccaagttgcctttttgtagctgtcccctccctaacctctggaaaccactaacccgttctctatttctgcaacactgtcactgtaagaatattgtataaatggaatcatacattgtgtagccttttgagaatggctttttcaactcagtgctattctctggagatacacagtttactgtg
+s panTro2.chr2b 22992276 250 - 248603653 Tagtgtcacaaccaaaatattgacatggacggggcaaaattaaagaacatttcaatcacaataatggtcccccaagttgcctttttatagctgtcccctccctaacctctggaaaccactaacccgttctctatttctgcaacactgtcactgtaagaatattgtataaatggaatcatacattgtgtagccttttgagaatggctttttcaactcaatgctattctctggagatacacagtttaccgtg
+
+a score=86437.0
+s hg18.chr2 22720918 95 - 242951149 tttgagtgtttagtacctttatttttaatataatgtatttacctgtgtttgaatataatgtatttattttttaattatACATTTTATTTTAAGAT
+s panTro2.chr2b 22992181 95 - 248603653 tttgagtgtttagtacctttatttttaatataatgtatttacctgtgtttgaatataatgtatttattttttaattatACATTTTATTTTAAGAT
+
+a score=271443.0
+s hg18.chr2 22720728 190 - 242951149 tctggtgtaaatactcccacaatggccaatttcaaactattagtgtgacatcactgaatgcagaattgggaagaaatgtgccatagcacatcactatagaatatttccaccatacagatataacagacataaataacttccagaatatagacaatagtaaaagtaacaaaataattgggaagtcatgaat
+s panTro2.chr2b 22991991 190 - 248603653 tctggtgtaaatactcccacgatggccaatttcaagctattagtgtgacatcactgaatgcagaattgggaagaaatgtgccatagcacatcactatagaatatttccaccatacagatataacagacataaataacttccagaatatagacaatagtaaaagtaacaaaataattgggaagtcatgaat
+
+a score=197745.0
+s hg18.chr2 22720624 104 - 242951149 ATGCATGAGAAATTCCCTAAC---TTAAAAGCAgt-----cccggtaaaagtttaacaaccatctacgaaaaaaaggaggggaggacctaatttgtagtgtctgctgatttc
+s panTro2.chr2b 22991887 104 - 248603653 atgcatgagaaattccctacc---ttaAAAGCAgt-----cccggtaaaagtttaacaaccatctacgaaaaaaaggaggggaggacctaatttgtagtgtctgctgatttc
+s mm8.chr1 121613757 108 - 197069962 ATGC-TGTGGAA--CCCTCCTAGGTTGCGGACAGTGGAATGCTGGCAGACACAGAGCAGCCTGTTACGGAGAGGAAAGGGACACCATCTGCTT-GCATTGTCTGCTCATTTC
+
+a score=50206.0
+s hg18.chr2 22720593 31 - 242951149 TG----GAGTCATCCAGCATCTAAACCCACTTCCT
+s panTro2.chr2b 22991856 31 - 248603653 TG----GAgtcatccagtatctaaacccacttcct
+s mm8.chr1 121613722 35 - 197069962 CAGCCAGGGTTGGTCGGTACCTAAATGCACTTCTT
+
+a score=50867.0
+s hg18.chr2 22720539 54 - 242951149 ATAACTGATCTGAGACATTAT-CCATTTTTTGATTGACATTTGCTATTTGGGAGG
+s panTro2.chr2b 22991802 54 - 248603653 ATAACTGATCTGAGACATTAT-CCATTTTTTGATTGACATTTGCTATTTGGGAGG
+s mm8.chr1 121613670 52 - 197069962 A--A-TGATCTGAGGCCTTTCCCGACTTTTTAGTAAACATTCATTATTTGGGAAG
+
+a score=357793.0
+s hg18.chr2 22720367 172 - 242951149 ACC---ATCCTGCCATCTCTATGCTGGATATTAAAGAAATGAGATTATAAACAGCCAG-------GATTCCATTCCTCCA-----GCATCTGCTTCAACCACAGTCCACAACAGCCTTTTATAAAATGAGGGAAGCAATGAGGTAGAGAGGAAATAGCCTTAGGAAGAGCC-AGCTTCTTCCTCCTCT
+s panTro2.chr2b 22991630 172 - 248603653 ACC---ATCCTGCCATCTCTATGCTGGATATTAAAGAAATGAGATTATAAACAGCCAG-------GATTCCATTCCTCCA-----GCATCTGCTTCAACCACAGTCCACAACAGCCTTTTATAAAATGAGGGAAGCAATGAGGTAGAGAGGAAATAGCCTTAGGAAGAGCC-AGCTTCTTCCTCCTCT
+s mm8.chr1 121613496 173 - 197069962 ---aCTCTCATCCCATTCCTTTGCCAAAAATTCAAAAGATGAGATTACAAAAGATGAGAGGATGCAGTGCTCCAGACCCATCCTCAATTCCACCTCAACCACAGGCTGCAGGCCCCTTGAATAAAATAA----------AACACAGGGGG--GAAAGCCTGAGGAAGAGCCCAGGTTCTGTCTCCTCT
+
+a score=3197.0
+s hg18.chr2 22720323 44 - 242951149 AAAGAGATCTGAGCATTCATAAAACTCCATTTTTTTGTAGTTTT
+s panTro2.chr2b 22991586 44 - 248603653 AAAGAGATCTGAGCATTCATAAAACTCCATTTTTTTGTAGTTTT
+s mm8.chr1 121613132 41 - 197069962 --AAACAGCTTAGCATCCATAAGCCTCCATATTTTTGTAGCCT-
+
+a score=51138.0
+s hg18.chr2 22720280 43 - 242951149 GAT--GGAGAAAGATTAGAAACAGCAGTGCCTAGGGAA-AAGTGTA
+s panTro2.chr2b 22991543 43 - 248603653 GAT--GGAGAAAGATTAGAAACGGCAGTGCCTAGGGAA-AAGTGTA
+s mm8.chr1 121613086 46 - 197069962 AATGGACAGGGGGAATACAAAGGGCATTGACTAAGGGGGAAAGGTC
+
+a score=1119822.0
+s hg18.chr20 29105541 10 - 62435964 CCTCACCTGA
+s panTro2.chr20 29927599 10 - 62293572 CCTCACCTGA
+s mm8.chr2 26465210 10 - 181976762 CCTCACATGA
+
+a score=577225.0
+s hg18.chr20 33513606 69 + 62435964 ATGGAGACAAGAAGCCCTGGGTTGAACAACATGAAGCCCCAGTCACTGCAGCTGGTACTGGAAGAGCAG
+s mm8.chr2 155653412 66 + 181976762 ATGGAGACAGGGAGCCCCGGGTTG---AACATGAAGCCCCAGTCCTTGCAGCTGGTGCTGGAGGGGCAG
+i mm8.chr2 C 0 C 0
+s panTro2.chr20 32554547 69 + 62293572 ATGGAGACAAGAAGCCCTGGGTTGAACAACATGAAGCCCCAGTCACTGCAGCTGGTACTGGAAGAGCAG
+i panTro2.chr20 C 0 C 0
+
+a score=1499195.0
+s hg18.chr20 33513675 117 + 62435964 GTGCTGGCACTACAGCAGCAGATGGCAGAGAATCAGGCAGCCTCCTGGCGGAAGCTGAAGAACTCCCAGGAGGCCCAGCAGAGACAAGCAACCCTTGTGAGGAAGCTGCAGGCCAAG
+s panTro2.chr20 32554616 117 + 62293572 GTGCTGGCACTACAGCAGCAGATGGCAGAGAATCAGGCAGCCTCCTGGCGGAAGCTGAAGAACTCCCAGGAGGCCCAGCAGAGACAAGCAACCCTTGTGAGGAAGCTGCAGGCCAAG
+i panTro2.chr20 C 0 C 0
+s mm8.chr2 155653478 117 + 181976762 GTGCTGGCGCTGCAGCAGCAGATGGCCGAGAATCAGGCTGCCTCCTGGCGGAAACTGAAGAACTCCCAAGAGGCCCAGAAGAGACAAGCAACCCTCGTGAGGAAGCTGCAGGCCAAG
+i mm8.chr2 C 0 C 0
+
+a score=366540.0
+s hg18.chr20 28856457 7 - 62435964 TCCCTAG
+s panTro2.chr20 29670686 7 - 62293572 TCCCTAG
+s mm8.chr2 26282855 7 - 181976762 TCCCTAG
+
+a score=182231.0
+s hg18.chr20 28856437 20 - 62435964 ATTTTGGAAGATGGTCTGGT
+s panTro2.chr20 29670666 20 - 62293572 ATTTTGGAAGATGGTCTGGT
+s mm8.chr2 26282835 20 - 181976762 ATTTTGGAAGATGGTCTGAT
+
+a score=1173268.0
+s hg18.chr20 33593260 60 + 62435964 ATGGAGGCGCTGGGGAAGCTGAAGCAGTTCGATGCCTACCCCAAGACTTTGGAGGACTTC
+s panTro2.chr20 32635706 60 + 62293572 ATGGAGGCGCTGGGGAAGCTGAAGCAGTTCGATGCCTACCCCAAGACTTTGGAGGACTTC
+i panTro2.chr20 C 0 C 0
+s mm8.chr2 155699581 60 + 181976762 ATGGAGGCGCTGGGGAAGCTGAAGCAGTTCGATGCCTACCCTAAGACTCTGGAGGACTTC
+i mm8.chr2 C 0 C 0
+
+a score=512129.0
+s hg18.chr20 33593320 28 + 62435964 CGGGTCAAGACCTGCGGGGGCGCCACCG
+s panTro2.chr20 32635766 28 + 62293572 CGGGTCAAGACCTGCGGGGGCGCCACCG
+i panTro2.chr20 C 0 C 0
+s mm8.chr2 155699641 28 + 181976762 CGGGTCAAGACCTGCGGGGGTGCCACGG
+i mm8.chr2 C 0 C 0
+
+a score=610562.0
+s hg18.chr21 32707032 4 + 46944323 ATGC
+s panTro2.chr21 32160918 4 + 46489110 ATGC
+i panTro2.chr21 C 0 C 0
+s mm8.chr16 90720131 4 + 98252459 ATGC
+i mm8.chr16 I 2 C 0
+
+a score=749215.0
+s hg18.chr21 32707036 127 + 46944323 TTCTGCCGGGACGCGCACGCCAACCGCCGACGCCCCAGCCCGTGCAGCATCCCGGCCTCCGCCGGCAGGTAGAGCCGCCGGGGCAGCTCCTGCGCCTCTTCTACTGCACTGTCCTGGTCTGCTCCAA
+s panTro2.chr21 32160922 127 + 46489110 TTCTGCCGGGACCCGCACGCCAACCGCCGACGCCCCAGCCCGTGCAGCATCCCGGCCTCCGCCGGCAGGTAGAGCCGCCGGGGCAGCTCCTGCGCCTCTTCTACTGCACTGTCCTGGTCTGCTCCAA
+i panTro2.chr21 C 0 C 0
+s mm8.chr16 90720135 127 + 98252459 TCCTGCCAGGACACCCGCGTCCACCACCCGCGCCCCAATCGGCGCAGAATCAGGGCCTCCGCAGGCAGGTAGAGCCTCCGGGGCAGCTTCTGCGCCTGTTCTACTGCACGGTCCTAGTGTGCTCCAA
+i mm8.chr16 C 0 C 0
+
+a score=211993.0
+s hg18.chr21 32707163 29 + 46944323 AGAGATCTCAGCGCTCACCGACTTCTCTG
+s panTro2.chr21 32161049 29 + 46489110 AGAGATCTCAGCGCTCACCGACTTCTCTG
+i panTro2.chr21 C 0 C 0
+s mm8.chr16 90720262 29 + 98252459 AGAGACCTCCGCGCTCACCGATTTCTCTG
+i mm8.chr16 C 0 C 0
+
+a score=98928.0
+s hg18.chr21 14074369 313 - 46944323 TGGGTGCTTCCTGCATTGCGGGTCTCACGGGGAGGAGACGAGAGTGCCCCTGGTTGAGTCAGGAAAGAATTCTATCTTCACGTCGCTGCCAGCAAATGACCACAGCAGCTTCACGACCTCTGCAGGAACCTATCTTGGTAAAGAAACGGGGCCTATGTGGTGGCCGAGCCTCAGGTGTGGCCGAGCTTCAGGTGTGGCCCTTATGCACAGCACAGCCCAAGCCTGTGGGCACCACTCGCCCTGGGCTGCCTGGCACCTGGACTCCTTCCCATCCTTGGCCGAGGTCTGCGTGGCCCTTCAGGGCCGAATCTGA
+s panTro2.chr21 14164701 313 - 46489110 TGGGTGCTTCCTGCATTGCGGGTCTCACGGGGAGGAGCCAAGAGTGCCCCTGGTTGAGTCAGGAAAGAATTCTATCTTCACGTCGCTGCCAGCAAATGACCACAGCAGCTTCACGACCTCTGCAGGAACCTATCTCGGTAAAGAAACAGAGCCTATCTGGTGGCTGAGCCTCAGGTGTGGCCGAGCTTCAGGTGTGGCCCTTATGCACAGCACAGCCCAAGCCTGTGGGCACCACTCGCCCTGGGCTGCCTGGCACCTGGACTCCTTCCCATCCTTGGCCGAGGTCTGCGTAGCCCTTCAGGGCCGAATCTGA
+
+a score=108541.0
+s hg18.chr21 14074301 68 - 46944323 ATGGAGCGCCCTCTCATCTGGCACCTTCCTGGCCTCTTTCCCAGGCCCCAGTTCTGTCCATGCAGCTG
+s panTro2.chr21 14164633 68 - 46489110 ATGGAGCGCCCTCTCATCTGGCACCTGCCTGGCCTCTTTCCCAAGCCCCAGTTCTGTCCATGCAGCTG
+
+a score=637432.0
+s hg18.chr21 33321040 72 + 46944323 ATGGACTCGGACGCCAGCCTGGTGTCCAGCCGCCCGTCGTCGCCAGAGCCCGATGACCTTTTTCTGCCGGCC
+s panTro2.chr21 32770081 72 + 46489110 ATGGACTCGGACGCCAGCCTGGTGTCCAGCCGCCCGTCGTCGCCAGAGCCCGATGACCTTTTTCTGCCGGCC
+i panTro2.chr21 C 0 C 0
+s mm8.chr16 91115258 72 + 98252459 ATGGACTCGGACGCCAGCCTGGTGTCTAGTCGCCCATCGTCCCCAGAACCCGATGATCTTTTTCTGCCCGCC
+i mm8.chr16 C 0 C 0
+
+a score=158069.0
+s hg18.chr21 33321112 116 + 46944323 CGGAGTAAGGGCAGCAGCGGCAGCGCCTTCACTGGGGGCACCGTGTCCTCGTCCACCCCGAGTGACTGCCCGCCGGAGCTGAGCGCCGAGCTGCGCGGCGCTATGGGCTCTGCGGG
+s panTro2.chr21 32770153 116 + 46489110 CGGAGTAAGGGCAGCAGCGGCAGCGCCTTCACTGGGGGCACCGTGTCCTCGTCCACCCCGAGCGACTGCCCGCCGGAGCTGAGCGCCGAGCTGCGCGGCGCTATGGGCTCTGCGGG
+i panTro2.chr21 C 0 C 0
+s mm8.chr16 91115330 116 + 98252459 CGGAGCAAGGGGGGAAGCAGCAGCGGCTTCACAGGAGGGACTGTGTCCTCGTCCACGCCGAGCGACTGCCCGCCAGAGCTGAGCTCCGAGCTACGAGGGGCCATGGGCGCGTCAGG
+i mm8.chr16 C 0 C 0
+
+a score=56737.0
+s hg18.chr21 33321228 102 + 46944323 CGCGCATCCTGGGGACAAGCTAGGAGGCAGTGGCTTCAAGTCATCCTCGTCCAGCACCTCGTCGTCTACGTCGTCGGCGGCTGCGTCGTCCACCAAGAAGGA
+s panTro2.chr21 32770269 102 + 46489110 CGCCCATCCTGGGGACAAGCTAGGAGGCAGTGGCTTCAAGTCATCCTCGTCCAGCACCTCGTCGTCTACGTCGTCGGCGGCTGCGTCGTCCACCAAGAAGGA
+i panTro2.chr21 C 0 C 0
+s mm8.chr16 91115446 102 + 98252459 CGCGCATCCCGGGGACAAACTGGGCGGCGGTGGCTTCAAGTCATCTTCCTCCAGCACCTCCTCGTCCACGTCCTCGGCGGCCACGTCTTCCACCAAGAAAGA
+i mm8.chr16 C 0 C 0
+
+a score=1401662.0
+s hg18.chr21 33321330 142 + 46944323 CAAGAAGCAAATGACAGAGCCGGAGCTGCAGCAGCTGCGTCTCAAGATCAACAGCCGCGAGCGCAAGCGCATGCACGACCTCAACATCGCCATGGATGGCCTCCGCGAGGTCATGCCGTACGCACACGGCCCTTCGGTGCGC
+s panTro2.chr21 32770371 142 + 46489110 CAAGAAGCAAATGACAGAGCCGGAGCTGCAGCAGCTGCGTCTCAAGATCAACAGCCGCGAGCGCAAGCGCATGCACGACCTCAACATCGCCATGGATGGCCTGCGCGAGGTCATGCCGTACGCACACGGCCCTTCGGTGCGC
+i panTro2.chr21 C 0 C 0
+s mm8.chr16 91115548 142 + 98252459 CAAGAAGCAGATGACTGAGCCCGAGCTGCAGCAGCTGCGCCTGAAGATCAACAGCCGCGAACGCAAGCGCATGCACGACCTCAACATCGCCATGGACGGCCTGCGGGAGGTCATGCCTTACGCGCACGGGCCGTCGGTGCGC
+i mm8.chr16 C 0 C 0
+
+a score=494453.0
+s hg18.chr21 33321472 43 + 46944323 AAGCTTTCCAAGATCGCCACGCTGCTGCTGGCGCGCAACTACA
+s panTro2.chr21 32770513 43 + 46489110 AAGCTTTCCAAGATCGCCACGCTGCTGCTGGCGCGCAACTACA
+i panTro2.chr21 C 0 C 0
+s mm8.chr16 91115690 43 + 98252459 AAGCTCTCCAAGATCGCCACGCTGCTGCTGGCGCGAAACTACA
+i mm8.chr16 C 0 C 0
+
+a score=611248.0
+s hg18.chr21 33321515 47 + 46944323 TCCTCATGCTCACCAACTCGCTGGAGGAGATGAAGCGACTGGTGAGC
+s panTro2.chr21 32770556 47 + 46489110 TCCTCATGCTCACCAACTCGCTGGAGGAGATGAAGCGACTGGTGAGC
+i panTro2.chr21 C 0 C 0
+s mm8.chr16 91115733 47 + 98252459 TCCTCATGCTCACCAACTCGCTGGAGGAGATGAAGCGACTGGTGAGC
+i mm8.chr16 C 0 C 0
+
+a score=167373.0
+s hg18.chr21 33321562 184 + 46944323 GAGATCTACGGGGGCCACCACGCTGGCTTCCACCCGTCGGCCTGCGGCGGCCTGGCGCACTCCGCGCCCCTGCCCGCCGCCACCGCGCACCCGGCAGCAGCAGCGCACGCCGCACATCACCCCGCGGTGCACCACCCCATCctgccgcccgccgccgcagcggctgctgccgccgctgcagccg
+s panTro2.chr21 32770603 184 + 46489110 GAGATCTACGGGGGCCACCACGCTGGCTTCCACCCGTCGGCCTGCGGCGGCCTGGCGCACTCTGCGCCCCTGCCCGCCGCCACCGCGCACCCGGCAGCAGCAGCGCACGCCGCACATCACCCCGCGGTGCACCACCCCATCctgccgcctgccgccgcagcggctgctgccgccgctgcagccg
+i panTro2.chr21 C 0 C 0
+s mm8.chr16 91115780 184 + 98252459 GAGATCTACGGGGGTCACCACGCCGGCTTCCACCCATCGGCCTGTGGCGGGCTGGCACACTCGGCGCCTCTACCCACCGCCACGGCGCACCCCGCGGCCGCCGCGCACGCCGCGCACCACCCGGCCGTGCACCACCCCATCCTCCCTCccgcagccgccgccgccgccgcagccgccgccgccg
+i mm8.chr16 C 0 C 0
+
+a score=235994.0
+s hg18.chr21 33321746 103 + 46944323 cggctgTGTCCAGCGCCTCTCTGCCCGGATCCGGGCTGCCGTCGGTCGGCTCCATCCGTCCACCGCACGGCCTACTCAAGTCTCCGTCTGCTgccgcggccgc
+s mm8.chr16 91115964 103 + 98252459 cAGCGGTGTCCAGCGCCTCTCTACCGGGCTCCGGGCTGTCCTCGGTCGGATCCATCCGGCCTCCGCACGGCCTGCTCAAGTCACCGTCGGCAGCCGCAGCCGC
+i mm8.chr16 C 0 C 0
+s panTro2.chr21 32770787 103 + 46489110 cggctgTGTCCAGCGCCTCTCTGCCCGGATCCGGGCTGCCGTCGGTCGGCTCCATCCGTCCACCGCACGGCCTACTCAAGTCTCCGTCTGCTGCCGCAgccgc
+i panTro2.chr21 C 0 C 0
+
+a score=336560.0
+s hg18.chr21 33321849 74 + 46944323 cccgctggggggcgggggcggcggcAGTGGGGCGAGCGGGGGCTTCCAGCACTGGGGCGGCATGCCCTGCCCCT
+s panTro2.chr21 32770890 74 + 46489110 cccgctggggggcgggggcggcggcAGTGGGGCGAGCGGGGGCTTCCAGCACTGGGGCGGCATGCCCTGCCCCT
+i panTro2.chr21 C 0 C 0
+s mm8.chr16 91116067 74 + 98252459 CCCTCTCGGAGGCGGGGGTGGAGGCAGCGGTGGCAGCGGTGGCTTCCAGCACTGGGGCGGCATGCCGTGCCCCT
+i mm8.chr16 C 0 C 0
+
+a score=333126.0
+s hg18.chr21 33321923 30 + 46944323 GCAGCATGTGCCAGGTGCCGCCGCCGCACC
+s panTro2.chr21 32770964 30 + 46489110 GCAGCATGTGCCAGGTGCCGCCGCCGCACC
+i panTro2.chr21 C 0 C 0
+s mm8.chr16 91116141 30 + 98252459 GCAGCATGTGCCAGGTGCCGCCGCCGCACC
+i mm8.chr16 C 0 C 0
+
+a score=245579.0
+s hg18.chr21 33321953 40 + 46944323 ACCACGTGTCGGCTATGGGCGCCGGCAGCCTGCCGCGCCT
+s panTro2.chr21 32770994 40 + 46489110 ACCACGTGTCGGCCATGGGCGCCGGCAGCCTGCCGCGCCT
+i panTro2.chr21 C 0 C 0
+s mm8.chr16 91116171 40 + 98252459 ACCACGTGTCGGCTATGGGCGCCGGCACCTTGCCGCGCCT
+i mm8.chr16 C 0 C 0
+
+a score=-238175.0
+s hg18.chr21 33321993 19 + 46944323 CACCTCCGACGCCAAGTGA
+s panTro2.chr21 32771034 19 + 46489110 CACCTCCGACGCCAAGTGA
+i panTro2.chr21 C 0 C 0
+s mm8.chr16 91116211 19 + 98252459 CACCTCCGACGCCAAGTGA
+i mm8.chr16 C 0 C 0
+
+a score=157215.0
+s hg18.chr21 13199327 2 - 46944323 GA
+s mm8.chr16 6787486 2 - 98252459 GA
+s panTro2.chr21 13299591 2 - 46489110 GA
+
+a score=753161.0
+s hg18.chr21 13199283 44 - 46944323 CACTCTGATCTACAAATTTGGAAGAACCGAAGAGCTATGGACCT
+s panTro2.chr21 13299547 44 - 46489110 CACTCTGATCTACAAATTTGGAAGAACCGAAGAGCTATGGACCT
+s mm8.chr16 6787442 44 - 98252459 CACTCTGATCTACAAATTTGGAAGAACTGAAGAGCTCTGGGCCT
+
+a score=254771.0
+s hg18.chr22 30120223 42 + 49691432 ctcccatgctgtggaagctttgctattttggtcttcgcaatg
+s panTro2.chr22 30280431 42 + 50165558 ctcccatgctgtggaagctttgttattttgctcttcgcaaag
+i panTro2.chr22 C 0 C 0
+
+a score=154402.0
+s hg18.chr22 19531009 4 - 49691432 CAAT
+s panTro2.chr22 19843351 4 - 50165558 CAGT
+s mm8.chr11 3149702 4 + 121798632 CAGT
+
+a score=61287.0
+s hg18.chr22 19530974 35 - 49691432 ATCTCCCAAAATAGGTTAGCCTTGCGGGGAGTGAT
+s panTro2.chr22 19843316 35 - 50165558 ATCTCCCAAAATAGGTTAGCCTTGCGGGGAGTGAT
+
+a score=74044.0
+s hg18.chr22 19530840 134 - 49691432 ttactatccccatgttacatgaggaaactgaggctcataaaggttgggtaatttgttcagggctccacagctaactagaggtggacctgcaatttcaaaccctgatctgcctggtcggagtacttaa-ttacATG
+s panTro2.chr22 19843181 135 - 50165558 ttactatccccatgttacatgaggaaactgaggctcataaaggttgggtaatttgttcagggctccacagctaactagaggtggacctgcaacttcaaaccctgatctgcctgGTCGGAGTACTTAAATTACATG
+
+a score=81981.0
+s hg18.chr22 19530787 53 - 49691432 aagtaccatctccctccattactaacaatcaccaccgcagaaagtaagtgcta
+s panTro2.chr22 19843128 53 - 50165558 aagtaccatctccctccattactaacaatcaccaccgcagaaagtaagtgcta
+
+a score=-1554.0
+s hg18.chr22 19530771 16 - 49691432 acagtatttgacatat
+s panTro2.chr22 19843112 16 - 50165558 acagtatttgacatgt
+
+a score=90207.0
+s hg18.chr22 30665273 17 + 49691432 GGCCTACAGTGGGAGAA
+s panTro2.chr22 30838165 17 + 50165558 GGCCTACAGTGGGAGAA
+i panTro2.chr22 I 13 C 0
+
+a score=642220.0
+s hg18.chr22 30665290 70 + 49691432 AAAGTTAAAATCCTATCTGGGTGACATTATTAATAATTTGTGGACAGGCGGCTGCTCCAGCTCAAGATGG
+s panTro2.chr22 30838182 70 + 50165558 AAAGTTAAAATCCTATCTGGGTGACATTATTAATAATTTGTGGACAGGCGGCTGCTCCAGCTCAAGATGG
+i panTro2.chr22 C 0 C 0
+
+a score=271624.0
+s hg18.chr22 18752166 212 - 49691432 ctgacaaaggagttgtatccggaataaaaagaccaacaggccaactttaaaactcaaaaaaaaaaatgacaCTTGGAGAAGAGCTTCAAGGTGACTGACtagaggtgcccaacattcgtctcctccacaaagaaggagcaaaacagataatcacatgtcaaatagagcatctaacagagaatgctggaattcagcggggaagtgacagaacc
+s panTro2.chr22 19062041 173 - 50165558 ctgacaaaggagttgtatctggaataAAAAGACCAACAGGCCAActt---------------------------------------caaggtgactgactagaggtgcccaacattcgtctcctccacaaagaaggagcaaaacagataatcacatgtcaaatagagcatctaacagagaatgctggaattcagcggggaagtgacagaacc
+
+a score=489900.0
+s hg18.chr5 131424298 81 + 180857866 ATGAGCCGCCTGCCCGTCCTGCTCCTGCTCCAACTCCTGGTCCGCCCCGGACTCCAAGCTCCCA----TGACCCAGACAACGCCC
+s panTro2.chr5 133682646 81 + 183994906 ATGAGCCGCCTGCCCGTCCTGCTCCTGCTCCAACTCCTGGTCCGCCCCGGACTCCAAGCTCCCA----TGACCCAGACAACGTCC
+i panTro2.chr5 C 0 C 0
+s mm8.chr11 67687980 73 - 121798632 ACCAGCATCCACACCATGCTGCTCCTGCTCCTGATGCTCTTCCACCTGGGACTCCAAGCTTCAATCAGTGGCC------------
+i mm8.chr11 C 0 I 19
+
+a score=-86483.0
+s hg18.chr5 131424379 81 + 180857866 TTGAAGACAAGCTGGGTTAACTGCTCTAACATGATCGATGAAATTATAACACACTTAAAGCAGCCACCTTTGCCTTTGCTG
+s panTro2.chr5 133682727 81 + 183994906 TTGAAGACAAGCTGGGTTAACTGCTCTAACATGATCGATGAAATTATAACACACTTAAAGCAGCCACCTTTGCCTTTGCTG
+i panTro2.chr5 C 0 C 0
+s mm8.chr11 67688072 52 - 121798632 ----CAGAACGTTGA----ATTGCAGCTCTATTGTCAAGGAGATTATAG------GGAAGCTCCCA---------------
+i mm8.chr11 I 19 C 0
+
+a score=1522676.0
+s hg18.chr5 49301194 71 - 180857866 TCTCCAATAAGTGGTTCCATGAACGAGGACAGGAGTTCTTGAGACCTTGTGGATCAACAGAAGTTGACTGA
+s panTro2.chr5 50180989 71 - 183994906 TCTCCAATAAGTGGTTCCATGAACGAGGACAGGAGTTCTTGAGACCTTGTGGATCAACAGAAGTTGACTGA
+s mm8.chr11 53974612 71 + 121798632 TCTCCAACAAGTGGTTCCATGAGCGAGGACAGGAGTTCTTAAGACCTTGTGGAACAACGGAAGTTGATTGA
+
+a score=291108.0
+s hg18.chr5 131621326 30 + 180857866 ATGCCCCATTCCGTGACCCTGCGCGGGCCT
+s panTro2.chr5 133877364 30 + 183994906 ATGCCCCATTCCGTGACCCTGCGCGGGCCT
+i panTro2.chr5 C 0 C 0
+s mm8.chr11 67886277 30 - 121798632 ATGACCCACTCGGTGACCCTGCGCGGCCCT
+i mm8.chr11 C 0 C 0
+
+a score=990690.0
+s hg18.chr5 131621356 63 + 180857866 TCGCCCTGGGGCTTCCGCCTGGTGGGCGGCCGGGACTTCAGCGCGCCCCTCACCATCTCACGG
+s panTro2.chr5 133877394 63 + 183994906 TCGCCCTGGGGCTTCCGCCTGGTGGGCGGCCGGGACTTCAGCGCGCCCCTCACCATCTCACGG
+i panTro2.chr5 C 0 C 0
+s mm8.chr11 67886307 63 - 121798632 TCACCCTGGGGCTTCCGCCTGGTGGGCGGCCGGGACTTCAGTGCTCCCCTCACCATCTCGCGG
+i mm8.chr11 C 0 C 0
+
+a score=519601.0
+s hg18.chr5 49010271 54 - 180857866 CTGCTGACCCCA---GTCCGGT---TGCCCTCCATCCAGGCCATTCCCTGTGCACCGTAG
+s panTro2.chr5 49887369 54 - 183994906 CTGCTGACCCCA---GTCCGGT---TGCCCTCCATCCAGGCCATTCCCTGTGCACCGTAG
+s mm8.chr11 53619809 60 + 121798632 CTGCTGGGCAACTCTGTGAGGCTGCCGCCCTCTATTCAGGCCATTCCTTGTGCACCATAG
+
+a score=431236.0
+s hg18.chr5 49010219 52 - 180857866 ACAGCGTGTCTTCACAGATCTGAAGAACATGGATGCCACC---TGGCTGGACAGC
+s panTro2.chr5 49887317 52 - 183994906 ACAGCGTGTCTTCACAGATCTGAAGAACATGGATGCCACC---TGGCTGGACAGC
+s mm8.chr11 53619754 55 + 121798632 ACAACATGTCTTCACGGAGATGAAGAATATGGACTCCATCATGTGGATGGACAGC
+
+a score=274608.0
+s hg18.chr5 49010200 19 - 180857866 GGGATATTGGGCTGAGTCT
+s panTro2.chr5 49887298 19 - 183994906 GGGATATTGGGCTGAGTCT
+s mm8.chr11 53619735 19 + 121798632 GGGACATTGGGATAGGCAT
+
+a score=3488854.0
+s hg18.chr6 62600248 144 - 170899992 TTGGAAGTTCATGAGGCTAAGCCTGTGCCAGAAAATCACCCACAGTGGGATACAGCAATAGAGGGGGATGAAGACCAGGAGGACAGTGAGGGCTTTGAAGATAGCTTTGAGGAAGAAGAGGAGGAAGAAGAAGATGATGACTAA
+s panTro2.chr6 64206236 144 - 173908612 TTGGAAGTTCATGAGGCTAAGCCTGTGCCAGAAAATCACCCACAGTGGGATACAGCAATAGAGGGGGATGAAGACCAGGAGGACAGTGAGGGCTTTGAAGATAGCTTTGAGGAAGAAGAGGAGGAAGAAGATGATGATGACTAA
+s mm8.chr10 42517305 144 + 129959148 TTGGAAGTTCATGAGGCCAAGCCTGTGCCAGAAAACCACCCACAGTGGGACACAGCGATAGAAGGTGACGAAGACCAGGAAGACAGTGAAGGATTTGAAGACAGCTTTGAGGAAGAGGAGGAGGAAGAGGAAGGTGGAGACTAA
+
+a score=673541.0
+s hg18.chr6 108594662 25 + 170899992 ATGAGCAAGCCAGCCGGATCAACAA
+s panTro2.chr6 109997450 25 + 173908612 ATGAGCAAGCCAGCCGGATCAACAA
+i panTro2.chr6 C 0 C 0
+s mm8.chr10 87687827 25 - 129959148 ATGAGCAAGCCCGCCGGATCAACAA
+i mm8.chr10 C 0 C 0
+
+a score=2387325.0
+s hg18.chr6 62259841 106 - 170899992 GGTCGCTGGTCATCCTCTGGCACAGAACGAACGTTGTCTTCACATGTTTTTACAAGATGAAATAATAGATAAAAGCTATACTCCATCTAAAATAAGACATGCCTGA
+s panTro2.chr6 63864488 106 - 173908612 GGTCGCTGGTCATCCTCTGGCACAGAACGAACGTTGTCTTCACATGTTTTTACAAGATGAAATAATAGATAAAAGCTATACTCCATCTAAAATAAGACATGCCTGA
+s mm8.chr10 42223067 106 + 129959148 GGTCGCTGGTCATCCTCTGGCCCAGAATGAACGTTGTCTTCACATGTTTTTACAGGATGAAATTATAGATAAAAGCTATACTCCATCTAAAATAAGACATGCCTGA
+
+a score=684735.0
+s hg18.chr6 108722976 80 + 170899992 ATGGCGGCCTCCTGGTCGCTCTTGGTTACCCTGCGCCCCTTAGCACAGAGCCCGCTGAGAGGGAGATGTGTTGGGTGCGG
+s panTro2.chr6 110129713 80 + 173908612 ATGGCGGCCTCCTGGTCGCTCTTGGTTACCCTGCGCCCCTTAGCACAGAGCCCGCTGAGAGGGAGATGTGTTGGGTGCGG
+i panTro2.chr6 C 0 C 0
+s mm8.chr10 87792332 80 - 129959148 ATGGCGGCCTCCTGGTCGCCCTTGGTTACTCTGCGCTCCGCCGCGCGCAGCCGGCTGACTGGGAGAGGTGTTGGGTGCGG
+i mm8.chr10 C 0 C 0
+
+a score=301881.0
+s hg18.chr6 108723056 59 + 170899992 GGCCTGGGCCGCCGCTCTCGCTCCTCTGGCCACCGCCCCTGGGAAGCCCTTTTGGAAAG
+s panTro2.chr6 110129793 59 + 173908612 GGCCTGGGCCGCCGCTCTCGCTCCTCTGGCCACCGCCCCTGGGAAGCCCTTTTGGAAAG
+i panTro2.chr6 C 0 C 0
+s mm8.chr10 87792412 59 - 129959148 GGCGCGGGTCGTCGCAATCCCTCCTCCGGCCCCTGGCCCTGGGAAACCCCTGTGGAAAG
+i mm8.chr10 C 0 C 0
+
+a score=77769.0
+s hg18.chr7 113660517 150 + 158821424 acaatatttttacatgtacaaaaggagtgtttaggattcctatagtgaaattaaataa--aaatagtatttcatcatttcatctttatcctctgcatttttactcttgtgtatgtcttatacaaaacagagtatataaaatatttaagtata
+s panTro2.chr7 114366363 150 + 160261443 acaatatttttacatgtacaaaaggagcatttaggattcctatagtgaaattaaataa--aaatagtatttcatcatttcatctttatcctctgcatttttactgttgtgtatgtcttatacaaaacagagtatataaaatatttaagtata
+i panTro2.chr7 C 0 C 0
+s mm8.chr6 15003289 119 + 149525685 TCAATA-TTTTGCAAGTTCAAAGG---TATTTTGCATTTATATAGCAAAGTTAAACTATTAA-----------------CATATCTGTACT------------TTTTGTATATGTCTGATATAGGACAGATGATATAAAATATTTAGGTTTA
+i mm8.chr6 I 216 C 0
+
+a score=225170.0
+s hg18.chr7 113660667 18 + 158821424 gtagcacttgtatataaa
+s panTro2.chr7 114366513 18 + 160261443 gtagcacttgtatataaa
+i panTro2.chr7 C 0 C 0
+s mm8.chr6 15003408 18 + 149525685 GCAGTGCTTTTATATAAA
+i mm8.chr6 C 0 C 0
+
+a score=109967.0
+s hg18.chr7 42309182 83 - 158821424 AA---ACAGAAAAAATGACAACCTAAAACTGATTTGCTCCTACCGCTTTTGAGAAAAGTAAAAACATAAAATATAATTTTATTCTC
+s panTro2.chr7 42970029 83 - 160261443 AA---ACAGAAAAAATGATAACCTAAAACTGATTTGCTCCTACCGCTTTTGAGAAAAGTAAAAACATAAAATATAATTTTATTCTC
+s mm8.chr6 131770695 82 - 149525685 CACTGAGGGGGAGGAGGACAACCTGAAATCCATTTGCTCTGATCAGATTTCATGAA----CGGAGATGAAATGTGTTTCTCTCCCA
+
+a score=102283.0
+s hg18.chr7 42309126 56 - 158821424 CACAGATAGACATA-CCAAATTACAGAGAACAGGTATCTACTGTTCTAAAAACCTGG
+s panTro2.chr7 42969973 56 - 160261443 CACAGATAGACATA-CCAAATTACAGAGAACAGGTATCTACTGTTCTAAAAACCTGG
+s mm8.chr6 131770639 56 - 149525685 CATAGGTGGGCACAGCCAAATGACAGAAGCTAAGAACCTATTGTTCTAAAA-CCAGC
+
+a score=19014.0
+s hg18.chr7 42309086 40 - 158821424 CTTTTCTTAGGAACAAGCGCCAGGACTGACTTAAGCATTA
+s panTro2.chr7 42969933 40 - 160261443 CTTTTCTTAGGAACAAGCGCCAGGACTGACTTAAGCATTA
+s mm8.chr6 131770600 39 - 149525685 GGTTTCTTAGGATCCATTACTGTGAAAGCTGC-TGCATGA
+
+a score=57850.0
+s hg18.chr7 42309063 23 - 158821424 ATATGTATTTGCCTCTTATTTTC
+s mm8.chr6 131770575 23 - 149525685 GTATGTACCTGTCGCCCACTTCC
+s panTro2.chr7 42969910 23 - 160261443 ATATGTATTTGCCTCTTATTTTC
+
+a score=41852.0
+s hg18.chr7 42309040 23 - 158821424 ATTCTTTTTCTTGTACAGAATCA
+s panTro2.chr7 42969887 23 - 160261443 ATTCTTTTTCTTGTACAGAATCA
+s mm8.chr6 131770552 23 - 149525685 CTTCTCCTGCTTTTACAGTGCGG
+
+a score=45100.0
+s hg18.chr7 42309035 5 - 158821424 CCTTT
+s panTro2.chr7 42969882 5 - 160261443 CCTTT
+s mm8.chr6 131770535 5 - 149525685 TAATT
+
+a score=1784527.0
+s hg18.chr7 116714099 53 + 158821424 T-------GTTTTCGTAAGTTGGAAAAGTTTGACTGGCACAGGAAAG-CATGTCCCATTAA
+s panTro2.chr7 117499706 53 + 160261443 T-------GTTTTCATAAGTTGGAAAAGTTTGACTGGCACAGGAAAG-CATGTCCCATTAA
+i panTro2.chr7 C 0 C 0
+s mm8.chr6 17948973 59 + 149525685 TTTTATTCATTTTCCTAGCTCAG--AGGTTTGACTGGCACAGGACAGCCAGGTCCTGTTAA
+i mm8.chr6 C 0 C 0
+
+a score=193794.0
+s hg18.chr7 41875637 246 - 158821424 T-CTATATATTTAAGTCTATGAAAGACATATATATACACATATGTATATGTtaataatatataatatagcctatta-----tatattataatcatatatataaattattatattatttatagtattatatatttatttagaataaatattactatattattatataacatatgttatatacaattataattataatatatattgtattatatattataataATGGGTTAGAGACATATATGTGACATATATA
+s panTro2.chr7 42526447 252 - 160261443 TGCTATATATTTAAGTCTATGAAAGacatatatatacacatatgcatatattaataatatataatatagcctattatatattatattataatcatatatataaattattatattatttatagtgttatatgtttatttagaataaatattactatattattatataacatatgttatatacaattataattataatatatgttatattatatattataataataggttaGAGACATATATGTGACATATATA
+
+a score=4204045.0
+s hg18.chr8 27393549 146 - 146274826 CCCAGCGACAGAGCTGCATGAATACGTTTGCCAGCTGGTTTGGCTACATGCCGCTGATCCACTCTCAGATGAGGCTCGACCCCGTCCTCTTTAAAGACCAGGTCTCTATTTTGAGGAAGAAATACCGAGACATTGAGCGACTTTGA
+s panTro2.chr8 27880503 146 - 145085868 CCCAGCGACAGAGCTGCATGAATACGTTTGCCAGCTGGTTTGGCTACATGCCGCTGATCCACTCTCAGATGAGGCTCGACCCCGTCCTCTTTAAAGACCAGGTCTCTATTTTGAGGAAGAAATACCGAGACATTGAGCGACTTTGA
+s mm8.chr15 50593685 146 - 103492577 CCCAGCGACAGAGCTGCATGAATACATTTGCCAGCTGGTTTGGCTACATGCCGCTGATCCATTCTCAGATGAGGCTGGACCCGGTCCTCTTTAAAGACCAAGTCTCAATTCTGAGGAAGAAATACAGAGACATTGAACGACTTTGA
+
+a score=1001054.0
+s hg18.chr8 27393509 40 - 146274826 ACTTCTCGGGCTTCCCGTTGGGCTGACCCTGACCACTTTG
+s panTro2.chr8 27880463 40 - 145085868 ACTTCTCGGGCTTCCCGTTGGGCTGACCCTGACCACTTTG
+s mm8.chr15 50593645 40 - 103492577 ACTTCCCGAGCATCCCGCTGGGCCGACCCTGACCACTTTG
+
+a score=57001.0
+s hg18.chr9 128764156 6 + 140273252 catcaa
+s panTro2.chr9 126736437 6 + 138509991 catcaa
+i panTro2.chr9 C 0 C 0
+s mm8.chr2 148813766 6 - 181976762 CAGTAA
+i mm8.chr2 C 0 C 0
+
+a score=16385.0
+s hg18.chr9 128764162 27 + 140273252 actgtatctgtgggccatagttagcct--------------
+s panTro2.chr9 126736443 27 + 138509991 actgtatctgtgggccatagttagcct--------------
+i panTro2.chr9 C 0 C 0
+s mm8.chr2 148813772 31 - 181976762 ----------TGGCACAGGTACACCATTTTCCATGGAGGGA
+i mm8.chr2 C 0 C 0
+
+a score=76022.0
+s hg18.chr9 11485716 17 - 140273252 TTTTAcaa---gataatgta
+s panTro2.chr9 11748557 17 - 138509991 TTTTACAA---GATAATGTA
+s mm8.chr2 33142635 20 + 181976762 CTCTAAGAAATGACAATGGC
+
+a score=169894.0
+s hg18.chr9 11485632 84 - 140273252 aaatatataaatatCAAGGGAATTAAGTAACAACTCTATAATGTTATATTTGAATTGGAAAGATCAGTATTATATTAGTCAAAT
+s panTro2.chr9 11748473 84 - 138509991 aaatatataaatatCAAGGGAATTAAGTAACAACTCTATAATGTTATATTTGAATTGGAAAGATCAGTATTATATTAGTCAAAT
+s mm8.chr2 33142562 73 + 181976762 AAATACAAGAAAATCAAGATCCTTAGGGAACATCAGGATAAGGACAGGTAAGAGCTGGGAAGAGTGACT-----------CACC
+
+a score=100082.0
+s hg18.chr9 11485610 22 - 140273252 CCAAAATTGTCACTGtaaaata
+s panTro2.chr9 11748451 22 - 138509991 CCAAAATTGTCACTGtaaaata
+s mm8.chr2 33142540 22 + 181976762 CTAAAACTGCCATTGTCAAATA
+
+a score=31644.0
+s hg18.chr9 11485572 38 - 140273252 atG-----------ACGGGATAATAT----AAAGTAAG----TAATGTTGCTAGGAA
+s panTro2.chr9 11748413 38 - 138509991 atG-----------ACGGGATAATAT----AAAGTAAG----TAATGTTGCTAGGAA
+s mm8.chr2 33142484 56 + 181976762 GAGTGCACAGGCACGAGTTAGAACAACGCAGGAA-AAGTAACCAGTATTGTTAGGAA
+
+a score=59361.0
+s hg18.chr9 11485526 46 - 140273252 TAGTAGTAATATTCGtattattat---------------------ttttaaattattttacata----tat
+s panTro2.chr9 11748367 46 - 138509991 TAGTAGTAATATTCGtattattat---------------------ttttaaattattttacata----tat
+s mm8.chr2 33142413 71 + 181976762 TGACAATAATGGCCTTGCTATTTTAAAGCACCCAGCCCACCTCCACCCAGTGTGCATGCACATACATATGT
+
+a score=132295.0
+s hg18.chr9 11485487 39 - 140273252 TGCAAG---------AAAATGTTAAAATTTGACCAGCAGTCTACTGCT
+s panTro2.chr9 11748328 39 - 138509991 TGCAAG---------AAAATGTTAAAATTTGACCAGCAGTCTACTGCT
+s mm8.chr2 33142362 48 + 181976762 TGCAAACAGAACCACAAAGTGGGAAACTTGAACCTGCAGTCGGCCAGG
+
+a score=57825.0
+s hg18.chr9 11485468 19 - 140273252 AAGAAGTAAAAGAACTAAC
+s panTro2.chr9 11748309 19 - 138509991 AAGAAGTAAAAGAACTAAC
+s mm8.chr2 33142345 17 + 181976762 CAGAAGAAAGGGAAC--AC
+
+a score=350567.0
+s hg18.chr9 11485308 160 - 140273252 caggtactgGGATTACAACAGGGTATCTCAGTATGCAGACCCTCTAGAACCAAATTAGCATAACCCTCCTTTTCTGTCCTGGTGCTTCCAAAGACCTTTAAGGGAAAAGTCCAGGGGAGAGGCCC---ACT--TGGGTATGTAAGTAGTAGGAAAGAGAGAAGAC
+s mm8.chr2 33142195 150 + 181976762 CAGGTACTGAGATTACACCAGGGCCTCTTGGAGTACAGACCTCC--------------AAAAACCAGCTGCCTGTGACCACCTTCTTCTGAAAACCT-TAGAGGCAAAGAAAAGATGGAAGGCCCAACCCATCAAGAGGTGTGAGAGGAAGGAGGGAGAGACAAC
+s panTro2.chr9 11748149 160 - 138509991 caggtactgGGATTACAACAGGGTATCTCAGTATGCAGACCCTCTAGAACCAAATTAGCATAACCCTCCTTTTCTGTCCTGGTGCTTCCAAAGACCTTTAAGGGAAAAGTCCAGGGGAGAGGCCT---ACT--TGGGTATATAAGTAGTAGGAAAGAGAGAAGAC
+
+a score=-38935.0
+s hg18.chr9 11485292 16 - 140273252 attatgta-ctg-tgttc
+s panTro2.chr9 11748133 16 - 138509991 attatgta-ctg-tgttc
+s mm8.chr2 33142179 16 + 181976762 --TGAGCAGCTGCTACTC
+
+a score=73778.0
+s hg18.chr9 11485257 35 - 140273252 CATCCATTCACACtccactcattcaacaaatattt
+s mm8.chr2 33142146 33 + 181976762 GTATTGGCCCTTCTCCACTCAG--GACAGATCCCC
+s panTro2.chr9 11748098 35 - 138509991 CATCCATTCACACtccactcattcaacaaatattt
+
+a score=368197.0
+s hg18.chr9 11485084 173 - 140273252 GAATCTTCAAAAGGCTGAGCTCACCAGGAAATACCC-------TTGCTTTGCGGGAAGTGGTTACACCACAAAACAAGACACCCTGGTAATATCGCTCCTTTGGTTGGCACACGCCCTCGCTTGGCAGTGTGCCTAAACACAGCCAGATAATGTTCTGCTATGGCGCTTCCCCTTTCAGG
+s panTro2.chr9 11747926 172 - 138509991 GAATCTTCAAAAGGCTGAGCTCACCAGGAAATACCC-------TTGCTTTGCGGGAAGTGGTTACACCAC-AAACAAGACACCCTGGTAATATCGCTCCTTTGGTTGGCACACCCCCTCGCTTGGCAGTGTGCCTAAACACAGCCAGATAATGTTCTGCTATGGCGCTTCCCCTTTCAGG
+s mm8.chr2 33141997 149 + 181976762 AAATCTCCAAAAGGCTGAGCCCACCAGGCAAAACCCCTCTTTTTTTCTTTGGGAAAAGTGACCAC----------TGCGCACCCAGTAGACACTGCTCCT-GAGCTGTCCTGTCCTG--------------------AGTCAGTCAGAAAACACTGTGCCAAGATGCTTGCCCTCACTGG
+
+a score=735006.0
+s hg18.chr9 11484882 202 - 140273252 AGAGTCACCAGGGGACAGGGCAGTTATGGTTCCATATTTGTAACTTCCATTTTCCTTACTCTCTGCCAATCCTTAACTCACCGTCTGCCTGGCTTCCTCTAAGCCCTGAAATGATGTTCTTTGTGGTCCCCCTTGCAGAAACCAGCAGAAGTCATGAAAAGCCACAGCTCCACCCTCAGTTATCAACTGCATTTGGAAATGT
+s panTro2.chr9 11747724 202 - 138509991 AGAGTCACCAGGGGACAGGGCAGTTATGGTTCCATATTTGTAACTTCCATTTTCCTTACTCTCTGCCAATCCTTAACTCACCGTCTGCCTGGCTTCCTCTAAGCCCTGAAATGATGTTCTTTGTGGTCCCCCTTGCAGAAACCAGCAGAAGTCATGAAAAGCCACAGCTCCACCCTCAGTTATCAACTGCATTTGGAAATGT
+s mm8.chr2 33141834 163 + 181976762 -----TAGCAGGGATCAGCACAATCGTG-TCCCATGCTTGTGACCTCCACATTCCTTATACTCTGCCAGTCC------------------------TCCTGAGTCCTGGGATGAGGCG--CTGTGGTTACCCCA-CAGAGAAGAGCACAAGTCCTAGT--GCTACA-TTCCAGCCCCAGCTGTGGGAGCCACT---GAATTC
+
+a score=440472.0
+s hg18.chr9 11484776 106 - 140273252 GGGGTTCTAGGCCACAACTTGTAAGTTCAACACAGCTGTGAGATATTATGCTACAAAGCTATATCTGCATTAATACACCAATTTTTGATAAACTTGGTCACTCGTT
+s panTro2.chr9 11747618 106 - 138509991 GGGGTTCTAGGCCACAACTTGTAAGTTCAACACAGCTGTGAGATATTATGCTACAAAGCTATATCTGCATTAATACACCAATTTTTGATAAACTTGGTCACTCGTT
+s mm8.chr2 33141754 80 + 181976762 AG-------------------------CAGCCTAGCTATAAGCAGA-ATGCCACAGAATTACATGTACGTTAAGTTGCCAGCTCTTTATAAAACTGGTCACTTATT
+
+a score=157210.0
+s hg18.chr9 11484715 61 - 140273252 CCTGGCAGCCAGGAATCCACCCAGGAATCTACCCTGCAACCCAATCCACCACAGTGGCAAT
+s mm8.chr2 33141702 52 + 181976762 CCTGGCAGGCAGGAGTCTAACCAGA------G-CTGTCACCCAGTT-ATCCAGGTC-CAAC
+s panTro2.chr9 11747557 61 - 138509991 CCTGGCAGCCAGGAATCCACCCAGGAATCTACCCTGCAACCCAATCCACCACAGTGGCAAT
+
+a score=-50628.0
+s hg18.chr9 11484601 114 - 140273252 GTAAGGAGCTCTGGTAGAGACAAAACACCACCTTGAAAACATACCCTTTTAGAAGGCTGCTACCACCAGGACCTTCAGACAGACCTCCTTTACAATGCAGCCCTTGCCCCAAGC
+s panTro2.chr9 11747443 114 - 138509991 GTAAGGAGCTCTGGTAGAGACAAAACACCACCTTGAAAACATACCCTTTTAGAAGGCTGCTACCACCAGGACCTTCAGACAGACCTCCTTTACAATGCAGCCCTTGCCCCGAGC
+s mm8.chr2 33141592 110 + 181976762 GTAGGGAATACTG-TGGACACAAAATGCTATGCCAAAACATGCCAGGTCAAGCAGGATGCAGCCACCAGGACCCTCAAACAAAG-CCCTTCATGAGGTAGCGTCA--CCCGAGC
+
+a score=125989.0
+s hg18.chr9 11484506 95 - 140273252 ACAAAAACAGTTCTGACATTTAGACCAGCCTCTGAGACACTGCTGCGCCTTCAACTCCATAGGCTGGGAACTGGACATACTGACAGACAGATGTG
+s panTro2.chr9 11747348 95 - 138509991 ACAAAAACAGTTCTGACATTTAGACCAGCCTCTGAGACACTGCTGCGCCTTCAACTCCATAGGCTGGGAACTGGACATACTGACAGACAGATGTG
+s mm8.chr2 33141545 47 + 181976762 -----------------------------CTCTGAGGAGCTGTAGGAGCCTCCGTTCTGTG------------AGTATGA-------CAGACTTG
+
+a score=128122.0
+s hg18.chr9 11484395 111 - 140273252 AGCTCAGCTCTGACAGAACCCTGGGCTGAATAAAGCACAGGCTGTGCCCATTTTCAGCACATTCTAAGAACAGCAGTTTCCCCTTGATGCTGCTCCATGCTAAAACTAATG
+s panTro2.chr9 11747237 111 - 138509991 AGCTCAGCTCTGACAGAACCCTGGGCTGAATAAAGCACAGGCTGTGCCCATTTTCAGCACATTCTAAGAACAGCAGTTTCCCCTTGATGCTGCTCCATGCTAAAACTAATG
+s mm8.chr2 33141446 99 + 181976762 AGCTCAACTCTGATAGGGTCATGGGCTAAGTACAGCCAAGGCCATGTCCATTTCCAGCTCAGTTTGAGAACAG-AGATCCACCATGCTGGGGTCTGGTGC-----------
+
+a score=88798.0
+s hg18.chr9 11484289 106 - 140273252 acttgtcctaagtctccaagctag-aggggtgaggctgtgactcaacctcagcttcatcagatcaaagttcatgctcttCAAGCTGTGTGGCTTTAACAGACCCAGC
+s panTro2.chr9 11747131 106 - 138509991 acttgtcctaagtctccaagctag-aggggtgaggctgcgactcaacctcagcttcatcagatcaaagttcatcctcttCAAGCTGTGTGGCTTTAACAGACCCAGC
+s mm8.chr2 33141368 78 + 181976762 GT----CCAGCATC--TTAGCTGGGATGAGAGCAGCCACA-CCCAT-CCCAGCTCTGACAGAT-------------------GTTATATATAGTTATTAAGC--AGT
+
+a score=128280.0
+s hg18.chr9 11484174 115 - 140273252 gctttgtacaggcaccgcgctaagttcttacatgcccactgtaaggtaaaagc---------tatgacttccaccccccgccaactttacacatgagaaaatcaaggcataaagaaaatacatg
+s panTro2.chr9 11747016 115 - 138509991 gctttgtacaggcaccgtactaagttcttacatgcccactgtaaggtaaaagc---------tatgatttccaccccccgccaactttacacatgagaaaatcaaggcataaagaaaatacatg
+s mm8.chr2 33141283 85 + 181976762 ---------------------------CTGGGTAGCTGCTGTGAGTTcaaaacaaaacaaaacaaaaTCACATCTC-------CCAT---GCACAAGGAAACTATAAGATAATGAGTAAGGA--
+
+a score=175099.0
+s hg18.chr9 11484116 58 - 140273252 ACAGTGCCTATTCAAACTATACATTGGTGAaatgatagccacgcatgactaggagctt
+s panTro2.chr9 11746958 58 - 138509991 ACAGTGCCTATTCAAACTATACACTGGTGAaatgatagccacgcatgactaggagctt
+s mm8.chr2 33141234 49 + 181976762 ACAGAGCCAGCTCAGACTGAGCAGCAG-----CAATAACCACAAATGACTGACA----
+
+a score=294709.0
+s hg18.chr9 128882427 96 + 140273252 aacacattgcttgttgtaaaaattattcacactgaaaagaagtttataaagtaaaaagtgaatgtgccattcttcttctcccactttccagaggca
+s panTro2.chr9 126860344 91 + 138509991 AACACATTGCTTGTTGTAAAAATTATTCACACT-----GAAGTTTATAAAGTAAAAAGTGAATGTGCCATTATTCTTCTCCCACTTTCCAGAGGCA
+i panTro2.chr9 C 0 C 0
+s mm8.chr2 148901693 74 - 181976762 -------------CTGTGGAGATCATCCACATTACAAAGAAGTCTATAAAGTAAAATGTGAAAGT--CGCTCTGCCCCTCC-------CTCCGGCG
+i mm8.chr2 C 0 C 0
+
+a score=-107864.0
+s hg18.chr9 11336020 3 - 140273252 ACT
+s panTro2.chr9 11593518 3 - 138509991 ACT
+s mm8.chr2 33023385 3 + 181976762 ACT
+
+a score=-82513.0
+s hg18.chr9 11335985 35 - 140273252 ACGTGTCAATCTCCCTCCCCAAAGAGGGAGAGAGG
+s panTro2.chr9 11593483 35 - 138509991 GCGTGTCAATCTCCCTCCCCAGAGAGGGAGAGAGG
+s mm8.chr2 33023361 24 + 181976762 ---------TCTTCCTTCCC--ACCAGGAGGGAGG
+
+a score=80475.0
+s hg18.chr9 11335945 40 - 140273252 ACCAGTTTCTATGTTCAATGTGACCCAAACTCCAGGGGCT
+s panTro2.chr9 11593443 40 - 138509991 ACCAGTTTCTATGTTCAATGTGACCCAAACTCCAGGAGCT
+s mm8.chr2 33023351 10 + 181976762 GCCTGCCTCT------------------------------
+
+a score=-9994.0
+s hg18.chr9 11335933 12 - 140273252 CTAGAA---------------------------ACAGCC
+s panTro2.chr9 11593431 12 - 138509991 CTAGAA---------------------------ACAGCC
+s mm8.chr2 33023313 38 + 181976762 -CAGAACAGTTTACGCTCCGTGAGACCTGCGGGCCAGCT
+
+a score=-18269.0
+s hg18.chr9 11335906 27 - 140273252 GAGTTTCTGCTTTCAGACATCTCTATA
+s panTro2.chr9 11593404 27 - 138509991 GGGTTTCTGCTTTCAGAAATCTCTATA
+s mm8.chr2 33023295 18 + 181976762 AAGCCTCTGCAG-CAGAAA--------
+
+a score=163495.0
+s hg18.chr9 11335807 99 - 140273252 ATGTGGGCCCATCTTGCAAGGGCCACAGAGACAGGAATGAGAGGGTGGAGCCCACTTCTTCCCAGATACTCAAGTCCTTCCAAGGCCTTGTGACCCCAT
+s panTro2.chr9 11593305 99 - 138509991 ATGTGGGCCCATCTTGCAAGGGCCACAGAGACAGGAATGAGAGGGTGGAGCCCACTTCTTCCCAGATACTCAAGTCCTTCCAAGGCCTTGTGACCCCAT
+s mm8.chr2 33023200 95 + 181976762 ATCTTGGTCT-CCTGGCAAGACCACAGAGAATTAGATAGTGAGAATGGACCCCACCTCTTCTCAGCGACCCAAGTCCACT---GTCCTACAGGCTTCCA
+
+a score=100797.0
+s hg18.chrX 122745047 18 + 154913754 accatcaagaaagtaaaa
+s panTro2.chrX 123190863 18 + 155361357 actatcaagaaagtaaaa
+i panTro2.chrX C 0 I 759
+
+a score=0.0
+s hg18.chrX 122745065 483 + 154913754 agacaacctacagaatgggagaaaatatttgcaaaccatatatctgacaagggacttttatctagaatgtataaccttaacattcaataatctttaaaaaaaaaaaagcccaatttgtttttttgtttttttttttgtttgttttttgttttttgtttttttttgagacggaggctcactctgtcacccaggctggagtgcagtggtgcgatctcagctcactgcaagctccgcctcccaggttcacgccattctcctgcctcagcctcccgagtagctgggactacaggcgcctgccaccacgcccagctaattttttgtatttttagtagagatggggtttcaccgtgttagccaggatggtctcgatctcctgacctcttgatctgcccaccttggcctcccaaagtgctgggattacaggtgagagccaccacgcccagccaaaaaaaaaagcccaattttcaaaaaggggcaaagggg
+
+a score=17937.0
+s hg18.chrX 122745548 189 + 154913754 ccgggcacggtggctcacgcctgtaatctcagcactttgggaggccaaggcagggggatcaggaggtcaggagttcgagaccagcctggccaaagcgaccagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaattagccgggcatggtggcagtacctgtaatcccagctactcg
+s panTro2.chrX 123191640 189 + 155361357 ccgggcacggtggctcacgcctgtaatctcagcactttgggaggccaaggcagggggatcaggaggtcaggagttcgagaccagcctggccaaagggaccagcctggccaacatggtgaaaccctgtctctactaaaaatacaaaaattagccgggcatggtggcagtacctgtaatcccagctactcg
+i panTro2.chrX I 759 C 0
+
+a score=88563.0
+s hg18.chrX 122745737 187 + 154913754 ggaggctgaggcaggagaattgcttgaacccaggaggcagaggttgcagtaagctgagattgccccattgcactccagcctgggcaacagagtgagactcctactcaaaaaaaaaaaaaaaaaaaa-gttggcggatgcggggacagcaaagggcttaagtagacatttcttcaaagaagatatacaa
+s panTro2.chrX 123191829 188 + 155361357 ggaggctgaggcaggagaattgcttgaacccaggaggcagaggttgcagtaagctgagattgccccattgcactccagcctgggcaacagagtgagactcctactcaaaaaaaaaaaaaaaaaaaaaGTTGGCAGATGCGGGGACAgcaaagggcttaagtagacatttcttcaaagaagatatacaa
+i panTro2.chrX C 0 C 0
+
+a score=60355.0
+s hg18.chrX 2264558 232 - 154913754 ctatctgggctcactgccagctccgcctcccgggttcacgccattcttctgcctcagcgtcccgagtagctgggactataggcgcccgccaccgcgcccggctaaatttttgtatttttagtagagatggggtttcaccctgttagccaggatggtctcgacctcctgacctcgtgatctgcccgcctcaccctcccaaagtgctgggatgccaggcgggagcccccgcgcc
+s panTro2.chrX 2180049 232 - 155361357 ctctctgggctcactgccagctctgcctcccgggttcatgccattcttctgcctcagcgtcccgagtagctgggactacaggcgcccgcccccgcgcccggctaaatttttgtatttttagtagagatggggtttcaccctgttagccaggatggtctcgacctcctgacctcgtgatctgcccgcctcaccctcccaaagtgctgggattacaggcgtgagccaccgtgcc
+
+a score=-54866.0
+s hg18.chrX 152691446 7 + 154913754 TCAGAAC
+s panTro2.chrX 153225439 7 + 155361357 TCAGAAC
+i panTro2.chrX C 0 C 0
+s mm8.chrX 70018668 2 + 165556469 -----GC
+i mm8.chrX C 0 C 0
+
+a score=-88144.0
+s hg18.chrX 152691453 18 + 154913754 CGGAGGGCCTTGGGCATG
+s mm8.chrX 70018670 18 + 165556469 TGGAGGGTCTTGAGGATG
+i mm8.chrX C 0 C 0
+s panTro2.chrX 153225446 18 + 155361357 CGGAGGGCCTTGGGCATG
+i panTro2.chrX C 0 C 0
+
+a score=2270241.0
+s hg18.chrX 2219694 31 - 154913754 AGGCCAACCTGCGTAGCATGAGCTTGGGGTT
+s panTro2.chrX 2133314 5 - 155361357 --------------------------GGGTT
+s mm8.chrX 95535223 31 - 165556469 AGGCCAACCTGCGTAACATGAGCTTGGGGTT
+
+a score=-439513.0
+s hg18.chrX 2219662 32 - 154913754 AAGCCCTCACCCCCGCCACCGGGTCCAGGTCA
+s mm8.chrX 95535191 32 - 165556469 AAGCCCCTGCCCCTGCCCCCACATTCAGGTCA
+
+a score=-528572.0
+s hg18.chrX 2219603 59 - 154913754 TGGCCCCACCCGCCCCTGGACAGAGCCCGCCCAGGGTGCGATGGGGGCAGGTCTGTGGC
+s mm8.chrX 95535133 58 - 165556469 TGGCTCCTGAC-CTCAGGGCCTGATCCCACACCACCTGTATTAGCAATGGGTCAGAGGT
+
+a score=-746000.0
+s hg18.chrX 2219540 63 - 154913754 CTTTGTGCCTGTGTCCCTGCTGAGGACATCTCACTTTCCTTCCC--CCCACCTGCTGGGGCTTCC
+s mm8.chrX 95535080 53 - 165556469 ------------GGCCCTGGTGAGGATAGTCCTCAGATCTTCTCTGAGCCCACTCCTGGAGTTCC
+
+a score=-199075.0
+s hg18.chrX 2219515 25 - 154913754 CGGGGAGCCGGCCACAGGGTCAGGC
+s mm8.chrX 95535063 17 - 165556469 TATGGAAGAAGCCCCAA--------
+
+a score=1368003.0
+s hg18.chrX 2219491 24 - 154913754 TTCTCCACCATGGTCTCTGTCCTG
+s mm8.chrX 95535039 24 - 165556469 TTCTCTACCATGGTCTCCGTCCTG
+
diff -r e7b9d15e8e93 -r ff37fcf14bd5 tools/maf/interval2maf.py
--- a/tools/maf/interval2maf.py Tue Sep 29 17:57:45 2009 -0400
+++ b/tools/maf/interval2maf.py Tue Sep 29 21:47:59 2009 -0400
@@ -80,6 +80,8 @@
split_blocks_by_species = True
if options.remove_all_gap_columns and options.remove_all_gap_columns == 'remove_all_gap_columns':
remove_all_gap_columns = True
+ else:
+ remove_all_gap_columns = True
#Finish parsing command line
#Open indexed access to MAFs
@@ -113,6 +115,8 @@
for block in blocks:
block = maf_utilities.chop_block_by_region( block, src, region )
if block is not None:
+ if species is not None:
+ block = block.limit_to_species( species )
block = maf_utilities.orient_block_by_region( block, src, region )
if remove_all_gap_columns:
block.remove_all_gap_columns()
diff -r e7b9d15e8e93 -r ff37fcf14bd5 tools/maf/interval2maf.xml
--- a/tools/maf/interval2maf.xml Tue Sep 29 17:57:45 2009 -0400
+++ b/tools/maf/interval2maf.xml Tue Sep 29 21:47:59 2009 -0400
@@ -88,6 +88,14 @@
<param name="split_blocks_by_species" value="dont_split_blocks_by_species"/>
<output name="out_file1" file="fsa_interval2maf.dat" />
</test>
+ <test>
+ <param name="input1" value="1.bed" dbkey="hg18" ftype="bed"/>
+ <param name="maf_source" value="cached"/>
+ <param name="mafType" value="28_WAY_MULTIZ_hg18"/>
+ <param name="species" value="hg18,panTro2,mm8"/>
+ <param name="split_blocks_by_species" value="dont_split_blocks_by_species"/>
+ <output name="out_file1" file="interval2maf_3from28way.maf" />
+ </test>
</tests>
<help>
**What it does**
1
0