fix: respect config defaults when --allowed-mismatches is unset

The change replaces numeric threshold checks with an explicit flag state tracker for the `--allowed-mismatches` option. This ensures per-primer mismatch settings from configuration files are preserved when the CLI parameter is omitted or zero, making the command-line flag act strictly as an explicit override rather than a default fallback.
This commit is contained in:
Eric Coissac
2026-08-19 16:40:48 +02:00
parent d735ac6188
commit eae41ac81c
5 changed files with 37 additions and 10 deletions
+1 -1
View File
@@ -777,7 +777,7 @@ func (library *NGSLibrary) ExtractMultiBarcodeSliceWorker(options ...WithOption)
library.SetAllowsIndels(true)
}
if opt.AllowedMismatches() > 0 {
if opt.AllowedMismatchesIsSet() {
library.SetAllowedMismatches(opt.AllowedMismatches())
}
+8
View File
@@ -9,6 +9,7 @@ type _Options struct {
discardErrors bool
unidentified string
allowedMismatch int
allowedMismatchSet bool
allowsIndel bool
withProgressBar bool
parallelWorkers int
@@ -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
}
+8 -1
View File
@@ -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)
+12
View File
@@ -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
}
+1 -1
View File
@@ -55,7 +55,7 @@ func IPCRTagPESequencesBatch(iterator obiiter.IBioSequence,
ngsfilter.SetAllowsIndels(true)
}
if obimultiplex.CLIAllowedMismatch() > 0 {
if obimultiplex.CLIAllowedMismatchIsSet() {
ngsfilter.SetAllowedMismatches(obimultiplex.CLIAllowedMismatch())
}