From 4b5e5d1a606880899b1deccf39089e063e0df46e Mon Sep 17 00:00:00 2001 From: Dmitry Bolotin Date: Sat, 1 Jul 2023 21:17:06 +0300 Subject: [PATCH] feat: --sample-table (SetSampleTable) mixin renamed to --sample-sheet (SetSampleSheet) feat: case insensistive tag type deduction. Now "Cell" is valid tag name, not only "CELL". feat: tagsValidation in align fix: fixed grammar in PresetValidation --- build.gradle.kts | 2 +- .../milaboratory/mixcr/cli/CommandAlign.kt | 4 ++ .../mixcr/cli/CommandAlignPipeline.kt | 18 -------- .../mixcr/cli/CommandListPresets.kt | 4 +- .../mixcr/cli/MiXCRParamsResolver.kt | 8 ++-- .../com/milaboratory/mixcr/cli/Mixins.kt | 44 +++++++++++++++---- .../resources/presets/blocks/01-align.yaml | 7 +++ .../presets/protocols/generic-amplicon.yaml | 8 ++-- src/main/resources/presets/test.yaml | 8 ++-- .../com/milaboratory/mixcr/MixinsTest.kt | 2 +- 10 files changed, 65 insertions(+), 40 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 3978007c1..f488bb4ce 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -130,7 +130,7 @@ val toObfuscate: Configuration by configurations.creating { val obfuscationLibs: Configuration by configurations.creating -val mixcrAlgoVersion = "4.3.0-215-tiny-things" +val mixcrAlgoVersion = "4.3.0-219-final-440-fixes" val milibVersion = "3.0.0-1-master" val mitoolVersion = "" val repseqioVersion = "" diff --git a/src/main/kotlin/com/milaboratory/mixcr/cli/CommandAlign.kt b/src/main/kotlin/com/milaboratory/mixcr/cli/CommandAlign.kt index eb19bb9d6..239dbc3a6 100644 --- a/src/main/kotlin/com/milaboratory/mixcr/cli/CommandAlign.kt +++ b/src/main/kotlin/com/milaboratory/mixcr/cli/CommandAlign.kt @@ -998,6 +998,10 @@ object CommandAlign { // Tags val tagsExtractor = getTagsExtractor(cmdParams, inputFileGroups) + // Validating output tags if required + for (tagsValidation in cmdParams.tagsValidations) + tagsValidation.validate(tagsExtractor.tagsInfo) + // true if final NSQTuple will have two reads, false otherwise val pairedPayload = tagsExtractor.pairedPatternPayload ?: inputFileGroups.inputType.pairedRecords diff --git a/src/main/kotlin/com/milaboratory/mixcr/cli/CommandAlignPipeline.kt b/src/main/kotlin/com/milaboratory/mixcr/cli/CommandAlignPipeline.kt index 931507f6b..4012ec94d 100644 --- a/src/main/kotlin/com/milaboratory/mixcr/cli/CommandAlignPipeline.kt +++ b/src/main/kotlin/com/milaboratory/mixcr/cli/CommandAlignPipeline.kt @@ -183,24 +183,6 @@ object CommandAlignPipeline { ) } - // fun inferSampleTable(fileGroups: CommandAlign.InputFileGroups): CommandAlignParams.SampleTable { - // val sampleTagNames = fileGroups.tags.filter { TagType.detectByTagName(it) == TagType.Sample } - // return CommandAlignParams.SampleTable( - // sampleTagNames, - // fileGroups.fileGroups - // .map { fg -> sampleTagNames.map { fg.getTag(it) } } - // .toSortedSet(listComparator()) - // .map { sample -> - // CommandAlignParams.SampleTable.Row( - // matchTags = sampleTagNames - // .mapIndexed { i, tn -> tn to sample[i] } - // .toMap(TreeMap()), - // sample = sample - // ) - // } - // ) - // } - sealed interface TagExtractor { fun extract( originalReadId: Long, diff --git a/src/main/kotlin/com/milaboratory/mixcr/cli/CommandListPresets.kt b/src/main/kotlin/com/milaboratory/mixcr/cli/CommandListPresets.kt index 63af8c8c4..73600a3aa 100644 --- a/src/main/kotlin/com/milaboratory/mixcr/cli/CommandListPresets.kt +++ b/src/main/kotlin/com/milaboratory/mixcr/cli/CommandListPresets.kt @@ -57,6 +57,6 @@ private val flagOptions = mapOf( "${AlignMixins.AlignmentBoundaryConstants.RIGHT_RIGID_CMD_OPTION} [(${Labels.GENE_TYPE}|${Labels.ANCHOR_POINT})])", Flags.TagPattern to "${AlignMixins.SetTagPattern.CMD_OPTION} ", Flags.SampleTable to - "${AlignMixins.SetSampleTable.CMD_OPTION_FUZZY} sample_table.tsv\n" + - "${AlignMixins.SetSampleTable.CMD_OPTION_STRICT} sample_table.tsv", + "${AlignMixins.SetSampleSheet.CMD_OPTION_FUZZY} sample_table.tsv\n" + + "${AlignMixins.SetSampleSheet.CMD_OPTION_STRICT} sample_table.tsv", ) diff --git a/src/main/kotlin/com/milaboratory/mixcr/cli/MiXCRParamsResolver.kt b/src/main/kotlin/com/milaboratory/mixcr/cli/MiXCRParamsResolver.kt index 15339c54e..f00c0f8c6 100644 --- a/src/main/kotlin/com/milaboratory/mixcr/cli/MiXCRParamsResolver.kt +++ b/src/main/kotlin/com/milaboratory/mixcr/cli/MiXCRParamsResolver.kt @@ -84,13 +84,13 @@ val presetFlagsMessages = mapOf( Flags.TagPattern to "This preset requires to specify tag pattern, \n" + "please use ${AlignMixins.SetTagPattern.CMD_OPTION} mix-in to set it, alternatively " + - "tag pattern can be provided with sample table using ${AlignMixins.SetSampleTable.CMD_OPTION_FUZZY} or " + - "${AlignMixins.SetSampleTable.CMD_OPTION_STRICT} mixin.", + "tag pattern can be provided with sample table using ${AlignMixins.SetSampleSheet.CMD_OPTION_FUZZY} or " + + "${AlignMixins.SetSampleSheet.CMD_OPTION_STRICT} mixin.", Flags.SampleTable to "This preset requires to specify sample table, \n" + - "please use ${AlignMixins.SetSampleTable.CMD_OPTION_FUZZY} or " + - "${AlignMixins.SetSampleTable.CMD_OPTION_STRICT} mix-in.", + "please use ${AlignMixins.SetSampleSheet.CMD_OPTION_FUZZY} or " + + "${AlignMixins.SetSampleSheet.CMD_OPTION_STRICT} mix-in.", ) diff --git a/src/main/kotlin/com/milaboratory/mixcr/cli/Mixins.kt b/src/main/kotlin/com/milaboratory/mixcr/cli/Mixins.kt index dfde1e2a3..4b723d35d 100644 --- a/src/main/kotlin/com/milaboratory/mixcr/cli/Mixins.kt +++ b/src/main/kotlin/com/milaboratory/mixcr/cli/Mixins.kt @@ -183,23 +183,51 @@ class AlignMiXCRMixins : MiXCRMixinCollector() { @Option( description = ["Loads sample table from a tab separated file (one substitution will be allowed during matching)"], - names = [AlignMixins.SetSampleTable.CMD_OPTION_FUZZY], + names = [AlignMixins.SetSampleSheet.OLD_CMD_OPTION_FUZZY], arity = "1", paramLabel = "sample_table.tsv", - order = OptionsOrder.mixins.align + 330 + hidden = true ) - fun sampleTableFuzzy(arg: String) = - mixIn(AlignMixins.SetSampleTable(arg, null, true)) + fun sampleTableFuzzy(arg: String) { + println( + "Option ${AlignMixins.SetSampleSheet.OLD_CMD_OPTION_FUZZY}is deprecated. Use ${AlignMixins.SetSampleSheet.CMD_OPTION_FUZZY} instead." + ) + mixIn(AlignMixins.SetSampleSheet(arg, null, true)) + } + + @Option( + description = ["Loads sample table from a tab separated file (one substitution will be allowed during matching)"], + names = [AlignMixins.SetSampleSheet.CMD_OPTION_FUZZY], + arity = "1", + paramLabel = "sample_sheet.tsv", + order = OptionsOrder.mixins.align + 330, + ) + fun sampleSheetFuzzy(arg: String) = + mixIn(AlignMixins.SetSampleSheet(arg, null, true)) @Option( description = ["Loads sample table from a tab separated file (strict matching will be used)."], - names = [AlignMixins.SetSampleTable.CMD_OPTION_STRICT], + names = [AlignMixins.SetSampleSheet.OLD_CMD_OPTION_STRICT], arity = "1", paramLabel = "sample_table.tsv", - order = OptionsOrder.mixins.align + 331 + hidden = true + ) + fun sampleTableStrict(arg: String) { + println( + "Option ${AlignMixins.SetSampleSheet.OLD_CMD_OPTION_STRICT}is deprecated. Use ${AlignMixins.SetSampleSheet.CMD_OPTION_STRICT} instead." + ) + mixIn(AlignMixins.SetSampleSheet(arg, null, false)) + } + + @Option( + description = ["Loads sample table from a tab separated file (strict matching will be used)."], + names = [AlignMixins.SetSampleSheet.CMD_OPTION_STRICT], + arity = "1", + paramLabel = "sample_sheet.tsv", + order = OptionsOrder.mixins.align + 335 ) - fun sampleTableStrict(arg: String) = - mixIn(AlignMixins.SetSampleTable(arg, null, false)) + fun sampleSheetStrict(arg: String) = + mixIn(AlignMixins.SetSampleSheet(arg, null, false)) // // Material type diff --git a/src/main/resources/presets/blocks/01-align.yaml b/src/main/resources/presets/blocks/01-align.yaml index 7c08d4f41..10b2152cc 100644 --- a/src/main/resources/presets/blocks/01-align.yaml +++ b/src/main/resources/presets/blocks/01-align.yaml @@ -17,6 +17,13 @@ align-amplicon: tagUnstranded: false tagMaxBudget: 10 splitBySample: false + tagsValidations: + # Note: the following validation is applicable to all built-in presets in all cases. + # Validation is performed on the set of output tags. When sample tags are employed and splitBySample is set + # to true, these tags are used within the alignment step and don't appear in the output files. Therefore, + # the validation remains relevant and valid. + - type: MustNotContainTagType + tagType: Sample parameters: fixSeed: true libraryStructure: Unknown diff --git a/src/main/resources/presets/protocols/generic-amplicon.yaml b/src/main/resources/presets/protocols/generic-amplicon.yaml index 4fb4e2c8d..076af7d10 100644 --- a/src/main/resources/presets/protocols/generic-amplicon.yaml +++ b/src/main/resources/presets/protocols/generic-amplicon.yaml @@ -45,6 +45,11 @@ generic-amplicon: upper: 0.05 generic-amplicon-with-umi: + mixins: + - type: AddTagsValidation + validation: + type: MustContainTagType + tagType: Molecule inheritFrom: bundle-base flags: - species @@ -57,9 +62,6 @@ generic-amplicon-with-umi: - refineTagsAndSort - assemble - exportClones - validation: - - type: TagPatternShouldContainsTagName - tagName: UMI align: inheritFrom: align-amplicon refineTagsAndSort: diff --git a/src/main/resources/presets/test.yaml b/src/main/resources/presets/test.yaml index c7b4355c5..f12dde56e 100644 --- a/src/main/resources/presets/test.yaml +++ b/src/main/resources/presets/test.yaml @@ -174,9 +174,11 @@ "10x-vdj-tcr-qc-test": inheritFrom: 10x-vdj-tcr deprecation: "This preset is only for tests" - validation: - - type: TagPatternShouldContainsTagType - tagType: Cell + mixins: + - type: AddTagsValidation + validation: + type: MustContainTagType + tagType: Cell qc: checks: - type: OffTargetReads diff --git a/src/test/kotlin/com/milaboratory/mixcr/MixinsTest.kt b/src/test/kotlin/com/milaboratory/mixcr/MixinsTest.kt index 983bf7ade..0fe8da163 100644 --- a/src/test/kotlin/com/milaboratory/mixcr/MixinsTest.kt +++ b/src/test/kotlin/com/milaboratory/mixcr/MixinsTest.kt @@ -26,7 +26,7 @@ class MixinsTest { "S2\t^attagaca \\ ^attacaca(CELL1:NNNN)\tACCC\n" + "S3\t^attagaca \\ ^gacatata(CELL1:NNNN)\tATTG\n" + "S4\t^attagaca \\ ^gacatata(CELL1:NNNN)\tACCC\n" - val slMixin = AlignMixins.SetSampleTable(null, sampleList) + val slMixin = AlignMixins.SetSampleSheet(null, sampleList) Assert.assertTrue(slMixin.packed) TestUtil.assertJson(K_YAML_OM, slMixin, false) val parsed = slMixin.parse()