Skip to content

Commit

Permalink
fix and change around perl HashStore stream-sorting code; results in …
Browse files Browse the repository at this point in the history
…a big (50%) speedup of generate-names.pl.
  • Loading branch information
rbuels committed Jan 21, 2013
1 parent 8b93c99 commit c00fea7
Show file tree
Hide file tree
Showing 18 changed files with 125 additions and 76 deletions.
16 changes: 9 additions & 7 deletions bin/generate-names.pl
Expand Up @@ -186,6 +186,7 @@ =head1 OPTIONS
push @tracksWithNames, $track;
}
push @namerecord_buffer, [
lc $alias,
$alias,
$trackHash{$track},
@{$nameinfo}[2..$#{$nameinfo}]
Expand All @@ -196,11 +197,11 @@ =head1 OPTIONS
};

# sort the stream by hash key to improve cache locality
$record_stream = $nameStore->sort_stream( $record_stream );
my $entry_stream = $nameStore->sort_stream( $record_stream );

# now write it to the store
while( my $record = $record_stream->() ) {
insert( $nameStore, $record );
while( my $entry = $entry_stream->() ) {
insert( $nameStore, $entry );
}

# store the list of tracks that have names
Expand Down Expand Up @@ -249,16 +250,17 @@ sub find_names_files {
}

sub insert {
my ( $store, $record ) = @_;
my ( $store, $entry ) = @_;

my $record = $entry->data;
my $lc = shift @$record;
my $name = $record->[0];
my $lc = lc $name;

{ # store the exact name match
my $r = $store->get( $lc ) || { exact => [], prefix => [] };
my $r = $entry->get || { exact => [], prefix => [] };
if( $max_locations && @{ $r->{exact} } < $max_locations ) {
push @{ $r->{exact} }, $record;
$store->set( $lc, $r );
$entry->set( $r );
}
elsif( $verbose ) {
#print STDERR "Warning: $name has more than --locationLimit ($max_locations) distinct locations, not all of them will be indexed.\n";
Expand Down
59 changes: 53 additions & 6 deletions src/perl5/Bio/JBrowse/HashStore.pm
Expand Up @@ -64,7 +64,8 @@ sub open {
$self->{file_extension} = '.json';

$self->{bucket_cache} = Cache::Ref::FIFO->new( size => 2000 );
$self->{bucket_path_cache} = Cache::Ref::FIFO->new( size => 200_000 );
$self->{bucket_path_cache_by_key} = Cache::Ref::FIFO->new( size => 200_000 );
$self->{bucket_path_cache_by_hash} = Cache::Ref::FIFO->new( size => 200_000 );

return bless $self, $class;
}
Expand Down Expand Up @@ -120,9 +121,11 @@ sub set {

=head2 sort_stream( $data_stream )
Given a data stream (sub that returns arrayrefs of [ key, ... ] when
called repeatedly), returns another data stream that returns the
arrayrefs in order of their hash bucket numbers.
Given a data stream (sub that returns arrayrefs of [ key, (any amount
of other data) ] when called repeatedly), returns another stream that
emits small objects that can be used to get and set the contents of
the name store at that key ( $entry->get and $entry->set( $value ) )
and will return the original data you passed if you call $entry->data.
Using this can greatly speed up bulk operations on the hash store,
because it allows the internal caches of the HashStore to operate at
Expand Down Expand Up @@ -150,7 +153,12 @@ sub sort_stream {

return sub {
my $d = $sorter->get or return;
return $d->[1];
return Bio::JBrowse::HashStore::Entry->new(
store => $self,
key => $d->[1][0],
data => $d->[1],
hex_hash => $d->[0]
);
};
}

Expand Down Expand Up @@ -188,7 +196,7 @@ sub _hexToPath {

sub _getBucket {
my ( $self, $key ) = @_;
my $pathinfo = $self->{bucket_path_cache}->compute( $key, sub { $self->_hexToPath( $self->_hexHash( $key ) ); } );
my $pathinfo = $self->{bucket_path_cache_by_key}->compute( $key, sub { $self->_hexToPath( $self->_hexHash( $key ) ); } );
return $self->{bucket_cache}->compute( $pathinfo->{fullpath}, sub { $self->_readBucket( $pathinfo ); } );
}

Expand Down Expand Up @@ -238,4 +246,43 @@ sub DESTROY {
$out->print( JSON::to_json( $self->{data} ) ) or die "$! writing to $self->{fullpath}";
}

package Bio::JBrowse::HashStore::Entry;

sub new {
my $class = shift;
bless { @_ }, $class;
}

sub get {
my ( $self ) = @_;
my $bucket = $self->_getBucket;
return $bucket->{data}{ $self->{key} };
}

sub set {
my ( $self, $value ) = @_;

my $bucket = $self->_getBucket;
$bucket->{data}{ $self->{key} } = $value;
$bucket->{dirty} = 1;
$self->{store}{meta}{last_changed_entry} = $self->{key};

return $value;
}

sub data {
$_[0]->{data};
}

sub store {
$_[0]->{store};
}

sub _getBucket {
my ( $self ) = @_;
my $store = $self->{store};
my $pathinfo = $store->{bucket_path_cache_by_hash}->compute( $self->{hex_hash}, sub { $store->_hexToPath( $self->{hex_hash} ); } );
return $store->{bucket_cache}->compute( $pathinfo->{fullpath}, sub { $store->_readBucket( $pathinfo ); } );
}

1;
2 changes: 1 addition & 1 deletion tests/data/volvox_formatted_names/names/0.json
@@ -1 +1 @@
{"seg04":{"exact":[["seg04",4,"seg04","ctgA",5232,5302],["seg04",4,"seg04","ctgA",5799,6101],["seg04",4,"seg04","ctgA",6441,6854],["seg04",4,"seg04","ctgA",7105,7211],["seg04",4,"seg04","ctgA",7694,8177],["seg04",4,"seg04","ctgA",8544,8783],["seg04",4,"seg04","ctgA",8868,8935],["seg04",4,"seg04","ctgA",9403,9825]],"prefix":[]},"protein:hgb":{"exact":[["Protein:HGB",1,"Protein:HGB","ctgA",1799,2900]],"prefix":[]},"apple":{"exact":[],"prefix":["Apple1","Apple3","Apple2"]},"eden.2":{"exact":[["EDEN.2",6,"EDEN.2","ctgA",1049,9000]],"prefix":[]},"m15":{"exact":[["m15",3,"m15","ctgA",37496,40559]],"prefix":[]},"f05":{"exact":[["f05",0,"f05","ctgB",4714,5968],["f05",0,"f05","ctgA",4714,5968]],"prefix":[]},"fa":{"exact":[],"prefix":["FakeSNP"]},"protein:h":{"exact":[],"prefix":["Protein:HGA","Protein:HGB"]},"b1":{"exact":[],"prefix":["b101.2"]},"f":{"exact":[],"prefix":["f05","f15","f12","f02","f13","f03","f04","f14","f11","f01","FakeSNP","f06","f09","f07","f08",{"name":"too many matches","hitLimit":1}]},"agt":{"exact":[],"prefix":["agt767.5","agt221.3","agt830.3","agt221.5","agt767.3","agt830.5"]}}
{"seg04":{"exact":[["seg04",4,"seg04","ctgA",5232,5302],["seg04",4,"seg04","ctgA",5799,6101],["seg04",4,"seg04","ctgA",6441,6854],["seg04",4,"seg04","ctgA",7105,7211],["seg04",4,"seg04","ctgA",7694,8177],["seg04",4,"seg04","ctgA",8544,8783],["seg04",4,"seg04","ctgA",8868,8935],["seg04",4,"seg04","ctgA",9403,9825]],"prefix":[]},"protein:hgb":{"exact":[["Protein:HGB",1,"Protein:HGB","ctgA",1799,2900]],"prefix":[]},"apple":{"exact":[],"prefix":["Apple1","Apple2","Apple3"]},"eden.2":{"exact":[["EDEN.2",6,"EDEN.2","ctgA",1049,9000]],"prefix":[]},"m15":{"exact":[["m15",3,"m15","ctgA",37496,40559]],"prefix":[]},"f05":{"exact":[["f05",0,"f05","ctgB",4714,5968],["f05",0,"f05","ctgA",4714,5968]],"prefix":[]},"fa":{"exact":[],"prefix":["FakeSNP"]},"protein:h":{"exact":[],"prefix":["Protein:HGB","Protein:HGA"]},"b1":{"exact":[],"prefix":["b101.2"]},"f":{"exact":[],"prefix":["f05","f15","f12","f02","f13","f03","f04","f14","f11","f01","f06","f09","f07","f08","f10",{"name":"too many matches","hitLimit":1}]},"agt":{"exact":[],"prefix":["agt767.5","agt221.3","agt830.3","agt221.5","agt767.3","agt830.5"]}}
2 changes: 1 addition & 1 deletion tests/data/volvox_formatted_names/names/1.json
@@ -1 +1 @@
{"p":{"exact":[],"prefix":["Protein:HGA","Protein:HGB"]},"f15":{"exact":[["f15",0,"f15","ctgA",22131,24633]],"prefix":[]},"agt767.5":{"exact":[["agt767.5",10,"agt767.5","ctgA",1149,7200]],"prefix":[]},"seg14":{"exact":[["seg14",4,"seg14","ctgA",41136,41318],["seg14",4,"seg14","ctgA",41753,41948],["seg14",4,"seg14","ctgA",42056,42474],["seg14",4,"seg14","ctgA",42889,43270],["seg14",4,"seg14","ctgA",43394,43811],["seg14",4,"seg14","ctgA",44064,44556],["seg14",4,"seg14","ctgA",44762,45030],["seg14",4,"seg14","ctgA",45230,45488],["seg14",4,"seg14","ctgA",45789,46022],["seg14",4,"seg14","ctgA",46091,46318],["seg14",4,"seg14","ctgA",46815,46992],["seg14",4,"seg14","ctgA",47448,47829]],"prefix":[]},"m05":{"exact":[["m05",3,"m05","ctgA",13800,14007]],"prefix":[]},"agt221.3":{"exact":[["agt221.3",10,"agt221.3","ctgA",7499,8000]],"prefix":[]}}
{"f15":{"exact":[["f15",0,"f15","ctgA",22131,24633]],"prefix":[]},"ctgB":{"exact":[[6079,"ctgB",null,0,6079,20000]],"prefix":[]},"p":{"exact":[],"prefix":["Protein:HGB","Protein:HGA"]},"agt767.5":{"exact":[["agt767.5",10,"agt767.5","ctgA",1149,7200]],"prefix":[]},"seg14":{"exact":[["seg14",4,"seg14","ctgA",41136,41318],["seg14",4,"seg14","ctgA",41753,41948],["seg14",4,"seg14","ctgA",42056,42474],["seg14",4,"seg14","ctgA",42889,43270],["seg14",4,"seg14","ctgA",43394,43811],["seg14",4,"seg14","ctgA",44064,44556],["seg14",4,"seg14","ctgA",44762,45030],["seg14",4,"seg14","ctgA",45230,45488],["seg14",4,"seg14","ctgA",45789,46022],["seg14",4,"seg14","ctgA",46091,46318],["seg14",4,"seg14","ctgA",46815,46992],["seg14",4,"seg14","ctgA",47448,47829]],"prefix":[]},"m05":{"exact":[["m05",3,"m05","ctgA",13800,14007]],"prefix":[]},"agt221.3":{"exact":[["agt221.3",10,"agt221.3","ctgA",7499,8000]],"prefix":[]}}
2 changes: 1 addition & 1 deletion tests/data/volvox_formatted_names/names/2.json
@@ -1 +1 @@
{"f0":{"exact":[],"prefix":["f05","f02","f03","f04","f01","f06","f09","f07","f08"]},"ctg":{"exact":[],"prefix":["ctgB","ctgA"]},"ag":{"exact":[],"prefix":["agt767.5","agt221.3","agt830.3","agt221.5","agt767.3","agt830.5"]},"protein":{"exact":[],"prefix":["Protein:HGA","Protein:HGB"]},"f12":{"exact":[["f12",0,"f12","ctgA",49757,50000]],"prefix":[]},"m02":{"exact":[["m02",3,"m02","ctgA",28331,30033]],"prefix":[]},"b10":{"exact":[],"prefix":["b101.2"]},"seg":{"exact":[],"prefix":["seg04","seg14","seg13","seg03","seg12","seg02","seg05","seg15","seg10","seg07","seg08","seg06","seg09","seg11","seg01"]},"agt830.3":{"exact":[["agt830.3",10,"agt830.3","ctgA",5409,7503]],"prefix":[]},"seg13":{"exact":[["seg13",4,"seg13","ctgA",49405,49476],["seg13",4,"seg13","ctgA",49761,50000]],"prefix":[]},"agt7":{"exact":[],"prefix":["agt767.5","agt767.3"]}}
{"f0":{"exact":[],"prefix":["f05","f02","f03","f04","f01","f06","f09","f07","f08"]},"ctg":{"exact":[],"prefix":["6079","50001"]},"ag":{"exact":[],"prefix":["agt767.5","agt221.3","agt830.3","agt221.5","agt767.3","agt830.5"]},"protein":{"exact":[],"prefix":["Protein:HGB","Protein:HGA"]},"f12":{"exact":[["f12",0,"f12","ctgA",49757,50000]],"prefix":[]},"m02":{"exact":[["m02",3,"m02","ctgA",28331,30033]],"prefix":[]},"b10":{"exact":[],"prefix":["b101.2"]},"seg":{"exact":[],"prefix":["seg04","seg14","seg13","seg03","seg12","seg02","seg05","seg15","seg10","seg07","seg08","seg06","seg09","seg11","seg01"]},"agt830.3":{"exact":[["agt830.3",10,"agt830.3","ctgA",5409,7503]],"prefix":[]},"seg13":{"exact":[["seg13",4,"seg13","ctgA",49405,49476],["seg13",4,"seg13","ctgA",49761,50000]],"prefix":[]},"agt7":{"exact":[],"prefix":["agt767.5","agt767.3"]}}
2 changes: 1 addition & 1 deletion tests/data/volvox_formatted_names/names/3.json
@@ -1 +1 @@
{"fakes":{"exact":[],"prefix":["FakeSNP"]},"a":{"exact":[],"prefix":["agt767.5","agt221.3","agt830.3","agt221.5","agt767.3","Apple1","agt830.5","Apple3","Apple2"]},"f02":{"exact":[["f02",0,"f02","ctgA",24561,28338]],"prefix":[]},"gene":{"exact":[],"prefix":["Gene:hgb","Gene:hga"]},"prot":{"exact":[],"prefix":["Protein:HGA","Protein:HGB"]},"apple1":{"exact":[["Apple1",7,"Apple1","ctgA",9999,11500]],"prefix":[]},"agt767.":{"exact":[],"prefix":["agt767.5","agt767.3"]},"agt8":{"exact":[],"prefix":["agt830.3","agt830.5"]},"m12":{"exact":[["m12",3,"m12","ctgA",21747,25612]],"prefix":[]},"gene:hg":{"exact":[],"prefix":["Gene:hgb","Gene:hga"]},"ctga":{"exact":[["ctgA",50001,"ctgA",null,0,50001,20000]],"prefix":[]},"seg03":{"exact":[["seg03",4,"seg03","ctgA",6884,7241],["seg03",4,"seg03","ctgA",7409,7737],["seg03",4,"seg03","ctgA",8054,8080],["seg03",4,"seg03","ctgA",8305,8999]],"prefix":[]}}
{"fakes":{"exact":[],"prefix":["FakeSNP"]},"a":{"exact":[],"prefix":["agt767.5","agt221.3","agt830.3","Apple1","agt221.5","agt767.3","agt830.5","Apple2","Apple3"]},"f02":{"exact":[["f02",0,"f02","ctgA",24561,28338]],"prefix":[]},"gene":{"exact":[],"prefix":["Gene:hgb","Gene:hga"]},"prot":{"exact":[],"prefix":["Protein:HGB","Protein:HGA"]},"apple1":{"exact":[["Apple1",7,"Apple1","ctgA",9999,11500]],"prefix":[]},"agt767.":{"exact":[],"prefix":["agt767.5","agt767.3"]},"agt8":{"exact":[],"prefix":["agt830.3","agt830.5"]},"m12":{"exact":[["m12",3,"m12","ctgA",21747,25612]],"prefix":[]},"gene:hg":{"exact":[],"prefix":["Gene:hgb","Gene:hga"]},"seg03":{"exact":[["seg03",4,"seg03","ctgA",6884,7241],["seg03",4,"seg03","ctgA",7409,7737],["seg03",4,"seg03","ctgA",8054,8080],["seg03",4,"seg03","ctgA",8305,8999]],"prefix":[]}}
2 changes: 1 addition & 1 deletion tests/data/volvox_formatted_names/names/5.json
@@ -1 +1 @@
{"seg02":{"exact":[["seg02",4,"seg02","ctgA",26121,26126],["seg02",4,"seg02","ctgA",26496,26869],["seg02",4,"seg02","ctgA",27200,27325],["seg02",4,"seg02","ctgA",27371,27433],["seg02",4,"seg02","ctgA",27564,27565],["seg02",4,"seg02","ctgA",27812,28091],["seg02",4,"seg02","ctgA",28092,28201],["seg02",4,"seg02","ctgA",28328,28377],["seg02",4,"seg02","ctgA",28828,29194],["seg02",4,"seg02","ctgA",29516,29702],["seg02",4,"seg02","ctgA",29712,30061],["seg02",4,"seg02","ctgA",30328,30774],["seg02",4,"seg02","ctgA",30807,31306],["seg02",4,"seg02","ctgA",31515,31729],["seg02",4,"seg02","ctgA",31752,32154],["seg02",4,"seg02","ctgA",32594,32696],["seg02",4,"seg02","ctgA",32891,32901],["seg02",4,"seg02","ctgA",33126,33388],["seg02",4,"seg02","ctgA",33438,33443],["seg02",4,"seg02","ctgA",33758,34209],["seg02",4,"seg02","ctgA",34400,34466]],"prefix":[]},"protein:hg":{"exact":[],"prefix":["Protein:HGA","Protein:HGB"]},"ap":{"exact":[],"prefix":["Apple1","Apple3","Apple2"]},"m13":{"exact":[["m13",3,"m13","ctgA",17666,17690]],"prefix":[]},"f03":{"exact":[["f03",0,"f03","ctgA",36648,40440]],"prefix":[]},"agt767":{"exact":[],"prefix":["agt767.5","agt767.3"]}}
{"seg02":{"exact":[["seg02",4,"seg02","ctgA",26121,26126],["seg02",4,"seg02","ctgA",26496,26869],["seg02",4,"seg02","ctgA",27200,27325],["seg02",4,"seg02","ctgA",27371,27433],["seg02",4,"seg02","ctgA",27564,27565],["seg02",4,"seg02","ctgA",27812,28091],["seg02",4,"seg02","ctgA",28092,28201],["seg02",4,"seg02","ctgA",28328,28377],["seg02",4,"seg02","ctgA",28828,29194],["seg02",4,"seg02","ctgA",29516,29702],["seg02",4,"seg02","ctgA",29712,30061],["seg02",4,"seg02","ctgA",30328,30774],["seg02",4,"seg02","ctgA",30807,31306],["seg02",4,"seg02","ctgA",31515,31729],["seg02",4,"seg02","ctgA",31752,32154],["seg02",4,"seg02","ctgA",32594,32696],["seg02",4,"seg02","ctgA",32891,32901],["seg02",4,"seg02","ctgA",33126,33388],["seg02",4,"seg02","ctgA",33438,33443],["seg02",4,"seg02","ctgA",33758,34209],["seg02",4,"seg02","ctgA",34400,34466]],"prefix":[]},"m13":{"exact":[["m13",3,"m13","ctgA",17666,17690]],"prefix":[]},"ap":{"exact":[],"prefix":["Apple1","Apple2","Apple3"]},"protein:hg":{"exact":[],"prefix":["Protein:HGB","Protein:HGA"]},"f03":{"exact":[["f03",0,"f03","ctgA",36648,40440]],"prefix":[]},"agt767":{"exact":[],"prefix":["agt767.5","agt767.3"]}}
2 changes: 1 addition & 1 deletion tests/data/volvox_formatted_names/names/6.json
@@ -1 +1 @@
{"eden.3":{"exact":[["EDEN.3",6,"EDEN.3","ctgA",1299,9000]],"prefix":[]},"m14":{"exact":[["m14",3,"m14","ctgA",14730,17239]],"prefix":[]},"remar":{"exact":[],"prefix":["Remark:hga"]},"remark:hga":{"exact":[["Remark:hga",0,"Remark:hga","ctgA",999,2000]],"prefix":[]},"g":{"exact":[],"prefix":["Gene:hgb","Gene:hga"]},"seg05":{"exact":[["seg05",4,"seg05","ctgA",26502,26799],["seg05",4,"seg05","ctgA",27171,27185],["seg05",4,"seg05","ctgA",27447,27860],["seg05",4,"seg05","ctgA",27886,28076],["seg05",4,"seg05","ctgA",28224,28316],["seg05",4,"seg05","ctgA",28776,29058],["seg05",4,"seg05","ctgA",29512,29647],["seg05",4,"seg05","ctgA",30107,30216],["seg05",4,"seg05","ctgA",30464,30798],["seg05",4,"seg05","ctgA",31231,31236],["seg05",4,"seg05","ctgA",31420,31817],["seg05",4,"seg05","ctgA",32009,32057],["seg05",4,"seg05","ctgA",32207,32680],["seg05",4,"seg05","ctgA",33052,33325],["seg05",4,"seg05","ctgA",33437,33868],["seg05",4,"seg05","ctgA",34243,34313],["seg05",4,"seg05","ctgA",34604,34983],["seg05",4,"seg05","ctgA",35332,35507],["seg05",4,"seg05","ctgA",35641,35904]],"prefix":[]},"fak":{"exact":[],"prefix":["FakeSNP"]},"f04":{"exact":[["f04",0,"f04","ctgA",37241,38653]],"prefix":[]}}
{"m14":{"exact":[["m14",3,"m14","ctgA",14730,17239]],"prefix":[]},"remar":{"exact":[],"prefix":["Remark:hga"]},"fak":{"exact":[],"prefix":["FakeSNP"]},"eden.3":{"exact":[["EDEN.3",6,"EDEN.3","ctgA",1299,9000]],"prefix":[]},"remark:hga":{"exact":[["Remark:hga",0,"Remark:hga","ctgA",999,2000]],"prefix":[]},"g":{"exact":[],"prefix":["Gene:hgb","Gene:hga"]},"seg05":{"exact":[["seg05",4,"seg05","ctgA",26502,26799],["seg05",4,"seg05","ctgA",27171,27185],["seg05",4,"seg05","ctgA",27447,27860],["seg05",4,"seg05","ctgA",27886,28076],["seg05",4,"seg05","ctgA",28224,28316],["seg05",4,"seg05","ctgA",28776,29058],["seg05",4,"seg05","ctgA",29512,29647],["seg05",4,"seg05","ctgA",30107,30216],["seg05",4,"seg05","ctgA",30464,30798],["seg05",4,"seg05","ctgA",31231,31236],["seg05",4,"seg05","ctgA",31420,31817],["seg05",4,"seg05","ctgA",32009,32057],["seg05",4,"seg05","ctgA",32207,32680],["seg05",4,"seg05","ctgA",33052,33325],["seg05",4,"seg05","ctgA",33437,33868],["seg05",4,"seg05","ctgA",34243,34313],["seg05",4,"seg05","ctgA",34604,34983],["seg05",4,"seg05","ctgA",35332,35507],["seg05",4,"seg05","ctgA",35641,35904]],"prefix":[]},"f04":{"exact":[["f04",0,"f04","ctgA",37241,38653]],"prefix":[]}}
2 changes: 1 addition & 1 deletion tests/data/volvox_formatted_names/names/7.json
@@ -1 +1 @@
{"agt830.5":{"exact":[["agt830.5",10,"agt830.5","ctgA",1049,3202]],"prefix":[]},"agt22":{"exact":[],"prefix":["agt221.3","agt221.5"]},"f14":{"exact":[["f14",0,"f14","ctgA",23071,23185]],"prefix":[]},"seg15":{"exact":[["seg15",4,"seg15","ctgA",39264,39361],["seg15",4,"seg15","ctgA",39752,40034],["seg15",4,"seg15","ctgA",40514,40954],["seg15",4,"seg15","ctgA",41251,41365],["seg15",4,"seg15","ctgA",41491,41504],["seg15",4,"seg15","ctgA",41940,42377],["seg15",4,"seg15","ctgA",42747,42954],["seg15",4,"seg15","ctgA",43400,43897],["seg15",4,"seg15","ctgA",44042,44113],["seg15",4,"seg15","ctgA",44398,44888],["seg15",4,"seg15","ctgA",45280,45375],["seg15",4,"seg15","ctgA",45710,46041],["seg15",4,"seg15","ctgA",46424,46564],["seg15",4,"seg15","ctgA",46737,47087],["seg15",4,"seg15","ctgA",47328,47595],["seg15",4,"seg15","ctgA",47857,47979],["seg15",4,"seg15","ctgA",48168,48453]],"prefix":[]},"gene:hgb":{"exact":[["Gene:hgb",1,"Gene:hgb","ctgA",1599,3000]],"prefix":[]},"h":{"exact":[],"prefix":["hga","hgb"]},"remark:hg":{"exact":[],"prefix":["Remark:hga"]},"m04":{"exact":[["m04",3,"m04","ctgA",33324,35791]],"prefix":[]}}
{"agt830.5":{"exact":[["agt830.5",10,"agt830.5","ctgA",1049,3202]],"prefix":[]},"agt22":{"exact":[],"prefix":["agt221.3","agt221.5"]},"f14":{"exact":[["f14",0,"f14","ctgA",23071,23185]],"prefix":[]},"seg15":{"exact":[["seg15",4,"seg15","ctgA",39264,39361],["seg15",4,"seg15","ctgA",39752,40034],["seg15",4,"seg15","ctgA",40514,40954],["seg15",4,"seg15","ctgA",41251,41365],["seg15",4,"seg15","ctgA",41491,41504],["seg15",4,"seg15","ctgA",41940,42377],["seg15",4,"seg15","ctgA",42747,42954],["seg15",4,"seg15","ctgA",43400,43897],["seg15",4,"seg15","ctgA",44042,44113],["seg15",4,"seg15","ctgA",44398,44888],["seg15",4,"seg15","ctgA",45280,45375],["seg15",4,"seg15","ctgA",45710,46041],["seg15",4,"seg15","ctgA",46424,46564],["seg15",4,"seg15","ctgA",46737,47087],["seg15",4,"seg15","ctgA",47328,47595],["seg15",4,"seg15","ctgA",47857,47979],["seg15",4,"seg15","ctgA",48168,48453]],"prefix":[]},"h":{"exact":[],"prefix":["hga","hgb"]},"gene:hgb":{"exact":[["Gene:hgb",1,"Gene:hgb","ctgA",1599,3000]],"prefix":[]},"remark:hg":{"exact":[],"prefix":["Remark:hga"]},"m04":{"exact":[["m04",3,"m04","ctgA",33324,35791]],"prefix":[]}}

0 comments on commit c00fea7

Please sign in to comment.