mirror of
https://github.com/metabarcoding/obitools4.git
synced 2025-06-29 16:20:46 +00:00
593 lines
12 KiB
Go
593 lines
12 KiB
Go
package obiformats
|
|
|
|
import (
|
|
"slices"
|
|
|
|
"git.metabarcoding.org/obitools/obitools4/obitools4/pkg/obidefault"
|
|
"git.metabarcoding.org/obitools/obitools4/obitools4/pkg/obiseq"
|
|
)
|
|
|
|
type __options__ struct {
|
|
fastseq_header_parser obiseq.SeqAnnotator
|
|
fastseq_header_writer BioSequenceFormater
|
|
seqBatchFormater FormatSeqBatch
|
|
with_progress_bar bool
|
|
buffer_size int
|
|
batch_size int
|
|
total_seq_size int
|
|
full_file_batch bool
|
|
parallel_workers int
|
|
no_order bool
|
|
closefile bool
|
|
appendfile bool
|
|
compressed bool
|
|
skip_empty bool
|
|
with_quality bool
|
|
csv_id bool
|
|
csv_sequence bool
|
|
csv_quality bool
|
|
csv_definition bool
|
|
csv_count bool
|
|
csv_taxon bool
|
|
csv_keys []string
|
|
csv_separator string
|
|
csv_navalue string
|
|
csv_auto bool
|
|
paired_filename string
|
|
source string
|
|
with_feature_table bool
|
|
with_pattern bool
|
|
with_parent bool
|
|
with_path bool
|
|
with_rank bool
|
|
with_taxid bool
|
|
with_scientific_name bool
|
|
raw_taxid bool
|
|
with_metadata []string
|
|
}
|
|
|
|
type Options struct {
|
|
pointer *__options__
|
|
}
|
|
|
|
type WithOption func(Options)
|
|
|
|
func MakeOptions(setters []WithOption) Options {
|
|
o := __options__{
|
|
fastseq_header_parser: ParseGuessedFastSeqHeader,
|
|
fastseq_header_writer: FormatFastSeqJsonHeader,
|
|
seqBatchFormater: nil,
|
|
with_progress_bar: false,
|
|
buffer_size: 2,
|
|
parallel_workers: obidefault.ReadParallelWorkers(),
|
|
batch_size: obidefault.BatchSize(),
|
|
total_seq_size: 1024 * 1024 * 100, // 100 MB by default
|
|
no_order: false,
|
|
full_file_batch: false,
|
|
closefile: false,
|
|
appendfile: false,
|
|
compressed: false,
|
|
skip_empty: false,
|
|
with_quality: true,
|
|
csv_id: true,
|
|
csv_definition: false,
|
|
csv_count: false,
|
|
csv_taxon: false,
|
|
csv_sequence: true,
|
|
csv_quality: false,
|
|
csv_separator: ",",
|
|
csv_navalue: "NA",
|
|
csv_keys: make([]string, 0),
|
|
csv_auto: false,
|
|
paired_filename: "",
|
|
source: "unknown",
|
|
with_feature_table: false,
|
|
with_pattern: true,
|
|
with_parent: false,
|
|
with_path: false,
|
|
with_rank: true,
|
|
with_taxid: true,
|
|
with_scientific_name: false,
|
|
raw_taxid: false,
|
|
}
|
|
|
|
opt := Options{&o}
|
|
|
|
for _, set := range setters {
|
|
set(opt)
|
|
}
|
|
|
|
return opt
|
|
}
|
|
|
|
func (opt Options) BatchSize() int {
|
|
return opt.pointer.batch_size
|
|
}
|
|
|
|
func (opt Options) TotalSeqSize() int {
|
|
return opt.pointer.total_seq_size
|
|
}
|
|
|
|
func (opt Options) FullFileBatch() bool {
|
|
return opt.pointer.full_file_batch
|
|
}
|
|
|
|
func (opt Options) ParallelWorkers() int {
|
|
return opt.pointer.parallel_workers
|
|
}
|
|
|
|
func (opt Options) ParseFastSeqHeader() obiseq.SeqAnnotator {
|
|
return opt.pointer.fastseq_header_parser
|
|
}
|
|
|
|
func (opt Options) FormatFastSeqHeader() func(*obiseq.BioSequence) string {
|
|
return opt.pointer.fastseq_header_writer
|
|
}
|
|
|
|
func (opt Options) SequenceFormater() FormatSeqBatch {
|
|
return opt.pointer.seqBatchFormater
|
|
}
|
|
|
|
func (opt Options) NoOrder() bool {
|
|
return opt.pointer.no_order
|
|
}
|
|
|
|
func (opt Options) ProgressBar() bool {
|
|
return opt.pointer.with_progress_bar
|
|
}
|
|
|
|
func (opt Options) CloseFile() bool {
|
|
return opt.pointer.closefile
|
|
}
|
|
|
|
func (opt Options) AppendFile() bool {
|
|
return opt.pointer.appendfile
|
|
}
|
|
|
|
func (opt Options) CompressedFile() bool {
|
|
return opt.pointer.compressed
|
|
}
|
|
|
|
func (opt Options) SkipEmptySequence() bool {
|
|
return opt.pointer.skip_empty
|
|
}
|
|
|
|
func (opt Options) ReadQualities() bool {
|
|
return opt.pointer.with_quality
|
|
}
|
|
|
|
func (opt Options) CSVId() bool {
|
|
return opt.pointer.csv_id
|
|
}
|
|
|
|
func (opt Options) CSVDefinition() bool {
|
|
return opt.pointer.csv_definition
|
|
}
|
|
|
|
func (opt Options) CSVCount() bool {
|
|
return opt.pointer.csv_count
|
|
}
|
|
|
|
func (opt Options) CSVTaxon() bool {
|
|
return opt.pointer.csv_taxon
|
|
}
|
|
|
|
func (opt Options) CSVSequence() bool {
|
|
return opt.pointer.csv_sequence
|
|
}
|
|
|
|
func (opt Options) CSVQuality() bool {
|
|
return opt.pointer.csv_quality
|
|
}
|
|
|
|
func (opt Options) CSVKeys() []string {
|
|
return opt.pointer.csv_keys
|
|
}
|
|
|
|
func (opt Options) CSVSeparator() string {
|
|
return opt.pointer.csv_separator
|
|
}
|
|
|
|
func (opt Options) CSVNAValue() string {
|
|
return opt.pointer.csv_navalue
|
|
}
|
|
|
|
func (opt Options) CSVAutoColumn() bool {
|
|
return opt.pointer.csv_auto
|
|
}
|
|
|
|
func (opt Options) HaveToSavePaired() bool {
|
|
return opt.pointer.paired_filename != ""
|
|
}
|
|
|
|
func (opt Options) PairedFileName() string {
|
|
return opt.pointer.paired_filename
|
|
}
|
|
|
|
func (opt Options) HasSource() bool {
|
|
return opt.pointer.source != ""
|
|
}
|
|
|
|
func (opt Options) Source() string {
|
|
return opt.pointer.source
|
|
}
|
|
|
|
func (opt Options) WithFeatureTable() bool {
|
|
return opt.pointer.with_feature_table
|
|
}
|
|
|
|
// WithPattern returns whether the pattern option is enabled.
|
|
// It retrieves the setting from the underlying options.
|
|
func (o *Options) WithPattern() bool {
|
|
return o.pointer.with_pattern
|
|
}
|
|
|
|
// WithParent returns whether the parent option is enabled.
|
|
// It retrieves the setting from the underlying options.
|
|
func (o *Options) WithParent() bool {
|
|
return o.pointer.with_parent
|
|
}
|
|
|
|
// WithPath returns whether the path option is enabled.
|
|
// It retrieves the setting from the underlying options.
|
|
func (o *Options) WithPath() bool {
|
|
return o.pointer.with_path
|
|
}
|
|
|
|
// WithRank returns whether the rank option is enabled.
|
|
// It retrieves the setting from the underlying options.
|
|
func (o *Options) WithRank() bool {
|
|
return o.pointer.with_rank
|
|
}
|
|
|
|
func (o *Options) WithTaxid() bool {
|
|
return o.pointer.with_taxid
|
|
}
|
|
|
|
// WithScientificName returns whether the scientific name option is enabled.
|
|
// It retrieves the setting from the underlying options.
|
|
func (o *Options) WithScientificName() bool {
|
|
return o.pointer.with_scientific_name
|
|
}
|
|
|
|
// RawTaxid returns whether the raw taxid option is enabled.
|
|
// It retrieves the setting from the underlying options.
|
|
func (o *Options) RawTaxid() bool {
|
|
return o.pointer.raw_taxid
|
|
}
|
|
|
|
// WithMetadata returns a slice of strings containing the metadata
|
|
// associated with the Options instance. It retrieves the metadata
|
|
// from the pointer's with_metadata field.
|
|
func (o *Options) WithMetadata() []string {
|
|
if o.WithPattern() {
|
|
idx := slices.Index(o.pointer.with_metadata, "query")
|
|
if idx >= 0 {
|
|
o.pointer.with_metadata = slices.Delete(o.pointer.with_metadata, idx, idx+1)
|
|
}
|
|
}
|
|
|
|
return o.pointer.with_metadata
|
|
}
|
|
|
|
func OptionCloseFile() WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.closefile = true
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionDontCloseFile() WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.closefile = false
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionsAppendFile(append bool) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.appendfile = append
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionNoOrder(no_order bool) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.no_order = no_order
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionsCompressed(compressed bool) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.compressed = compressed
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionsSkipEmptySequence(skip bool) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.skip_empty = skip
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionsReadQualities(read bool) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.with_quality = read
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionsNewFile() WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.appendfile = false
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionsFastSeqHeaderParser(parser obiseq.SeqAnnotator) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.fastseq_header_parser = parser
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionFastSeqDoNotParseHeader() WithOption {
|
|
return OptionsFastSeqHeaderParser(nil)
|
|
}
|
|
|
|
func OptionsFastSeqDefaultHeaderParser() WithOption {
|
|
return OptionsFastSeqHeaderParser(ParseGuessedFastSeqHeader)
|
|
}
|
|
|
|
// OptionsFastSeqHeaderFormat allows foor specifying the format
|
|
// used to write FASTA and FASTQ sequence.
|
|
func OptionsFastSeqHeaderFormat(format func(*obiseq.BioSequence) string) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.fastseq_header_writer = format
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionsSequenceFormater(formater FormatSeqBatch) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.seqBatchFormater = formater
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionsParallelWorkers(nworkers int) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.parallel_workers = nworkers
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionsBatchSize(size int) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.batch_size = size
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionsBatchSizeDefault(bp int) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.batch_size = bp
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionsFullFileBatch(full bool) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.full_file_batch = full
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionsSource(source string) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.source = source
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionsWithProgressBar() WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.with_progress_bar = true
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionsWithoutProgressBar() WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.with_progress_bar = false
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func WritePairedReadsTo(filename string) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.paired_filename = filename
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func CSVId(include bool) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.csv_id = include
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func CSVSequence(include bool) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.csv_sequence = include
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func CSVQuality(include bool) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.csv_quality = include
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func CSVDefinition(include bool) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.csv_definition = include
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func CSVCount(include bool) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.csv_count = include
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func CSVTaxon(include bool) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.csv_taxon = include
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func CSVKey(key string) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.csv_keys = append(opt.pointer.csv_keys, key)
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func CSVKeys(keys []string) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.csv_keys = append(opt.pointer.csv_keys, keys...)
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func CSVSeparator(separator string) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.csv_separator = separator
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func CSVNAValue(navalue string) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.csv_navalue = navalue
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func CSVAutoColumn(auto bool) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.csv_auto = auto
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func WithFeatureTable(with bool) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.with_feature_table = with
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionsWithPattern(value bool) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.with_pattern = value
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionsWithParent(value bool) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.with_parent = value
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionsWithPath(value bool) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.with_path = value
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionsWithRank(value bool) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.with_rank = value
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionsWithTaxid(value bool) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.with_taxid = value
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionsWithScientificName(value bool) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.with_scientific_name = value
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionsRawTaxid(value bool) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.raw_taxid = value
|
|
})
|
|
|
|
return f
|
|
}
|
|
|
|
func OptionsWithMetadata(values ...string) WithOption {
|
|
f := WithOption(func(opt Options) {
|
|
opt.pointer.with_metadata = values
|
|
})
|
|
return f
|
|
}
|