diff --git a/lib_tsshow/src/ts_arrangement/source.rs b/lib_tsshow/src/ts_arrangement/source.rs index 7d59dbe3..7b60d780 100644 --- a/lib_tsshow/src/ts_arrangement/source.rs +++ b/lib_tsshow/src/ts_arrangement/source.rs @@ -163,10 +163,18 @@ impl TsSourceArrangement { debug_assert_eq!(current_reference_index, current_query_index); // If there are further source chars right of the alignment, we insert a separator into both sequences. - if result.reference_arrangement_to_source_column(current_reference_index) - < SourceColumn::new(reference_length - 1) - || result.query_arrangement_to_source_column(current_query_index) - < SourceColumn::new(query_length - 1) + if result + .try_reference_arrangement_to_source_column(current_reference_index) + .map(|source_current_reference_index| { + source_current_reference_index < SourceColumn::new(reference_length - 1) + }) + .unwrap_or(false) + || result + .try_query_arrangement_to_source_column(current_query_index) + .map(|source_current_query_index| { + source_current_query_index < SourceColumn::new(query_length - 1) + }) + .unwrap_or(false) { result .reference @@ -589,6 +597,13 @@ impl TsSourceArrangement { Self::arrangement_to_source_column(&self.reference, arrangement_column) } + pub fn try_reference_arrangement_to_source_column( + &self, + arrangement_column: ArrangementColumn, + ) -> Option { + Self::try_arrangement_to_source_column(&self.reference, arrangement_column) + } + pub fn query_arrangement_to_source_column( &self, arrangement_column: ArrangementColumn, @@ -596,18 +611,38 @@ impl TsSourceArrangement { Self::arrangement_to_source_column(&self.query, arrangement_column) } + pub fn try_query_arrangement_to_source_column( + &self, + arrangement_column: ArrangementColumn, + ) -> Option { + Self::try_arrangement_to_source_column(&self.query, arrangement_column) + } + fn arrangement_to_source_column( sequence: &TaggedVec, arrangement_column: ArrangementColumn, ) -> SourceColumn { + Self::try_arrangement_to_source_column(sequence, arrangement_column).unwrap() + } + + fn try_arrangement_to_source_column( + sequence: &TaggedVec, + arrangement_column: ArrangementColumn, + ) -> Option { + if arrangement_column.primitive() >= sequence.len() { + return None; + } + // This may also be called on a non-source char. assert!(sequence[arrangement_column].is_char()); - sequence - .iter_values() - .take(arrangement_column.into()) - .filter(|c| c.is_source_char()) - .count() - .into() + Some( + sequence + .iter_values() + .take(arrangement_column.into()) + .filter(|c| c.is_source_char()) + .count() + .into(), + ) } pub fn reference_arrangement_char_to_arrangement_column( diff --git a/test_files/twin_ari_chrX_146823507_146823598.toml b/test_files/twin_ari_chrX_146823507_146823598.toml new file mode 100644 index 00000000..a57bde27 --- /dev/null +++ b/test_files/twin_ari_chrX_146823507_146823598.toml @@ -0,0 +1,26 @@ +type = "WithTarget" +alignment = [[499, "PrimaryMatch"], [17, { TemplateSwitchEntrance = { first_offset = -16, equal_cost_range = { min_start = 0, max_start = 1, min_end = -6, max_end = 0 }, primary = "Query", secondary = "Reference", direction = "Reverse" } }], [16, "SecondaryMatch"], [1, { TemplateSwitchExit = { anti_primary_gap = 16 } }], [22, "PrimaryMatch"], [17, { TemplateSwitchEntrance = { first_offset = -16, equal_cost_range = { min_start = 0, max_start = 1, min_end = -6, max_end = 0 }, primary = "Query", secondary = "Reference", direction = "Reverse" } }], [16, "SecondaryMatch"], [1, { TemplateSwitchExit = { anti_primary_gap = 16 } }], [22, "PrimaryMatch"], [17, { TemplateSwitchEntrance = { first_offset = -16, equal_cost_range = { min_start = 0, max_start = 1, min_end = -3, max_end = 0 }, primary = "Query", secondary = "Reference", direction = "Reverse" } }], [20, "SecondaryMatch"], [1, { TemplateSwitchExit = { anti_primary_gap = 20 } }], [504, "PrimaryMatch"]] +reference_offset = 0 +query_offset = 0 +cost = 6.0 +cost_per_base = 0.00545950864422202 +duration_seconds = 6.577439384 +opened_nodes = 6534802.0 +closed_nodes = 5501045.0 +suboptimal_opened_nodes = 184429.0 +suboptimal_opened_nodes_ratio = 0.029042231062647816 +template_switch_amount = 3.0 +runtime = 0.0 +memory = 0.0 + +[result] +astar_result_type = "FoundTarget" +cost = 6 + +[sequences] +reference_name = "REF " +reference = "ATATGTATACATGTATATATGTATACATATACATGTATATATGTATATATGTATACATATACATGTATATATGTATACATACACGTATGTATACATATACATGTATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATATATATGTGTATATATACATATATATGTGTGTATATACATATATGTAATGCTCACTGGAAACACACCATATTTCTTTATTAATCCTTATTATTTCTTGTTTTAATTTATGGTTATCACTGAAAATGTGTTCTAATGAGTAGGGGGCATTAAAAAGCATTCCCCATTTGGTTTTAAATACACTAATTAGGTCAAAGGTAGAAGACTTTTTTTCTTCAAATACTTCACACTTTGGTCCTAGTGTCTGGCATCTTTTGGTTTTTTTTAAACAGCTTTATTCAGATATACCTGACTATAATATACAATTAATTAGAGTCGGCACATATACACCTGTGAAAACATCACCACAATTCAAATAAGAACACTATCCATGACTGCATCAGGTGTTTTCTTTTCTTTTCTTTTTTTTTTTTTTTTTTGCCACCTTGTGTTTTTTCCTCCCACTTCTTCCCAATTCCCAATTCCCAATCACTGATCTGCCTTCTGCCTCTACAGGT" +reference_rc = "ACCTGTAGAGGCAGAAGGCAGATCAGTGATTGGGAATTGGGAATTGGGAAGAAGTGGGAGGAAAAAACACAAGGTGGCAAAAAAAAAAAAAAAAAAGAAAAGAAAAGAAAACACCTGATGCAGTCATGGATAGTGTTCTTATTTGAATTGTGGTGATGTTTTCACAGGTGTATATGTGCCGACTCTAATTAATTGTATATTATAGTCAGGTATATCTGAATAAAGCTGTTTAAAAAAAACCAAAAGATGCCAGACACTAGGACCAAAGTGTGAAGTATTTGAAGAAAAAAAGTCTTCTACCTTTGACCTAATTAGTGTATTTAAAACCAAATGGGGAATGCTTTTTAATGCCCCCTACTCATTAGAACACATTTTCAGTGATAACCATAAATTAAAACAAGAAATAATAAGGATTAATAAAGAAATATGGTGTGTTTCCAGTGAGCATTACATATATGTATATACACACATATATATGTATATATACACATATATATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACGTGTATGTATACATATATGTATGTATATACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATACATGTATATGTATACATACGTGTATGTATACATATATACATGTATATGTATACATATATACATATATACATGTATATGTATACATATATACATGTATACATAT" +query_name = "ALT " +query = "ATATGTATACATGTATATATGTATACATATACATGTATATATGTATATATGTATACATATACATGTATATATGTATACATACACGTATGTATACATATACATGTATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTATGTATGTATATACATACATATATGTATACATACACGTATGTATGTATATACATACATATATGTATACATACACGTATGTATGTATATACACACATATATGTATATATATGTGTATATATACATATATATGTGTGTATATACATATATGTAATGCTCACTGGAAACACACCATATTTCTTTATTAATCCTTATTATTTCTTGTTTTAATTTATGGTTATCACTGAAAATGTGTTCTAATGAGTAGGGGGCATTAAAAAGCATTCCCCATTTGGTTTTAAATACACTAATTAGGTCAAAGGTAGAAGACTTTTTTTCTTCAAATACTTCACACTTTGGTCCTAGTGTCTGGCATCTTTTGGTTTTTTTTAAACAGCTTTATTCAGATATACCTGACTATAATATACAATTAATTAGAGTCGGCACATATACACCTGTGAAAACATCACCACAATTCAAATAAGAACACTATCCATGACTGCATCAGGTGTTTTCTTTTCTTTTCTTTTTTTTTTTTTTTTTTGCCACCTTGTGTTTTTTCCTCCCACTTCTTCCCAATTCCCAATTCCCAATCACTGATCTGCCTTCTGCCTCTACAGGT" +query_rc = "ACCTGTAGAGGCAGAAGGCAGATCAGTGATTGGGAATTGGGAATTGGGAAGAAGTGGGAGGAAAAAACACAAGGTGGCAAAAAAAAAAAAAAAAAAGAAAAGAAAAGAAAACACCTGATGCAGTCATGGATAGTGTTCTTATTTGAATTGTGGTGATGTTTTCACAGGTGTATATGTGCCGACTCTAATTAATTGTATATTATAGTCAGGTATATCTGAATAAAGCTGTTTAAAAAAAACCAAAAGATGCCAGACACTAGGACCAAAGTGTGAAGTATTTGAAGAAAAAAAGTCTTCTACCTTTGACCTAATTAGTGTATTTAAAACCAAATGGGGAATGCTTTTTAATGCCCCCTACTCATTAGAACACATTTTCAGTGATAACCATAAATTAAAACAAGAAATAATAAGGATTAATAAAGAAATATGGTGTGTTTCCAGTGAGCATTACATATATGTATATACACACATATATATGTATATATACACATATATATACATATATGTGTGTATATACATACATACGTGTATGTATACATATATGTATGTATATACATACATACGTGTATGTATACATATATGTATGTATATACATACATACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACGTGTATGTATACATATATGTATGTATATACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATACATGTATATGTATACATACGTGTATGTATACATATATACATGTATATGTATACATATATACATATATACATGTATATGTATACATATATACATGTATACATAT" diff --git a/test_files/twin_ari_chrX_146823507_146823598_no_ts.toml b/test_files/twin_ari_chrX_146823507_146823598_no_ts.toml new file mode 100644 index 00000000..b8a50761 --- /dev/null +++ b/test_files/twin_ari_chrX_146823507_146823598_no_ts.toml @@ -0,0 +1,25 @@ +type = "WithoutTarget" +reference_offset = 490 +query_offset = 490 +cost = 7.0 +cost_per_base = 0.006369426751592357 +duration_seconds = 0.000311365 +opened_nodes = 510.0 +closed_nodes = 394.0 +suboptimal_opened_nodes = 117.0 +suboptimal_opened_nodes_ratio = 0.29770992366412213 +template_switch_amount = 0.0 +runtime = 0.0 +memory = 0.0 + +[result] +astar_result_type = "ExceededCostLimit" +cost_limit = 7 + +[sequences] +reference_name = "REF " +reference = "ATATGTATACATGTATATATGTATACATATACATGTATATATGTATATATGTATACATATACATGTATATATGTATACATACACGTATGTATACATATACATGTATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATATATATGTGTATATATACATATATATGTGTGTATATACATATATGTAATGCTCACTGGAAACACACCATATTTCTTTATTAATCCTTATTATTTCTTGTTTTAATTTATGGTTATCACTGAAAATGTGTTCTAATGAGTAGGGGGCATTAAAAAGCATTCCCCATTTGGTTTTAAATACACTAATTAGGTCAAAGGTAGAAGACTTTTTTTCTTCAAATACTTCACACTTTGGTCCTAGTGTCTGGCATCTTTTGGTTTTTTTTAAACAGCTTTATTCAGATATACCTGACTATAATATACAATTAATTAGAGTCGGCACATATACACCTGTGAAAACATCACCACAATTCAAATAAGAACACTATCCATGACTGCATCAGGTGTTTTCTTTTCTTTTCTTTTTTTTTTTTTTTTTTGCCACCTTGTGTTTTTTCCTCCCACTTCTTCCCAATTCCCAATTCCCAATCACTGATCTGCCTTCTGCCTCTACAGGT" +reference_rc = "ACCTGTAGAGGCAGAAGGCAGATCAGTGATTGGGAATTGGGAATTGGGAAGAAGTGGGAGGAAAAAACACAAGGTGGCAAAAAAAAAAAAAAAAAAGAAAAGAAAAGAAAACACCTGATGCAGTCATGGATAGTGTTCTTATTTGAATTGTGGTGATGTTTTCACAGGTGTATATGTGCCGACTCTAATTAATTGTATATTATAGTCAGGTATATCTGAATAAAGCTGTTTAAAAAAAACCAAAAGATGCCAGACACTAGGACCAAAGTGTGAAGTATTTGAAGAAAAAAAGTCTTCTACCTTTGACCTAATTAGTGTATTTAAAACCAAATGGGGAATGCTTTTTAATGCCCCCTACTCATTAGAACACATTTTCAGTGATAACCATAAATTAAAACAAGAAATAATAAGGATTAATAAAGAAATATGGTGTGTTTCCAGTGAGCATTACATATATGTATATACACACATATATATGTATATATACACATATATATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACGTGTATGTATACATATATGTATGTATATACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATACATGTATATGTATACATACGTGTATGTATACATATATACATGTATATGTATACATATATACATATATACATGTATATGTATACATATATACATGTATACATAT" +query_name = "ALT " +query = "ATATGTATACATGTATATATGTATACATATACATGTATATATGTATATATGTATACATATACATGTATATATGTATACATACACGTATGTATACATATACATGTATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTGTGTGTGTATATACATACATATATGTATACATACACGTATGTATGTATATACATACATATATGTATACATACACGTATGTATGTATATACATACATATATGTATACATACACGTATGTATGTATATACACACATATATGTATATATATGTGTATATATACATATATATGTGTGTATATACATATATGTAATGCTCACTGGAAACACACCATATTTCTTTATTAATCCTTATTATTTCTTGTTTTAATTTATGGTTATCACTGAAAATGTGTTCTAATGAGTAGGGGGCATTAAAAAGCATTCCCCATTTGGTTTTAAATACACTAATTAGGTCAAAGGTAGAAGACTTTTTTTCTTCAAATACTTCACACTTTGGTCCTAGTGTCTGGCATCTTTTGGTTTTTTTTAAACAGCTTTATTCAGATATACCTGACTATAATATACAATTAATTAGAGTCGGCACATATACACCTGTGAAAACATCACCACAATTCAAATAAGAACACTATCCATGACTGCATCAGGTGTTTTCTTTTCTTTTCTTTTTTTTTTTTTTTTTTGCCACCTTGTGTTTTTTCCTCCCACTTCTTCCCAATTCCCAATTCCCAATCACTGATCTGCCTTCTGCCTCTACAGGT" +query_rc = "ACCTGTAGAGGCAGAAGGCAGATCAGTGATTGGGAATTGGGAATTGGGAAGAAGTGGGAGGAAAAAACACAAGGTGGCAAAAAAAAAAAAAAAAAAGAAAAGAAAAGAAAACACCTGATGCAGTCATGGATAGTGTTCTTATTTGAATTGTGGTGATGTTTTCACAGGTGTATATGTGCCGACTCTAATTAATTGTATATTATAGTCAGGTATATCTGAATAAAGCTGTTTAAAAAAAACCAAAAGATGCCAGACACTAGGACCAAAGTGTGAAGTATTTGAAGAAAAAAAGTCTTCTACCTTTGACCTAATTAGTGTATTTAAAACCAAATGGGGAATGCTTTTTAATGCCCCCTACTCATTAGAACACATTTTCAGTGATAACCATAAATTAAAACAAGAAATAATAAGGATTAATAAAGAAATATGGTGTGTTTCCAGTGAGCATTACATATATGTATATACACACATATATATGTATATATACACATATATATACATATATGTGTGTATATACATACATACGTGTATGTATACATATATGTATGTATATACATACATACGTGTATGTATACATATATGTATGTATATACATACATACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACGTGTATGTATACATATATGTATGTATATACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATGTATGTATATACACACACACGTGTATGTATACATATATACATGTATATGTATACATACGTGTATGTATACATATATACATGTATATGTATACATATATACATATATACATGTATATGTATACATATATACATGTATACATAT"