Skip to content

Commit 5fb5107

Browse files
authored
#2986 Don't calculate Melting temperature for one pair of double stranded DNA/RNA nucleotides (#2992)
1 parent c3d8343 commit 5fb5107

5 files changed

Lines changed: 39 additions & 2 deletions

File tree

api/tests/integration/ref/formats/macromol_props.py.out

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ props_dna_phosphate_selected.json: SUCCEED
1313
props_double_dna.json: SUCCEED
1414
props_double_dna_gc.json: SUCCEED
1515
props_double_dna_p.json: SUCCEED
16+
props_double_dna_single.json: SUCCEED
1617
props_double_dna_unsplit.json: SUCCEED
1718
props_mol_connected_to_mol.json: SUCCEED
1819
props_nucleoside_peptide.json: SUCCEED

api/tests/integration/tests/formats/macromol_props.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ def find_diff(a, b):
5050
"props_dna_base_selected",
5151
"props_dna_nucleotide_selected",
5252
"props_dna_phosphate_selected",
53+
"props_double_dna_single",
5354
]
5455

5556
lib = indigo.loadMonomerLibraryFromFile(
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"root":{"nodes":[{"$ref":"monomer0"},{"$ref":"monomer1"},{"$ref":"monomer2"},{"$ref":"monomer3"}],"connections":[{"connectionType":"single","endpoint1":{"monomerId":"monomer0","attachmentPointId":"R3"},"endpoint2":{"monomerId":"monomer1","attachmentPointId":"R1"}},{"connectionType":"single","endpoint1":{"monomerId":"monomer2","attachmentPointId":"R3"},"endpoint2":{"monomerId":"monomer3","attachmentPointId":"R1"}},{"connectionType":"hydrogen","endpoint1":{"monomerId":"monomer1"},"endpoint2":{"monomerId":"monomer3"}}],"templates":[{"$ref":"monomerTemplate-R___Ribose"},{"$ref":"monomerTemplate-A___Adenine"},{"$ref":"monomerTemplate-U___Uracil"}]},"monomer0":{"type":"monomer","id":"0","position":{"x":1.25,"y":-1.25},"alias":"R","templateId":"R___Ribose"},"monomerTemplate-R___Ribose":{"type":"monomerTemplate","atoms":[{"label":"C","location":[1.499,1.176,0],"stereoLabel":"abs"},{"label":"C","location":[1.656,0.188,0],"stereoLabel":"abs"},{"label":"C","location":[0.765,-0.266,0],"stereoLabel":"abs"},{"label":"C","location":[0.058,0.441,0],"stereoLabel":"abs"},{"label":"O","location":[0.512,1.332,0]},{"label":"O","location":[2.207,1.883,0]},{"label":"O","location":[0.608,-1.254,0]},{"label":"O","location":[2.547,-0.266,0]},{"label":"H","location":[1.386,-1.883,0]},{"label":"C","location":[-0.93,0.285,0]},{"label":"O","location":[-1.559,1.062,0]},{"label":"H","location":[-2.547,0.905,0]}],"bonds":[{"type":1,"atoms":[0,4]},{"type":1,"atoms":[4,3]},{"type":1,"atoms":[3,2]},{"type":1,"atoms":[2,1]},{"type":1,"atoms":[1,0]},{"type":1,"atoms":[0,5],"stereo":1},{"type":1,"atoms":[2,6],"stereo":6},{"type":1,"atoms":[1,7],"stereo":1},{"type":1,"atoms":[6,8]},{"type":1,"atoms":[3,9],"stereo":1},{"type":1,"atoms":[9,10]},{"type":1,"atoms":[10,11]}],"class":"Sugar","classHELM":"RNA","id":"R___Ribose","fullName":"Ribose","alias":"R","attachmentPoints":[{"attachmentAtom":10,"leavingGroup":{"atoms":[11]},"type":"left"},{"attachmentAtom":6,"leavingGroup":{"atoms":[8]},"type":"right"},{"attachmentAtom":0,"leavingGroup":{"atoms":[5]},"type":"side"}],"naturalAnalogShort":"R"},"monomer1":{"type":"monomer","id":"1","position":{"x":1.25,"y":-2.75},"alias":"A","templateId":"A___Adenine"},"monomerTemplate-A___Adenine":{"type":"monomerTemplate","atoms":[{"label":"N","location":[-0.438,1.041,0]},{"label":"C","location":[-0.438,0.041,0]},{"label":"C","location":[0.428,-0.459,0]},{"label":"C","location":[1.294,0.041,0]},{"label":"N","location":[1.294,1.041,0]},{"label":"C","location":[0.428,1.541,0]},{"label":"N","location":[0.22,-1.437,0]},{"label":"C","location":[-0.775,-1.541,0]},{"label":"N","location":[-1.182,-0.628,0]},{"label":"N","location":[2.16,-0.459,0]},{"label":"H","location":[-2.16,-0.42,0]}],"bonds":[{"type":2,"atoms":[5,0]},{"type":1,"atoms":[0,1]},{"type":2,"atoms":[1,2]},{"type":1,"atoms":[2,3]},{"type":2,"atoms":[3,4]},{"type":1,"atoms":[4,5]},{"type":1,"atoms":[1,8]},{"type":1,"atoms":[8,7]},{"type":2,"atoms":[7,6]},{"type":1,"atoms":[6,2]},{"type":1,"atoms":[3,9]},{"type":1,"atoms":[8,10]}],"class":"Base","classHELM":"RNA","id":"A___Adenine","fullName":"Adenine","alias":"A","attachmentPoints":[{"attachmentAtom":8,"leavingGroup":{"atoms":[10]},"type":"left"}],"naturalAnalogShort":"A"},"monomer2":{"type":"monomer","id":"2","position":{"x":1.25,"y":-5.75},"alias":"R","templateId":"R___Ribose"},"monomer3":{"type":"monomer","id":"3","position":{"x":1.25,"y":-4.25},"alias":"U","templateId":"U___Uracil"},"monomerTemplate-U___Uracil":{"type":"monomerTemplate","atoms":[{"label":"C","location":[-0.5,-1.299,0]},{"label":"C","location":[0.5,-1.299,0]},{"label":"C","location":[1,-0.433,0]},{"label":"N","location":[0.5,0.433,0]},{"label":"C","location":[-0.5,0.433,0]},{"label":"N","location":[-1,-0.433,0]},{"label":"O","location":[2,-0.433,0]},{"label":"H","location":[-2,-0.433,0]},{"label":"O","location":[-1,1.299,0]}],"bonds":[{"type":1,"atoms":[5,0]},{"type":2,"atoms":[0,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[2,3]},{"type":1,"atoms":[3,4]},{"type":1,"atoms":[4,5]},{"type":2,"atoms":[2,6]},{"type":1,"atoms":[5,7]},{"type":2,"atoms":[4,8]}],"class":"Base","classHELM":"RNA","id":"U___Uracil","fullName":"Uracil","alias":"U","attachmentPoints":[{"attachmentAtom":5,"leavingGroup":{"atoms":[7]},"type":"left"}],"naturalAnalogShort":"U"}}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
[
2+
{
3+
"grossFormula": "C19 H25 N7 O10",
4+
"mass": 511.442703,
5+
"monomerCount": {
6+
"peptides": {},
7+
"nucleotides": {
8+
"A": 1,
9+
"U": 1
10+
}
11+
}
12+
}
13+
]

core/indigo-core/molecule/src/macro_properties_calculator.cpp

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ void MacroPropertiesCalculator::CalculateMacroProps(KetDocument& document, Outpu
6161
bool is_double_chain = false;
6262
bool has_non_sequence_connection = false;
6363
bool deleted = false;
64+
bool has_selection = false;
6465
polymer_t(size_t idx) : is_double_chain(false), has_non_sequence_connection(false), deleted(false)
6566
{
6667
sequences.emplace(idx);
@@ -79,18 +80,24 @@ void MacroPropertiesCalculator::CalculateMacroProps(KetDocument& document, Outpu
7980
};
8081
bool has_selection = false;
8182
std::vector<std::unique_ptr<BaseMolecule>> molecules;
83+
std::unordered_set<std::string> molecules_with_selection;
8284
// handle molecules
85+
std::string molecule_prefix = "mol";
8386
if (document.jsonMolecules().IsArray())
84-
for (auto& mol_json : document.jsonMolecules().GetArray())
87+
for (rapidjson::SizeType i = 0; i < document.jsonMolecules().Size(); ++i)
8588
{
89+
auto& mol_json = document.jsonMolecules()[i];
8690
rapidjson::Value marr(rapidjson::kArrayType);
8791
marr.PushBack(document.jsonDocument().CopyFrom(mol_json, document.jsonDocument().GetAllocator()), document.jsonDocument().GetAllocator());
8892
MoleculeJsonLoader loader(marr);
8993
molecules.emplace_back(std::make_unique<Molecule>());
9094
BaseMolecule& bmol = *molecules.back();
9195
loader.loadMolecule(bmol);
9296
if (bmol.countSelectedAtoms())
97+
{
9398
has_selection = true;
99+
molecules_with_selection.emplace(molecule_prefix + std::to_string(i));
100+
}
94101
}
95102
// handle sequences
96103
std::vector<std::deque<std::string>> sequences;
@@ -110,15 +117,21 @@ void MacroPropertiesCalculator::CalculateMacroProps(KetDocument& document, Outpu
110117
{
111118
auto& mon = monomers.at(monomer);
112119
if (mon->hasBoolProp("selected") && mon->getBoolProp("selected"))
120+
{
113121
has_selection = true;
122+
polymers.back().has_selection = true;
123+
}
114124
monomer_to_sequence_idx.emplace(monomer, i);
115125
}
116126
}
127+
117128
for (size_t i = 0; i < molecules_refs.size(); i++)
118129
{
119130
auto idx = polymers.size();
120131
molecule_to_polymer_idx.emplace(molecules_refs[i], idx);
121132
polymers.emplace_back(molecules_refs[i]);
133+
if (molecules_with_selection.count(molecules_refs[i]) > 0)
134+
polymers.back().has_selection = true;
122135
}
123136
auto add_connection_to_atom = [&](size_t polymer_idx, const std::string& molecule_id, int atom_idx) {
124137
auto& atom_connections = polymers[polymer_idx].mol_atom_connections[molecule_id];
@@ -137,6 +150,7 @@ void MacroPropertiesCalculator::CalculateMacroProps(KetDocument& document, Outpu
137150
auto& right_monomer_id = document.monomerIdByRef(ep2.getStringProp("monomerId"));
138151
auto& left_monomer = monomers.at(left_monomer_id);
139152
auto& right_monomer = monomers.at(right_monomer_id);
153+
140154
if (connection.connectionType() == KetConnectionHydro)
141155
{
142156
left_monomer->addHydrogenConnection(right_monomer->ref());
@@ -156,6 +170,7 @@ void MacroPropertiesCalculator::CalculateMacroProps(KetDocument& document, Outpu
156170
if (left_sequence_idx != right_sequence_idx && left_polymer_idx != right_polymer_idx)
157171
{
158172
polymers[left_polymer_idx].merge(polymers[right_polymer_idx]);
173+
polymers[left_polymer_idx].has_selection |= polymers[right_polymer_idx].has_selection;
159174
sequence_to_polymer_idx[right_sequence_idx] = left_polymer_idx;
160175
polymers[right_polymer_idx].deleted = true;
161176
}
@@ -176,6 +191,7 @@ void MacroPropertiesCalculator::CalculateMacroProps(KetDocument& document, Outpu
176191
if (sequence_polymer_idx != molecule_polymer_idx)
177192
{
178193
polymers[sequence_polymer_idx].merge(polymers[molecule_polymer_idx]);
194+
polymers[sequence_polymer_idx].has_selection |= polymers[molecule_polymer_idx].has_selection;
179195
molecule_to_polymer_idx[molecule_id] = sequence_polymer_idx;
180196
polymers[molecule_polymer_idx].deleted = true;
181197
}
@@ -192,6 +208,7 @@ void MacroPropertiesCalculator::CalculateMacroProps(KetDocument& document, Outpu
192208
if (first_molecule_polymer_idx != second_molecule_polymer_idx)
193209
{
194210
polymers[first_molecule_polymer_idx].merge(polymers[second_molecule_polymer_idx]);
211+
polymers[first_molecule_polymer_idx].has_selection |= polymers[second_molecule_polymer_idx].has_selection;
195212
molecule_to_polymer_idx[second_molecule_id] = first_molecule_polymer_idx;
196213
polymers[second_molecule_polymer_idx].deleted = true;
197214
}
@@ -359,6 +376,9 @@ void MacroPropertiesCalculator::CalculateMacroProps(KetDocument& document, Outpu
359376
writer.StartArray();
360377
for (auto& polymer : polymers)
361378
{
379+
if (has_selection && !polymer.has_selection)
380+
continue;
381+
362382
if (polymer.deleted)
363383
continue;
364384
writer.StartObject();
@@ -558,7 +578,7 @@ void MacroPropertiesCalculator::CalculateMacroProps(KetDocument& document, Outpu
558578
bases.emplace_back(monomer_template.getStringProp("naturalAnalogShort"));
559579
move_to_next_base(it, sequence.end());
560580
}
561-
if (bases.size() > 0 && upc > 0 && nac > 0)
581+
if (bases.size() > 1 && upc > 0 && nac > 0)
562582
{
563583
std::string left = bases.front();
564584
bases.pop_front();
@@ -741,6 +761,7 @@ void MacroPropertiesCalculator::CalculateMacroProps(KetDocument& document, Outpu
741761
}
742762
}
743763
}
764+
744765
writer.Key("monomerCount");
745766
writer.StartObject();
746767
writer.Key("peptides");

0 commit comments

Comments
 (0)