Skip to content

Commit

Permalink
fix #441 use L3 feature instead to L1 as template to create features …
Browse files Browse the repository at this point in the history
…when transcript_id exists (#442)

* use L3  feature as template instead of L1 to be able to use proper transcript_id when converting to GTF

* when using clean_clone with clean_attributes, remove Parent and transcript_id attributes anyway when it is a level1 feature

* adapt tests and add test for issue 441

*  Optimize first test in "_check_l2_linked_to_l3" to see if an L1 feature already exists (check among all tags)
  • Loading branch information
Juke34 committed Mar 21, 2024
1 parent 6bff76e commit 2276eb6
Show file tree
Hide file tree
Showing 7 changed files with 144 additions and 72 deletions.
145 changes: 81 additions & 64 deletions lib/AGAT/OmniscientI.pm
Original file line number Diff line number Diff line change
Expand Up @@ -1706,14 +1706,21 @@ sub _check_l2_linked_to_l3{
#L3 linked directly to L1
my $has_l1_feature = undef;
my $id_l2_to_replace = undef;
foreach my $tag_l1 (keys %{$hash_omniscient->{'level1'}}){ # primary_tag_key_level1 = gene or repeat etc...

# ------------ Check for L1 features ------------

# Check if we have one l1 with that ID among all L1/tag tuples
foreach my $tag_l1 (keys %{$hash_omniscient->{'level1'}}){
if( exists_keys ($hash_omniscient, ('level1', $tag_l1, $id_l2))){
# case where it's linked by parent/ID attribute
$has_l1_feature = $hash_omniscient->{"level1"}{$tag_l1}{$id_l2};
last;
}
else{
}

# No l1_feature found yet, let's check if one L1 feature with the common tag
if (! $has_l1_feature){
foreach my $tag_l1 (sort {$a cmp $b} keys %{$hash_omniscient->{'level1'}}){
if(! $common_tag_in_l1 ){
$common_tag_in_l1 = _create_hash_common_tag_l1($hash_omniscient);
} # fill it (only once) because will be needed
Expand All @@ -1724,97 +1731,107 @@ sub _check_l2_linked_to_l3{
#check if we have the tag

foreach my $l3_feature (@{$hash_omniscient->{'level3'}{$tag_l3}{$id_l2}}){
print "fefe ".$l3_feature->gff_string()."\n";
if($l3_feature->has_tag($tag) ) {

print "has_tag $tag\n";
# case where it's linked by comon_tag attribute
if (exists_keys($common_tag_in_l1,( $tag, lc($l3_feature->_tag_value($tag)) ) ) ){
print "exists_keys\n";
if($#{$common_tag_in_l1->{$tag}{lc($l3_feature->_tag_value($tag))}} == 0){
my $id = $common_tag_in_l1->{$tag}{lc($l3_feature->_tag_value($tag))}[0]->{'id'};
my $ptag = $common_tag_in_l1->{$tag}{lc($l3_feature->_tag_value($tag))}[0]->{'ptag'};
$has_l1_feature = $hash_omniscient->{'level1'}{$ptag}{$id};
$id_l2_to_replace = $l3_feature->_tag_value('Parent');
print "goes into it !!!! $id_l2_to_replace \n";
last;
}
else{
dual_print($log, "\n\nSeveral potential L1 parent with comnon tag $tag with value ".lc($l3_feature->_tag_value($tag)).". We do not use any\n", 0);
dual_print($log, "\n\nSeveral potential L1 parent with comnon tag $tag with value ".lc($l3_feature->_tag_value($tag)).". We do not use any\n", $verbose);
}
}
}
if ($has_l1_feature){last;}
}
}
}
}

if ($has_l1_feature){

my $l1_ID = $has_l1_feature->_tag_value('ID');
my $has_gemoma_l2=undef;
foreach my $tag_l2 (keys %{$hash_omniscient->{'level2'}}){
if ( exists_keys($hash_omniscient,("level2", $tag_l2, lc($l1_ID))) ) {
# HERE we have seen there is a L2. We want to use it and modify it Only
# in case of GeMoMa issue #290
# to make the difference we check that no level3 feature is attached to the detected l2
$has_gemoma_l2=$tag_l2;
foreach my $l2_feature ( @{$hash_omniscient->{'level2'}{$tag_l2}{lc($l1_ID)} } ){
foreach my $tag_l3 (sort {$a cmp $b} keys %{$hash_omniscient->{'level3'}}){
if ( exists_keys($hash_omniscient,("level3", $tag_l3, lc($l2_feature->_tag_value('ID')))) ) {
# Level3 features was attached to the L2, we cannot play the GeMoMa case
# otherwise interfer with other cases (level_missing.t tests testF, testB2 and gff_syntax.t 37_test.gff)
$has_gemoma_l2=undef;
}
# l1_feature found
if ($has_l1_feature){

my $l1_ID = $has_l1_feature->_tag_value('ID');
my $has_gemoma_l2=undef;
foreach my $tag_l2 (keys %{$hash_omniscient->{'level2'}}){
if ( exists_keys($hash_omniscient,("level2", $tag_l2, lc($l1_ID))) ) {
# HERE we have seen there is a L2. We want to use it and modify it Only
# in case of GeMoMa issue #290
# to make the difference we check that no level3 feature is attached to the detected l2
$has_gemoma_l2=$tag_l2;
foreach my $l2_feature ( @{$hash_omniscient->{'level2'}{$tag_l2}{lc($l1_ID)} } ){
foreach my $tag_l3 (sort {$a cmp $b} keys %{$hash_omniscient->{'level3'}}){
if ( exists_keys($hash_omniscient,("level3", $tag_l3, lc($l2_feature->_tag_value('ID')))) ) {
# Level3 features was attached to the L2, we cannot play the GeMoMa case
# otherwise interfer with other cases (level_missing.t tests testF, testB2 and gff_syntax.t 37_test.gff)
$has_gemoma_l2=undef;
}
}
}
}
}

my $l2_feature;
if (! $has_gemoma_l2) {
#create a copy of the first mRNA feature;
my $primary_tag_l2;
if (exists_keys($hash_omniscient,("level3",'cds', $id_l2) ) ){
$primary_tag_l2 = 'mRNA';
} # guess mRNA
else{ $primary_tag_l2 = 'RNA' ;} #we cannot guess
$l2_feature = clean_clone( { omniscient => $hash_omniscient,
feature => $has_l1_feature,
new_primary_tag => $primary_tag_l2
} );

} else {
$l2_feature = @{$hash_omniscient->{"level2"}{$has_gemoma_l2}{lc($l1_ID)}}[0];
$id_l2_to_replace = $has_l1_feature->_tag_value('ID');
delete $mRNAGeneLink->{lc($l2_feature->_tag_value('ID'))}
}
my $l2_feature;
if (! $has_gemoma_l2) {
#create a copy of the first mRNA feature;
my $primary_tag_l2;
if (exists_keys($hash_omniscient,("level3",'cds', $id_l2) ) ){
$primary_tag_l2 = 'mRNA';
} # guess mRNA
else{ $primary_tag_l2 = 'RNA' ;} #we cannot guess

# Use a L3 feature as template (better as L1 see bug #441)
$l2_feature = clean_clone( { omniscient => $hash_omniscient,
feature => $hash_omniscient->{"level3"}{$tag_l3}{$id_l2}[0],
new_primary_tag => $primary_tag_l2,
new_id => $hash_omniscient->{"level3"}{$tag_l3}{$id_l2}[0]->_tag_value('Parent')
} );

} else {
$l2_feature = @{$hash_omniscient->{"level2"}{$has_gemoma_l2}{lc($l1_ID)}}[0];
$id_l2_to_replace = $has_l1_feature->_tag_value('ID');
delete $mRNAGeneLink->{lc($l2_feature->_tag_value('ID'))}
}

#Modify parent L2 (and L1 id if necessary)
create_or_replace_tag($l2_feature,'Parent', $l1_ID); #modify ID to replace by parent value
create_or_replace_tag($l2_feature,'ID', $id_l2_to_replace) if ($id_l2_to_replace); #modify ID to replace by parent value
check_level2_positions($hash_omniscient, $l2_feature);

if ( exists_keys ($hashID,('uid', lc($id_l2) ) ) ){ #the easiest is to modifiy the gene id

my $new_l1id = _check_uniq_id_feature($hash_omniscient, $hashID, $has_l1_feature); # to check if ID was already in used by level1 feature
create_or_replace_tag($l2_feature,'Parent', $new_l1id); #modify ID to replace by parent value
my $primary_tag_l1 =$has_l1_feature->primary_tag();
$hash_omniscient->{"level1"}{lc($primary_tag_l1)}{lc($new_l1id)} = delete $hash_omniscient->{"level1"}{lc($primary_tag_l1)}{lc($l1_ID)}; # now save it in omniscient
#fill the $mRNAGeneLink hash
$mRNAGeneLink->{ $id_l2 } = $new_l1id;
if ($has_gemoma_l2){
$hash_omniscient->{'level2'}{lc($l2_feature->primary_tag)}{lc($new_l1id)} = delete $hash_omniscient->{'level2'}{lc($l2_feature->primary_tag)}{lc($l1_ID)};
}
else {
push(@{$hash_omniscient->{"level2"}{lc($l2_feature->primary_tag)}{lc($new_l1id)}}, $l2_feature);
}
#Modify parent L2 (and L1 id if necessary)
create_or_replace_tag($l2_feature,'Parent', $l1_ID); #modify ID to replace by parent value
create_or_replace_tag($l2_feature,'ID', $id_l2_to_replace) if ($id_l2_to_replace); #modify ID to replace by parent value
check_level2_positions($hash_omniscient, $l2_feature);

if ( exists_keys ($hashID,('uid', lc($id_l2) ) ) ){ #the easiest is to modifiy the gene id

my $new_l1id = _check_uniq_id_feature($hash_omniscient, $hashID, $has_l1_feature); # to check if ID was already in used by level1 feature
create_or_replace_tag($l2_feature,'Parent', $new_l1id); #modify ID to replace by parent value
my $primary_tag_l1 =$has_l1_feature->primary_tag();
$hash_omniscient->{"level1"}{lc($primary_tag_l1)}{lc($new_l1id)} = delete $hash_omniscient->{"level1"}{lc($primary_tag_l1)}{lc($l1_ID)}; # now save it in omniscient
#fill the $mRNAGeneLink hash
$mRNAGeneLink->{ $id_l2 } = $new_l1id;
if ($has_gemoma_l2){
$hash_omniscient->{'level2'}{lc($l2_feature->primary_tag)}{lc($new_l1id)} = delete $hash_omniscient->{'level2'}{lc($l2_feature->primary_tag)}{lc($l1_ID)};
}
else{
#fill the $mRNAGeneLink hash
$mRNAGeneLink->{ $id_l2 } = $l1_ID; # Always need to keep track about l2->l1, else the method _check_l2_linked_to_l3 will recreate a l1 thinking this relationship is not fill
push(@{$hash_omniscient->{"level2"}{lc($l2_feature->primary_tag)}{lc($l1_ID)}}, $l2_feature);
else {
push(@{$hash_omniscient->{"level2"}{lc($l2_feature->primary_tag)}{lc($new_l1id)}}, $l2_feature);
}
dual_print($log, "L3 was directly linked to L1. Corrected by creating the intermediate L2 feature from L1 feature:\n".$l2_feature->gff_string()."\n", 0);
last
}
else{
#fill the $mRNAGeneLink hash
$mRNAGeneLink->{ $id_l2 } = $l1_ID; # Always need to keep track about l2->l1, else the method _check_l2_linked_to_l3 will recreate a l1 thinking this relationship is not fill
push(@{$hash_omniscient->{"level2"}{lc($l2_feature->primary_tag)}{lc($l1_ID)}}, $l2_feature);
}
dual_print($log, "L3 had a L1 feature but no L2 feature. Corrected by creating the intermediate L2 feature:\n".$l2_feature->gff_string()."\nUsing this feature template:\n".$hash_omniscient->{"level3"}{$tag_l3}{$id_l2}[0]->gff_string()."\n", $verbose);
last
}


# ------------ No L1 features found ------------
# it was not previous case (L3 linked directly to L1)
if (! exists_keys($mRNAGeneLink,($id_l2 ) ) ) {
# ---- start fill L2 ----
Expand Down
10 changes: 7 additions & 3 deletions lib/AGAT/OmniscientTool.pm
Original file line number Diff line number Diff line change
Expand Up @@ -1269,17 +1269,21 @@ sub clean_clone{
$cloned_feature->source_tag("AGAT");
# clean score
$cloned_feature->score(".");
# new primary tag
$cloned_feature->primary_tag($new_primary_tag) if $new_primary_tag;
# clean attributes
if ($clean_attributes){
my @tags = $cloned_feature->get_all_tags();
foreach my $tag (@tags){
if (lc($tag) ne "id" and lc($tag) ne "parent" and lc($tag) ne "gene_id" and lc($tag) ne "transcript_id"){
if ( lc($tag) ne "id" and lc($tag) ne "parent" and lc($tag) ne "gene_id" and lc($tag) ne "transcript_id" ){
$cloned_feature->remove_tag($tag);
}
if ( (lc($tag) eq "parent" or lc($tag) eq "transcript_id") and exists_keys($omniscient,("other","level","level1", lc($cloned_feature->primary_tag()) ) ) ){ # transcript_id and Parent attributes have to be removed for level1 feature anyway.
$cloned_feature->remove_tag($tag);
}
}
}
# new primary tag
$cloned_feature->primary_tag($new_primary_tag) if $new_primary_tag;

# remove Parent attribute if level1
if ($omniscient){
if ($cloned_feature->has_tag("Parent")){
Expand Down
16 changes: 14 additions & 2 deletions t/gff_other.t
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

use strict;
use warnings;
use Test::More tests => 5;
use Test::More tests => 6;

=head1 DESCRIPTION
Expand Down Expand Up @@ -80,4 +80,16 @@ system("$script --gff $input_folder/issue389.gff -o $pathtmp 2>&1 1>/dev/null");

#run test
ok( system("diff $pathtmp $correct_output") == 0, "issue389 check");
unlink $pathtmp;
unlink $pathtmp;

# --------- Issue 441 transccipt_id used for GTF while L2 L1 created from L3 with isoforms ----
$script = $script_prefix."bin/agat_convert_sp_gxf2gxf.pl";
$correct_output = "$output_folder/issue441.gtf";

system("$script_agat config --expose --output_format gtf 2>&1 1>/dev/null");
system("$script --g $input_folder/issue441.gtf -o $pathtmp 2>&1 1>/dev/null");

ok( system("diff $pathtmp $correct_output") == 0, "issue441 check");

unlink $pathtmp;
unlink $config;
16 changes: 16 additions & 0 deletions t/gff_other/in/issue441.gtf
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
Scaffold170 maker exon 2883887 2884591 . + . transcript_id "GBI_15721-RE"; gene_id "GBI_15721"; gene_name "GBI_15721";
Scaffold170 maker exon 2885735 2885878 . + . transcript_id "GBI_15721-RE"; gene_id "GBI_15721"; gene_name "GBI_15721";
Scaffold170 maker exon 2885953 2886162 . + . transcript_id "GBI_15721-RE"; gene_id "GBI_15721"; gene_name "GBI_15721";
Scaffold170 maker exon 2886451 2886531 . + . transcript_id "GBI_15721-RE"; gene_id "GBI_15721"; gene_name "GBI_15721";
Scaffold170 maker exon 2887224 2888594 . + . transcript_id "GBI_15721-RE"; gene_id "GBI_15721"; gene_name "GBI_15721";
Scaffold170 maker CDS 2884322 2884591 . + 0 transcript_id "GBI_15721-RE"; gene_id "GBI_15721"; gene_name "GBI_15721";
Scaffold170 maker CDS 2885735 2885878 . + 0 transcript_id "GBI_15721-RE"; gene_id "GBI_15721"; gene_name "GBI_15721";
Scaffold170 maker CDS 2885953 2886162 . + 0 transcript_id "GBI_15721-RE"; gene_id "GBI_15721"; gene_name "GBI_15721";
Scaffold170 maker CDS 2886451 2886531 . + 0 transcript_id "GBI_15721-RE"; gene_id "GBI_15721"; gene_name "GBI_15721";
Scaffold170 maker CDS 2887224 2887376 . + 0 transcript_id "GBI_15721-RE"; gene_id "GBI_15721"; gene_name "GBI_15721";
Scaffold170 maker exon 2887524 2887566 . + . transcript_id "GBI_15721-RF"; gene_id "GBI_15721"; gene_name "GBI_15721";
Scaffold170 maker exon 2887651 2887775 . + . transcript_id "GBI_15721-RF"; gene_id "GBI_15721"; gene_name "GBI_15721";
Scaffold170 maker exon 2887917 2888009 . + . transcript_id "GBI_15721-RF"; gene_id "GBI_15721"; gene_name "GBI_15721";
Scaffold170 maker CDS 2887524 2887566 . + 0 transcript_id "GBI_15721-RF"; gene_id "GBI_15721"; gene_name "GBI_15721";
Scaffold170 maker CDS 2887651 2887775 . + 2 transcript_id "GBI_15721-RF"; gene_id "GBI_15721"; gene_name "GBI_15721";
Scaffold170 maker CDS 2887917 2888009 . + 0 transcript_id "GBI_15721-RF"; gene_id "GBI_15721"; gene_name "GBI_15721";
23 changes: 23 additions & 0 deletions t/gff_other/out/issue441.gtf
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
##gtf-version X
# GFF-like GTF i.e. not checked against any GTF specification. Conversion based on GFF input, standardised by AGAT.
Scaffold170 AGAT gene 2883887 2888594 . + . gene_id "GBI_15721"; transcript_id "GBI_15721-RE"; ID "GBI_15721"; gene_name "GBI_15721";
Scaffold170 AGAT mRNA 2883887 2888594 . + . gene_id "GBI_15721"; transcript_id "GBI_15721-RE"; ID "GBI_15721-RE"; Parent "GBI_15721"; gene_name "GBI_15721";
Scaffold170 maker exon 2883887 2884591 . + . gene_id "GBI_15721"; transcript_id "GBI_15721-RE"; ID "agat-exon-1"; Parent "GBI_15721-RE"; gene_name "GBI_15721";
Scaffold170 maker exon 2885735 2885878 . + . gene_id "GBI_15721"; transcript_id "GBI_15721-RE"; ID "agat-exon-2"; Parent "GBI_15721-RE"; gene_name "GBI_15721";
Scaffold170 maker exon 2885953 2886162 . + . gene_id "GBI_15721"; transcript_id "GBI_15721-RE"; ID "agat-exon-3"; Parent "GBI_15721-RE"; gene_name "GBI_15721";
Scaffold170 maker exon 2886451 2886531 . + . gene_id "GBI_15721"; transcript_id "GBI_15721-RE"; ID "agat-exon-4"; Parent "GBI_15721-RE"; gene_name "GBI_15721";
Scaffold170 maker exon 2887224 2888594 . + . gene_id "GBI_15721"; transcript_id "GBI_15721-RE"; ID "agat-exon-5"; Parent "GBI_15721-RE"; gene_name "GBI_15721";
Scaffold170 maker CDS 2884322 2884591 . + 0 gene_id "GBI_15721"; transcript_id "GBI_15721-RE"; ID "agat-cds-1"; Parent "GBI_15721-RE"; gene_name "GBI_15721";
Scaffold170 maker CDS 2885735 2885878 . + 0 gene_id "GBI_15721"; transcript_id "GBI_15721-RE"; ID "agat-cds-2"; Parent "GBI_15721-RE"; gene_name "GBI_15721";
Scaffold170 maker CDS 2885953 2886162 . + 0 gene_id "GBI_15721"; transcript_id "GBI_15721-RE"; ID "agat-cds-3"; Parent "GBI_15721-RE"; gene_name "GBI_15721";
Scaffold170 maker CDS 2886451 2886531 . + 0 gene_id "GBI_15721"; transcript_id "GBI_15721-RE"; ID "agat-cds-4"; Parent "GBI_15721-RE"; gene_name "GBI_15721";
Scaffold170 maker CDS 2887224 2887376 . + 0 gene_id "GBI_15721"; transcript_id "GBI_15721-RE"; ID "agat-cds-5"; Parent "GBI_15721-RE"; gene_name "GBI_15721";
Scaffold170 AGAT five_prime_UTR 2883887 2884321 . + . gene_id "GBI_15721"; transcript_id "GBI_15721-RE"; ID "agat-five_prime_utr-1"; Parent "GBI_15721-RE"; gene_name "GBI_15721";
Scaffold170 AGAT three_prime_UTR 2887377 2888594 . + . gene_id "GBI_15721"; transcript_id "GBI_15721-RE"; ID "agat-three_prime_utr-1"; Parent "GBI_15721-RE"; gene_name "GBI_15721";
Scaffold170 AGAT mRNA 2887524 2888009 . + . gene_id "GBI_15721"; transcript_id "GBI_15721-RF"; ID "GBI_15721-RF"; Parent "GBI_15721"; gene_name "GBI_15721";
Scaffold170 maker exon 2887524 2887566 . + . gene_id "GBI_15721"; transcript_id "GBI_15721-RF"; ID "agat-exon-6"; Parent "GBI_15721-RF"; gene_name "GBI_15721";
Scaffold170 maker exon 2887651 2887775 . + . gene_id "GBI_15721"; transcript_id "GBI_15721-RF"; ID "agat-exon-7"; Parent "GBI_15721-RF"; gene_name "GBI_15721";
Scaffold170 maker exon 2887917 2888009 . + . gene_id "GBI_15721"; transcript_id "GBI_15721-RF"; ID "agat-exon-8"; Parent "GBI_15721-RF"; gene_name "GBI_15721";
Scaffold170 maker CDS 2887524 2887566 . + 0 gene_id "GBI_15721"; transcript_id "GBI_15721-RF"; ID "agat-cds-6"; Parent "GBI_15721-RF"; gene_name "GBI_15721";
Scaffold170 maker CDS 2887651 2887775 . + 2 gene_id "GBI_15721"; transcript_id "GBI_15721-RF"; ID "agat-cds-7"; Parent "GBI_15721-RF"; gene_name "GBI_15721";
Scaffold170 maker CDS 2887917 2888009 . + 0 gene_id "GBI_15721"; transcript_id "GBI_15721-RF"; ID "agat-cds-8"; Parent "GBI_15721-RF"; gene_name "GBI_15721";
4 changes: 2 additions & 2 deletions t/gff_syntax/out/37_correct_output.gff
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ xfSc0000000 protein_coding CDS 8675 8697 . - 2 ID=agat-cds-5;Parent=BL03703_cuf1
xfSc0000000 protein_coding CDS 9847 10147 . - 0 ID=agat-cds-4;Parent=BL03703_cuf1;exon_number=1;gene_id=BL03703;gene_name=CHRND;oldID=BlTCONS00149301;status=both;transcript_id=BL03703_cuf1
xfSc0000000 AGAT five_prime_UTR 10148 10149 . - . ID=agat-five_prime_utr-1;Parent=BL03703_cuf1;exon_number=1;gene_id=BL03703;gene_name=CHRND;oldID=BlTCONS00149301;status=both;transcript_id=BL03703_cuf1
xfSc0000000 AGAT three_prime_UTR 7096 8674 . - . ID=agat-three_prime_utr-1;Parent=BL03703_cuf1;exon_number=1;gene_id=BL03703;gene_name=CHRND;oldID=BlTCONS00149301;status=both;transcript_id=BL03703_cuf1
xfSc0000000 AGAT mRNA 12803 13319 . - . ID=BL03703_evm0;Parent=BL03703;exon_number=1;gene_id=BL03703;gene_name=CHRND;oldID=BlTCONS00149301;status=both;transcript_id=BL03703_cuf1
xfSc0000000 AGAT mRNA 12803 13319 . - . ID=BL03703_evm0;Parent=BL03703;exon_number=1;gene_id=BL03703;gene_name=CHRND;oldID=Blg02918.0;status=both;transcript_id=BL03703_evm0
xfSc0000000 protein_coding exon 12803 13024 . - . ID=agat-exon-3;Parent=BL03703_evm0;exon_number=2;gene_id=BL03703;gene_name=CHRND;oldID=Blg02918.0;status=both;transcript_id=BL03703_evm0
xfSc0000000 protein_coding exon 13283 13319 . - . ID=agat-exon-2;Parent=BL03703_evm0;exon_number=1;gene_id=BL03703;gene_name=CHRND;oldID=Blg02918.0;status=both;transcript_id=BL03703_evm0
xfSc0000000 protein_coding CDS 12803 13024 . - 2 ID=agat-cds-3;Parent=BL03703_evm0;exon_number=2;gene_id=BL03703;gene_name=CHRND;oldID=Blg02918.0;status=both;transcript_id=BL03703_evm0
xfSc0000000 protein_coding CDS 13283 13319 . - 0 ID=agat-cds-2;Parent=BL03703_evm0;exon_number=1;gene_id=BL03703;gene_name=CHRND;oldID=Blg02918.0;status=both;transcript_id=BL03703_evm0
xfSc0000000 AGAT RNA 7096 9184 . - . ID=BL03703_cuf0;Parent=BL03703;exon_number=1;gene_id=BL03703;gene_name=CHRND;oldID=BlTCONS00149301;status=both;transcript_id=BL03703_cuf1
xfSc0000000 AGAT RNA 7096 9184 . - . ID=BL03703_cuf0;Parent=BL03703;exon_number=1;gene_id=BL03703;gene_name=CHRND;oldID=BlTCONS00149300;status=both;transcript_id=BL03703_cuf0
xfSc0000000 protein_coding exon 7096 9184 . - . ID=agat-exon-4;Parent=BL03703_cuf0;exon_number=1;gene_id=BL03703;gene_name=CHRND;oldID=BlTCONS00149300;status=both;transcript_id=BL03703_cuf0
xfSc0000437 AGAT gene 3712 3937 . - . ID=BL03702;exon_number=2;gene_id=BL03702;gene_name=AHR;oldID=Blg03689.3;status=both;transcript_id=BL03702_evm3
xfSc0000437 AGAT mRNA 3712 3937 . - . ID=BL03702_evm3;Parent=BL03702;exon_number=2;gene_id=BL03702;gene_name=AHR;oldID=Blg03689.3;status=both;transcript_id=BL03702_evm3
Expand Down
Loading

0 comments on commit 2276eb6

Please sign in to comment.