diff --git a/pkg/obingslibrary/multimatch.go b/pkg/obingslibrary/multimatch.go index b28befa..3d32942 100644 --- a/pkg/obingslibrary/multimatch.go +++ b/pkg/obingslibrary/multimatch.go @@ -777,7 +777,7 @@ func (library *NGSLibrary) ExtractMultiBarcodeSliceWorker(options ...WithOption) library.SetAllowsIndels(true) } - if opt.AllowedMismatches() > 0 { + if opt.AllowedMismatchesIsSet() { library.SetAllowedMismatches(opt.AllowedMismatches()) } diff --git a/pkg/obingslibrary/worker.go b/pkg/obingslibrary/worker.go index 2cfe391..75347f6 100644 --- a/pkg/obingslibrary/worker.go +++ b/pkg/obingslibrary/worker.go @@ -6,13 +6,14 @@ import ( ) type _Options struct { - discardErrors bool - unidentified string - allowedMismatch int - allowsIndel bool - withProgressBar bool - parallelWorkers int - batchSize int + discardErrors bool + unidentified string + allowedMismatch int + allowedMismatchSet bool + allowsIndel bool + withProgressBar bool + parallelWorkers int + batchSize int } // Options stores a set of option usable by the @@ -52,6 +53,7 @@ func OptionWithProgressBar(yes bool) WithOption { func OptionAllowedMismatches(count int) WithOption { f := WithOption(func(opt Options) { opt.pointer.allowedMismatch = count + opt.pointer.allowedMismatchSet = true }) return f @@ -97,6 +99,12 @@ func (options Options) AllowedMismatches() int { return options.pointer.allowedMismatch } +// AllowedMismatchesIsSet returns true if OptionAllowedMismatches +// was explicitly applied to these options. +func (options Options) AllowedMismatchesIsSet() bool { + return options.pointer.allowedMismatchSet +} + func (options Options) AllowsIndels() bool { return options.pointer.allowsIndel } diff --git a/pkg/obitools/obimultiplex/demultiplex.go b/pkg/obitools/obimultiplex/demultiplex.go index 064e4d5..996843b 100644 --- a/pkg/obitools/obimultiplex/demultiplex.go +++ b/pkg/obitools/obimultiplex/demultiplex.go @@ -15,7 +15,6 @@ func IExtractBarcode(iterator obiiter.IBioSequence) (obiiter.IBioSequence, error opts := make([]obingslibrary.WithOption, 0, 10) opts = append(opts, - obingslibrary.OptionAllowedMismatches(CLIAllowedMismatch()), obingslibrary.OptionAllowedIndel(CLIAllowsIndel()), obingslibrary.OptionUnidentified(CLIUnidentifiedFileName()), obingslibrary.OptionDiscardErrors(!CLIConservedErrors()), @@ -23,6 +22,14 @@ func IExtractBarcode(iterator obiiter.IBioSequence) (obiiter.IBioSequence, error obingslibrary.OptionBatchSize(obidefault.BatchSize()), ) + // Only propagate the CLI --allowed-mismatches value if the user + // explicitly set it: otherwise the per-primer values defined in + // the NGSFilter config file (@primer_mismatches, @forward_mismatches, + // @reverse_mismatches) must be preserved. + if CLIAllowedMismatchIsSet() { + opts = append(opts, obingslibrary.OptionAllowedMismatches(CLIAllowedMismatch())) + } + ngsfilter, err := CLINGSFIlter() if err != nil { log.Fatalf("%v", err) diff --git a/pkg/obitools/obimultiplex/options.go b/pkg/obitools/obimultiplex/options.go index 3809d76..7fd4897 100644 --- a/pkg/obitools/obimultiplex/options.go +++ b/pkg/obitools/obimultiplex/options.go @@ -18,6 +18,7 @@ var _UnidentifiedFile = "" var _AllowedMismatch = 2 var _AllowsIndel = false var _ConservedError = false +var _optionsParser *getoptions.GetOpt // PCROptionSet defines every options related to a simulated PCR. // @@ -29,6 +30,8 @@ var _ConservedError = false // - option : is a pointer to a getoptions.GetOpt instance normaly // produced by the func MultiplexOptionSet(options *getoptions.GetOpt) { + _optionsParser = options + options.StringVar(&_NGSFilterFile, "tag-list", _NGSFilterFile, options.Alias("s"), options.Description("File name of the NGSFilter file describing PCRs.")) @@ -62,6 +65,15 @@ func CLIAllowedMismatch() int { return _AllowedMismatch } +// CLIAllowedMismatchIsSet returns true if the user explicitly +// specified --allowed-mismatches on the command line, as opposed +// to relying on its default value. This allows per-primer mismatch +// settings from the NGSFilter config file to take precedence unless +// the user explicitly overrides them from the CLI. +func CLIAllowedMismatchIsSet() bool { + return _optionsParser != nil && _optionsParser.Called("allowed-mismatches") +} + func CLIAllowsIndel() bool { return _AllowsIndel } diff --git a/pkg/obitools/obitagpcr/pcrtag.go b/pkg/obitools/obitagpcr/pcrtag.go index bd32402..a6c7f31 100644 --- a/pkg/obitools/obitagpcr/pcrtag.go +++ b/pkg/obitools/obitagpcr/pcrtag.go @@ -55,7 +55,7 @@ func IPCRTagPESequencesBatch(iterator obiiter.IBioSequence, ngsfilter.SetAllowsIndels(true) } - if obimultiplex.CLIAllowedMismatch() > 0 { + if obimultiplex.CLIAllowedMismatchIsSet() { ngsfilter.SetAllowedMismatches(obimultiplex.CLIAllowedMismatch()) }