Add the --with-taxon-at-rank option code to obiannotate

This commit is contained in:
2023-02-02 16:36:32 +01:00
parent 886c5118e3
commit 5639a09fb9
4 changed files with 45 additions and 9 deletions

View File

@ -33,7 +33,7 @@ func (taxon *TaxNode) TaxonAtRank(rank string) *TaxNode {
} }
} }
if taxon == taxon.pparent { if taxon == taxon.pparent && taxon.rank != rank {
taxon = nil taxon = nil
} }

View File

@ -12,26 +12,37 @@ import (
// If the taxon at the given rank doesn't exist for the taxonomy annotation // If the taxon at the given rank doesn't exist for the taxonomy annotation
// of the sequence, nothing happens. // of the sequence, nothing happens.
func (taxonomy *Taxonomy) SetTaxonAtRank(sequence *obiseq.BioSequence, rank string) *TaxNode { func (taxonomy *Taxonomy) SetTaxonAtRank(sequence *obiseq.BioSequence, rank string) *TaxNode {
var taxonAtRank *TaxNode
taxid := sequence.Taxid() taxid := sequence.Taxid()
taxon, err := taxonomy.Taxon(taxid) taxon, err := taxonomy.Taxon(taxid)
taxonAtRank := taxon.TaxonAtRank(rank) taxonAtRank = nil
if err == nil {
if err == nil && taxonAtRank != nil { taxonAtRank = taxon.TaxonAtRank(rank)
sequence.SetAttribute(rank, taxonAtRank.taxid) if taxonAtRank != nil {
sequence.SetAttribute(rank+"_name", taxonAtRank.scientificname) // log.Printf("Taxid: %d Rank: %s --> proposed : %d (%s)", taxid, rank, taxonAtRank.taxid, *(taxonAtRank.scientificname))
sequence.SetAttribute(rank, taxonAtRank.taxid)
sequence.SetAttribute(rank+"_name", *taxonAtRank.scientificname)
} else {
sequence.SetAttribute(rank, -1)
sequence.SetAttribute(rank+"_name", "NA")
}
} }
return taxonAtRank return taxonAtRank
} }
// Setting the species of a sequence.
func (taxonomy *Taxonomy) SetSpecies(sequence *obiseq.BioSequence) *TaxNode { func (taxonomy *Taxonomy) SetSpecies(sequence *obiseq.BioSequence) *TaxNode {
return taxonomy.SetTaxonAtRank(sequence, "species") return taxonomy.SetTaxonAtRank(sequence, "species")
} }
// Setting the genus of a sequence.
func (taxonomy *Taxonomy) SetGenus(sequence *obiseq.BioSequence) *TaxNode { func (taxonomy *Taxonomy) SetGenus(sequence *obiseq.BioSequence) *TaxNode {
return taxonomy.SetTaxonAtRank(sequence, "genus") return taxonomy.SetTaxonAtRank(sequence, "genus")
} }
// Setting the family of a sequence.
func (taxonomy *Taxonomy) SetFamily(sequence *obiseq.BioSequence) *TaxNode { func (taxonomy *Taxonomy) SetFamily(sequence *obiseq.BioSequence) *TaxNode {
return taxonomy.SetTaxonAtRank(sequence, "family") return taxonomy.SetTaxonAtRank(sequence, "family")
} }

View File

@ -3,6 +3,7 @@ package obiannotate
import ( import (
"git.metabarcoding.org/lecasofts/go/obitools/pkg/obiiter" "git.metabarcoding.org/lecasofts/go/obitools/pkg/obiiter"
"git.metabarcoding.org/lecasofts/go/obitools/pkg/obiseq" "git.metabarcoding.org/lecasofts/go/obitools/pkg/obiseq"
"git.metabarcoding.org/lecasofts/go/obitools/pkg/obitax"
"git.metabarcoding.org/lecasofts/go/obitools/pkg/obitools/obigrep" "git.metabarcoding.org/lecasofts/go/obitools/pkg/obitools/obigrep"
) )
@ -43,6 +44,17 @@ func RenameAttributeWorker(toBeRenamed map[string]string) obiseq.SeqWorker {
return f return f
} }
func AddTaxonAtRankWorker(taxonomy *obitax.Taxonomy, ranks ...string) obiseq.SeqWorker {
f := func(s *obiseq.BioSequence) *obiseq.BioSequence {
for _, r := range ranks {
taxonomy.SetTaxonAtRank(s,r)
}
return s
}
return f
}
func CLIAnnotationWorker() obiseq.SeqWorker { func CLIAnnotationWorker() obiseq.SeqWorker {
var annotator obiseq.SeqWorker var annotator obiseq.SeqWorker
annotator = nil annotator = nil
@ -62,6 +74,12 @@ func CLIAnnotationWorker() obiseq.SeqWorker {
annotator = annotator.ChainWorkers(w) annotator = annotator.ChainWorkers(w)
} }
if CLIHasTaxonAtRank() {
taxo := obigrep.CLILoadSelectedTaxonomy()
w := AddTaxonAtRankWorker(taxo,CLITaxonAtRank()...)
annotator = annotator.ChainWorkers(w)
}
return annotator return annotator
} }

View File

@ -112,12 +112,19 @@ func CLIHasToBeKeptAttributes() bool {
} }
func CLIToBeKeptAttributes() map[string]bool { func CLIToBeKeptAttributes() map[string]bool {
d := make(map[string]bool,len(_keepOnly)) d := make(map[string]bool, len(_keepOnly))
for _,v := range _keepOnly { for _, v := range _keepOnly {
d[v]=true d[v] = true
} }
return d return d
} }
func CLIHasTaxonAtRank() bool {
return len(_taxonAtRank) > 0
}
func CLITaxonAtRank() []string {
return _taxonAtRank
}