Skip to content

Commit

Permalink
implemented logic for filtering connected base pairs
Browse files Browse the repository at this point in the history
  • Loading branch information
rayzhuca committed Oct 29, 2023
1 parent 22ae227 commit f72c32c
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 2 deletions.
21 changes: 19 additions & 2 deletions lib/src/middleware/export_svg.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@ import 'dart:html';
import 'dart:svg' as svg;
import 'dart:svg';

import 'package:built_collection/built_collection.dart';
import 'package:over_react/over_react.dart';
import 'package:redux/redux.dart';
import 'package:scadnano/src/middleware/system_clipboard.dart';
import 'package:scadnano/src/state/domain.dart';
import 'package:scadnano/src/view/design_main_base_pair_lines.dart';

import '../app.dart';
import '../state/app_state.dart';
Expand Down Expand Up @@ -85,6 +89,18 @@ SvgSvgElement get_cloned_svg_element_with_style(List<Element> selected_elts) {
var cloned_svg_element_with_style = SvgSvgElement()
..children = selected_elts.map(clone_and_apply_style).toList();

List<Element> base_pairs_elements = [
// TEMPORARY, JUST FOR TESTING
document.getElementsByClassName('base-pair-lines-main-view')[0] as Element
];
cloned_svg_element_with_style.children.addAll(base_pairs_elements.map(clone_and_apply_style));

print(app.state.design.base_pairs);
print(app.state.design.strand_to_index);

print(app.state.design.get_selected_base_pairs(
app.state.design.base_pairs, app.state.ui_state.selectables_store.selected_strands));

// we can't get bbox without it being added to the DOM first
document.body.append(cloned_svg_element_with_style);
var bbox = cloned_svg_element_with_style.getBBox();
Expand Down Expand Up @@ -131,10 +147,11 @@ _copy_from_elements(List<Element> svg_elements) {

_export_from_element(Element svg_element, String filename_append) {
var cloned_svg_element_with_style;
if (filename_append != "selected")
if (filename_append != "selected") {
cloned_svg_element_with_style = clone_and_apply_style(svg_element);
else
} else {
cloned_svg_element_with_style = svg_element;
}
// if element is not an svg element (it can be a child element of svg e.g. groups, lines, text, etc), wrap in svg tag
if (!(svg_element is svg.SvgSvgElement))
cloned_svg_element_with_style = SvgSvgElement()..children = [cloned_svg_element_with_style];
Expand Down
35 changes: 35 additions & 0 deletions lib/src/state/design.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2108,6 +2108,41 @@ abstract class Design with UnusedFields implements Built<Design, DesignBuilder>,
@memoized
BuiltMap<int, BuiltList<int>> get base_pairs_with_mismatches => this._base_pairs(true);

/// given `base_pairs`, returns a filtered map that is connected by at least 2 strands in `selected_strands`
BuiltMap<int, BuiltList<int>> get_selected_base_pairs(
BuiltMap<int, BuiltList<int>> base_pairs, BuiltSet<Strand> selected_strands) {
Map<int, List<int>> connect_cnt = {};

helices.forEach((i, v) {
connect_cnt[i] = List.filled(v.max_offset + 1, 0);
});
selected_strands.forEach((strand) {
strand.substrands.forEach((substrand) {
if (substrand is Domain) {
connect_cnt[substrand.helix][substrand.start] += 1;
connect_cnt[substrand.helix][substrand.end + 1] -= 1;
}
});
});
connect_cnt.updateAll((i, list) {
for (int i = 1; i < list.length; ++i) {
list[i] += list[i - 1];
}
return list;
});
Map<int, BuiltList<int>> connected_base_pairs = {};
base_pairs.forEach((i, list) {
List<int> base_pairs = [];
list.forEach((j) {
if (connect_cnt[i][j] == 2) {
base_pairs.add(j);
}
connected_base_pairs[i] = base_pairs.build();
});
});
return connected_base_pairs.build();
}

BuiltMap<int, BuiltList<int>> _base_pairs(bool allow_mismatches) {
var base_pairs = Map<int, BuiltList<int>>();
for (int idx in this.helices.keys) {
Expand Down

0 comments on commit f72c32c

Please sign in to comment.