From 3394b4483f079f01f3dcc50b174221f16f14cae7 Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Mon, 9 Sep 2024 18:32:58 +0200 Subject: [PATCH 01/30] pre fixes --- core/indigo-core/common/math/algebra.h | 73 +++++++++++++++---- .../reaction/src/reaction_auto_loader.cpp | 27 ++++++- .../src/reaction_multistep_detector.cpp | 30 ++++++-- 3 files changed, 107 insertions(+), 23 deletions(-) diff --git a/core/indigo-core/common/math/algebra.h b/core/indigo-core/common/math/algebra.h index d966f976b2..d84d49a6b7 100644 --- a/core/indigo-core/common/math/algebra.h +++ b/core/indigo-core/common/math/algebra.h @@ -21,6 +21,7 @@ #include #include +#include #include #include "base_c/defs.h" @@ -28,8 +29,8 @@ #define SQR(x) ((x) * (x)) -#define DEG2RAD(x) ((x)*M_PI / 180) -#define RAD2DEG(x) ((x)*180 / M_PI) +#define DEG2RAD(x) ((x) * M_PI / 180) +#define RAD2DEG(x) ((x) * 180 / M_PI) #define HYPOT(a, b) (sqrt((a) * (a) + (b) * (b))) namespace indigo @@ -291,6 +292,36 @@ namespace indigo } }; + inline bool rayIntersectsSegment(const Vec2f& beg, const Vec2f& end, const Vec2f& a, const Vec2f& b) + { + Vec2f ray = end - beg; + + // Vector of the segment + Vec2f segment = a - b; + + // Calculate the cross products + float cross1 = Vec2f::cross(ray, segment); + if (abs(cross1) < 1e-6) + { + // Parallel segments + return false; + } + + // Compute the cross product of vectors (beg - a) and (beg - b) + Vec2f vecBA = beg - a; + Vec2f vecBB = beg - b; + + float t = Vec2f::cross(vecBA, segment) / cross1; + if (t < 0) + { + // Intersection is behind the starting point + return false; + } + + float u = Vec2f::cross(vecBA, ray) / cross1; + return (u >= 0 && u <= 1); + } + struct Rect2f { @@ -327,18 +358,32 @@ namespace indigo inline bool rayIntersectsRect(const Vec2f& begin, const Vec2f& end) { - Vec2f v = end - begin; - Vec2f vr(v.y, -v.x); // perpendicular vector - auto lb = _leftBottom - begin; - auto lt = leftTop() - begin; - auto rt = _rightTop - begin; - auto rb = rightBottom() - begin; - // same_sign means no intersection - bool same_sign = std::signbit(Vec2f::dot(vr, lb)) == std::signbit(Vec2f::dot(vr, lt)) && - std::signbit(Vec2f::dot(vr, lt)) == std::signbit(Vec2f::dot(vr, rt)) && - std::signbit(Vec2f::dot(vr, rt)) == std::signbit(Vec2f::dot(vr, rb)); - - return !same_sign && Vec2f::cross(lb, vr) > 0 && Vec2f::cross(lt, vr) > 0 && Vec2f::cross(rt, vr) > 0 && Vec2f::cross(rb, vr) > 0; + auto lb = _leftBottom; + auto lt = leftTop(); + auto rt = _rightTop; + auto rb = rightBottom(); + return rayIntersectsSegment(begin, end, lb, lt) || rayIntersectsSegment(begin, end, lt, rt) || rayIntersectsSegment(begin, end, rt, rb) || + rayIntersectsSegment(begin, end, rb, lb); + // Vec2f v = end - begin; + // Vec2f vr(v.y, -v.x); // rotate 90 degrees clockwise + // // same_sign means no intersection + // auto lb_sign = std::signbit(Vec2f::dot(vr, lb)); + // auto lt_sign = std::signbit(Vec2f::dot(vr, lt)); + // auto rt_sign = std::signbit(Vec2f::dot(vr, rt)); + // auto rb_sign = std::signbit(Vec2f::dot(vr, rb)); + + // bool same_sign = lb_sign == lt_sign && lt_sign == rt_sign && rt_sign == rb_sign; + // int count = 0; + // if (Vec2f::cross(v, lb) > 0) + // count++; + // if (Vec2f::cross(v, lt) > 0) + // count++; + // if (Vec2f::cross(v, rt) > 0) + // count++; + // if (Vec2f::cross(v, rb) > 0) + // count++; + + // return !same_sign && Vec2f::cross(lb, vr) > 0 && count < 4; } inline double pointDistance(const Vec2f& pt) diff --git a/core/indigo-core/reaction/src/reaction_auto_loader.cpp b/core/indigo-core/reaction/src/reaction_auto_loader.cpp index 3aee36dd19..708e514a0e 100644 --- a/core/indigo-core/reaction/src/reaction_auto_loader.cpp +++ b/core/indigo-core/reaction/src/reaction_auto_loader.cpp @@ -303,18 +303,37 @@ std::unique_ptr ReactionAutoLoader::_loadReaction(bool query) loader.ignore_noncritical_query_features = ignore_noncritical_query_features; loader.treat_x_as_pseudoatom = treat_x_as_pseudoatom; loader.ignore_no_chiral_flag = ignore_no_chiral_flag; + std::unique_ptr reaction; if (query) { - auto reaction = std::make_unique(); + reaction = std::make_unique(); loader.loadReaction(*reaction); - return reaction; } else { - auto reaction = std::make_unique(); + reaction = std::make_unique(); loader.loadReaction(*reaction); - return reaction; } + // TODO: to be removed. This is just for test. + if (reaction->reactionBlocksCount() > 1 && reaction->intermediateCount() == 0) + { + std::deque reactions; + for (int i = 0; i < reaction->reactionBlocksCount(); i++) + { + auto& rc = reactions.emplace_back(); + auto& rb = reaction->reactionBlock(i); + for (int j = 0; j < rb.reactants.size(); j++) + rc.addReactantCopy(reaction->getBaseMolecule(rb.reactants[j]), 0, 0); + for (int j = 0; j < rb.products.size(); j++) + rc.addProductCopy(reaction->getBaseMolecule(rb.products[j]), 0, 0); + } + PathwayReactionBuilder prb; + auto pwr = prb.buildPathwayReaction(reactions); + reaction->meta().resetReactionData(); + pwr->meta().clone(reaction->meta()); + return pwr; + } + return reaction; } } return nullptr; diff --git a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp index e7e1977ac0..323aea8663 100644 --- a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp +++ b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp @@ -215,6 +215,11 @@ void ReactionMultistepDetector::buildReaction(BaseReaction& rxn) } } + for (auto& csb : _component_summ_blocks) + { + rxn.meta().addMetaObject(new KETSimpleObject(KETSimpleObject::EKETRectangle, std::make_pair(csb.bbox.leftBottom(), csb.bbox.rightTop()))); + } + // handle arrows for (int i = 0; i < rxn.meta().getMetaCount(KETReactionArrow::CID); ++i) { @@ -270,9 +275,14 @@ void ReactionMultistepDetector::buildReaction(BaseReaction& rxn) // idx_cs_min_reac -> idx_cs_min_prod csb_min_reac.arrows_to.push_back(idx_cs_min_prod); for (auto ri : csb_min_reac.indexes) + { rb.reactants.push(_reaction_components[ri].index); + } + for (auto pi : csb_min_prod.indexes) + { rb.products.push(_reaction_components[pi].index); + } } } @@ -380,6 +390,7 @@ void ReactionMultistepDetector::constructMultipleArrowReaction(BaseReaction& rxn { // _reaction_components -> allMolecules // _component_summ_blocks -> + std::unordered_map mol_mapping; for (auto& rc : _reaction_components) { if (rc.component_type == ReactionComponent::MOLECULE) @@ -388,21 +399,30 @@ void ReactionMultistepDetector::constructMultipleArrowReaction(BaseReaction& rxn switch (csb.role) { case BaseReaction::REACTANT: - rxn.addReactantCopy(*rc.molecule, 0, 0); + mol_mapping.emplace(rc.index, rxn.addReactantCopy(*rc.molecule, 0, 0)); break; case BaseReaction::PRODUCT: - rxn.addProductCopy(*rc.molecule, 0, 0); + mol_mapping.emplace(rc.index, rxn.addProductCopy(*rc.molecule, 0, 0)); break; case BaseReaction::INTERMEDIATE: - rxn.addIntermediateCopy(*rc.molecule, 0, 0); + mol_mapping.emplace(rc.index, rxn.addIntermediateCopy(*rc.molecule, 0, 0)); break; case BaseReaction::UNDEFINED: - rxn.addUndefinedCopy(*rc.molecule, 0, 0); + mol_mapping.emplace(rc.index, rxn.addUndefinedCopy(*rc.molecule, 0, 0)); break; case BaseReaction::CATALYST: - rxn.addCatalystCopy(*rc.molecule, 0, 0); + mol_mapping.emplace(rc.index, rxn.addCatalystCopy(*rc.molecule, 0, 0)); break; } } } + + for (int i = 0; i < rxn.reactionBlocksCount(); ++i) + { + auto& rb = rxn.reactionBlock(i); + for (auto& ridx : rb.reactants) + ridx = mol_mapping.at(ridx); + for (auto& pidx : rb.products) + pidx = mol_mapping.at(pidx); + } } From 454f464125b74084e3902b3fe0f7feb70ea5dbde Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Wed, 11 Sep 2024 05:40:51 +0200 Subject: [PATCH 02/30] conversions --- core/indigo-core/common/math/algebra.h | 2 +- .../layout/src/reaction_layout.cpp | 2 +- core/indigo-core/molecule/ket_commons.h | 6 +- core/indigo-core/reaction/base_reaction.h | 2 - .../reaction/pathway_reaction_builder.h | 2 +- .../reaction/reaction_multistep_detector.h | 6 + .../reaction/src/pathway_reaction_builder.cpp | 4 +- .../reaction/src/reaction_json_loader.cpp | 8 +- .../src/reaction_multistep_detector.cpp | 253 ++++++++++++++---- utils/indigo-depict/main.c | 2 +- 10 files changed, 215 insertions(+), 72 deletions(-) diff --git a/core/indigo-core/common/math/algebra.h b/core/indigo-core/common/math/algebra.h index d84d49a6b7..dec6a63c71 100644 --- a/core/indigo-core/common/math/algebra.h +++ b/core/indigo-core/common/math/algebra.h @@ -386,7 +386,7 @@ namespace indigo // return !same_sign && Vec2f::cross(lb, vr) > 0 && count < 4; } - inline double pointDistance(const Vec2f& pt) + inline float pointDistance(const Vec2f& pt) { if (pt.x <= left()) { diff --git a/core/indigo-core/layout/src/reaction_layout.cpp b/core/indigo-core/layout/src/reaction_layout.cpp index 23b39ae5a0..bf72943f51 100644 --- a/core/indigo-core/layout/src/reaction_layout.cpp +++ b/core/indigo-core/layout/src/reaction_layout.cpp @@ -64,7 +64,7 @@ void ReactionLayout::fixLayout() rl.preserve_molecule_layout = true; rl.make(); } - else if (_r.meta().getMetaCount(KETReactionArrow::CID) == 0) + else if (_r.meta().getMetaCount(KETReactionArrow::CID) == 0 && _r.meta().getMetaCount(KETReactionMultitailArrow::CID) == 0) _updateMetadata(); } diff --git a/core/indigo-core/molecule/ket_commons.h b/core/indigo-core/molecule/ket_commons.h index 9f6c30dda6..ee05c112db 100644 --- a/core/indigo-core/molecule/ket_commons.h +++ b/core/indigo-core/molecule/ket_commons.h @@ -397,7 +397,9 @@ namespace indigo { public: static const std::uint32_t CID = "KET reaction plus"_hash; - KETReactionPlus(const Vec2f& pos) : MetaObject(CID), _pos(pos){}; + KETReactionPlus(const Vec2f& pos) : MetaObject(CID), _pos(pos){ + std::cout << "plus" << std::endl; + }; MetaObject* clone() const override { @@ -488,6 +490,7 @@ namespace indigo std::vector indexes; int role; std::vector arrows_to; + std::vector arrows_from; }; struct ReactionComponent @@ -514,6 +517,7 @@ namespace indigo ARROW_ELLIPTICAL_ARC_OPEN_ANGLE, ARROW_ELLIPTICAL_ARC_OPEN_HALF_ANGLE, ARROW_RETROSYNTHETIC, + ARROW_MULTITAIL }; enum diff --git a/core/indigo-core/reaction/base_reaction.h b/core/indigo-core/reaction/base_reaction.h index 80197f38f6..4dccde1976 100644 --- a/core/indigo-core/reaction/base_reaction.h +++ b/core/indigo-core/reaction/base_reaction.h @@ -81,11 +81,9 @@ namespace indigo { reactants.copy(other.reactants); products.copy(other.products); - arrow_index = other.arrow_index; } Array reactants; Array products; - int arrow_index; }; class DLLEXPORT BaseReaction : public NonCopyable diff --git a/core/indigo-core/reaction/pathway_reaction_builder.h b/core/indigo-core/reaction/pathway_reaction_builder.h index d281e46cfa..5ee13ab774 100644 --- a/core/indigo-core/reaction/pathway_reaction_builder.h +++ b/core/indigo-core/reaction/pathway_reaction_builder.h @@ -62,7 +62,7 @@ namespace indigo void buildInchiDescriptors(std::deque& reactions); void buildNodes(std::deque& reactions); auto findSuccessorReactions(int reactionIdx); - void buildReactions(std::deque& reactions); + void buildReactions(); std::vector _reactionInchiDescriptors; std::unordered_map> _reactantToReactions; diff --git a/core/indigo-core/reaction/reaction_multistep_detector.h b/core/indigo-core/reaction/reaction_multistep_detector.h index 121b498899..09bace443e 100644 --- a/core/indigo-core/reaction/reaction_multistep_detector.h +++ b/core/indigo-core/reaction/reaction_multistep_detector.h @@ -43,6 +43,7 @@ namespace indigo ReactionMultistepDetector(BaseMolecule& mol); ~ReactionMultistepDetector(); void buildReaction(BaseReaction& rxn); + typedef std::pair FLOAT_INT_PAIR; typedef std::vector FLOAT_INT_PAIRS; const Vec2f PLUS_BBOX_SHIFT = {0.9f, 0.9f}; @@ -51,7 +52,11 @@ namespace indigo DECL_ERROR; private: + void createSummBlocks(); void constructMultipleArrowReaction(BaseReaction& rxn); + void detectArrows(); + void detectMultitailArrows(BaseReaction& rxn); + bool findPlusNeighbours(const Vec2f& plus_pos, const FLOAT_INT_PAIRS& mol_tops, const FLOAT_INT_PAIRS& mol_bottoms, const FLOAT_INT_PAIRS& mol_lefts, const FLOAT_INT_PAIRS& mol_rights, std::pair& connection); @@ -59,6 +64,7 @@ namespace indigo std::vector _reaction_components; std::vector _component_summ_blocks; std::list _component_summ_blocks_list; + int _moleculeCount; }; } // namespace indigo diff --git a/core/indigo-core/reaction/src/pathway_reaction_builder.cpp b/core/indigo-core/reaction/src/pathway_reaction_builder.cpp index 5c93130df7..f9433848fd 100644 --- a/core/indigo-core/reaction/src/pathway_reaction_builder.cpp +++ b/core/indigo-core/reaction/src/pathway_reaction_builder.cpp @@ -79,7 +79,7 @@ auto PathwayReactionBuilder::findSuccessorReactions(int reactionIdx) return matchedReactions; } -void PathwayReactionBuilder::buildReactions(std::deque& reactions) +void PathwayReactionBuilder::buildReactions() { for (int i = 0; i < (int)_reactionInchiDescriptors.size(); ++i) { @@ -211,7 +211,7 @@ std::unique_ptr PathwayReactionBuilder::buildPathwayReaction(st { buildInchiDescriptors(reactions); buildNodes(reactions); - buildReactions(reactions); + buildReactions(); const auto& rr = _pathwayReaction->getRootReactions(); PathwayLayout pl(*_pathwayReaction); pl.make(); diff --git a/core/indigo-core/reaction/src/reaction_json_loader.cpp b/core/indigo-core/reaction/src/reaction_json_loader.cpp index bfec827047..ea04cb66fb 100644 --- a/core/indigo-core/reaction/src/reaction_json_loader.cpp +++ b/core/indigo-core/reaction/src/reaction_json_loader.cpp @@ -72,13 +72,13 @@ void ReactionJsonLoader::loadReaction(BaseReaction& rxn) rxn.original_format = BaseMolecule::KET; rxn.meta().clone(_pmol->meta()); - _pmol->meta().resetMetaData(); - int arrow_count = rxn.meta().getMetaCount(KETReactionArrow::CID) + rxn.meta().getMetaCount(KETReactionMultitailArrow::CID); - if (arrow_count == 0) + int arrow_count = rxn.meta().getMetaCount(KETReactionArrow::CID); + int multi_count = rxn.meta().getMetaCount(KETReactionMultitailArrow::CID); + if (arrow_count == 0 && multi_count == 0) throw Error("No arrow in the reaction"); - if (arrow_count > 1) + if (arrow_count > 1 || multi_count > 0) { ReactionMultistepDetector md(*_pmol); md.buildReaction(rxn); diff --git a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp index 323aea8663..3cf78691dc 100644 --- a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp +++ b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp @@ -37,27 +37,27 @@ ReactionMultistepDetector::~ReactionMultistepDetector() { } -ReactionMultistepDetector::ReactionMultistepDetector(BaseMolecule& bmol) : _bmol(bmol) +ReactionMultistepDetector::ReactionMultistepDetector(BaseMolecule& bmol) : _bmol(bmol), _moleculeCount(0) { } -void ReactionMultistepDetector::buildReaction(BaseReaction& rxn) +void ReactionMultistepDetector::createSummBlocks() { auto pair_comp_asc = [](const FLOAT_INT_PAIR& a, const FLOAT_INT_PAIR& b) { return b.first > a.first; }; auto pair_comp_des = [](const FLOAT_INT_PAIR& a, const FLOAT_INT_PAIR& b) { return b.first < a.first; }; auto pair_comp_mol_asc = [](const FLOAT_INT_PAIR& a, const FLOAT_INT_PAIR& b) { return b.second > a.second; }; std::list> s_neighbors; getSGroupAtoms(_bmol, s_neighbors); - int count = _bmol.countComponents(s_neighbors); - _reaction_components.reserve(count); + _moleculeCount = _bmol.countComponents(s_neighbors); + _reaction_components.reserve(_moleculeCount); FLOAT_INT_PAIRS mol_tops, mol_bottoms, mol_lefts, mol_rights; // collect components - for (int i = 0; i < count; ++i) + for (int i = 0; i < _moleculeCount; ++i) { Filter filter(_bmol.getDecomposition().ptr(), Filter::EQ, i); std::unique_ptr component; - if (rxn.isQueryReaction()) + if (_bmol.isQueryMolecule()) component = std::make_unique(); else component = std::make_unique(); @@ -74,9 +74,9 @@ void ReactionMultistepDetector::buildReaction(BaseReaction& rxn) _reaction_components.emplace_back(ReactionComponent::MOLECULE, bbox, i, std::move(component)); } - for (int i = 0; i < rxn.meta().getMetaCount(KETReactionPlus::CID); ++i) + for (int i = 0; i < _bmol.meta().getMetaCount(KETReactionPlus::CID); ++i) { - auto& plus = (const KETReactionPlus&)rxn.meta().getMetaObject(KETReactionPlus::CID, i); + auto& plus = (const KETReactionPlus&)_bmol.meta().getMetaObject(KETReactionPlus::CID, i); const auto& plus_pos = plus.getPos(); Rect2f bbox(plus_pos - PLUS_BBOX_SHIFT, plus_pos + PLUS_BBOX_SHIFT); _reaction_components.emplace_back(ReactionComponent::PLUS, bbox, i, std::unique_ptr(nullptr)); @@ -88,9 +88,9 @@ void ReactionMultistepDetector::buildReaction(BaseReaction& rxn) mol_rights.emplace_back(bbox.right(), index); } - for (int i = 0; i < rxn.meta().getMetaCount(KETReactionArrow::CID); ++i) + for (int i = 0; i < _bmol.meta().getMetaCount(KETReactionArrow::CID); ++i) { - auto& arrow = (const KETReactionArrow&)rxn.meta().getMetaObject(KETReactionArrow::CID, i); + auto& arrow = (const KETReactionArrow&)_bmol.meta().getMetaObject(KETReactionArrow::CID, i); int arrow_type = arrow.getArrowType(); bool reverseReactionOrder = arrow_type == KETReactionArrow::ERetrosynthetic; const Vec2f& arr_begin = !reverseReactionOrder ? arrow.getTail() : arrow.getHead(); @@ -106,21 +106,40 @@ void ReactionMultistepDetector::buildReaction(BaseReaction& rxn) mol_rights.emplace_back(bbox.right(), index); } + for (int i = 0; i < _bmol.meta().getMetaCount(KETReactionMultitailArrow::CID); ++i) + { + auto& multi = (const KETReactionMultitailArrow&)_bmol.meta().getMetaObject(KETReactionMultitailArrow::CID, i); + auto& tails = multi.getTails(); + Rect2f bbox(Vec2f(tails.top().x, tails.top().y), Vec2f(multi.getHead().x, multi.getSpineBegin().y)); + _reaction_components.emplace_back(ReactionComponent::ARROW_MULTITAIL, bbox, i, std::unique_ptr(nullptr)); + _reaction_components.back().coordinates.push_back(multi.getHead()); + for (auto& tail : tails) + _reaction_components.back().coordinates.push_back(tail); + _reaction_components.back().coordinates.push_back(multi.getSpineBegin()); + _reaction_components.back().coordinates.push_back(multi.getSpineEnd()); + + int index = static_cast(_reaction_components.size() - 1); + mol_tops.emplace_back(bbox.top(), index); + mol_bottoms.emplace_back(bbox.bottom(), index); + mol_lefts.emplace_back(bbox.left(), index); + mol_rights.emplace_back(bbox.right(), index); + } + // sort components std::sort(mol_tops.begin(), mol_tops.end(), pair_comp_asc); std::sort(mol_bottoms.begin(), mol_bottoms.end(), pair_comp_des); std::sort(mol_lefts.begin(), mol_lefts.end(), pair_comp_des); std::sort(mol_rights.begin(), mol_rights.end(), pair_comp_asc); - for (int i = 0; i < rxn.meta().getMetaCount(KETReactionPlus::CID); ++i) + for (int i = 0; i < _bmol.meta().getMetaCount(KETReactionPlus::CID); ++i) { - auto& plus = static_cast(rxn.meta().getMetaObject(KETReactionPlus::CID, i)); + auto& plus = static_cast(_bmol.meta().getMetaObject(KETReactionPlus::CID, i)); auto& plus_pos = plus.getPos(); std::pair plus_connection; // (component1_index, component2_index) if (findPlusNeighbours(plus_pos, mol_tops, mol_bottoms, mol_lefts, mol_rights, plus_connection)) { - _reaction_components[count + i].summ_block_idx = ReactionComponent::CONNECTED; // mark plus as connected + _reaction_components[_moleculeCount + i].summ_block_idx = ReactionComponent::CONNECTED; // mark plus as connected auto rc_connection = std::make_pair(std::ref(_reaction_components[plus_connection.first]), std::ref(_reaction_components[plus_connection.second])); // component1, component2 @@ -214,28 +233,35 @@ void ReactionMultistepDetector::buildReaction(BaseReaction& rxn) _component_summ_blocks.back().indexes.push_back(static_cast(i)); } } +} - for (auto& csb : _component_summ_blocks) - { - rxn.meta().addMetaObject(new KETSimpleObject(KETSimpleObject::EKETRectangle, std::make_pair(csb.bbox.leftBottom(), csb.bbox.rightTop()))); - } +void ReactionMultistepDetector::buildReaction(BaseReaction& rxn) +{ + createSummBlocks(); + detectArrows(); + detectMultitailArrows(rxn); + // _component_summ_blocks, _reaction_components - result + constructMultipleArrowReaction(rxn); +} - // handle arrows - for (int i = 0; i < rxn.meta().getMetaCount(KETReactionArrow::CID); ++i) +void ReactionMultistepDetector::detectArrows() +{ + for (int i = 0; i < _bmol.meta().getMetaCount(KETReactionArrow::CID); ++i) { - auto& arrow = (const KETReactionArrow&)rxn.meta().getMetaObject(KETReactionArrow::CID, i); + auto& arrow = (const KETReactionArrow&)_bmol.meta().getMetaObject(KETReactionArrow::CID, i); int arrow_type = arrow.getArrowType(); bool reverseReactionOrder = arrow_type == KETReactionArrow::ERetrosynthetic; const Vec2f& arr_begin = !reverseReactionOrder ? arrow.getTail() : arrow.getHead(); const Vec2f& arr_end = !reverseReactionOrder ? arrow.getHead() : arrow.getTail(); - double min_dist_prod = -1, min_dist_reac = -1; + + float min_dist_prod = -1, min_dist_reac = -1; int idx_cs_min_prod = -1, idx_cs_min_reac = -1; for (int index_cs = 0; index_cs < static_cast(_component_summ_blocks.size()); ++index_cs) { auto& csb = _component_summ_blocks[index_cs]; if (csb.bbox.rayIntersectsRect(arr_end, arr_begin)) { - double dist = csb.bbox.pointDistance(arr_end); + float dist = csb.bbox.pointDistance(arr_end); if (min_dist_prod < 0 || dist < min_dist_prod) { min_dist_prod = dist; @@ -244,7 +270,7 @@ void ReactionMultistepDetector::buildReaction(BaseReaction& rxn) } else if (csb.bbox.rayIntersectsRect(arr_begin, arr_end)) { - double dist = csb.bbox.pointDistance(arr_begin); + float dist = csb.bbox.pointDistance(arr_begin); if (min_dist_reac < 0 || dist < min_dist_reac) { min_dist_reac = dist; @@ -253,12 +279,10 @@ void ReactionMultistepDetector::buildReaction(BaseReaction& rxn) } } - auto& rb = rxn.addReactionBlock(); - rb.arrow_index = i; - + // TODO: add upper limit if (min_dist_prod > 0 && min_dist_reac > 0) // if both ends present { - auto& rc_arrow = _reaction_components[count + rxn.meta().getMetaCount(KETReactionPlus::CID) + i]; + auto& rc_arrow = _reaction_components[_moleculeCount + _bmol.meta().getMetaCount(KETReactionPlus::CID) + i]; rc_arrow.summ_block_idx = ReactionComponent::CONNECTED; // mark arrow as connected auto& csb_min_prod = _component_summ_blocks[idx_cs_min_prod]; if (csb_min_prod.role == BaseReaction::UNDEFINED) @@ -272,22 +296,105 @@ void ReactionMultistepDetector::buildReaction(BaseReaction& rxn) else if (csb_min_reac.role == BaseReaction::PRODUCT) csb_min_reac.role = BaseReaction::INTERMEDIATE; - // idx_cs_min_reac -> idx_cs_min_prod + // idx_cs_min_reac <-> idx_cs_min_prod csb_min_reac.arrows_to.push_back(idx_cs_min_prod); - for (auto ri : csb_min_reac.indexes) + csb_min_prod.arrows_from.push_back(idx_cs_min_reac); + } + } +} + +void ReactionMultistepDetector::detectMultitailArrows(BaseReaction& rxn) +{ + for (int i = 0; i < rxn.meta().getMetaCount(KETReactionMultitailArrow::CID); ++i) + { + auto& multi = (const KETReactionMultitailArrow&)rxn.meta().getMetaObject(KETReactionMultitailArrow::CID, i); + float min_dist_prod = -1; + int idx_cs_min_prod = -1; + auto& arr_begin = multi.getHead(); + auto arr_end = arr_begin; + arr_end.x = multi.getSpineBegin().x; + auto& tails = multi.getTails(); + std::vector> min_dist_reactants; + min_dist_reactants.resize(tails.size(), std::make_pair(-1.0f, -1)); + + for (int index_cs = 0; index_cs < static_cast(_component_summ_blocks.size()); ++index_cs) + { + auto& csb = _component_summ_blocks[index_cs]; + if (csb.bbox.rayIntersectsRect(arr_begin, arr_end)) + { + float dist = csb.bbox.pointDistance(arr_end); + if (min_dist_prod < 0 || dist < min_dist_prod) + { + min_dist_prod = dist; + idx_cs_min_prod = index_cs; + } + } + + for (int j = 0; j < tails.size(); ++j) { - rb.reactants.push(_reaction_components[ri].index); + auto& arr_begin = tails[j]; + auto arr_end = arr_begin; + arr_end.x = multi.getSpineBegin().x; + + if (csb.bbox.rayIntersectsRect(arr_begin, arr_end)) + { + auto dist = csb.bbox.pointDistance(arr_begin); + if (min_dist_reactants[j].first < 0 || dist < min_dist_reactants[j].first) + { + min_dist_reactants[j].first = dist; + min_dist_reactants[j].second = index_cs; + } + } } + } - for (auto pi : csb_min_prod.indexes) + auto& rb = rxn.addReactionBlock(); + + // TODO: add upper limit + if (min_dist_prod > 0) + { + auto& csb_min_prod = _component_summ_blocks[idx_cs_min_prod]; + for (int j = 0; j < min_dist_reactants.size(); ++j) { - rb.products.push(_reaction_components[pi].index); + auto& reac = min_dist_reactants[j]; + if (reac.first > 0) + { + if (j == 0) + { + auto& rc_arrow = _reaction_components[_moleculeCount + rxn.meta().getMetaCount(KETReactionPlus::CID) + + rxn.meta().getMetaCount(KETReactionArrow::CID) + i]; + rc_arrow.summ_block_idx = ReactionComponent::CONNECTED; // mark arrow as connected + if (csb_min_prod.role == BaseReaction::UNDEFINED) + csb_min_prod.role = BaseReaction::PRODUCT; + else if (csb_min_prod.role == BaseReaction::REACTANT) + csb_min_prod.role = BaseReaction::INTERMEDIATE; + } + + auto& csb_min_reac = _component_summ_blocks[reac.second]; + if (csb_min_reac.role == BaseReaction::UNDEFINED) + csb_min_reac.role = BaseReaction::REACTANT; + else if (csb_min_reac.role == BaseReaction::PRODUCT) + csb_min_reac.role = BaseReaction::INTERMEDIATE; + + // idx_cs_min_reac <-> idx_cs_min_prod + csb_min_reac.arrows_to.push_back(idx_cs_min_prod); + csb_min_prod.arrows_from.push_back(reac.second); + } } + + //for (auto prod_idx : csb_min_prod.indexes) + // rb.products.push(prod_idx); + + //for (auto& reac : min_dist_reactants) + //{ + // if (reac.first > 0) + // { + // for (auto reac_idx : _component_summ_blocks[reac.second].indexes) + // rb.reactants.push(reac_idx); + // } + //} } } - - // _component_summ_blocks, _reaction_components - result - constructMultipleArrowReaction(rxn); } bool ReactionMultistepDetector::findPlusNeighbours(const Vec2f& plus_pos, const FLOAT_INT_PAIRS& mol_tops, const FLOAT_INT_PAIRS& mol_bottoms, @@ -390,39 +497,67 @@ void ReactionMultistepDetector::constructMultipleArrowReaction(BaseReaction& rxn { // _reaction_components -> allMolecules // _component_summ_blocks -> - std::unordered_map mol_mapping; - for (auto& rc : _reaction_components) - { - if (rc.component_type == ReactionComponent::MOLECULE) + std::unordered_map copied_components; + for ( int i = 0; i < _component_summ_blocks.size(); ++i ) + { + auto& csb = _component_summ_blocks[i]; + auto& rb = rxn.addReactionBlock(); + for (auto idx : csb.indexes) { - auto& csb = _component_summ_blocks[rc.summ_block_idx]; + auto& rc = _reaction_components[idx]; + int mol_idx = -1; + auto it_copied = copied_components.find(idx); + if (it_copied != copied_components.end()) + mol_idx = it_copied->second; switch (csb.role) { - case BaseReaction::REACTANT: - mol_mapping.emplace(rc.index, rxn.addReactantCopy(*rc.molecule, 0, 0)); - break; - case BaseReaction::PRODUCT: - mol_mapping.emplace(rc.index, rxn.addProductCopy(*rc.molecule, 0, 0)); - break; case BaseReaction::INTERMEDIATE: - mol_mapping.emplace(rc.index, rxn.addIntermediateCopy(*rc.molecule, 0, 0)); + if (mol_idx < 0) + { + mol_idx = rxn.addIntermediateCopy(*rc.molecule, 0, 0); + copied_components.emplace(idx, mol_idx); + } + rb.reactants.push(mol_idx); + break; + case BaseReaction::REACTANT: + if (mol_idx < 0) + { + mol_idx = rxn.addReactantCopy(*rc.molecule, 0, 0); + copied_components.emplace(idx, mol_idx); + } + rb.reactants.push(mol_idx); break; case BaseReaction::UNDEFINED: - mol_mapping.emplace(rc.index, rxn.addUndefinedCopy(*rc.molecule, 0, 0)); + copied_components.emplace(idx, rxn.addUndefinedCopy(*rc.molecule, 0, 0)); break; - case BaseReaction::CATALYST: - mol_mapping.emplace(rc.index, rxn.addCatalystCopy(*rc.molecule, 0, 0)); + default: + // skip products here break; } } - } - for (int i = 0; i < rxn.reactionBlocksCount(); ++i) - { - auto& rb = rxn.reactionBlock(i); - for (auto& ridx : rb.reactants) - ridx = mol_mapping.at(ridx); - for (auto& pidx : rb.products) - pidx = mol_mapping.at(pidx); - } + for (auto csb_index : csb.arrows_to) + { + auto& csb_product = _component_summ_blocks[csb_index]; + for (auto pidx : csb_product.indexes) + { + auto& rc = _reaction_components[pidx]; + auto it_copied = copied_components.find(pidx); + int mol_idx = -1; + if (it_copied != copied_components.end()) + { + mol_idx = it_copied->second; + } + else + { + if( csb_product.role == BaseReaction::PRODUCT) + mol_idx = rxn.addProductCopy(*rc.molecule, 0, 0); + else if (csb_product.role == BaseReaction::INTERMEDIATE) + mol_idx = rxn.addIntermediateCopy(*rc.molecule, 0, 0); + copied_components.emplace(pidx, mol_idx); + } + rb.products.push( mol_idx ); + } + } + } } diff --git a/utils/indigo-depict/main.c b/utils/indigo-depict/main.c index c2cd27f850..0364fc4c8d 100644 --- a/utils/indigo-depict/main.c +++ b/utils/indigo-depict/main.c @@ -1058,7 +1058,7 @@ int main(int argc, char* argv[]) _prepare(obj, p.aromatization); if (p.action == ACTION_LAYOUT) { - indigoLayout(obj); + //indigoLayout(obj); if (p.out_ext == OEXT_CML) indigoSaveCmlToFile(obj, p.outfile); else if (p.out_ext == OEXT_RXN) From fe3a10e5f4fbc86ce04c16af1c4488a390c3d2c9 Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Sun, 15 Sep 2024 13:29:13 +0200 Subject: [PATCH 03/30] all fixed --- api/c/indigo/indigo.h | 1 + api/c/indigo/src/indigo_layout.cpp | 14 +- api/c/indigo/src/indigo_reaction.cpp | 49 +++-- api/c/indigo/src/indigo_reaction.h | 3 +- api/c/indigo/src/indigo_savers.cpp | 3 +- api/python/indigo/indigo/indigo_lib.py | 2 + api/python/indigo/indigo/indigo_object.py | 12 ++ .../integration/tests/formats/ket_cdxml.py | 6 +- .../integration/tests/formats/ref/multi.cdxml | 74 ++++---- .../integration/tests/formats/ref/multi.ket | 168 +++++++++--------- .../tests/formats/ref/multi_overlap.cdxml | 88 ++++----- .../tests/formats/ref/multi_overlap.ket | 58 +++--- api/wasm/indigo-ketcher/indigo-ketcher.cpp | 13 ++ core/indigo-core/layout/pathway_layout.h | 2 +- core/indigo-core/layout/reaction_layout.h | 3 + .../indigo-core/layout/src/pathway_layout.cpp | 3 +- .../layout/src/reaction_layout.cpp | 37 +++- core/indigo-core/molecule/ket_commons.h | 7 +- .../molecule/src/molecule_json_loader.cpp | 2 +- core/indigo-core/reaction/base_reaction.h | 22 ++- core/indigo-core/reaction/pathway_reaction.h | 97 +++++++--- .../reaction/pathway_reaction_builder.h | 1 + core/indigo-core/reaction/query_reaction.h | 1 + core/indigo-core/reaction/reaction.h | 2 + .../indigo-core/reaction/reaction_cml_saver.h | 3 +- .../reaction/reaction_json_loader.h | 4 +- .../reaction/reaction_multistep_detector.h | 9 +- .../reaction/src/base_reaction.cpp | 5 + .../reaction/src/pathway_reaction.cpp | 10 +- .../reaction/src/pathway_reaction_builder.cpp | 41 +++-- .../reaction/src/query_reaction.cpp | 7 + core/indigo-core/reaction/src/reaction.cpp | 35 ++-- .../reaction/src/reaction_auto_loader.cpp | 28 +-- .../reaction/src/reaction_cml_saver.cpp | 8 +- .../reaction/src/reaction_json_loader.cpp | 27 +-- .../src/reaction_multistep_detector.cpp | 150 ++++++++++++---- utils/indigo-depict/main.c | 2 +- 37 files changed, 636 insertions(+), 361 deletions(-) diff --git a/api/c/indigo/indigo.h b/api/c/indigo/indigo.h index 1a400772b8..b03033a7e4 100644 --- a/api/c/indigo/indigo.h +++ b/api/c/indigo/indigo.h @@ -323,6 +323,7 @@ CEXPORT int indigoIterateProducts(int reaction); CEXPORT int indigoIterateCatalysts(int reaction); // Returns an iterator for reactants, products, and catalysts. CEXPORT int indigoIterateMolecules(int reaction); +CEXPORT int indigoIterateReactions(int reaction); CEXPORT int indigoSaveRxnfile(int reaction, int output); CEXPORT int indigoSaveRxnfileToFile(int reaction, const char* filename); diff --git a/api/c/indigo/src/indigo_layout.cpp b/api/c/indigo/src/indigo_layout.cpp index d27ff4aa0d..fa8068cfa4 100644 --- a/api/c/indigo/src/indigo_layout.cpp +++ b/api/c/indigo/src/indigo_layout.cpp @@ -15,6 +15,8 @@ * See the License for the specific language governing permissions and * limitations under the License. ***************************************************************************/ +#include +#include #include "base_cpp/cancellation_handler.h" #include "indigo_internal.h" @@ -22,10 +24,9 @@ #include "indigo_reaction.h" #include "layout/molecule_cleaner_2d.h" #include "layout/molecule_layout.h" +#include "layout/pathway_layout.h" #include "layout/reaction_layout.h" #include "reaction/base_reaction.h" -#include -#include CEXPORT int indigoLayout(int object) { @@ -101,9 +102,12 @@ CEXPORT int indigoLayout(int object) else if (IndigoBaseReaction::is(obj)) { BaseReaction& rxn = obj.getBaseReaction(); - bool no_layout = rxn.intermediateCount() || rxn.specialConditionsCount() || rxn.meta().getNonChemicalMetaCount() || - obj.type == IndigoObject::PATHWAY_REACTION || rxn.multitaleCount(); - if (!no_layout) + if (rxn.isPathwayReaction()) + { + PathwayLayout pl(static_cast(rxn)); + pl.make(); + } + else { ReactionLayout rl(rxn, self.smart_layout); rl.max_iterations = self.layout_max_iterations; diff --git a/api/c/indigo/src/indigo_reaction.cpp b/api/c/indigo/src/indigo_reaction.cpp index 0242592534..555fbe6f5b 100644 --- a/api/c/indigo/src/indigo_reaction.cpp +++ b/api/c/indigo/src/indigo_reaction.cpp @@ -226,37 +226,49 @@ IndigoReactionIter::~IndigoReactionIter() int IndigoReactionIter::_begin() { - if (_subtype == REACTANTS) + switch (_subtype) + { + case REACTANTS: return _rxn.reactantBegin(); - if (_subtype == PRODUCTS) + case PRODUCTS: return _rxn.productBegin(); - if (_subtype == CATALYSTS) + case CATALYSTS: return _rxn.catalystBegin(); - + case REACTIONS: + return _rxn.reactionBegin(); + } return _rxn.begin(); } int IndigoReactionIter::_end() { - if (_subtype == REACTANTS) + switch (_subtype) + { + case REACTANTS: return _rxn.reactantEnd(); - if (_subtype == PRODUCTS) + case PRODUCTS: return _rxn.productEnd(); - if (_subtype == CATALYSTS) + case CATALYSTS: return _rxn.catalystEnd(); - + case REACTIONS: + return _rxn.reactionEnd(); + } return _rxn.end(); } int IndigoReactionIter::_next(int i) { - if (_subtype == REACTANTS) + switch (_subtype) + { + case REACTANTS: return _rxn.reactantNext(i); - if (_subtype == PRODUCTS) + case PRODUCTS: return _rxn.productNext(i); - if (_subtype == CATALYSTS) + case CATALYSTS: return _rxn.catalystNext(i); - + case REACTIONS: + return _rxn.reactionNext(i); + } return _rxn.next(i); } @@ -272,7 +284,13 @@ IndigoObject* IndigoReactionIter::next() if (_idx == _end()) return 0; - if (_map) + if (_subtype == REACTION) + { + auto reaction = new IndigoReaction(); + reaction->init( _rxn.getBaseReaction(_idx)); + return reaction; + } + else if (_map) { return new IndigoReactionMolecule(_rxn, *_map, _idx); } @@ -429,6 +447,11 @@ CEXPORT int indigoIterateMolecules(int reaction) return _indigoIterateReaction(reaction, IndigoReactionIter::MOLECULES); } +CEXPORT int indigoIterateReactions(int reaction) +{ + return _indigoIterateReaction(reaction, IndigoReactionIter::REACTIONS); +} + CEXPORT int indigoCreateReaction(void) { INDIGO_BEGIN diff --git a/api/c/indigo/src/indigo_reaction.h b/api/c/indigo/src/indigo_reaction.h index 28a85a194c..f747428729 100644 --- a/api/c/indigo/src/indigo_reaction.h +++ b/api/c/indigo/src/indigo_reaction.h @@ -131,7 +131,8 @@ class IndigoReactionIter : public IndigoObject REACTANTS, PRODUCTS, CATALYSTS, - MOLECULES + MOLECULES, + REACTIONS }; IndigoReactionIter(BaseReaction& rxn, MonomersProperties& map, int subtype); diff --git a/api/c/indigo/src/indigo_savers.cpp b/api/c/indigo/src/indigo_savers.cpp index 33e052a39b..a3cdb2ac37 100644 --- a/api/c/indigo/src/indigo_savers.cpp +++ b/api/c/indigo/src/indigo_savers.cpp @@ -770,9 +770,8 @@ CEXPORT int indigoSaveCml(int item, int output) } if (IndigoBaseReaction::is(obj)) { - Reaction& rxn = obj.getReaction(); + auto& rxn = obj.getBaseReaction(); ReactionCmlSaver saver(out); - saver.saveReaction(rxn); out.flush(); return 1; diff --git a/api/python/indigo/indigo/indigo_lib.py b/api/python/indigo/indigo/indigo_lib.py index b00a18193c..a55933e5d6 100644 --- a/api/python/indigo/indigo/indigo_lib.py +++ b/api/python/indigo/indigo/indigo_lib.py @@ -332,6 +332,8 @@ def __init__(self) -> None: IndigoLib.lib.indigoIterateCatalysts.argtypes = [c_int] IndigoLib.lib.indigoIterateMolecules.restype = c_int IndigoLib.lib.indigoIterateMolecules.argtypes = [c_int] + IndigoLib.lib.indigoIterateReactions.restype = c_int + IndigoLib.lib.indigoIterateReactions.argtypes = [c_int] IndigoLib.lib.indigoSaveRxnfileToFile.restype = c_int IndigoLib.lib.indigoSaveRxnfileToFile.argtypes = [c_int, c_char_p] IndigoLib.lib.indigoRxnfile.restype = c_char_p diff --git a/api/python/indigo/indigo/indigo_object.py b/api/python/indigo/indigo/indigo_object.py index 5a26b77961..b8e0c4fdfb 100644 --- a/api/python/indigo/indigo/indigo_object.py +++ b/api/python/indigo/indigo/indigo_object.py @@ -508,6 +508,18 @@ def iterateMolecules(self): IndigoLib.checkResult(self._lib().indigoIterateMolecules(self.id)), ) + def iterateReactions(self): + """Reaction method iterates molecules + + Returns: + IndigoObject: reaction iterator + """ + + return IndigoObject( + self.session, + IndigoLib.checkResult(self._lib().indigoIterateReactions(self.id)), + ) + def saveRxnfile(self, filename): """Reaction method saves the reaction into an RXN file diff --git a/api/tests/integration/tests/formats/ket_cdxml.py b/api/tests/integration/tests/formats/ket_cdxml.py index 03936e5c5e..2e8676a95e 100644 --- a/api/tests/integration/tests/formats/ket_cdxml.py +++ b/api/tests/integration/tests/formats/ket_cdxml.py @@ -61,6 +61,8 @@ def find_diff(a, b): # with open(os.path.join(ref_path, filename + ".ket"), "w") as file: # file.write(ket_result) + # with open(os.path.join(ref_path, filename + ".cdxml"), "w") as file: + # file.write(cdxml_text) with open(os.path.join(ref_path, filename) + ".ket", "r") as file: ket_ref = file.read() @@ -95,8 +97,8 @@ def find_diff(a, b): print(getIndigoExceptionText(e)) raise SystemExit cdxml_text = ket.cdxml() - # with open(os.path.join(ref_path, filename) + ".cdxml", "w") as file: - # file.write(cdxml_text) + with open(os.path.join(ref_path, filename) + ".cdxml", "w") as file: + file.write(cdxml_text) indigo.loadMolecule( cdxml_text diff --git a/api/tests/integration/tests/formats/ref/multi.cdxml b/api/tests/integration/tests/formats/ref/multi.cdxml index c87087f5d8..3795d64349 100644 --- a/api/tests/integration/tests/formats/ref/multi.cdxml +++ b/api/tests/integration/tests/formats/ref/multi.cdxml @@ -18,20 +18,20 @@ - - - - + + + - - + - - - - - + + + + + + + @@ -43,18 +43,18 @@ - - - - - - - - - - - - + + + + + + + + + + + + @@ -73,18 +73,18 @@ - - - - - - - - - - - - + + + + + + + + + + + + @@ -92,8 +92,8 @@ - - + + diff --git a/api/tests/integration/tests/formats/ref/multi.ket b/api/tests/integration/tests/formats/ref/multi.ket index 158a74c7c2..8799ec887b 100644 --- a/api/tests/integration/tests/formats/ref/multi.ket +++ b/api/tests/integration/tests/formats/ref/multi.ket @@ -87,32 +87,24 @@ { "label": "C", "location": [ - 3.532207489013672, - -4.122548580169678, - 0.0 - ] - }, - { - "label": "C", - "location": [ - 3.5285041332244879, - -3.127451181411743, + 5.274374008178711, + -4.082470417022705, 0.0 ] }, { "label": "C", "location": [ - 2.5202949047088625, - -4.109637260437012, + 6.275625705718994, + -4.082470417022705, 0.0 ] }, { "label": "C", "location": [ - 2.5177924633026125, - -3.127451181411743, + 5.775050163269043, + -3.217529535293579, 0.0 ] } @@ -136,14 +128,7 @@ "type": 1, "atoms": [ 1, - 3 - ] - }, - { - "type": 1, - "atoms": [ - 2, - 3 + 2 ] } ] @@ -154,24 +139,32 @@ { "label": "C", "location": [ - 5.274374008178711, - -4.082470417022705, + 3.532207489013672, + -4.122548580169678, 0.0 ] }, { "label": "C", "location": [ - 6.275625705718994, - -4.082470417022705, + 3.5285041332244879, + -3.127451181411743, 0.0 ] }, { "label": "C", "location": [ - 5.775050163269043, - -3.217529535293579, + 2.5202949047088625, + -4.109637260437012, + 0.0 + ] + }, + { + "label": "C", + "location": [ + 2.5177924633026125, + -3.127451181411743, 0.0 ] } @@ -195,7 +188,14 @@ "type": 1, "atoms": [ 1, - 2 + 3 + ] + }, + { + "type": 1, + "atoms": [ + 2, + 3 ] } ] @@ -348,61 +348,60 @@ { "label": "C", "location": [ - 10.85447597503662, - -3.118603229522705, - 0.0 - ] - }, - { - "label": "C", - "location": [ - 11.638409614562989, - -2.501031637191773, + 15.508987426757813, + -2.824992656707764, 0.0 ] }, { "label": "C", "location": [ - 12.611440658569336, - -2.7235817909240724, + 15.508987426757813, + -3.825007438659668, 0.0 ] }, { "label": "C", "location": [ - 13.045523643493653, - -3.619391202926636, + 16.375, + -4.325014591217041, 0.0 ] }, { "label": "C", "location": [ - 10.8599853515625, - -4.125787734985352, + 17.241010665893556, + -3.825007438659668, 0.0 ] }, { "label": "C", "location": [ - 12.612141609191897, - -4.526418209075928, + 17.241010665893556, + -2.824992656707764, 0.0 ] }, { "label": "C", "location": [ - 11.638409614562989, - -4.748968601226807, + 16.375, + -2.3249852657318117, 0.0 ] } ], "bonds": [ + { + "type": 1, + "atoms": [ + 0, + 5 + ] + }, { "type": 1, "atoms": [ @@ -428,13 +427,6 @@ "type": 1, "atoms": [ 3, - 5 - ] - }, - { - "type": 1, - "atoms": [ - 0, 4 ] }, @@ -442,14 +434,7 @@ "type": 1, "atoms": [ 4, - 6 - ] - }, - { - "type": 1, - "atoms": [ - 5, - 6 + 5 ] } ] @@ -460,60 +445,61 @@ { "label": "C", "location": [ - 15.508987426757813, - -2.824992656707764, + 10.85447597503662, + -3.118603229522705, 0.0 ] }, { "label": "C", "location": [ - 15.508987426757813, - -3.825007438659668, + 11.638409614562989, + -2.501031637191773, 0.0 ] }, { "label": "C", "location": [ - 16.375, - -4.325014591217041, + 12.611440658569336, + -2.7235817909240724, 0.0 ] }, { "label": "C", "location": [ - 17.241010665893556, - -3.825007438659668, + 13.045523643493653, + -3.619391202926636, 0.0 ] }, { "label": "C", "location": [ - 17.241010665893556, - -2.824992656707764, + 10.8599853515625, + -4.125787734985352, 0.0 ] }, { "label": "C", "location": [ - 16.375, - -2.3249852657318117, + 12.612141609191897, + -4.526418209075928, + 0.0 + ] + }, + { + "label": "C", + "location": [ + 11.638409614562989, + -4.748968601226807, 0.0 ] } ], "bonds": [ - { - "type": 1, - "atoms": [ - 0, - 5 - ] - }, { "type": 1, "atoms": [ @@ -539,6 +525,13 @@ "type": 1, "atoms": [ 3, + 5 + ] + }, + { + "type": 1, + "atoms": [ + 0, 4 ] }, @@ -546,7 +539,14 @@ "type": 1, "atoms": [ 4, - 5 + 6 + ] + }, + { + "type": 1, + "atoms": [ + 5, + 6 ] } ] diff --git a/api/tests/integration/tests/formats/ref/multi_overlap.cdxml b/api/tests/integration/tests/formats/ref/multi_overlap.cdxml index ab7a0755d7..f815a8c65b 100644 --- a/api/tests/integration/tests/formats/ref/multi_overlap.cdxml +++ b/api/tests/integration/tests/formats/ref/multi_overlap.cdxml @@ -18,52 +18,52 @@ - - - - - - - - - O - - - - + + + + + - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - + + + + + + + + + + O + + + + + + + + + @@ -98,8 +98,8 @@ - - + + diff --git a/api/tests/integration/tests/formats/ref/multi_overlap.ket b/api/tests/integration/tests/formats/ref/multi_overlap.ket index 6f08ebda63..119038d1fa 100644 --- a/api/tests/integration/tests/formats/ref/multi_overlap.ket +++ b/api/tests/integration/tests/formats/ref/multi_overlap.ket @@ -258,32 +258,24 @@ { "label": "C", "location": [ - 18.05674934387207, - -9.015402793884278, - 0.0 - ] - }, - { - "label": "C", - "location": [ - 18.05304527282715, - -8.020110130310059, + 19.53474807739258, + -8.932470321655274, 0.0 ] }, { "label": "C", "location": [ - 17.04463577270508, - -9.00248908996582, + 20.535999298095704, + -8.932470321655274, 0.0 ] }, { "label": "C", "location": [ - 17.042133331298829, - -8.020110130310059, + 20.035423278808599, + -8.067529678344727, 0.0 ] } @@ -307,14 +299,7 @@ "type": 1, "atoms": [ 1, - 3 - ] - }, - { - "type": 1, - "atoms": [ - 2, - 3 + 2 ] } ] @@ -325,24 +310,32 @@ { "label": "C", "location": [ - 19.53474807739258, - -8.932470321655274, + 18.05674934387207, + -9.015402793884278, 0.0 ] }, { "label": "C", "location": [ - 20.535999298095704, - -8.932470321655274, + 18.05304527282715, + -8.020110130310059, 0.0 ] }, { "label": "C", "location": [ - 20.035423278808599, - -8.067529678344727, + 17.04463577270508, + -9.00248908996582, + 0.0 + ] + }, + { + "label": "C", + "location": [ + 17.042133331298829, + -8.020110130310059, 0.0 ] } @@ -366,7 +359,14 @@ "type": 1, "atoms": [ 1, - 2 + 3 + ] + }, + { + "type": 1, + "atoms": [ + 2, + 3 ] } ] diff --git a/api/wasm/indigo-ketcher/indigo-ketcher.cpp b/api/wasm/indigo-ketcher/indigo-ketcher.cpp index 9c99d6cb63..a860a5a371 100644 --- a/api/wasm/indigo-ketcher/indigo-ketcher.cpp +++ b/api/wasm/indigo-ketcher/indigo-ketcher.cpp @@ -208,6 +208,19 @@ namespace indigo print_js(outputFormat.c_str()); result = _checkResultString(indigoToString(buffer.id)); } + else if (outputFormat == "rdf" || outputFormat == "chemical/x-rdf") + { + auto buffer = IndigoObject(_checkResult(indigoWriteBuffer())); + auto comp_it = IndigoObject(_checkResult(indigoIterateComponents(id()))); + while (indigoHasNext(comp_it.id)) + { + const auto frag = IndigoObject(_checkResult(indigoNext(comp_it.id))); + const auto mol = IndigoObject(_checkResult(indigoClone(frag.id))); + indigoSdfAppend(buffer.id, mol.id); + } + print_js(outputFormat.c_str()); + result = _checkResultString(indigoToString(buffer.id)); + } else { std::stringstream ss; diff --git a/core/indigo-core/layout/pathway_layout.h b/core/indigo-core/layout/pathway_layout.h index 67f44e5492..498a2d68d9 100644 --- a/core/indigo-core/layout/pathway_layout.h +++ b/core/indigo-core/layout/pathway_layout.h @@ -93,7 +93,7 @@ namespace indigo for (int i = 0; i < simpleReaction.reactantIndexes.size(); ++i) { // check if it is a final reactant - if (!reactionNode.successorReactants.find(i)) + if (!reactionNode.connectedReactants.find(i)) { auto ridx = simpleReaction.reactantIndexes[i]; reactantsNoPrecursors.emplace_back(reaction, nodeIdx, ridx); diff --git a/core/indigo-core/layout/reaction_layout.h b/core/indigo-core/layout/reaction_layout.h index 223e319693..052953372f 100644 --- a/core/indigo-core/layout/reaction_layout.h +++ b/core/indigo-core/layout/reaction_layout.h @@ -38,6 +38,8 @@ namespace indigo void make(); + void makePathwayFromSimple(); + // layout if reaction components are not in the places void fixLayout(); void processSideBoxes(std::vector& pluses, Rect2f& type_box, int side); @@ -53,6 +55,7 @@ namespace indigo layout_orientation_value layout_orientation; private: + void _makePathway(); void _updateMetadata(); void _pushMol(Metalayout::LayoutLine& line, int id, bool is_agent = false); void _pushSpace(Metalayout::LayoutLine& line, float size); diff --git a/core/indigo-core/layout/src/pathway_layout.cpp b/core/indigo-core/layout/src/pathway_layout.cpp index 6e5b445f57..fe540d39d7 100644 --- a/core/indigo-core/layout/src/pathway_layout.cpp +++ b/core/indigo-core/layout/src/pathway_layout.cpp @@ -80,10 +80,9 @@ void PathwayLayout::buildLayoutTree() for (int i = 0; i < _reaction.getReactionNodeCount(); ++i) { auto& reactionNode = _reaction.getReactionNode(i); - auto& currentLayoutItem = _layoutItems[i]; // add successor reactants to layout items - for (int j : reactionNode.precursorReactionsIndexes) + for (int j : reactionNode.precursorReactionIndexes) { auto& precursorLayoutItem = _layoutItems[j]; auto lastChild = currentLayoutItem.getLastChild(); diff --git a/core/indigo-core/layout/src/reaction_layout.cpp b/core/indigo-core/layout/src/reaction_layout.cpp index bf72943f51..7b93f2f5c4 100644 --- a/core/indigo-core/layout/src/reaction_layout.cpp +++ b/core/indigo-core/layout/src/reaction_layout.cpp @@ -15,14 +15,16 @@ * See the License for the specific language governing permissions and * limitations under the License. ***************************************************************************/ +#include +#include #include "layout/reaction_layout.h" #include "layout/molecule_layout.h" #include "molecule/ket_commons.h" #include "molecule/molecule.h" #include "reaction/reaction.h" -#include -#include +#include "reaction/pathway_reaction_builder.h" +#include "reaction/reaction_multistep_detector.h" using namespace indigo; @@ -175,11 +177,40 @@ void ReactionLayout::processSideBoxes(std::vector& pluses, Rect2f& type_b } } +void ReactionLayout::makePathwayFromSimple() +{ + std::deque reactions; + for (int i = 0; i < _r.reactionBlocksCount(); i++) + { + auto& rc = reactions.emplace_back(); + auto& rb = _r.reactionBlock(i); + for (int j = 0; j < rb.reactants.size(); j++) + rc.addReactantCopy(_r.getBaseMolecule(rb.reactants[j]), 0, 0); + for (int j = 0; j < rb.products.size(); j++) + rc.addProductCopy(_r.getBaseMolecule(rb.products[j]), 0, 0); + } + PathwayReactionBuilder prb; + auto pwr = prb.buildPathwayReaction(reactions); + _r.meta().resetReactionData(); + pwr->meta().clone(_r.meta()); + pwr->copyToReaction(_r); +} + void ReactionLayout::make() { int arrows_count = _r.meta().getMetaCount(KETReactionArrow::CID); int simple_count = _r.meta().getNonChemicalMetaCount(); - if (arrows_count > 1 || simple_count) + int multi_count = _r.meta().getMetaCount(KETReactionMultitailArrow::CID); + if (simple_count) + return; + + if (_r.reactionBlocksCount() > 1 && _r.intermediateCount() == 0 && multi_count == 0) + { + makePathwayFromSimple(); + return; + } + + if (arrows_count > 1) return; // not implemented yet const auto kHalfBondLength = bond_length / 2; diff --git a/core/indigo-core/molecule/ket_commons.h b/core/indigo-core/molecule/ket_commons.h index ee05c112db..9e04360267 100644 --- a/core/indigo-core/molecule/ket_commons.h +++ b/core/indigo-core/molecule/ket_commons.h @@ -398,7 +398,6 @@ namespace indigo public: static const std::uint32_t CID = "KET reaction plus"_hash; KETReactionPlus(const Vec2f& pos) : MetaObject(CID), _pos(pos){ - std::cout << "plus" << std::endl; }; MetaObject* clone() const override @@ -493,6 +492,12 @@ namespace indigo std::vector arrows_from; }; + struct PathwayComponent + { + int product_csb_idx; + std::vector reactant_csb_indexes; + }; + struct ReactionComponent { enum diff --git a/core/indigo-core/molecule/src/molecule_json_loader.cpp b/core/indigo-core/molecule/src/molecule_json_loader.cpp index 628a4fbe30..2054589381 100644 --- a/core/indigo-core/molecule/src/molecule_json_loader.cpp +++ b/core/indigo-core/molecule/src/molecule_json_loader.cpp @@ -783,7 +783,7 @@ void MoleculeJsonLoader::parseBonds(const rapidjson::Value& bonds, BaseMolecule& } } -void indigo::MoleculeJsonLoader::parseHighlight(const rapidjson::Value& highlight, BaseMolecule& mol) +void MoleculeJsonLoader::parseHighlight(const rapidjson::Value& highlight, BaseMolecule& mol) { for (rapidjson::SizeType i = 0; i < highlight.Size(); ++i) { diff --git a/core/indigo-core/reaction/base_reaction.h b/core/indigo-core/reaction/base_reaction.h index 4dccde1976..fd8b8c03ea 100644 --- a/core/indigo-core/reaction/base_reaction.h +++ b/core/indigo-core/reaction/base_reaction.h @@ -103,7 +103,7 @@ namespace indigo MetaDataStorage& meta(); - bool isMultistep() + int reactionsCount() { return _reactionBlocks.size(); } @@ -190,10 +190,27 @@ namespace indigo { return _nextElement(side, -1); } + int sideNext(int side, int index) { return _nextElement(side, index); } + + virtual int reactionBegin() + { + return _reactionBlocks.size() ? 0 : 1; + } + + virtual int reactionEnd() + { + return _reactionBlocks.size(); + } + + virtual int reactionNext(int i) + { + return ++i; + } + // dkuzminov: we either need to have a parameter "side" for method sideEnd() or we should exclude the set of "different" xxxEnd methods for sake of the // single "end" method int sideEnd() @@ -276,12 +293,15 @@ namespace indigo virtual Reaction& asReaction(); virtual QueryReaction& asQueryReaction(); virtual bool isQueryReaction(); + virtual bool isPathwayReaction(); BaseMolecule& getBaseMolecule(int index) { return *_allMolecules.at(index); } + virtual std::unique_ptr getBaseReaction(int index) = 0; + int getAAM(int index, int atom); int getReactingCenter(int index, int bond); int getInversion(int index, int atom); diff --git a/core/indigo-core/reaction/pathway_reaction.h b/core/indigo-core/reaction/pathway_reaction.h index d63e86836f..707fcf1fe4 100644 --- a/core/indigo-core/reaction/pathway_reaction.h +++ b/core/indigo-core/reaction/pathway_reaction.h @@ -35,26 +35,6 @@ namespace indigo class DLLEXPORT PathwayReaction : public BaseReaction { public: - struct SuccessorReaction - { - SuccessorReaction(int reactionIdx, Array& ridxs) : reactionIdx(reactionIdx) - { - reactantIndexes.copy(ridxs); - } - SuccessorReaction(const SuccessorReaction& other) : reactionIdx(other.reactionIdx) - { - reactantIndexes.copy(other.reactantIndexes); - } - SuccessorReaction& operator=(const SuccessorReaction& other) - { - reactionIdx = other.reactionIdx; - reactantIndexes.copy(other.reactantIndexes); - return *this; - } - int reactionIdx; - Array reactantIndexes; - }; - struct SimpleReaction { struct Plus @@ -87,23 +67,29 @@ namespace indigo { reactionIdx = other.reactionIdx; multiTailMetaIndex = other.multiTailMetaIndex; - for (int i = 0; i < other.successorReactions.size(); ++i) - successorReactions.push(other.successorReactions[i]); - precursorReactionsIndexes.copy(other.precursorReactionsIndexes); + for (int i = 0; i < other.successorReactionIndexes.size(); ++i) + successorReactionIndexes.push(other.successorReactionIndexes[i]); + precursorReactionIndexes.copy(other.precursorReactionIndexes); } int reactionIdx; // vector of successor reactions indexes and their corresponding reactant indexes - ObjArray successorReactions; + Array successorReactionIndexes; // vector of precursor reactions indexes - Array precursorReactionsIndexes; + Array precursorReactionIndexes; // utility information - RedBlackSet successorReactants; + RedBlackSet connectedReactants; // where the precursors' products are connected to int multiTailMetaIndex; }; PathwayReaction(); ~PathwayReaction() override; + std::unique_ptr getBaseReaction(int index) override + { + std::unique_ptr reaction; + return reaction; + } + std::vector getRootReactions() const; auto& getReactionNode(int node_idx) @@ -142,6 +128,63 @@ namespace indigo return _rootReaction; } + void copyToReaction(BaseReaction& reaction) + { + reaction.clear(); + reaction.meta().clone(meta()); + // collect roles + std::map mol_roles; + for (int i = 0; i < _reactions.size(); ++i) + { + auto& reac = _reactions[i]; + for (auto mol_idx : reac.productIndexes) + { + auto product_it = mol_roles.find(mol_idx); + if (product_it != mol_roles.end()) + { + if (product_it->second == REACTANT) + product_it->second = INTERMEDIATE; + } + else + mol_roles.emplace(mol_idx, PRODUCT); + } + + for (auto mol_idx : reac.reactantIndexes) + { + auto reactant_it = mol_roles.find(mol_idx); + if (reactant_it != mol_roles.end()) + { + if (reactant_it->second == PRODUCT) + reactant_it->second = INTERMEDIATE; + } + else + mol_roles.emplace(mol_idx, REACTANT); + } + } + + // copy molecules into Reaction + for (auto& kvp : mol_roles) + { + switch (kvp.second) + { + case PRODUCT: + reaction.addProductCopy(*_molecules[kvp.first], 0, 0); + break; + case REACTANT: + reaction.addReactantCopy(*_molecules[kvp.first], 0, 0); + break; + case INTERMEDIATE: + reaction.addIntermediateCopy(*_molecules[kvp.first], 0, 0); + break; + } + } + } + + bool isPathwayReaction() override + { + return true; + } + ReactionNode& addReactionNode() { ReactionNode rn; @@ -177,7 +220,7 @@ namespace indigo ObjArray _reactionNodes; PtrArray _molecules; ObjArray _reactions; - Reaction _rootReaction; + Reaction _rootReaction; // copy of root reaction }; } // namespace indigo diff --git a/core/indigo-core/reaction/pathway_reaction_builder.h b/core/indigo-core/reaction/pathway_reaction_builder.h index 5ee13ab774..fe4dd1fdef 100644 --- a/core/indigo-core/reaction/pathway_reaction_builder.h +++ b/core/indigo-core/reaction/pathway_reaction_builder.h @@ -48,6 +48,7 @@ namespace indigo PathwayReactionBuilder(); ~PathwayReactionBuilder(); std::unique_ptr buildPathwayReaction(std::deque& reactions); + static void buildRootReaction(PathwayReaction& reaction); DECL_ERROR; private: diff --git a/core/indigo-core/reaction/query_reaction.h b/core/indigo-core/reaction/query_reaction.h index b702d04462..887c5ad7b1 100644 --- a/core/indigo-core/reaction/query_reaction.h +++ b/core/indigo-core/reaction/query_reaction.h @@ -52,6 +52,7 @@ namespace indigo bool aromatize(const AromaticityOptions& options) override; BaseReaction* neu() override; + std::unique_ptr getBaseReaction(int index) override; QueryReaction& asQueryReaction() override; bool isQueryReaction() override; diff --git a/core/indigo-core/reaction/reaction.h b/core/indigo-core/reaction/reaction.h index 837022360a..aaabfb815a 100644 --- a/core/indigo-core/reaction/reaction.h +++ b/core/indigo-core/reaction/reaction.h @@ -63,6 +63,8 @@ namespace indigo Reaction& asReaction() override; + std::unique_ptr getBaseReaction(int index) override; + /* void dearomatizeBonds(); void aromatizeQueryBonds(); diff --git a/core/indigo-core/reaction/reaction_cml_saver.h b/core/indigo-core/reaction/reaction_cml_saver.h index b9d280b07c..d8208b4fde 100644 --- a/core/indigo-core/reaction/reaction_cml_saver.h +++ b/core/indigo-core/reaction/reaction_cml_saver.h @@ -26,6 +26,7 @@ namespace indigo class Output; class Reaction; + class BaseReaction; class ReactionCmlSaver { @@ -33,7 +34,7 @@ namespace indigo explicit ReactionCmlSaver(Output& output); ~ReactionCmlSaver(); - void saveReaction(Reaction& rxn); + void saveReaction(BaseReaction& rxn); bool skip_cml_tag; // skips and tags DECL_ERROR; diff --git a/core/indigo-core/reaction/reaction_json_loader.h b/core/indigo-core/reaction/reaction_json_loader.h index 686779494a..524d739194 100644 --- a/core/indigo-core/reaction/reaction_json_loader.h +++ b/core/indigo-core/reaction/reaction_json_loader.h @@ -60,8 +60,8 @@ namespace indigo rapidjson::Value _molecule; MoleculeJsonLoader _loader; - Reaction* _prxn; - QueryReaction* _pqrxn; + // Reaction* _prxn; + // QueryReaction* _pqrxn; Molecule _mol; QueryMolecule _qmol; BaseMolecule* _pmol; diff --git a/core/indigo-core/reaction/reaction_multistep_detector.h b/core/indigo-core/reaction/reaction_multistep_detector.h index 09bace443e..1de5caa65a 100644 --- a/core/indigo-core/reaction/reaction_multistep_detector.h +++ b/core/indigo-core/reaction/reaction_multistep_detector.h @@ -36,13 +36,16 @@ namespace indigo class BaseMolecule; class BaseReaction; + class PathwayReaction; class ReactionMultistepDetector { public: ReactionMultistepDetector(BaseMolecule& mol); ~ReactionMultistepDetector(); - void buildReaction(BaseReaction& rxn); + void detectReaction(); + void constructMultipleArrowReaction(BaseReaction& rxn); + void constructPathwayReaction(PathwayReaction& rxn); typedef std::pair FLOAT_INT_PAIR; typedef std::vector FLOAT_INT_PAIRS; @@ -53,9 +56,8 @@ namespace indigo private: void createSummBlocks(); - void constructMultipleArrowReaction(BaseReaction& rxn); void detectArrows(); - void detectMultitailArrows(BaseReaction& rxn); + void detectMultitailArrows(); bool findPlusNeighbours(const Vec2f& plus_pos, const FLOAT_INT_PAIRS& mol_tops, const FLOAT_INT_PAIRS& mol_bottoms, const FLOAT_INT_PAIRS& mol_lefts, const FLOAT_INT_PAIRS& mol_rights, std::pair& connection); @@ -64,6 +66,7 @@ namespace indigo std::vector _reaction_components; std::vector _component_summ_blocks; std::list _component_summ_blocks_list; + int _moleculeCount; }; diff --git a/core/indigo-core/reaction/src/base_reaction.cpp b/core/indigo-core/reaction/src/base_reaction.cpp index 0af7c3ea6c..552ea143e9 100644 --- a/core/indigo-core/reaction/src/base_reaction.cpp +++ b/core/indigo-core/reaction/src/base_reaction.cpp @@ -415,6 +415,11 @@ bool BaseReaction::isQueryReaction() return false; } +bool BaseReaction::isPathwayReaction() +{ + return false; +} + void BaseReaction::remove(int i) { int side = _types[i]; diff --git a/core/indigo-core/reaction/src/pathway_reaction.cpp b/core/indigo-core/reaction/src/pathway_reaction.cpp index c38a10b0b2..68e4032653 100644 --- a/core/indigo-core/reaction/src/pathway_reaction.cpp +++ b/core/indigo-core/reaction/src/pathway_reaction.cpp @@ -39,7 +39,7 @@ std::vector PathwayReaction::getRootReactions() const { std::vector root_reactions; for (int i = 0; i < _reactionNodes.size(); ++i) - if (_reactionNodes[i].successorReactions.size() == 0) + if (_reactionNodes[i].successorReactionIndexes.size() == 0) root_reactions.push_back(i); return root_reactions; } @@ -52,11 +52,11 @@ void PathwayReaction::clone(PathwayReaction& reaction) auto& other = _reactionNodes[i]; auto& rn = reaction._reactionNodes.push(); rn.reactionIdx = other.reactionIdx; - rn.precursorReactionsIndexes.copy(other.precursorReactionsIndexes); - for (int j = 0; j < other.successorReactions.size(); ++j) + rn.precursorReactionIndexes.copy(other.precursorReactionIndexes); + for (int j = 0; j < other.successorReactionIndexes.size(); ++j) { - auto& sr = other.successorReactions[j]; - rn.successorReactions.push(sr); + auto& sr = other.successorReactionIndexes[j]; + rn.successorReactionIndexes.push(sr); } } diff --git a/core/indigo-core/reaction/src/pathway_reaction_builder.cpp b/core/indigo-core/reaction/src/pathway_reaction_builder.cpp index f9433848fd..ef2a789b73 100644 --- a/core/indigo-core/reaction/src/pathway_reaction_builder.cpp +++ b/core/indigo-core/reaction/src/pathway_reaction_builder.cpp @@ -162,24 +162,24 @@ void PathwayReactionBuilder::buildNodes(std::deque& reactions) auto& val = m_it->second; Array val_arr; val_arr.copy(val); - if (rn.successorReactions.size() == 0) + if (rn.successorReactionIndexes.size() == 0) { auto& rnj = _pathwayReaction->getReactionNode(j); // check if the reactant is already in use as a successor bool found = false; for (auto ridx : val) { - found = rnj.successorReactants.find(ridx); + found = rnj.connectedReactants.find(ridx); if (found) break; } if (!found) { m_it++; - rn.successorReactions.push(j, val_arr); - rnj.precursorReactionsIndexes.push(i); + rn.successorReactionIndexes.push(j); + rnj.precursorReactionIndexes.push(i); for (auto ridx : val) - rnj.successorReactants.insert(ridx); + rnj.connectedReactants.insert(ridx); } else { @@ -207,29 +207,34 @@ void PathwayReactionBuilder::buildNodes(std::deque& reactions) } } -std::unique_ptr PathwayReactionBuilder::buildPathwayReaction(std::deque& reactions) +void PathwayReactionBuilder::buildRootReaction(PathwayReaction& reaction) { - buildInchiDescriptors(reactions); - buildNodes(reactions); - buildReactions(); - const auto& rr = _pathwayReaction->getRootReactions(); - PathwayLayout pl(*_pathwayReaction); - pl.make(); - if (rr.size()) + const auto& root_reactions = reaction.getRootReactions(); + if (root_reactions.size()) { - auto& first_root = _pathwayReaction->getReaction(rr.back()); + auto& first_root = reaction.getReaction(root_reactions.back()); for (auto& idx : first_root.reactantIndexes) { - auto& mol = _pathwayReaction->getMolecule(idx); - _pathwayReaction->addReactantCopy(mol, 0, 0); + auto& mol = reaction.getMolecule(idx); + reaction.addReactantCopy(mol, 0, 0); } for (auto& idx : first_root.productIndexes) { - auto& mol = _pathwayReaction->getMolecule(idx); - _pathwayReaction->addProductCopy(mol, 0, 0); + auto& mol = reaction.getMolecule(idx); + reaction.addProductCopy(mol, 0, 0); } } +} + +std::unique_ptr PathwayReactionBuilder::buildPathwayReaction(std::deque& reactions) +{ + buildInchiDescriptors(reactions); + buildNodes(reactions); + buildReactions(); + PathwayLayout pl(*_pathwayReaction); + pl.make(); + buildRootReaction(*_pathwayReaction); return std::move(_pathwayReaction); } \ No newline at end of file diff --git a/core/indigo-core/reaction/src/query_reaction.cpp b/core/indigo-core/reaction/src/query_reaction.cpp index 84192b4d90..d4d6e7fb81 100644 --- a/core/indigo-core/reaction/src/query_reaction.cpp +++ b/core/indigo-core/reaction/src/query_reaction.cpp @@ -180,6 +180,13 @@ int QueryReaction::_addBaseMolecule(int side) return idx; } +std::unique_ptr QueryReaction::getBaseReaction(int index) +{ + std::unique_ptr query_reaction; + query_reaction->clone(*this); + return query_reaction; +} + bool QueryReaction::aromatize(const AromaticityOptions& options) { bool arom_found = false; diff --git a/core/indigo-core/reaction/src/reaction.cpp b/core/indigo-core/reaction/src/reaction.cpp index b1e6265042..ac77370bfc 100644 --- a/core/indigo-core/reaction/src/reaction.cpp +++ b/core/indigo-core/reaction/src/reaction.cpp @@ -16,9 +16,11 @@ * limitations under the License. ***************************************************************************/ -#include "reaction/reaction.h" +#include + #include "molecule/molecule_arom.h" #include "molecule/molecule_dearom.h" +#include "reaction/reaction.h" #include "reaction/reaction_automapper.h" using namespace indigo; @@ -56,9 +58,7 @@ void Reaction::saveBondOrders(Reaction& reaction, ObjArray>& bond_typ while (bond_types.size() < reaction.end()) bond_types.push(); - int i; - - for (i = reaction.begin(); i != reaction.end(); i = reaction.next(i)) + for (int i = reaction.begin(); i != reaction.end(); i = reaction.next(i)) { Molecule::saveBondOrders(reaction.getMolecule(i), bond_types[i]); } @@ -66,10 +66,7 @@ void Reaction::saveBondOrders(Reaction& reaction, ObjArray>& bond_typ void Reaction::loadBondOrders(Reaction& reaction, ObjArray>& bond_types) { - - int i; - - for (i = reaction.begin(); i != reaction.end(); i = reaction.next(i)) + for (int i = reaction.begin(); i != reaction.end(); i = reaction.next(i)) { Molecule::loadBondOrders(reaction.getMolecule(i), bond_types[i]); } @@ -90,6 +87,24 @@ Reaction& Reaction::asReaction() return *this; } +std::unique_ptr Reaction::getBaseReaction(int index) +{ + std::unique_ptr reaction(neu()); + if (_reactionBlocks.size()) + { + auto& rb = _reactionBlocks[index]; + for (auto ridx : rb.reactants) + reaction->addReactantCopy(getBaseMolecule(ridx), 0, 0); + + for (auto pidx : rb.products) + reaction->addProductCopy(getBaseMolecule(pidx), 0, 0); + + return reaction; + } + reaction->clone(*this); + return reaction; +} + BaseReaction* Reaction::neu() { return new Reaction(); @@ -97,8 +112,6 @@ BaseReaction* Reaction::neu() void Reaction::checkForConsistency(Reaction& rxn) { - int i; - - for (i = rxn.begin(); i != rxn.end(); i = rxn.next(i)) + for (int i = rxn.begin(); i != rxn.end(); i = rxn.next(i)) Molecule::checkForConsistency(rxn.getMolecule(i)); } diff --git a/core/indigo-core/reaction/src/reaction_auto_loader.cpp b/core/indigo-core/reaction/src/reaction_auto_loader.cpp index 708e514a0e..ad655dabdd 100644 --- a/core/indigo-core/reaction/src/reaction_auto_loader.cpp +++ b/core/indigo-core/reaction/src/reaction_auto_loader.cpp @@ -283,6 +283,8 @@ std::unique_ptr ReactionAutoLoader::_loadReaction(bool query) { if (_scanner->findWord("arrow")) { + _scanner->seek(pos, SEEK_SET); + bool is_pathway = _scanner->findWord("multi-tailed-arrow"); using namespace rapidjson; _scanner->seek(pos, SEEK_SET); { @@ -304,7 +306,12 @@ std::unique_ptr ReactionAutoLoader::_loadReaction(bool query) loader.treat_x_as_pseudoatom = treat_x_as_pseudoatom; loader.ignore_no_chiral_flag = ignore_no_chiral_flag; std::unique_ptr reaction; - if (query) + if (is_pathway) + { + reaction = std::make_unique(); + loader.loadReaction(*reaction); + } + else if (query) { reaction = std::make_unique(); loader.loadReaction(*reaction); @@ -314,25 +321,6 @@ std::unique_ptr ReactionAutoLoader::_loadReaction(bool query) reaction = std::make_unique(); loader.loadReaction(*reaction); } - // TODO: to be removed. This is just for test. - if (reaction->reactionBlocksCount() > 1 && reaction->intermediateCount() == 0) - { - std::deque reactions; - for (int i = 0; i < reaction->reactionBlocksCount(); i++) - { - auto& rc = reactions.emplace_back(); - auto& rb = reaction->reactionBlock(i); - for (int j = 0; j < rb.reactants.size(); j++) - rc.addReactantCopy(reaction->getBaseMolecule(rb.reactants[j]), 0, 0); - for (int j = 0; j < rb.products.size(); j++) - rc.addProductCopy(reaction->getBaseMolecule(rb.products[j]), 0, 0); - } - PathwayReactionBuilder prb; - auto pwr = prb.buildPathwayReaction(reactions); - reaction->meta().resetReactionData(); - pwr->meta().clone(reaction->meta()); - return pwr; - } return reaction; } } diff --git a/core/indigo-core/reaction/src/reaction_cml_saver.cpp b/core/indigo-core/reaction/src/reaction_cml_saver.cpp index 3f34c6bac6..3af4328847 100644 --- a/core/indigo-core/reaction/src/reaction_cml_saver.cpp +++ b/core/indigo-core/reaction/src/reaction_cml_saver.cpp @@ -34,7 +34,7 @@ ReactionCmlSaver::~ReactionCmlSaver() { } -void ReactionCmlSaver::saveReaction(Reaction& rxn) +void ReactionCmlSaver::saveReaction(BaseReaction& rxn) { if (!skip_cml_tag) { @@ -61,21 +61,21 @@ void ReactionCmlSaver::saveReaction(Reaction& rxn) { _output.printf("\n"); for (i = rxn.reactantBegin(); i != rxn.reactantEnd(); i = rxn.reactantNext(i)) - molsaver.saveMolecule(rxn.getMolecule(i)); + molsaver.saveMolecule(rxn.getBaseMolecule(i).asMolecule()); _output.printf("\n"); } if (rxn.productsCount() > 0) { _output.printf("\n"); for (i = rxn.productBegin(); i != rxn.productEnd(); i = rxn.productNext(i)) - molsaver.saveMolecule(rxn.getMolecule(i)); + molsaver.saveMolecule(rxn.getBaseMolecule(i).asMolecule()); _output.printf("\n"); } if (rxn.catalystCount() > 0) { _output.printf("\n"); for (i = rxn.catalystBegin(); i != rxn.catalystEnd(); i = rxn.catalystNext(i)) - molsaver.saveMolecule(rxn.getMolecule(i)); + molsaver.saveMolecule(rxn.getBaseMolecule(i).asMolecule()); _output.printf("\n"); } _output.printf("\n"); diff --git a/core/indigo-core/reaction/src/reaction_json_loader.cpp b/core/indigo-core/reaction/src/reaction_json_loader.cpp index ea04cb66fb..f7d5f6fd30 100644 --- a/core/indigo-core/reaction/src/reaction_json_loader.cpp +++ b/core/indigo-core/reaction/src/reaction_json_loader.cpp @@ -26,8 +26,10 @@ #include "reaction/query_reaction.h" #include "reaction/reaction.h" +#include "reaction/pathway_reaction.h" #include "reaction/reaction_json_loader.h" #include "reaction/reaction_multistep_detector.h" +#include "reaction/pathway_reaction_builder.h" using namespace indigo; using namespace rapidjson; @@ -35,7 +37,7 @@ using namespace rapidjson; IMPL_ERROR(ReactionJsonLoader, "reaction KET loader"); ReactionJsonLoader::ReactionJsonLoader(Document& ket) - : _loader(ket), _molecule(kArrayType), _prxn(nullptr), _pqrxn(nullptr), ignore_noncritical_query_features(false) + : _loader(ket), _molecule(kArrayType), ignore_noncritical_query_features(false) { ignore_bad_valence = false; } @@ -52,22 +54,15 @@ void ReactionJsonLoader::loadReaction(BaseReaction& rxn) _loader.ignore_no_chiral_flag = ignore_no_chiral_flag; if (rxn.isQueryReaction()) - _pqrxn = &rxn.asQueryReaction(); - else - _prxn = &rxn.asReaction(); - - if (_prxn) - { - _pmol = &_mol; - _loader.loadMolecule(_mol, true); - } - else if (_pqrxn) { _loader.loadMolecule(_qmol, true); _pmol = &_qmol; } else - throw Error("unknown reaction type: %s", typeid(rxn).name()); + { + _pmol = &_mol; + _loader.loadMolecule(_mol, true); + } rxn.original_format = BaseMolecule::KET; @@ -81,7 +76,13 @@ void ReactionJsonLoader::loadReaction(BaseReaction& rxn) if (arrow_count > 1 || multi_count > 0) { ReactionMultistepDetector md(*_pmol); - md.buildReaction(rxn); + md.detectReaction(); + if (multi_count) + { + md.constructPathwayReaction(static_cast(rxn)); + PathwayReactionBuilder::buildRootReaction(static_cast(rxn)); + } else + md.constructMultipleArrowReaction(rxn); } else parseOneArrowReaction(rxn); diff --git a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp index 3cf78691dc..d96bfd8e4d 100644 --- a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp +++ b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp @@ -17,6 +17,7 @@ ***************************************************************************/ #include "reaction/reaction_multistep_detector.h" +#include "reaction/pathway_reaction.h" #include "reaction/reaction.h" using namespace indigo; @@ -235,13 +236,12 @@ void ReactionMultistepDetector::createSummBlocks() } } -void ReactionMultistepDetector::buildReaction(BaseReaction& rxn) +void ReactionMultistepDetector::detectReaction() { createSummBlocks(); detectArrows(); - detectMultitailArrows(rxn); + detectMultitailArrows(); // _component_summ_blocks, _reaction_components - result - constructMultipleArrowReaction(rxn); } void ReactionMultistepDetector::detectArrows() @@ -303,11 +303,11 @@ void ReactionMultistepDetector::detectArrows() } } -void ReactionMultistepDetector::detectMultitailArrows(BaseReaction& rxn) +void ReactionMultistepDetector::detectMultitailArrows() { - for (int i = 0; i < rxn.meta().getMetaCount(KETReactionMultitailArrow::CID); ++i) + for (int i = 0; i < _bmol.meta().getMetaCount(KETReactionMultitailArrow::CID); ++i) { - auto& multi = (const KETReactionMultitailArrow&)rxn.meta().getMetaObject(KETReactionMultitailArrow::CID, i); + auto& multi = (const KETReactionMultitailArrow&)_bmol.meta().getMetaObject(KETReactionMultitailArrow::CID, i); float min_dist_prod = -1; int idx_cs_min_prod = -1; auto& arr_begin = multi.getHead(); @@ -348,12 +348,11 @@ void ReactionMultistepDetector::detectMultitailArrows(BaseReaction& rxn) } } - auto& rb = rxn.addReactionBlock(); - // TODO: add upper limit if (min_dist_prod > 0) { auto& csb_min_prod = _component_summ_blocks[idx_cs_min_prod]; + PathwayComponent pwc; for (int j = 0; j < min_dist_reactants.size(); ++j) { auto& reac = min_dist_reactants[j]; @@ -361,8 +360,8 @@ void ReactionMultistepDetector::detectMultitailArrows(BaseReaction& rxn) { if (j == 0) { - auto& rc_arrow = _reaction_components[_moleculeCount + rxn.meta().getMetaCount(KETReactionPlus::CID) + - rxn.meta().getMetaCount(KETReactionArrow::CID) + i]; + auto& rc_arrow = _reaction_components[_moleculeCount + _bmol.meta().getMetaCount(KETReactionPlus::CID) + + _bmol.meta().getMetaCount(KETReactionArrow::CID) + i]; rc_arrow.summ_block_idx = ReactionComponent::CONNECTED; // mark arrow as connected if (csb_min_prod.role == BaseReaction::UNDEFINED) csb_min_prod.role = BaseReaction::PRODUCT; @@ -381,18 +380,6 @@ void ReactionMultistepDetector::detectMultitailArrows(BaseReaction& rxn) csb_min_prod.arrows_from.push_back(reac.second); } } - - //for (auto prod_idx : csb_min_prod.indexes) - // rb.products.push(prod_idx); - - //for (auto& reac : min_dist_reactants) - //{ - // if (reac.first > 0) - // { - // for (auto reac_idx : _component_summ_blocks[reac.second].indexes) - // rb.reactants.push(reac_idx); - // } - //} } } } @@ -493,13 +480,116 @@ bool ReactionMultistepDetector::findPlusNeighbours(const Vec2f& plus_pos, const return result; } +void ReactionMultistepDetector::constructPathwayReaction(PathwayReaction& rxn) +{ + std::unordered_map rc_to_molecule; + std::vector> csb_to_reaction; + std::vector, std::vector>> csb_reactions; + std::vector> csb_to_reactant_indexes; + + for (int i = 0; i < _component_summ_blocks.size(); ++i) + { + csb_to_reaction.emplace_back(); + auto& csb = _component_summ_blocks[i]; + if (csb.role == BaseReaction::PRODUCT || csb.role == BaseReaction::INTERMEDIATE) + { + // one product = one reaction, one reaction node + // map reactionNode <> csb_reaction + auto& rcidx_to_reactant = csb_to_reactant_indexes.emplace_back(); + rxn.addReactionNode(); + csb_to_reaction.back().emplace((int)csb_reactions.size()); + csb_reactions.emplace_back().second.push_back(i); // add csb as product + + auto [sri, sr] = rxn.addReaction(); + // add products + for (auto rc_idx : csb.indexes) + { + auto& rc = _reaction_components[rc_idx]; + auto it_copied = rc_to_molecule.find(rc_idx); + int mol_idx = -1; + if (it_copied != rc_to_molecule.end()) + mol_idx = it_copied->second; + else + { + mol_idx = rxn.addMolecule(*rc.molecule); + rc_to_molecule.emplace(rc_idx, mol_idx); + } + sr.productIndexes.push(mol_idx); + } + + // add reactants + for (auto reactant_idx : csb.arrows_from) + { + csb_reactions.back().first.push_back(reactant_idx); + auto& csb_reactant = _component_summ_blocks[reactant_idx]; + for (auto rc_idx : csb_reactant.indexes) + { + auto& rc = _reaction_components[rc_idx]; + auto it_copied = rc_to_molecule.find(rc_idx); + int mol_idx = -1; + if (it_copied != rc_to_molecule.end()) + mol_idx = it_copied->second; + else + { + mol_idx = rxn.addMolecule(*rc.molecule); + rc_to_molecule.emplace(rc_idx, mol_idx); + } + rcidx_to_reactant.emplace(rc_idx, (int)sr.reactantIndexes.size()); + sr.reactantIndexes.push(mol_idx); + } + } + } + } + + for (int i = 0; i < csb_reactions.size(); ++i) + { + auto& csb_reaction = csb_reactions[i]; + auto& rn = rxn.getReactionNode(i); + // find which reactions the products' summblocks are connected to + // normally we have only one summblock here + for (auto csb_product_idx : csb_reaction.second) + { + auto& csb_product = _component_summ_blocks[csb_product_idx]; + for (auto reactant_csb_idx : csb_product.arrows_to) + { + // look up for reactions where the reactant_csb_idx summ block presents + auto successors = csb_to_reaction[reactant_csb_idx]; + // remove the current reaction + successors.erase(i); // remove the current reaction + // add successor reactions + for (auto reac_idx : successors) + rn.successorReactionIndexes.push(reac_idx); + } + } + + for (auto csb_reactant_idx : csb_reaction.first) + { + auto& csb_reactant = _component_summ_blocks[csb_reactant_idx]; + auto precursors = csb_to_reaction[csb_reactant_idx]; + for (auto reac_idx : precursors) + rn.precursorReactionIndexes.push(reac_idx); + + if (csb_reactant.arrows_from.size()) + { + auto& rcidx_to_reactant = csb_to_reactant_indexes[i]; + for (auto ridx : csb_reactant.indexes) + { + auto rcidx_it = rcidx_to_reactant.find(ridx); + if (rcidx_it != rcidx_to_reactant.end()) + rn.connectedReactants.insert(rcidx_it->second); + } + } + } + } +} + void ReactionMultistepDetector::constructMultipleArrowReaction(BaseReaction& rxn) { // _reaction_components -> allMolecules // _component_summ_blocks -> std::unordered_map copied_components; - for ( int i = 0; i < _component_summ_blocks.size(); ++i ) - { + for (int i = 0; i < _component_summ_blocks.size(); ++i) + { auto& csb = _component_summ_blocks[i]; auto& rb = rxn.addReactionBlock(); for (auto idx : csb.indexes) @@ -540,8 +630,8 @@ void ReactionMultistepDetector::constructMultipleArrowReaction(BaseReaction& rxn { auto& csb_product = _component_summ_blocks[csb_index]; for (auto pidx : csb_product.indexes) - { - auto& rc = _reaction_components[pidx]; + { + auto& rc = _reaction_components[pidx]; auto it_copied = copied_components.find(pidx); int mol_idx = -1; if (it_copied != copied_components.end()) @@ -550,14 +640,14 @@ void ReactionMultistepDetector::constructMultipleArrowReaction(BaseReaction& rxn } else { - if( csb_product.role == BaseReaction::PRODUCT) + if (csb_product.role == BaseReaction::PRODUCT) mol_idx = rxn.addProductCopy(*rc.molecule, 0, 0); else if (csb_product.role == BaseReaction::INTERMEDIATE) mol_idx = rxn.addIntermediateCopy(*rc.molecule, 0, 0); copied_components.emplace(pidx, mol_idx); } - rb.products.push( mol_idx ); - } + rb.products.push(mol_idx); + } } - } + } } diff --git a/utils/indigo-depict/main.c b/utils/indigo-depict/main.c index 0364fc4c8d..c2cd27f850 100644 --- a/utils/indigo-depict/main.c +++ b/utils/indigo-depict/main.c @@ -1058,7 +1058,7 @@ int main(int argc, char* argv[]) _prepare(obj, p.aromatization); if (p.action == ACTION_LAYOUT) { - //indigoLayout(obj); + indigoLayout(obj); if (p.out_ext == OEXT_CML) indigoSaveCmlToFile(obj, p.outfile); else if (p.out_ext == OEXT_RXN) From 91915e48b735bd7c200dcb19ab86e5eca872b5ae Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Sun, 15 Sep 2024 22:08:58 +0200 Subject: [PATCH 04/30] all fixed --- api/python/indigo/indigo/indigo_object.py | 2 +- .../integration/tests/formats/ket_to_rdf.py | 74 ++ .../tests/formats/reactions/pathway1.ket | 1 + .../tests/formats/reactions/pathway10.ket | 1 + .../tests/formats/reactions/pathway2.ket | 1 + .../tests/formats/reactions/pathway3.ket | 1 + .../tests/formats/reactions/pathway4.ket | 1 + .../tests/formats/reactions/pathway5.ket | 1 + .../tests/formats/reactions/pathway6.ket | 1 + .../tests/formats/reactions/pathway7.ket | 1 + .../tests/formats/reactions/pathway8.ket | 1 + .../tests/formats/reactions/pathway9.ket | 1 + .../integration/tests/formats/ref/multi.rdf | 147 +++ .../tests/formats/ref/pathway1.rdf | 156 +++ .../tests/formats/ref/pathway10.rdf | 184 +++ .../tests/formats/ref/pathway2.rdf | 134 +++ .../tests/formats/ref/pathway3.rdf | 114 ++ .../tests/formats/ref/pathway4.rdf | 96 ++ .../tests/formats/ref/pathway5.rdf | 54 + .../tests/formats/ref/pathway6.rdf | 325 ++++++ .../tests/formats/ref/pathway7.rdf | 538 +++++++++ .../tests/formats/ref/pathway8.rdf | 876 ++++++++++++++ .../tests/formats/ref/pathway9.rdf | 1028 +++++++++++++++++ .../integration/tests/formats/ref/synthia.rdf | 979 ++++++++++++++++ api/wasm/indigo-ketcher/indigo-ketcher.cpp | 15 +- .../layout/src/reaction_layout.cpp | 26 +- core/indigo-core/reaction/base_reaction.h | 4 +- core/indigo-core/reaction/pathway_reaction.h | 23 +- .../src/reaction_multistep_detector.cpp | 97 +- utils/indigo-depict/main.c | 15 +- .../backend/service/v2/indigo_api.py | 8 + 31 files changed, 4840 insertions(+), 65 deletions(-) create mode 100644 api/tests/integration/tests/formats/ket_to_rdf.py create mode 100644 api/tests/integration/tests/formats/reactions/pathway1.ket create mode 100644 api/tests/integration/tests/formats/reactions/pathway10.ket create mode 100644 api/tests/integration/tests/formats/reactions/pathway2.ket create mode 100644 api/tests/integration/tests/formats/reactions/pathway3.ket create mode 100644 api/tests/integration/tests/formats/reactions/pathway4.ket create mode 100644 api/tests/integration/tests/formats/reactions/pathway5.ket create mode 100644 api/tests/integration/tests/formats/reactions/pathway6.ket create mode 100644 api/tests/integration/tests/formats/reactions/pathway7.ket create mode 100644 api/tests/integration/tests/formats/reactions/pathway8.ket create mode 100644 api/tests/integration/tests/formats/reactions/pathway9.ket create mode 100644 api/tests/integration/tests/formats/ref/multi.rdf create mode 100644 api/tests/integration/tests/formats/ref/pathway1.rdf create mode 100644 api/tests/integration/tests/formats/ref/pathway10.rdf create mode 100644 api/tests/integration/tests/formats/ref/pathway2.rdf create mode 100644 api/tests/integration/tests/formats/ref/pathway3.rdf create mode 100644 api/tests/integration/tests/formats/ref/pathway4.rdf create mode 100644 api/tests/integration/tests/formats/ref/pathway5.rdf create mode 100644 api/tests/integration/tests/formats/ref/pathway6.rdf create mode 100644 api/tests/integration/tests/formats/ref/pathway7.rdf create mode 100644 api/tests/integration/tests/formats/ref/pathway8.rdf create mode 100644 api/tests/integration/tests/formats/ref/pathway9.rdf create mode 100644 api/tests/integration/tests/formats/ref/synthia.rdf diff --git a/api/python/indigo/indigo/indigo_object.py b/api/python/indigo/indigo/indigo_object.py index b8e0c4fdfb..684e368c97 100644 --- a/api/python/indigo/indigo/indigo_object.py +++ b/api/python/indigo/indigo/indigo_object.py @@ -509,7 +509,7 @@ def iterateMolecules(self): ) def iterateReactions(self): - """Reaction method iterates molecules + """Reaction method iterates reactions Returns: IndigoObject: reaction iterator diff --git a/api/tests/integration/tests/formats/ket_to_rdf.py b/api/tests/integration/tests/formats/ket_to_rdf.py new file mode 100644 index 0000000000..6179ae694b --- /dev/null +++ b/api/tests/integration/tests/formats/ket_to_rdf.py @@ -0,0 +1,74 @@ +import difflib +import os +import sys + + +def find_diff(a, b): + return "\n".join(difflib.unified_diff(a.splitlines(), b.splitlines())) + + +sys.path.append( + os.path.normpath( + os.path.join(os.path.abspath(__file__), "..", "..", "..", "common") + ) +) +from env_indigo import * # noqa + +indigo = Indigo() +indigo.setOption("json-saving-pretty", True) +indigo.setOption("molfile-saving-skip-date", True) +indigo.setOption("ignore-stereochemistry-errors", True) + +print("*** KET to RDF ***") + +root = joinPathPy("reactions/", __file__) +ref_path = joinPathPy("ref/", __file__) + +files = [ + "multi", + "pathway1", + "pathway2", + "pathway3", + "pathway4", + "pathway5", + "pathway6", + "pathway7", + "pathway8", + "pathway9", + "pathway10", +] + +files.sort() +for filename in files: + try: + ket = indigo.loadReactionFromFile( + os.path.join(root, filename + ".ket") + ) + except: + try: + ket = indigo.loadQueryReactionFromFile( + os.path.join(root, filename + ".ket") + ) + except IndigoException as e: + print(" %s" % (getIndigoExceptionText(e))) + + buffer = indigo.writeBuffer() + rdfSaver = indigo.createSaver(buffer, "rdf") + buffer.rdfHeader() + for rxn in ket.iterateReactions(): + rdfSaver.append(rxn.clone()) + rdfSaver.close() + rdf = buffer.toString() + + # with open(os.path.join(ref_path, filename) + ".rdf", "w") as file: + # file.write(rdf) + + with open(os.path.join(ref_path, filename) + ".rdf", "r") as file: + rdf_ref = file.read() + + diff = find_diff(rdf_ref, rdf) + if not diff: + print(filename + ".rdf:SUCCEED") + else: + print(filename + ".rdf:FAILED") + print(diff) diff --git a/api/tests/integration/tests/formats/reactions/pathway1.ket b/api/tests/integration/tests/formats/reactions/pathway1.ket new file mode 100644 index 0000000000..e8c29d5172 --- /dev/null +++ b/api/tests/integration/tests/formats/reactions/pathway1.ket @@ -0,0 +1 @@ +{"root":{"nodes":[{"$ref":"mol0"},{"$ref":"mol1"},{"$ref":"mol2"},{"$ref":"mol3"},{"$ref":"mol4"},{"$ref":"mol5"},{"type":"multi-tailed-arrow","data":{"head":{"position":{"x":10.887200355529786,"y":6.029025077819824,"z":0.0}},"spine":{"pos":[{"x":9.887200355529786,"y":10.788000106811524,"z":0.0},{"x":9.887200355529786,"y":1.2700501680374146,"z":0.0}]},"tails":{"pos":[{"x":9.387200355529786,"y":10.788000106811524,"z":0.0},{"x":9.387200355529786,"y":6.164050102233887,"z":0.0},{"x":9.387200355529786,"y":1.2700501680374146,"z":0.0}]},"zOrder":0}},{"type":"multi-tailed-arrow","data":{"head":{"position":{"x":4.789100646972656,"y":10.788000106811524,"z":0.0}},"spine":{"pos":[{"x":3.230299949645996,"y":12.923049926757813,"z":0.0},{"x":3.230299949645996,"y":8.652950286865235,"z":0.0}]},"tails":{"pos":[{"x":2.730299949645996,"y":12.923049926757813,"z":0.0},{"x":2.730299949645996,"y":8.652950286865235,"z":0.0}]},"zOrder":0}}]},"mol0":{"type":"molecule","atoms":[{"label":"C","location":[0.0,9.152899742126465,0.0]},{"label":"C","location":[1.730299949645996,9.153399467468262,0.0]},{"label":"C","location":[0.8668000102043152,9.652999877929688,0.0]},{"label":"C","location":[1.730299949645996,8.152399063110352,0.0]},{"label":"C","location":[0.0,8.147899627685547,0.0]},{"label":"C","location":[0.8690000176429749,7.652899742126465,0.0]}],"bonds":[{"type":2,"atoms":[2,0]},{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,5]},{"type":1,"atoms":[5,3]},{"type":2,"atoms":[3,1]},{"type":1,"atoms":[1,2]}]},"mol1":{"type":"molecule","atoms":[{"label":"C","location":[0.9205999374389648,13.693100929260254,0.0]},{"label":"C","location":[1.4210000038146973,12.153000831604004,0.0]},{"label":"C","location":[1.730299949645996,13.099300384521485,0.0]},{"label":"C","location":[0.4203000068664551,12.153000831604004,0.0]},{"label":"C","location":[0.1108999252319336,13.099300384521485,0.0]}],"bonds":[{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,3]},{"type":1,"atoms":[3,1]},{"type":2,"atoms":[1,2]},{"type":1,"atoms":[2,0]}]},"mol2":{"type":"molecule","atoms":[{"label":"C","location":[5.789100646972656,11.287999153137207,0.0]},{"label":"C","location":[5.789100646972656,10.287999153137207,0.0]},{"label":"C","location":[6.6551008224487309,9.787999153137207,0.0]},{"label":"C","location":[7.521200180053711,10.287999153137207,0.0]},{"label":"C","location":[7.521200180053711,11.287999153137207,0.0]},{"label":"C","location":[6.6551008224487309,11.787999153137207,0.0]},{"label":"C","location":[8.387200355529786,11.787999153137207,0.0]}],"bonds":[{"type":1,"atoms":[5,0]},{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[2,3]},{"type":1,"atoms":[3,4]},{"type":1,"atoms":[4,5]},{"type":1,"atoms":[4,6]}]},"mol3":{"type":"molecule","atoms":[{"label":"C","location":[7.387200355529785,1.54010009765625,0.0]},{"label":"C","location":[7.887600898742676,0.0,0.0]},{"label":"C","location":[8.19680118560791,0.9463005065917969,0.0]},{"label":"C","location":[6.8867998123168949,0.0,0.0]},{"label":"C","location":[6.577500343322754,0.9463005065917969,0.0]},{"label":"C","location":[7.387200355529785,2.540100574493408,0.0]},{"label":"C","location":[8.387200355529786,2.540100574493408,0.0]}],"bonds":[{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,3]},{"type":1,"atoms":[3,1]},{"type":2,"atoms":[1,2]},{"type":1,"atoms":[2,0]},{"type":2,"atoms":[0,5]},{"type":1,"atoms":[5,6]}]},"mol4":{"type":"molecule","atoms":[{"label":"C","location":[6.196199893951416,6.670499801635742,0.0]},{"label":"C","location":[6.980099678039551,7.288000106811523,0.0]},{"label":"C","location":[7.953099727630615,7.065500259399414,0.0]},{"label":"C","location":[8.387199401855469,6.169699668884277,0.0]},{"label":"C","location":[6.201699733734131,5.663300514221191,0.0]},{"label":"C","location":[7.953799724578857,5.262599945068359,0.0]},{"label":"C","location":[6.980099678039551,5.04010009765625,0.0]},{"label":"C","location":[5.230299949645996,6.929300308227539,0.0]}],"bonds":[{"type":1,"atoms":[1,0]},{"type":1,"atoms":[0,4]},{"type":1,"atoms":[4,6]},{"type":1,"atoms":[6,5]},{"type":1,"atoms":[5,3]},{"type":1,"atoms":[3,2]},{"type":1,"atoms":[2,1]},{"type":1,"atoms":[0,7]}]},"mol5":{"type":"molecule","atoms":[{"label":"C","location":[12.753199577331543,6.882475852966309,0.0]},{"label":"C","location":[14.483498573303223,6.8829755783081059,0.0]},{"label":"C","location":[13.619999885559082,7.382575988769531,0.0]},{"label":"C","location":[14.483498573303223,5.882075309753418,0.0]},{"label":"C","location":[12.753199577331543,5.877575874328613,0.0]},{"label":"C","location":[13.622199058532715,5.382575988769531,0.0]},{"label":"C","location":[11.887200355529786,5.377575874328613,0.0]},{"label":"C","location":[12.915099143981934,4.67547607421875,0.0]},{"label":"C","location":[15.190600395202637,5.174975395202637,0.0]}],"bonds":[{"type":2,"atoms":[2,0]},{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,5]},{"type":1,"atoms":[5,3]},{"type":2,"atoms":[3,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[4,6]},{"type":2,"atoms":[5,7]},{"type":1,"atoms":[3,8]}]}} \ No newline at end of file diff --git a/api/tests/integration/tests/formats/reactions/pathway10.ket b/api/tests/integration/tests/formats/reactions/pathway10.ket new file mode 100644 index 0000000000..3a9f9a0bbc --- /dev/null +++ b/api/tests/integration/tests/formats/reactions/pathway10.ket @@ -0,0 +1 @@ +{"root":{"nodes":[{"$ref":"mol0"},{"$ref":"mol1"},{"$ref":"mol2"},{"$ref":"mol3"},{"$ref":"mol4"},{"$ref":"mol5"},{"$ref":"mol6"},{"$ref":"mol7"},{"$ref":"mol8"},{"$ref":"mol9"},{"type":"multi-tailed-arrow","data":{"head":{"position":{"x":14.06869888305664,"y":7.232524871826172,"z":0.0}},"spine":{"pos":[{"x":13.06869888305664,"y":11.472174644470215,"z":0.0},{"x":13.06869888305664,"y":2.992875099182129,"z":0.0}]},"tails":{"pos":[{"x":12.56869888305664,"y":11.472174644470215,"z":0.0},{"x":12.56869888305664,"y":2.992875099182129,"z":0.0}]},"zOrder":0}},{"type":"multi-tailed-arrow","data":{"head":{"position":{"x":4.23029899597168,"y":2.992875099182129,"z":0.0}},"spine":{"pos":[{"x":3.2302989959716799,"y":5.134649753570557,"z":0.0},{"x":3.2302989959716799,"y":0.851099967956543,"z":0.0}]},"tails":{"pos":[{"x":2.7302989959716799,"y":5.134649753570557,"z":0.0},{"x":2.7302989959716799,"y":0.851099967956543,"z":0.0}]},"zOrder":0}},{"type":"multi-tailed-arrow","data":{"head":{"position":{"x":5.860099792480469,"y":11.472174644470215,"z":0.0}},"spine":{"pos":[{"x":3.2302989959716799,"y":13.607199668884278,"z":0.0},{"x":3.2302989959716799,"y":9.337149620056153,"z":0.0}]},"tails":{"pos":[{"x":2.7302989959716799,"y":13.607199668884278,"z":0.0},{"x":2.7302989959716799,"y":9.337149620056153,"z":0.0}]},"zOrder":0}}]},"mol0":{"type":"molecule","atoms":[{"label":"C","location":[1.730299472808838,0.0,0.0]},{"label":"C","location":[1.7265992164611817,0.9950997829437256,0.0]},{"label":"C","location":[0.718299388885498,0.01289987564086914,0.0]},{"label":"C","location":[0.7157993316650391,0.9950997829437256,0.0]},{"label":"F","location":[0.008699417114257813,1.702199935913086,0.0]}],"bonds":[{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,3]},{"type":1,"atoms":[3,2]},{"type":1,"atoms":[2,0]},{"type":1,"atoms":[3,4]}]},"mol1":{"type":"molecule","atoms":[{"label":"C","location":[0.7289981842041016,4.202199935913086,0.0]},{"label":"C","location":[1.7302980422973633,4.202199935913086,0.0]},{"label":"C","location":[1.2296981811523438,5.067099571228027,0.0]},{"label":"Cl","location":[1.2296981811523438,6.067099571228027,0.0]}],"bonds":[{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[2,0]},{"type":1,"atoms":[2,3]}]},"mol2":{"type":"molecule","atoms":[{"label":"C","location":[0.9206981658935547,10.107199668884278,0.0]},{"label":"C","location":[1.421098232269287,8.567100524902344,0.0]},{"label":"C","location":[1.7302985191345215,9.513299942016602,0.0]},{"label":"C","location":[0.42029857635498049,8.567100524902344,0.0]},{"label":"C","location":[0.11099815368652344,9.513299942016602,0.0]}],"bonds":[{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,3]},{"type":1,"atoms":[3,1]},{"type":2,"atoms":[1,2]},{"type":1,"atoms":[2,0]}]},"mol3":{"type":"molecule","atoms":[{"label":"C","location":[0.0,14.107100486755371,0.0]},{"label":"C","location":[1.730299472808838,14.107601165771485,0.0]},{"label":"C","location":[0.8667998313903809,14.607200622558594,0.0]},{"label":"C","location":[1.730299472808838,13.106700897216797,0.0]},{"label":"C","location":[0.0,13.102200508117676,0.0]},{"label":"C","location":[0.8689999580383301,12.607200622558594,0.0]}],"bonds":[{"type":2,"atoms":[2,0]},{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,5]},{"type":1,"atoms":[5,3]},{"type":2,"atoms":[3,1]},{"type":1,"atoms":[1,2]}]},"mol4":{"type":"molecule","atoms":[{"label":"C","location":[7.849699020385742,1.7228245735168458,0.0]},{"label":"C","location":[8.850898742675782,1.7228245735168458,0.0]},{"label":"C","location":[8.350399017333985,2.5878243446350099,0.0]},{"label":"O","location":[8.609199523925782,3.5537242889404299,0.0]}],"bonds":[{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[2,0]},{"type":1,"atoms":[2,3]}]},"mol5":{"type":"molecule","atoms":[{"label":"C","location":[9.836698532104493,11.972175598144532,0.0]},{"label":"C","location":[9.836698532104493,10.972175598144532,0.0]},{"label":"C","location":[10.702698707580567,10.472175598144532,0.0]},{"label":"C","location":[11.56869888305664,10.972175598144532,0.0]},{"label":"C","location":[11.56869888305664,11.972175598144532,0.0]},{"label":"C","location":[10.702698707580567,12.472175598144532,0.0]}],"bonds":[{"type":1,"atoms":[5,0]},{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[2,3]},{"type":1,"atoms":[3,4]},{"type":1,"atoms":[4,5]}]},"mol6":{"type":"molecule","atoms":[{"label":"C","location":[10.865299224853516,1.7228245735168458,0.0]},{"label":"C","location":[10.86159896850586,2.717924118041992,0.0]},{"label":"C","location":[9.853399276733399,1.7357244491577149,0.0]},{"label":"C","location":[9.850898742675782,2.717924118041992,0.0]},{"label":"N","location":[11.56869888305664,3.4250245094299318,0.0]}],"bonds":[{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,3]},{"type":1,"atoms":[3,2]},{"type":1,"atoms":[2,0]},{"type":1,"atoms":[1,4]}]},"mol7":{"type":"molecule","atoms":[{"label":"C","location":[6.040099143981934,3.262925624847412,0.0]},{"label":"C","location":[6.540499687194824,1.722825527191162,0.0]},{"label":"C","location":[6.849699020385742,2.669125556945801,0.0]},{"label":"C","location":[5.539699554443359,1.722825527191162,0.0]},{"label":"C","location":[5.23029899597168,2.669125556945801,0.0]},{"label":"S","location":[6.040099143981934,4.262925624847412,0.0]}],"bonds":[{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,3]},{"type":1,"atoms":[3,1]},{"type":2,"atoms":[1,2]},{"type":1,"atoms":[2,0]},{"type":1,"atoms":[0,5]}]},"mol8":{"type":"molecule","atoms":[{"label":"C","location":[7.87449836730957,10.472174644470215,0.0]},{"label":"C","location":[7.870798110961914,11.46727466583252,0.0]},{"label":"C","location":[6.862598419189453,10.485074996948243,0.0]},{"label":"C","location":[6.860099792480469,11.46727466583252,0.0]},{"label":"P","location":[8.836698532104493,11.72607421875,0.0]}],"bonds":[{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,3]},{"type":1,"atoms":[3,2]},{"type":1,"atoms":[2,0]},{"type":1,"atoms":[1,4]}]},"mol9":{"type":"molecule","atoms":[{"label":"O","location":[19.5054988861084,8.640325546264649,0.0]},{"label":"O","location":[19.5054988861084,6.765225410461426,0.0]},{"label":"O","location":[17.686098098754884,5.824725151062012,0.0]},{"label":"O","location":[15.866598129272461,6.765125274658203,0.0]},{"label":"O","location":[17.680498123168947,8.640325546264649,0.0]},{"label":"O","location":[15.06869888305664,8.046025276184082,0.0]},{"label":"C","location":[18.595699310302736,8.181224822998047,0.0],"stereoLabel":"abs"},{"label":"C","location":[18.595699310302736,7.229825496673584,0.0],"stereoLabel":"abs"},{"label":"C","location":[17.680498123168947,6.765125274658203,0.0],"stereoLabel":"abs"},{"label":"C","location":[16.770898818969728,7.229625225067139,0.0],"stereoLabel":"abs"},{"label":"C","location":[16.770898818969728,8.18112564086914,0.0],"stereoLabel":"abs"},{"label":"C","location":[15.866598129272461,8.640125274658204,0.0]}],"bonds":[{"type":1,"atoms":[5,11]},{"type":1,"atoms":[10,4]},{"type":1,"atoms":[4,6]},{"type":1,"atoms":[6,7]},{"type":1,"atoms":[7,8]},{"type":1,"atoms":[8,9]},{"type":1,"atoms":[9,10]},{"type":1,"atoms":[10,11],"stereo":1},{"type":1,"atoms":[6,0],"stereo":6},{"type":1,"atoms":[7,1],"stereo":6},{"type":1,"atoms":[8,2],"stereo":6},{"type":1,"atoms":[9,3],"stereo":6}]}} \ No newline at end of file diff --git a/api/tests/integration/tests/formats/reactions/pathway2.ket b/api/tests/integration/tests/formats/reactions/pathway2.ket new file mode 100644 index 0000000000..1cf306faf8 --- /dev/null +++ b/api/tests/integration/tests/formats/reactions/pathway2.ket @@ -0,0 +1 @@ +{"root":{"nodes":[{"$ref":"mol0"},{"$ref":"mol1"},{"$ref":"mol2"},{"$ref":"mol3"},{"$ref":"mol4"},{"type":"multi-tailed-arrow","data":{"head":{"position":{"x":10.328400611877442,"y":3.6550750732421877,"z":0.0}},"spine":{"pos":[{"x":9.328400611877442,"y":6.04010009765625,"z":0.0},{"x":9.328400611877442,"y":1.270049810409546,"z":0.0}]},"tails":{"pos":[{"x":8.828400611877442,"y":6.04010009765625,"z":0.0},{"x":8.828400611877442,"y":1.270049810409546,"z":0.0}]},"zOrder":0}},{"type":"multi-tailed-arrow","data":{"head":{"position":{"x":4.230299949645996,"y":6.04010009765625,"z":0.0}},"spine":{"pos":[{"x":3.230299949645996,"y":8.175149917602539,"z":0.0},{"x":3.230299949645996,"y":3.9050498008728029,"z":0.0}]},"tails":{"pos":[{"x":2.730299949645996,"y":8.175149917602539,"z":0.0},{"x":2.730299949645996,"y":3.9050498008728029,"z":0.0}]},"zOrder":0}}]},"mol0":{"type":"molecule","atoms":[{"label":"C","location":[0.0,4.404999732971191,0.0]},{"label":"C","location":[1.730299949645996,4.405499458312988,0.0]},{"label":"C","location":[0.8668000102043152,4.905099868774414,0.0]},{"label":"C","location":[1.730299949645996,3.4044995307922365,0.0]},{"label":"C","location":[0.0,3.3999996185302736,0.0]},{"label":"C","location":[0.8690000176429749,2.9049997329711916,0.0]}],"bonds":[{"type":2,"atoms":[2,0]},{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,5]},{"type":1,"atoms":[5,3]},{"type":2,"atoms":[3,1]},{"type":1,"atoms":[1,2]}]},"mol1":{"type":"molecule","atoms":[{"label":"C","location":[0.9205999374389648,8.945199966430664,0.0]},{"label":"C","location":[1.4210000038146973,7.405099868774414,0.0]},{"label":"C","location":[1.730299949645996,8.351400375366211,0.0]},{"label":"C","location":[0.4203000068664551,7.405099868774414,0.0]},{"label":"C","location":[0.1108999252319336,8.351400375366211,0.0]}],"bonds":[{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,3]},{"type":1,"atoms":[3,1]},{"type":2,"atoms":[1,2]},{"type":1,"atoms":[2,0]}]},"mol2":{"type":"molecule","atoms":[{"label":"C","location":[5.230299949645996,6.540100574493408,0.0]},{"label":"C","location":[5.230299949645996,5.540100574493408,0.0]},{"label":"C","location":[6.09630012512207,5.04010009765625,0.0]},{"label":"C","location":[6.962400436401367,5.540100574493408,0.0]},{"label":"C","location":[6.962400436401367,6.540100574493408,0.0]},{"label":"C","location":[6.09630012512207,7.040100574493408,0.0]},{"label":"C","location":[7.828400611877441,7.040100574493408,0.0]}],"bonds":[{"type":1,"atoms":[5,0]},{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[2,3]},{"type":1,"atoms":[3,4]},{"type":1,"atoms":[4,5]},{"type":1,"atoms":[4,6]}]},"mol3":{"type":"molecule","atoms":[{"label":"C","location":[6.828400611877441,1.5400996208190919,0.0]},{"label":"C","location":[7.328801155090332,0.0,0.0]},{"label":"C","location":[7.638001441955566,0.9462995529174805,0.0]},{"label":"C","location":[6.328001976013184,0.0,0.0]},{"label":"C","location":[6.01870059967041,0.9462995529174805,0.0]},{"label":"C","location":[6.828400611877441,2.540099620819092,0.0]},{"label":"C","location":[7.828400611877441,2.540099620819092,0.0]}],"bonds":[{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,3]},{"type":1,"atoms":[3,1]},{"type":2,"atoms":[1,2]},{"type":1,"atoms":[2,0]},{"type":2,"atoms":[0,5]},{"type":1,"atoms":[5,6]}]},"mol4":{"type":"molecule","atoms":[{"label":"C","location":[12.1943998336792,4.508525371551514,0.0]},{"label":"C","location":[13.924700736999512,4.5090250968933109,0.0]},{"label":"C","location":[13.061200141906739,5.008625030517578,0.0]},{"label":"C","location":[13.924700736999512,3.5081253051757814,0.0]},{"label":"C","location":[12.1943998336792,3.50362491607666,0.0]},{"label":"C","location":[13.063399314880371,3.008625030517578,0.0]},{"label":"C","location":[11.328400611877442,3.00362491607666,0.0]},{"label":"C","location":[12.35629940032959,2.301525115966797,0.0]},{"label":"C","location":[14.631800651550293,2.801025390625,0.0]}],"bonds":[{"type":2,"atoms":[2,0]},{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,5]},{"type":1,"atoms":[5,3]},{"type":2,"atoms":[3,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[4,6]},{"type":2,"atoms":[5,7]},{"type":1,"atoms":[3,8]}]}} \ No newline at end of file diff --git a/api/tests/integration/tests/formats/reactions/pathway3.ket b/api/tests/integration/tests/formats/reactions/pathway3.ket new file mode 100644 index 0000000000..4656d6271d --- /dev/null +++ b/api/tests/integration/tests/formats/reactions/pathway3.ket @@ -0,0 +1 @@ +{"root":{"nodes":[{"$ref":"mol0"},{"$ref":"mol1"},{"$ref":"mol2"},{"$ref":"mol3"},{"type":"arrow","data":{"mode":"open-angle","pos":[{"x":8.828400611877442,"y":3.1351001262664797,"z":0.0},{"x":10.328400611877442,"y":3.1351003646850588,"z":0.0}]}},{"type":"multi-tailed-arrow","data":{"head":{"position":{"x":4.230299949645996,"y":3.1351001262664797,"z":0.0}},"spine":{"pos":[{"x":3.230299949645996,"y":5.270150184631348,"z":0.0},{"x":3.230299949645996,"y":1.0000500679016114,"z":0.0}]},"tails":{"pos":[{"x":2.730299949645996,"y":5.270150184631348,"z":0.0},{"x":2.730299949645996,"y":1.0000500679016114,"z":0.0}]},"zOrder":0}}]},"mol0":{"type":"molecule","atoms":[{"label":"C","location":[0.0,1.5,0.0]},{"label":"C","location":[1.730299949645996,1.5004997253417969,0.0]},{"label":"C","location":[0.8668000102043152,2.0001001358032228,0.0]},{"label":"C","location":[1.730299949645996,0.4994997978210449,0.0]},{"label":"C","location":[0.0,0.49499988555908205,0.0]},{"label":"C","location":[0.8690000176429749,0.0,0.0]}],"bonds":[{"type":2,"atoms":[2,0]},{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,5]},{"type":1,"atoms":[5,3]},{"type":2,"atoms":[3,1]},{"type":1,"atoms":[1,2]}]},"mol1":{"type":"molecule","atoms":[{"label":"C","location":[0.9205999374389648,6.040200233459473,0.0]},{"label":"C","location":[1.4210000038146973,4.500100135803223,0.0]},{"label":"C","location":[1.730299949645996,5.446400165557861,0.0]},{"label":"C","location":[0.4203000068664551,4.500100135803223,0.0]},{"label":"C","location":[0.1108999252319336,5.446400165557861,0.0]}],"bonds":[{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,3]},{"type":1,"atoms":[3,1]},{"type":2,"atoms":[1,2]},{"type":1,"atoms":[2,0]}]},"mol2":{"type":"molecule","atoms":[{"label":"C","location":[5.230299949645996,3.6350998878479006,0.0]},{"label":"C","location":[5.230299949645996,2.6350998878479006,0.0]},{"label":"C","location":[6.09630012512207,2.135099411010742,0.0]},{"label":"C","location":[6.962400436401367,2.6350998878479006,0.0]},{"label":"C","location":[6.962400436401367,3.6350998878479006,0.0]},{"label":"C","location":[6.09630012512207,4.1350998878479,0.0]},{"label":"C","location":[7.828400611877441,4.1350998878479,0.0]}],"bonds":[{"type":1,"atoms":[5,0]},{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[2,3]},{"type":1,"atoms":[3,4]},{"type":1,"atoms":[4,5]},{"type":1,"atoms":[4,6]}]},"mol3":{"type":"molecule","atoms":[{"label":"C","location":[12.1943998336792,3.9885506629943849,0.0]},{"label":"C","location":[13.924700736999512,3.9890503883361818,0.0]},{"label":"C","location":[13.061200141906739,4.488650321960449,0.0]},{"label":"C","location":[13.924700736999512,2.9881505966186525,0.0]},{"label":"C","location":[12.1943998336792,2.9836502075195314,0.0]},{"label":"C","location":[13.063399314880371,2.488650321960449,0.0]},{"label":"C","location":[11.328400611877442,2.4836502075195314,0.0]},{"label":"C","location":[12.35629940032959,1.781550407409668,0.0]},{"label":"C","location":[14.631800651550293,2.281050682067871,0.0]}],"bonds":[{"type":2,"atoms":[2,0]},{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,5]},{"type":1,"atoms":[5,3]},{"type":2,"atoms":[3,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[4,6]},{"type":2,"atoms":[5,7]},{"type":1,"atoms":[3,8]}]}} \ No newline at end of file diff --git a/api/tests/integration/tests/formats/reactions/pathway4.ket b/api/tests/integration/tests/formats/reactions/pathway4.ket new file mode 100644 index 0000000000..c2bae8cad9 --- /dev/null +++ b/api/tests/integration/tests/formats/reactions/pathway4.ket @@ -0,0 +1 @@ +{"root":{"nodes":[{"$ref":"mol0"},{"$ref":"mol1"},{"$ref":"mol2"},{"type":"arrow","data":{"mode":"open-angle","pos":[{"x":8.717500686645508,"y":1.3535499572753907,"z":0.0},{"x":10.217500686645508,"y":1.3535499572753907,"z":0.0}]}},{"type":"arrow","data":{"mode":"open-angle","pos":[{"x":2.6194000244140627,"y":1.3535499572753907,"z":0.0},{"x":4.1194000244140629,"y":1.3535499572753907,"z":0.0}]}}]},"mol0":{"type":"molecule","atoms":[{"label":"C","location":[0.8097000122070313,2.1236000061035158,0.0]},{"label":"C","location":[1.3101000785827637,0.5834999084472656,0.0]},{"label":"C","location":[1.6194000244140626,1.5297999382019044,0.0]},{"label":"C","location":[0.3094000816345215,0.5834999084472656,0.0]},{"label":"C","location":[0.0,1.5297999382019044,0.0]}],"bonds":[{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,3]},{"type":1,"atoms":[3,1]},{"type":2,"atoms":[1,2]},{"type":1,"atoms":[2,0]}]},"mol1":{"type":"molecule","atoms":[{"label":"C","location":[5.1194000244140629,1.8535504341125489,0.0]},{"label":"C","location":[5.1194000244140629,0.8535504341125488,0.0]},{"label":"C","location":[5.985400199890137,0.3535499572753906,0.0]},{"label":"C","location":[6.851500511169434,0.8535504341125488,0.0]},{"label":"C","location":[6.851500511169434,1.8535504341125489,0.0]},{"label":"C","location":[5.985400199890137,2.353550434112549,0.0]},{"label":"C","location":[7.717500686645508,2.353550434112549,0.0]}],"bonds":[{"type":1,"atoms":[5,0]},{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[2,3]},{"type":1,"atoms":[3,4]},{"type":1,"atoms":[4,5]},{"type":1,"atoms":[4,6]}]},"mol2":{"type":"molecule","atoms":[{"label":"C","location":[12.083499908447266,2.207000255584717,0.0]},{"label":"C","location":[13.813800811767579,2.2074999809265138,0.0]},{"label":"C","location":[12.950300216674805,2.7070999145507814,0.0]},{"label":"C","location":[13.813800811767579,1.2066001892089844,0.0]},{"label":"C","location":[12.083499908447266,1.2020998001098633,0.0]},{"label":"C","location":[12.952499389648438,0.7070999145507813,0.0]},{"label":"C","location":[11.217500686645508,0.7020998001098633,0.0]},{"label":"C","location":[12.245399475097657,0.0,0.0]},{"label":"C","location":[14.52090072631836,0.4995002746582031,0.0]}],"bonds":[{"type":2,"atoms":[2,0]},{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,5]},{"type":1,"atoms":[5,3]},{"type":2,"atoms":[3,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[4,6]},{"type":2,"atoms":[5,7]},{"type":1,"atoms":[3,8]}]}} \ No newline at end of file diff --git a/api/tests/integration/tests/formats/reactions/pathway5.ket b/api/tests/integration/tests/formats/reactions/pathway5.ket new file mode 100644 index 0000000000..058d99bcb7 --- /dev/null +++ b/api/tests/integration/tests/formats/reactions/pathway5.ket @@ -0,0 +1 @@ +{"root":{"nodes":[{"$ref":"mol0"},{"$ref":"mol1"},{"type":"arrow","data":{"mode":"open-angle","pos":[{"x":3.5981006622314455,"y":1.3535499572753907,"z":0.0},{"x":5.098100662231445,"y":1.3535499572753907,"z":0.0}]}}]},"mol0":{"type":"molecule","atoms":[{"label":"C","location":[0.0,1.8535504341125489,0.0]},{"label":"C","location":[0.0,0.8535504341125488,0.0]},{"label":"C","location":[0.8660001754760742,0.3535499572753906,0.0]},{"label":"C","location":[1.732100486755371,0.8535504341125488,0.0]},{"label":"C","location":[1.732100486755371,1.8535504341125489,0.0]},{"label":"C","location":[0.8660001754760742,2.353550434112549,0.0]},{"label":"C","location":[2.5981006622314455,2.353550434112549,0.0]}],"bonds":[{"type":1,"atoms":[5,0]},{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[2,3]},{"type":1,"atoms":[3,4]},{"type":1,"atoms":[4,5]},{"type":1,"atoms":[4,6]}]},"mol1":{"type":"molecule","atoms":[{"label":"C","location":[6.964099884033203,2.207000255584717,0.0]},{"label":"C","location":[8.694400787353516,2.2074999809265138,0.0]},{"label":"C","location":[7.830900192260742,2.7070999145507814,0.0]},{"label":"C","location":[8.694400787353516,1.2066001892089844,0.0]},{"label":"C","location":[6.964099884033203,1.2020998001098633,0.0]},{"label":"C","location":[7.833099365234375,0.7070999145507813,0.0]},{"label":"C","location":[6.098100662231445,0.7020998001098633,0.0]},{"label":"C","location":[7.125999450683594,0.0,0.0]},{"label":"C","location":[9.401500701904297,0.4995002746582031,0.0]}],"bonds":[{"type":2,"atoms":[2,0]},{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,5]},{"type":1,"atoms":[5,3]},{"type":2,"atoms":[3,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[4,6]},{"type":2,"atoms":[5,7]},{"type":1,"atoms":[3,8]}]}} \ No newline at end of file diff --git a/api/tests/integration/tests/formats/reactions/pathway6.ket b/api/tests/integration/tests/formats/reactions/pathway6.ket new file mode 100644 index 0000000000..37c0309a4b --- /dev/null +++ b/api/tests/integration/tests/formats/reactions/pathway6.ket @@ -0,0 +1 @@ +{"root":{"nodes":[{"$ref":"mol0"},{"$ref":"mol1"},{"$ref":"mol2"},{"$ref":"mol3"},{"$ref":"mol4"},{"$ref":"mol5"},{"$ref":"mol6"},{"$ref":"mol7"},{"$ref":"mol8"},{"$ref":"mol9"},{"type":"multi-tailed-arrow","data":{"head":{"position":{"x":17.69059944152832,"y":11.327312469482422,"z":0.0}},"spine":{"pos":[{"x":16.69059944152832,"y":16.625598907470704,"z":0.0},{"x":16.69059944152832,"y":6.029025077819824,"z":0.0}]},"tails":{"pos":[{"x":16.19059944152832,"y":16.625598907470704,"z":0.0},{"x":16.19059944152832,"y":6.029025077819824,"z":0.0}]},"zOrder":0}},{"type":"multi-tailed-arrow","data":{"head":{"position":{"x":10.887199401855469,"y":6.029025077819824,"z":0.0}},"spine":{"pos":[{"x":9.887199401855469,"y":10.788000106811524,"z":0.0},{"x":9.887199401855469,"y":1.270050048828125,"z":0.0}]},"tails":{"pos":[{"x":9.387199401855469,"y":10.788000106811524,"z":0.0},{"x":9.387199401855469,"y":6.164050102233887,"z":0.0},{"x":9.387199401855469,"y":1.270050048828125,"z":0.0}]},"zOrder":0}},{"type":"multi-tailed-arrow","data":{"head":{"position":{"x":4.78909969329834,"y":10.788000106811524,"z":0.0}},"spine":{"pos":[{"x":3.2302989959716799,"y":12.923049926757813,"z":0.0},{"x":3.2302989959716799,"y":8.652950286865235,"z":0.0}]},"tails":{"pos":[{"x":2.7302989959716799,"y":12.923049926757813,"z":0.0},{"x":2.7302989959716799,"y":8.652950286865235,"z":0.0}]},"zOrder":0}},{"type":"arrow","data":{"mode":"open-angle","pos":[{"x":9.387199401855469,"y":16.625598907470704,"z":0.0},{"x":11.777299880981446,"y":16.625598907470704,"z":0.0}]}},{"type":"arrow","data":{"mode":"open-angle","pos":[{"x":2.7302989959716799,"y":16.625598907470704,"z":0.0},{"x":5.769199371337891,"y":16.625598907470704,"z":0.0}]}}]},"mol0":{"type":"molecule","atoms":[{"label":"C","location":[0.0,9.152899742126465,0.0]},{"label":"C","location":[1.730299949645996,9.153399467468262,0.0]},{"label":"C","location":[0.8668000102043152,9.652999877929688,0.0]},{"label":"C","location":[1.730299949645996,8.152399063110352,0.0]},{"label":"C","location":[0.0,8.147899627685547,0.0]},{"label":"C","location":[0.8690000176429749,7.652899742126465,0.0]}],"bonds":[{"type":2,"atoms":[2,0]},{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,5]},{"type":1,"atoms":[5,3]},{"type":2,"atoms":[3,1]},{"type":1,"atoms":[1,2]}]},"mol1":{"type":"molecule","atoms":[{"label":"C","location":[0.9205989837646484,13.693100929260254,0.0]},{"label":"C","location":[1.4209990501403809,12.153000831604004,0.0]},{"label":"C","location":[1.7302989959716797,13.099300384521485,0.0]},{"label":"C","location":[0.42029905319213869,12.153000831604004,0.0]},{"label":"C","location":[0.11089897155761719,13.099300384521485,0.0]}],"bonds":[{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,3]},{"type":1,"atoms":[3,1]},{"type":2,"atoms":[1,2]},{"type":1,"atoms":[2,0]}]},"mol2":{"type":"molecule","atoms":[{"label":"C","location":[5.78909969329834,11.287999153137207,0.0]},{"label":"C","location":[5.78909969329834,10.287999153137207,0.0]},{"label":"C","location":[6.655099868774414,9.787999153137207,0.0]},{"label":"C","location":[7.5211992263793949,10.287999153137207,0.0]},{"label":"C","location":[7.5211992263793949,11.287999153137207,0.0]},{"label":"C","location":[6.655099868774414,11.787999153137207,0.0]},{"label":"C","location":[8.387199401855469,11.787999153137207,0.0]}],"bonds":[{"type":1,"atoms":[5,0]},{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[2,3]},{"type":1,"atoms":[3,4]},{"type":1,"atoms":[4,5]},{"type":1,"atoms":[4,6]}]},"mol3":{"type":"molecule","atoms":[{"label":"C","location":[7.387199401855469,1.54010009765625,0.0]},{"label":"C","location":[7.887599945068359,0.0,0.0]},{"label":"C","location":[8.196800231933594,0.9463005065917969,0.0]},{"label":"C","location":[6.886798858642578,0.0,0.0]},{"label":"C","location":[6.5774993896484379,0.9463005065917969,0.0]},{"label":"C","location":[7.387199401855469,2.540100574493408,0.0]},{"label":"C","location":[8.387199401855469,2.540100574493408,0.0]}],"bonds":[{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,3]},{"type":1,"atoms":[3,1]},{"type":2,"atoms":[1,2]},{"type":1,"atoms":[2,0]},{"type":2,"atoms":[0,5]},{"type":1,"atoms":[5,6]}]},"mol4":{"type":"molecule","atoms":[{"label":"C","location":[6.1961989402771,6.670499801635742,0.0]},{"label":"C","location":[6.980098724365234,7.288000106811523,0.0]},{"label":"C","location":[7.953098773956299,7.065500259399414,0.0]},{"label":"C","location":[8.387199401855469,6.169699668884277,0.0]},{"label":"C","location":[6.2016987800598148,5.663300514221191,0.0]},{"label":"C","location":[7.953798770904541,5.262599945068359,0.0]},{"label":"C","location":[6.980098724365234,5.04010009765625,0.0]},{"label":"C","location":[5.23029899597168,6.929300308227539,0.0]}],"bonds":[{"type":1,"atoms":[1,0]},{"type":1,"atoms":[0,4]},{"type":1,"atoms":[4,6]},{"type":1,"atoms":[6,5]},{"type":1,"atoms":[5,3]},{"type":1,"atoms":[3,2]},{"type":1,"atoms":[2,1]},{"type":1,"atoms":[0,7]}]},"mol5":{"type":"molecule","atoms":[{"label":"C","location":[0.7290992736816406,16.193099975585939,0.0]},{"label":"C","location":[1.730299472808838,16.193099975585939,0.0]},{"label":"C","location":[1.2296996116638184,17.0580997467041,0.0]}],"bonds":[{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[2,0]}]},"mol6":{"type":"molecule","atoms":[{"label":"C","location":[7.57819938659668,17.395048141479493,0.0]},{"label":"C","location":[8.387199401855469,16.807247161865236,0.0]},{"label":"C","location":[8.07819938659668,15.856148719787598,0.0]},{"label":"C","location":[7.07819938659668,15.856148719787598,0.0]},{"label":"C","location":[6.769199371337891,16.807247161865236,0.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]}]},"mol7":{"type":"molecule","atoms":[{"label":"C","location":[12.753199577331543,6.882476806640625,0.0]},{"label":"C","location":[14.483499526977539,6.882976531982422,0.0]},{"label":"C","location":[13.619999885559082,7.382575988769531,0.0]},{"label":"C","location":[14.483499526977539,5.882076263427734,0.0]},{"label":"C","location":[12.753199577331543,5.87757682800293,0.0]},{"label":"C","location":[13.622200012207032,5.382575988769531,0.0]},{"label":"C","location":[11.887199401855469,5.37757682800293,0.0]},{"label":"C","location":[12.91510009765625,4.67547607421875,0.0]},{"label":"C","location":[15.19059944152832,5.174976348876953,0.0]}],"bonds":[{"type":2,"atoms":[2,0]},{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,5]},{"type":1,"atoms":[5,3]},{"type":2,"atoms":[3,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[4,6]},{"type":2,"atoms":[5,7]},{"type":1,"atoms":[3,8]}]},"mol8":{"type":"molecule","atoms":[{"label":"C","location":[12.777299880981446,16.12434959411621,0.0]},{"label":"C","location":[12.777498245239258,17.126850128173829,0.0]},{"label":"C","location":[13.482599258422852,17.832149505615236,0.0]},{"label":"C","location":[13.482799530029297,15.418949127197266,0.0]},{"label":"C","location":[14.485198974609375,15.418949127197266,0.0]},{"label":"C","location":[15.19059944152832,16.12434959411621,0.0]},{"label":"C","location":[15.190498352050782,17.126850128173829,0.0]},{"label":"C","location":[14.485198974609375,17.83224868774414,0.0]}],"bonds":[{"type":1,"atoms":[1,0]},{"type":1,"atoms":[0,3]},{"type":1,"atoms":[3,4]},{"type":1,"atoms":[4,5]},{"type":1,"atoms":[5,6]},{"type":1,"atoms":[6,7]},{"type":1,"atoms":[7,2]},{"type":1,"atoms":[2,1]}]},"mol9":{"type":"molecule","atoms":[{"label":"C","location":[18.69059944152832,9.22191333770752,0.0]},{"label":"C","location":[18.690797805786134,10.22441291809082,0.0]},{"label":"C","location":[19.395998001098634,10.92961311340332,0.0]},{"label":"C","location":[19.396198272705079,8.516512870788575,0.0]},{"label":"C","location":[20.39859962463379,8.516512870788575,0.0]},{"label":"C","location":[21.1039981842041,9.22191333770752,0.0]},{"label":"C","location":[21.103899002075197,10.22441291809082,0.0]},{"label":"C","location":[20.39859962463379,10.929713249206543,0.0]},{"label":"C","location":[18.773998260498048,12.43021297454834,0.0]},{"label":"C","location":[18.774198532104493,13.43271255493164,0.0]},{"label":"C","location":[19.479299545288087,14.138012886047364,0.0]},{"label":"C","location":[19.4794979095459,11.724812507629395,0.0]},{"label":"C","location":[20.48189926147461,11.724812507629395,0.0]},{"label":"C","location":[21.187297821044923,12.43021297454834,0.0]},{"label":"C","location":[21.187198638916017,13.43271255493164,0.0]},{"label":"C","location":[20.48189926147461,14.138113021850586,0.0]}],"bonds":[{"type":1,"atoms":[1,0]},{"type":1,"atoms":[0,3]},{"type":1,"atoms":[3,4]},{"type":1,"atoms":[4,5]},{"type":1,"atoms":[5,6]},{"type":1,"atoms":[6,7]},{"type":1,"atoms":[7,2]},{"type":1,"atoms":[2,1]},{"type":1,"atoms":[9,8]},{"type":1,"atoms":[8,11]},{"type":1,"atoms":[11,12]},{"type":1,"atoms":[12,13]},{"type":1,"atoms":[13,14]},{"type":1,"atoms":[14,15]},{"type":1,"atoms":[15,10]},{"type":1,"atoms":[10,9]},{"type":1,"atoms":[11,2]}]}} \ No newline at end of file diff --git a/api/tests/integration/tests/formats/reactions/pathway7.ket b/api/tests/integration/tests/formats/reactions/pathway7.ket new file mode 100644 index 0000000000..d1f8e3558a --- /dev/null +++ b/api/tests/integration/tests/formats/reactions/pathway7.ket @@ -0,0 +1 @@ +{"root":{"nodes":[{"$ref":"mol0"},{"$ref":"mol1"},{"$ref":"mol2"},{"$ref":"mol3"},{"$ref":"mol4"},{"$ref":"mol5"},{"$ref":"mol6"},{"type":"multi-tailed-arrow","data":{"head":{"position":{"x":35.554100036621097,"y":11.332690238952637,"z":0.0}},"spine":{"pos":[{"x":34.554100036621097,"y":17.61530303955078,"z":0.0},{"x":34.554100036621097,"y":5.050076961517334,"z":0.0}]},"tails":{"pos":[{"x":34.054100036621097,"y":17.61530303955078,"z":0.0},{"x":34.054100036621097,"y":5.050076961517334,"z":0.0}]},"zOrder":0}},{"type":"multi-tailed-arrow","data":{"head":{"position":{"x":17.133800506591798,"y":5.050076961517334,"z":0.0}},"spine":{"pos":[{"x":16.133800506591798,"y":9.329853057861329,"z":0.0},{"x":16.133800506591798,"y":0.7703008651733398,"z":0.0}]},"tails":{"pos":[{"x":15.633800506591797,"y":9.329853057861329,"z":0.0},{"x":15.633800506591797,"y":4.788802146911621,"z":0.0},{"x":15.633800506591797,"y":0.7703008651733398,"z":0.0}]},"zOrder":0}},{"type":"arrow","data":{"mode":"open-angle","pos":[{"x":15.633800506591797,"y":17.61530303955078,"z":0.0},{"x":31.158401489257814,"y":17.61530303955078,"z":0.0}]}}]},"mol0":{"type":"molecule","atoms":[{"label":"C","location":[14.633800506591797,0.0,0.0]},{"label":"C","location":[14.63010025024414,0.9959011077880859,0.0]},{"label":"C","location":[13.621000289916993,0.01300048828125,0.0]},{"label":"C","location":[13.618499755859375,0.9959011077880859,0.0]},{"label":"C","location":[12.624900817871094,1.5406017303466797,0.0]}],"bonds":[{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,3]},{"type":1,"atoms":[3,2]},{"type":1,"atoms":[2,0]},{"type":1,"atoms":[4,3]}]},"mol1":{"type":"molecule","atoms":[{"label":"C","location":[13.77079963684082,4.04060173034668,0.0]},{"label":"C","location":[13.767099380493164,5.036502838134766,0.0]},{"label":"C","location":[12.757999420166016,4.053503036499023,0.0]},{"label":"C","location":[12.755499839782715,5.036502838134766,0.0]},{"label":"C","location":[12.220600128173829,5.414302825927734,0.0]},{"label":"C","location":[14.63379955291748,5.5370025634765629,0.0]}],"bonds":[{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,3]},{"type":1,"atoms":[3,2]},{"type":1,"atoms":[2,0]},{"type":1,"atoms":[4,3]},{"type":1,"atoms":[1,5]}]},"mol2":{"type":"molecule","atoms":[{"label":"C","location":[13.51500129699707,8.998703002929688,0.0]},{"label":"C","location":[13.511301040649414,9.994604110717774,0.0]},{"label":"C","location":[12.502300262451172,9.011602401733399,0.0]},{"label":"C","location":[12.499801635742188,9.994604110717774,0.0]},{"label":"C","location":[11.964801788330079,10.497503280639649,0.0]},{"label":"C","location":[14.09160041809082,10.622703552246094,0.0]},{"label":"C","location":[14.633800506591797,8.037002563476563,0.0]}],"bonds":[{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,3]},{"type":1,"atoms":[3,2]},{"type":1,"atoms":[2,0]},{"type":1,"atoms":[4,3]},{"type":1,"atoms":[5,1]},{"type":1,"atoms":[6,0]}]},"mol3":{"type":"molecule","atoms":[{"label":"C","location":[5.077700614929199,14.603903770446778,0.0]},{"label":"C","location":[5.143000602722168,13.122703552246094,0.0]},{"label":"C","location":[4.682801246643066,13.844404220581055,0.0]},{"label":"C","location":[5.998101234436035,13.160404205322266,0.0]},{"label":"C","location":[5.932900428771973,14.64150333404541,0.0]},{"label":"C","location":[6.393099784851074,13.919803619384766,0.0]},{"label":"C","location":[9.280800819396973,13.43640422821045,0.0]},{"label":"C","location":[9.106600761413575,14.908703804016114,0.0]},{"label":"C","location":[8.76870059967041,14.12230396270752,0.0]},{"label":"C","location":[9.9566011428833,15.00930404663086,0.0]},{"label":"C","location":[10.1308012008667,13.537003517150879,0.0]},{"label":"C","location":[10.468701362609864,14.323403358459473,0.0]},{"label":"C","location":[0.8977994918823242,15.269204139709473,0.0]},{"label":"C","location":[2.261599540710449,14.687603950500489,0.0]},{"label":"C","location":[1.7475996017456055,15.372103691101075,0.0]},{"label":"C","location":[1.9258012771606446,13.900303840637207,0.0]},{"label":"C","location":[0.5621004104614258,14.481904029846192,0.0]},{"label":"C","location":[1.0760011672973633,13.797403335571289,0.0]},{"label":"C","location":[0.7950010299682617,16.119003295898439,0.0]},{"label":"C","location":[1.9805002212524415,17.009204864501954,0.0]},{"label":"C","location":[1.644700050354004,16.221904754638673,0.0]},{"label":"C","location":[1.4666013717651368,17.693702697753908,0.0]},{"label":"C","location":[0.28100013732910159,16.803504943847658,0.0]},{"label":"C","location":[0.6168003082275391,17.590805053710939,0.0]},{"label":"C","location":[1.6995000839233399,19.33080291748047,0.0]},{"label":"C","location":[0.5139007568359375,18.44060516357422,0.0]},{"label":"C","location":[1.3636999130249024,18.543502807617189,0.0]},{"label":"C","location":[0.0,19.125102996826173,0.0]},{"label":"C","location":[1.185500144958496,20.015304565429689,0.0]},{"label":"C","location":[0.3358001708984375,19.912403106689454,0.0]},{"label":"C","location":[14.63379955291748,15.865303993225098,0.0]},{"label":"C","location":[13.290200233459473,16.491905212402345,0.0]},{"label":"C","location":[14.142899513244629,16.566402435302736,0.0]},{"label":"C","location":[12.928400993347168,15.716103553771973,0.0]},{"label":"C","location":[14.272099494934082,15.08950424194336,0.0]},{"label":"C","location":[13.419400215148926,15.014904022216797,0.0]},{"label":"C","location":[12.724699974060059,18.04580307006836,0.0]},{"label":"C","location":[14.0683012008667,17.419204711914064,0.0]},{"label":"C","location":[13.21560001373291,17.3446044921875,0.0]},{"label":"C","location":[14.430100440979004,18.194904327392579,0.0]},{"label":"C","location":[13.086400032043457,18.821502685546876,0.0]},{"label":"C","location":[13.939101219177246,18.896102905273439,0.0]},{"label":"C","location":[12.520899772644043,20.375404357910158,0.0]},{"label":"C","location":[13.86460018157959,19.748804092407228,0.0]},{"label":"C","location":[13.011799812316895,19.674203872680665,0.0]},{"label":"C","location":[14.226300239562989,20.52460479736328,0.0]},{"label":"C","location":[12.88270092010498,21.151203155517579,0.0]},{"label":"C","location":[13.735400199890137,21.22580337524414,0.0]},{"label":"C","location":[4.027100563049316,20.74320411682129,0.0]},{"label":"C","location":[5.163599967956543,21.69530487060547,0.0]},{"label":"C","location":[4.320500373840332,21.547304153442384,0.0]},{"label":"C","location":[5.713299751281738,21.039203643798829,0.0]},{"label":"C","location":[4.576800346374512,20.087003707885743,0.0]},{"label":"C","location":[5.419899940490723,20.235004425048829,0.0]},{"label":"C","location":[8.527600288391114,22.07030487060547,0.0]},{"label":"C","location":[9.842801094055176,21.386104583740236,0.0]},{"label":"C","location":[9.38270092010498,22.1079044342041,0.0]},{"label":"C","location":[9.447800636291504,20.6267032623291,0.0]},{"label":"C","location":[8.132599830627442,21.310903549194337,0.0]},{"label":"C","location":[8.592700004577637,20.58910369873047,0.0]}],"bonds":[{"type":2,"atoms":[2,0]},{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,5]},{"type":1,"atoms":[5,3]},{"type":2,"atoms":[3,1]},{"type":1,"atoms":[1,2]},{"type":2,"atoms":[8,6]},{"type":1,"atoms":[6,10]},{"type":2,"atoms":[10,11]},{"type":1,"atoms":[11,9]},{"type":2,"atoms":[9,7]},{"type":1,"atoms":[7,8]},{"type":1,"atoms":[5,8]},{"type":2,"atoms":[14,12]},{"type":1,"atoms":[12,16]},{"type":2,"atoms":[16,17]},{"type":1,"atoms":[17,15]},{"type":2,"atoms":[15,13]},{"type":1,"atoms":[13,14]},{"type":1,"atoms":[13,2]},{"type":2,"atoms":[20,18]},{"type":1,"atoms":[18,22]},{"type":2,"atoms":[22,23]},{"type":1,"atoms":[23,21]},{"type":2,"atoms":[21,19]},{"type":1,"atoms":[19,20]},{"type":1,"atoms":[18,12]},{"type":1,"atoms":[20,14]},{"type":2,"atoms":[26,24]},{"type":1,"atoms":[24,28]},{"type":2,"atoms":[28,29]},{"type":1,"atoms":[29,27]},{"type":2,"atoms":[27,25]},{"type":1,"atoms":[25,26]},{"type":1,"atoms":[21,26]},{"type":1,"atoms":[23,25]},{"type":2,"atoms":[32,30]},{"type":1,"atoms":[30,34]},{"type":2,"atoms":[34,35]},{"type":1,"atoms":[35,33]},{"type":2,"atoms":[33,31]},{"type":1,"atoms":[31,32]},{"type":1,"atoms":[11,33]},{"type":2,"atoms":[38,36]},{"type":1,"atoms":[36,40]},{"type":2,"atoms":[40,41]},{"type":1,"atoms":[41,39]},{"type":2,"atoms":[39,37]},{"type":1,"atoms":[37,38]},{"type":2,"atoms":[44,42]},{"type":1,"atoms":[42,46]},{"type":2,"atoms":[46,47]},{"type":1,"atoms":[47,45]},{"type":2,"atoms":[45,43]},{"type":1,"atoms":[43,44]},{"type":1,"atoms":[38,31]},{"type":1,"atoms":[37,32]},{"type":1,"atoms":[44,40]},{"type":1,"atoms":[43,41]},{"type":2,"atoms":[50,48]},{"type":1,"atoms":[48,52]},{"type":2,"atoms":[52,53]},{"type":1,"atoms":[53,51]},{"type":2,"atoms":[51,49]},{"type":1,"atoms":[49,50]},{"type":2,"atoms":[56,54]},{"type":1,"atoms":[54,58]},{"type":2,"atoms":[58,59]},{"type":1,"atoms":[59,57]},{"type":2,"atoms":[57,55]},{"type":1,"atoms":[55,56]},{"type":1,"atoms":[24,48]},{"type":1,"atoms":[51,58]},{"type":1,"atoms":[55,42]}]},"mol4":{"type":"molecule","atoms":[{"label":"C","location":[32.606201171875,18.003204345703126,0.0]},{"label":"C","location":[32.15840148925781,17.22740364074707,0.0]},{"label":"C","location":[33.054100036621097,17.22740364074707,0.0]}],"bonds":[{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[2,0]}]},"mol5":{"type":"molecule","atoms":[{"label":"C","location":[23.36840057373047,2.478177070617676,0.0]},{"label":"C","location":[23.44110107421875,0.9284772872924805,0.0]},{"label":"C","location":[22.957401275634767,1.6823768615722657,0.0]},{"label":"C","location":[24.335800170898439,0.9704771041870117,0.0]},{"label":"C","location":[24.263099670410158,2.520176887512207,0.0]},{"label":"C","location":[24.74679946899414,1.7663774490356446,0.0]},{"label":"C","location":[27.679500579833986,1.267277717590332,0.0]},{"label":"C","location":[27.47930145263672,2.8056774139404299,0.0]},{"label":"C","location":[27.135299682617189,1.9786767959594727,0.0]},{"label":"C","location":[28.367599487304689,2.9211769104003908,0.0]},{"label":"C","location":[28.567699432373048,1.382777214050293,0.0]},{"label":"C","location":[28.911701202392579,2.2097768783569338,0.0]},{"label":"C","location":[19.037700653076173,3.100677490234375,0.0]},{"label":"C","location":[20.459400177001954,2.4794769287109377,0.0]},{"label":"C","location":[19.927900314331056,3.2004776000976564,0.0]},{"label":"C","location":[20.10070037841797,1.658677101135254,0.0]},{"label":"C","location":[18.679100036621095,2.2798776626586916,0.0]},{"label":"C","location":[19.210601806640626,1.5588769912719727,0.0]},{"label":"C","location":[18.93790054321289,3.990777015686035,0.0]},{"label":"C","location":[20.18670082092285,4.911376953125,0.0]},{"label":"C","location":[19.828102111816408,4.090577125549316,0.0]},{"label":"C","location":[19.655200958251954,5.632377624511719,0.0]},{"label":"C","location":[18.406400680541993,4.711777687072754,0.0]},{"label":"C","location":[18.765100479125978,5.5325775146484379,0.0]},{"label":"C","location":[19.91400146484375,7.3432769775390629,0.0]},{"label":"C","location":[18.665300369262697,6.422677040100098,0.0]},{"label":"C","location":[19.555400848388673,6.522477149963379,0.0]},{"label":"C","location":[18.133800506591798,7.143677711486816,0.0]},{"label":"C","location":[19.38249969482422,8.064176559448243,0.0]},{"label":"C","location":[18.492401123046876,7.964377403259277,0.0]},{"label":"C","location":[33.054100036621097,3.877377510070801,0.0]},{"label":"C","location":[31.505401611328126,3.9678773880004885,0.0]},{"label":"C","location":[32.30590057373047,4.369677543640137,0.0]},{"label":"C","location":[31.453102111816408,3.0736770629882814,0.0]},{"label":"C","location":[33.00189971923828,2.9831771850585939,0.0]},{"label":"C","location":[32.20130157470703,2.5813770294189455,0.0]},{"label":"C","location":[30.355300903320314,5.260777473449707,0.0]},{"label":"C","location":[31.904102325439454,5.170177459716797,0.0]},{"label":"C","location":[31.103500366210939,4.768377304077148,0.0]},{"label":"C","location":[31.956298828125,6.0643768310546879,0.0]},{"label":"C","location":[30.40760040283203,6.154877662658691,0.0]},{"label":"C","location":[31.208099365234376,6.556777000427246,0.0]},{"label":"C","location":[29.25749969482422,7.447776794433594,0.0]},{"label":"C","location":[30.80630111694336,7.357276916503906,0.0]},{"label":"C","location":[30.005699157714845,6.955477714538574,0.0]},{"label":"C","location":[30.858501434326173,8.251477241516114,0.0]},{"label":"C","location":[29.309799194335939,8.3419771194458,0.0]},{"label":"C","location":[30.110301971435548,8.74377727508545,0.0]},{"label":"C","location":[22.230998992919923,8.404277801513672,0.0]},{"label":"C","location":[23.5885009765625,9.155277252197266,0.0]},{"label":"C","location":[22.69300079345703,9.171676635742188,0.0]},{"label":"C","location":[24.02210235595703,8.371577262878418,0.0]},{"label":"C","location":[22.66469955444336,7.620477199554443,0.0]},{"label":"C","location":[23.560199737548829,7.604177474975586,0.0]},{"label":"C","location":[26.48870086669922,8.59357738494873,0.0]},{"label":"C","location":[26.912601470947267,7.207577705383301,0.0]},{"label":"C","location":[27.2041015625,8.054576873779297,0.0]},{"label":"C","location":[26.01700210571289,7.223176956176758,0.0]},{"label":"C","location":[25.755001068115236,8.07967758178711,0.0]}],"bonds":[{"type":2,"atoms":[2,0]},{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,5]},{"type":1,"atoms":[5,3]},{"type":2,"atoms":[3,1]},{"type":1,"atoms":[1,2]},{"type":2,"atoms":[8,6]},{"type":1,"atoms":[6,10]},{"type":2,"atoms":[10,11]},{"type":1,"atoms":[11,9]},{"type":2,"atoms":[9,7]},{"type":1,"atoms":[7,8]},{"type":1,"atoms":[5,8]},{"type":2,"atoms":[14,12]},{"type":1,"atoms":[12,16]},{"type":2,"atoms":[16,17]},{"type":1,"atoms":[17,15]},{"type":2,"atoms":[15,13]},{"type":1,"atoms":[13,14]},{"type":1,"atoms":[13,2]},{"type":2,"atoms":[20,18]},{"type":1,"atoms":[18,22]},{"type":2,"atoms":[22,23]},{"type":1,"atoms":[23,21]},{"type":2,"atoms":[21,19]},{"type":1,"atoms":[19,20]},{"type":1,"atoms":[18,12]},{"type":1,"atoms":[20,14]},{"type":2,"atoms":[26,24]},{"type":1,"atoms":[24,28]},{"type":2,"atoms":[28,29]},{"type":1,"atoms":[29,27]},{"type":2,"atoms":[27,25]},{"type":1,"atoms":[25,26]},{"type":1,"atoms":[21,26]},{"type":1,"atoms":[23,25]},{"type":2,"atoms":[32,30]},{"type":1,"atoms":[30,34]},{"type":2,"atoms":[34,35]},{"type":1,"atoms":[35,33]},{"type":2,"atoms":[33,31]},{"type":1,"atoms":[31,32]},{"type":1,"atoms":[11,33]},{"type":2,"atoms":[38,36]},{"type":1,"atoms":[36,40]},{"type":2,"atoms":[40,41]},{"type":1,"atoms":[41,39]},{"type":2,"atoms":[39,37]},{"type":1,"atoms":[37,38]},{"type":2,"atoms":[44,42]},{"type":1,"atoms":[42,46]},{"type":2,"atoms":[46,47]},{"type":1,"atoms":[47,45]},{"type":2,"atoms":[45,43]},{"type":1,"atoms":[43,44]},{"type":1,"atoms":[38,31]},{"type":1,"atoms":[37,32]},{"type":1,"atoms":[44,40]},{"type":1,"atoms":[43,41]},{"type":2,"atoms":[50,48]},{"type":1,"atoms":[48,52]},{"type":2,"atoms":[52,53]},{"type":1,"atoms":[53,51]},{"type":2,"atoms":[51,49]},{"type":1,"atoms":[49,50]},{"type":1,"atoms":[24,48]},{"type":1,"atoms":[54,58]},{"type":2,"atoms":[58,57]},{"type":1,"atoms":[57,55]},{"type":2,"atoms":[55,56]},{"type":1,"atoms":[56,54]},{"type":1,"atoms":[51,58]},{"type":1,"atoms":[56,46]}]},"mol6":{"type":"molecule","atoms":[{"label":"C","location":[37.724403381347659,12.502989768981934,0.0]},{"label":"C","location":[38.551902770996097,12.160189628601075,0.0]},{"label":"C","location":[38.89470291137695,11.332690238952637,0.0]},{"label":"C","location":[36.89690017700195,12.160189628601075,0.0]},{"label":"C","location":[36.554100036621097,11.332690238952637,0.0]},{"label":"C","location":[36.89690017700195,10.505189895629883,0.0]},{"label":"C","location":[37.724403381347659,10.162389755249024,0.0]},{"label":"C","location":[38.551902770996097,10.505189895629883,0.0]}],"bonds":[{"type":1,"atoms":[1,0]},{"type":1,"atoms":[0,3]},{"type":1,"atoms":[3,4]},{"type":1,"atoms":[4,5]},{"type":1,"atoms":[5,6]},{"type":1,"atoms":[6,7]},{"type":1,"atoms":[7,2]},{"type":1,"atoms":[2,1]}]}} \ No newline at end of file diff --git a/api/tests/integration/tests/formats/reactions/pathway8.ket b/api/tests/integration/tests/formats/reactions/pathway8.ket new file mode 100644 index 0000000000..4db87af454 --- /dev/null +++ b/api/tests/integration/tests/formats/reactions/pathway8.ket @@ -0,0 +1 @@ +{"root":{"nodes":[{"$ref":"mol0"},{"$ref":"mol1"},{"$ref":"mol2"},{"$ref":"mol3"},{"$ref":"mol4"},{"$ref":"mol5"},{"$ref":"mol6"},{"$ref":"mol7"},{"$ref":"mol8"},{"$ref":"mol9"},{"type":"arrow","data":{"mode":"open-angle","pos":[{"x":2.6194000244140627,"y":4.124800205230713,"z":0.0},{"x":4.1194000244140629,"y":4.124800205230713,"z":0.0}]}},{"type":"multi-tailed-arrow","data":{"head":{"position":{"x":27.17820167541504,"y":19.806150436401368,"z":0.0}},"spine":{"pos":[{"x":26.17820167541504,"y":25.366600036621095,"z":0.0},{"x":26.17820167541504,"y":14.245699882507325,"z":0.0}]},"tails":{"pos":[{"x":25.67820167541504,"y":25.366600036621095,"z":0.0},{"x":25.67820167541504,"y":14.245699882507325,"z":0.0}]},"zOrder":0}},{"type":"arrow","data":{"mode":"open-angle","pos":[{"x":21.163801193237306,"y":14.24570083618164,"z":0.0},{"x":22.676902770996095,"y":14.245699882507325,"z":0.0}]}},{"type":"arrow","data":{"mode":"open-angle","pos":[{"x":2.7320003509521486,"y":14.24570083618164,"z":0.0},{"x":4.5186004638671879,"y":14.24570083618164,"z":0.0}]}},{"type":"arrow","data":{"mode":"open-angle","pos":[{"x":21.163801193237306,"y":25.366600036621095,"z":0.0},{"x":22.663801193237306,"y":25.366600036621095,"z":0.0}]}},{"type":"multi-tailed-arrow","data":{"head":{"position":{"x":4.232000350952148,"y":25.366600036621095,"z":0.0}},"spine":{"pos":[{"x":3.2320003509521486,"y":27.498849868774415,"z":0.0},{"x":3.2320003509521486,"y":23.234352111816408,"z":0.0}]},"tails":{"pos":[{"x":2.7320003509521486,"y":27.498849868774415,"z":0.0},{"x":2.7320003509521486,"y":23.234352111816408,"z":0.0}]},"zOrder":0}}]},"mol0":{"type":"molecule","atoms":[{"label":"C","location":[0.9282002449035645,23.998802185058595,0.0]},{"label":"C","location":[1.4250001907348633,22.46990394592285,0.0]},{"label":"C","location":[1.7320001125335694,23.409202575683595,0.0]},{"label":"C","location":[0.4315004348754883,22.46990394592285,0.0]},{"label":"C","location":[0.12430000305175781,23.409202575683595,0.0]}],"bonds":[{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,3]},{"type":1,"atoms":[3,1]},{"type":2,"atoms":[1,2]},{"type":1,"atoms":[2,0]}]},"mol1":{"type":"molecule","atoms":[{"label":"C","location":[0.0,27.99880027770996,0.0]},{"label":"C","location":[0.0,26.99880027770996,0.0]},{"label":"C","location":[0.8659999966621399,26.49880027770996,0.0]},{"label":"C","location":[1.7320001125335694,26.99880027770996,0.0]},{"label":"C","location":[1.7320001125335694,27.99880027770996,0.0]},{"label":"C","location":[0.8659999966621399,28.498899459838868,0.0]}],"bonds":[{"type":1,"atoms":[5,0]},{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[2,3]},{"type":1,"atoms":[3,4]},{"type":1,"atoms":[4,5]}]},"mol2":{"type":"molecule","atoms":[{"label":"C","location":[10.600299835205079,11.232000350952149,0.0]},{"label":"C","location":[10.665599822998047,9.749600410461426,0.0]},{"label":"C","location":[10.205100059509278,10.47189998626709,0.0]},{"label":"C","location":[11.521400451660157,9.787300109863282,0.0]},{"label":"C","location":[11.456100463867188,11.269599914550782,0.0]},{"label":"C","location":[11.91670036315918,10.547300338745118,0.0]},{"label":"C","location":[14.806600570678711,10.063600540161133,0.0]},{"label":"C","location":[14.63230037689209,11.53700065612793,0.0]},{"label":"C","location":[14.294099807739258,10.75,0.0]},{"label":"C","location":[15.482999801635743,11.637700080871582,0.0]},{"label":"C","location":[15.657299995422364,10.164199829101563,0.0]},{"label":"C","location":[15.995500564575196,10.951200485229493,0.0]},{"label":"C","location":[6.417099952697754,11.89780044555664,0.0]},{"label":"C","location":[7.782000541687012,11.31570053100586,0.0]},{"label":"C","location":[7.267600059509277,12.000800132751465,0.0]},{"label":"C","location":[7.445899963378906,10.527800559997559,0.0]},{"label":"C","location":[6.081200122833252,11.10990047454834,0.0]},{"label":"C","location":[6.5954999923706059,10.424799919128418,0.0]},{"label":"C","location":[6.314300537109375,12.748200416564942,0.0]},{"label":"C","location":[7.500699996948242,13.639100074768067,0.0]},{"label":"C","location":[7.164600372314453,12.851200103759766,0.0]},{"label":"C","location":[6.986400604248047,14.324199676513672,0.0]},{"label":"C","location":[5.799900054931641,13.433300018310547,0.0]},{"label":"C","location":[6.135900497436523,14.221200942993164,0.0]},{"label":"C","location":[7.219500541687012,15.96250057220459,0.0]},{"label":"C","location":[6.032900333404541,15.071599960327149,0.0]},{"label":"C","location":[6.883399963378906,15.174600601196289,0.0]},{"label":"C","location":[5.5186004638671879,15.75670051574707,0.0]},{"label":"C","location":[6.705100059509277,16.647600173950197,0.0]},{"label":"C","location":[5.854700088500977,16.544599533081056,0.0]},{"label":"C","location":[20.163799285888673,12.494300842285157,0.0]},{"label":"C","location":[18.81920051574707,13.121400833129883,0.0]},{"label":"C","location":[19.672500610351564,13.196000099182129,0.0]},{"label":"C","location":[18.45709991455078,12.345000267028809,0.0]},{"label":"C","location":[19.801799774169923,11.717900276184082,0.0]},{"label":"C","location":[18.948501586914064,11.643301010131836,0.0]},{"label":"C","location":[18.25320053100586,14.67650032043457,0.0]},{"label":"C","location":[19.597900390625,14.049400329589844,0.0]},{"label":"C","location":[18.74449920654297,13.974800109863282,0.0]},{"label":"C","location":[19.95989990234375,14.825700759887696,0.0]},{"label":"C","location":[18.61520004272461,15.452800750732422,0.0]},{"label":"C","location":[19.46860122680664,15.52750015258789,0.0]},{"label":"C","location":[18.049301147460939,17.00790023803711,0.0]},{"label":"C","location":[19.394001007080079,16.380901336669923,0.0]},{"label":"C","location":[18.54050064086914,16.30620002746582,0.0]},{"label":"C","location":[19.756000518798829,17.15730094909668,0.0]},{"label":"C","location":[18.411300659179689,17.784299850463868,0.0]},{"label":"C","location":[19.264699935913087,17.85900115966797,0.0]},{"label":"C","location":[9.548900604248047,17.375999450683595,0.0]},{"label":"C","location":[10.686200141906739,18.328899383544923,0.0]},{"label":"C","location":[9.842500686645508,18.180700302124025,0.0]},{"label":"C","location":[11.236400604248047,17.672300338745118,0.0]},{"label":"C","location":[10.099000930786133,16.71929931640625,0.0]},{"label":"C","location":[10.942700386047364,16.867401123046876,0.0]},{"label":"C","location":[14.052900314331055,18.704200744628908,0.0]},{"label":"C","location":[15.369100570678711,18.019399642944337,0.0]},{"label":"C","location":[14.908599853515625,18.74180030822754,0.0]},{"label":"C","location":[14.973800659179688,17.2593994140625,0.0]},{"label":"C","location":[13.657600402832032,17.94420051574707,0.0]},{"label":"C","location":[14.118000030517579,17.221799850463868,0.0]}],"bonds":[{"type":2,"atoms":[2,0]},{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,5]},{"type":1,"atoms":[5,3]},{"type":2,"atoms":[3,1]},{"type":1,"atoms":[1,2]},{"type":2,"atoms":[8,6]},{"type":1,"atoms":[6,10]},{"type":2,"atoms":[10,11]},{"type":1,"atoms":[11,9]},{"type":2,"atoms":[9,7]},{"type":1,"atoms":[7,8]},{"type":1,"atoms":[5,8]},{"type":2,"atoms":[14,12]},{"type":1,"atoms":[12,16]},{"type":2,"atoms":[16,17]},{"type":1,"atoms":[17,15]},{"type":2,"atoms":[15,13]},{"type":1,"atoms":[13,14]},{"type":1,"atoms":[13,2]},{"type":2,"atoms":[20,18]},{"type":1,"atoms":[18,22]},{"type":2,"atoms":[22,23]},{"type":1,"atoms":[23,21]},{"type":2,"atoms":[21,19]},{"type":1,"atoms":[19,20]},{"type":1,"atoms":[18,12]},{"type":1,"atoms":[20,14]},{"type":2,"atoms":[26,24]},{"type":1,"atoms":[24,28]},{"type":2,"atoms":[28,29]},{"type":1,"atoms":[29,27]},{"type":2,"atoms":[27,25]},{"type":1,"atoms":[25,26]},{"type":1,"atoms":[21,26]},{"type":1,"atoms":[23,25]},{"type":2,"atoms":[32,30]},{"type":1,"atoms":[30,34]},{"type":2,"atoms":[34,35]},{"type":1,"atoms":[35,33]},{"type":2,"atoms":[33,31]},{"type":1,"atoms":[31,32]},{"type":1,"atoms":[11,33]},{"type":2,"atoms":[38,36]},{"type":1,"atoms":[36,40]},{"type":2,"atoms":[40,41]},{"type":1,"atoms":[41,39]},{"type":2,"atoms":[39,37]},{"type":1,"atoms":[37,38]},{"type":2,"atoms":[44,42]},{"type":1,"atoms":[42,46]},{"type":2,"atoms":[46,47]},{"type":1,"atoms":[47,45]},{"type":2,"atoms":[45,43]},{"type":1,"atoms":[43,44]},{"type":1,"atoms":[38,31]},{"type":1,"atoms":[37,32]},{"type":1,"atoms":[44,40]},{"type":1,"atoms":[43,41]},{"type":2,"atoms":[50,48]},{"type":1,"atoms":[48,52]},{"type":2,"atoms":[52,53]},{"type":1,"atoms":[53,51]},{"type":2,"atoms":[51,49]},{"type":1,"atoms":[49,50]},{"type":2,"atoms":[56,54]},{"type":1,"atoms":[54,58]},{"type":2,"atoms":[58,59]},{"type":1,"atoms":[59,57]},{"type":2,"atoms":[57,55]},{"type":1,"atoms":[55,56]},{"type":1,"atoms":[24,48]},{"type":1,"atoms":[51,58]},{"type":1,"atoms":[55,42]}]},"mol3":{"type":"molecule","atoms":[{"label":"C","location":[0.00170135498046875,14.745601654052735,0.0]},{"label":"C","location":[1.7320013046264649,14.746101379394532,0.0]},{"label":"C","location":[0.8684015274047852,15.245701789855957,0.0]},{"label":"C","location":[1.7320013046264649,13.745201110839844,0.0]},{"label":"C","location":[0.00170135498046875,13.740701675415039,0.0]},{"label":"C","location":[0.8706011772155762,13.245701789855957,0.0]}],"bonds":[{"type":2,"atoms":[2,0]},{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,5]},{"type":1,"atoms":[5,3]},{"type":2,"atoms":[3,1]},{"type":1,"atoms":[1,2]}]},"mol4":{"type":"molecule","atoms":[{"label":"C","location":[10.470600128173829,22.792699813842775,0.0]},{"label":"C","location":[10.543401718139649,21.24180030822754,0.0]},{"label":"C","location":[10.059301376342774,21.996301651000978,0.0]},{"label":"C","location":[11.438800811767579,21.28390121459961,0.0]},{"label":"C","location":[11.36600112915039,22.834800720214845,0.0]},{"label":"C","location":[11.850101470947266,22.080400466918947,0.0]},{"label":"C","location":[14.785100936889649,21.580900192260743,0.0]},{"label":"C","location":[14.584701538085938,23.120500564575197,0.0]},{"label":"C","location":[14.240501403808594,22.292800903320314,0.0]},{"label":"C","location":[15.473701477050782,23.236101150512697,0.0]},{"label":"C","location":[15.674001693725586,21.696500778198243,0.0]},{"label":"C","location":[16.01820182800293,22.52410125732422,0.0]},{"label":"C","location":[6.136600494384766,23.415700912475587,0.0]},{"label":"C","location":[7.55940055847168,22.79400062561035,0.0]},{"label":"C","location":[7.027500152587891,23.515600204467775,0.0]},{"label":"C","location":[7.200401306152344,21.97260093688965,0.0]},{"label":"C","location":[5.777700424194336,22.594301223754884,0.0]},{"label":"C","location":[6.309600830078125,21.87270164489746,0.0]},{"label":"C","location":[6.036701202392578,24.306501388549806,0.0]},{"label":"C","location":[7.286500930786133,25.227800369262697,0.0]},{"label":"C","location":[6.927600860595703,24.406400680541993,0.0]},{"label":"C","location":[6.7545013427734379,25.94940185546875,0.0]},{"label":"C","location":[5.504800796508789,25.028100967407228,0.0]},{"label":"C","location":[5.863801956176758,25.84950065612793,0.0]},{"label":"C","location":[7.013601303100586,27.661602020263673,0.0]},{"label":"C","location":[5.7639007568359379,26.74030113220215,0.0]},{"label":"C","location":[6.654701232910156,26.840200424194337,0.0]},{"label":"C","location":[5.232000350952148,27.46190071105957,0.0]},{"label":"C","location":[6.481601715087891,28.383100509643556,0.0]},{"label":"C","location":[5.590801239013672,28.283201217651368,0.0]},{"label":"C","location":[20.163801193237306,24.19300079345703,0.0]},{"label":"C","location":[18.613901138305665,24.283599853515626,0.0]},{"label":"C","location":[19.415102005004884,24.685701370239259,0.0]},{"label":"C","location":[18.561601638793947,23.388700485229493,0.0]},{"label":"C","location":[20.111600875854493,23.2981014251709,0.0]},{"label":"C","location":[19.310401916503908,22.895999908447267,0.0]},{"label":"C","location":[17.463001251220704,25.577499389648439,0.0]},{"label":"C","location":[19.01300048828125,25.486801147460939,0.0]},{"label":"C","location":[18.211700439453126,25.084701538085939,0.0]},{"label":"C","location":[19.065200805664064,26.38170051574707,0.0]},{"label":"C","location":[17.515300750732423,26.472301483154298,0.0]},{"label":"C","location":[18.3164005279541,26.874500274658204,0.0]},{"label":"C","location":[16.364301681518556,27.76620101928711,0.0]},{"label":"C","location":[17.9143009185791,27.675601959228517,0.0]},{"label":"C","location":[17.113101959228517,27.273500442504884,0.0]},{"label":"C","location":[17.966501235961915,28.570499420166017,0.0]},{"label":"C","location":[16.416601181030275,28.661100387573243,0.0]},{"label":"C","location":[17.21780014038086,29.063201904296876,0.0]},{"label":"C","location":[9.332300186157227,28.723400115966798,0.0]},{"label":"C","location":[10.690900802612305,29.475000381469728,0.0]},{"label":"C","location":[9.794700622558594,29.49140167236328,0.0]},{"label":"C","location":[11.124801635742188,28.69070053100586,0.0]},{"label":"C","location":[9.766401290893555,27.939001083374025,0.0]},{"label":"C","location":[10.662601470947266,27.922700881958009,0.0]},{"label":"C","location":[13.593400955200196,28.912900924682618,0.0]},{"label":"C","location":[14.017601013183594,27.525800704956056,0.0]},{"label":"C","location":[14.309301376342774,28.37350082397461,0.0]},{"label":"C","location":[13.121301651000977,27.541400909423829,0.0]},{"label":"C","location":[12.859100341796875,28.398601531982423,0.0]}],"bonds":[{"type":2,"atoms":[2,0]},{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,5]},{"type":1,"atoms":[5,3]},{"type":2,"atoms":[3,1]},{"type":1,"atoms":[1,2]},{"type":2,"atoms":[8,6]},{"type":1,"atoms":[6,10]},{"type":2,"atoms":[10,11]},{"type":1,"atoms":[11,9]},{"type":2,"atoms":[9,7]},{"type":1,"atoms":[7,8]},{"type":1,"atoms":[5,8]},{"type":2,"atoms":[14,12]},{"type":1,"atoms":[12,16]},{"type":2,"atoms":[16,17]},{"type":1,"atoms":[17,15]},{"type":2,"atoms":[15,13]},{"type":1,"atoms":[13,14]},{"type":1,"atoms":[13,2]},{"type":2,"atoms":[20,18]},{"type":1,"atoms":[18,22]},{"type":2,"atoms":[22,23]},{"type":1,"atoms":[23,21]},{"type":2,"atoms":[21,19]},{"type":1,"atoms":[19,20]},{"type":1,"atoms":[18,12]},{"type":1,"atoms":[20,14]},{"type":2,"atoms":[26,24]},{"type":1,"atoms":[24,28]},{"type":2,"atoms":[28,29]},{"type":1,"atoms":[29,27]},{"type":2,"atoms":[27,25]},{"type":1,"atoms":[25,26]},{"type":1,"atoms":[21,26]},{"type":1,"atoms":[23,25]},{"type":2,"atoms":[32,30]},{"type":1,"atoms":[30,34]},{"type":2,"atoms":[34,35]},{"type":1,"atoms":[35,33]},{"type":2,"atoms":[33,31]},{"type":1,"atoms":[31,32]},{"type":1,"atoms":[11,33]},{"type":2,"atoms":[38,36]},{"type":1,"atoms":[36,40]},{"type":2,"atoms":[40,41]},{"type":1,"atoms":[41,39]},{"type":2,"atoms":[39,37]},{"type":1,"atoms":[37,38]},{"type":2,"atoms":[44,42]},{"type":1,"atoms":[42,46]},{"type":2,"atoms":[46,47]},{"type":1,"atoms":[47,45]},{"type":2,"atoms":[45,43]},{"type":1,"atoms":[43,44]},{"type":1,"atoms":[38,31]},{"type":1,"atoms":[37,32]},{"type":1,"atoms":[44,40]},{"type":1,"atoms":[43,41]},{"type":2,"atoms":[50,48]},{"type":1,"atoms":[48,52]},{"type":2,"atoms":[52,53]},{"type":1,"atoms":[53,51]},{"type":2,"atoms":[51,49]},{"type":1,"atoms":[49,50]},{"type":1,"atoms":[24,48]},{"type":1,"atoms":[54,58]},{"type":2,"atoms":[58,57]},{"type":1,"atoms":[57,55]},{"type":2,"atoms":[55,56]},{"type":1,"atoms":[56,54]},{"type":1,"atoms":[51,58]},{"type":1,"atoms":[56,46]}]},"mol5":{"type":"molecule","atoms":[{"label":"C","location":[0.8097000122070313,4.89484977722168,0.0]},{"label":"C","location":[1.3101005554199219,3.3547496795654299,0.0]},{"label":"C","location":[1.6194000244140626,4.3009490966796879,0.0]},{"label":"C","location":[0.3094005584716797,3.3547496795654299,0.0]},{"label":"C","location":[0.0,4.3009490966796879,0.0]}],"bonds":[{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,3]},{"type":1,"atoms":[3,1]},{"type":2,"atoms":[1,2]},{"type":1,"atoms":[2,0]}]},"mol6":{"type":"molecule","atoms":[{"label":"C","location":[23.676902770996095,13.813199996948243,0.0]},{"label":"C","location":[24.678203582763673,13.813199996948243,0.0]},{"label":"C","location":[24.177602767944337,14.678199768066407,0.0]}],"bonds":[{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[2,0]}]},"mol7":{"type":"molecule","atoms":[{"label":"C","location":[24.67820167541504,24.869050979614259,0.0]},{"label":"C","location":[24.674501419067384,25.864151000976564,0.0]},{"label":"C","location":[23.666301727294923,24.88195037841797,0.0]},{"label":"C","location":[23.663801193237306,25.864151000976564,0.0]}],"bonds":[{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,3]},{"type":1,"atoms":[3,2]},{"type":1,"atoms":[2,0]}]},"mol8":{"type":"molecule","atoms":[{"label":"C","location":[10.357999801635743,1.5508995056152344,0.0]},{"label":"C","location":[10.430801391601563,0.0,0.0]},{"label":"C","location":[9.946701049804688,0.7545013427734375,0.0]},{"label":"C","location":[11.326200485229493,0.04210090637207031,0.0]},{"label":"C","location":[11.253400802612305,1.5930004119873047,0.0]},{"label":"C","location":[11.73750114440918,0.8386001586914063,0.0]},{"label":"C","location":[14.672500610351563,0.3390998840332031,0.0]},{"label":"C","location":[14.472101211547852,1.8787002563476563,0.0]},{"label":"C","location":[14.127901077270508,1.0510005950927735,0.0]},{"label":"C","location":[15.361101150512696,1.9943008422851563,0.0]},{"label":"C","location":[15.5614013671875,0.4547004699707031,0.0]},{"label":"C","location":[15.905601501464844,1.2823009490966797,0.0]},{"label":"C","location":[6.02400016784668,2.173900604248047,0.0]},{"label":"C","location":[7.446800231933594,1.5522003173828126,0.0]},{"label":"C","location":[6.914899826049805,2.2737998962402345,0.0]},{"label":"C","location":[7.087800979614258,0.7308006286621094,0.0]},{"label":"C","location":[5.66510009765625,1.3525009155273438,0.0]},{"label":"C","location":[6.197000503540039,0.6309013366699219,0.0]},{"label":"C","location":[5.924100875854492,3.0647010803222658,0.0]},{"label":"C","location":[7.173900604248047,3.9860000610351564,0.0]},{"label":"C","location":[6.815000534057617,3.164600372314453,0.0]},{"label":"C","location":[6.641901016235352,4.7076005935668949,0.0]},{"label":"C","location":[5.392200469970703,3.7863006591796877,0.0]},{"label":"C","location":[5.751201629638672,4.607700347900391,0.0]},{"label":"C","location":[6.9010009765625,6.419800758361816,0.0]},{"label":"C","location":[5.651300430297852,5.498500823974609,0.0]},{"label":"C","location":[6.54210090637207,5.598400115966797,0.0]},{"label":"C","location":[5.1194000244140629,6.220100402832031,0.0]},{"label":"C","location":[6.369001388549805,7.141300201416016,0.0]},{"label":"C","location":[5.478200912475586,7.041400909423828,0.0]},{"label":"C","location":[20.05120086669922,2.951200485229492,0.0]},{"label":"C","location":[18.501300811767579,3.041799545288086,0.0]},{"label":"C","location":[19.302501678466798,3.4439010620117189,0.0]},{"label":"C","location":[18.44900131225586,2.146900177001953,0.0]},{"label":"C","location":[19.999000549316408,2.0563011169433595,0.0]},{"label":"C","location":[19.19780158996582,1.6541996002197266,0.0]},{"label":"C","location":[17.350400924682618,4.335700035095215,0.0]},{"label":"C","location":[18.900400161743165,4.245000839233398,0.0]},{"label":"C","location":[18.09910011291504,3.842900276184082,0.0]},{"label":"C","location":[18.952600479125978,5.139900207519531,0.0]},{"label":"C","location":[17.402700424194337,5.230500221252441,0.0]},{"label":"C","location":[18.203800201416017,5.632699966430664,0.0]},{"label":"C","location":[16.25170135498047,6.52440071105957,0.0]},{"label":"C","location":[17.801700592041017,6.43380069732666,0.0]},{"label":"C","location":[17.00050163269043,6.031700134277344,0.0]},{"label":"C","location":[17.853900909423829,7.328700065612793,0.0]},{"label":"C","location":[16.304000854492189,7.419300079345703,0.0]},{"label":"C","location":[17.105199813842775,7.8214006423950199,0.0]},{"label":"C","location":[9.21969985961914,7.481600761413574,0.0]},{"label":"C","location":[10.578300476074219,8.233200073242188,0.0]},{"label":"C","location":[9.682100296020508,8.249600410461426,0.0]},{"label":"C","location":[11.012201309204102,7.44890022277832,0.0]},{"label":"C","location":[9.653800964355469,6.697200775146484,0.0]},{"label":"C","location":[10.55000114440918,6.680900573730469,0.0]},{"label":"C","location":[13.48080062866211,7.671100616455078,0.0]},{"label":"C","location":[13.905000686645508,6.284000396728516,0.0]},{"label":"C","location":[14.196701049804688,7.13170051574707,0.0]},{"label":"C","location":[13.00870132446289,6.299600601196289,0.0]},{"label":"C","location":[12.746500015258789,7.156800270080566,0.0]}],"bonds":[{"type":2,"atoms":[2,0]},{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,5]},{"type":1,"atoms":[5,3]},{"type":2,"atoms":[3,1]},{"type":1,"atoms":[1,2]},{"type":2,"atoms":[8,6]},{"type":1,"atoms":[6,10]},{"type":2,"atoms":[10,11]},{"type":1,"atoms":[11,9]},{"type":2,"atoms":[9,7]},{"type":1,"atoms":[7,8]},{"type":1,"atoms":[5,8]},{"type":2,"atoms":[14,12]},{"type":1,"atoms":[12,16]},{"type":2,"atoms":[16,17]},{"type":1,"atoms":[17,15]},{"type":2,"atoms":[15,13]},{"type":1,"atoms":[13,14]},{"type":1,"atoms":[13,2]},{"type":2,"atoms":[20,18]},{"type":1,"atoms":[18,22]},{"type":2,"atoms":[22,23]},{"type":1,"atoms":[23,21]},{"type":2,"atoms":[21,19]},{"type":1,"atoms":[19,20]},{"type":1,"atoms":[18,12]},{"type":1,"atoms":[20,14]},{"type":2,"atoms":[26,24]},{"type":1,"atoms":[24,28]},{"type":2,"atoms":[28,29]},{"type":1,"atoms":[29,27]},{"type":2,"atoms":[27,25]},{"type":1,"atoms":[25,26]},{"type":1,"atoms":[21,26]},{"type":1,"atoms":[23,25]},{"type":2,"atoms":[32,30]},{"type":1,"atoms":[30,34]},{"type":2,"atoms":[34,35]},{"type":1,"atoms":[35,33]},{"type":2,"atoms":[33,31]},{"type":1,"atoms":[31,32]},{"type":1,"atoms":[11,33]},{"type":2,"atoms":[38,36]},{"type":1,"atoms":[36,40]},{"type":2,"atoms":[40,41]},{"type":1,"atoms":[41,39]},{"type":2,"atoms":[39,37]},{"type":1,"atoms":[37,38]},{"type":2,"atoms":[44,42]},{"type":1,"atoms":[42,46]},{"type":2,"atoms":[46,47]},{"type":1,"atoms":[47,45]},{"type":2,"atoms":[45,43]},{"type":1,"atoms":[43,44]},{"type":1,"atoms":[38,31]},{"type":1,"atoms":[37,32]},{"type":1,"atoms":[44,40]},{"type":1,"atoms":[43,41]},{"type":2,"atoms":[50,48]},{"type":1,"atoms":[48,52]},{"type":2,"atoms":[52,53]},{"type":1,"atoms":[53,51]},{"type":2,"atoms":[51,49]},{"type":1,"atoms":[49,50]},{"type":1,"atoms":[24,48]},{"type":1,"atoms":[54,58]},{"type":2,"atoms":[58,57]},{"type":1,"atoms":[57,55]},{"type":2,"atoms":[55,56]},{"type":1,"atoms":[56,54]},{"type":1,"atoms":[51,58]},{"type":1,"atoms":[56,46]}]},"mol9":{"type":"molecule","atoms":[{"label":"C","location":[28.17820167541504,19.304950714111329,0.0]},{"label":"C","location":[28.178401947021486,20.307449340820314,0.0]},{"label":"C","location":[28.883602142333986,21.012649536132814,0.0]},{"label":"C","location":[28.88380241394043,18.59954833984375,0.0]},{"label":"C","location":[29.886201858520509,18.59954833984375,0.0]},{"label":"C","location":[30.591602325439454,19.304950714111329,0.0]},{"label":"C","location":[30.591503143310548,20.307449340820314,0.0]},{"label":"C","location":[29.886201858520509,21.01274871826172,0.0]}],"bonds":[{"type":1,"atoms":[1,0]},{"type":1,"atoms":[0,3]},{"type":1,"atoms":[3,4]},{"type":1,"atoms":[4,5]},{"type":1,"atoms":[5,6]},{"type":1,"atoms":[6,7]},{"type":1,"atoms":[7,2]},{"type":1,"atoms":[2,1]}]}} \ No newline at end of file diff --git a/api/tests/integration/tests/formats/reactions/pathway9.ket b/api/tests/integration/tests/formats/reactions/pathway9.ket new file mode 100644 index 0000000000..2400b7e8c4 --- /dev/null +++ b/api/tests/integration/tests/formats/reactions/pathway9.ket @@ -0,0 +1 @@ +{"root":{"nodes":[{"$ref":"mol0"},{"$ref":"mol1"},{"$ref":"mol2"},{"$ref":"mol3"},{"$ref":"mol4"},{"$ref":"mol5"},{"$ref":"mol6"},{"$ref":"mol7"},{"$ref":"mol8"},{"$ref":"mol9"},{"$ref":"mol10"},{"$ref":"mol11"},{"$ref":"mol12"},{"$ref":"mol13"},{"$ref":"mol14"},{"$ref":"mol15"},{"type":"arrow","data":{"mode":"open-angle","pos":[{"x":2.6194000244140627,"y":4.124800205230713,"z":0.0},{"x":4.1194000244140629,"y":4.124800205230713,"z":0.0}]}},{"type":"multi-tailed-arrow","data":{"head":{"position":{"x":27.17820167541504,"y":19.806150436401368,"z":0.0}},"spine":{"pos":[{"x":26.17820167541504,"y":25.366600036621095,"z":0.0},{"x":26.17820167541504,"y":14.245699882507325,"z":0.0}]},"tails":{"pos":[{"x":25.67820167541504,"y":25.366600036621095,"z":0.0},{"x":25.67820167541504,"y":14.245699882507325,"z":0.0}]},"zOrder":0}},{"type":"arrow","data":{"mode":"open-angle","pos":[{"x":21.163801193237306,"y":14.24570083618164,"z":0.0},{"x":22.676902770996095,"y":14.245699882507325,"z":0.0}]}},{"type":"arrow","data":{"mode":"open-angle","pos":[{"x":2.7320003509521486,"y":14.24570083618164,"z":0.0},{"x":4.5186004638671879,"y":14.24570083618164,"z":0.0}]}},{"type":"arrow","data":{"mode":"open-angle","pos":[{"x":21.163801193237306,"y":25.366600036621095,"z":0.0},{"x":22.663801193237306,"y":25.366600036621095,"z":0.0}]}},{"type":"multi-tailed-arrow","data":{"head":{"position":{"x":4.232000350952148,"y":25.366600036621095,"z":0.0}},"spine":{"pos":[{"x":3.2320003509521486,"y":27.498849868774415,"z":0.0},{"x":3.2320003509521486,"y":23.234352111816408,"z":0.0}]},"tails":{"pos":[{"x":2.7320003509521486,"y":27.498849868774415,"z":0.0},{"x":2.7320003509521486,"y":23.234352111816408,"z":0.0}]},"zOrder":0}},{"type":"multi-tailed-arrow","data":{"head":{"position":{"x":10.887200355529786,"y":37.020423889160159,"z":0.0}},"spine":{"pos":[{"x":9.887200355529786,"y":41.77939987182617,"z":0.0},{"x":9.887200355529786,"y":32.26144790649414,"z":0.0}]},"tails":{"pos":[{"x":9.387200355529786,"y":41.77939987182617,"z":0.0},{"x":9.387200355529786,"y":37.15544891357422,"z":0.0},{"x":9.387200355529786,"y":32.26144790649414,"z":0.0}]},"zOrder":0}},{"type":"multi-tailed-arrow","data":{"head":{"position":{"x":4.789100646972656,"y":41.77939987182617,"z":0.0}},"spine":{"pos":[{"x":3.230299949645996,"y":43.91444778442383,"z":0.0},{"x":3.230299949645996,"y":39.64434814453125,"z":0.0}]},"tails":{"pos":[{"x":2.730299949645996,"y":43.91444778442383,"z":0.0},{"x":2.730299949645996,"y":39.64434814453125,"z":0.0}]},"zOrder":0}}]},"mol0":{"type":"molecule","atoms":[{"label":"C","location":[0.9282002449035645,23.998802185058595,0.0]},{"label":"C","location":[1.4250001907348633,22.46990394592285,0.0]},{"label":"C","location":[1.7320001125335694,23.409202575683595,0.0]},{"label":"C","location":[0.4315004348754883,22.46990394592285,0.0]},{"label":"C","location":[0.12430000305175781,23.409202575683595,0.0]}],"bonds":[{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,3]},{"type":1,"atoms":[3,1]},{"type":2,"atoms":[1,2]},{"type":1,"atoms":[2,0]}]},"mol1":{"type":"molecule","atoms":[{"label":"C","location":[0.0,27.99880027770996,0.0]},{"label":"C","location":[0.0,26.99880027770996,0.0]},{"label":"C","location":[0.8659999966621399,26.49880027770996,0.0]},{"label":"C","location":[1.7320001125335694,26.99880027770996,0.0]},{"label":"C","location":[1.7320001125335694,27.99880027770996,0.0]},{"label":"C","location":[0.8659999966621399,28.498899459838868,0.0]}],"bonds":[{"type":1,"atoms":[5,0]},{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[2,3]},{"type":1,"atoms":[3,4]},{"type":1,"atoms":[4,5]}]},"mol2":{"type":"molecule","atoms":[{"label":"C","location":[10.600299835205079,11.232000350952149,0.0]},{"label":"C","location":[10.665599822998047,9.749600410461426,0.0]},{"label":"C","location":[10.205100059509278,10.47189998626709,0.0]},{"label":"C","location":[11.521400451660157,9.787300109863282,0.0]},{"label":"C","location":[11.456100463867188,11.269599914550782,0.0]},{"label":"C","location":[11.91670036315918,10.547300338745118,0.0]},{"label":"C","location":[14.806600570678711,10.063600540161133,0.0]},{"label":"C","location":[14.63230037689209,11.53700065612793,0.0]},{"label":"C","location":[14.294099807739258,10.75,0.0]},{"label":"C","location":[15.482999801635743,11.637700080871582,0.0]},{"label":"C","location":[15.657299995422364,10.164199829101563,0.0]},{"label":"C","location":[15.995500564575196,10.951200485229493,0.0]},{"label":"C","location":[6.417099952697754,11.89780044555664,0.0]},{"label":"C","location":[7.782000541687012,11.31570053100586,0.0]},{"label":"C","location":[7.267600059509277,12.000800132751465,0.0]},{"label":"C","location":[7.445899963378906,10.527800559997559,0.0]},{"label":"C","location":[6.081200122833252,11.10990047454834,0.0]},{"label":"C","location":[6.5954999923706059,10.424799919128418,0.0]},{"label":"C","location":[6.314300537109375,12.748200416564942,0.0]},{"label":"C","location":[7.500699996948242,13.639100074768067,0.0]},{"label":"C","location":[7.164600372314453,12.851200103759766,0.0]},{"label":"C","location":[6.986400604248047,14.324199676513672,0.0]},{"label":"C","location":[5.799900054931641,13.433300018310547,0.0]},{"label":"C","location":[6.135900497436523,14.221200942993164,0.0]},{"label":"C","location":[7.219500541687012,15.96250057220459,0.0]},{"label":"C","location":[6.032900333404541,15.071599960327149,0.0]},{"label":"C","location":[6.883399963378906,15.174600601196289,0.0]},{"label":"C","location":[5.5186004638671879,15.75670051574707,0.0]},{"label":"C","location":[6.705100059509277,16.647600173950197,0.0]},{"label":"C","location":[5.854700088500977,16.544599533081056,0.0]},{"label":"C","location":[20.163799285888673,12.494300842285157,0.0]},{"label":"C","location":[18.81920051574707,13.121400833129883,0.0]},{"label":"C","location":[19.672500610351564,13.196000099182129,0.0]},{"label":"C","location":[18.45709991455078,12.345000267028809,0.0]},{"label":"C","location":[19.801799774169923,11.717900276184082,0.0]},{"label":"C","location":[18.948501586914064,11.643301010131836,0.0]},{"label":"C","location":[18.25320053100586,14.67650032043457,0.0]},{"label":"C","location":[19.597900390625,14.049400329589844,0.0]},{"label":"C","location":[18.74449920654297,13.974800109863282,0.0]},{"label":"C","location":[19.95989990234375,14.825700759887696,0.0]},{"label":"C","location":[18.61520004272461,15.452800750732422,0.0]},{"label":"C","location":[19.46860122680664,15.52750015258789,0.0]},{"label":"C","location":[18.049301147460939,17.00790023803711,0.0]},{"label":"C","location":[19.394001007080079,16.380901336669923,0.0]},{"label":"C","location":[18.54050064086914,16.30620002746582,0.0]},{"label":"C","location":[19.756000518798829,17.15730094909668,0.0]},{"label":"C","location":[18.411300659179689,17.784299850463868,0.0]},{"label":"C","location":[19.264699935913087,17.85900115966797,0.0]},{"label":"C","location":[9.548900604248047,17.375999450683595,0.0]},{"label":"C","location":[10.686200141906739,18.328899383544923,0.0]},{"label":"C","location":[9.842500686645508,18.180700302124025,0.0]},{"label":"C","location":[11.236400604248047,17.672300338745118,0.0]},{"label":"C","location":[10.099000930786133,16.71929931640625,0.0]},{"label":"C","location":[10.942700386047364,16.867401123046876,0.0]},{"label":"C","location":[14.052900314331055,18.704200744628908,0.0]},{"label":"C","location":[15.369100570678711,18.019399642944337,0.0]},{"label":"C","location":[14.908599853515625,18.74180030822754,0.0]},{"label":"C","location":[14.973800659179688,17.2593994140625,0.0]},{"label":"C","location":[13.657600402832032,17.94420051574707,0.0]},{"label":"C","location":[14.118000030517579,17.221799850463868,0.0]}],"bonds":[{"type":2,"atoms":[2,0]},{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,5]},{"type":1,"atoms":[5,3]},{"type":2,"atoms":[3,1]},{"type":1,"atoms":[1,2]},{"type":2,"atoms":[8,6]},{"type":1,"atoms":[6,10]},{"type":2,"atoms":[10,11]},{"type":1,"atoms":[11,9]},{"type":2,"atoms":[9,7]},{"type":1,"atoms":[7,8]},{"type":1,"atoms":[5,8]},{"type":2,"atoms":[14,12]},{"type":1,"atoms":[12,16]},{"type":2,"atoms":[16,17]},{"type":1,"atoms":[17,15]},{"type":2,"atoms":[15,13]},{"type":1,"atoms":[13,14]},{"type":1,"atoms":[13,2]},{"type":2,"atoms":[20,18]},{"type":1,"atoms":[18,22]},{"type":2,"atoms":[22,23]},{"type":1,"atoms":[23,21]},{"type":2,"atoms":[21,19]},{"type":1,"atoms":[19,20]},{"type":1,"atoms":[18,12]},{"type":1,"atoms":[20,14]},{"type":2,"atoms":[26,24]},{"type":1,"atoms":[24,28]},{"type":2,"atoms":[28,29]},{"type":1,"atoms":[29,27]},{"type":2,"atoms":[27,25]},{"type":1,"atoms":[25,26]},{"type":1,"atoms":[21,26]},{"type":1,"atoms":[23,25]},{"type":2,"atoms":[32,30]},{"type":1,"atoms":[30,34]},{"type":2,"atoms":[34,35]},{"type":1,"atoms":[35,33]},{"type":2,"atoms":[33,31]},{"type":1,"atoms":[31,32]},{"type":1,"atoms":[11,33]},{"type":2,"atoms":[38,36]},{"type":1,"atoms":[36,40]},{"type":2,"atoms":[40,41]},{"type":1,"atoms":[41,39]},{"type":2,"atoms":[39,37]},{"type":1,"atoms":[37,38]},{"type":2,"atoms":[44,42]},{"type":1,"atoms":[42,46]},{"type":2,"atoms":[46,47]},{"type":1,"atoms":[47,45]},{"type":2,"atoms":[45,43]},{"type":1,"atoms":[43,44]},{"type":1,"atoms":[38,31]},{"type":1,"atoms":[37,32]},{"type":1,"atoms":[44,40]},{"type":1,"atoms":[43,41]},{"type":2,"atoms":[50,48]},{"type":1,"atoms":[48,52]},{"type":2,"atoms":[52,53]},{"type":1,"atoms":[53,51]},{"type":2,"atoms":[51,49]},{"type":1,"atoms":[49,50]},{"type":2,"atoms":[56,54]},{"type":1,"atoms":[54,58]},{"type":2,"atoms":[58,59]},{"type":1,"atoms":[59,57]},{"type":2,"atoms":[57,55]},{"type":1,"atoms":[55,56]},{"type":1,"atoms":[24,48]},{"type":1,"atoms":[51,58]},{"type":1,"atoms":[55,42]}]},"mol3":{"type":"molecule","atoms":[{"label":"C","location":[0.00170135498046875,14.745601654052735,0.0]},{"label":"C","location":[1.7320013046264649,14.746101379394532,0.0]},{"label":"C","location":[0.8684015274047852,15.245701789855957,0.0]},{"label":"C","location":[1.7320013046264649,13.745201110839844,0.0]},{"label":"C","location":[0.00170135498046875,13.740701675415039,0.0]},{"label":"C","location":[0.8706011772155762,13.245701789855957,0.0]}],"bonds":[{"type":2,"atoms":[2,0]},{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,5]},{"type":1,"atoms":[5,3]},{"type":2,"atoms":[3,1]},{"type":1,"atoms":[1,2]}]},"mol4":{"type":"molecule","atoms":[{"label":"C","location":[10.470600128173829,22.792699813842775,0.0]},{"label":"C","location":[10.543401718139649,21.24180030822754,0.0]},{"label":"C","location":[10.059301376342774,21.996301651000978,0.0]},{"label":"C","location":[11.438800811767579,21.28390121459961,0.0]},{"label":"C","location":[11.36600112915039,22.834800720214845,0.0]},{"label":"C","location":[11.850101470947266,22.080400466918947,0.0]},{"label":"C","location":[14.785100936889649,21.580900192260743,0.0]},{"label":"C","location":[14.584701538085938,23.120500564575197,0.0]},{"label":"C","location":[14.240501403808594,22.292800903320314,0.0]},{"label":"C","location":[15.473701477050782,23.236101150512697,0.0]},{"label":"C","location":[15.674001693725586,21.696500778198243,0.0]},{"label":"C","location":[16.01820182800293,22.52410125732422,0.0]},{"label":"C","location":[6.136600494384766,23.415700912475587,0.0]},{"label":"C","location":[7.55940055847168,22.79400062561035,0.0]},{"label":"C","location":[7.027500152587891,23.515600204467775,0.0]},{"label":"C","location":[7.200401306152344,21.97260093688965,0.0]},{"label":"C","location":[5.777700424194336,22.594301223754884,0.0]},{"label":"C","location":[6.309600830078125,21.87270164489746,0.0]},{"label":"C","location":[6.036701202392578,24.306501388549806,0.0]},{"label":"C","location":[7.286500930786133,25.227800369262697,0.0]},{"label":"C","location":[6.927600860595703,24.406400680541993,0.0]},{"label":"C","location":[6.7545013427734379,25.94940185546875,0.0]},{"label":"C","location":[5.504800796508789,25.028100967407228,0.0]},{"label":"C","location":[5.863801956176758,25.84950065612793,0.0]},{"label":"C","location":[7.013601303100586,27.661602020263673,0.0]},{"label":"C","location":[5.7639007568359379,26.74030113220215,0.0]},{"label":"C","location":[6.654701232910156,26.840200424194337,0.0]},{"label":"C","location":[5.232000350952148,27.46190071105957,0.0]},{"label":"C","location":[6.481601715087891,28.383100509643556,0.0]},{"label":"C","location":[5.590801239013672,28.283201217651368,0.0]},{"label":"C","location":[20.163801193237306,24.19300079345703,0.0]},{"label":"C","location":[18.613901138305665,24.283599853515626,0.0]},{"label":"C","location":[19.415102005004884,24.685701370239259,0.0]},{"label":"C","location":[18.561601638793947,23.388700485229493,0.0]},{"label":"C","location":[20.111600875854493,23.2981014251709,0.0]},{"label":"C","location":[19.310401916503908,22.895999908447267,0.0]},{"label":"C","location":[17.463001251220704,25.577499389648439,0.0]},{"label":"C","location":[19.01300048828125,25.486801147460939,0.0]},{"label":"C","location":[18.211700439453126,25.084701538085939,0.0]},{"label":"C","location":[19.065200805664064,26.38170051574707,0.0]},{"label":"C","location":[17.515300750732423,26.472301483154298,0.0]},{"label":"C","location":[18.3164005279541,26.874500274658204,0.0]},{"label":"C","location":[16.364301681518556,27.76620101928711,0.0]},{"label":"C","location":[17.9143009185791,27.675601959228517,0.0]},{"label":"C","location":[17.113101959228517,27.273500442504884,0.0]},{"label":"C","location":[17.966501235961915,28.570499420166017,0.0]},{"label":"C","location":[16.416601181030275,28.661100387573243,0.0]},{"label":"C","location":[17.21780014038086,29.063201904296876,0.0]},{"label":"C","location":[9.332300186157227,28.723400115966798,0.0]},{"label":"C","location":[10.690900802612305,29.475000381469728,0.0]},{"label":"C","location":[9.794700622558594,29.49140167236328,0.0]},{"label":"C","location":[11.124801635742188,28.69070053100586,0.0]},{"label":"C","location":[9.766401290893555,27.939001083374025,0.0]},{"label":"C","location":[10.662601470947266,27.922700881958009,0.0]},{"label":"C","location":[13.593400955200196,28.912900924682618,0.0]},{"label":"C","location":[14.017601013183594,27.525800704956056,0.0]},{"label":"C","location":[14.309301376342774,28.37350082397461,0.0]},{"label":"C","location":[13.121301651000977,27.541400909423829,0.0]},{"label":"C","location":[12.859100341796875,28.398601531982423,0.0]}],"bonds":[{"type":2,"atoms":[2,0]},{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,5]},{"type":1,"atoms":[5,3]},{"type":2,"atoms":[3,1]},{"type":1,"atoms":[1,2]},{"type":2,"atoms":[8,6]},{"type":1,"atoms":[6,10]},{"type":2,"atoms":[10,11]},{"type":1,"atoms":[11,9]},{"type":2,"atoms":[9,7]},{"type":1,"atoms":[7,8]},{"type":1,"atoms":[5,8]},{"type":2,"atoms":[14,12]},{"type":1,"atoms":[12,16]},{"type":2,"atoms":[16,17]},{"type":1,"atoms":[17,15]},{"type":2,"atoms":[15,13]},{"type":1,"atoms":[13,14]},{"type":1,"atoms":[13,2]},{"type":2,"atoms":[20,18]},{"type":1,"atoms":[18,22]},{"type":2,"atoms":[22,23]},{"type":1,"atoms":[23,21]},{"type":2,"atoms":[21,19]},{"type":1,"atoms":[19,20]},{"type":1,"atoms":[18,12]},{"type":1,"atoms":[20,14]},{"type":2,"atoms":[26,24]},{"type":1,"atoms":[24,28]},{"type":2,"atoms":[28,29]},{"type":1,"atoms":[29,27]},{"type":2,"atoms":[27,25]},{"type":1,"atoms":[25,26]},{"type":1,"atoms":[21,26]},{"type":1,"atoms":[23,25]},{"type":2,"atoms":[32,30]},{"type":1,"atoms":[30,34]},{"type":2,"atoms":[34,35]},{"type":1,"atoms":[35,33]},{"type":2,"atoms":[33,31]},{"type":1,"atoms":[31,32]},{"type":1,"atoms":[11,33]},{"type":2,"atoms":[38,36]},{"type":1,"atoms":[36,40]},{"type":2,"atoms":[40,41]},{"type":1,"atoms":[41,39]},{"type":2,"atoms":[39,37]},{"type":1,"atoms":[37,38]},{"type":2,"atoms":[44,42]},{"type":1,"atoms":[42,46]},{"type":2,"atoms":[46,47]},{"type":1,"atoms":[47,45]},{"type":2,"atoms":[45,43]},{"type":1,"atoms":[43,44]},{"type":1,"atoms":[38,31]},{"type":1,"atoms":[37,32]},{"type":1,"atoms":[44,40]},{"type":1,"atoms":[43,41]},{"type":2,"atoms":[50,48]},{"type":1,"atoms":[48,52]},{"type":2,"atoms":[52,53]},{"type":1,"atoms":[53,51]},{"type":2,"atoms":[51,49]},{"type":1,"atoms":[49,50]},{"type":1,"atoms":[24,48]},{"type":1,"atoms":[54,58]},{"type":2,"atoms":[58,57]},{"type":1,"atoms":[57,55]},{"type":2,"atoms":[55,56]},{"type":1,"atoms":[56,54]},{"type":1,"atoms":[51,58]},{"type":1,"atoms":[56,46]}]},"mol5":{"type":"molecule","atoms":[{"label":"C","location":[0.8097000122070313,4.89484977722168,0.0]},{"label":"C","location":[1.3101005554199219,3.3547496795654299,0.0]},{"label":"C","location":[1.6194000244140626,4.3009490966796879,0.0]},{"label":"C","location":[0.3094005584716797,3.3547496795654299,0.0]},{"label":"C","location":[0.0,4.3009490966796879,0.0]}],"bonds":[{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,3]},{"type":1,"atoms":[3,1]},{"type":2,"atoms":[1,2]},{"type":1,"atoms":[2,0]}]},"mol6":{"type":"molecule","atoms":[{"label":"C","location":[23.676902770996095,13.813199996948243,0.0]},{"label":"C","location":[24.678203582763673,13.813199996948243,0.0]},{"label":"C","location":[24.177602767944337,14.678199768066407,0.0]}],"bonds":[{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[2,0]}]},"mol7":{"type":"molecule","atoms":[{"label":"C","location":[24.67820167541504,24.869050979614259,0.0]},{"label":"C","location":[24.674501419067384,25.864151000976564,0.0]},{"label":"C","location":[23.666301727294923,24.88195037841797,0.0]},{"label":"C","location":[23.663801193237306,25.864151000976564,0.0]}],"bonds":[{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,3]},{"type":1,"atoms":[3,2]},{"type":1,"atoms":[2,0]}]},"mol8":{"type":"molecule","atoms":[{"label":"C","location":[0.0,40.1442985534668,0.0]},{"label":"C","location":[1.730299949645996,40.144798278808597,0.0]},{"label":"C","location":[0.8668000102043152,40.64440155029297,0.0]},{"label":"C","location":[1.730299949645996,39.143798828125,0.0]},{"label":"C","location":[0.0,39.13929748535156,0.0]},{"label":"C","location":[0.8690000176429749,38.6442985534668,0.0]}],"bonds":[{"type":2,"atoms":[2,0]},{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,5]},{"type":1,"atoms":[5,3]},{"type":2,"atoms":[3,1]},{"type":1,"atoms":[1,2]}]},"mol9":{"type":"molecule","atoms":[{"label":"C","location":[0.9205999374389648,44.68449783325195,0.0]},{"label":"C","location":[1.4210000038146973,43.1443977355957,0.0]},{"label":"C","location":[1.730299949645996,44.0906982421875,0.0]},{"label":"C","location":[0.4203000068664551,43.1443977355957,0.0]},{"label":"C","location":[0.1108999252319336,44.0906982421875,0.0]}],"bonds":[{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,3]},{"type":1,"atoms":[3,1]},{"type":2,"atoms":[1,2]},{"type":1,"atoms":[2,0]}]},"mol10":{"type":"molecule","atoms":[{"label":"C","location":[5.789100646972656,42.27939987182617,0.0]},{"label":"C","location":[5.789100646972656,41.27939987182617,0.0]},{"label":"C","location":[6.6551008224487309,40.77939987182617,0.0]},{"label":"C","location":[7.521200180053711,41.27939987182617,0.0]},{"label":"C","location":[7.521200180053711,42.27939987182617,0.0]},{"label":"C","location":[6.6551008224487309,42.77939987182617,0.0]},{"label":"C","location":[8.387200355529786,42.77939987182617,0.0]}],"bonds":[{"type":1,"atoms":[5,0]},{"type":1,"atoms":[0,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[2,3]},{"type":1,"atoms":[3,4]},{"type":1,"atoms":[4,5]},{"type":1,"atoms":[4,6]}]},"mol11":{"type":"molecule","atoms":[{"label":"C","location":[7.387200355529785,32.531497955322269,0.0]},{"label":"C","location":[7.887600898742676,30.991397857666017,0.0]},{"label":"C","location":[8.19680118560791,31.937698364257814,0.0]},{"label":"C","location":[6.8867998123168949,30.991397857666017,0.0]},{"label":"C","location":[6.577500343322754,31.937698364257814,0.0]},{"label":"C","location":[7.387200355529785,33.531497955322269,0.0]},{"label":"C","location":[8.387200355529786,33.531497955322269,0.0]}],"bonds":[{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,3]},{"type":1,"atoms":[3,1]},{"type":2,"atoms":[1,2]},{"type":1,"atoms":[2,0]},{"type":2,"atoms":[0,5]},{"type":1,"atoms":[5,6]}]},"mol12":{"type":"molecule","atoms":[{"label":"C","location":[6.196199893951416,37.661895751953128,0.0]},{"label":"C","location":[6.980099678039551,38.279396057128909,0.0]},{"label":"C","location":[7.953099727630615,38.0568962097168,0.0]},{"label":"C","location":[8.387199401855469,37.161094665527347,0.0]},{"label":"C","location":[6.201699733734131,36.65469741821289,0.0]},{"label":"C","location":[7.953799724578857,36.253997802734378,0.0]},{"label":"C","location":[6.980099678039551,36.031497955322269,0.0]},{"label":"C","location":[5.230299949645996,37.92069625854492,0.0]}],"bonds":[{"type":1,"atoms":[1,0]},{"type":1,"atoms":[0,4]},{"type":1,"atoms":[4,6]},{"type":1,"atoms":[6,5]},{"type":1,"atoms":[5,3]},{"type":1,"atoms":[3,2]},{"type":1,"atoms":[2,1]},{"type":1,"atoms":[0,7]}]},"mol13":{"type":"molecule","atoms":[{"label":"C","location":[10.357999801635743,1.5508995056152344,0.0]},{"label":"C","location":[10.430801391601563,0.0,0.0]},{"label":"C","location":[9.946701049804688,0.7545013427734375,0.0]},{"label":"C","location":[11.326200485229493,0.04210090637207031,0.0]},{"label":"C","location":[11.253400802612305,1.5930004119873047,0.0]},{"label":"C","location":[11.73750114440918,0.8386001586914063,0.0]},{"label":"C","location":[14.672500610351563,0.3390998840332031,0.0]},{"label":"C","location":[14.472101211547852,1.8787002563476563,0.0]},{"label":"C","location":[14.127901077270508,1.0510005950927735,0.0]},{"label":"C","location":[15.361101150512696,1.9943008422851563,0.0]},{"label":"C","location":[15.5614013671875,0.4547004699707031,0.0]},{"label":"C","location":[15.905601501464844,1.2823009490966797,0.0]},{"label":"C","location":[6.02400016784668,2.173900604248047,0.0]},{"label":"C","location":[7.446800231933594,1.5522003173828126,0.0]},{"label":"C","location":[6.914899826049805,2.2737998962402345,0.0]},{"label":"C","location":[7.087800979614258,0.7308006286621094,0.0]},{"label":"C","location":[5.66510009765625,1.3525009155273438,0.0]},{"label":"C","location":[6.197000503540039,0.6309013366699219,0.0]},{"label":"C","location":[5.924100875854492,3.0647010803222658,0.0]},{"label":"C","location":[7.173900604248047,3.9860000610351564,0.0]},{"label":"C","location":[6.815000534057617,3.164600372314453,0.0]},{"label":"C","location":[6.641901016235352,4.7076005935668949,0.0]},{"label":"C","location":[5.392200469970703,3.7863006591796877,0.0]},{"label":"C","location":[5.751201629638672,4.607700347900391,0.0]},{"label":"C","location":[6.9010009765625,6.419800758361816,0.0]},{"label":"C","location":[5.651300430297852,5.498500823974609,0.0]},{"label":"C","location":[6.54210090637207,5.598400115966797,0.0]},{"label":"C","location":[5.1194000244140629,6.220100402832031,0.0]},{"label":"C","location":[6.369001388549805,7.141300201416016,0.0]},{"label":"C","location":[5.478200912475586,7.041400909423828,0.0]},{"label":"C","location":[20.05120086669922,2.951200485229492,0.0]},{"label":"C","location":[18.501300811767579,3.041799545288086,0.0]},{"label":"C","location":[19.302501678466798,3.4439010620117189,0.0]},{"label":"C","location":[18.44900131225586,2.146900177001953,0.0]},{"label":"C","location":[19.999000549316408,2.0563011169433595,0.0]},{"label":"C","location":[19.19780158996582,1.6541996002197266,0.0]},{"label":"C","location":[17.350400924682618,4.335700035095215,0.0]},{"label":"C","location":[18.900400161743165,4.245000839233398,0.0]},{"label":"C","location":[18.09910011291504,3.842900276184082,0.0]},{"label":"C","location":[18.952600479125978,5.139900207519531,0.0]},{"label":"C","location":[17.402700424194337,5.230500221252441,0.0]},{"label":"C","location":[18.203800201416017,5.632699966430664,0.0]},{"label":"C","location":[16.25170135498047,6.52440071105957,0.0]},{"label":"C","location":[17.801700592041017,6.43380069732666,0.0]},{"label":"C","location":[17.00050163269043,6.031700134277344,0.0]},{"label":"C","location":[17.853900909423829,7.328700065612793,0.0]},{"label":"C","location":[16.304000854492189,7.419300079345703,0.0]},{"label":"C","location":[17.105199813842775,7.8214006423950199,0.0]},{"label":"C","location":[9.21969985961914,7.481600761413574,0.0]},{"label":"C","location":[10.578300476074219,8.233200073242188,0.0]},{"label":"C","location":[9.682100296020508,8.249600410461426,0.0]},{"label":"C","location":[11.012201309204102,7.44890022277832,0.0]},{"label":"C","location":[9.653800964355469,6.697200775146484,0.0]},{"label":"C","location":[10.55000114440918,6.680900573730469,0.0]},{"label":"C","location":[13.48080062866211,7.671100616455078,0.0]},{"label":"C","location":[13.905000686645508,6.284000396728516,0.0]},{"label":"C","location":[14.196701049804688,7.13170051574707,0.0]},{"label":"C","location":[13.00870132446289,6.299600601196289,0.0]},{"label":"C","location":[12.746500015258789,7.156800270080566,0.0]}],"bonds":[{"type":2,"atoms":[2,0]},{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,5]},{"type":1,"atoms":[5,3]},{"type":2,"atoms":[3,1]},{"type":1,"atoms":[1,2]},{"type":2,"atoms":[8,6]},{"type":1,"atoms":[6,10]},{"type":2,"atoms":[10,11]},{"type":1,"atoms":[11,9]},{"type":2,"atoms":[9,7]},{"type":1,"atoms":[7,8]},{"type":1,"atoms":[5,8]},{"type":2,"atoms":[14,12]},{"type":1,"atoms":[12,16]},{"type":2,"atoms":[16,17]},{"type":1,"atoms":[17,15]},{"type":2,"atoms":[15,13]},{"type":1,"atoms":[13,14]},{"type":1,"atoms":[13,2]},{"type":2,"atoms":[20,18]},{"type":1,"atoms":[18,22]},{"type":2,"atoms":[22,23]},{"type":1,"atoms":[23,21]},{"type":2,"atoms":[21,19]},{"type":1,"atoms":[19,20]},{"type":1,"atoms":[18,12]},{"type":1,"atoms":[20,14]},{"type":2,"atoms":[26,24]},{"type":1,"atoms":[24,28]},{"type":2,"atoms":[28,29]},{"type":1,"atoms":[29,27]},{"type":2,"atoms":[27,25]},{"type":1,"atoms":[25,26]},{"type":1,"atoms":[21,26]},{"type":1,"atoms":[23,25]},{"type":2,"atoms":[32,30]},{"type":1,"atoms":[30,34]},{"type":2,"atoms":[34,35]},{"type":1,"atoms":[35,33]},{"type":2,"atoms":[33,31]},{"type":1,"atoms":[31,32]},{"type":1,"atoms":[11,33]},{"type":2,"atoms":[38,36]},{"type":1,"atoms":[36,40]},{"type":2,"atoms":[40,41]},{"type":1,"atoms":[41,39]},{"type":2,"atoms":[39,37]},{"type":1,"atoms":[37,38]},{"type":2,"atoms":[44,42]},{"type":1,"atoms":[42,46]},{"type":2,"atoms":[46,47]},{"type":1,"atoms":[47,45]},{"type":2,"atoms":[45,43]},{"type":1,"atoms":[43,44]},{"type":1,"atoms":[38,31]},{"type":1,"atoms":[37,32]},{"type":1,"atoms":[44,40]},{"type":1,"atoms":[43,41]},{"type":2,"atoms":[50,48]},{"type":1,"atoms":[48,52]},{"type":2,"atoms":[52,53]},{"type":1,"atoms":[53,51]},{"type":2,"atoms":[51,49]},{"type":1,"atoms":[49,50]},{"type":1,"atoms":[24,48]},{"type":1,"atoms":[54,58]},{"type":2,"atoms":[58,57]},{"type":1,"atoms":[57,55]},{"type":2,"atoms":[55,56]},{"type":1,"atoms":[56,54]},{"type":1,"atoms":[51,58]},{"type":1,"atoms":[56,46]}]},"mol14":{"type":"molecule","atoms":[{"label":"C","location":[28.17820167541504,19.304950714111329,0.0]},{"label":"C","location":[28.178401947021486,20.307449340820314,0.0]},{"label":"C","location":[28.883602142333986,21.012649536132814,0.0]},{"label":"C","location":[28.88380241394043,18.59954833984375,0.0]},{"label":"C","location":[29.886201858520509,18.59954833984375,0.0]},{"label":"C","location":[30.591602325439454,19.304950714111329,0.0]},{"label":"C","location":[30.591503143310548,20.307449340820314,0.0]},{"label":"C","location":[29.886201858520509,21.01274871826172,0.0]}],"bonds":[{"type":1,"atoms":[1,0]},{"type":1,"atoms":[0,3]},{"type":1,"atoms":[3,4]},{"type":1,"atoms":[4,5]},{"type":1,"atoms":[5,6]},{"type":1,"atoms":[6,7]},{"type":1,"atoms":[7,2]},{"type":1,"atoms":[2,1]}]},"mol15":{"type":"molecule","atoms":[{"label":"C","location":[12.753199577331543,37.87387466430664,0.0]},{"label":"C","location":[14.483498573303223,37.87437438964844,0.0]},{"label":"C","location":[13.619999885559082,38.37397384643555,0.0]},{"label":"C","location":[14.483498573303223,36.87347412109375,0.0]},{"label":"C","location":[12.753199577331543,36.86897277832031,0.0]},{"label":"C","location":[13.622199058532715,36.37397384643555,0.0]},{"label":"C","location":[11.887200355529786,36.36897277832031,0.0]},{"label":"C","location":[12.915099143981934,35.666873931884769,0.0]},{"label":"C","location":[15.190600395202637,36.16637420654297,0.0]}],"bonds":[{"type":2,"atoms":[2,0]},{"type":1,"atoms":[0,4]},{"type":2,"atoms":[4,5]},{"type":1,"atoms":[5,3]},{"type":2,"atoms":[3,1]},{"type":1,"atoms":[1,2]},{"type":1,"atoms":[4,6]},{"type":2,"atoms":[5,7]},{"type":1,"atoms":[3,8]}]}} \ No newline at end of file diff --git a/api/tests/integration/tests/formats/ref/multi.rdf b/api/tests/integration/tests/formats/ref/multi.rdf new file mode 100644 index 0000000000..91a734f969 --- /dev/null +++ b/api/tests/integration/tests/formats/ref/multi.rdf @@ -0,0 +1,147 @@ +$RDFILE 1 +$DATM 01/00/00 00:00 +$RDFILE 1 +$DATM 01/00/00 00:00 +$RFMT +$RXN + + -INDIGO- 0100000000 + + 3 2 +$MOL + + -INDIGO-01000000002D + + 3 3 0 0 0 0 0 0 0 0999 V2000 + 5.2744 -4.0825 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2756 -4.0825 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7751 -3.2175 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 2 3 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 4 4 0 0 0 0 0 0 0 0999 V2000 + 3.5322 -4.1225 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5285 -3.1275 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5203 -4.1096 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5178 -3.1275 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 3 4 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 3 2 0 0 0 0 0 0 0 0999 V2000 + 0.4000 -2.7000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1000 -3.5660 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4000 -4.4321 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 6 6 0 0 0 0 0 0 0 0999 V2000 + 15.5090 -2.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.5090 -3.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.3750 -4.3250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.2410 -3.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.2410 -2.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.3750 -2.3250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 7 7 0 0 0 0 0 0 0 0999 V2000 + 10.8545 -3.1186 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.6384 -2.5010 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6114 -2.7236 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.0455 -3.6194 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8600 -4.1258 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6121 -4.5264 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.6384 -4.7490 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 6 1 0 0 0 0 + 1 5 1 0 0 0 0 + 5 7 1 0 0 0 0 + 6 7 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 6 6 0 0 0 0 0 0 0 0999 V2000 + 15.5090 -2.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.5090 -3.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.3750 -4.3250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.2410 -3.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.2410 -2.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.3750 -2.3250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 7 7 0 0 0 0 0 0 0 0999 V2000 + 10.8545 -3.1186 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.6384 -2.5010 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6114 -2.7236 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.0455 -3.6194 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8600 -4.1258 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6121 -4.5264 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.6384 -4.7490 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 6 1 0 0 0 0 + 1 5 1 0 0 0 0 + 5 7 1 0 0 0 0 + 6 7 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 6 6 0 0 0 0 0 0 0 0999 V2000 + 22.5598 -3.0501 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.2902 -3.0496 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.4266 -2.5500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.2902 -4.0505 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.5598 -4.0550 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.4288 -4.5500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 4 2 2 0 0 0 0 + 1 5 1 0 0 0 0 + 2 3 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 +M END diff --git a/api/tests/integration/tests/formats/ref/pathway1.rdf b/api/tests/integration/tests/formats/ref/pathway1.rdf new file mode 100644 index 0000000000..d3cff0b676 --- /dev/null +++ b/api/tests/integration/tests/formats/ref/pathway1.rdf @@ -0,0 +1,156 @@ +$RDFILE 1 +$DATM 01/00/00 00:00 +$RDFILE 1 +$DATM 01/00/00 00:00 +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 5 5 0 0 0 0 0 0 0 0999 V2000 + 0.9206 13.6931 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4210 12.1530 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7303 13.0993 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4203 12.1530 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1109 13.0993 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 5 1 0 0 0 0 + 5 4 2 0 0 0 0 + 4 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 1 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 6 6 0 0 0 0 0 0 0 0999 V2000 + 0.0000 9.1529 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7303 9.1534 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8668 9.6530 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7303 8.1524 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 8.1479 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8690 7.6529 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 7 7 0 0 0 0 0 0 0 0999 V2000 + 5.7891 11.2880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7891 10.2880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6551 9.7880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5212 10.2880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5212 11.2880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6551 11.7880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3872 11.7880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6 1 1 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 3 1 +$MOL + + -INDIGO-01000000002D + + 7 7 0 0 0 0 0 0 0 0999 V2000 + 5.7891 11.2880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7891 10.2880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6551 9.7880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5212 10.2880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5212 11.2880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6551 11.7880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3872 11.7880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6 1 1 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 8 8 0 0 0 0 0 0 0 0999 V2000 + 6.1962 6.6705 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9801 7.2880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9531 7.0655 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3872 6.1697 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2017 5.6633 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9538 5.2626 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9801 5.0401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2303 6.9293 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 0 0 0 + 1 5 1 0 0 0 0 + 5 7 1 0 0 0 0 + 7 6 1 0 0 0 0 + 6 4 1 0 0 0 0 + 4 3 1 0 0 0 0 + 3 2 1 0 0 0 0 + 1 8 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 7 7 0 0 0 0 0 0 0 0999 V2000 + 7.3872 1.5401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8876 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1968 0.9463 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8868 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5775 0.9463 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3872 2.5401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3872 2.5401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 5 1 0 0 0 0 + 5 4 2 0 0 0 0 + 4 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 1 1 0 0 0 0 + 1 6 2 0 0 0 0 + 6 7 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 9 9 0 0 0 0 0 0 0 0999 V2000 + 12.7532 6.8825 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.4835 6.8830 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6200 7.3826 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.4835 5.8821 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.7532 5.8776 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6222 5.3826 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.8872 5.3776 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.9151 4.6755 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.1906 5.1750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 5 7 1 0 0 0 0 + 6 8 2 0 0 0 0 + 4 9 1 0 0 0 0 +M END diff --git a/api/tests/integration/tests/formats/ref/pathway10.rdf b/api/tests/integration/tests/formats/ref/pathway10.rdf new file mode 100644 index 0000000000..75a98fe663 --- /dev/null +++ b/api/tests/integration/tests/formats/ref/pathway10.rdf @@ -0,0 +1,184 @@ +$RDFILE 1 +$DATM 01/00/00 00:00 +$RDFILE 1 +$DATM 01/00/00 00:00 +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 4 4 0 0 0 0 0 0 0 0999 V2000 + 0.7290 4.2022 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7303 4.2022 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2297 5.0671 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2297 6.0671 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 1 1 0 0 0 0 + 3 4 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 5 5 0 0 0 0 0 0 0 0999 V2000 + 1.7303 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7266 0.9951 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7183 0.0129 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7158 0.9951 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0087 1.7022 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 4 1 0 0 0 0 + 4 3 1 0 0 0 0 + 3 1 1 0 0 0 0 + 4 5 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 6 6 0 0 0 0 0 0 0 0999 V2000 + 6.0401 3.2629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5405 1.7228 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8497 2.6691 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5397 1.7228 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2303 2.6691 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0401 4.2629 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 1 5 1 0 0 0 0 + 5 4 2 0 0 0 0 + 4 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 1 1 0 0 0 0 + 1 6 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 6 6 0 0 0 0 0 0 0 0999 V2000 + 0.0000 14.1071 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7303 14.1076 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8668 14.6072 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7303 13.1067 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 13.1022 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8690 12.6072 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 5 5 0 0 0 0 0 0 0 0999 V2000 + 0.9207 10.1072 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4211 8.5671 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7303 9.5133 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4203 8.5671 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1110 9.5133 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 5 1 0 0 0 0 + 5 4 2 0 0 0 0 + 4 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 1 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 5 5 0 0 0 0 0 0 0 0999 V2000 + 7.8745 10.4722 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8708 11.4673 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8626 10.4851 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8601 11.4673 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8367 11.7261 0.0000 P 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 4 1 0 0 0 0 + 4 3 1 0 0 0 0 + 3 1 1 0 0 0 0 + 2 5 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 6 6 0 0 0 0 0 0 0 0999 V2000 + 9.8367 11.9722 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8367 10.9722 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.7027 10.4722 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5687 10.9722 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5687 11.9722 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.7027 12.4722 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6 1 1 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 5 5 0 0 0 0 0 0 0 0999 V2000 + 10.8653 1.7228 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8616 2.7179 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8534 1.7357 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8509 2.7179 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5687 3.4250 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 4 1 0 0 0 0 + 4 3 1 0 0 0 0 + 3 1 1 0 0 0 0 + 2 5 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 12 12 0 0 1 0 0 0 0 0999 V2000 + 19.5055 8.6403 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 19.5055 6.7652 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 17.6861 5.8247 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 15.8666 6.7651 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 17.6805 8.6403 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 15.0687 8.0460 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 18.5957 8.1812 0.0000 C 0 0 1 0 0 0 0 0 0 0 0 0 + 18.5957 7.2298 0.0000 C 0 0 1 0 0 0 0 0 0 0 0 0 + 17.6805 6.7651 0.0000 C 0 0 1 0 0 0 0 0 0 0 0 0 + 16.7709 7.2296 0.0000 C 0 0 1 0 0 0 0 0 0 0 0 0 + 16.7709 8.1811 0.0000 C 0 0 1 0 0 0 0 0 0 0 0 0 + 15.8666 8.6401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6 12 1 0 0 0 0 + 11 5 1 0 0 0 0 + 5 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 1 0 0 0 + 7 1 1 6 0 0 0 + 8 2 1 6 0 0 0 + 9 3 1 6 0 0 0 + 10 4 1 6 0 0 0 +M END diff --git a/api/tests/integration/tests/formats/ref/pathway2.rdf b/api/tests/integration/tests/formats/ref/pathway2.rdf new file mode 100644 index 0000000000..8e25eb284e --- /dev/null +++ b/api/tests/integration/tests/formats/ref/pathway2.rdf @@ -0,0 +1,134 @@ +$RDFILE 1 +$DATM 01/00/00 00:00 +$RDFILE 1 +$DATM 01/00/00 00:00 +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 5 5 0 0 0 0 0 0 0 0999 V2000 + 0.9206 8.9452 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4210 7.4051 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7303 8.3514 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4203 7.4051 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1109 8.3514 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 5 1 0 0 0 0 + 5 4 2 0 0 0 0 + 4 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 1 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 6 6 0 0 0 0 0 0 0 0999 V2000 + 0.0000 4.4050 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7303 4.4055 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8668 4.9051 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7303 3.4045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 3.4000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8690 2.9050 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 7 7 0 0 0 0 0 0 0 0999 V2000 + 5.2303 6.5401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2303 5.5401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0963 5.0401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9624 5.5401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9624 6.5401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0963 7.0401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8284 7.0401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6 1 1 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 7 7 0 0 0 0 0 0 0 0999 V2000 + 5.2303 6.5401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2303 5.5401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0963 5.0401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9624 5.5401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9624 6.5401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0963 7.0401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8284 7.0401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6 1 1 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 7 7 0 0 0 0 0 0 0 0999 V2000 + 6.8284 1.5401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3288 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6380 0.9463 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3280 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0187 0.9463 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8284 2.5401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8284 2.5401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 5 1 0 0 0 0 + 5 4 2 0 0 0 0 + 4 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 1 1 0 0 0 0 + 1 6 2 0 0 0 0 + 6 7 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 9 9 0 0 0 0 0 0 0 0999 V2000 + 12.1944 4.5085 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.9247 4.5090 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.0612 5.0086 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.9247 3.5081 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.1944 3.5036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.0634 3.0086 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.3284 3.0036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.3563 2.3015 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6318 2.8010 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 5 7 1 0 0 0 0 + 6 8 2 0 0 0 0 + 4 9 1 0 0 0 0 +M END diff --git a/api/tests/integration/tests/formats/ref/pathway3.rdf b/api/tests/integration/tests/formats/ref/pathway3.rdf new file mode 100644 index 0000000000..069bf3bd7f --- /dev/null +++ b/api/tests/integration/tests/formats/ref/pathway3.rdf @@ -0,0 +1,114 @@ +$RDFILE 1 +$DATM 01/00/00 00:00 +$RDFILE 1 +$DATM 01/00/00 00:00 +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 5 5 0 0 0 0 0 0 0 0999 V2000 + 0.9206 6.0402 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4210 4.5001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7303 5.4464 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4203 4.5001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1109 5.4464 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 5 1 0 0 0 0 + 5 4 2 0 0 0 0 + 4 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 1 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 6 6 0 0 0 0 0 0 0 0999 V2000 + 0.0000 1.5000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7303 1.5005 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8668 2.0001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7303 0.4995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.4950 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8690 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 7 7 0 0 0 0 0 0 0 0999 V2000 + 5.2303 3.6351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2303 2.6351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0963 2.1351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9624 2.6351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9624 3.6351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0963 4.1351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8284 4.1351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6 1 1 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 1 1 +$MOL + + -INDIGO-01000000002D + + 7 7 0 0 0 0 0 0 0 0999 V2000 + 5.2303 3.6351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2303 2.6351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0963 2.1351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9624 2.6351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9624 3.6351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0963 4.1351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8284 4.1351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6 1 1 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 9 9 0 0 0 0 0 0 0 0999 V2000 + 12.1944 3.9886 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.9247 3.9891 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.0612 4.4887 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.9247 2.9882 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.1944 2.9837 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.0634 2.4887 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.3284 2.4837 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.3563 1.7816 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6318 2.2811 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 5 7 1 0 0 0 0 + 6 8 2 0 0 0 0 + 4 9 1 0 0 0 0 +M END diff --git a/api/tests/integration/tests/formats/ref/pathway4.rdf b/api/tests/integration/tests/formats/ref/pathway4.rdf new file mode 100644 index 0000000000..82e8a317ce --- /dev/null +++ b/api/tests/integration/tests/formats/ref/pathway4.rdf @@ -0,0 +1,96 @@ +$RDFILE 1 +$DATM 01/00/00 00:00 +$RDFILE 1 +$DATM 01/00/00 00:00 +$RFMT +$RXN + + -INDIGO- 0100000000 + + 1 1 +$MOL + + -INDIGO-01000000002D + + 5 5 0 0 0 0 0 0 0 0999 V2000 + 0.8097 2.1236 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3101 0.5835 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6194 1.5298 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3094 0.5835 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 1.5298 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 5 1 0 0 0 0 + 5 4 2 0 0 0 0 + 4 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 1 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 7 7 0 0 0 0 0 0 0 0999 V2000 + 5.1194 1.8536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1194 0.8536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9854 0.3535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8515 0.8536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8515 1.8536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9854 2.3536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7175 2.3536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6 1 1 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 1 1 +$MOL + + -INDIGO-01000000002D + + 7 7 0 0 0 0 0 0 0 0999 V2000 + 5.1194 1.8536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1194 0.8536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9854 0.3535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8515 0.8536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8515 1.8536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9854 2.3536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7175 2.3536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6 1 1 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 9 9 0 0 0 0 0 0 0 0999 V2000 + 12.0835 2.2070 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.8138 2.2075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.9503 2.7071 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.8138 1.2066 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.0835 1.2021 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.9525 0.7071 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2175 0.7021 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.2454 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.5209 0.4995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 5 7 1 0 0 0 0 + 6 8 2 0 0 0 0 + 4 9 1 0 0 0 0 +M END diff --git a/api/tests/integration/tests/formats/ref/pathway5.rdf b/api/tests/integration/tests/formats/ref/pathway5.rdf new file mode 100644 index 0000000000..449ae7eeb2 --- /dev/null +++ b/api/tests/integration/tests/formats/ref/pathway5.rdf @@ -0,0 +1,54 @@ +$RDFILE 1 +$DATM 01/00/00 00:00 +$RDFILE 1 +$DATM 01/00/00 00:00 +$RFMT +$RXN + + -INDIGO- 0100000000 + + 1 1 +$MOL + + -INDIGO-01000000002D + + 7 7 0 0 0 0 0 0 0 0999 V2000 + 0.0000 1.8536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.8536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8660 0.3535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7321 0.8536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7321 1.8536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8660 2.3536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5981 2.3536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6 1 1 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 9 9 0 0 0 0 0 0 0 0999 V2000 + 6.9641 2.2070 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6944 2.2075 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8309 2.7071 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6944 1.2066 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9641 1.2021 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8331 0.7071 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0981 0.7021 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1260 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4015 0.4995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 5 7 1 0 0 0 0 + 6 8 2 0 0 0 0 + 4 9 1 0 0 0 0 +M END diff --git a/api/tests/integration/tests/formats/ref/pathway6.rdf b/api/tests/integration/tests/formats/ref/pathway6.rdf new file mode 100644 index 0000000000..df5f611c61 --- /dev/null +++ b/api/tests/integration/tests/formats/ref/pathway6.rdf @@ -0,0 +1,325 @@ +$RDFILE 1 +$DATM 01/00/00 00:00 +$RDFILE 1 +$DATM 01/00/00 00:00 +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 5 5 0 0 0 0 0 0 0 0999 V2000 + 0.9206 13.6931 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4210 12.1530 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7303 13.0993 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4203 12.1530 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1109 13.0993 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 5 1 0 0 0 0 + 5 4 2 0 0 0 0 + 4 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 1 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 6 6 0 0 0 0 0 0 0 0999 V2000 + 0.0000 9.1529 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7303 9.1534 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8668 9.6530 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7303 8.1524 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 8.1479 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8690 7.6529 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 7 7 0 0 0 0 0 0 0 0999 V2000 + 5.7891 11.2880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7891 10.2880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6551 9.7880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5212 10.2880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5212 11.2880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6551 11.7880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3872 11.7880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6 1 1 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 1 1 +$MOL + + -INDIGO-01000000002D + + 3 3 0 0 0 0 0 0 0 0999 V2000 + 0.7291 16.1931 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7303 16.1931 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2297 17.0581 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 1 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 5 5 0 0 0 0 0 0 0 0999 V2000 + 7.5782 17.3950 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3872 16.8072 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0782 15.8561 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0782 15.8561 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7692 16.8072 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 5 1 0 0 0 0 + 5 4 1 0 0 0 0 + 4 3 1 0 0 0 0 + 3 2 1 0 0 0 0 + 2 1 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 3 1 +$MOL + + -INDIGO-01000000002D + + 7 7 0 0 0 0 0 0 0 0999 V2000 + 5.7891 11.2880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7891 10.2880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6551 9.7880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5212 10.2880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5212 11.2880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6551 11.7880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3872 11.7880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6 1 1 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 8 8 0 0 0 0 0 0 0 0999 V2000 + 6.1962 6.6705 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9801 7.2880 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9531 7.0655 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3872 6.1697 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2017 5.6633 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9538 5.2626 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9801 5.0401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2303 6.9293 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 0 0 0 + 1 5 1 0 0 0 0 + 5 7 1 0 0 0 0 + 7 6 1 0 0 0 0 + 6 4 1 0 0 0 0 + 4 3 1 0 0 0 0 + 3 2 1 0 0 0 0 + 1 8 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 7 7 0 0 0 0 0 0 0 0999 V2000 + 7.3872 1.5401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8876 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1968 0.9463 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8868 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5775 0.9463 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3872 2.5401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3872 2.5401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 5 1 0 0 0 0 + 5 4 2 0 0 0 0 + 4 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 1 1 0 0 0 0 + 1 6 2 0 0 0 0 + 6 7 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 9 9 0 0 0 0 0 0 0 0999 V2000 + 12.7532 6.8825 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.4835 6.8830 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6200 7.3826 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.4835 5.8821 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.7532 5.8776 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6222 5.3826 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.8872 5.3776 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.9151 4.6755 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.1906 5.1750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 5 7 1 0 0 0 0 + 6 8 2 0 0 0 0 + 4 9 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 1 1 +$MOL + + -INDIGO-01000000002D + + 5 5 0 0 0 0 0 0 0 0999 V2000 + 7.5782 17.3950 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3872 16.8072 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0782 15.8561 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0782 15.8561 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7692 16.8072 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 5 1 0 0 0 0 + 5 4 1 0 0 0 0 + 4 3 1 0 0 0 0 + 3 2 1 0 0 0 0 + 2 1 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 8 8 0 0 0 0 0 0 0 0999 V2000 + 12.7773 16.1243 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.7775 17.1269 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.4826 17.8321 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.4828 15.4189 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.4852 15.4189 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.1906 16.1243 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.1905 17.1269 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.4852 17.8322 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 0 0 0 + 1 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 3 1 0 0 0 0 + 3 2 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 8 8 0 0 0 0 0 0 0 0999 V2000 + 12.7773 16.1243 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.7775 17.1269 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.4826 17.8321 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.4828 15.4189 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.4852 15.4189 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.1906 16.1243 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.1905 17.1269 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.4852 17.8322 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 0 0 0 + 1 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 3 1 0 0 0 0 + 3 2 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 9 9 0 0 0 0 0 0 0 0999 V2000 + 12.7532 6.8825 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.4835 6.8830 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6200 7.3826 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.4835 5.8821 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.7532 5.8776 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6222 5.3826 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.8872 5.3776 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.9151 4.6755 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.1906 5.1750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 5 7 1 0 0 0 0 + 6 8 2 0 0 0 0 + 4 9 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 16 17 0 0 0 0 0 0 0 0999 V2000 + 18.6906 9.2219 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.6908 10.2244 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.3960 10.9296 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.3962 8.5165 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.3986 8.5165 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.1040 9.2219 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.1039 10.2244 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.3986 10.9297 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.7740 12.4302 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.7742 13.4327 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.4793 14.1380 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.4795 11.7248 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.4819 11.7248 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.1873 12.4302 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.1872 13.4327 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.4819 14.1381 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 0 0 0 + 1 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 3 1 0 0 0 0 + 3 2 1 0 0 0 0 + 10 9 1 0 0 0 0 + 9 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 + 16 11 1 0 0 0 0 + 11 10 1 0 0 0 0 + 12 3 1 0 0 0 0 +M END diff --git a/api/tests/integration/tests/formats/ref/pathway7.rdf b/api/tests/integration/tests/formats/ref/pathway7.rdf new file mode 100644 index 0000000000..1d23e6b07a --- /dev/null +++ b/api/tests/integration/tests/formats/ref/pathway7.rdf @@ -0,0 +1,538 @@ +$RDFILE 1 +$DATM 01/00/00 00:00 +$RDFILE 1 +$DATM 01/00/00 00:00 +$RFMT +$RXN + + -INDIGO- 0100000000 + + 1 1 +$MOL + + -INDIGO-01000000002D + + 60 74 0 0 0 0 0 0 0 0999 V2000 + 5.0777 14.6039 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1430 13.1227 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6828 13.8444 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9981 13.1604 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9329 14.6415 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3931 13.9198 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2808 13.4364 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1066 14.9087 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.7687 14.1223 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9566 15.0093 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.1308 13.5370 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4687 14.3234 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8978 15.2692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2616 14.6876 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7476 15.3721 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9258 13.9003 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5621 14.4819 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0760 13.7974 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7950 16.1190 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9805 17.0092 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6447 16.2219 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4666 17.6937 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.2810 16.8035 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6168 17.5908 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6995 19.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5139 18.4406 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3637 18.5435 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 19.1251 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1855 20.0153 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3358 19.9124 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6338 15.8653 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.2902 16.4919 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.1429 16.5664 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.9284 15.7161 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.2721 15.0895 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.4194 15.0149 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.7247 18.0458 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.0683 17.4192 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.2156 17.3446 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.4301 18.1949 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.0864 18.8215 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.9391 18.8961 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5209 20.3754 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.8646 19.7488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.0118 19.6742 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.2263 20.5246 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.8827 21.1512 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.7354 21.2258 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0271 20.7432 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1636 21.6953 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3205 21.5473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7133 21.0392 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5768 20.0870 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4199 20.2350 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5276 22.0703 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8428 21.3861 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3827 22.1079 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4478 20.6267 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1326 21.3109 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5927 20.5891 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 9 7 2 0 0 0 0 + 7 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 10 1 0 0 0 0 + 10 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 6 9 1 0 0 0 0 + 15 13 2 0 0 0 0 + 13 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 18 16 1 0 0 0 0 + 16 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 3 1 0 0 0 0 + 21 19 2 0 0 0 0 + 19 23 1 0 0 0 0 + 23 24 2 0 0 0 0 + 24 22 1 0 0 0 0 + 22 20 2 0 0 0 0 + 20 21 1 0 0 0 0 + 19 13 1 0 0 0 0 + 21 15 1 0 0 0 0 + 27 25 2 0 0 0 0 + 25 29 1 0 0 0 0 + 29 30 2 0 0 0 0 + 30 28 1 0 0 0 0 + 28 26 2 0 0 0 0 + 26 27 1 0 0 0 0 + 22 27 1 0 0 0 0 + 24 26 1 0 0 0 0 + 33 31 2 0 0 0 0 + 31 35 1 0 0 0 0 + 35 36 2 0 0 0 0 + 36 34 1 0 0 0 0 + 34 32 2 0 0 0 0 + 32 33 1 0 0 0 0 + 12 34 1 0 0 0 0 + 39 37 2 0 0 0 0 + 37 41 1 0 0 0 0 + 41 42 2 0 0 0 0 + 42 40 1 0 0 0 0 + 40 38 2 0 0 0 0 + 38 39 1 0 0 0 0 + 45 43 2 0 0 0 0 + 43 47 1 0 0 0 0 + 47 48 2 0 0 0 0 + 48 46 1 0 0 0 0 + 46 44 2 0 0 0 0 + 44 45 1 0 0 0 0 + 39 32 1 0 0 0 0 + 38 33 1 0 0 0 0 + 45 41 1 0 0 0 0 + 44 42 1 0 0 0 0 + 51 49 2 0 0 0 0 + 49 53 1 0 0 0 0 + 53 54 2 0 0 0 0 + 54 52 1 0 0 0 0 + 52 50 2 0 0 0 0 + 50 51 1 0 0 0 0 + 57 55 2 0 0 0 0 + 55 59 1 0 0 0 0 + 59 60 2 0 0 0 0 + 60 58 1 0 0 0 0 + 58 56 2 0 0 0 0 + 56 57 1 0 0 0 0 + 25 49 1 0 0 0 0 + 52 59 1 0 0 0 0 + 56 43 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 3 3 0 0 0 0 0 0 0 0999 V2000 + 32.6062 18.0032 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.1584 17.2274 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.0541 17.2274 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 1 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 3 1 +$MOL + + -INDIGO-01000000002D + + 7 7 0 0 0 0 0 0 0 0999 V2000 + 13.5150 8.9987 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5113 9.9946 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5023 9.0116 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.4998 9.9946 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.9648 10.4975 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.0916 10.6227 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6338 8.0370 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 4 1 0 0 0 0 + 4 3 1 0 0 0 0 + 3 1 1 0 0 0 0 + 5 4 1 0 0 0 0 + 6 2 1 0 0 0 0 + 7 1 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 6 6 0 0 0 0 0 0 0 0999 V2000 + 13.7708 4.0406 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.7671 5.0365 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.7580 4.0535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.7555 5.0365 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.2206 5.4143 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6338 5.5370 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 4 1 0 0 0 0 + 4 3 1 0 0 0 0 + 3 1 1 0 0 0 0 + 5 4 1 0 0 0 0 + 2 6 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 5 5 0 0 0 0 0 0 0 0999 V2000 + 14.6338 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6301 0.9959 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6210 0.0130 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6185 0.9959 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6249 1.5406 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 4 1 0 0 0 0 + 4 3 1 0 0 0 0 + 3 1 1 0 0 0 0 + 5 4 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 59 73 0 0 0 0 0 0 0 0999 V2000 + 23.3684 2.4782 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.4411 0.9285 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.9574 1.6824 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.3358 0.9705 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.2631 2.5202 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.7468 1.7664 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.6795 1.2673 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.4793 2.8057 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.1353 1.9787 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 28.3676 2.9212 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 28.5677 1.3828 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 28.9117 2.2098 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.0377 3.1007 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.4594 2.4795 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.9279 3.2005 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.1007 1.6587 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.6791 2.2799 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.2106 1.5589 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.9379 3.9908 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.1867 4.9114 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.8281 4.0906 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.6552 5.6324 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.4064 4.7118 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.7651 5.5326 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.9140 7.3433 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.6653 6.4227 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.5554 6.5225 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.1338 7.1437 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.3825 8.0642 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.4924 7.9644 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.0541 3.8774 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.5054 3.9679 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.3059 4.3697 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.4531 3.0737 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.0019 2.9832 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.2013 2.5814 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.3553 5.2608 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.9041 5.1702 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.1035 4.7684 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.9563 6.0644 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.4076 6.1549 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.2081 6.5568 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 29.2575 7.4478 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.8063 7.3573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.0057 6.9555 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.8585 8.2515 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 29.3098 8.3420 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.1103 8.7438 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.2310 8.4043 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.5885 9.1553 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.6930 9.1717 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.0221 8.3716 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.6647 7.6205 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.5602 7.6042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.4887 8.5936 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.9126 7.2076 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.2041 8.0546 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.0170 7.2232 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.7550 8.0797 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 9 7 2 0 0 0 0 + 7 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 10 1 0 0 0 0 + 10 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 6 9 1 0 0 0 0 + 15 13 2 0 0 0 0 + 13 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 18 16 1 0 0 0 0 + 16 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 3 1 0 0 0 0 + 21 19 2 0 0 0 0 + 19 23 1 0 0 0 0 + 23 24 2 0 0 0 0 + 24 22 1 0 0 0 0 + 22 20 2 0 0 0 0 + 20 21 1 0 0 0 0 + 19 13 1 0 0 0 0 + 21 15 1 0 0 0 0 + 27 25 2 0 0 0 0 + 25 29 1 0 0 0 0 + 29 30 2 0 0 0 0 + 30 28 1 0 0 0 0 + 28 26 2 0 0 0 0 + 26 27 1 0 0 0 0 + 22 27 1 0 0 0 0 + 24 26 1 0 0 0 0 + 33 31 2 0 0 0 0 + 31 35 1 0 0 0 0 + 35 36 2 0 0 0 0 + 36 34 1 0 0 0 0 + 34 32 2 0 0 0 0 + 32 33 1 0 0 0 0 + 12 34 1 0 0 0 0 + 39 37 2 0 0 0 0 + 37 41 1 0 0 0 0 + 41 42 2 0 0 0 0 + 42 40 1 0 0 0 0 + 40 38 2 0 0 0 0 + 38 39 1 0 0 0 0 + 45 43 2 0 0 0 0 + 43 47 1 0 0 0 0 + 47 48 2 0 0 0 0 + 48 46 1 0 0 0 0 + 46 44 2 0 0 0 0 + 44 45 1 0 0 0 0 + 39 32 1 0 0 0 0 + 38 33 1 0 0 0 0 + 45 41 1 0 0 0 0 + 44 42 1 0 0 0 0 + 51 49 2 0 0 0 0 + 49 53 1 0 0 0 0 + 53 54 2 0 0 0 0 + 54 52 1 0 0 0 0 + 52 50 2 0 0 0 0 + 50 51 1 0 0 0 0 + 25 49 1 0 0 0 0 + 55 59 1 0 0 0 0 + 59 58 2 0 0 0 0 + 58 56 1 0 0 0 0 + 56 57 2 0 0 0 0 + 57 55 1 0 0 0 0 + 52 59 1 0 0 0 0 + 57 47 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 3 3 0 0 0 0 0 0 0 0999 V2000 + 32.6062 18.0032 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.1584 17.2274 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.0541 17.2274 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 1 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 59 73 0 0 0 0 0 0 0 0999 V2000 + 23.3684 2.4782 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.4411 0.9285 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.9574 1.6824 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.3358 0.9705 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.2631 2.5202 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.7468 1.7664 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.6795 1.2673 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.4793 2.8057 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.1353 1.9787 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 28.3676 2.9212 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 28.5677 1.3828 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 28.9117 2.2098 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.0377 3.1007 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.4594 2.4795 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.9279 3.2005 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.1007 1.6587 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.6791 2.2799 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.2106 1.5589 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.9379 3.9908 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.1867 4.9114 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.8281 4.0906 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.6552 5.6324 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.4064 4.7118 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.7651 5.5326 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.9140 7.3433 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.6653 6.4227 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.5554 6.5225 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.1338 7.1437 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.3825 8.0642 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.4924 7.9644 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.0541 3.8774 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.5054 3.9679 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.3059 4.3697 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.4531 3.0737 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.0019 2.9832 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.2013 2.5814 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.3553 5.2608 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.9041 5.1702 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.1035 4.7684 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.9563 6.0644 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.4076 6.1549 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.2081 6.5568 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 29.2575 7.4478 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.8063 7.3573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.0057 6.9555 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.8585 8.2515 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 29.3098 8.3420 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.1103 8.7438 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.2310 8.4043 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.5885 9.1553 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.6930 9.1717 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.0221 8.3716 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.6647 7.6205 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.5602 7.6042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.4887 8.5936 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.9126 7.2076 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.2041 8.0546 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.0170 7.2232 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.7550 8.0797 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 9 7 2 0 0 0 0 + 7 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 10 1 0 0 0 0 + 10 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 6 9 1 0 0 0 0 + 15 13 2 0 0 0 0 + 13 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 18 16 1 0 0 0 0 + 16 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 3 1 0 0 0 0 + 21 19 2 0 0 0 0 + 19 23 1 0 0 0 0 + 23 24 2 0 0 0 0 + 24 22 1 0 0 0 0 + 22 20 2 0 0 0 0 + 20 21 1 0 0 0 0 + 19 13 1 0 0 0 0 + 21 15 1 0 0 0 0 + 27 25 2 0 0 0 0 + 25 29 1 0 0 0 0 + 29 30 2 0 0 0 0 + 30 28 1 0 0 0 0 + 28 26 2 0 0 0 0 + 26 27 1 0 0 0 0 + 22 27 1 0 0 0 0 + 24 26 1 0 0 0 0 + 33 31 2 0 0 0 0 + 31 35 1 0 0 0 0 + 35 36 2 0 0 0 0 + 36 34 1 0 0 0 0 + 34 32 2 0 0 0 0 + 32 33 1 0 0 0 0 + 12 34 1 0 0 0 0 + 39 37 2 0 0 0 0 + 37 41 1 0 0 0 0 + 41 42 2 0 0 0 0 + 42 40 1 0 0 0 0 + 40 38 2 0 0 0 0 + 38 39 1 0 0 0 0 + 45 43 2 0 0 0 0 + 43 47 1 0 0 0 0 + 47 48 2 0 0 0 0 + 48 46 1 0 0 0 0 + 46 44 2 0 0 0 0 + 44 45 1 0 0 0 0 + 39 32 1 0 0 0 0 + 38 33 1 0 0 0 0 + 45 41 1 0 0 0 0 + 44 42 1 0 0 0 0 + 51 49 2 0 0 0 0 + 49 53 1 0 0 0 0 + 53 54 2 0 0 0 0 + 54 52 1 0 0 0 0 + 52 50 2 0 0 0 0 + 50 51 1 0 0 0 0 + 25 49 1 0 0 0 0 + 55 59 1 0 0 0 0 + 59 58 2 0 0 0 0 + 58 56 1 0 0 0 0 + 56 57 2 0 0 0 0 + 57 55 1 0 0 0 0 + 52 59 1 0 0 0 0 + 57 47 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 8 8 0 0 0 0 0 0 0 0999 V2000 + 37.7244 12.5030 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 38.5519 12.1602 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 38.8947 11.3327 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 36.8969 12.1602 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 36.5541 11.3327 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 36.8969 10.5052 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 37.7244 10.1624 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 38.5519 10.5052 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 0 0 0 + 1 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 3 1 0 0 0 0 + 3 2 1 0 0 0 0 +M END diff --git a/api/tests/integration/tests/formats/ref/pathway8.rdf b/api/tests/integration/tests/formats/ref/pathway8.rdf new file mode 100644 index 0000000000..587cbbfd57 --- /dev/null +++ b/api/tests/integration/tests/formats/ref/pathway8.rdf @@ -0,0 +1,876 @@ +$RDFILE 1 +$DATM 01/00/00 00:00 +$RDFILE 1 +$DATM 01/00/00 00:00 +$RFMT +$RXN + + -INDIGO- 0100000000 + + 1 1 +$MOL + + -INDIGO-01000000002D + + 6 6 0 0 0 0 0 0 0 0999 V2000 + 0.0017 14.7456 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7320 14.7461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8684 15.2457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7320 13.7452 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0017 13.7407 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8706 13.2457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 60 74 0 0 0 0 0 0 0 0999 V2000 + 10.6003 11.2320 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6656 9.7496 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.2051 10.4719 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5214 9.7873 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4561 11.2696 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.9167 10.5473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.8066 10.0636 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6323 11.5370 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.2941 10.7500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.4830 11.6377 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.6573 10.1642 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.9955 10.9512 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4171 11.8978 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7820 11.3157 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2676 12.0008 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4459 10.5278 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0812 11.1099 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5955 10.4248 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3143 12.7482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5007 13.6391 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1646 12.8512 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9864 14.3242 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7999 13.4333 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1359 14.2212 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2195 15.9625 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0329 15.0716 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8834 15.1746 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5186 15.7567 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7051 16.6476 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8547 16.5446 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.1638 12.4943 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.8192 13.1214 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.6725 13.1960 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.4571 12.3450 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.8018 11.7179 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.9485 11.6433 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.2532 14.6765 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.5979 14.0494 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.7445 13.9748 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.9599 14.8257 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.6152 15.4528 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.4686 15.5275 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.0493 17.0079 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.3940 16.3809 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.5405 16.3062 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.7560 17.1573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.4113 17.7843 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.2647 17.8590 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5489 17.3760 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6862 18.3289 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8425 18.1807 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2364 17.6723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0990 16.7193 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.9427 16.8674 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.0529 18.7042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.3691 18.0194 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.9086 18.7418 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.9738 17.2594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6576 17.9442 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.1180 17.2218 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 9 7 2 0 0 0 0 + 7 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 10 1 0 0 0 0 + 10 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 6 9 1 0 0 0 0 + 15 13 2 0 0 0 0 + 13 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 18 16 1 0 0 0 0 + 16 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 3 1 0 0 0 0 + 21 19 2 0 0 0 0 + 19 23 1 0 0 0 0 + 23 24 2 0 0 0 0 + 24 22 1 0 0 0 0 + 22 20 2 0 0 0 0 + 20 21 1 0 0 0 0 + 19 13 1 0 0 0 0 + 21 15 1 0 0 0 0 + 27 25 2 0 0 0 0 + 25 29 1 0 0 0 0 + 29 30 2 0 0 0 0 + 30 28 1 0 0 0 0 + 28 26 2 0 0 0 0 + 26 27 1 0 0 0 0 + 22 27 1 0 0 0 0 + 24 26 1 0 0 0 0 + 33 31 2 0 0 0 0 + 31 35 1 0 0 0 0 + 35 36 2 0 0 0 0 + 36 34 1 0 0 0 0 + 34 32 2 0 0 0 0 + 32 33 1 0 0 0 0 + 12 34 1 0 0 0 0 + 39 37 2 0 0 0 0 + 37 41 1 0 0 0 0 + 41 42 2 0 0 0 0 + 42 40 1 0 0 0 0 + 40 38 2 0 0 0 0 + 38 39 1 0 0 0 0 + 45 43 2 0 0 0 0 + 43 47 1 0 0 0 0 + 47 48 2 0 0 0 0 + 48 46 1 0 0 0 0 + 46 44 2 0 0 0 0 + 44 45 1 0 0 0 0 + 39 32 1 0 0 0 0 + 38 33 1 0 0 0 0 + 45 41 1 0 0 0 0 + 44 42 1 0 0 0 0 + 51 49 2 0 0 0 0 + 49 53 1 0 0 0 0 + 53 54 2 0 0 0 0 + 54 52 1 0 0 0 0 + 52 50 2 0 0 0 0 + 50 51 1 0 0 0 0 + 57 55 2 0 0 0 0 + 55 59 1 0 0 0 0 + 59 60 2 0 0 0 0 + 60 58 1 0 0 0 0 + 58 56 2 0 0 0 0 + 56 57 1 0 0 0 0 + 25 49 1 0 0 0 0 + 52 59 1 0 0 0 0 + 56 43 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 6 6 0 0 0 0 0 0 0 0999 V2000 + 0.0000 27.9988 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 26.9988 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8660 26.4988 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7320 26.9988 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7320 27.9988 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8660 28.4989 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6 1 1 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 5 5 0 0 0 0 0 0 0 0999 V2000 + 0.9282 23.9988 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4250 22.4699 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7320 23.4092 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4315 22.4699 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1243 23.4092 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 5 1 0 0 0 0 + 5 4 2 0 0 0 0 + 4 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 1 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 59 73 0 0 0 0 0 0 0 0999 V2000 + 10.4706 22.7927 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5434 21.2418 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0593 21.9963 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4388 21.2839 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.3660 22.8348 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.8501 22.0804 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.7851 21.5809 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.5847 23.1205 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.2405 22.2928 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.4737 23.2361 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.6740 21.6965 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.0182 22.5241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1366 23.4157 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5594 22.7940 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0275 23.5156 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2004 21.9726 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7777 22.5943 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3096 21.8727 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0367 24.3065 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2865 25.2278 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9276 24.4064 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7545 25.9494 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5048 25.0281 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8638 25.8495 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0136 27.6616 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7639 26.7403 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6547 26.8402 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2320 27.4619 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4816 28.3831 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5908 28.2832 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.1638 24.1930 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.6139 24.2836 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.4151 24.6857 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.5616 23.3887 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.1116 23.2981 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.3104 22.8960 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.4630 25.5775 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.0130 25.4868 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.2117 25.0847 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.0652 26.3817 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.5153 26.4723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.3164 26.8745 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.3643 27.7662 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.9143 27.6756 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.1131 27.2735 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.9665 28.5705 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.4166 28.6611 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.2178 29.0632 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3323 28.7234 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6909 29.4750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7947 29.4914 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1248 28.6907 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7664 27.9390 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6626 27.9227 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5934 28.9129 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.0176 27.5258 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.3093 28.3735 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.1213 27.5414 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.8591 28.3986 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 9 7 2 0 0 0 0 + 7 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 10 1 0 0 0 0 + 10 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 6 9 1 0 0 0 0 + 15 13 2 0 0 0 0 + 13 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 18 16 1 0 0 0 0 + 16 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 3 1 0 0 0 0 + 21 19 2 0 0 0 0 + 19 23 1 0 0 0 0 + 23 24 2 0 0 0 0 + 24 22 1 0 0 0 0 + 22 20 2 0 0 0 0 + 20 21 1 0 0 0 0 + 19 13 1 0 0 0 0 + 21 15 1 0 0 0 0 + 27 25 2 0 0 0 0 + 25 29 1 0 0 0 0 + 29 30 2 0 0 0 0 + 30 28 1 0 0 0 0 + 28 26 2 0 0 0 0 + 26 27 1 0 0 0 0 + 22 27 1 0 0 0 0 + 24 26 1 0 0 0 0 + 33 31 2 0 0 0 0 + 31 35 1 0 0 0 0 + 35 36 2 0 0 0 0 + 36 34 1 0 0 0 0 + 34 32 2 0 0 0 0 + 32 33 1 0 0 0 0 + 12 34 1 0 0 0 0 + 39 37 2 0 0 0 0 + 37 41 1 0 0 0 0 + 41 42 2 0 0 0 0 + 42 40 1 0 0 0 0 + 40 38 2 0 0 0 0 + 38 39 1 0 0 0 0 + 45 43 2 0 0 0 0 + 43 47 1 0 0 0 0 + 47 48 2 0 0 0 0 + 48 46 1 0 0 0 0 + 46 44 2 0 0 0 0 + 44 45 1 0 0 0 0 + 39 32 1 0 0 0 0 + 38 33 1 0 0 0 0 + 45 41 1 0 0 0 0 + 44 42 1 0 0 0 0 + 51 49 2 0 0 0 0 + 49 53 1 0 0 0 0 + 53 54 2 0 0 0 0 + 54 52 1 0 0 0 0 + 52 50 2 0 0 0 0 + 50 51 1 0 0 0 0 + 25 49 1 0 0 0 0 + 55 59 1 0 0 0 0 + 59 58 2 0 0 0 0 + 58 56 1 0 0 0 0 + 56 57 2 0 0 0 0 + 57 55 1 0 0 0 0 + 52 59 1 0 0 0 0 + 57 47 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 1 1 +$MOL + + -INDIGO-01000000002D + + 60 74 0 0 0 0 0 0 0 0999 V2000 + 10.6003 11.2320 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6656 9.7496 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.2051 10.4719 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5214 9.7873 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4561 11.2696 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.9167 10.5473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.8066 10.0636 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6323 11.5370 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.2941 10.7500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.4830 11.6377 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.6573 10.1642 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.9955 10.9512 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4171 11.8978 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7820 11.3157 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2676 12.0008 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4459 10.5278 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0812 11.1099 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5955 10.4248 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3143 12.7482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5007 13.6391 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1646 12.8512 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9864 14.3242 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7999 13.4333 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1359 14.2212 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2195 15.9625 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0329 15.0716 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8834 15.1746 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5186 15.7567 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7051 16.6476 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8547 16.5446 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.1638 12.4943 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.8192 13.1214 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.6725 13.1960 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.4571 12.3450 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.8018 11.7179 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.9485 11.6433 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.2532 14.6765 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.5979 14.0494 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.7445 13.9748 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.9599 14.8257 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.6152 15.4528 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.4686 15.5275 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.0493 17.0079 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.3940 16.3809 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.5405 16.3062 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.7560 17.1573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.4113 17.7843 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.2647 17.8590 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5489 17.3760 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6862 18.3289 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8425 18.1807 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2364 17.6723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0990 16.7193 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.9427 16.8674 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.0529 18.7042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.3691 18.0194 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.9086 18.7418 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.9738 17.2594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6576 17.9442 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.1180 17.2218 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 9 7 2 0 0 0 0 + 7 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 10 1 0 0 0 0 + 10 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 6 9 1 0 0 0 0 + 15 13 2 0 0 0 0 + 13 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 18 16 1 0 0 0 0 + 16 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 3 1 0 0 0 0 + 21 19 2 0 0 0 0 + 19 23 1 0 0 0 0 + 23 24 2 0 0 0 0 + 24 22 1 0 0 0 0 + 22 20 2 0 0 0 0 + 20 21 1 0 0 0 0 + 19 13 1 0 0 0 0 + 21 15 1 0 0 0 0 + 27 25 2 0 0 0 0 + 25 29 1 0 0 0 0 + 29 30 2 0 0 0 0 + 30 28 1 0 0 0 0 + 28 26 2 0 0 0 0 + 26 27 1 0 0 0 0 + 22 27 1 0 0 0 0 + 24 26 1 0 0 0 0 + 33 31 2 0 0 0 0 + 31 35 1 0 0 0 0 + 35 36 2 0 0 0 0 + 36 34 1 0 0 0 0 + 34 32 2 0 0 0 0 + 32 33 1 0 0 0 0 + 12 34 1 0 0 0 0 + 39 37 2 0 0 0 0 + 37 41 1 0 0 0 0 + 41 42 2 0 0 0 0 + 42 40 1 0 0 0 0 + 40 38 2 0 0 0 0 + 38 39 1 0 0 0 0 + 45 43 2 0 0 0 0 + 43 47 1 0 0 0 0 + 47 48 2 0 0 0 0 + 48 46 1 0 0 0 0 + 46 44 2 0 0 0 0 + 44 45 1 0 0 0 0 + 39 32 1 0 0 0 0 + 38 33 1 0 0 0 0 + 45 41 1 0 0 0 0 + 44 42 1 0 0 0 0 + 51 49 2 0 0 0 0 + 49 53 1 0 0 0 0 + 53 54 2 0 0 0 0 + 54 52 1 0 0 0 0 + 52 50 2 0 0 0 0 + 50 51 1 0 0 0 0 + 57 55 2 0 0 0 0 + 55 59 1 0 0 0 0 + 59 60 2 0 0 0 0 + 60 58 1 0 0 0 0 + 58 56 2 0 0 0 0 + 56 57 1 0 0 0 0 + 25 49 1 0 0 0 0 + 52 59 1 0 0 0 0 + 56 43 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 3 3 0 0 0 0 0 0 0 0999 V2000 + 23.6769 13.8132 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.6782 13.8132 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.1776 14.6782 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 1 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 1 1 +$MOL + + -INDIGO-01000000002D + + 59 73 0 0 0 0 0 0 0 0999 V2000 + 10.4706 22.7927 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5434 21.2418 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0593 21.9963 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4388 21.2839 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.3660 22.8348 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.8501 22.0804 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.7851 21.5809 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.5847 23.1205 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.2405 22.2928 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.4737 23.2361 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.6740 21.6965 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.0182 22.5241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1366 23.4157 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5594 22.7940 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0275 23.5156 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2004 21.9726 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7777 22.5943 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3096 21.8727 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0367 24.3065 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2865 25.2278 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9276 24.4064 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7545 25.9494 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5048 25.0281 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8638 25.8495 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0136 27.6616 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7639 26.7403 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6547 26.8402 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2320 27.4619 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4816 28.3831 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5908 28.2832 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.1638 24.1930 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.6139 24.2836 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.4151 24.6857 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.5616 23.3887 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.1116 23.2981 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.3104 22.8960 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.4630 25.5775 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.0130 25.4868 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.2117 25.0847 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.0652 26.3817 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.5153 26.4723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.3164 26.8745 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.3643 27.7662 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.9143 27.6756 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.1131 27.2735 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.9665 28.5705 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.4166 28.6611 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.2178 29.0632 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3323 28.7234 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6909 29.4750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7947 29.4914 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1248 28.6907 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7664 27.9390 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6626 27.9227 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5934 28.9129 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.0176 27.5258 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.3093 28.3735 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.1213 27.5414 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.8591 28.3986 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 9 7 2 0 0 0 0 + 7 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 10 1 0 0 0 0 + 10 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 6 9 1 0 0 0 0 + 15 13 2 0 0 0 0 + 13 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 18 16 1 0 0 0 0 + 16 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 3 1 0 0 0 0 + 21 19 2 0 0 0 0 + 19 23 1 0 0 0 0 + 23 24 2 0 0 0 0 + 24 22 1 0 0 0 0 + 22 20 2 0 0 0 0 + 20 21 1 0 0 0 0 + 19 13 1 0 0 0 0 + 21 15 1 0 0 0 0 + 27 25 2 0 0 0 0 + 25 29 1 0 0 0 0 + 29 30 2 0 0 0 0 + 30 28 1 0 0 0 0 + 28 26 2 0 0 0 0 + 26 27 1 0 0 0 0 + 22 27 1 0 0 0 0 + 24 26 1 0 0 0 0 + 33 31 2 0 0 0 0 + 31 35 1 0 0 0 0 + 35 36 2 0 0 0 0 + 36 34 1 0 0 0 0 + 34 32 2 0 0 0 0 + 32 33 1 0 0 0 0 + 12 34 1 0 0 0 0 + 39 37 2 0 0 0 0 + 37 41 1 0 0 0 0 + 41 42 2 0 0 0 0 + 42 40 1 0 0 0 0 + 40 38 2 0 0 0 0 + 38 39 1 0 0 0 0 + 45 43 2 0 0 0 0 + 43 47 1 0 0 0 0 + 47 48 2 0 0 0 0 + 48 46 1 0 0 0 0 + 46 44 2 0 0 0 0 + 44 45 1 0 0 0 0 + 39 32 1 0 0 0 0 + 38 33 1 0 0 0 0 + 45 41 1 0 0 0 0 + 44 42 1 0 0 0 0 + 51 49 2 0 0 0 0 + 49 53 1 0 0 0 0 + 53 54 2 0 0 0 0 + 54 52 1 0 0 0 0 + 52 50 2 0 0 0 0 + 50 51 1 0 0 0 0 + 25 49 1 0 0 0 0 + 55 59 1 0 0 0 0 + 59 58 2 0 0 0 0 + 58 56 1 0 0 0 0 + 56 57 2 0 0 0 0 + 57 55 1 0 0 0 0 + 52 59 1 0 0 0 0 + 57 47 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 4 4 0 0 0 0 0 0 0 0999 V2000 + 24.6782 24.8691 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.6745 25.8642 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.6663 24.8820 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.6638 25.8642 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 4 1 0 0 0 0 + 4 3 1 0 0 0 0 + 3 1 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 1 1 +$MOL + + -INDIGO-01000000002D + + 5 5 0 0 0 0 0 0 0 0999 V2000 + 0.8097 4.8948 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3101 3.3547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6194 4.3009 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3094 3.3547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 4.3009 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 5 1 0 0 0 0 + 5 4 2 0 0 0 0 + 4 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 1 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 59 73 0 0 0 0 0 0 0 0999 V2000 + 10.3580 1.5509 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4308 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9467 0.7545 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.3262 0.0421 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2534 1.5930 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.7375 0.8386 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6725 0.3391 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.4721 1.8787 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.1279 1.0510 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.3611 1.9943 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.5614 0.4547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.9056 1.2823 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0240 2.1739 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4468 1.5522 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9149 2.2738 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0878 0.7308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6651 1.3525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1970 0.6309 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9241 3.0647 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1739 3.9860 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8150 3.1646 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6419 4.7076 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3922 3.7863 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7512 4.6077 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9010 6.4198 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6513 5.4985 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5421 5.5984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1194 6.2201 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3690 7.1413 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4782 7.0414 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.0512 2.9512 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.5013 3.0418 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.3025 3.4439 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.4490 2.1469 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.9990 2.0563 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.1978 1.6542 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.3504 4.3357 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.9004 4.2450 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.0991 3.8429 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.9526 5.1399 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.4027 5.2305 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.2038 5.6327 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.2517 6.5244 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.8017 6.4338 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.0005 6.0317 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.8539 7.3287 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.3040 7.4193 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.1052 7.8214 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2197 7.4816 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5783 8.2332 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6821 8.2496 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.0122 7.4489 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6538 6.6972 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5500 6.6809 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.4808 7.6711 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.9050 6.2840 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.1967 7.1317 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.0087 6.2996 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.7465 7.1568 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 9 7 2 0 0 0 0 + 7 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 10 1 0 0 0 0 + 10 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 6 9 1 0 0 0 0 + 15 13 2 0 0 0 0 + 13 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 18 16 1 0 0 0 0 + 16 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 3 1 0 0 0 0 + 21 19 2 0 0 0 0 + 19 23 1 0 0 0 0 + 23 24 2 0 0 0 0 + 24 22 1 0 0 0 0 + 22 20 2 0 0 0 0 + 20 21 1 0 0 0 0 + 19 13 1 0 0 0 0 + 21 15 1 0 0 0 0 + 27 25 2 0 0 0 0 + 25 29 1 0 0 0 0 + 29 30 2 0 0 0 0 + 30 28 1 0 0 0 0 + 28 26 2 0 0 0 0 + 26 27 1 0 0 0 0 + 22 27 1 0 0 0 0 + 24 26 1 0 0 0 0 + 33 31 2 0 0 0 0 + 31 35 1 0 0 0 0 + 35 36 2 0 0 0 0 + 36 34 1 0 0 0 0 + 34 32 2 0 0 0 0 + 32 33 1 0 0 0 0 + 12 34 1 0 0 0 0 + 39 37 2 0 0 0 0 + 37 41 1 0 0 0 0 + 41 42 2 0 0 0 0 + 42 40 1 0 0 0 0 + 40 38 2 0 0 0 0 + 38 39 1 0 0 0 0 + 45 43 2 0 0 0 0 + 43 47 1 0 0 0 0 + 47 48 2 0 0 0 0 + 48 46 1 0 0 0 0 + 46 44 2 0 0 0 0 + 44 45 1 0 0 0 0 + 39 32 1 0 0 0 0 + 38 33 1 0 0 0 0 + 45 41 1 0 0 0 0 + 44 42 1 0 0 0 0 + 51 49 2 0 0 0 0 + 49 53 1 0 0 0 0 + 53 54 2 0 0 0 0 + 54 52 1 0 0 0 0 + 52 50 2 0 0 0 0 + 50 51 1 0 0 0 0 + 25 49 1 0 0 0 0 + 55 59 1 0 0 0 0 + 59 58 2 0 0 0 0 + 58 56 1 0 0 0 0 + 56 57 2 0 0 0 0 + 57 55 1 0 0 0 0 + 52 59 1 0 0 0 0 + 57 47 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 4 4 0 0 0 0 0 0 0 0999 V2000 + 24.6782 24.8691 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.6745 25.8642 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.6663 24.8820 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.6638 25.8642 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 4 1 0 0 0 0 + 4 3 1 0 0 0 0 + 3 1 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 3 3 0 0 0 0 0 0 0 0999 V2000 + 23.6769 13.8132 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.6782 13.8132 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.1776 14.6782 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 1 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 8 8 0 0 0 0 0 0 0 0999 V2000 + 28.1782 19.3050 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 28.1784 20.3074 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 28.8836 21.0126 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 28.8838 18.5995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 29.8862 18.5995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.5916 19.3050 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.5915 20.3074 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 29.8862 21.0127 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 0 0 0 + 1 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 3 1 0 0 0 0 + 3 2 1 0 0 0 0 +M END diff --git a/api/tests/integration/tests/formats/ref/pathway9.rdf b/api/tests/integration/tests/formats/ref/pathway9.rdf new file mode 100644 index 0000000000..abce544de0 --- /dev/null +++ b/api/tests/integration/tests/formats/ref/pathway9.rdf @@ -0,0 +1,1028 @@ +$RDFILE 1 +$DATM 01/00/00 00:00 +$RDFILE 1 +$DATM 01/00/00 00:00 +$RFMT +$RXN + + -INDIGO- 0100000000 + + 1 1 +$MOL + + -INDIGO-01000000002D + + 6 6 0 0 0 0 0 0 0 0999 V2000 + 0.0017 14.7456 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7320 14.7461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8684 15.2457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7320 13.7452 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0017 13.7407 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8706 13.2457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 60 74 0 0 0 0 0 0 0 0999 V2000 + 10.6003 11.2320 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6656 9.7496 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.2051 10.4719 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5214 9.7873 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4561 11.2696 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.9167 10.5473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.8066 10.0636 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6323 11.5370 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.2941 10.7500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.4830 11.6377 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.6573 10.1642 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.9955 10.9512 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4171 11.8978 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7820 11.3157 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2676 12.0008 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4459 10.5278 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0812 11.1099 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5955 10.4248 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3143 12.7482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5007 13.6391 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1646 12.8512 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9864 14.3242 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7999 13.4333 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1359 14.2212 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2195 15.9625 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0329 15.0716 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8834 15.1746 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5186 15.7567 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7051 16.6476 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8547 16.5446 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.1638 12.4943 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.8192 13.1214 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.6725 13.1960 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.4571 12.3450 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.8018 11.7179 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.9485 11.6433 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.2532 14.6765 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.5979 14.0494 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.7445 13.9748 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.9599 14.8257 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.6152 15.4528 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.4686 15.5275 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.0493 17.0079 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.3940 16.3809 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.5405 16.3062 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.7560 17.1573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.4113 17.7843 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.2647 17.8590 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5489 17.3760 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6862 18.3289 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8425 18.1807 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2364 17.6723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0990 16.7193 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.9427 16.8674 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.0529 18.7042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.3691 18.0194 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.9086 18.7418 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.9738 17.2594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6576 17.9442 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.1180 17.2218 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 9 7 2 0 0 0 0 + 7 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 10 1 0 0 0 0 + 10 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 6 9 1 0 0 0 0 + 15 13 2 0 0 0 0 + 13 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 18 16 1 0 0 0 0 + 16 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 3 1 0 0 0 0 + 21 19 2 0 0 0 0 + 19 23 1 0 0 0 0 + 23 24 2 0 0 0 0 + 24 22 1 0 0 0 0 + 22 20 2 0 0 0 0 + 20 21 1 0 0 0 0 + 19 13 1 0 0 0 0 + 21 15 1 0 0 0 0 + 27 25 2 0 0 0 0 + 25 29 1 0 0 0 0 + 29 30 2 0 0 0 0 + 30 28 1 0 0 0 0 + 28 26 2 0 0 0 0 + 26 27 1 0 0 0 0 + 22 27 1 0 0 0 0 + 24 26 1 0 0 0 0 + 33 31 2 0 0 0 0 + 31 35 1 0 0 0 0 + 35 36 2 0 0 0 0 + 36 34 1 0 0 0 0 + 34 32 2 0 0 0 0 + 32 33 1 0 0 0 0 + 12 34 1 0 0 0 0 + 39 37 2 0 0 0 0 + 37 41 1 0 0 0 0 + 41 42 2 0 0 0 0 + 42 40 1 0 0 0 0 + 40 38 2 0 0 0 0 + 38 39 1 0 0 0 0 + 45 43 2 0 0 0 0 + 43 47 1 0 0 0 0 + 47 48 2 0 0 0 0 + 48 46 1 0 0 0 0 + 46 44 2 0 0 0 0 + 44 45 1 0 0 0 0 + 39 32 1 0 0 0 0 + 38 33 1 0 0 0 0 + 45 41 1 0 0 0 0 + 44 42 1 0 0 0 0 + 51 49 2 0 0 0 0 + 49 53 1 0 0 0 0 + 53 54 2 0 0 0 0 + 54 52 1 0 0 0 0 + 52 50 2 0 0 0 0 + 50 51 1 0 0 0 0 + 57 55 2 0 0 0 0 + 55 59 1 0 0 0 0 + 59 60 2 0 0 0 0 + 60 58 1 0 0 0 0 + 58 56 2 0 0 0 0 + 56 57 1 0 0 0 0 + 25 49 1 0 0 0 0 + 52 59 1 0 0 0 0 + 56 43 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 6 6 0 0 0 0 0 0 0 0999 V2000 + 0.0000 27.9988 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 26.9988 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8660 26.4988 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7320 26.9988 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7320 27.9988 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8660 28.4989 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6 1 1 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 5 5 0 0 0 0 0 0 0 0999 V2000 + 0.9282 23.9988 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4250 22.4699 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7320 23.4092 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4315 22.4699 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1243 23.4092 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 5 1 0 0 0 0 + 5 4 2 0 0 0 0 + 4 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 1 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 59 73 0 0 0 0 0 0 0 0999 V2000 + 10.4706 22.7927 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5434 21.2418 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0593 21.9963 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4388 21.2839 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.3660 22.8348 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.8501 22.0804 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.7851 21.5809 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.5847 23.1205 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.2405 22.2928 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.4737 23.2361 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.6740 21.6965 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.0182 22.5241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1366 23.4157 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5594 22.7940 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0275 23.5156 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2004 21.9726 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7777 22.5943 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3096 21.8727 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0367 24.3065 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2865 25.2278 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9276 24.4064 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7545 25.9494 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5048 25.0281 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8638 25.8495 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0136 27.6616 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7639 26.7403 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6547 26.8402 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2320 27.4619 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4816 28.3831 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5908 28.2832 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.1638 24.1930 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.6139 24.2836 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.4151 24.6857 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.5616 23.3887 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.1116 23.2981 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.3104 22.8960 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.4630 25.5775 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.0130 25.4868 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.2117 25.0847 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.0652 26.3817 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.5153 26.4723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.3164 26.8745 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.3643 27.7662 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.9143 27.6756 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.1131 27.2735 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.9665 28.5705 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.4166 28.6611 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.2178 29.0632 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3323 28.7234 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6909 29.4750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7947 29.4914 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1248 28.6907 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7664 27.9390 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6626 27.9227 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5934 28.9129 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.0176 27.5258 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.3093 28.3735 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.1213 27.5414 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.8591 28.3986 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 9 7 2 0 0 0 0 + 7 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 10 1 0 0 0 0 + 10 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 6 9 1 0 0 0 0 + 15 13 2 0 0 0 0 + 13 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 18 16 1 0 0 0 0 + 16 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 3 1 0 0 0 0 + 21 19 2 0 0 0 0 + 19 23 1 0 0 0 0 + 23 24 2 0 0 0 0 + 24 22 1 0 0 0 0 + 22 20 2 0 0 0 0 + 20 21 1 0 0 0 0 + 19 13 1 0 0 0 0 + 21 15 1 0 0 0 0 + 27 25 2 0 0 0 0 + 25 29 1 0 0 0 0 + 29 30 2 0 0 0 0 + 30 28 1 0 0 0 0 + 28 26 2 0 0 0 0 + 26 27 1 0 0 0 0 + 22 27 1 0 0 0 0 + 24 26 1 0 0 0 0 + 33 31 2 0 0 0 0 + 31 35 1 0 0 0 0 + 35 36 2 0 0 0 0 + 36 34 1 0 0 0 0 + 34 32 2 0 0 0 0 + 32 33 1 0 0 0 0 + 12 34 1 0 0 0 0 + 39 37 2 0 0 0 0 + 37 41 1 0 0 0 0 + 41 42 2 0 0 0 0 + 42 40 1 0 0 0 0 + 40 38 2 0 0 0 0 + 38 39 1 0 0 0 0 + 45 43 2 0 0 0 0 + 43 47 1 0 0 0 0 + 47 48 2 0 0 0 0 + 48 46 1 0 0 0 0 + 46 44 2 0 0 0 0 + 44 45 1 0 0 0 0 + 39 32 1 0 0 0 0 + 38 33 1 0 0 0 0 + 45 41 1 0 0 0 0 + 44 42 1 0 0 0 0 + 51 49 2 0 0 0 0 + 49 53 1 0 0 0 0 + 53 54 2 0 0 0 0 + 54 52 1 0 0 0 0 + 52 50 2 0 0 0 0 + 50 51 1 0 0 0 0 + 25 49 1 0 0 0 0 + 55 59 1 0 0 0 0 + 59 58 2 0 0 0 0 + 58 56 1 0 0 0 0 + 56 57 2 0 0 0 0 + 57 55 1 0 0 0 0 + 52 59 1 0 0 0 0 + 57 47 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 1 1 +$MOL + + -INDIGO-01000000002D + + 60 74 0 0 0 0 0 0 0 0999 V2000 + 10.6003 11.2320 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6656 9.7496 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.2051 10.4719 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5214 9.7873 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4561 11.2696 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.9167 10.5473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.8066 10.0636 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6323 11.5370 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.2941 10.7500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.4830 11.6377 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.6573 10.1642 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.9955 10.9512 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4171 11.8978 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7820 11.3157 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2676 12.0008 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4459 10.5278 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0812 11.1099 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5955 10.4248 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3143 12.7482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5007 13.6391 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1646 12.8512 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9864 14.3242 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7999 13.4333 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1359 14.2212 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2195 15.9625 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0329 15.0716 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8834 15.1746 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5186 15.7567 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7051 16.6476 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8547 16.5446 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.1638 12.4943 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.8192 13.1214 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.6725 13.1960 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.4571 12.3450 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.8018 11.7179 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.9485 11.6433 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.2532 14.6765 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.5979 14.0494 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.7445 13.9748 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.9599 14.8257 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.6152 15.4528 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.4686 15.5275 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.0493 17.0079 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.3940 16.3809 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.5405 16.3062 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.7560 17.1573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.4113 17.7843 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.2647 17.8590 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5489 17.3760 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6862 18.3289 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8425 18.1807 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2364 17.6723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0990 16.7193 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.9427 16.8674 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.0529 18.7042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.3691 18.0194 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.9086 18.7418 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.9738 17.2594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6576 17.9442 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.1180 17.2218 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 9 7 2 0 0 0 0 + 7 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 10 1 0 0 0 0 + 10 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 6 9 1 0 0 0 0 + 15 13 2 0 0 0 0 + 13 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 18 16 1 0 0 0 0 + 16 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 3 1 0 0 0 0 + 21 19 2 0 0 0 0 + 19 23 1 0 0 0 0 + 23 24 2 0 0 0 0 + 24 22 1 0 0 0 0 + 22 20 2 0 0 0 0 + 20 21 1 0 0 0 0 + 19 13 1 0 0 0 0 + 21 15 1 0 0 0 0 + 27 25 2 0 0 0 0 + 25 29 1 0 0 0 0 + 29 30 2 0 0 0 0 + 30 28 1 0 0 0 0 + 28 26 2 0 0 0 0 + 26 27 1 0 0 0 0 + 22 27 1 0 0 0 0 + 24 26 1 0 0 0 0 + 33 31 2 0 0 0 0 + 31 35 1 0 0 0 0 + 35 36 2 0 0 0 0 + 36 34 1 0 0 0 0 + 34 32 2 0 0 0 0 + 32 33 1 0 0 0 0 + 12 34 1 0 0 0 0 + 39 37 2 0 0 0 0 + 37 41 1 0 0 0 0 + 41 42 2 0 0 0 0 + 42 40 1 0 0 0 0 + 40 38 2 0 0 0 0 + 38 39 1 0 0 0 0 + 45 43 2 0 0 0 0 + 43 47 1 0 0 0 0 + 47 48 2 0 0 0 0 + 48 46 1 0 0 0 0 + 46 44 2 0 0 0 0 + 44 45 1 0 0 0 0 + 39 32 1 0 0 0 0 + 38 33 1 0 0 0 0 + 45 41 1 0 0 0 0 + 44 42 1 0 0 0 0 + 51 49 2 0 0 0 0 + 49 53 1 0 0 0 0 + 53 54 2 0 0 0 0 + 54 52 1 0 0 0 0 + 52 50 2 0 0 0 0 + 50 51 1 0 0 0 0 + 57 55 2 0 0 0 0 + 55 59 1 0 0 0 0 + 59 60 2 0 0 0 0 + 60 58 1 0 0 0 0 + 58 56 2 0 0 0 0 + 56 57 1 0 0 0 0 + 25 49 1 0 0 0 0 + 52 59 1 0 0 0 0 + 56 43 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 3 3 0 0 0 0 0 0 0 0999 V2000 + 23.6769 13.8132 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.6782 13.8132 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.1776 14.6782 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 1 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 1 1 +$MOL + + -INDIGO-01000000002D + + 59 73 0 0 0 0 0 0 0 0999 V2000 + 10.4706 22.7927 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5434 21.2418 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0593 21.9963 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4388 21.2839 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.3660 22.8348 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.8501 22.0804 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.7851 21.5809 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.5847 23.1205 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.2405 22.2928 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.4737 23.2361 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.6740 21.6965 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.0182 22.5241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1366 23.4157 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5594 22.7940 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0275 23.5156 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2004 21.9726 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7777 22.5943 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3096 21.8727 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0367 24.3065 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2865 25.2278 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9276 24.4064 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7545 25.9494 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5048 25.0281 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8638 25.8495 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0136 27.6616 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7639 26.7403 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6547 26.8402 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2320 27.4619 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4816 28.3831 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5908 28.2832 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.1638 24.1930 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.6139 24.2836 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.4151 24.6857 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.5616 23.3887 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.1116 23.2981 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.3104 22.8960 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.4630 25.5775 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.0130 25.4868 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.2117 25.0847 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.0652 26.3817 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.5153 26.4723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.3164 26.8745 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.3643 27.7662 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.9143 27.6756 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.1131 27.2735 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.9665 28.5705 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.4166 28.6611 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.2178 29.0632 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3323 28.7234 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6909 29.4750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7947 29.4914 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1248 28.6907 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7664 27.9390 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6626 27.9227 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5934 28.9129 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.0176 27.5258 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.3093 28.3735 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.1213 27.5414 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.8591 28.3986 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 9 7 2 0 0 0 0 + 7 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 10 1 0 0 0 0 + 10 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 6 9 1 0 0 0 0 + 15 13 2 0 0 0 0 + 13 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 18 16 1 0 0 0 0 + 16 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 3 1 0 0 0 0 + 21 19 2 0 0 0 0 + 19 23 1 0 0 0 0 + 23 24 2 0 0 0 0 + 24 22 1 0 0 0 0 + 22 20 2 0 0 0 0 + 20 21 1 0 0 0 0 + 19 13 1 0 0 0 0 + 21 15 1 0 0 0 0 + 27 25 2 0 0 0 0 + 25 29 1 0 0 0 0 + 29 30 2 0 0 0 0 + 30 28 1 0 0 0 0 + 28 26 2 0 0 0 0 + 26 27 1 0 0 0 0 + 22 27 1 0 0 0 0 + 24 26 1 0 0 0 0 + 33 31 2 0 0 0 0 + 31 35 1 0 0 0 0 + 35 36 2 0 0 0 0 + 36 34 1 0 0 0 0 + 34 32 2 0 0 0 0 + 32 33 1 0 0 0 0 + 12 34 1 0 0 0 0 + 39 37 2 0 0 0 0 + 37 41 1 0 0 0 0 + 41 42 2 0 0 0 0 + 42 40 1 0 0 0 0 + 40 38 2 0 0 0 0 + 38 39 1 0 0 0 0 + 45 43 2 0 0 0 0 + 43 47 1 0 0 0 0 + 47 48 2 0 0 0 0 + 48 46 1 0 0 0 0 + 46 44 2 0 0 0 0 + 44 45 1 0 0 0 0 + 39 32 1 0 0 0 0 + 38 33 1 0 0 0 0 + 45 41 1 0 0 0 0 + 44 42 1 0 0 0 0 + 51 49 2 0 0 0 0 + 49 53 1 0 0 0 0 + 53 54 2 0 0 0 0 + 54 52 1 0 0 0 0 + 52 50 2 0 0 0 0 + 50 51 1 0 0 0 0 + 25 49 1 0 0 0 0 + 55 59 1 0 0 0 0 + 59 58 2 0 0 0 0 + 58 56 1 0 0 0 0 + 56 57 2 0 0 0 0 + 57 55 1 0 0 0 0 + 52 59 1 0 0 0 0 + 57 47 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 4 4 0 0 0 0 0 0 0 0999 V2000 + 24.6782 24.8691 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.6745 25.8642 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.6663 24.8820 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.6638 25.8642 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 4 1 0 0 0 0 + 4 3 1 0 0 0 0 + 3 1 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 5 5 0 0 0 0 0 0 0 0999 V2000 + 0.9206 44.6845 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4210 43.1444 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7303 44.0907 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4203 43.1444 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1109 44.0907 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 5 1 0 0 0 0 + 5 4 2 0 0 0 0 + 4 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 1 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 6 6 0 0 0 0 0 0 0 0999 V2000 + 0.0000 40.1443 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7303 40.1448 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8668 40.6444 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7303 39.1438 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 39.1393 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8690 38.6443 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 7 7 0 0 0 0 0 0 0 0999 V2000 + 5.7891 42.2794 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7891 41.2794 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6551 40.7794 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5212 41.2794 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5212 42.2794 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6551 42.7794 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3872 42.7794 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6 1 1 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 1 1 +$MOL + + -INDIGO-01000000002D + + 5 5 0 0 0 0 0 0 0 0999 V2000 + 0.8097 4.8948 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3101 3.3547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6194 4.3009 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3094 3.3547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 4.3009 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 5 1 0 0 0 0 + 5 4 2 0 0 0 0 + 4 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 1 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 59 73 0 0 0 0 0 0 0 0999 V2000 + 10.3580 1.5509 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4308 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9467 0.7545 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.3262 0.0421 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2534 1.5930 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.7375 0.8386 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6725 0.3391 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.4721 1.8787 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.1279 1.0510 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.3611 1.9943 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.5614 0.4547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.9056 1.2823 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0240 2.1739 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4468 1.5522 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9149 2.2738 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0878 0.7308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6651 1.3525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1970 0.6309 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9241 3.0647 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1739 3.9860 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8150 3.1646 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6419 4.7076 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3922 3.7863 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7512 4.6077 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9010 6.4198 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6513 5.4985 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5421 5.5984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1194 6.2201 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3690 7.1413 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4782 7.0414 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.0512 2.9512 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.5013 3.0418 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.3025 3.4439 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.4490 2.1469 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.9990 2.0563 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.1978 1.6542 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.3504 4.3357 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.9004 4.2450 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.0991 3.8429 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.9526 5.1399 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.4027 5.2305 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.2038 5.6327 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.2517 6.5244 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.8017 6.4338 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.0005 6.0317 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.8539 7.3287 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.3040 7.4193 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.1052 7.8214 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2197 7.4816 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5783 8.2332 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6821 8.2496 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.0122 7.4489 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6538 6.6972 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5500 6.6809 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.4808 7.6711 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.9050 6.2840 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.1967 7.1317 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.0087 6.2996 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.7465 7.1568 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 9 7 2 0 0 0 0 + 7 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 10 1 0 0 0 0 + 10 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 6 9 1 0 0 0 0 + 15 13 2 0 0 0 0 + 13 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 18 16 1 0 0 0 0 + 16 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 3 1 0 0 0 0 + 21 19 2 0 0 0 0 + 19 23 1 0 0 0 0 + 23 24 2 0 0 0 0 + 24 22 1 0 0 0 0 + 22 20 2 0 0 0 0 + 20 21 1 0 0 0 0 + 19 13 1 0 0 0 0 + 21 15 1 0 0 0 0 + 27 25 2 0 0 0 0 + 25 29 1 0 0 0 0 + 29 30 2 0 0 0 0 + 30 28 1 0 0 0 0 + 28 26 2 0 0 0 0 + 26 27 1 0 0 0 0 + 22 27 1 0 0 0 0 + 24 26 1 0 0 0 0 + 33 31 2 0 0 0 0 + 31 35 1 0 0 0 0 + 35 36 2 0 0 0 0 + 36 34 1 0 0 0 0 + 34 32 2 0 0 0 0 + 32 33 1 0 0 0 0 + 12 34 1 0 0 0 0 + 39 37 2 0 0 0 0 + 37 41 1 0 0 0 0 + 41 42 2 0 0 0 0 + 42 40 1 0 0 0 0 + 40 38 2 0 0 0 0 + 38 39 1 0 0 0 0 + 45 43 2 0 0 0 0 + 43 47 1 0 0 0 0 + 47 48 2 0 0 0 0 + 48 46 1 0 0 0 0 + 46 44 2 0 0 0 0 + 44 45 1 0 0 0 0 + 39 32 1 0 0 0 0 + 38 33 1 0 0 0 0 + 45 41 1 0 0 0 0 + 44 42 1 0 0 0 0 + 51 49 2 0 0 0 0 + 49 53 1 0 0 0 0 + 53 54 2 0 0 0 0 + 54 52 1 0 0 0 0 + 52 50 2 0 0 0 0 + 50 51 1 0 0 0 0 + 25 49 1 0 0 0 0 + 55 59 1 0 0 0 0 + 59 58 2 0 0 0 0 + 58 56 1 0 0 0 0 + 56 57 2 0 0 0 0 + 57 55 1 0 0 0 0 + 52 59 1 0 0 0 0 + 57 47 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 4 4 0 0 0 0 0 0 0 0999 V2000 + 24.6782 24.8691 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.6745 25.8642 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.6663 24.8820 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.6638 25.8642 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 4 1 0 0 0 0 + 4 3 1 0 0 0 0 + 3 1 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 3 3 0 0 0 0 0 0 0 0999 V2000 + 23.6769 13.8132 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.6782 13.8132 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.1776 14.6782 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 1 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 8 8 0 0 0 0 0 0 0 0999 V2000 + 28.1782 19.3050 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 28.1784 20.3074 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 28.8836 21.0126 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 28.8838 18.5995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 29.8862 18.5995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.5916 19.3050 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.5915 20.3074 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 29.8862 21.0127 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 0 0 0 + 1 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 3 1 0 0 0 0 + 3 2 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 3 1 +$MOL + + -INDIGO-01000000002D + + 7 7 0 0 0 0 0 0 0 0999 V2000 + 5.7891 42.2794 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7891 41.2794 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6551 40.7794 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5212 41.2794 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5212 42.2794 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6551 42.7794 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3872 42.7794 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6 1 1 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 8 8 0 0 0 0 0 0 0 0999 V2000 + 6.1962 37.6619 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9801 38.2794 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9531 38.0569 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3872 37.1611 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2017 36.6547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9538 36.2540 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9801 36.0315 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2303 37.9207 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 0 0 0 + 1 5 1 0 0 0 0 + 5 7 1 0 0 0 0 + 7 6 1 0 0 0 0 + 6 4 1 0 0 0 0 + 4 3 1 0 0 0 0 + 3 2 1 0 0 0 0 + 1 8 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 7 7 0 0 0 0 0 0 0 0999 V2000 + 7.3872 32.5315 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8876 30.9914 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1968 31.9377 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8868 30.9914 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5775 31.9377 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3872 33.5315 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3872 33.5315 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 5 1 0 0 0 0 + 5 4 2 0 0 0 0 + 4 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 1 1 0 0 0 0 + 1 6 2 0 0 0 0 + 6 7 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 9 9 0 0 0 0 0 0 0 0999 V2000 + 12.7532 37.8739 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.4835 37.8744 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6200 38.3740 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.4835 36.8735 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.7532 36.8690 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6222 36.3740 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.8872 36.3690 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.9151 35.6669 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.1906 36.1664 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 0 0 0 + 1 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 4 1 0 0 0 0 + 4 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 5 7 1 0 0 0 0 + 6 8 2 0 0 0 0 + 4 9 1 0 0 0 0 +M END diff --git a/api/tests/integration/tests/formats/ref/synthia.rdf b/api/tests/integration/tests/formats/ref/synthia.rdf new file mode 100644 index 0000000000..82cf40cb3e --- /dev/null +++ b/api/tests/integration/tests/formats/ref/synthia.rdf @@ -0,0 +1,979 @@ +$RDFILE 1 +$DATM 01/00/00 00:00 +$RDFILE 1 +$DATM 01/00/00 00:00 +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 7 6 0 0 0 0 0 0 0 0999 V2000 + 0.8692 33.1502 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8670 32.1505 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 31.6521 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7320 31.6487 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2304 30.7836 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2304 30.7817 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5992 32.1469 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 4 7 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 7 7 0 0 0 0 0 0 0 0999 V2000 + 0.0000 26.2831 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8664 26.7825 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7320 26.2817 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5984 26.7811 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5992 27.7811 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7336 28.2817 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8672 27.7825 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 4 0 0 0 0 + 3 4 4 0 0 0 0 + 4 5 4 0 0 0 0 + 5 6 4 0 0 0 0 + 6 7 4 0 0 0 0 + 7 2 4 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 13 14 0 0 0 0 0 0 0 0999 V2000 + 10.0438 30.3214 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0930 30.6312 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8368 31.2998 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4244 31.3748 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 8.7832 29.6804 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3704 28.8710 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.7820 28.0624 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8312 28.3722 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9648 27.8728 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0992 28.3736 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1000 29.3736 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9664 29.8728 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8320 29.3722 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 + 5 6 4 0 0 0 0 + 6 7 4 0 0 0 0 + 7 8 4 0 0 0 0 + 8 9 4 0 0 0 0 + 9 10 4 0 0 0 0 + 10 11 4 0 0 0 0 + 11 12 4 0 0 0 0 + 12 13 4 0 0 0 0 + 13 5 4 0 0 0 0 + 13 8 4 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 10 10 0 0 0 0 0 0 0 0999 V2000 + 6.5782 21.2471 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4446 21.7463 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3102 21.2457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1766 21.7451 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0422 21.2443 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1774 22.7451 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0438 23.2443 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3118 23.2457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4454 22.7463 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5798 23.2471 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 4 0 0 0 0 + 3 4 4 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 4 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 4 0 0 0 0 + 8 9 4 0 0 0 0 + 9 10 1 0 0 0 0 + 9 2 4 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 4 3 0 0 0 0 0 0 0 0999 V2000 + 10.0438 18.7429 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1774 18.2435 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3118 18.7443 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4454 18.2449 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 12 12 0 0 0 0 0 0 0 0999 V2000 + 13.5438 21.3670 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.4102 20.8678 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.2758 21.3684 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.1422 20.8692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.0078 21.3698 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.8744 20.8706 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.7398 21.3712 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 17.8752 19.8704 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.7414 19.3712 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 17.0094 19.3700 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.1430 19.8692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.2774 19.3684 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 4 0 0 0 0 + 5 6 4 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 4 0 0 0 0 + 8 9 1 0 0 0 0 + 8 10 4 0 0 0 0 + 10 11 4 0 0 0 0 + 11 12 1 0 0 0 0 + 11 4 4 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 1 1 +$MOL + + -INDIGO-01000000002D + + 13 14 0 0 0 0 0 0 0 0999 V2000 + 10.0438 30.3214 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0930 30.6312 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8368 31.2998 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4244 31.3748 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 8.7832 29.6804 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3704 28.8710 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.7820 28.0624 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8312 28.3722 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9648 27.8728 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0992 28.3736 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1000 29.3736 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9664 29.8728 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8320 29.3722 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 + 5 6 4 0 0 0 0 + 6 7 4 0 0 0 0 + 7 8 4 0 0 0 0 + 8 9 4 0 0 0 0 + 9 10 4 0 0 0 0 + 10 11 4 0 0 0 0 + 11 12 4 0 0 0 0 + 12 13 4 0 0 0 0 + 13 5 4 0 0 0 0 + 13 8 4 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 13 14 0 0 0 0 0 0 0 0999 V2000 + 18.7414 30.3214 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 17.7906 30.6312 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.5344 31.2998 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 17.1220 31.3748 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 17.4808 29.6804 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.0680 28.8710 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 17.4796 28.0624 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 16.5288 28.3722 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.5296 29.3722 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 15.6640 29.8728 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.7976 29.3736 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.7968 28.3736 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 15.6624 27.8728 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 + 5 6 4 0 0 0 0 + 6 7 4 0 0 0 0 + 7 8 4 0 0 0 0 + 8 9 4 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 9 5 4 0 0 0 0 + 13 8 1 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 13 14 0 0 0 0 0 0 0 0999 V2000 + 18.7414 30.3214 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 17.7906 30.6312 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.5344 31.2998 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 17.1220 31.3748 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 17.4808 29.6804 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.0680 28.8710 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 17.4796 28.0624 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 16.5288 28.3722 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.5296 29.3722 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 15.6640 29.8728 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.7976 29.3736 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.7968 28.3736 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 15.6624 27.8728 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 + 5 6 4 0 0 0 0 + 6 7 4 0 0 0 0 + 7 8 4 0 0 0 0 + 8 9 4 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 9 5 4 0 0 0 0 + 13 8 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 5 4 0 0 0 0 0 0 0 0999 V2000 + 17.8724 25.3728 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 17.8744 24.3728 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.7414 23.8746 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 17.0094 23.8712 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.1424 24.3694 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 17 18 0 0 0 0 0 0 0 0999 V2000 + 22.2430 26.6229 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 23.1086 26.1221 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.1078 25.1221 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.2414 24.6229 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 23.9750 26.6215 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 23.9758 27.6215 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.8422 28.1207 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.7078 27.6201 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 25.7070 26.6201 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.6580 26.3103 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 27.2460 27.1189 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 26.6592 27.9285 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.9688 28.8791 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.9196 28.5693 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 27.7126 29.5477 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 26.3002 29.6229 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 24.8406 26.1209 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 2 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 4 0 0 0 0 + 9 10 4 0 0 0 0 + 10 11 4 0 0 0 0 + 11 12 4 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 1 0 0 0 0 + 13 15 1 0 0 0 0 + 13 16 1 0 0 0 0 + 9 17 1 0 0 0 0 + 17 5 1 0 0 0 0 + 12 8 4 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 1 1 +$MOL + + -INDIGO-01000000002D + + 12 12 0 0 0 0 0 0 0 0999 V2000 + 13.5438 21.3670 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.4102 20.8678 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.2758 21.3684 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.1422 20.8692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.0078 21.3698 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.8744 20.8706 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.7398 21.3712 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 17.8752 19.8704 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.7414 19.3712 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 17.0094 19.3700 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.1430 19.8692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.2774 19.3684 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 4 0 0 0 0 + 5 6 4 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 4 0 0 0 0 + 8 9 1 0 0 0 0 + 8 10 4 0 0 0 0 + 10 11 4 0 0 0 0 + 11 12 1 0 0 0 0 + 11 4 4 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 12 12 0 0 0 0 0 0 0 0999 V2000 + 22.7220 21.3670 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 23.5884 20.8678 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.4540 21.3684 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.3204 20.8692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.1860 21.3698 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.0526 20.8706 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.9180 21.3712 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 27.0534 19.8704 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.9196 19.3712 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 26.1876 19.3700 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.3212 19.8692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.4556 19.3684 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 4 0 0 0 0 + 5 6 4 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 4 0 0 0 0 + 8 9 1 0 0 0 0 + 8 10 4 0 0 0 0 + 10 11 4 0 0 0 0 + 11 12 1 0 0 0 0 + 11 4 4 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 17 18 0 0 0 0 0 0 0 0999 V2000 + 22.2430 26.6229 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 23.1086 26.1221 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.1078 25.1221 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.2414 24.6229 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 23.9750 26.6215 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 23.9758 27.6215 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.8422 28.1207 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.7078 27.6201 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 25.7070 26.6201 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.6580 26.3103 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 27.2460 27.1189 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 26.6592 27.9285 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.9688 28.8791 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.9196 28.5693 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 27.7126 29.5477 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 26.3002 29.6229 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 24.8406 26.1209 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 2 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 4 0 0 0 0 + 9 10 4 0 0 0 0 + 10 11 4 0 0 0 0 + 11 12 4 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 1 0 0 0 0 + 13 15 1 0 0 0 0 + 13 16 1 0 0 0 0 + 9 17 1 0 0 0 0 + 17 5 1 0 0 0 0 + 12 8 4 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 12 12 0 0 0 0 0 0 0 0999 V2000 + 22.7220 21.3670 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 23.5884 20.8678 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.4540 21.3684 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.3204 20.8692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.1860 21.3698 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.0526 20.8706 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.9180 21.3712 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 27.0534 19.8704 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.9196 19.3712 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 26.1876 19.3700 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.3212 19.8692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.4556 19.3684 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 4 0 0 0 0 + 5 6 4 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 4 0 0 0 0 + 8 9 1 0 0 0 0 + 8 10 4 0 0 0 0 + 10 11 4 0 0 0 0 + 11 12 1 0 0 0 0 + 11 4 4 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 28 30 0 0 1 0 0 0 0 0999 V2000 + 34.0202 23.7463 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 34.8858 23.2457 0.0000 C 0 0 1 0 0 0 0 0 0 0 0 0 + 35.7523 23.7451 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 35.7530 24.7451 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.8874 25.2457 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 36.6195 25.2443 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 36.6203 26.2443 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 37.4867 26.7435 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 38.3523 26.2429 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 38.3515 25.2429 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 39.3025 24.9331 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 39.8907 25.7416 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 39.3037 26.5513 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 39.6133 27.5019 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 40.5641 27.1921 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 40.3571 28.1705 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 38.9447 28.2457 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 37.4851 24.7437 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.8852 22.2457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.0189 21.7465 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.0180 20.7463 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.1517 20.2471 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.1508 19.2471 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 32.2858 20.7477 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.4196 20.2485 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 32.2867 21.7479 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.1532 22.2469 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.1538 23.2471 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 1 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 4 0 0 0 0 + 10 11 4 0 0 0 0 + 11 12 4 0 0 0 0 + 12 13 4 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 16 1 0 0 0 0 + 14 17 1 0 0 0 0 + 10 18 1 0 0 0 0 + 2 19 1 0 0 0 0 + 19 20 1 0 0 0 0 + 20 21 4 0 0 0 0 + 21 22 4 0 0 0 0 + 22 23 1 0 0 0 0 + 22 24 4 0 0 0 0 + 24 25 1 0 0 0 0 + 24 26 4 0 0 0 0 + 26 27 4 0 0 0 0 + 27 28 1 0 0 0 0 + 18 6 1 0 0 0 0 + 27 20 4 0 0 0 0 + 13 9 4 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 12 11 0 0 0 0 0 0 0 0999 V2000 + 25.3226 16.8684 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 25.3220 15.8684 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.1876 15.3678 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 27.0540 15.8670 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.5546 16.7334 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 27.5546 16.7326 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 27.9196 15.3664 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 24.4556 15.3692 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 23.5900 15.8698 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.0906 16.7354 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 23.0906 16.7362 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 22.7236 15.3706 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 4 7 1 0 0 0 0 + 2 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 11 1 0 0 0 0 + 9 12 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 12 12 0 0 1 0 0 0 0 0999 V2000 + 25.3220 9.3672 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 26.1876 9.8678 0.0000 C 0 0 1 0 0 0 0 0 0 0 0 0 + 26.1868 10.8678 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.3204 11.3670 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.3196 12.3672 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.4532 12.8664 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.5876 12.3658 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.5884 11.3658 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.4548 10.8666 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.0540 9.3686 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.9196 9.8692 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 27.0548 8.3686 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 1 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 4 0 0 0 0 + 5 6 4 0 0 0 0 + 6 7 4 0 0 0 0 + 7 8 4 0 0 0 0 + 8 9 4 0 0 0 0 + 2 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 10 12 1 0 0 0 0 + 9 4 4 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 14 15 0 0 1 0 0 0 0 0999 V2000 + 36.8627 16.0368 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 37.4531 15.2296 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 37.1473 14.2776 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 37.9581 13.6926 0.0000 C 0 0 1 0 0 0 0 0 0 0 0 0 + 37.9613 12.6926 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 38.8289 12.1952 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 38.8321 11.1952 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 39.6997 10.6980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 40.5641 11.2006 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 40.5609 12.2006 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 39.6933 12.6980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 38.7651 14.2830 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 39.7173 13.9770 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 38.4531 15.2330 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 6 0 0 0 + 5 6 1 0 0 0 0 + 6 7 4 0 0 0 0 + 7 8 4 0 0 0 0 + 8 9 4 0 0 0 0 + 9 10 4 0 0 0 0 + 10 11 4 0 0 0 0 + 4 12 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 2 1 0 0 0 0 + 11 6 4 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 7 6 0 0 0 0 0 0 0 0999 V2000 + 0.8692 6.8686 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8670 5.8688 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 5.3704 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7320 5.3670 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2304 4.5020 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2304 4.5000 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5992 5.8652 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 4 7 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 7 7 0 0 0 0 0 0 0 0999 V2000 + 0.0000 0.0014 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8664 0.5008 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7320 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5984 0.4994 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5992 1.4994 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7336 2.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8672 1.5008 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 4 0 0 0 0 + 3 4 4 0 0 0 0 + 4 5 4 0 0 0 0 + 5 6 4 0 0 0 0 + 6 7 4 0 0 0 0 + 7 2 4 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 13 14 0 0 0 0 0 0 0 0999 V2000 + 10.0438 4.0398 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0930 4.3496 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8368 5.0181 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4244 5.0932 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 8.7832 3.3988 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3704 2.5893 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.7820 1.7808 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8312 2.0905 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9648 1.5912 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0992 2.0919 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1000 3.0919 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9664 3.5912 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8320 3.0905 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 + 5 6 4 0 0 0 0 + 6 7 4 0 0 0 0 + 7 8 4 0 0 0 0 + 8 9 4 0 0 0 0 + 9 10 4 0 0 0 0 + 10 11 4 0 0 0 0 + 11 12 4 0 0 0 0 + 12 13 4 0 0 0 0 + 13 5 4 0 0 0 0 + 13 8 4 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 28 30 0 0 1 0 0 0 0 0999 V2000 + 34.0202 23.7463 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 34.8858 23.2457 0.0000 C 0 0 1 0 0 0 0 0 0 0 0 0 + 35.7523 23.7451 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 35.7530 24.7451 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.8874 25.2457 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 36.6195 25.2443 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 36.6203 26.2443 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 37.4867 26.7435 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 38.3523 26.2429 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 38.3515 25.2429 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 39.3025 24.9331 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 39.8907 25.7416 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 39.3037 26.5513 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 39.6133 27.5019 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 40.5641 27.1921 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 40.3571 28.1705 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 38.9447 28.2457 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 37.4851 24.7437 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.8852 22.2457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.0189 21.7465 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.0180 20.7463 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.1517 20.2471 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.1508 19.2471 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 32.2858 20.7477 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.4196 20.2485 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 32.2867 21.7479 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.1532 22.2469 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.1538 23.2471 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 1 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 4 0 0 0 0 + 10 11 4 0 0 0 0 + 11 12 4 0 0 0 0 + 12 13 4 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 16 1 0 0 0 0 + 14 17 1 0 0 0 0 + 10 18 1 0 0 0 0 + 2 19 1 0 0 0 0 + 19 20 1 0 0 0 0 + 20 21 4 0 0 0 0 + 21 22 4 0 0 0 0 + 22 23 1 0 0 0 0 + 22 24 4 0 0 0 0 + 24 25 1 0 0 0 0 + 24 26 4 0 0 0 0 + 26 27 4 0 0 0 0 + 27 28 1 0 0 0 0 + 18 6 1 0 0 0 0 + 27 20 4 0 0 0 0 + 13 9 4 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 14 15 0 0 1 0 0 0 0 0999 V2000 + 36.8627 16.0368 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 37.4531 15.2296 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 37.1473 14.2776 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 37.9581 13.6926 0.0000 C 0 0 1 0 0 0 0 0 0 0 0 0 + 37.9613 12.6926 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 38.8289 12.1952 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 38.8321 11.1952 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 39.6997 10.6980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 40.5641 11.2006 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 40.5609 12.2006 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 39.6933 12.6980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 38.7651 14.2830 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 39.7173 13.9770 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 38.4531 15.2330 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 6 0 0 0 + 5 6 1 0 0 0 0 + 6 7 4 0 0 0 0 + 7 8 4 0 0 0 0 + 8 9 4 0 0 0 0 + 9 10 4 0 0 0 0 + 10 11 4 0 0 0 0 + 4 12 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 2 1 0 0 0 0 + 11 6 4 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 39 42 0 0 1 0 0 0 0 0999 V2000 + 50.1991 17.5551 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 51.0661 17.0569 0.0000 C 0 0 1 0 0 0 0 0 0 0 0 0 + 51.0681 16.0569 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 50.2031 15.5553 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 49.3361 16.0535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 48.4711 15.5517 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 48.4729 14.5517 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 49.3401 14.0535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 50.2051 14.5553 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 51.9311 17.5587 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 52.7981 17.0603 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 51.9291 18.5585 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 51.0621 19.0569 0.0000 C 0 0 1 0 0 0 0 0 0 0 0 0 + 50.1971 18.5551 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 49.3299 19.0535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 49.3279 20.0533 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 48.4651 18.5517 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 47.5979 19.0501 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 46.7331 18.5481 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 46.7349 17.5483 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 47.6019 17.0501 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 47.3961 16.0713 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 46.4019 15.9651 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 45.9931 16.8777 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 45.0147 17.0837 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 44.8087 16.1051 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 44.0641 16.7727 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 44.7037 18.0341 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 48.4669 17.5517 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 51.0601 20.0569 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 51.9249 20.5585 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 51.9231 21.5585 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 52.7879 22.0603 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 52.7859 23.0603 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 53.6551 21.5621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 54.5201 22.0637 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 53.6569 20.5621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 52.7921 20.0603 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 52.7941 19.0603 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 6 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 4 0 0 0 0 + 5 6 4 0 0 0 0 + 6 7 4 0 0 0 0 + 7 8 4 0 0 0 0 + 8 9 4 0 0 0 0 + 2 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 10 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 1 1 0 0 0 + 14 15 1 0 0 0 0 + 15 16 2 0 0 0 0 + 15 17 1 0 0 0 0 + 17 18 1 0 0 0 0 + 18 19 1 0 0 0 0 + 19 20 1 0 0 0 0 + 20 21 4 0 0 0 0 + 21 22 4 0 0 0 0 + 22 23 4 0 0 0 0 + 23 24 4 0 0 0 0 + 24 25 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 27 1 0 0 0 0 + 25 28 1 0 0 0 0 + 21 29 1 0 0 0 0 + 13 30 1 0 0 0 0 + 30 31 1 0 0 0 0 + 31 32 4 0 0 0 0 + 32 33 4 0 0 0 0 + 33 34 1 0 0 0 0 + 33 35 4 0 0 0 0 + 35 36 1 0 0 0 0 + 35 37 4 0 0 0 0 + 37 38 4 0 0 0 0 + 38 39 1 0 0 0 0 + 9 4 4 0 0 0 0 + 29 17 1 0 0 0 0 + 38 31 4 0 0 0 0 + 24 20 4 0 0 0 0 +M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 +$MOL + + -INDIGO-01000000002D + + 7 6 0 0 0 0 0 0 0 0999 V2000 + 0.8692 41.5189 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8670 40.5191 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 40.0207 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7320 40.0173 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2304 39.1523 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2304 39.1502 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5992 40.5154 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 4 7 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 7 7 0 0 0 0 0 0 0 0999 V2000 + 0.0000 34.6516 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8664 35.1510 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7320 34.6502 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5984 35.1496 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5992 36.1496 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7336 36.6502 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8672 36.1510 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 4 0 0 0 0 + 3 4 4 0 0 0 0 + 4 5 4 0 0 0 0 + 5 6 4 0 0 0 0 + 6 7 4 0 0 0 0 + 7 2 4 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 13 14 0 0 0 0 0 0 0 0999 V2000 + 10.0438 38.6900 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0930 38.9998 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8368 39.6684 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4244 39.7434 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 8.7832 38.0490 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3704 37.2396 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.7820 36.4310 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8312 36.7408 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9648 36.2414 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0992 36.7422 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1000 37.7422 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9664 38.2414 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8320 37.7408 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 + 5 6 4 0 0 0 0 + 6 7 4 0 0 0 0 + 7 8 4 0 0 0 0 + 8 9 4 0 0 0 0 + 9 10 4 0 0 0 0 + 10 11 4 0 0 0 0 + 11 12 4 0 0 0 0 + 12 13 4 0 0 0 0 + 13 5 4 0 0 0 0 + 13 8 4 0 0 0 0 +M END diff --git a/api/wasm/indigo-ketcher/indigo-ketcher.cpp b/api/wasm/indigo-ketcher/indigo-ketcher.cpp index a860a5a371..c3dc746c40 100644 --- a/api/wasm/indigo-ketcher/indigo-ketcher.cpp +++ b/api/wasm/indigo-ketcher/indigo-ketcher.cpp @@ -195,7 +195,7 @@ namespace indigo print_js(outputFormat.c_str()); result = _checkResultString(indigoJson(id())); } - else if (outputFormat == "sdf" || outputFormat == "chemical/x-sdf") + else if (outputFormat == "rdf" || outputFormat == "chemical/x-rdf") { auto buffer = IndigoObject(_checkResult(indigoWriteBuffer())); auto comp_it = IndigoObject(_checkResult(indigoIterateComponents(id()))); @@ -208,15 +208,16 @@ namespace indigo print_js(outputFormat.c_str()); result = _checkResultString(indigoToString(buffer.id)); } - else if (outputFormat == "rdf" || outputFormat == "chemical/x-rdf") + else if (outputFormat == "sdf" || outputFormat == "chemical/x-sdf") { auto buffer = IndigoObject(_checkResult(indigoWriteBuffer())); - auto comp_it = IndigoObject(_checkResult(indigoIterateComponents(id()))); - while (indigoHasNext(comp_it.id)) + auto reac_it = IndigoObject(_checkResult(indigoIterateReactions(id()))); + indigoRdfHeader(buffer.id); + while (indigoHasNext(reac_it.id)) { - const auto frag = IndigoObject(_checkResult(indigoNext(comp_it.id))); - const auto mol = IndigoObject(_checkResult(indigoClone(frag.id))); - indigoSdfAppend(buffer.id, mol.id); + const auto reac_obj = IndigoObject(_checkResult(indigoNext(reac_it.id))); + const auto reac = IndigoObject(_checkResult(indigoClone(reac_obj.id))); + indigoRdfAppend(buffer.id, mol.id); } print_js(outputFormat.c_str()); result = _checkResultString(indigoToString(buffer.id)); diff --git a/core/indigo-core/layout/src/reaction_layout.cpp b/core/indigo-core/layout/src/reaction_layout.cpp index 7b93f2f5c4..cd15b009f5 100644 --- a/core/indigo-core/layout/src/reaction_layout.cpp +++ b/core/indigo-core/layout/src/reaction_layout.cpp @@ -18,12 +18,12 @@ #include #include -#include "layout/reaction_layout.h" #include "layout/molecule_layout.h" +#include "layout/reaction_layout.h" #include "molecule/ket_commons.h" #include "molecule/molecule.h" -#include "reaction/reaction.h" #include "reaction/pathway_reaction_builder.h" +#include "reaction/reaction.h" #include "reaction/reaction_multistep_detector.h" using namespace indigo; @@ -42,25 +42,37 @@ void ReactionLayout::fixLayout() if (arrows_count > 1 || simple_count) return; - Vec2f rmax{Vec2f::min_coord(), Vec2f::min_coord()}, pmin{Vec2f::max_coord(), Vec2f::max_coord()}; Rect2f bb; // Calculate rightTop of reactant bounding box - + bool invalid_layout = false; + float cur_left = 0, cur_right = 0; for (int i = _r.reactantBegin(); i != _r.reactantEnd(); i = _r.reactantNext(i)) { _r.getBaseMolecule(i).getBoundingBox(bb); - rmax.max(bb.rightTop()); + if (i == 0 || (bb.left() > cur_left && bb.right() > cur_right)) + { + cur_left = bb.left(); + cur_right = bb.right(); + } + else + invalid_layout = true; } // Calculate leftBottom of product bounding box for (int i = _r.productBegin(); i != _r.productEnd(); i = _r.productNext(i)) { _r.getBaseMolecule(i).getBoundingBox(bb); - pmin.min(bb.leftBottom()); + if (bb.left() > cur_left && bb.right() > cur_right) + { + cur_left = bb.left(); + cur_right = bb.right(); + } + else + invalid_layout = true; } // if left side of product bb at left of right side of reactant bb - fix layout - if (rmax.x > pmin.x) + if (invalid_layout) { ReactionLayout rl(_r, true); rl.preserve_molecule_layout = true; diff --git a/core/indigo-core/reaction/base_reaction.h b/core/indigo-core/reaction/base_reaction.h index fd8b8c03ea..85b34d8599 100644 --- a/core/indigo-core/reaction/base_reaction.h +++ b/core/indigo-core/reaction/base_reaction.h @@ -198,11 +198,13 @@ namespace indigo virtual int reactionBegin() { - return _reactionBlocks.size() ? 0 : 1; + return 0; } virtual int reactionEnd() { + if (_reactionBlocks.size() == 0) + return 1; return _reactionBlocks.size(); } diff --git a/core/indigo-core/reaction/pathway_reaction.h b/core/indigo-core/reaction/pathway_reaction.h index 707fcf1fe4..df74605d3a 100644 --- a/core/indigo-core/reaction/pathway_reaction.h +++ b/core/indigo-core/reaction/pathway_reaction.h @@ -86,7 +86,12 @@ namespace indigo std::unique_ptr getBaseReaction(int index) override { - std::unique_ptr reaction; + std::unique_ptr reaction(new Reaction()); + auto& sr = _reactions[index]; + for (auto pidx : sr.productIndexes) + reaction->addProductCopy(*_molecules[pidx],0,0); + for (auto ridx : sr.reactantIndexes) + reaction->addReactantCopy(*_molecules[ridx], 0, 0); return reaction; } @@ -211,6 +216,22 @@ namespace indigo void clone(PathwayReaction&); BaseReaction* neu() override; bool aromatize(const AromaticityOptions& options) override; + + int reactionBegin() override + { + return _reactions.size() ? 0 : 1; + } + + int reactionEnd() override + { + return _reactions.size(); + } + + int reactionNext(int i) override + { + return ++i; + } + DECL_ERROR; protected: diff --git a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp index d96bfd8e4d..aba7a3193c 100644 --- a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp +++ b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp @@ -591,62 +591,65 @@ void ReactionMultistepDetector::constructMultipleArrowReaction(BaseReaction& rxn for (int i = 0; i < _component_summ_blocks.size(); ++i) { auto& csb = _component_summ_blocks[i]; - auto& rb = rxn.addReactionBlock(); - for (auto idx : csb.indexes) + if (csb.indexes.size() && csb.role != BaseReaction::PRODUCT) { - auto& rc = _reaction_components[idx]; - int mol_idx = -1; - auto it_copied = copied_components.find(idx); - if (it_copied != copied_components.end()) - mol_idx = it_copied->second; - switch (csb.role) + auto& rb = rxn.addReactionBlock(); + for (auto idx : csb.indexes) { - case BaseReaction::INTERMEDIATE: - if (mol_idx < 0) - { - mol_idx = rxn.addIntermediateCopy(*rc.molecule, 0, 0); - copied_components.emplace(idx, mol_idx); - } - rb.reactants.push(mol_idx); - break; - case BaseReaction::REACTANT: - if (mol_idx < 0) + auto& rc = _reaction_components[idx]; + int mol_idx = -1; + auto it_copied = copied_components.find(idx); + if (it_copied != copied_components.end()) + mol_idx = it_copied->second; + switch (csb.role) { - mol_idx = rxn.addReactantCopy(*rc.molecule, 0, 0); - copied_components.emplace(idx, mol_idx); + case BaseReaction::INTERMEDIATE: + if (mol_idx < 0) + { + mol_idx = rxn.addIntermediateCopy(*rc.molecule, 0, 0); + copied_components.emplace(idx, mol_idx); + } + rb.reactants.push(mol_idx); + break; + case BaseReaction::REACTANT: + if (mol_idx < 0) + { + mol_idx = rxn.addReactantCopy(*rc.molecule, 0, 0); + copied_components.emplace(idx, mol_idx); + } + rb.reactants.push(mol_idx); + break; + case BaseReaction::UNDEFINED: + copied_components.emplace(idx, rxn.addUndefinedCopy(*rc.molecule, 0, 0)); + break; + default: + // skip products here + break; } - rb.reactants.push(mol_idx); - break; - case BaseReaction::UNDEFINED: - copied_components.emplace(idx, rxn.addUndefinedCopy(*rc.molecule, 0, 0)); - break; - default: - // skip products here - break; } - } - for (auto csb_index : csb.arrows_to) - { - auto& csb_product = _component_summ_blocks[csb_index]; - for (auto pidx : csb_product.indexes) + for (auto csb_index : csb.arrows_to) { - auto& rc = _reaction_components[pidx]; - auto it_copied = copied_components.find(pidx); - int mol_idx = -1; - if (it_copied != copied_components.end()) + auto& csb_product = _component_summ_blocks[csb_index]; + for (auto pidx : csb_product.indexes) { - mol_idx = it_copied->second; - } - else - { - if (csb_product.role == BaseReaction::PRODUCT) - mol_idx = rxn.addProductCopy(*rc.molecule, 0, 0); - else if (csb_product.role == BaseReaction::INTERMEDIATE) - mol_idx = rxn.addIntermediateCopy(*rc.molecule, 0, 0); - copied_components.emplace(pidx, mol_idx); + auto& rc = _reaction_components[pidx]; + auto it_copied = copied_components.find(pidx); + int mol_idx = -1; + if (it_copied != copied_components.end()) + { + mol_idx = it_copied->second; + } + else + { + if (csb_product.role == BaseReaction::PRODUCT) + mol_idx = rxn.addProductCopy(*rc.molecule, 0, 0); + else if (csb_product.role == BaseReaction::INTERMEDIATE) + mol_idx = rxn.addIntermediateCopy(*rc.molecule, 0, 0); + copied_components.emplace(pidx, mol_idx); + } + rb.products.push(mol_idx); } - rb.products.push(mol_idx); } } } diff --git a/utils/indigo-depict/main.c b/utils/indigo-depict/main.c index c2cd27f850..970a0723cf 100644 --- a/utils/indigo-depict/main.c +++ b/utils/indigo-depict/main.c @@ -1058,7 +1058,7 @@ int main(int argc, char* argv[]) _prepare(obj, p.aromatization); if (p.action == ACTION_LAYOUT) { - indigoLayout(obj); + // indigoLayout(obj); if (p.out_ext == OEXT_CML) indigoSaveCmlToFile(obj, p.outfile); else if (p.out_ext == OEXT_RXN) @@ -1088,6 +1088,19 @@ int main(int argc, char* argv[]) return -1; } } + else if (p.out_ext == OEXT_RDR) + { + writer = indigoWriteFile(p.outfile); + indigoRdfHeader(writer); + auto it_id = indigoIterateReactions(obj); + while (indigoHasNext(it_id)) + { + const auto robj = indigoNext(it_id); + const auto rxn_id = indigoClone(robj); + auto rc = indigoRdfAppend(writer, rxn_id); + } + indigoFree(writer); + } else { indigoSaveJsonToFile(obj, p.outfile); diff --git a/utils/indigo-service/backend/service/v2/indigo_api.py b/utils/indigo-service/backend/service/v2/indigo_api.py index 477d11a586..c14f8953f2 100644 --- a/utils/indigo-service/backend/service/v2/indigo_api.py +++ b/utils/indigo-service/backend/service/v2/indigo_api.py @@ -456,6 +456,14 @@ def save_moldata( sdfSaver.append(frag.clone()) sdfSaver.close() return buffer.toString() + elif output_format == "chemical/x-rdf": + buffer = indigo.writeBuffer() + rdfSaver = indigo.createSaver(buffer, "rdf") + buffer.rdfHeader() + for reac in md.struct.iterateReactions(): + rdfSaver.append(reac.clone()) + rdfSaver.close() + return buffer.toString() raise HttpException("Format %s is not supported" % output_format, 400) From 85a06f2f8aabe51eae2e858d5421312f13ae3367 Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Sun, 15 Sep 2024 23:28:26 +0200 Subject: [PATCH 05/30] all fixed --- .../integration/tests/formats/ref/synthia.rdf | 979 ------------------ .../layout/src/reaction_layout.cpp | 13 +- .../src/reaction_multistep_detector.cpp | 2 +- utils/indigo-depict/main.c | 2 +- 4 files changed, 10 insertions(+), 986 deletions(-) delete mode 100644 api/tests/integration/tests/formats/ref/synthia.rdf diff --git a/api/tests/integration/tests/formats/ref/synthia.rdf b/api/tests/integration/tests/formats/ref/synthia.rdf deleted file mode 100644 index 82cf40cb3e..0000000000 --- a/api/tests/integration/tests/formats/ref/synthia.rdf +++ /dev/null @@ -1,979 +0,0 @@ -$RDFILE 1 -$DATM 01/00/00 00:00 -$RDFILE 1 -$DATM 01/00/00 00:00 -$RFMT -$RXN - - -INDIGO- 0100000000 - - 2 1 -$MOL - - -INDIGO-01000000002D - - 7 6 0 0 0 0 0 0 0 0999 V2000 - 0.8692 33.1502 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.8670 32.1505 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 31.6521 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.7320 31.6487 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.2304 30.7836 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2304 30.7817 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 2.5992 32.1469 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 6 1 0 0 0 0 - 4 7 1 0 0 0 0 -M END -$MOL - - -INDIGO-01000000002D - - 7 7 0 0 0 0 0 0 0 0999 V2000 - 0.0000 26.2831 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 0.8664 26.7825 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.7320 26.2817 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.5984 26.7811 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.5992 27.7811 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.7336 28.2817 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.8672 27.7825 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 4 0 0 0 0 - 3 4 4 0 0 0 0 - 4 5 4 0 0 0 0 - 5 6 4 0 0 0 0 - 6 7 4 0 0 0 0 - 7 2 4 0 0 0 0 -M END -$MOL - - -INDIGO-01000000002D - - 13 14 0 0 0 0 0 0 0 0999 V2000 - 10.0438 30.3214 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 9.0930 30.6312 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.8368 31.2998 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 8.4244 31.3748 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 8.7832 29.6804 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.3704 28.8710 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 8.7820 28.0624 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 7.8312 28.3722 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9648 27.8728 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.0992 28.3736 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 6.1000 29.3736 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9664 29.8728 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.8320 29.3722 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 4 1 0 0 0 0 - 2 5 1 0 0 0 0 - 5 6 4 0 0 0 0 - 6 7 4 0 0 0 0 - 7 8 4 0 0 0 0 - 8 9 4 0 0 0 0 - 9 10 4 0 0 0 0 - 10 11 4 0 0 0 0 - 11 12 4 0 0 0 0 - 12 13 4 0 0 0 0 - 13 5 4 0 0 0 0 - 13 8 4 0 0 0 0 -M END -$RFMT -$RXN - - -INDIGO- 0100000000 - - 2 1 -$MOL - - -INDIGO-01000000002D - - 10 10 0 0 0 0 0 0 0 0999 V2000 - 6.5782 21.2471 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 7.4446 21.7463 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.3102 21.2457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.1766 21.7451 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.0422 21.2443 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 9.1774 22.7451 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.0438 23.2443 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 - 8.3118 23.2457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.4454 22.7463 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.5798 23.2471 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 4 0 0 0 0 - 3 4 4 0 0 0 0 - 4 5 1 0 0 0 0 - 4 6 4 0 0 0 0 - 6 7 1 0 0 0 0 - 6 8 4 0 0 0 0 - 8 9 4 0 0 0 0 - 9 10 1 0 0 0 0 - 9 2 4 0 0 0 0 -M END -$MOL - - -INDIGO-01000000002D - - 4 3 0 0 0 0 0 0 0 0999 V2000 - 10.0438 18.7429 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.1774 18.2435 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.3118 18.7443 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.4454 18.2449 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 -M END -$MOL - - -INDIGO-01000000002D - - 12 12 0 0 0 0 0 0 0 0999 V2000 - 13.5438 21.3670 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 14.4102 20.8678 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 15.2758 21.3684 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 16.1422 20.8692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 17.0078 21.3698 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 17.8744 20.8706 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 18.7398 21.3712 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 17.8752 19.8704 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 18.7414 19.3712 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 17.0094 19.3700 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 16.1430 19.8692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 15.2774 19.3684 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 4 0 0 0 0 - 5 6 4 0 0 0 0 - 6 7 1 0 0 0 0 - 6 8 4 0 0 0 0 - 8 9 1 0 0 0 0 - 8 10 4 0 0 0 0 - 10 11 4 0 0 0 0 - 11 12 1 0 0 0 0 - 11 4 4 0 0 0 0 -M END -$RFMT -$RXN - - -INDIGO- 0100000000 - - 1 1 -$MOL - - -INDIGO-01000000002D - - 13 14 0 0 0 0 0 0 0 0999 V2000 - 10.0438 30.3214 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 9.0930 30.6312 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.8368 31.2998 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 8.4244 31.3748 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 8.7832 29.6804 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.3704 28.8710 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 8.7820 28.0624 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 7.8312 28.3722 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9648 27.8728 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.0992 28.3736 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 6.1000 29.3736 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9664 29.8728 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.8320 29.3722 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 4 1 0 0 0 0 - 2 5 1 0 0 0 0 - 5 6 4 0 0 0 0 - 6 7 4 0 0 0 0 - 7 8 4 0 0 0 0 - 8 9 4 0 0 0 0 - 9 10 4 0 0 0 0 - 10 11 4 0 0 0 0 - 11 12 4 0 0 0 0 - 12 13 4 0 0 0 0 - 13 5 4 0 0 0 0 - 13 8 4 0 0 0 0 -M END -$MOL - - -INDIGO-01000000002D - - 13 14 0 0 0 0 0 0 0 0999 V2000 - 18.7414 30.3214 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 17.7906 30.6312 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 18.5344 31.2998 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 17.1220 31.3748 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 17.4808 29.6804 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 18.0680 28.8710 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 17.4796 28.0624 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 16.5288 28.3722 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 16.5296 29.3722 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 15.6640 29.8728 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 14.7976 29.3736 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 14.7968 28.3736 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 15.6624 27.8728 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 4 1 0 0 0 0 - 2 5 1 0 0 0 0 - 5 6 4 0 0 0 0 - 6 7 4 0 0 0 0 - 7 8 4 0 0 0 0 - 8 9 4 0 0 0 0 - 9 10 1 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 1 0 0 0 0 - 12 13 1 0 0 0 0 - 9 5 4 0 0 0 0 - 13 8 1 0 0 0 0 -M END -$RFMT -$RXN - - -INDIGO- 0100000000 - - 2 1 -$MOL - - -INDIGO-01000000002D - - 13 14 0 0 0 0 0 0 0 0999 V2000 - 18.7414 30.3214 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 17.7906 30.6312 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 18.5344 31.2998 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 17.1220 31.3748 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 17.4808 29.6804 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 18.0680 28.8710 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 17.4796 28.0624 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 16.5288 28.3722 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 16.5296 29.3722 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 15.6640 29.8728 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 14.7976 29.3736 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 14.7968 28.3736 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 15.6624 27.8728 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 4 1 0 0 0 0 - 2 5 1 0 0 0 0 - 5 6 4 0 0 0 0 - 6 7 4 0 0 0 0 - 7 8 4 0 0 0 0 - 8 9 4 0 0 0 0 - 9 10 1 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 1 0 0 0 0 - 12 13 1 0 0 0 0 - 9 5 4 0 0 0 0 - 13 8 1 0 0 0 0 -M END -$MOL - - -INDIGO-01000000002D - - 5 4 0 0 0 0 0 0 0 0999 V2000 - 17.8724 25.3728 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 17.8744 24.3728 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 18.7414 23.8746 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 17.0094 23.8712 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 16.1424 24.3694 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 4 1 0 0 0 0 - 4 5 1 0 0 0 0 -M END -$MOL - - -INDIGO-01000000002D - - 17 18 0 0 0 0 0 0 0 0999 V2000 - 22.2430 26.6229 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 23.1086 26.1221 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 23.1078 25.1221 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 22.2414 24.6229 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 - 23.9750 26.6215 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 23.9758 27.6215 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 24.8422 28.1207 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 25.7078 27.6201 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 25.7070 26.6201 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 26.6580 26.3103 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 27.2460 27.1189 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 26.6592 27.9285 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 26.9688 28.8791 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 27.9196 28.5693 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 27.7126 29.5477 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 26.3002 29.6229 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 24.8406 26.1209 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 2 5 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 4 0 0 0 0 - 9 10 4 0 0 0 0 - 10 11 4 0 0 0 0 - 11 12 4 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 1 0 0 0 0 - 13 15 1 0 0 0 0 - 13 16 1 0 0 0 0 - 9 17 1 0 0 0 0 - 17 5 1 0 0 0 0 - 12 8 4 0 0 0 0 -M END -$RFMT -$RXN - - -INDIGO- 0100000000 - - 1 1 -$MOL - - -INDIGO-01000000002D - - 12 12 0 0 0 0 0 0 0 0999 V2000 - 13.5438 21.3670 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 14.4102 20.8678 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 15.2758 21.3684 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 16.1422 20.8692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 17.0078 21.3698 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 17.8744 20.8706 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 18.7398 21.3712 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 17.8752 19.8704 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 18.7414 19.3712 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 17.0094 19.3700 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 16.1430 19.8692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 15.2774 19.3684 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 4 0 0 0 0 - 5 6 4 0 0 0 0 - 6 7 1 0 0 0 0 - 6 8 4 0 0 0 0 - 8 9 1 0 0 0 0 - 8 10 4 0 0 0 0 - 10 11 4 0 0 0 0 - 11 12 1 0 0 0 0 - 11 4 4 0 0 0 0 -M END -$MOL - - -INDIGO-01000000002D - - 12 12 0 0 0 0 0 0 0 0999 V2000 - 22.7220 21.3670 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 23.5884 20.8678 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 24.4540 21.3684 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 25.3204 20.8692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 26.1860 21.3698 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 27.0526 20.8706 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 27.9180 21.3712 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 27.0534 19.8704 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 27.9196 19.3712 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 26.1876 19.3700 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 25.3212 19.8692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 24.4556 19.3684 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 4 0 0 0 0 - 5 6 4 0 0 0 0 - 6 7 1 0 0 0 0 - 6 8 4 0 0 0 0 - 8 9 1 0 0 0 0 - 8 10 4 0 0 0 0 - 10 11 4 0 0 0 0 - 11 12 1 0 0 0 0 - 11 4 4 0 0 0 0 -M END -$RFMT -$RXN - - -INDIGO- 0100000000 - - 2 1 -$MOL - - -INDIGO-01000000002D - - 17 18 0 0 0 0 0 0 0 0999 V2000 - 22.2430 26.6229 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 23.1086 26.1221 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 23.1078 25.1221 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 22.2414 24.6229 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 - 23.9750 26.6215 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 23.9758 27.6215 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 24.8422 28.1207 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 25.7078 27.6201 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 25.7070 26.6201 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 26.6580 26.3103 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 27.2460 27.1189 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 26.6592 27.9285 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 26.9688 28.8791 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 27.9196 28.5693 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 27.7126 29.5477 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 26.3002 29.6229 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 24.8406 26.1209 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 2 5 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 4 0 0 0 0 - 9 10 4 0 0 0 0 - 10 11 4 0 0 0 0 - 11 12 4 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 1 0 0 0 0 - 13 15 1 0 0 0 0 - 13 16 1 0 0 0 0 - 9 17 1 0 0 0 0 - 17 5 1 0 0 0 0 - 12 8 4 0 0 0 0 -M END -$MOL - - -INDIGO-01000000002D - - 12 12 0 0 0 0 0 0 0 0999 V2000 - 22.7220 21.3670 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 23.5884 20.8678 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 24.4540 21.3684 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 25.3204 20.8692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 26.1860 21.3698 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 27.0526 20.8706 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 27.9180 21.3712 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 27.0534 19.8704 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 27.9196 19.3712 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 26.1876 19.3700 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 25.3212 19.8692 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 24.4556 19.3684 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 4 0 0 0 0 - 5 6 4 0 0 0 0 - 6 7 1 0 0 0 0 - 6 8 4 0 0 0 0 - 8 9 1 0 0 0 0 - 8 10 4 0 0 0 0 - 10 11 4 0 0 0 0 - 11 12 1 0 0 0 0 - 11 4 4 0 0 0 0 -M END -$MOL - - -INDIGO-01000000002D - - 28 30 0 0 1 0 0 0 0 0999 V2000 - 34.0202 23.7463 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 34.8858 23.2457 0.0000 C 0 0 1 0 0 0 0 0 0 0 0 0 - 35.7523 23.7451 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 35.7530 24.7451 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 34.8874 25.2457 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 36.6195 25.2443 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 36.6203 26.2443 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 37.4867 26.7435 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 38.3523 26.2429 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 38.3515 25.2429 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 39.3025 24.9331 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 39.8907 25.7416 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 39.3037 26.5513 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 39.6133 27.5019 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 40.5641 27.1921 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 40.3571 28.1705 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 38.9447 28.2457 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 37.4851 24.7437 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 34.8852 22.2457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 34.0189 21.7465 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 34.0180 20.7463 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 33.1517 20.2471 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 33.1508 19.2471 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 32.2858 20.7477 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 31.4196 20.2485 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 32.2867 21.7479 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 33.1532 22.2469 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 33.1538 23.2471 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 2 1 1 1 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 6 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 4 0 0 0 0 - 10 11 4 0 0 0 0 - 11 12 4 0 0 0 0 - 12 13 4 0 0 0 0 - 13 14 1 0 0 0 0 - 14 15 1 0 0 0 0 - 14 16 1 0 0 0 0 - 14 17 1 0 0 0 0 - 10 18 1 0 0 0 0 - 2 19 1 0 0 0 0 - 19 20 1 0 0 0 0 - 20 21 4 0 0 0 0 - 21 22 4 0 0 0 0 - 22 23 1 0 0 0 0 - 22 24 4 0 0 0 0 - 24 25 1 0 0 0 0 - 24 26 4 0 0 0 0 - 26 27 4 0 0 0 0 - 27 28 1 0 0 0 0 - 18 6 1 0 0 0 0 - 27 20 4 0 0 0 0 - 13 9 4 0 0 0 0 -M END -$RFMT -$RXN - - -INDIGO- 0100000000 - - 2 1 -$MOL - - -INDIGO-01000000002D - - 12 11 0 0 0 0 0 0 0 0999 V2000 - 25.3226 16.8684 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 25.3220 15.8684 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 26.1876 15.3678 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 27.0540 15.8670 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 26.5546 16.7334 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 27.5546 16.7326 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 27.9196 15.3664 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 24.4556 15.3692 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 23.5900 15.8698 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 24.0906 16.7354 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 23.0906 16.7362 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 22.7236 15.3706 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 6 1 0 0 0 0 - 4 7 1 0 0 0 0 - 2 8 1 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 1 0 0 0 0 - 9 11 1 0 0 0 0 - 9 12 1 0 0 0 0 -M END -$MOL - - -INDIGO-01000000002D - - 12 12 0 0 1 0 0 0 0 0999 V2000 - 25.3220 9.3672 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 26.1876 9.8678 0.0000 C 0 0 1 0 0 0 0 0 0 0 0 0 - 26.1868 10.8678 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 25.3204 11.3670 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 25.3196 12.3672 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 24.4532 12.8664 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 23.5876 12.3658 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 23.5884 11.3658 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 24.4548 10.8666 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 27.0540 9.3686 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 27.9196 9.8692 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 27.0548 8.3686 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2 1 1 1 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 4 0 0 0 0 - 5 6 4 0 0 0 0 - 6 7 4 0 0 0 0 - 7 8 4 0 0 0 0 - 8 9 4 0 0 0 0 - 2 10 1 0 0 0 0 - 10 11 2 0 0 0 0 - 10 12 1 0 0 0 0 - 9 4 4 0 0 0 0 -M END -$MOL - - -INDIGO-01000000002D - - 14 15 0 0 1 0 0 0 0 0999 V2000 - 36.8627 16.0368 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 37.4531 15.2296 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 37.1473 14.2776 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 37.9581 13.6926 0.0000 C 0 0 1 0 0 0 0 0 0 0 0 0 - 37.9613 12.6926 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 38.8289 12.1952 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 38.8321 11.1952 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 39.6997 10.6980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 40.5641 11.2006 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 40.5609 12.2006 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 39.6933 12.6980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 38.7651 14.2830 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 39.7173 13.9770 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 38.4531 15.2330 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 1 6 0 0 0 - 5 6 1 0 0 0 0 - 6 7 4 0 0 0 0 - 7 8 4 0 0 0 0 - 8 9 4 0 0 0 0 - 9 10 4 0 0 0 0 - 10 11 4 0 0 0 0 - 4 12 1 0 0 0 0 - 12 13 2 0 0 0 0 - 12 14 1 0 0 0 0 - 14 2 1 0 0 0 0 - 11 6 4 0 0 0 0 -M END -$RFMT -$RXN - - -INDIGO- 0100000000 - - 2 1 -$MOL - - -INDIGO-01000000002D - - 7 6 0 0 0 0 0 0 0 0999 V2000 - 0.8692 6.8686 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.8670 5.8688 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 5.3704 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.7320 5.3670 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.2304 4.5020 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2304 4.5000 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 2.5992 5.8652 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 6 1 0 0 0 0 - 4 7 1 0 0 0 0 -M END -$MOL - - -INDIGO-01000000002D - - 7 7 0 0 0 0 0 0 0 0999 V2000 - 0.0000 0.0014 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 0.8664 0.5008 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.7320 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.5984 0.4994 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.5992 1.4994 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.7336 2.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.8672 1.5008 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 4 0 0 0 0 - 3 4 4 0 0 0 0 - 4 5 4 0 0 0 0 - 5 6 4 0 0 0 0 - 6 7 4 0 0 0 0 - 7 2 4 0 0 0 0 -M END -$MOL - - -INDIGO-01000000002D - - 13 14 0 0 0 0 0 0 0 0999 V2000 - 10.0438 4.0398 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 9.0930 4.3496 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.8368 5.0181 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 8.4244 5.0932 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 8.7832 3.3988 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.3704 2.5893 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 8.7820 1.7808 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 7.8312 2.0905 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9648 1.5912 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.0992 2.0919 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 6.1000 3.0919 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9664 3.5912 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.8320 3.0905 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 4 1 0 0 0 0 - 2 5 1 0 0 0 0 - 5 6 4 0 0 0 0 - 6 7 4 0 0 0 0 - 7 8 4 0 0 0 0 - 8 9 4 0 0 0 0 - 9 10 4 0 0 0 0 - 10 11 4 0 0 0 0 - 11 12 4 0 0 0 0 - 12 13 4 0 0 0 0 - 13 5 4 0 0 0 0 - 13 8 4 0 0 0 0 -M END -$RFMT -$RXN - - -INDIGO- 0100000000 - - 2 1 -$MOL - - -INDIGO-01000000002D - - 28 30 0 0 1 0 0 0 0 0999 V2000 - 34.0202 23.7463 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 34.8858 23.2457 0.0000 C 0 0 1 0 0 0 0 0 0 0 0 0 - 35.7523 23.7451 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 35.7530 24.7451 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 34.8874 25.2457 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 36.6195 25.2443 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 36.6203 26.2443 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 37.4867 26.7435 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 38.3523 26.2429 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 38.3515 25.2429 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 39.3025 24.9331 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 39.8907 25.7416 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 39.3037 26.5513 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 39.6133 27.5019 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 40.5641 27.1921 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 40.3571 28.1705 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 38.9447 28.2457 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 37.4851 24.7437 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 34.8852 22.2457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 34.0189 21.7465 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 34.0180 20.7463 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 33.1517 20.2471 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 33.1508 19.2471 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 32.2858 20.7477 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 31.4196 20.2485 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 32.2867 21.7479 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 33.1532 22.2469 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 33.1538 23.2471 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 2 1 1 1 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 6 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 4 0 0 0 0 - 10 11 4 0 0 0 0 - 11 12 4 0 0 0 0 - 12 13 4 0 0 0 0 - 13 14 1 0 0 0 0 - 14 15 1 0 0 0 0 - 14 16 1 0 0 0 0 - 14 17 1 0 0 0 0 - 10 18 1 0 0 0 0 - 2 19 1 0 0 0 0 - 19 20 1 0 0 0 0 - 20 21 4 0 0 0 0 - 21 22 4 0 0 0 0 - 22 23 1 0 0 0 0 - 22 24 4 0 0 0 0 - 24 25 1 0 0 0 0 - 24 26 4 0 0 0 0 - 26 27 4 0 0 0 0 - 27 28 1 0 0 0 0 - 18 6 1 0 0 0 0 - 27 20 4 0 0 0 0 - 13 9 4 0 0 0 0 -M END -$MOL - - -INDIGO-01000000002D - - 14 15 0 0 1 0 0 0 0 0999 V2000 - 36.8627 16.0368 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 37.4531 15.2296 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 37.1473 14.2776 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 37.9581 13.6926 0.0000 C 0 0 1 0 0 0 0 0 0 0 0 0 - 37.9613 12.6926 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 38.8289 12.1952 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 38.8321 11.1952 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 39.6997 10.6980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 40.5641 11.2006 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 40.5609 12.2006 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 39.6933 12.6980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 38.7651 14.2830 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 39.7173 13.9770 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 38.4531 15.2330 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 1 6 0 0 0 - 5 6 1 0 0 0 0 - 6 7 4 0 0 0 0 - 7 8 4 0 0 0 0 - 8 9 4 0 0 0 0 - 9 10 4 0 0 0 0 - 10 11 4 0 0 0 0 - 4 12 1 0 0 0 0 - 12 13 2 0 0 0 0 - 12 14 1 0 0 0 0 - 14 2 1 0 0 0 0 - 11 6 4 0 0 0 0 -M END -$MOL - - -INDIGO-01000000002D - - 39 42 0 0 1 0 0 0 0 0999 V2000 - 50.1991 17.5551 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 51.0661 17.0569 0.0000 C 0 0 1 0 0 0 0 0 0 0 0 0 - 51.0681 16.0569 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 50.2031 15.5553 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 49.3361 16.0535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 48.4711 15.5517 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 48.4729 14.5517 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 49.3401 14.0535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 50.2051 14.5553 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 51.9311 17.5587 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 52.7981 17.0603 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 51.9291 18.5585 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 51.0621 19.0569 0.0000 C 0 0 1 0 0 0 0 0 0 0 0 0 - 50.1971 18.5551 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 49.3299 19.0535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 49.3279 20.0533 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 48.4651 18.5517 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 47.5979 19.0501 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 46.7331 18.5481 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 46.7349 17.5483 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 47.6019 17.0501 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 47.3961 16.0713 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 46.4019 15.9651 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 45.9931 16.8777 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 45.0147 17.0837 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 44.8087 16.1051 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 44.0641 16.7727 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 44.7037 18.0341 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 48.4669 17.5517 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 51.0601 20.0569 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 51.9249 20.5585 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 51.9231 21.5585 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 52.7879 22.0603 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 52.7859 23.0603 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 53.6551 21.5621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 54.5201 22.0637 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 53.6569 20.5621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 52.7921 20.0603 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 52.7941 19.0603 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 2 1 1 6 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 4 0 0 0 0 - 5 6 4 0 0 0 0 - 6 7 4 0 0 0 0 - 7 8 4 0 0 0 0 - 8 9 4 0 0 0 0 - 2 10 1 0 0 0 0 - 10 11 2 0 0 0 0 - 10 12 1 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 1 1 0 0 0 - 14 15 1 0 0 0 0 - 15 16 2 0 0 0 0 - 15 17 1 0 0 0 0 - 17 18 1 0 0 0 0 - 18 19 1 0 0 0 0 - 19 20 1 0 0 0 0 - 20 21 4 0 0 0 0 - 21 22 4 0 0 0 0 - 22 23 4 0 0 0 0 - 23 24 4 0 0 0 0 - 24 25 1 0 0 0 0 - 25 26 1 0 0 0 0 - 25 27 1 0 0 0 0 - 25 28 1 0 0 0 0 - 21 29 1 0 0 0 0 - 13 30 1 0 0 0 0 - 30 31 1 0 0 0 0 - 31 32 4 0 0 0 0 - 32 33 4 0 0 0 0 - 33 34 1 0 0 0 0 - 33 35 4 0 0 0 0 - 35 36 1 0 0 0 0 - 35 37 4 0 0 0 0 - 37 38 4 0 0 0 0 - 38 39 1 0 0 0 0 - 9 4 4 0 0 0 0 - 29 17 1 0 0 0 0 - 38 31 4 0 0 0 0 - 24 20 4 0 0 0 0 -M END -$RFMT -$RXN - - -INDIGO- 0100000000 - - 2 1 -$MOL - - -INDIGO-01000000002D - - 7 6 0 0 0 0 0 0 0 0999 V2000 - 0.8692 41.5189 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.8670 40.5191 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 40.0207 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.7320 40.0173 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.2304 39.1523 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2304 39.1502 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 2.5992 40.5154 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 6 1 0 0 0 0 - 4 7 1 0 0 0 0 -M END -$MOL - - -INDIGO-01000000002D - - 7 7 0 0 0 0 0 0 0 0999 V2000 - 0.0000 34.6516 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 0.8664 35.1510 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.7320 34.6502 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.5984 35.1496 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.5992 36.1496 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.7336 36.6502 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.8672 36.1510 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 4 0 0 0 0 - 3 4 4 0 0 0 0 - 4 5 4 0 0 0 0 - 5 6 4 0 0 0 0 - 6 7 4 0 0 0 0 - 7 2 4 0 0 0 0 -M END -$MOL - - -INDIGO-01000000002D - - 13 14 0 0 0 0 0 0 0 0999 V2000 - 10.0438 38.6900 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 9.0930 38.9998 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.8368 39.6684 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 8.4244 39.7434 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 8.7832 38.0490 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.3704 37.2396 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 8.7820 36.4310 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 7.8312 36.7408 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9648 36.2414 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.0992 36.7422 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 6.1000 37.7422 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9664 38.2414 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.8320 37.7408 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 4 1 0 0 0 0 - 2 5 1 0 0 0 0 - 5 6 4 0 0 0 0 - 6 7 4 0 0 0 0 - 7 8 4 0 0 0 0 - 8 9 4 0 0 0 0 - 9 10 4 0 0 0 0 - 10 11 4 0 0 0 0 - 11 12 4 0 0 0 0 - 12 13 4 0 0 0 0 - 13 5 4 0 0 0 0 - 13 8 4 0 0 0 0 -M END diff --git a/core/indigo-core/layout/src/reaction_layout.cpp b/core/indigo-core/layout/src/reaction_layout.cpp index cd15b009f5..09098d194a 100644 --- a/core/indigo-core/layout/src/reaction_layout.cpp +++ b/core/indigo-core/layout/src/reaction_layout.cpp @@ -194,12 +194,15 @@ void ReactionLayout::makePathwayFromSimple() std::deque reactions; for (int i = 0; i < _r.reactionBlocksCount(); i++) { - auto& rc = reactions.emplace_back(); auto& rb = _r.reactionBlock(i); - for (int j = 0; j < rb.reactants.size(); j++) - rc.addReactantCopy(_r.getBaseMolecule(rb.reactants[j]), 0, 0); - for (int j = 0; j < rb.products.size(); j++) - rc.addProductCopy(_r.getBaseMolecule(rb.products[j]), 0, 0); + if (rb.products.size() || rb.reactants.size()) + { + auto& rc = reactions.emplace_back(); + for (int j = 0; j < rb.reactants.size(); j++) + rc.addReactantCopy(_r.getBaseMolecule(rb.reactants[j]), 0, 0); + for (int j = 0; j < rb.products.size(); j++) + rc.addProductCopy(_r.getBaseMolecule(rb.products[j]), 0, 0); + } } PathwayReactionBuilder prb; auto pwr = prb.buildPathwayReaction(reactions); diff --git a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp index aba7a3193c..4383e607ab 100644 --- a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp +++ b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp @@ -591,9 +591,9 @@ void ReactionMultistepDetector::constructMultipleArrowReaction(BaseReaction& rxn for (int i = 0; i < _component_summ_blocks.size(); ++i) { auto& csb = _component_summ_blocks[i]; + auto& rb = rxn.addReactionBlock(); if (csb.indexes.size() && csb.role != BaseReaction::PRODUCT) { - auto& rb = rxn.addReactionBlock(); for (auto idx : csb.indexes) { auto& rc = _reaction_components[idx]; diff --git a/utils/indigo-depict/main.c b/utils/indigo-depict/main.c index 970a0723cf..74f0c58b84 100644 --- a/utils/indigo-depict/main.c +++ b/utils/indigo-depict/main.c @@ -1058,7 +1058,7 @@ int main(int argc, char* argv[]) _prepare(obj, p.aromatization); if (p.action == ACTION_LAYOUT) { - // indigoLayout(obj); + indigoLayout(obj); if (p.out_ext == OEXT_CML) indigoSaveCmlToFile(obj, p.outfile); else if (p.out_ext == OEXT_RXN) From 165b6c602afe04118f85cf8b353210c744b85255 Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Mon, 16 Sep 2024 00:14:55 +0200 Subject: [PATCH 06/30] all fixed --- .../reaction/src/reaction_multistep_detector.cpp | 6 +++--- utils/indigo-depict/main.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp index 4383e607ab..624b7872d6 100644 --- a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp +++ b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp @@ -95,7 +95,7 @@ void ReactionMultistepDetector::createSummBlocks() int arrow_type = arrow.getArrowType(); bool reverseReactionOrder = arrow_type == KETReactionArrow::ERetrosynthetic; const Vec2f& arr_begin = !reverseReactionOrder ? arrow.getTail() : arrow.getHead(); - const Vec2f& arr_end = !reverseReactionOrder ? arrow.getTail() : arrow.getHead(); + const Vec2f& arr_end = !reverseReactionOrder ? arrow.getHead() : arrow.getTail(); Rect2f bbox(arr_begin - ARROW_BBOX_SHIFT, arr_end + ARROW_BBOX_SHIFT); _reaction_components.emplace_back(arrow_type, bbox, i, std::unique_ptr(nullptr)); _reaction_components.back().coordinates.push_back(arr_begin); @@ -460,8 +460,8 @@ bool ReactionMultistepDetector::findPlusNeighbours(const Vec2f& plus_pos, const if (rights_row_it != rights_row.end() && lefts_row_it != lefts_row.end()) { min_distance_h = std::min(std::fabs(rights_row_it->first - plus_pos_x.first), std::fabs(plus_pos_x.first - lefts_row_it->first)); - connection.first = lefts_row_it->second; - connection.second = rights_row_it->second; + connection.second = lefts_row_it->second; + connection.first = rights_row_it->second; result = _reaction_components[connection.first].component_type == ReactionComponent::MOLECULE && _reaction_components[connection.second].component_type == ReactionComponent::MOLECULE; } diff --git a/utils/indigo-depict/main.c b/utils/indigo-depict/main.c index 74f0c58b84..970a0723cf 100644 --- a/utils/indigo-depict/main.c +++ b/utils/indigo-depict/main.c @@ -1058,7 +1058,7 @@ int main(int argc, char* argv[]) _prepare(obj, p.aromatization); if (p.action == ACTION_LAYOUT) { - indigoLayout(obj); + // indigoLayout(obj); if (p.out_ext == OEXT_CML) indigoSaveCmlToFile(obj, p.outfile); else if (p.out_ext == OEXT_RXN) From bac582470cc66e743cd5872721fbf6e59e15b9d4 Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Mon, 16 Sep 2024 01:58:19 +0200 Subject: [PATCH 07/30] all fixed --- .../integration/ref/formats/ket_to_rdf.py.out | 12 ++ .../tests/basic/ref/crazystereo.ket | 108 +++++------ .../tests/formats/ket_retrosynthetic_arrow.py | 4 + .../ket_retro_arrow_and_simple_arrow.b64cdx | 2 +- .../ket_retro_arrow_and_simple_arrow.cdxml | 38 ++-- ...e_arrow_retro_arrow_sum_of_products.b64cdx | 2 +- ...le_arrow_retro_arrow_sum_of_products.cdxml | 86 ++++----- ...mple_arrow_retro_arrow_sum_of_products.cml | 26 +-- ...e_arrow_retro_arrow_sum_of_products.smarts | 2 +- ...mple_arrow_retro_arrow_sum_of_products.smi | 2 +- ...arrow_retro_arrow_sum_of_products_2000.rxn | 26 +-- ...arrow_retro_arrow_sum_of_products_3000.rxn | 28 +-- .../formats/ref/ket_two_retro_arrows.b64cdx | 2 +- .../formats/ref/ket_two_retro_arrows.cdxml | 54 +++--- .../integration/tests/formats/ref/multi.cdxml | 78 ++++---- .../integration/tests/formats/ref/multi.ket | 168 +++++++++--------- .../integration/tests/formats/ref/multi.rdf | 66 +++---- .../tests/formats/ref/multi_overlap.cdxml | 26 +-- .../tests/formats/ref/multi_overlap.ket | 58 +++--- core/indigo-core/reaction/base_reaction.h | 8 +- 20 files changed, 409 insertions(+), 387 deletions(-) create mode 100644 api/tests/integration/ref/formats/ket_to_rdf.py.out diff --git a/api/tests/integration/ref/formats/ket_to_rdf.py.out b/api/tests/integration/ref/formats/ket_to_rdf.py.out new file mode 100644 index 0000000000..8442abe18b --- /dev/null +++ b/api/tests/integration/ref/formats/ket_to_rdf.py.out @@ -0,0 +1,12 @@ +*** KET to RDF *** +multi.rdf:SUCCEED +pathway1.rdf:SUCCEED +pathway10.rdf:SUCCEED +pathway2.rdf:SUCCEED +pathway3.rdf:SUCCEED +pathway4.rdf:SUCCEED +pathway5.rdf:SUCCEED +pathway6.rdf:SUCCEED +pathway7.rdf:SUCCEED +pathway8.rdf:SUCCEED +pathway9.rdf:SUCCEED diff --git a/api/tests/integration/tests/basic/ref/crazystereo.ket b/api/tests/integration/tests/basic/ref/crazystereo.ket index bfcfd8ce1a..c9e0734e6a 100644 --- a/api/tests/integration/tests/basic/ref/crazystereo.ket +++ b/api/tests/integration/tests/basic/ref/crazystereo.ket @@ -13,13 +13,13 @@ "mode": "open-angle", "pos": [ { - "x": 7.842718124389648, - "y": 0.0, + "x": -5.879899978637695, + "y": 0.5597999691963196, "z": 0.0 }, { - "x": 12.042718887329102, - "y": 0.0, + "x": -3.7695000171661379, + "y": 0.8544500470161438, "z": 0.0 } ] @@ -33,80 +33,80 @@ { "label": "C", "location": [ - 4.071358680725098, - 0.7999899387359619, + -8.308899879455567, + 0.9722999930381776, 0.0 ] }, { "label": "C", "location": [ - 2.685678482055664, - 1.599979877471924, + -9.02340030670166, + 1.3847999572753909, 0.0 ] }, { "label": "C", "location": [ - 1.2999999523162842, - 0.7999899387359619, + -9.737899780273438, + 0.9722999930381776, 0.0 ] }, { "label": "C", "location": [ - 1.2999999523162842, - -0.7999899387359619, + -9.737899780273438, + 0.14730000495910645, 0.0 ] }, { "label": "C", "location": [ - 2.685678482055664, - -1.599979877471924, + -9.02340030670166, + -0.2651999890804291, 0.0 ] }, { "label": "C", "location": [ - 4.071358680725098, - -0.7999899387359619, + -8.308899879455567, + 0.14730000495910645, 0.0 ] }, { "label": "C", "location": [ - 5.456844329833984, - -1.599979877471924, + -7.594500064849854, + -0.2651999890804291, 0.0 ] }, { "label": "C", "location": [ - 6.842718124389648, - -0.7999899387359619, + -6.879899978637695, + 0.14730000495910645, 0.0 ] }, { "label": "C", "location": [ - 6.842718124389648, - 0.7999899387359619, + -6.879899978637695, + 0.9722999930381776, 0.0 ] }, { "label": "C", "location": [ - 5.456844329833984, - 1.599979877471924, + -7.594500064849854, + 1.3847999572753909, 0.0 ] } @@ -197,24 +197,24 @@ { "label": "C", "location": [ - 18.585243225097658, - 3.599954843521118, + 0.08839999884366989, + 2.710700035095215, 0.0 ] }, { "label": "C", "location": [ - 17.19956398010254, - 2.799964189529419, + -0.6261000037193298, + 2.2981998920440676, 0.0 ] }, { "label": "C", "location": [ - 17.19956398010254, - 1.1999847888946534, + -0.6261000037193298, + 1.4731999635696412, 0.0 ], "stereoLabel": "&1" @@ -222,32 +222,32 @@ { "label": "C", "location": [ - 18.585243225097658, - 0.3999948501586914, + 0.08839999884366989, + 1.0607000589370728, 0.0 ] }, { "label": "C", "location": [ - 19.970922470092778, - 1.1999847888946534, + 0.8029000163078308, + 1.4731999635696412, 0.0 ] }, { "label": "C", "location": [ - 19.970922470092778, - 2.799964189529419, + 0.8029000163078308, + 2.2981998920440676, 0.0 ] }, { "label": "C", "location": [ - 15.814078330993653, - 0.3999948501586914, + -1.340499997138977, + 1.0607000589370728, 0.0 ], "stereoLabel": "&1" @@ -255,64 +255,64 @@ { "label": "C", "location": [ - 14.42839813232422, - 1.1999847888946534, + -2.055000066757202, + 1.4731999635696412, 0.0 ] }, { "label": "C", "location": [ - 13.042718887329102, - 0.3999948501586914, + -2.769500017166138, + 1.0607000589370728, 0.0 ] }, { "label": "C", "location": [ - 13.042718887329102, - -1.1999850273132325, + -2.769500017166138, + 0.23569999635219578, 0.0 ] }, { "label": "C", "location": [ - 14.42839813232422, - -1.999975085258484, + -2.055000066757202, + -0.1767999976873398, 0.0 ] }, { "label": "C", "location": [ - 15.814078330993653, - -1.1999850273132325, + -1.340499997138977, + 0.23569999635219578, 0.0 ] }, { "label": "P", "location": [ - 17.19956398010254, - -1.999975085258484, + -0.6261000037193298, + -0.1767999976873398, 0.0 ] }, { "label": "C", "location": [ - 18.799543380737306, - -1.999975085258484, + 0.1988999992609024, + -0.1767999976873398, 0.0 ] }, { "label": "C", "location": [ - 17.19956398010254, - -3.599954843521118, + -0.6261000037193298, + -1.0017999410629273, 0.0 ] } diff --git a/api/tests/integration/tests/formats/ket_retrosynthetic_arrow.py b/api/tests/integration/tests/formats/ket_retrosynthetic_arrow.py index 96ba23acdb..3036ebfb2c 100644 --- a/api/tests/integration/tests/formats/ket_retrosynthetic_arrow.py +++ b/api/tests/integration/tests/formats/ket_retrosynthetic_arrow.py @@ -85,8 +85,12 @@ def getCML(reaction): print("output format: " + format_name) + # with open(os.path.join(ref_path, filename), "w") as file: + # file.write(parsed_format) + with open(os.path.join(ref_path, filename), "r") as file: format_ref = file.read() + diff = find_diff(format_ref, parsed_format) if not diff: print(filename + ":SUCCEED") diff --git a/api/tests/integration/tests/formats/ref/ket_retro_arrow_and_simple_arrow.b64cdx b/api/tests/integration/tests/formats/ref/ket_retro_arrow_and_simple_arrow.b64cdx index c53b59b060..55e479dee5 100644 --- a/api/tests/integration/tests/formats/ref/ket_retro_arrow_and_simple_arrow.b64cdx +++ b/api/tests/integration/tests/formats/ref/ket_retro_arrow_and_simple_arrow.b64cdx @@ -1 +1 @@ -VmpDRDAxMDAEAwIBAAAAAAAAAAAAAAAAAAAAAAUIBAAAAB4AGggCAAMAGwgCAAQAAAEkAAAAAgACAOn9BQBBcmlhbAMA6f0PAFRpbWVzIE5ldyBSb21hbgADMgAIAP///////wAAAAAAAP//AAAAAP////8AAAAA//8AAAAA/////wAAAAD/////AAD//wGAAAAAABAIAgABAA8IAgABAAOABAAAAASABQAAAAACCADFGc4AZATuAAAABIAGAAAAAAIIAMkZsABkBO4AAAAEgAcAAAAAAggAyxmhAFYJ1AAAAASACAAAAAIEAgAHACsEAgACAAACCADLGaEAev8HAQaAAAAAAAACCADLGaEAev8HASMIAQAAAAcZAAIAAAADAGAAyAAAAAIAAwAgAMgAAABOSDIAAAAABYAZAAAABAYEAAUAAAAFBgQABgAAAAAABYAaAAAABAYEAAYAAAAFBgQABwAAAAAABYAbAAAABAYEAAYAAAAFBgQACAAAAAAAAAADgAkAAAAEgAoAAAACBAIACAArBAIAAQAAAggAyRmwAII/fAEGgAAAAAAAAggAyRmwAII/fAEjCAEAAAAHDgABAAAAAwBgAMgAAABPSAAAAAAEgAsAAAAAAggAxxm/AGI6lgEAAASADAAAAAIEAgAIACsEAgABAAACCADJGbAAuDWwAQaAAAAAAAACCADJGbAAuDWwASMIAQAAAAcOAAEAAAADAGAAyAAAAE9IAAAAAAWAHAAAAAQGBAAKAAAABQYEAAsAAAAAAAWAHQAAAAQGBAALAAAABQYEAAwAAAAAAAAAA4ANAAAABIAOAAAAAAIIAHsEnACQ32gCAAAEgA8AAAAAAggAuqatAJgkgQIAAASAEAAAAAACCAAWL8oAgN93AgAABIARAAAAAAIIABYvygCc31kCAAAEgBIAAAAAAggAuqatAISaUAIAAAWAHgAAAAQGBAAOAAAABQYEABIAAAAAAAWAHwAAAAQGBAASAAAABQYEABEAAAAAAAWAIAAAAAQGBAARAAAABQYEABAAAAAAAAWAIQAAAAQGBAAQAAAABQYEAA8AAAAAAAWAIgAAAAQGBAAPAAAABQYEAA4AAAAAAAAAIYATAAAABAIQAMcZswDuIFcBxxmzAPRVIwE3CgIAAAA1CgIAAgAvCgIAAwAgCgIAWAIwCgIAWAIxCgIAlgAzCgIAWAIHAgwA7qBWAccZswAAAAAACAIMAPTVIwHHGbMAAAAAAAAAB4AjAAAAEwAEABMAAAAACgIAAQACCgIAIAAgCgIAWAIEAhAAxxmzAO6gVgHHGbMA9NUjAQAAIYAWAAAABAIQAG8urgD0VyQCby6uAFqT7gE3CgIAAAAvCgIAAQAgCgIAyggxCgIAMwI1CgIAAgAwCgIAGQAHAgwA9FckAm8urgAAAAAACAIMAFqT7gFvLq4AAAAAAAAADYAAAAAADoAAAAAAAQwEAAkAAAACDAQABAAAAAQMBAAjAAAAAAAOgAAAAAABDAQABAAAAAIMBAANAAAABAwEABYAAAAAAAAAAAAAAAAA \ No newline at end of file +VmpDRDAxMDAEAwIBAAAAAAAAAAAAAAAAAAAAAAUIBAAAAB4AGggCAAMAGwgCAAQAAAEkAAAAAgACAOn9BQBBcmlhbAMA6f0PAFRpbWVzIE5ldyBSb21hbgADMgAIAP///////wAAAAAAAP//AAAAAP////8AAAAA//8AAAAA/////wAAAAD/////AAD//wGAAAAAABAIAgABAA8IAgABAAOABAAAAASABQAAAAACCADFGc4AZATuAAAABIAGAAAAAAIIAMkZsABkBO4AAAAEgAcAAAAAAggAyxmhAFYJ1AAAAASACAAAAAIEAgAHACsEAgACAAACCADLGaEAev8HAQaAAAAAAAACCADLGaEAev8HASMIAQAAAAcZAAIAAAADAGAAyAAAAAIAAwAgAMgAAABOSDIAAAAABYAZAAAABAYEAAUAAAAFBgQABgAAAAAABYAaAAAABAYEAAYAAAAFBgQABwAAAAAABYAbAAAABAYEAAYAAAAFBgQACAAAAAAAAAADgAkAAAAEgAoAAAAAAggAewScAJDfaAIAAASACwAAAAACCAC6pq0AmCSBAgAABIAMAAAAAAIIABYvygCA33cCAAAEgA0AAAAAAggAFi/KAJzfWQIAAASADgAAAAACCAC6pq0AhJpQAgAABYAcAAAABAYEAAoAAAAFBgQADgAAAAAABYAdAAAABAYEAA4AAAAFBgQADQAAAAAABYAeAAAABAYEAA0AAAAFBgQADAAAAAAABYAfAAAABAYEAAwAAAAFBgQACwAAAAAABYAgAAAABAYEAAsAAAAFBgQACgAAAAAAAAADgA8AAAAEgBAAAAACBAIACAArBAIAAQAAAggAyRmwAII/fAEGgAAAAAAAAggAyRmwAII/fAEjCAEAAAAHDgABAAAAAwBgAMgAAABPSAAAAAAEgBEAAAAAAggAxxm/AGI6lgEAAASAEgAAAAIEAgAIACsEAgABAAACCADJGbAAuDWwAQaAAAAAAAACCADJGbAAuDWwASMIAQAAAAcOAAEAAAADAGAAyAAAAE9IAAAAAAWAIQAAAAQGBAAQAAAABQYEABEAAAAAAAWAIgAAAAQGBAARAAAABQYEABIAAAAAAAAAIYATAAAABAIQAMcZswDuIFcBxxmzAPRVIwE3CgIAAAA1CgIAAgAvCgIAAwAgCgIAWAIwCgIAWAIxCgIAlgAzCgIAWAIHAgwA7qBWAccZswAAAAAACAIMAPTVIwHHGbMAAAAAAAAAB4AjAAAAEwAEABMAAAAACgIAAQACCgIAIAAgCgIAWAIEAhAAxxmzAO6gVgHHGbMA9NUjAQAAIYAWAAAABAIQAG8urgD0VyQCby6uAFqT7gE3CgIAAAAvCgIAAQAgCgIAyggxCgIAMwI1CgIAAgAwCgIAGQAHAgwA9FckAm8urgAAAAAACAIMAFqT7gFvLq4AAAAAAAAADYAAAAAADoAAAAAAAQwEAAQAAAACDAQACQAAAAQMBAAjAAAAAAAOgAAAAAABDAQADwAAAAIMBAAEAAAABAwEABYAAAAAAAAAAAAAAAAA \ No newline at end of file diff --git a/api/tests/integration/tests/formats/ref/ket_retro_arrow_and_simple_arrow.cdxml b/api/tests/integration/tests/formats/ref/ket_retro_arrow_and_simple_arrow.cdxml index cc9d1881f0..58b91269bb 100644 --- a/api/tests/integration/tests/formats/ref/ket_retro_arrow_and_simple_arrow.cdxml +++ b/api/tests/integration/tests/formats/ref/ket_retro_arrow_and_simple_arrow.cdxml @@ -32,38 +32,38 @@ - + + + + + + + + + + + + + OH - - + + OH - - - - - - - - - - - - - - + + - - + + diff --git a/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.b64cdx b/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.b64cdx index 27b0d17ed1..f4810c3b78 100644 --- a/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.b64cdx +++ b/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.b64cdx @@ -1 +1 @@ -VmpDRDAxMDAEAwIBAAAAAAAAAAAAAAAAAAAAAAUIBAAAAB4AGggCAAMAGwgCAAQAAAEkAAAAAgACAOn9BQBBcmlhbAMA6f0PAFRpbWVzIE5ldyBSb21hbgADMgAIAP///////wAAAAAAAP//AAAAAP////8AAAAA//8AAAAA/////wAAAAD/////AAD//wGAAAAAABAIAgABAA8IAgABAAOABAAAAASABQAAAAACCABWawgBqHMxAQAABIAGAAAAAAIIAFpr6gCoczEBAAAEgAcAAAAAAggAW2vbAJp4FwEAAASACAAAAAIEAgAHACsEAgACAAACCABba9sAvG5LAQaAAAAAAAACCABba9sAvG5LASMIAQAAAAcZAAIAAAADAGAAyAAAAAIAAwAgAMgAAABOSDIAAAAABYAiAAAABAYEAAUAAAAFBgQABgAAAAAABYAjAAAABAYEAAYAAAAFBgQABwAAAAAABYAkAAAABAYEAAYAAAAFBgQACAAAAAAAAAADgAkAAAAEgAoAAAACBAIACAArBAIAAQAAAggAWmvqAMiuvwEGgAAAAAAAAggAWmvqAMiuvwEjCAEAAAAHDgABAAAAAwBgAMgAAABPSAAAAAAEgAsAAAAAAggAWGv5AKap2QEAAASADAAAAAIEAgAIACsEAgABAAACCABaa+oA/KTzAQaAAAAAAAACCABaa+oA/KTzASMIAQAAAAcOAAEAAAADAGAAyAAAAE9IAAAAAAWAJQAAAAQGBAAKAAAABQYEAAsAAAAAAAWAJgAAAAQGBAALAAAABQYEAAwAAAAAAAAAA4ANAAAABIAOAAAAAAIIAAtW1gDUTqwCAAAEgA8AAAAAAggAS/jnANyTxAIAAASAEAAAAAACCACogAQByE67AgAABIARAAAAAAIIAKiABAHgTp0CAAAEgBIAAAAAAggAS/jnAMgJlAIAAAWAJwAAAAQGBAAOAAAABQYEABIAAAAAAAWAKAAAAAQGBAASAAAABQYEABEAAAAAAAWAKQAAAAQGBAARAAAABQYEABAAAAAAAAWAKgAAAAQGBAAQAAAABQYEAA8AAAAAAAWAKwAAAAQGBAAPAAAABQYEAA4AAAAAAAAAA4ATAAAABIAUAAAAAAIIAGVR1gAwzxMDAAAEgBUAAAAAAggAToUEASzSIgMAAASAFgAAAAACCAA8IugAIBksAwAABIAXAAAAAAIIAE6FBAE4zAQDAAAEgBgAAAAAAggAPCLoAHyE+wIAAAWALAAAAAQGBAAUAAAABQYEABgAAAAAAAWALQAAAAQGBAAYAAAABQYEABcAAAAABgIAAgAAAAWALgAAAAQGBAAXAAAABQYEABUAAAAAAAWALwAAAAQGBAAVAAAABQYEABYAAAAABgIAAgAAAAWAMAAAAAQGBAAWAAAABQYEABQAAAAAAAAAIYAZAAAABAIQAFhr7QA0kJoBWGvtADrFZgE3CgIAAAAvCgIAAQAgCgIAyggxCgIAMwI1CgIAAgAwCgIAGQAHAgwANJCaAVhr7QAAAAAACAIMADrFZgFYa+0AAAAAAAAAIYAcAAAABAIQAP//7AD4wHAC///sAABAJwI3CgIAAAA1CgIAAgAvCgIAAwAgCgIAWAIwCgIAWAIxCgIAlgAzCgIAWAIHAgwA+EBwAv//7AAAAAAACAIMAADAJwL//+wAAAAAAAAAB4AxAAAAEwAEABwAAAAACgIAAQACCgIAIAAgCgIAWAIEAhAA///sAPhAcAL//+wAAMAnAgAAB4AfAAAABAIQAFpr+QDMjuECWuvxAMyO4QIACgIABwAHCgIACAAAAA2AAAAAAA6AAAAAAAEMBAAEAAAAAgwEAAkAAAAEDAQAGQAAAAAADoAAAAAAAQwIABMAAAANAAAAAgwEAAkAAAAEDAQAMQAAAAAAAAAAAAAAAAA= \ No newline at end of file +VmpDRDAxMDAEAwIBAAAAAAAAAAAAAAAAAAAAAAUIBAAAAB4AGggCAAMAGwgCAAQAAAEkAAAAAgACAOn9BQBBcmlhbAMA6f0PAFRpbWVzIE5ldyBSb21hbgADMgAIAP///////wAAAAAAAP//AAAAAP////8AAAAA//8AAAAA/////wAAAAD/////AAD//wGAAAAAABAIAgABAA8IAgABAAOABAAAAASABQAAAAACCAALVtYA1E6sAgAABIAGAAAAAAIIAEv45wDck8QCAAAEgAcAAAAAAggAqIAEAchOuwIAAASACAAAAAACCACogAQB4E6dAgAABIAJAAAAAAIIAEv45wDICZQCAAAFgCIAAAAEBgQABQAAAAUGBAAJAAAAAAAFgCMAAAAEBgQACQAAAAUGBAAIAAAAAAAFgCQAAAAEBgQACAAAAAUGBAAHAAAAAAAFgCUAAAAEBgQABwAAAAUGBAAGAAAAAAAFgCYAAAAEBgQABgAAAAUGBAAFAAAAAAAAAAOACgAAAASACwAAAAACCABlUdYAMM8TAwAABIAMAAAAAAIIAE6FBAEs0iIDAAAEgA0AAAAAAggAPCLoACAZLAMAAASADgAAAAACCABOhQQBOMwEAwAABIAPAAAAAAIIADwi6AB8hPsCAAAFgCcAAAAEBgQACwAAAAUGBAAPAAAAAAAFgCgAAAAEBgQADwAAAAUGBAAOAAAAAAYCAAIAAAAFgCkAAAAEBgQADgAAAAUGBAAMAAAAAAAFgCoAAAAEBgQADAAAAAUGBAANAAAAAAYCAAIAAAAFgCsAAAAEBgQADQAAAAUGBAALAAAAAAAAAAOAEAAAAASAEQAAAAIEAgAIACsEAgABAAACCABaa+oAyK6/AQaAAAAAAAACCABaa+oAyK6/ASMIAQAAAAcOAAEAAAADAGAAyAAAAE9IAAAAAASAEgAAAAACCABYa/kApqnZAQAABIATAAAAAgQCAAgAKwQCAAEAAAIIAFpr6gD8pPMBBoAAAAAAAAIIAFpr6gD8pPMBIwgBAAAABw4AAQAAAAMAYADIAAAAT0gAAAAABYAsAAAABAYEABEAAAAFBgQAEgAAAAAABYAtAAAABAYEABIAAAAFBgQAEwAAAAAAAAADgBQAAAAEgBUAAAAAAggAVmsIAahzMQEAAASAFgAAAAACCABaa+oAqHMxAQAABIAXAAAAAAIIAFtr2wCaeBcBAAAEgBgAAAACBAIABwArBAIAAgAAAggAW2vbALxuSwEGgAAAAAAAAggAW2vbALxuSwEjCAEAAAAHGQACAAAAAwBgAMgAAAACAAMAIADIAAAATkgyAAAAAAWALgAAAAQGBAAVAAAABQYEABYAAAAAAAWALwAAAAQGBAAWAAAABQYEABcAAAAAAAWAMAAAAAQGBAAWAAAABQYEABgAAAAAAAAAIYAZAAAABAIQAFhr7QA0kJoBWGvtADrFZgE3CgIAAAAvCgIAAQAgCgIAyggxCgIAMwI1CgIAAgAwCgIAGQAHAgwANJCaAVhr7QAAAAAACAIMADrFZgFYa+0AAAAAAAAAIYAcAAAABAIQAP//7AD4wHAC///sAABAJwI3CgIAAAA1CgIAAgAvCgIAAwAgCgIAWAIwCgIAWAIxCgIAlgAzCgIAWAIHAgwA+EBwAv//7AAAAAAACAIMAADAJwL//+wAAAAAAAAAB4AxAAAAEwAEABwAAAAACgIAAQACCgIAIAAgCgIAWAIEAhAA///sAPhAcAL//+wAAMAnAgAAB4AfAAAABAIQAFpr+QDMjuECWuvxAMyO4QIACgIABwAHCgIACAAAAA2AAAAAAA6AAAAAAAEMCAAEAAAACgAAAAIMBAAQAAAABAwEABkAAAAAAA6AAAAAAAEMBAAUAAAAAgwEABAAAAAEDAQAMQAAAAAAAAAAAAAAAAA= \ No newline at end of file diff --git a/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.cdxml b/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.cdxml index 57d5203788..4d9f70dd48 100644 --- a/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.cdxml +++ b/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.cdxml @@ -18,65 +18,65 @@ - - - - - - NH - 2 - - - - - + + + + + + + + + + + + + + + + + + + + + + - - + + OH - - + + OH - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + NH + 2 + + + + + - - + + diff --git a/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.cml b/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.cml index a72e11c694..e3758cd197 100644 --- a/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.cml +++ b/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.cml @@ -2,19 +2,6 @@ - - - - - - - - - - - - - @@ -51,6 +38,19 @@ + + + + + + + + + + + + + diff --git a/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.smarts b/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.smarts index ef43a39c45..3168821c16 100644 --- a/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.smarts +++ b/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.smarts @@ -1 +1 @@ -[#6]-[#6](-[#7])-[#6].[#6]1-[#6]-[#6]-[#6]-[#6]-1.[#6]1-[#6]=[#6]-[#6]=[#6]-1>>[#8]-[#6]-[#8] \ No newline at end of file +[#6]1-[#6]-[#6]-[#6]-[#6]-1.[#6]1-[#6]=[#6]-[#6]=[#6]-1.[#6]-[#6](-[#7])-[#6]>>[#8]-[#6]-[#8] \ No newline at end of file diff --git a/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.smi b/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.smi index 1ad2aa86f0..aab9da2128 100644 --- a/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.smi +++ b/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.smi @@ -1 +1 @@ -CC(N)C.C1CCCC1.C1C=CC=C1>>OCO \ No newline at end of file +C1CCCC1.C1C=CC=C1.CC(N)C>>OCO \ No newline at end of file diff --git a/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products_2000.rxn b/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products_2000.rxn index 564592aaf7..2a4d964e8a 100644 --- a/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products_2000.rxn +++ b/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products_2000.rxn @@ -7,19 +7,6 @@ $MOL -INDIGO-01000000002D - 4 3 0 0 0 0 0 0 0 0999 V2000 - 10.1817 -8.8140 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.1817 -7.8140 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.3157 -7.3140 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 11.0478 -7.3140 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 4 1 0 0 0 0 -M END -$MOL - - -INDIGO-01000000002D - 5 5 0 0 0 0 0 0 0 0999 V2000 22.8103 -7.1445 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 23.6193 -7.7323 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 @@ -52,6 +39,19 @@ $MOL -INDIGO-01000000002D + 4 3 0 0 0 0 0 0 0 0999 V2000 + 10.1817 -8.8140 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.1817 -7.8140 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3157 -7.3140 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.0478 -7.3140 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + 3 2 0 0 0 0 0 0 0 0999 V2000 14.9228 -7.8140 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 15.7888 -8.3140 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products_3000.rxn b/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products_3000.rxn index 2514843869..c8eae2944a 100644 --- a/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products_3000.rxn +++ b/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products_3000.rxn @@ -5,20 +5,6 @@ $RXN V3000 M V30 COUNTS 3 1 M V30 BEGIN REACTANT M V30 BEGIN CTAB -M V30 COUNTS 4 3 0 0 0 -M V30 BEGIN ATOM -M V30 1 C 10.1817 -8.81398 0.0 0 -M V30 2 C 10.1817 -7.81398 0.0 0 -M V30 3 C 9.3157 -7.31398 0.0 0 -M V30 4 N 11.0478 -7.31398 0.0 0 -M V30 END ATOM -M V30 BEGIN BOND -M V30 1 1 1 2 -M V30 2 1 2 3 -M V30 3 1 2 4 -M V30 END BOND -M V30 END CTAB -M V30 BEGIN CTAB M V30 COUNTS 5 5 0 0 0 M V30 BEGIN ATOM M V30 1 C 22.8103 -7.14454 0.0 0 @@ -52,6 +38,20 @@ M V30 4 2 2 3 M V30 5 1 3 1 M V30 END BOND M V30 END CTAB +M V30 BEGIN CTAB +M V30 COUNTS 4 3 0 0 0 +M V30 BEGIN ATOM +M V30 1 C 10.1817 -8.81398 0.0 0 +M V30 2 C 10.1817 -7.81398 0.0 0 +M V30 3 C 9.3157 -7.31398 0.0 0 +M V30 4 N 11.0478 -7.31398 0.0 0 +M V30 END ATOM +M V30 BEGIN BOND +M V30 1 1 1 2 +M V30 2 1 2 3 +M V30 3 1 2 4 +M V30 END BOND +M V30 END CTAB M V30 END REACTANT M V30 BEGIN PRODUCT M V30 BEGIN CTAB diff --git a/api/tests/integration/tests/formats/ref/ket_two_retro_arrows.b64cdx b/api/tests/integration/tests/formats/ref/ket_two_retro_arrows.b64cdx index 2f5a635001..97563871ba 100644 --- a/api/tests/integration/tests/formats/ref/ket_two_retro_arrows.b64cdx +++ b/api/tests/integration/tests/formats/ref/ket_two_retro_arrows.b64cdx @@ -1 +1 @@ -VmpDRDAxMDAEAwIBAAAAAAAAAAAAAAAAAAAAAAUIBAAAAB4AGggCAAMAGwgCAAQAAAEkAAAAAgACAOn9BQBBcmlhbAMA6f0PAFRpbWVzIE5ldyBSb21hbgADMgAIAP///////wAAAAAAAP//AAAAAP////8AAAAA//8AAAAA/////wAAAAD/////AAD//wGAAAAAABAIAgABAA8IAgABAAOABAAAAASABQAAAAACCAAMcTUBoODhAAAABIAGAAAAAAIIAA5xFwGg4OEAAAAEgAcAAAAAAggAEHEIAZLlxwAAAASACAAAAAIEAgAHACsEAgACAAACCAAQcQgBtdv7AAaAAAAAAAACCAAQcQgBtdv7ACMIAQAAAAcZAAIAAAADAGAAyAAAAAIAAwAgAMgAAABOSDIAAAAABYAZAAAABAYEAAUAAAAFBgQABgAAAAAABYAaAAAABAYEAAYAAAAFBgQABwAAAAAABYAbAAAABAYEAAYAAAAFBgQACAAAAAAAAAADgAkAAAAEgAoAAAACBAIACAArBAIAAQAAAggADnEXAcAbcAEGgAAAAAAAAggADnEXAcAbcAEjCAEAAAAHDgABAAAAAwBgAMgAAABPSAAAAAAEgAsAAAAAAggADHEmAZ4WigEAAASADAAAAAIEAgAIACsEAgABAAACCAAOcRcB9BGkAQaAAAAAAAACCAAOcRcB9BGkASMIAQAAAAcOAAEAAAADAGAAyAAAAE9IAAAAAAWAHAAAAAQGBAAKAAAABQYEAAsAAAAAAAWAHQAAAAQGBAALAAAABQYEAAwAAAAAAAAAA4ANAAAABIAOAAAAAAIIAMJbAwHMu1wCAAAEgA8AAAAAAggAAP4UAdQAdQIAAASAEAAAAAACCABchjEBvLtrAgAABIARAAAAAAIIAFyGMQHYu00CAAAEgBIAAAAAAggAAP4UAcB2RAIAAAWAHgAAAAQGBAAOAAAABQYEABIAAAAAAAWAHwAAAAQGBAASAAAABQYEABEAAAAAAAWAIAAAAAQGBAARAAAABQYEABAAAAAAAAWAIQAAAAQGBAAQAAAABQYEAA8AAAAAAAWAIgAAAAQGBAAPAAAABQYEAA4AAAAAAAAAIYATAAAABAIQAA7xFQEyckYBDvEVARRoHAE3CgIAAAA1CgIAAgAvCgIAAwAgCgIAWAIwCgIAWAIxCgIAlgAzCgIAWAIHAgwAMvJFAQ7xFQEAAAAACAIMABToHAEO8RUBAAAAAAAAB4AjAAAAEwAEABMAAAAACgIAAQACCgIAIAAgCgIAWAIEAhAADvEVATLyRQEO8RUBFOgcAQAAIYAWAAAABAIQALaFGAGYbw8CtoUYASRz5gE3CgIAAAA1CgIAAgAvCgIAAwAgCgIAWAIwCgIAWAIxCgIAlgAzCgIAWAIHAgwAmO8OAraFGAEAAAAACAIMACTz5gG2hRgBAAAAAAAAB4AkAAAAEwAEABYAAAAACgIAAQACCgIAIAAgCgIAWAIEAhAAtoUYAZjvDgK2hRgBJPPmAQAADYAAAAAADoAAAAAAAQwEAA0AAAACDAQABAAAAAQMBAAjAAAAAAAOgAAAAAABDAQADQAAAAIMBAAJAAAABAwEACQAAAAAAAAAAAAAAAAA \ No newline at end of file +VmpDRDAxMDAEAwIBAAAAAAAAAAAAAAAAAAAAAAUIBAAAAB4AGggCAAMAGwgCAAQAAAEkAAAAAgACAOn9BQBBcmlhbAMA6f0PAFRpbWVzIE5ldyBSb21hbgADMgAIAP///////wAAAAAAAP//AAAAAP////8AAAAA//8AAAAA/////wAAAAD/////AAD//wGAAAAAABAIAgABAA8IAgABAAOABAAAAASABQAAAAACCADCWwMBzLtcAgAABIAGAAAAAAIIAAD+FAHUAHUCAAAEgAcAAAAAAggAXIYxAby7awIAAASACAAAAAACCABchjEB2LtNAgAABIAJAAAAAAIIAAD+FAHAdkQCAAAFgBkAAAAEBgQABQAAAAUGBAAJAAAAAAAFgBoAAAAEBgQACQAAAAUGBAAIAAAAAAAFgBsAAAAEBgQACAAAAAUGBAAHAAAAAAAFgBwAAAAEBgQABwAAAAUGBAAGAAAAAAAFgB0AAAAEBgQABgAAAAUGBAAFAAAAAAAAAAOACgAAAASACwAAAAACCAAMcTUBoODhAAAABIAMAAAAAAIIAA5xFwGg4OEAAAAEgA0AAAAAAggAEHEIAZLlxwAAAASADgAAAAIEAgAHACsEAgACAAACCAAQcQgBtdv7AAaAAAAAAAACCAAQcQgBtdv7ACMIAQAAAAcZAAIAAAADAGAAyAAAAAIAAwAgAMgAAABOSDIAAAAABYAeAAAABAYEAAsAAAAFBgQADAAAAAAABYAfAAAABAYEAAwAAAAFBgQADQAAAAAABYAgAAAABAYEAAwAAAAFBgQADgAAAAAAAAADgA8AAAAEgBAAAAACBAIACAArBAIAAQAAAggADnEXAcAbcAEGgAAAAAAAAggADnEXAcAbcAEjCAEAAAAHDgABAAAAAwBgAMgAAABPSAAAAAAEgBEAAAAAAggADHEmAZ4WigEAAASAEgAAAAIEAgAIACsEAgABAAACCAAOcRcB9BGkAQaAAAAAAAACCAAOcRcB9BGkASMIAQAAAAcOAAEAAAADAGAAyAAAAE9IAAAAAAWAIQAAAAQGBAAQAAAABQYEABEAAAAAAAWAIgAAAAQGBAARAAAABQYEABIAAAAAAAAAIYATAAAABAIQAA7xFQEyckYBDvEVARRoHAE3CgIAAAA1CgIAAgAvCgIAAwAgCgIAWAIwCgIAWAIxCgIAlgAzCgIAWAIHAgwAMvJFAQ7xFQEAAAAACAIMABToHAEO8RUBAAAAAAAAB4AjAAAAEwAEABMAAAAACgIAAQACCgIAIAAgCgIAWAIEAhAADvEVATLyRQEO8RUBFOgcAQAAIYAWAAAABAIQALaFGAGYbw8CtoUYASRz5gE3CgIAAAA1CgIAAgAvCgIAAwAgCgIAWAIwCgIAWAIxCgIAlgAzCgIAWAIHAgwAmO8OAraFGAEAAAAACAIMACTz5gG2hRgBAAAAAAAAB4AkAAAAEwAEABYAAAAACgIAAQACCgIAIAAgCgIAWAIEAhAAtoUYAZjvDgK2hRgBJPPmAQAADYAAAAAADoAAAAAABAwEACMAAAAAAA6AAAAAAAQMBAAkAAAAAAAAAAAAAAAAAA== \ No newline at end of file diff --git a/api/tests/integration/tests/formats/ref/ket_two_retro_arrows.cdxml b/api/tests/integration/tests/formats/ref/ket_two_retro_arrows.cdxml index 48940a2bba..51992f46a5 100644 --- a/api/tests/integration/tests/formats/ref/ket_two_retro_arrows.cdxml +++ b/api/tests/integration/tests/formats/ref/ket_two_retro_arrows.cdxml @@ -18,53 +18,53 @@ - - - - + + + + + + + + + + + + + + + + NH 2 - - - + + + - - + + OH - - + + OH - - - - - - - - - - - - - - + + - - + + diff --git a/api/tests/integration/tests/formats/ref/multi.cdxml b/api/tests/integration/tests/formats/ref/multi.cdxml index 3795d64349..2a343711b0 100644 --- a/api/tests/integration/tests/formats/ref/multi.cdxml +++ b/api/tests/integration/tests/formats/ref/multi.cdxml @@ -18,20 +18,20 @@ - - - + + + + - + + - - - - - - - + + + + + @@ -43,33 +43,33 @@ - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + @@ -92,8 +92,8 @@ - - + + diff --git a/api/tests/integration/tests/formats/ref/multi.ket b/api/tests/integration/tests/formats/ref/multi.ket index 8799ec887b..158a74c7c2 100644 --- a/api/tests/integration/tests/formats/ref/multi.ket +++ b/api/tests/integration/tests/formats/ref/multi.ket @@ -87,24 +87,32 @@ { "label": "C", "location": [ - 5.274374008178711, - -4.082470417022705, + 3.532207489013672, + -4.122548580169678, 0.0 ] }, { "label": "C", "location": [ - 6.275625705718994, - -4.082470417022705, + 3.5285041332244879, + -3.127451181411743, 0.0 ] }, { "label": "C", "location": [ - 5.775050163269043, - -3.217529535293579, + 2.5202949047088625, + -4.109637260437012, + 0.0 + ] + }, + { + "label": "C", + "location": [ + 2.5177924633026125, + -3.127451181411743, 0.0 ] } @@ -128,7 +136,14 @@ "type": 1, "atoms": [ 1, - 2 + 3 + ] + }, + { + "type": 1, + "atoms": [ + 2, + 3 ] } ] @@ -139,32 +154,24 @@ { "label": "C", "location": [ - 3.532207489013672, - -4.122548580169678, - 0.0 - ] - }, - { - "label": "C", - "location": [ - 3.5285041332244879, - -3.127451181411743, + 5.274374008178711, + -4.082470417022705, 0.0 ] }, { "label": "C", "location": [ - 2.5202949047088625, - -4.109637260437012, + 6.275625705718994, + -4.082470417022705, 0.0 ] }, { "label": "C", "location": [ - 2.5177924633026125, - -3.127451181411743, + 5.775050163269043, + -3.217529535293579, 0.0 ] } @@ -188,14 +195,7 @@ "type": 1, "atoms": [ 1, - 3 - ] - }, - { - "type": 1, - "atoms": [ - 2, - 3 + 2 ] } ] @@ -348,60 +348,61 @@ { "label": "C", "location": [ - 15.508987426757813, - -2.824992656707764, + 10.85447597503662, + -3.118603229522705, 0.0 ] }, { "label": "C", "location": [ - 15.508987426757813, - -3.825007438659668, + 11.638409614562989, + -2.501031637191773, 0.0 ] }, { "label": "C", "location": [ - 16.375, - -4.325014591217041, + 12.611440658569336, + -2.7235817909240724, 0.0 ] }, { "label": "C", "location": [ - 17.241010665893556, - -3.825007438659668, + 13.045523643493653, + -3.619391202926636, 0.0 ] }, { "label": "C", "location": [ - 17.241010665893556, - -2.824992656707764, + 10.8599853515625, + -4.125787734985352, 0.0 ] }, { "label": "C", "location": [ - 16.375, - -2.3249852657318117, + 12.612141609191897, + -4.526418209075928, + 0.0 + ] + }, + { + "label": "C", + "location": [ + 11.638409614562989, + -4.748968601226807, 0.0 ] } ], "bonds": [ - { - "type": 1, - "atoms": [ - 0, - 5 - ] - }, { "type": 1, "atoms": [ @@ -427,6 +428,13 @@ "type": 1, "atoms": [ 3, + 5 + ] + }, + { + "type": 1, + "atoms": [ + 0, 4 ] }, @@ -434,7 +442,14 @@ "type": 1, "atoms": [ 4, - 5 + 6 + ] + }, + { + "type": 1, + "atoms": [ + 5, + 6 ] } ] @@ -445,61 +460,60 @@ { "label": "C", "location": [ - 10.85447597503662, - -3.118603229522705, - 0.0 - ] - }, - { - "label": "C", - "location": [ - 11.638409614562989, - -2.501031637191773, + 15.508987426757813, + -2.824992656707764, 0.0 ] }, { "label": "C", "location": [ - 12.611440658569336, - -2.7235817909240724, + 15.508987426757813, + -3.825007438659668, 0.0 ] }, { "label": "C", "location": [ - 13.045523643493653, - -3.619391202926636, + 16.375, + -4.325014591217041, 0.0 ] }, { "label": "C", "location": [ - 10.8599853515625, - -4.125787734985352, + 17.241010665893556, + -3.825007438659668, 0.0 ] }, { "label": "C", "location": [ - 12.612141609191897, - -4.526418209075928, + 17.241010665893556, + -2.824992656707764, 0.0 ] }, { "label": "C", "location": [ - 11.638409614562989, - -4.748968601226807, + 16.375, + -2.3249852657318117, 0.0 ] } ], "bonds": [ + { + "type": 1, + "atoms": [ + 0, + 5 + ] + }, { "type": 1, "atoms": [ @@ -525,13 +539,6 @@ "type": 1, "atoms": [ 3, - 5 - ] - }, - { - "type": 1, - "atoms": [ - 0, 4 ] }, @@ -539,14 +546,7 @@ "type": 1, "atoms": [ 4, - 6 - ] - }, - { - "type": 1, - "atoms": [ - 5, - 6 + 5 ] } ] diff --git a/api/tests/integration/tests/formats/ref/multi.rdf b/api/tests/integration/tests/formats/ref/multi.rdf index 91a734f969..ad6475d438 100644 --- a/api/tests/integration/tests/formats/ref/multi.rdf +++ b/api/tests/integration/tests/formats/ref/multi.rdf @@ -12,18 +12,6 @@ $MOL -INDIGO-01000000002D - 3 3 0 0 0 0 0 0 0 0999 V2000 - 5.2744 -4.0825 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.2756 -4.0825 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7751 -3.2175 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 3 1 0 0 0 0 - 2 3 1 0 0 0 0 -M END -$MOL - - -INDIGO-01000000002D - 4 4 0 0 0 0 0 0 0 0999 V2000 3.5322 -4.1225 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 3.5285 -3.1275 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 @@ -38,30 +26,24 @@ $MOL -INDIGO-01000000002D - 3 2 0 0 0 0 0 0 0 0999 V2000 - 0.4000 -2.7000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - -0.1000 -3.5660 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.4000 -4.4321 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 3 0 0 0 0 0 0 0 0999 V2000 + 5.2744 -4.0825 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2756 -4.0825 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7751 -3.2175 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 2 3 1 0 0 0 0 M END $MOL -INDIGO-01000000002D - 6 6 0 0 0 0 0 0 0 0999 V2000 - 15.5090 -2.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 15.5090 -3.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 16.3750 -4.3250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 17.2410 -3.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 17.2410 -2.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 16.3750 -2.3250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 6 1 0 0 0 0 + 3 2 0 0 0 0 0 0 0 0999 V2000 + 0.4000 -2.7000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1000 -3.5660 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4000 -4.4321 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 1 2 1 0 0 0 0 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 1 0 0 0 0 M END $MOL @@ -83,12 +65,6 @@ $MOL 5 7 1 0 0 0 0 6 7 1 0 0 0 0 M END -$RFMT -$RXN - - -INDIGO- 0100000000 - - 2 1 $MOL -INDIGO-01000000002D @@ -107,6 +83,12 @@ $MOL 4 5 1 0 0 0 0 5 6 1 0 0 0 0 M END +$RFMT +$RXN + + -INDIGO- 0100000000 + + 2 1 $MOL -INDIGO-01000000002D @@ -131,6 +113,24 @@ $MOL -INDIGO-01000000002D + 6 6 0 0 0 0 0 0 0 0999 V2000 + 15.5090 -2.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.5090 -3.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.3750 -4.3250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.2410 -3.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.2410 -2.8250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.3750 -2.3250 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 6 1 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + 6 6 0 0 0 0 0 0 0 0999 V2000 22.5598 -3.0501 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 24.2902 -3.0496 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/api/tests/integration/tests/formats/ref/multi_overlap.cdxml b/api/tests/integration/tests/formats/ref/multi_overlap.cdxml index f815a8c65b..73117e894c 100644 --- a/api/tests/integration/tests/formats/ref/multi_overlap.cdxml +++ b/api/tests/integration/tests/formats/ref/multi_overlap.cdxml @@ -18,20 +18,20 @@ - - - + + + + - + + - - - - - - - + + + + + @@ -98,8 +98,8 @@ - - + + diff --git a/api/tests/integration/tests/formats/ref/multi_overlap.ket b/api/tests/integration/tests/formats/ref/multi_overlap.ket index 119038d1fa..6f08ebda63 100644 --- a/api/tests/integration/tests/formats/ref/multi_overlap.ket +++ b/api/tests/integration/tests/formats/ref/multi_overlap.ket @@ -258,24 +258,32 @@ { "label": "C", "location": [ - 19.53474807739258, - -8.932470321655274, + 18.05674934387207, + -9.015402793884278, 0.0 ] }, { "label": "C", "location": [ - 20.535999298095704, - -8.932470321655274, + 18.05304527282715, + -8.020110130310059, 0.0 ] }, { "label": "C", "location": [ - 20.035423278808599, - -8.067529678344727, + 17.04463577270508, + -9.00248908996582, + 0.0 + ] + }, + { + "label": "C", + "location": [ + 17.042133331298829, + -8.020110130310059, 0.0 ] } @@ -299,7 +307,14 @@ "type": 1, "atoms": [ 1, - 2 + 3 + ] + }, + { + "type": 1, + "atoms": [ + 2, + 3 ] } ] @@ -310,32 +325,24 @@ { "label": "C", "location": [ - 18.05674934387207, - -9.015402793884278, - 0.0 - ] - }, - { - "label": "C", - "location": [ - 18.05304527282715, - -8.020110130310059, + 19.53474807739258, + -8.932470321655274, 0.0 ] }, { "label": "C", "location": [ - 17.04463577270508, - -9.00248908996582, + 20.535999298095704, + -8.932470321655274, 0.0 ] }, { "label": "C", "location": [ - 17.042133331298829, - -8.020110130310059, + 20.035423278808599, + -8.067529678344727, 0.0 ] } @@ -359,14 +366,7 @@ "type": 1, "atoms": [ 1, - 3 - ] - }, - { - "type": 1, - "atoms": [ - 2, - 3 + 2 ] } ] diff --git a/core/indigo-core/reaction/base_reaction.h b/core/indigo-core/reaction/base_reaction.h index 85b34d8599..2fab541d0e 100644 --- a/core/indigo-core/reaction/base_reaction.h +++ b/core/indigo-core/reaction/base_reaction.h @@ -210,7 +210,13 @@ namespace indigo virtual int reactionNext(int i) { - return ++i; + while (++i < _reactionBlocks.size()) + { + auto& rb = _reactionBlocks[i]; + if (rb.products.size() || rb.reactants.size()) + break; + } + return i; } // dkuzminov: we either need to have a parameter "side" for method sideEnd() or we should exclude the set of "different" xxxEnd methods for sake of the From e94a2d8803932623ab2146f0f1e194867f594f46 Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Mon, 16 Sep 2024 02:05:04 +0200 Subject: [PATCH 08/30] clang format --- api/c/indigo/src/indigo_reaction.cpp | 2 +- core/indigo-core/common/math/algebra.h | 20 ------------------- core/indigo-core/molecule/ket_commons.h | 3 +-- core/indigo-core/reaction/pathway_reaction.h | 2 +- .../reaction/src/pathway_reaction_builder.cpp | 1 - .../reaction/src/reaction_json_loader.cpp | 10 +++++----- 6 files changed, 8 insertions(+), 30 deletions(-) diff --git a/api/c/indigo/src/indigo_reaction.cpp b/api/c/indigo/src/indigo_reaction.cpp index 555fbe6f5b..bc68a92b26 100644 --- a/api/c/indigo/src/indigo_reaction.cpp +++ b/api/c/indigo/src/indigo_reaction.cpp @@ -287,7 +287,7 @@ IndigoObject* IndigoReactionIter::next() if (_subtype == REACTION) { auto reaction = new IndigoReaction(); - reaction->init( _rxn.getBaseReaction(_idx)); + reaction->init(_rxn.getBaseReaction(_idx)); return reaction; } else if (_map) diff --git a/core/indigo-core/common/math/algebra.h b/core/indigo-core/common/math/algebra.h index dec6a63c71..dd80d89446 100644 --- a/core/indigo-core/common/math/algebra.h +++ b/core/indigo-core/common/math/algebra.h @@ -364,26 +364,6 @@ namespace indigo auto rb = rightBottom(); return rayIntersectsSegment(begin, end, lb, lt) || rayIntersectsSegment(begin, end, lt, rt) || rayIntersectsSegment(begin, end, rt, rb) || rayIntersectsSegment(begin, end, rb, lb); - // Vec2f v = end - begin; - // Vec2f vr(v.y, -v.x); // rotate 90 degrees clockwise - // // same_sign means no intersection - // auto lb_sign = std::signbit(Vec2f::dot(vr, lb)); - // auto lt_sign = std::signbit(Vec2f::dot(vr, lt)); - // auto rt_sign = std::signbit(Vec2f::dot(vr, rt)); - // auto rb_sign = std::signbit(Vec2f::dot(vr, rb)); - - // bool same_sign = lb_sign == lt_sign && lt_sign == rt_sign && rt_sign == rb_sign; - // int count = 0; - // if (Vec2f::cross(v, lb) > 0) - // count++; - // if (Vec2f::cross(v, lt) > 0) - // count++; - // if (Vec2f::cross(v, rt) > 0) - // count++; - // if (Vec2f::cross(v, rb) > 0) - // count++; - - // return !same_sign && Vec2f::cross(lb, vr) > 0 && count < 4; } inline float pointDistance(const Vec2f& pt) diff --git a/core/indigo-core/molecule/ket_commons.h b/core/indigo-core/molecule/ket_commons.h index 9e04360267..59c4ba1af0 100644 --- a/core/indigo-core/molecule/ket_commons.h +++ b/core/indigo-core/molecule/ket_commons.h @@ -397,8 +397,7 @@ namespace indigo { public: static const std::uint32_t CID = "KET reaction plus"_hash; - KETReactionPlus(const Vec2f& pos) : MetaObject(CID), _pos(pos){ - }; + KETReactionPlus(const Vec2f& pos) : MetaObject(CID), _pos(pos){}; MetaObject* clone() const override { diff --git a/core/indigo-core/reaction/pathway_reaction.h b/core/indigo-core/reaction/pathway_reaction.h index df74605d3a..767a9964d7 100644 --- a/core/indigo-core/reaction/pathway_reaction.h +++ b/core/indigo-core/reaction/pathway_reaction.h @@ -89,7 +89,7 @@ namespace indigo std::unique_ptr reaction(new Reaction()); auto& sr = _reactions[index]; for (auto pidx : sr.productIndexes) - reaction->addProductCopy(*_molecules[pidx],0,0); + reaction->addProductCopy(*_molecules[pidx], 0, 0); for (auto ridx : sr.reactantIndexes) reaction->addReactantCopy(*_molecules[ridx], 0, 0); return reaction; diff --git a/core/indigo-core/reaction/src/pathway_reaction_builder.cpp b/core/indigo-core/reaction/src/pathway_reaction_builder.cpp index ef2a789b73..2f5c791ffe 100644 --- a/core/indigo-core/reaction/src/pathway_reaction_builder.cpp +++ b/core/indigo-core/reaction/src/pathway_reaction_builder.cpp @@ -227,7 +227,6 @@ void PathwayReactionBuilder::buildRootReaction(PathwayReaction& reaction) } } - std::unique_ptr PathwayReactionBuilder::buildPathwayReaction(std::deque& reactions) { buildInchiDescriptors(reactions); diff --git a/core/indigo-core/reaction/src/reaction_json_loader.cpp b/core/indigo-core/reaction/src/reaction_json_loader.cpp index f7d5f6fd30..eaf88d6c2c 100644 --- a/core/indigo-core/reaction/src/reaction_json_loader.cpp +++ b/core/indigo-core/reaction/src/reaction_json_loader.cpp @@ -24,20 +24,19 @@ #include #include +#include "reaction/pathway_reaction.h" +#include "reaction/pathway_reaction_builder.h" #include "reaction/query_reaction.h" #include "reaction/reaction.h" -#include "reaction/pathway_reaction.h" #include "reaction/reaction_json_loader.h" #include "reaction/reaction_multistep_detector.h" -#include "reaction/pathway_reaction_builder.h" using namespace indigo; using namespace rapidjson; IMPL_ERROR(ReactionJsonLoader, "reaction KET loader"); -ReactionJsonLoader::ReactionJsonLoader(Document& ket) - : _loader(ket), _molecule(kArrayType), ignore_noncritical_query_features(false) +ReactionJsonLoader::ReactionJsonLoader(Document& ket) : _loader(ket), _molecule(kArrayType), ignore_noncritical_query_features(false) { ignore_bad_valence = false; } @@ -81,7 +80,8 @@ void ReactionJsonLoader::loadReaction(BaseReaction& rxn) { md.constructPathwayReaction(static_cast(rxn)); PathwayReactionBuilder::buildRootReaction(static_cast(rxn)); - } else + } + else md.constructMultipleArrowReaction(rxn); } else From ddc6c312c2177173c279e7e69bec16a35f3110e7 Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Mon, 16 Sep 2024 02:08:34 +0200 Subject: [PATCH 09/30] clang format --- core/indigo-core/common/math/algebra.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/indigo-core/common/math/algebra.h b/core/indigo-core/common/math/algebra.h index dd80d89446..5ba29969b6 100644 --- a/core/indigo-core/common/math/algebra.h +++ b/core/indigo-core/common/math/algebra.h @@ -29,8 +29,8 @@ #define SQR(x) ((x) * (x)) -#define DEG2RAD(x) ((x) * M_PI / 180) -#define RAD2DEG(x) ((x) * 180 / M_PI) +#define DEG2RAD(x) ((x)*M_PI / 180) +#define RAD2DEG(x) ((x)*180 / M_PI) #define HYPOT(a, b) (sqrt((a) * (a) + (b) * (b))) namespace indigo From 7410b5dc08f9d776dacfb9897eb8afe130be5cde Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Mon, 16 Sep 2024 02:16:54 +0200 Subject: [PATCH 10/30] clang format --- core/indigo-core/reaction/src/reaction_multistep_detector.cpp | 2 +- utils/indigo-service/backend/service/v2/validation.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp index 624b7872d6..e794f0a3d2 100644 --- a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp +++ b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp @@ -310,7 +310,7 @@ void ReactionMultistepDetector::detectMultitailArrows() auto& multi = (const KETReactionMultitailArrow&)_bmol.meta().getMetaObject(KETReactionMultitailArrow::CID, i); float min_dist_prod = -1; int idx_cs_min_prod = -1; - auto& arr_begin = multi.getHead(); + auto arr_begin = multi.getHead(); auto arr_end = arr_begin; arr_end.x = multi.getSpineBegin().x; auto& tails = multi.getTails(); diff --git a/utils/indigo-service/backend/service/v2/validation.py b/utils/indigo-service/backend/service/v2/validation.py index 05ded7b01b..6f88115f89 100644 --- a/utils/indigo-service/backend/service/v2/validation.py +++ b/utils/indigo-service/backend/service/v2/validation.py @@ -24,6 +24,7 @@ class InputFormatSchema(Schema): "chemical/x-cdxml", "chemical/x-cdx", "chemical/x-sdf", + "chemical/x-rdf", "chemical/x-peptide-sequence", "chemical/x-rna-sequence", "chemical/x-dna-sequence", From d0f4173822883fabb2fbcf641988e84096341165 Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Mon, 16 Sep 2024 02:25:53 +0200 Subject: [PATCH 11/30] wasm fix --- api/wasm/indigo-ketcher/indigo-ketcher.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/wasm/indigo-ketcher/indigo-ketcher.cpp b/api/wasm/indigo-ketcher/indigo-ketcher.cpp index c3dc746c40..158966951d 100644 --- a/api/wasm/indigo-ketcher/indigo-ketcher.cpp +++ b/api/wasm/indigo-ketcher/indigo-ketcher.cpp @@ -217,7 +217,7 @@ namespace indigo { const auto reac_obj = IndigoObject(_checkResult(indigoNext(reac_it.id))); const auto reac = IndigoObject(_checkResult(indigoClone(reac_obj.id))); - indigoRdfAppend(buffer.id, mol.id); + indigoRdfAppend(buffer.id, reac.id); } print_js(outputFormat.c_str()); result = _checkResultString(indigoToString(buffer.id)); From d26ed9185eaeb21ddaa9d2c55bd069af6e5a91d4 Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Mon, 16 Sep 2024 02:28:19 +0200 Subject: [PATCH 12/30] 386 fix --- .../reaction/src/reaction_multistep_detector.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp index e794f0a3d2..f1d5c7f251 100644 --- a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp +++ b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp @@ -353,7 +353,7 @@ void ReactionMultistepDetector::detectMultitailArrows() { auto& csb_min_prod = _component_summ_blocks[idx_cs_min_prod]; PathwayComponent pwc; - for (int j = 0; j < min_dist_reactants.size(); ++j) + for (int j = 0; j < (int)min_dist_reactants.size(); ++j) { auto& reac = min_dist_reactants[j]; if (reac.first > 0) @@ -487,7 +487,7 @@ void ReactionMultistepDetector::constructPathwayReaction(PathwayReaction& rxn) std::vector, std::vector>> csb_reactions; std::vector> csb_to_reactant_indexes; - for (int i = 0; i < _component_summ_blocks.size(); ++i) + for (int i = 0; i < (int)_component_summ_blocks.size(); ++i) { csb_to_reaction.emplace_back(); auto& csb = _component_summ_blocks[i]; @@ -541,7 +541,7 @@ void ReactionMultistepDetector::constructPathwayReaction(PathwayReaction& rxn) } } - for (int i = 0; i < csb_reactions.size(); ++i) + for (int i = 0; i < (int)csb_reactions.size(); ++i) { auto& csb_reaction = csb_reactions[i]; auto& rn = rxn.getReactionNode(i); @@ -588,7 +588,7 @@ void ReactionMultistepDetector::constructMultipleArrowReaction(BaseReaction& rxn // _reaction_components -> allMolecules // _component_summ_blocks -> std::unordered_map copied_components; - for (int i = 0; i < _component_summ_blocks.size(); ++i) + for (int i = 0; i < (int)_component_summ_blocks.size(); ++i) { auto& csb = _component_summ_blocks[i]; auto& rb = rxn.addReactionBlock(); From 3ee19e751407548782086afa43c72215a5b23d97 Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Mon, 16 Sep 2024 08:41:07 +0200 Subject: [PATCH 13/30] all fixed --- api/dotnet/src/IndigoLib.cs | 3 +++ api/dotnet/src/IndigoObject.cs | 6 ++++++ .../indigo/src/main/java/com/epam/indigo/IndigoLib.java | 2 ++ .../indigo/src/main/java/com/epam/indigo/IndigoObject.java | 6 ++++++ .../indigo-service/backend/service/tests/api/indigo_test.py | 2 +- 5 files changed, 18 insertions(+), 1 deletion(-) diff --git a/api/dotnet/src/IndigoLib.cs b/api/dotnet/src/IndigoLib.cs index 89cab17f09..eedb44c314 100644 --- a/api/dotnet/src/IndigoLib.cs +++ b/api/dotnet/src/IndigoLib.cs @@ -302,6 +302,9 @@ public unsafe class IndigoLib [DllImport("indigo"), SuppressUnmanagedCodeSecurity] public static extern int indigoIterateMolecules(int reader); + [DllImport("indigo"), SuppressUnmanagedCodeSecurity] + public static extern int indigoIterateReactions(int reader); + [DllImport("indigo"), SuppressUnmanagedCodeSecurity] public static extern int indigoSaveRxnfile(int reaction, int output); diff --git a/api/dotnet/src/IndigoObject.cs b/api/dotnet/src/IndigoObject.cs index e594a437d9..5f69b595a4 100644 --- a/api/dotnet/src/IndigoObject.cs +++ b/api/dotnet/src/IndigoObject.cs @@ -238,6 +238,12 @@ public IEnumerable iterateMolecules() return new IndigoObject(dispatcher, dispatcher.checkResult(IndigoLib.indigoIterateMolecules(self)), this); } + public IEnumerable iterateReactions() + { + dispatcher.setSessionID(); + return new IndigoObject(dispatcher, dispatcher.checkResult(IndigoLib.indigoIterateReactions(self)), this); + } + public string rxnfile() { dispatcher.setSessionID(); diff --git a/api/java/indigo/src/main/java/com/epam/indigo/IndigoLib.java b/api/java/indigo/src/main/java/com/epam/indigo/IndigoLib.java index 00f7977476..9fe7f07bcb 100644 --- a/api/java/indigo/src/main/java/com/epam/indigo/IndigoLib.java +++ b/api/java/indigo/src/main/java/com/epam/indigo/IndigoLib.java @@ -246,6 +246,8 @@ public interface IndigoLib extends Library { int indigoIterateMolecules(int reaction); + int indigoIterateReactions(int reaction); + int indigoSaveRxnfile(int reaction, int output); int indigoSaveRxnfileToFile(int reaction, String filename); diff --git a/api/java/indigo/src/main/java/com/epam/indigo/IndigoObject.java b/api/java/indigo/src/main/java/com/epam/indigo/IndigoObject.java index bed1ce6b65..57c8db9c93 100644 --- a/api/java/indigo/src/main/java/com/epam/indigo/IndigoObject.java +++ b/api/java/indigo/src/main/java/com/epam/indigo/IndigoObject.java @@ -221,6 +221,12 @@ public IndigoObject iterateMolecules() { dispatcher, Indigo.checkResult(this, lib.indigoIterateMolecules(self)), this); } + public IndigoObject iterateReactions() { + dispatcher.setSessionID(); + return new IndigoObject( + dispatcher, Indigo.checkResult(this, lib.indigoIterateReactions(self)), this); + } + public String rxnfile() { dispatcher.setSessionID(); return Indigo.checkResultString(this, lib.indigoRxnfile(self)); diff --git a/utils/indigo-service/backend/service/tests/api/indigo_test.py b/utils/indigo-service/backend/service/tests/api/indigo_test.py index 193276cdff..38511f3024 100644 --- a/utils/indigo-service/backend/service/tests/api/indigo_test.py +++ b/utils/indigo-service/backend/service/tests/api/indigo_test.py @@ -477,7 +477,7 @@ def test_headers_wrong(self): formats = "chemical/x-mdl-rxnfile, chemical/x-mdl-molfile, chemical/x-indigo-ket, \ chemical/x-daylight-smiles, chemical/x-cml, chemical/x-inchi, chemical/x-inchi-key, \ chemical/x-iupac, chemical/x-daylight-smarts, chemical/x-inchi-aux, chemical/x-chemaxon-cxsmiles, \ -chemical/x-cdxml, chemical/x-cdx, chemical/x-sdf, chemical/x-peptide-sequence, \ +chemical/x-cdxml, chemical/x-cdx, chemical/x-sdf, chemical/x-rdf, chemical/x-peptide-sequence, \ chemical/x-rna-sequence, chemical/x-dna-sequence, chemical/x-sequence, chemical/x-peptide-fasta, \ chemical/x-rna-fasta, chemical/x-dna-fasta, chemical/x-fasta, chemical/x-idt, chemical/x-helm." expected_text = ( From 0119e8f536b24074102475a5f17707ca0a4cb660 Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Mon, 16 Sep 2024 09:38:30 +0200 Subject: [PATCH 14/30] all fixed --- .../rendering/reactions/multitail_arrow.ket | 231 ++++++++++-------- utils/indigo-depict/main.c | 2 +- 2 files changed, 124 insertions(+), 109 deletions(-) diff --git a/api/tests/integration/tests/rendering/reactions/multitail_arrow.ket b/api/tests/integration/tests/rendering/reactions/multitail_arrow.ket index cb181349f2..64f562cfaa 100644 --- a/api/tests/integration/tests/rendering/reactions/multitail_arrow.ket +++ b/api/tests/integration/tests/rendering/reactions/multitail_arrow.ket @@ -28,13 +28,13 @@ "mode": "open-angle", "pos": [ { - "x": 16.45013736263736, - "y": -7.94549617049617, + "x": 20.191063613913478, + "y": -13.115784925498332, "z": 0 }, { - "x": 18.45013736263736, - "y": -7.94549617049617, + "x": 22.191063613913478, + "y": -13.115784925498332, "z": 0 } ] @@ -43,8 +43,8 @@ { "type": "plus", "location": [ - 11.850137362637362, - -8.09549617049617, + 15.591063613913482, + -13.265784925498332, 0 ], "prop": {} @@ -54,21 +54,21 @@ "data": { "head": { "position": { - "x": 25.12513736263736, - "y": -7.920496170496172, + "x": 28.84106361391348, + "y": -14.365784925498334, "z": 0 } }, "spine": { "pos": [ { - "x": 23.662637362637362, - "y": -6.670496170496172, + "x": 27.37856361391348, + "y": -13.115784925498334, "z": 0 }, { - "x": 23.662637362637362, - "y": -14.870496170496173, + "x": 27.37856361391348, + "y": -21.315784925498335, "z": 0 } ] @@ -76,23 +76,23 @@ "tails": { "pos": [ { - "x": 23.25013736263736, - "y": -6.670496170496172, + "x": 26.96606361391348, + "y": -13.115784925498334, "z": 0 }, { - "x": 23.25013736263736, - "y": -11.395496170496173, + "x": 26.96606361391348, + "y": -17.840784925498333, "z": 0 }, { - "x": 23.25013736263736, - "y": -12.982996170496174, + "x": 26.96606361391348, + "y": -19.428284925498332, "z": 0 }, { - "x": 23.25013736263736, - "y": -14.870496170496173, + "x": 26.96606361391348, + "y": -21.315784925498335, "z": 0 } ] @@ -110,48 +110,48 @@ { "label": "C", "location": [ - 8.884986514765929, - -7.6080705876707775, + 12.625912766042049, + -12.778359342672939, 0 ] }, { "label": "C", "location": [ - 10.615288210508796, - -7.607585399673374, + 14.356214461784916, + -12.777874154675535, 0 ] }, { "label": "C", "location": [ - 9.751774872128602, - -7.107963059346357, + 13.492701123404721, + -12.278251814348518, 0 ] }, { "label": "C", "location": [ - 10.615288210508796, - -8.608528238318318, + 14.356214461784916, + -13.77881699332048, 0 ] }, { "label": "C", "location": [ - 8.884986514765929, - -8.613016227294308, + 12.625912766042049, + -13.78330498229647, 0 ] }, { "label": "C", "location": [ - 9.75395821811692, - -9.108029281645983, + 13.49488446939304, + -14.278318036648145, 0 ] } @@ -199,7 +199,12 @@ 2 ] } - ] + ], + "stereoFlagPosition": { + "x": 14.356214461784916, + "y": 11.278251814348518, + "z": 0 + } }, "mol1": { "type": "molecule", @@ -207,48 +212,48 @@ { "label": "C", "location": [ - 13.134882561653708, - -8.416249432070881, + 16.875808812929826, + -13.586538187073042, 0 ] }, { "label": "C", "location": [ - 14.358047544488958, - -7.192398289789401, + 18.098973795765076, + -12.362687044791562, 0 ] }, { "label": "C", "location": [ - 13.394165062397763, - -7.449708082125545, + 17.135091313673882, + -12.619996837127706, 0 ] }, { "label": "C", "location": [ - 15.06582101327491, - -7.900171758575355, + 18.806747264551028, + -13.070460513577517, 0 ] }, { "label": "C", "location": [ - 13.845486438155358, - -9.126853308572532, + 17.586412689431477, + -14.297142063574693, 0 ] }, { "label": "C", "location": [ - 14.809969309762005, - -8.862424611981755, + 18.550895561038125, + -14.032713366983916, 0 ] } @@ -296,7 +301,12 @@ 2 ] } - ] + ], + "stereoFlagPosition": { + "x": 18.806747264551028, + "y": 11.362687044791562, + "z": 0 + } }, "mol2": { "type": "molecule", @@ -304,64 +314,64 @@ { "label": "C", "location": [ - 19.355971052307332, - -8.521741477272869, + 23.09689730358345, + -13.69203023227503, 0 ] }, { "label": "C", "location": [ - 19.356172012638805, - -7.519250863719475, + 23.097098263914923, + -12.689539618721637, 0 ] }, { "label": "C", "location": [ - 20.061341815777794, - -6.813980580414748, + 23.802268067053912, + -11.98426933541691, 0 ] }, { "label": "C", "location": [ - 20.06154277610927, - -9.227112240743331, + 23.80246902738539, + -14.397400995745492, 0 ] }, { "label": "C", "location": [ - 21.063932909496927, - -9.227112240743331, + 24.804859160773045, + -14.397400995745492, 0 ] }, { "label": "C", "location": [ - 21.76930367296739, - -8.521741477272869, + 25.510229924243507, + -13.69203023227503, 0 ] }, { "label": "C", "location": [ - 21.769203192801655, - -7.519250863719475, + 25.510129444077773, + -12.689539618721637, 0 ] }, { "label": "C", "location": [ - 21.063932909496927, - -6.813880100249011, + 24.804859160773045, + -11.984168855251172, 0 ] } @@ -423,7 +433,12 @@ 1 ] } - ] + ], + "stereoFlagPosition": { + "x": 25.510229924243507, + "y": 10.984168855251172, + "z": 0 + } }, "mol3": { "type": "molecule", @@ -431,56 +446,56 @@ { "label": "C", "location": [ - 25.492113742592892, - -7.656599441391686, + 29.208039993869008, + -14.101888196393848, 0 ] }, { "label": "C", "location": [ - 26.27604712841188, - -7.039027797471936, + 29.991973379687995, + -13.484316552474098, 0 ] }, { "label": "C", "location": [ - 27.24907802699773, - -7.261577942264295, + 30.965004278273845, + -13.706866697266456, 0 ] }, { "label": "C", "location": [ - 27.683160982681837, - -8.157387345964949, + 31.399087233957953, + -14.60267610096711, 0 ] }, { "label": "C", "location": [ - 25.497622409543194, - -8.663784075069433, + 29.21354866081931, + -15.109072830071595, 0 ] }, { "label": "C", "location": [ - 27.249779130064134, - -9.064414398728045, + 30.96570538134025, + -15.509703153730207, 0 ] }, { "label": "C", "location": [ - 26.27604712841188, - -9.286964543520405, + 29.991973379687995, + -15.732253298522567, 0 ] } @@ -543,40 +558,40 @@ { "label": "C", "location": [ - 21.325187401380575, - -10.41794995124567, + 25.041113652656694, + -16.863238706247834, 0 ] }, { "label": "C", "location": [ - 21.82557483347525, - -11.95804238974667, + 25.54150108475137, + -18.403331144748833, 0 ] }, { "label": "C", "location": [ - 22.13481426650976, - -11.011809755655634, + 25.85074051778588, + -17.457098510657794, 0 ] }, { "label": "C", "location": [ - 20.824799969285895, - -11.95804238974667, + 24.540726220562014, + -18.403331144748833, 0 ] }, { "label": "C", "location": [ - 20.515460458764966, - -11.011809755655634, + 24.231386710041086, + -17.457098510657794, 0 ] } @@ -625,40 +640,40 @@ { "label": "C", "location": [ - 21.375187401380572, - -12.055449951245674, + 25.09111365265669, + -18.500738706247834, 0 ] }, { "label": "C", "location": [ - 21.87557483347525, - -13.595542389746672, + 25.591501084751368, + -20.040831144748832, 0 ] }, { "label": "C", "location": [ - 22.184814266509758, - -12.649309755655636, + 25.900740517785877, + -19.094598510657796, 0 ] }, { "label": "C", "location": [ - 20.874799969285892, - -13.595542389746672, + 24.59072622056201, + -20.040831144748832, 0 ] }, { "label": "C", "location": [ - 20.565460458764964, - -12.649309755655636, + 24.281386710041083, + -19.094598510657796, 0 ] } @@ -707,40 +722,40 @@ { "label": "C", "location": [ - 21.46268740138057, - -13.855449951245673, + 25.17861365265669, + -20.300738706247834, 0 ] }, { "label": "C", "location": [ - 21.96307483347525, - -15.39554238974667, + 25.67900108475137, + -21.84083114474883, 0 ] }, { "label": "C", "location": [ - 22.27231426650976, - -14.449309755655637, + 25.98824051778588, + -20.894598510657797, 0 ] }, { "label": "C", "location": [ - 20.962299969285894, - -15.39554238974667, + 24.678226220562014, + -21.84083114474883, 0 ] }, { "label": "C", "location": [ - 20.652960458764966, - -14.449309755655637, + 24.368886710041085, + -20.894598510657797, 0 ] } @@ -783,4 +798,4 @@ } ] } -} +} \ No newline at end of file diff --git a/utils/indigo-depict/main.c b/utils/indigo-depict/main.c index 970a0723cf..74f0c58b84 100644 --- a/utils/indigo-depict/main.c +++ b/utils/indigo-depict/main.c @@ -1058,7 +1058,7 @@ int main(int argc, char* argv[]) _prepare(obj, p.aromatization); if (p.action == ACTION_LAYOUT) { - // indigoLayout(obj); + indigoLayout(obj); if (p.out_ext == OEXT_CML) indigoSaveCmlToFile(obj, p.outfile); else if (p.out_ext == OEXT_RXN) From 2754e5435630fd667a686034f53c46d2d2c8aa26 Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Wed, 18 Sep 2024 06:46:45 +0200 Subject: [PATCH 15/30] all fixed --- api/c/indigo-renderer/src/indigo_render2d.cpp | 3 + api/c/indigo/src/indigo_internal.h | 2 + api/c/indigo/src/indigo_object.cpp | 6 + api/c/indigo/src/indigo_reaction.cpp | 82 +++++++++- api/c/indigo/src/indigo_reaction.h | 21 +++ .../integration/tests/formats/ket_cdxml.py | 4 +- .../tests/formats/ref/pathway10.rdf | 122 +++++++-------- .../rendering/ref/linux/multitail_arrow.png | Bin 40038 -> 41330 bytes .../rendering/ref/mac/multitail_arrow.png | Bin 40038 -> 41330 bytes .../rendering/ref/win/multitail_arrow.png | Bin 40038 -> 41330 bytes core/indigo-core/reaction/base_reaction.h | 13 +- core/indigo-core/reaction/pathway_reaction.h | 14 +- .../reaction/reaction_multistep_detector.h | 15 +- .../reaction/src/base_reaction.cpp | 11 +- .../reaction/src/pathway_reaction.cpp | 44 ++++-- .../reaction/src/reaction_auto_loader.cpp | 11 +- .../reaction/src/reaction_json_loader.cpp | 13 +- .../src/reaction_multistep_detector.cpp | 142 ++++++++++++++---- core/render2d/src/render_item_reaction.cpp | 33 +++- utils/indigo-depict/main.c | 2 +- 20 files changed, 401 insertions(+), 137 deletions(-) diff --git a/api/c/indigo-renderer/src/indigo_render2d.cpp b/api/c/indigo-renderer/src/indigo_render2d.cpp index a684e285b5..0901a5256e 100644 --- a/api/c/indigo-renderer/src/indigo_render2d.cpp +++ b/api/c/indigo-renderer/src/indigo_render2d.cpp @@ -21,6 +21,7 @@ #include "molecule/molecule.h" #include "molecule/query_molecule.h" #include "reaction/query_reaction.h" +#include "reaction/pathway_reaction.h" #include "reaction/reaction.h" #include "render_cdxml.h" @@ -469,6 +470,8 @@ CEXPORT int indigoRender(int object, int output) { if (obj.getBaseReaction().isQueryReaction()) rp.rxn.reset(new QueryReaction()); + else if (obj.getBaseReaction().isPathwayReaction()) + rp.rxn.reset(new PathwayReaction()); else rp.rxn.reset(new Reaction()); rp.rxn->clone(self.getObject(object).getBaseReaction(), 0, 0, 0); diff --git a/api/c/indigo/src/indigo_internal.h b/api/c/indigo/src/indigo_internal.h index 4fc84bd59b..b56846a3f4 100644 --- a/api/c/indigo/src/indigo_internal.h +++ b/api/c/indigo/src/indigo_internal.h @@ -57,6 +57,7 @@ namespace indigo class BaseReaction; class QueryReaction; class Reaction; + class PathwayReaction; class Output; class Scanner; class SdfLoader; @@ -190,6 +191,7 @@ class DLLEXPORT IndigoObject virtual BaseReaction& getBaseReaction(); virtual QueryReaction& getQueryReaction(); virtual Reaction& getReaction(); + virtual PathwayReaction& getPathwayReaction(); virtual IndigoObject* clone(); diff --git a/api/c/indigo/src/indigo_object.cpp b/api/c/indigo/src/indigo_object.cpp index a48d327b8e..2aa2868e6d 100644 --- a/api/c/indigo/src/indigo_object.cpp +++ b/api/c/indigo/src/indigo_object.cpp @@ -23,6 +23,7 @@ #include "base_cpp/output.h" #include "base_cpp/properties_map.h" #include "reaction/reaction.h" +#include "reaction/pathway_reaction.h" #include "indigo_internal.h" @@ -225,6 +226,11 @@ Reaction& IndigoObject::getReaction() throw IndigoError("%s is not a reaction", debugInfo()); } +PathwayReaction& IndigoObject::getPathwayReaction() +{ + throw IndigoError("%s is not a pathway reaction", debugInfo()); +} + BaseReaction& IndigoObject::getBaseReaction() { throw IndigoError("%s is not a base reaction", debugInfo()); diff --git a/api/c/indigo/src/indigo_reaction.cpp b/api/c/indigo/src/indigo_reaction.cpp index bc68a92b26..ecbcd2d9f0 100644 --- a/api/c/indigo/src/indigo_reaction.cpp +++ b/api/c/indigo/src/indigo_reaction.cpp @@ -27,6 +27,7 @@ #include "reaction/reaction_automapper.h" #include "reaction/rsmiles_loader.h" #include "reaction/rxnfile_saver.h" +#include "reaction/pathway_reaction.h" #include // @@ -60,7 +61,68 @@ const char* IndigoBaseReaction::debugInfo() const } // -// IndigoBaseReaction +// IndigoPathwayReaction +// + + +IndigoPathwayReaction::IndigoPathwayReaction() : IndigoBaseReaction(REACTION) +{ + init(); +} + +const char* IndigoPathwayReaction::debugInfo() const +{ + if (type == IndigoObject::PATHWAY_REACTION) + return ""; + return ""; +} + +IndigoPathwayReaction::~IndigoPathwayReaction() +{ +} + +void IndigoPathwayReaction::init(std::unique_ptr&& reaction) +{ + type = !reaction || dynamic_cast(reaction.get()) ? IndigoObject::PATHWAY_REACTION : IndigoObject::PATHWAY_REACTION; + rxn = reaction ? std::move(reaction) : std::make_unique(); +} + +BaseReaction& IndigoPathwayReaction::getBaseReaction() +{ + assert(rxn); + return *rxn; +} + +PathwayReaction& IndigoPathwayReaction::getPathwayReaction() +{ + assert(rxn); + return dynamic_cast(*rxn); +} + +const char* IndigoPathwayReaction::getName() +{ + if (!rxn || rxn->name.ptr() == 0) + return ""; + return rxn->name.ptr(); +} + +IndigoObject* IndigoPathwayReaction::clone() +{ + return cloneFrom(*this); +} + +IndigoPathwayReaction* IndigoPathwayReaction::cloneFrom(IndigoObject& obj) +{ + Reaction& rxn = obj.getReaction(); + std::unique_ptr rxnptr = std::make_unique(); + rxnptr->rxn->clone(rxn, 0, 0, 0); + auto& props = obj.getProperties(); + rxnptr->copyProperties(props); + return rxnptr.release(); +} + +// +// IndigoReaction // IndigoReaction::IndigoReaction() : IndigoBaseReaction(REACTION) @@ -72,8 +134,6 @@ const char* IndigoReaction::debugInfo() const { if (type == IndigoObject::REACTION) return ""; - if (type == IndigoObject::PATHWAY_REACTION) - return ""; return ""; } @@ -398,9 +458,21 @@ CEXPORT int indigoLoadReaction(int source) loader.ignore_noncritical_query_features = self.ignore_noncritical_query_features; loader.dearomatize_on_load = self.dearomatize_on_load; loader.arom_options = self.arom_options; + auto rxn = loader.loadReaction(false); + std::unique_ptr rxnptr; + if (rxn->isPathwayReaction()) + { + auto pwr = std::make_unique(); + pwr->init(std::move(rxn)); + rxnptr = std::move(pwr); + } + else + { + auto reaction = std::make_unique(); + reaction->init(std::move(rxn)); + rxnptr = std::move(reaction); + } - std::unique_ptr rxnptr = std::make_unique(); - rxnptr->init(loader.loadReaction(false)); return self.addObject(rxnptr.release()); } INDIGO_END(-1); diff --git a/api/c/indigo/src/indigo_reaction.h b/api/c/indigo/src/indigo_reaction.h index f747428729..c59f7344cc 100644 --- a/api/c/indigo/src/indigo_reaction.h +++ b/api/c/indigo/src/indigo_reaction.h @@ -79,6 +79,27 @@ class DLLEXPORT IndigoReaction : public IndigoBaseReaction std::unique_ptr rxn; }; +class DLLEXPORT IndigoPathwayReaction : public IndigoBaseReaction +{ +public: + IndigoPathwayReaction(); + ~IndigoPathwayReaction() override; + + void init(std::unique_ptr&& = {}); + BaseReaction& getBaseReaction() override; + PathwayReaction& getPathwayReaction() override; + const char* getName() override; + + IndigoObject* clone() override; + + static IndigoPathwayReaction* cloneFrom(IndigoObject& obj); + + const char* debugInfo() const override; + + std::unique_ptr rxn; +}; + + class DLLEXPORT IndigoQueryReaction : public IndigoBaseReaction { public: diff --git a/api/tests/integration/tests/formats/ket_cdxml.py b/api/tests/integration/tests/formats/ket_cdxml.py index 40c4e48164..bab3d4455f 100644 --- a/api/tests/integration/tests/formats/ket_cdxml.py +++ b/api/tests/integration/tests/formats/ket_cdxml.py @@ -60,9 +60,9 @@ def find_diff(a, b): ket_result = ket.json() # with open(os.path.join(ref_path, filename + ".ket"), "w") as file: - # file.write(ket_result) + # file.write(ket_result) # with open(os.path.join(ref_path, filename + ".cdxml"), "w") as file: - # file.write(cdxml_text) + # file.write(cdxml_text) with open(os.path.join(ref_path, filename) + ".ket", "r") as file: ket_ref = file.read() diff --git a/api/tests/integration/tests/formats/ref/pathway10.rdf b/api/tests/integration/tests/formats/ref/pathway10.rdf index 75a98fe663..136f00f28c 100644 --- a/api/tests/integration/tests/formats/ref/pathway10.rdf +++ b/api/tests/integration/tests/formats/ref/pathway10.rdf @@ -7,21 +7,7 @@ $RXN -INDIGO- 0100000000 - 2 1 -$MOL - - -INDIGO-01000000002D - - 4 4 0 0 0 0 0 0 0 0999 V2000 - 0.7290 4.2022 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.7303 4.2022 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.2297 5.0671 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.2297 6.0671 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 1 1 0 0 0 0 - 3 4 1 0 0 0 0 -M END + 7 3 $MOL -INDIGO-01000000002D @@ -42,26 +28,32 @@ $MOL -INDIGO-01000000002D - 6 6 0 0 0 0 0 0 0 0999 V2000 - 6.0401 3.2629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.5405 1.7228 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.8497 2.6691 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.5397 1.7228 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.2303 2.6691 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.0401 4.2629 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 4 4 0 0 0 0 0 0 0 0999 V2000 + 0.7290 4.2022 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7303 4.2022 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2297 5.0671 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2297 6.0671 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 1 1 0 0 0 0 + 3 4 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 5 5 0 0 0 0 0 0 0 0999 V2000 + 0.9207 10.1072 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4211 8.5671 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7303 9.5133 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4203 8.5671 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1110 9.5133 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 1 5 1 0 0 0 0 5 4 2 0 0 0 0 4 2 1 0 0 0 0 2 3 2 0 0 0 0 3 1 1 0 0 0 0 - 1 6 1 0 0 0 0 M END -$RFMT -$RXN - - -INDIGO- 0100000000 - - 2 1 $MOL -INDIGO-01000000002D @@ -84,40 +76,16 @@ $MOL -INDIGO-01000000002D - 5 5 0 0 0 0 0 0 0 0999 V2000 - 0.9207 10.1072 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.4211 8.5671 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.7303 9.5133 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.4203 8.5671 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.1110 9.5133 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 5 1 0 0 0 0 - 5 4 2 0 0 0 0 - 4 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 3 1 1 0 0 0 0 -M END -$MOL - - -INDIGO-01000000002D - - 5 5 0 0 0 0 0 0 0 0999 V2000 - 7.8745 10.4722 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.8708 11.4673 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.8626 10.4851 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.8601 11.4673 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.8367 11.7261 0.0000 P 0 0 0 0 0 0 0 0 0 0 0 0 + 4 4 0 0 0 0 0 0 0 0999 V2000 + 7.8497 1.7228 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8509 1.7228 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3504 2.5878 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6092 3.5537 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 1 2 1 0 0 0 0 - 2 4 1 0 0 0 0 - 4 3 1 0 0 0 0 + 2 3 1 0 0 0 0 3 1 1 0 0 0 0 - 2 5 1 0 0 0 0 + 3 4 1 0 0 0 0 M END -$RFMT -$RXN - - -INDIGO- 0100000000 - - 2 1 $MOL -INDIGO-01000000002D @@ -152,6 +120,40 @@ $MOL 3 1 1 0 0 0 0 2 5 1 0 0 0 0 M END +$MOL + + -INDIGO-01000000002D + + 6 6 0 0 0 0 0 0 0 0999 V2000 + 6.0401 3.2629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5405 1.7228 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8497 2.6691 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5397 1.7228 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2303 2.6691 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0401 4.2629 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 1 5 1 0 0 0 0 + 5 4 2 0 0 0 0 + 4 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 1 1 0 0 0 0 + 1 6 1 0 0 0 0 +M END +$MOL + + -INDIGO-01000000002D + + 5 5 0 0 0 0 0 0 0 0999 V2000 + 7.8745 10.4722 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8708 11.4673 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8626 10.4851 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8601 11.4673 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8367 11.7261 0.0000 P 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 4 1 0 0 0 0 + 4 3 1 0 0 0 0 + 3 1 1 0 0 0 0 + 2 5 1 0 0 0 0 +M END $MOL -INDIGO-01000000002D diff --git a/api/tests/integration/tests/rendering/ref/linux/multitail_arrow.png b/api/tests/integration/tests/rendering/ref/linux/multitail_arrow.png index ff116a0b06a2139565d2a80bab5fc58b908c9355..f14a80fb808567dcf67417467335aa551afeac21 100644 GIT binary patch literal 41330 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ν0 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ν0 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ν0 zzvRh1@5FURKe$r^Ti+7v-Elx3307UBwxiIWXD|%UCQsIFPJ`YKpi%to2yQ|0cr$7s z9dA$npnywSo4^RHG#xVRkMc}Jm1z>9z}5)vQQ&cWNN(SGhp(+zptG9p|isKT+H~K18I9ode}cO1iRmLu2&A^ z!ruyGoe(u&ET^HpD>K}q^VQ?bLP#n2JplR$S8O?;%$PD-0i-^9oB?hKY;3)Uj2IMq zh)u~JWBX8EO!@8U1&{Ag-ePa#ffl~hAx~lUC-%{H`bOh-uMS7*@%M7XWlfFchL6|bHbjT3BBu6GCo_S-lm6)73`-Q z7MmJEEGYl`bX_vRz-T79+f%sg8@)THTXIJ`aK{4-Rhu11`WOp#*s+KXnlfk21?TD$ zGWx9IZg+q=ch@I7KTEk*q+9RBUP4$dRDO0i#&cTvfYm)z;*!Pij+JU2`bIx&DBk=7 z2Vm95L%nytG8>* mol_mappings); + virtual void _cloneSub(BaseReaction& other); }; } // namespace indigo diff --git a/core/indigo-core/reaction/pathway_reaction.h b/core/indigo-core/reaction/pathway_reaction.h index 767a9964d7..3549c92d15 100644 --- a/core/indigo-core/reaction/pathway_reaction.h +++ b/core/indigo-core/reaction/pathway_reaction.h @@ -127,6 +127,11 @@ namespace indigo return static_cast(_reactions.size()); } + int reactionsCount() override + { + return _reactions.size(); + } + Reaction& asReaction() override { _rootReaction.clone(*this); @@ -190,6 +195,11 @@ namespace indigo return true; } + PathwayReaction& asPathwayReaction() override + { + return *this; + } + ReactionNode& addReactionNode() { ReactionNode rn; @@ -213,7 +223,6 @@ namespace indigo return {static_cast(_reactions.size() - 1), _reactions[_reactions.size() - 1]}; } - void clone(PathwayReaction&); BaseReaction* neu() override; bool aromatize(const AromaticityOptions& options) override; @@ -232,10 +241,13 @@ namespace indigo return ++i; } + void clear() override; + DECL_ERROR; protected: int _addBaseMolecule(int side) override; + void _cloneSub(BaseReaction& other) override; private: ObjArray _reactionNodes; diff --git a/core/indigo-core/reaction/reaction_multistep_detector.h b/core/indigo-core/reaction/reaction_multistep_detector.h index 1de5caa65a..de0716a28d 100644 --- a/core/indigo-core/reaction/reaction_multistep_detector.h +++ b/core/indigo-core/reaction/reaction_multistep_detector.h @@ -41,10 +41,19 @@ namespace indigo class ReactionMultistepDetector { public: + enum class ReactionType + { + ESimpleReaction, + EMutistepReaction, + EPathwayReaction + }; + ReactionMultistepDetector(BaseMolecule& mol); ~ReactionMultistepDetector(); - void detectReaction(); + ReactionType detectReaction(); void constructMultipleArrowReaction(BaseReaction& rxn); + void constructSimpleArrowReaction(BaseReaction& rxn); + void constructPathwayReaction(PathwayReaction& rxn); typedef std::pair FLOAT_INT_PAIR; @@ -56,8 +65,8 @@ namespace indigo private: void createSummBlocks(); - void detectArrows(); - void detectMultitailArrows(); + bool detectArrows(); + bool detectMultitailArrows(); bool findPlusNeighbours(const Vec2f& plus_pos, const FLOAT_INT_PAIRS& mol_tops, const FLOAT_INT_PAIRS& mol_bottoms, const FLOAT_INT_PAIRS& mol_lefts, const FLOAT_INT_PAIRS& mol_rights, std::pair& connection); diff --git a/core/indigo-core/reaction/src/base_reaction.cpp b/core/indigo-core/reaction/src/base_reaction.cpp index 552ea143e9..993bccaaf3 100644 --- a/core/indigo-core/reaction/src/base_reaction.cpp +++ b/core/indigo-core/reaction/src/base_reaction.cpp @@ -392,14 +392,18 @@ void BaseReaction::clone(BaseReaction& other, Array* mol_mapping, ObjArray< name.copy(other.name); _meta.clone(other._meta); - isRetrosynthetic = other.isRetrosynthetic; + _cloneSub(other); } void BaseReaction::_clone(BaseReaction& other, int index, int i, ObjArray>* mol_mappings) { } +void BaseReaction::_cloneSub(BaseReaction& other) +{ +} + Reaction& BaseReaction::asReaction() { throw Error("asReaction(): not a Reaction"); @@ -410,6 +414,11 @@ QueryReaction& BaseReaction::asQueryReaction() throw Error("asQueryReaction(): not a QueryReaction"); } +PathwayReaction& BaseReaction::asPathwayReaction() +{ + throw Error("asPathwayReaction(): not a PathwayReaction"); +} + bool BaseReaction::isQueryReaction() { return false; diff --git a/core/indigo-core/reaction/src/pathway_reaction.cpp b/core/indigo-core/reaction/src/pathway_reaction.cpp index 68e4032653..a87b552e43 100644 --- a/core/indigo-core/reaction/src/pathway_reaction.cpp +++ b/core/indigo-core/reaction/src/pathway_reaction.cpp @@ -44,29 +44,38 @@ std::vector PathwayReaction::getRootReactions() const return root_reactions; } -void PathwayReaction::clone(PathwayReaction& reaction) +void PathwayReaction::_cloneSub(BaseReaction& other) { - BaseReaction::clone(reaction); - for (int i = 0; i < _reactionNodes.size(); ++i) + clear(); + PathwayReaction& other_pwr = other.asPathwayReaction(); + for (int i = 0; i < other_pwr._reactionNodes.size(); ++i) { - auto& other = _reactionNodes[i]; - auto& rn = reaction._reactionNodes.push(); - rn.reactionIdx = other.reactionIdx; - rn.precursorReactionIndexes.copy(other.precursorReactionIndexes); - for (int j = 0; j < other.successorReactionIndexes.size(); ++j) + auto& other_rnode = other_pwr._reactionNodes[i]; + auto& rn = _reactionNodes.push(); + rn.reactionIdx = other_rnode.reactionIdx; + rn.precursorReactionIndexes.copy(other_rnode.precursorReactionIndexes); + for (int j = 0; j < other_rnode.successorReactionIndexes.size(); ++j) { - auto& sr = other.successorReactionIndexes[j]; + auto& sr = other_rnode.successorReactionIndexes[j]; rn.successorReactionIndexes.push(sr); } } - for (int i = 0; i < reaction._reactions.size(); ++i) + for (int i = 0; i < other_pwr._reactions.size(); ++i) { - auto& other = reaction._reactions[i]; + auto& other_reaction = other_pwr._reactions[i]; auto& rc = _reactions.push(); - rc.productIndexes.copy(other.productIndexes); - rc.reactantIndexes.copy(other.reactantIndexes); + rc.productIndexes.copy(other_reaction.productIndexes); + rc.reactantIndexes.copy(other_reaction.reactantIndexes); } + + for (int i = 0; i < other_pwr._molecules.size(); ++i) + { + auto other_molecule = other_pwr._molecules[i]; + addMolecule(*other_molecule); + } + + _rootReaction.clone(other_pwr._rootReaction); } BaseReaction* PathwayReaction::neu() @@ -74,6 +83,15 @@ BaseReaction* PathwayReaction::neu() return new PathwayReaction; } +void PathwayReaction::clear() +{ + BaseReaction::clear(); + _reactionNodes.clear(); + _reactions.clear(); + _rootReaction.clear(); + _molecules.clear(); +} + int PathwayReaction::_addBaseMolecule(int side) { int idx = _allMolecules.add(new Molecule()); diff --git a/core/indigo-core/reaction/src/reaction_auto_loader.cpp b/core/indigo-core/reaction/src/reaction_auto_loader.cpp index ad655dabdd..e2d290f58b 100644 --- a/core/indigo-core/reaction/src/reaction_auto_loader.cpp +++ b/core/indigo-core/reaction/src/reaction_auto_loader.cpp @@ -308,8 +308,15 @@ std::unique_ptr ReactionAutoLoader::_loadReaction(bool query) std::unique_ptr reaction; if (is_pathway) { - reaction = std::make_unique(); - loader.loadReaction(*reaction); + auto pwr = std::make_unique(); + loader.loadReaction(*pwr); + if (pwr->reactionsCount() == 0) // something went wrong + { + reaction = std::make_unique(); + reaction->clone(*pwr); + } + else + reaction = std::move(pwr); } else if (query) { diff --git a/core/indigo-core/reaction/src/reaction_json_loader.cpp b/core/indigo-core/reaction/src/reaction_json_loader.cpp index eaf88d6c2c..2b4a4aef9f 100644 --- a/core/indigo-core/reaction/src/reaction_json_loader.cpp +++ b/core/indigo-core/reaction/src/reaction_json_loader.cpp @@ -75,14 +75,19 @@ void ReactionJsonLoader::loadReaction(BaseReaction& rxn) if (arrow_count > 1 || multi_count > 0) { ReactionMultistepDetector md(*_pmol); - md.detectReaction(); - if (multi_count) + switch (md.detectReaction()) { + case ReactionMultistepDetector::ReactionType::EPathwayReaction: md.constructPathwayReaction(static_cast(rxn)); PathwayReactionBuilder::buildRootReaction(static_cast(rxn)); - } - else + break; + case ReactionMultistepDetector::ReactionType::EMutistepReaction: md.constructMultipleArrowReaction(rxn); + break; + case ReactionMultistepDetector::ReactionType::ESimpleReaction: + md.constructSimpleArrowReaction(rxn); + break; + } } else parseOneArrowReaction(rxn); diff --git a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp index f1d5c7f251..b748ed9855 100644 --- a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp +++ b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp @@ -236,17 +236,20 @@ void ReactionMultistepDetector::createSummBlocks() } } -void ReactionMultistepDetector::detectReaction() +ReactionMultistepDetector::ReactionType ReactionMultistepDetector::detectReaction() { createSummBlocks(); - detectArrows(); - detectMultitailArrows(); - // _component_summ_blocks, _reaction_components - result + bool has_multistep = detectArrows(); + bool has_multitail = detectMultitailArrows(); + return has_multitail ? ReactionType::EPathwayReaction : (has_multistep ? ReactionType ::EMutistepReaction : ReactionType::ESimpleReaction); } -void ReactionMultistepDetector::detectArrows() +bool ReactionMultistepDetector::detectArrows() { - for (int i = 0; i < _bmol.meta().getMetaCount(KETReactionArrow::CID); ++i) + int arrow_count = _bmol.meta().getMetaCount(KETReactionArrow::CID); + if ( arrow_count == 0) + return false; + for (int i = 0; i < arrow_count; ++i) { auto& arrow = (const KETReactionArrow&)_bmol.meta().getMetaObject(KETReactionArrow::CID, i); int arrow_type = arrow.getArrowType(); @@ -301,11 +304,19 @@ void ReactionMultistepDetector::detectArrows() csb_min_prod.arrows_from.push_back(idx_cs_min_reac); } } + return arrow_count > 1; } -void ReactionMultistepDetector::detectMultitailArrows() +bool ReactionMultistepDetector::detectMultitailArrows() { - for (int i = 0; i < _bmol.meta().getMetaCount(KETReactionMultitailArrow::CID); ++i) + int pathway_count = _bmol.meta().getMetaCount(KETReactionMultitailArrow::CID); + + if ( pathway_count == 0) + return false; + + bool bad_pathway = false; + + for (int i = 0; i < pathway_count; ++i) { auto& multi = (const KETReactionMultitailArrow&)_bmol.meta().getMetaObject(KETReactionMultitailArrow::CID, i); float min_dist_prod = -1; @@ -348,40 +359,60 @@ void ReactionMultistepDetector::detectMultitailArrows() } } + for (auto& [min_dist, idx_cs_min_prod] : min_dist_reactants) + { + if ( min_dist < 0) + bad_pathway = true; + } + // TODO: add upper limit - if (min_dist_prod > 0) + if (idx_cs_min_prod < 0) + bad_pathway = true; + else { auto& csb_min_prod = _component_summ_blocks[idx_cs_min_prod]; - PathwayComponent pwc; - for (int j = 0; j < (int)min_dist_reactants.size(); ++j) + auto& rc_arrow = + _reaction_components[_moleculeCount + _bmol.meta().getMetaCount(KETReactionPlus::CID) + _bmol.meta().getMetaCount(KETReactionArrow::CID) + i]; + rc_arrow.summ_block_idx = ReactionComponent::CONNECTED; // mark arrow as connected + if (csb_min_prod.role == BaseReaction::UNDEFINED) + csb_min_prod.role = BaseReaction::PRODUCT; + else if (csb_min_prod.role == BaseReaction::REACTANT) + csb_min_prod.role = BaseReaction::INTERMEDIATE; + } + + PathwayComponent pwc; + + for (int j = 0; j < (int)min_dist_reactants.size(); ++j) + { + auto& reac = min_dist_reactants[j]; + if (reac.first > 0) { - auto& reac = min_dist_reactants[j]; - if (reac.first > 0) - { - if (j == 0) - { - auto& rc_arrow = _reaction_components[_moleculeCount + _bmol.meta().getMetaCount(KETReactionPlus::CID) + - _bmol.meta().getMetaCount(KETReactionArrow::CID) + i]; - rc_arrow.summ_block_idx = ReactionComponent::CONNECTED; // mark arrow as connected - if (csb_min_prod.role == BaseReaction::UNDEFINED) - csb_min_prod.role = BaseReaction::PRODUCT; - else if (csb_min_prod.role == BaseReaction::REACTANT) - csb_min_prod.role = BaseReaction::INTERMEDIATE; - } + auto& csb_min_reac = _component_summ_blocks[reac.second]; + if (csb_min_reac.role == BaseReaction::UNDEFINED) + csb_min_reac.role = BaseReaction::REACTANT; + else if (csb_min_reac.role == BaseReaction::PRODUCT) + csb_min_reac.role = BaseReaction::INTERMEDIATE; - auto& csb_min_reac = _component_summ_blocks[reac.second]; - if (csb_min_reac.role == BaseReaction::UNDEFINED) - csb_min_reac.role = BaseReaction::REACTANT; - else if (csb_min_reac.role == BaseReaction::PRODUCT) - csb_min_reac.role = BaseReaction::INTERMEDIATE; + // idx_cs_min_reac <-> idx_cs_min_prod - // idx_cs_min_reac <-> idx_cs_min_prod + if (idx_cs_min_prod >= 0) + { csb_min_reac.arrows_to.push_back(idx_cs_min_prod); - csb_min_prod.arrows_from.push_back(reac.second); + _component_summ_blocks[idx_cs_min_prod].arrows_from.push_back(reac.second); } } } } + for (auto& csb : _component_summ_blocks) + { + // no undefined components allowed + if (csb.role == BaseReaction::UNDEFINED) + { + csb.role = BaseReaction::REACTANT; + bad_pathway = true; + } + } + return !bad_pathway; } bool ReactionMultistepDetector::findPlusNeighbours(const Vec2f& plus_pos, const FLOAT_INT_PAIRS& mol_tops, const FLOAT_INT_PAIRS& mol_bottoms, @@ -545,7 +576,6 @@ void ReactionMultistepDetector::constructPathwayReaction(PathwayReaction& rxn) { auto& csb_reaction = csb_reactions[i]; auto& rn = rxn.getReactionNode(i); - // find which reactions the products' summblocks are connected to // normally we have only one summblock here for (auto csb_product_idx : csb_reaction.second) { @@ -654,3 +684,51 @@ void ReactionMultistepDetector::constructMultipleArrowReaction(BaseReaction& rxn } } } + +void indigo::ReactionMultistepDetector::constructSimpleArrowReaction(BaseReaction& rxn) +{ + for ( auto& csb : _component_summ_blocks ) + { + switch (csb.role) + { + case BaseReaction::PRODUCT: + { + for (auto idx : csb.indexes) + { + auto& rc = _reaction_components[idx]; + rxn.addProductCopy(*rc.molecule, 0, 0); + } + } + break; + case BaseReaction::REACTANT: + { + for (auto idx : csb.indexes) + { + auto& rc = _reaction_components[idx]; + rxn.addReactantCopy(*rc.molecule, 0, 0); + } + } + break; + case BaseReaction::INTERMEDIATE: + { + for (auto idx : csb.indexes) + { + auto& rc = _reaction_components[idx]; + rxn.addIntermediateCopy(*rc.molecule, 0, 0); + } + } + break; + case BaseReaction::UNDEFINED: + { + for (auto idx : csb.indexes) + { + auto& rc = _reaction_components[idx]; + rxn.addUndefinedCopy(*rc.molecule, 0, 0); + } + } + break; + default: + break; + } + } +} diff --git a/core/render2d/src/render_item_reaction.cpp b/core/render2d/src/render_item_reaction.cpp index f75ef9f0b8..eb0dc7cec4 100644 --- a/core/render2d/src/render_item_reaction.cpp +++ b/core/render2d/src/render_item_reaction.cpp @@ -19,6 +19,7 @@ #include "render_item_reaction.h" #include "base_cpp/output.h" #include "layout/metalayout.h" +#include "reaction/pathway_reaction.h" #include "reaction/query_reaction.h" #include "reaction/reaction.h" #include "render_context.h" @@ -41,11 +42,12 @@ void RenderItemReaction::init() throw Error("reaction not set"); int arrows_count = rxn->meta().getMetaCount(KETReactionArrow::CID); - if (rxn->begin() >= rxn->end() && !arrows_count) // no reactants or products + int multi_count = rxn->meta().getMetaCount(KETReactionMultitailArrow::CID); + if (rxn->begin() >= rxn->end() && !arrows_count && !multi_count) // no reactants or products return; int simple_count = rxn->meta().getMetaCount(KETSimpleObject::CID) + rxn->meta().getMetaCount(KETTextObject::CID); - if (arrows_count || simple_count) + if (arrows_count || simple_count || multi_count) { initWithMeta(); } @@ -113,14 +115,29 @@ void RenderItemReaction::initWithMeta() max = aux.max; items.push(_meta); - for (int i = rxn->begin(); i < rxn->end(); i = rxn->next(i)) + if (rxn->isPathwayReaction()) { - auto mol = _addFragment(i); - items.push(mol); - auto& frag = _factory.getItemFragment(mol); - frag.min.set(0, 0); - frag.max.set(0, 0); + auto& pwr = rxn->asPathwayReaction(); + for (int i = 0; i < pwr.getMoleculeCount(); ++i) + { + int mol = _factory.addItemFragment(); + _factory.getItemFragment(mol).mol = &pwr.getMolecule(i); + _factory.getItemFragment(mol).init(); + items.push(mol); + auto& frag = _factory.getItemFragment(mol); + frag.min.set(0, 0); + frag.max.set(0, 0); + } } + else + for (int i = rxn->begin(); i < rxn->end(); i = rxn->next(i)) + { + auto mol = _addFragment(i); + items.push(mol); + auto& frag = _factory.getItemFragment(mol); + frag.min.set(0, 0); + frag.max.set(0, 0); + } } int RenderItemReaction::_addPlus() diff --git a/utils/indigo-depict/main.c b/utils/indigo-depict/main.c index 74f0c58b84..d3586919bd 100644 --- a/utils/indigo-depict/main.c +++ b/utils/indigo-depict/main.c @@ -1058,7 +1058,7 @@ int main(int argc, char* argv[]) _prepare(obj, p.aromatization); if (p.action == ACTION_LAYOUT) { - indigoLayout(obj); + //indigoLayout(obj); if (p.out_ext == OEXT_CML) indigoSaveCmlToFile(obj, p.outfile); else if (p.out_ext == OEXT_RXN) From e403c3e80ee7023b82eda0f65e7e30bff98125ab Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Wed, 18 Sep 2024 07:30:19 +0200 Subject: [PATCH 16/30] conflicts resolve --- api/c/indigo/src/indigo_reaction.cpp | 17 ++-- api/c/indigo/src/indigo_reaction.h | 1 - .../layout/src/reaction_layout.cpp | 4 +- core/indigo-core/reaction/pathway_reaction.h | 2 +- .../reaction/src/pathway_reaction.cpp | 14 +-- .../src/reaction_multistep_detector.cpp | 86 +++++++++---------- utils/indigo-depict/main.c | 2 +- 7 files changed, 60 insertions(+), 66 deletions(-) diff --git a/api/c/indigo/src/indigo_reaction.cpp b/api/c/indigo/src/indigo_reaction.cpp index ecbcd2d9f0..72b76b6f19 100644 --- a/api/c/indigo/src/indigo_reaction.cpp +++ b/api/c/indigo/src/indigo_reaction.cpp @@ -23,11 +23,11 @@ #include "indigo_mapping.h" #include "indigo_molecule.h" #include "reaction/canonical_rsmiles_saver.h" +#include "reaction/pathway_reaction.h" #include "reaction/reaction_auto_loader.h" #include "reaction/reaction_automapper.h" #include "reaction/rsmiles_loader.h" #include "reaction/rxnfile_saver.h" -#include "reaction/pathway_reaction.h" #include // @@ -64,7 +64,6 @@ const char* IndigoBaseReaction::debugInfo() const // IndigoPathwayReaction // - IndigoPathwayReaction::IndigoPathwayReaction() : IndigoBaseReaction(REACTION) { init(); @@ -461,17 +460,17 @@ CEXPORT int indigoLoadReaction(int source) auto rxn = loader.loadReaction(false); std::unique_ptr rxnptr; if (rxn->isPathwayReaction()) - { - auto pwr = std::make_unique(); + { + auto pwr = std::make_unique(); pwr->init(std::move(rxn)); rxnptr = std::move(pwr); - } - else - { - auto reaction = std::make_unique(); + } + else + { + auto reaction = std::make_unique(); reaction->init(std::move(rxn)); rxnptr = std::move(reaction); - } + } return self.addObject(rxnptr.release()); } diff --git a/api/c/indigo/src/indigo_reaction.h b/api/c/indigo/src/indigo_reaction.h index c59f7344cc..910197344a 100644 --- a/api/c/indigo/src/indigo_reaction.h +++ b/api/c/indigo/src/indigo_reaction.h @@ -99,7 +99,6 @@ class DLLEXPORT IndigoPathwayReaction : public IndigoBaseReaction std::unique_ptr rxn; }; - class DLLEXPORT IndigoQueryReaction : public IndigoBaseReaction { public: diff --git a/core/indigo-core/layout/src/reaction_layout.cpp b/core/indigo-core/layout/src/reaction_layout.cpp index 026adf39d1..7a0e61a43d 100644 --- a/core/indigo-core/layout/src/reaction_layout.cpp +++ b/core/indigo-core/layout/src/reaction_layout.cpp @@ -46,7 +46,7 @@ void ReactionLayout::fixLayout() // Calculate rightTop of reactant bounding box bool invalid_layout = false; float cur_left = 0, cur_right = 0; - for (int i = _r.isRetrosyntetic() ? _r.productBegin() : _r.reactantBegin(); i != _r.isRetrosyntetic() ? _r.productEnd() : _r.reactantEnd(); + for (int i = _r.isRetrosyntetic() ? _r.productBegin() : _r.reactantBegin(); i != (_r.isRetrosyntetic() ? _r.productEnd() : _r.reactantEnd()); i = _r.isRetrosyntetic() ? _r.productNext(i) : _r.reactantNext(i)) { _r.getBaseMolecule(i).getBoundingBox(bb); @@ -60,7 +60,7 @@ void ReactionLayout::fixLayout() } // Calculate leftBottom of product bounding box - for (int i = _r.isRetrosyntetic() ? _r.reactantBegin() : _r.productBegin(); i != _r.isRetrosyntetic() ? _r.reactantEnd() : _r.productEnd(); + for (int i = _r.isRetrosyntetic() ? _r.reactantBegin() : _r.productBegin(); i != (_r.isRetrosyntetic() ? _r.reactantEnd() : _r.productEnd()); i = _r.isRetrosyntetic() ? _r.reactantNext(i) : _r.productNext(i)) { _r.getBaseMolecule(i).getBoundingBox(bb); diff --git a/core/indigo-core/reaction/pathway_reaction.h b/core/indigo-core/reaction/pathway_reaction.h index 3549c92d15..27761914ad 100644 --- a/core/indigo-core/reaction/pathway_reaction.h +++ b/core/indigo-core/reaction/pathway_reaction.h @@ -129,7 +129,7 @@ namespace indigo int reactionsCount() override { - return _reactions.size(); + return _reactions.size(); } Reaction& asReaction() override diff --git a/core/indigo-core/reaction/src/pathway_reaction.cpp b/core/indigo-core/reaction/src/pathway_reaction.cpp index a87b552e43..3e146b1663 100644 --- a/core/indigo-core/reaction/src/pathway_reaction.cpp +++ b/core/indigo-core/reaction/src/pathway_reaction.cpp @@ -70,12 +70,12 @@ void PathwayReaction::_cloneSub(BaseReaction& other) } for (int i = 0; i < other_pwr._molecules.size(); ++i) - { - auto other_molecule = other_pwr._molecules[i]; + { + auto other_molecule = other_pwr._molecules[i]; addMolecule(*other_molecule); - } + } - _rootReaction.clone(other_pwr._rootReaction); + _rootReaction.clone(other_pwr._rootReaction); } BaseReaction* PathwayReaction::neu() @@ -86,9 +86,9 @@ BaseReaction* PathwayReaction::neu() void PathwayReaction::clear() { BaseReaction::clear(); - _reactionNodes.clear(); - _reactions.clear(); - _rootReaction.clear(); + _reactionNodes.clear(); + _reactions.clear(); + _rootReaction.clear(); _molecules.clear(); } diff --git a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp index b748ed9855..e555199949 100644 --- a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp +++ b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp @@ -247,7 +247,7 @@ ReactionMultistepDetector::ReactionType ReactionMultistepDetector::detectReactio bool ReactionMultistepDetector::detectArrows() { int arrow_count = _bmol.meta().getMetaCount(KETReactionArrow::CID); - if ( arrow_count == 0) + if (arrow_count == 0) return false; for (int i = 0; i < arrow_count; ++i) { @@ -311,8 +311,8 @@ bool ReactionMultistepDetector::detectMultitailArrows() { int pathway_count = _bmol.meta().getMetaCount(KETReactionMultitailArrow::CID); - if ( pathway_count == 0) - return false; + if (pathway_count == 0) + return false; bool bad_pathway = false; @@ -361,7 +361,7 @@ bool ReactionMultistepDetector::detectMultitailArrows() for (auto& [min_dist, idx_cs_min_prod] : min_dist_reactants) { - if ( min_dist < 0) + if (min_dist < 0) bad_pathway = true; } @@ -404,14 +404,14 @@ bool ReactionMultistepDetector::detectMultitailArrows() } } for (auto& csb : _component_summ_blocks) - { + { // no undefined components allowed if (csb.role == BaseReaction::UNDEFINED) { csb.role = BaseReaction::REACTANT; bad_pathway = true; } - } + } return !bad_pathway; } @@ -687,48 +687,44 @@ void ReactionMultistepDetector::constructMultipleArrowReaction(BaseReaction& rxn void indigo::ReactionMultistepDetector::constructSimpleArrowReaction(BaseReaction& rxn) { - for ( auto& csb : _component_summ_blocks ) + for (auto& csb : _component_summ_blocks) { switch (csb.role) { - case BaseReaction::PRODUCT: - { - for (auto idx : csb.indexes) - { - auto& rc = _reaction_components[idx]; - rxn.addProductCopy(*rc.molecule, 0, 0); - } - } + case BaseReaction::PRODUCT: { + for (auto idx : csb.indexes) + { + auto& rc = _reaction_components[idx]; + rxn.addProductCopy(*rc.molecule, 0, 0); + } + } + break; + case BaseReaction::REACTANT: { + for (auto idx : csb.indexes) + { + auto& rc = _reaction_components[idx]; + rxn.addReactantCopy(*rc.molecule, 0, 0); + } + } + break; + case BaseReaction::INTERMEDIATE: { + for (auto idx : csb.indexes) + { + auto& rc = _reaction_components[idx]; + rxn.addIntermediateCopy(*rc.molecule, 0, 0); + } + } + break; + case BaseReaction::UNDEFINED: { + for (auto idx : csb.indexes) + { + auto& rc = _reaction_components[idx]; + rxn.addUndefinedCopy(*rc.molecule, 0, 0); + } + } + break; + default: break; - case BaseReaction::REACTANT: - { - for (auto idx : csb.indexes) - { - auto& rc = _reaction_components[idx]; - rxn.addReactantCopy(*rc.molecule, 0, 0); - } - } - break; - case BaseReaction::INTERMEDIATE: - { - for (auto idx : csb.indexes) - { - auto& rc = _reaction_components[idx]; - rxn.addIntermediateCopy(*rc.molecule, 0, 0); - } - } - break; - case BaseReaction::UNDEFINED: - { - for (auto idx : csb.indexes) - { - auto& rc = _reaction_components[idx]; - rxn.addUndefinedCopy(*rc.molecule, 0, 0); - } - } - break; - default: - break; - } + } } } diff --git a/utils/indigo-depict/main.c b/utils/indigo-depict/main.c index d3586919bd..74f0c58b84 100644 --- a/utils/indigo-depict/main.c +++ b/utils/indigo-depict/main.c @@ -1058,7 +1058,7 @@ int main(int argc, char* argv[]) _prepare(obj, p.aromatization); if (p.action == ACTION_LAYOUT) { - //indigoLayout(obj); + indigoLayout(obj); if (p.out_ext == OEXT_CML) indigoSaveCmlToFile(obj, p.outfile); else if (p.out_ext == OEXT_RXN) From dbf49deb73051397a7a62c8ddaeac69a045d5c57 Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Wed, 18 Sep 2024 07:33:11 +0200 Subject: [PATCH 17/30] clang format --- api/c/indigo-renderer/src/indigo_render2d.cpp | 2 +- api/c/indigo/src/indigo_object.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/c/indigo-renderer/src/indigo_render2d.cpp b/api/c/indigo-renderer/src/indigo_render2d.cpp index 0901a5256e..d45d419575 100644 --- a/api/c/indigo-renderer/src/indigo_render2d.cpp +++ b/api/c/indigo-renderer/src/indigo_render2d.cpp @@ -20,8 +20,8 @@ #include "base_cpp/scanner.h" #include "molecule/molecule.h" #include "molecule/query_molecule.h" -#include "reaction/query_reaction.h" #include "reaction/pathway_reaction.h" +#include "reaction/query_reaction.h" #include "reaction/reaction.h" #include "render_cdxml.h" diff --git a/api/c/indigo/src/indigo_object.cpp b/api/c/indigo/src/indigo_object.cpp index 2aa2868e6d..c4161ff11f 100644 --- a/api/c/indigo/src/indigo_object.cpp +++ b/api/c/indigo/src/indigo_object.cpp @@ -22,8 +22,8 @@ #include "base_cpp/output.h" #include "base_cpp/properties_map.h" -#include "reaction/reaction.h" #include "reaction/pathway_reaction.h" +#include "reaction/reaction.h" #include "indigo_internal.h" From 067ec1892b209cd654121c2180ab4577be4e903f Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Thu, 19 Sep 2024 05:28:10 +0200 Subject: [PATCH 18/30] all fixed --- .../integration/tests/formats/ket_cdxml.py | 4 +- .../ket_retro_arrow_and_simple_arrow.b64cdx | 2 +- .../ket_retro_arrow_and_simple_arrow.cdxml | 38 +++++----- ...e_arrow_retro_arrow_sum_of_products.b64cdx | 2 +- ...le_arrow_retro_arrow_sum_of_products.cdxml | 40 +++++------ .../formats/ref/ket_two_retro_arrows.b64cdx | 2 +- .../formats/ref/ket_two_retro_arrows.cdxml | 54 +++++++------- .../tests/formats/ref/multi_overlap.cdxml | 52 +++++++------- core/indigo-core/reaction/base_reaction.h | 9 ++- .../src/reaction_multistep_detector.cpp | 72 ++++++++----------- utils/indigo-depict/main.c | 2 +- 11 files changed, 135 insertions(+), 142 deletions(-) diff --git a/api/tests/integration/tests/formats/ket_cdxml.py b/api/tests/integration/tests/formats/ket_cdxml.py index bab3d4455f..ab0437fb38 100644 --- a/api/tests/integration/tests/formats/ket_cdxml.py +++ b/api/tests/integration/tests/formats/ket_cdxml.py @@ -60,9 +60,9 @@ def find_diff(a, b): ket_result = ket.json() # with open(os.path.join(ref_path, filename + ".ket"), "w") as file: - # file.write(ket_result) + # file.write(ket_result) # with open(os.path.join(ref_path, filename + ".cdxml"), "w") as file: - # file.write(cdxml_text) + # file.write(cdxml_text) with open(os.path.join(ref_path, filename) + ".ket", "r") as file: ket_ref = file.read() diff --git a/api/tests/integration/tests/formats/ref/ket_retro_arrow_and_simple_arrow.b64cdx b/api/tests/integration/tests/formats/ref/ket_retro_arrow_and_simple_arrow.b64cdx index 55e479dee5..216a358b6f 100644 --- a/api/tests/integration/tests/formats/ref/ket_retro_arrow_and_simple_arrow.b64cdx +++ b/api/tests/integration/tests/formats/ref/ket_retro_arrow_and_simple_arrow.b64cdx @@ -1 +1 @@ -VmpDRDAxMDAEAwIBAAAAAAAAAAAAAAAAAAAAAAUIBAAAAB4AGggCAAMAGwgCAAQAAAEkAAAAAgACAOn9BQBBcmlhbAMA6f0PAFRpbWVzIE5ldyBSb21hbgADMgAIAP///////wAAAAAAAP//AAAAAP////8AAAAA//8AAAAA/////wAAAAD/////AAD//wGAAAAAABAIAgABAA8IAgABAAOABAAAAASABQAAAAACCADFGc4AZATuAAAABIAGAAAAAAIIAMkZsABkBO4AAAAEgAcAAAAAAggAyxmhAFYJ1AAAAASACAAAAAIEAgAHACsEAgACAAACCADLGaEAev8HAQaAAAAAAAACCADLGaEAev8HASMIAQAAAAcZAAIAAAADAGAAyAAAAAIAAwAgAMgAAABOSDIAAAAABYAZAAAABAYEAAUAAAAFBgQABgAAAAAABYAaAAAABAYEAAYAAAAFBgQABwAAAAAABYAbAAAABAYEAAYAAAAFBgQACAAAAAAAAAADgAkAAAAEgAoAAAAAAggAewScAJDfaAIAAASACwAAAAACCAC6pq0AmCSBAgAABIAMAAAAAAIIABYvygCA33cCAAAEgA0AAAAAAggAFi/KAJzfWQIAAASADgAAAAACCAC6pq0AhJpQAgAABYAcAAAABAYEAAoAAAAFBgQADgAAAAAABYAdAAAABAYEAA4AAAAFBgQADQAAAAAABYAeAAAABAYEAA0AAAAFBgQADAAAAAAABYAfAAAABAYEAAwAAAAFBgQACwAAAAAABYAgAAAABAYEAAsAAAAFBgQACgAAAAAAAAADgA8AAAAEgBAAAAACBAIACAArBAIAAQAAAggAyRmwAII/fAEGgAAAAAAAAggAyRmwAII/fAEjCAEAAAAHDgABAAAAAwBgAMgAAABPSAAAAAAEgBEAAAAAAggAxxm/AGI6lgEAAASAEgAAAAIEAgAIACsEAgABAAACCADJGbAAuDWwAQaAAAAAAAACCADJGbAAuDWwASMIAQAAAAcOAAEAAAADAGAAyAAAAE9IAAAAAAWAIQAAAAQGBAAQAAAABQYEABEAAAAAAAWAIgAAAAQGBAARAAAABQYEABIAAAAAAAAAIYATAAAABAIQAMcZswDuIFcBxxmzAPRVIwE3CgIAAAA1CgIAAgAvCgIAAwAgCgIAWAIwCgIAWAIxCgIAlgAzCgIAWAIHAgwA7qBWAccZswAAAAAACAIMAPTVIwHHGbMAAAAAAAAAB4AjAAAAEwAEABMAAAAACgIAAQACCgIAIAAgCgIAWAIEAhAAxxmzAO6gVgHHGbMA9NUjAQAAIYAWAAAABAIQAG8urgD0VyQCby6uAFqT7gE3CgIAAAAvCgIAAQAgCgIAyggxCgIAMwI1CgIAAgAwCgIAGQAHAgwA9FckAm8urgAAAAAACAIMAFqT7gFvLq4AAAAAAAAADYAAAAAADoAAAAAAAQwEAAQAAAACDAQACQAAAAQMBAAjAAAAAAAOgAAAAAABDAQADwAAAAIMBAAEAAAABAwEABYAAAAAAAAAAAAAAAAA \ No newline at end of file +VmpDRDAxMDAEAwIBAAAAAAAAAAAAAAAAAAAAAAUIBAAAAB4AGggCAAMAGwgCAAQAAAEkAAAAAgACAOn9BQBBcmlhbAMA6f0PAFRpbWVzIE5ldyBSb21hbgADMgAIAP///////wAAAAAAAP//AAAAAP////8AAAAA//8AAAAA/////wAAAAD/////AAD//wGAAAAAABAIAgABAA8IAgABAAOABAAAAASABQAAAAACCADFGc4AZATuAAAABIAGAAAAAAIIAMkZsABkBO4AAAAEgAcAAAAAAggAyxmhAFYJ1AAAAASACAAAAAIEAgAHACsEAgACAAACCADLGaEAev8HAQaAAAAAAAACCADLGaEAev8HASMIAQAAAAcZAAIAAAADAGAAyAAAAAIAAwAgAMgAAABOSDIAAAAABYAZAAAABAYEAAUAAAAFBgQABgAAAAAABYAaAAAABAYEAAYAAAAFBgQABwAAAAAABYAbAAAABAYEAAYAAAAFBgQACAAAAAAAAAADgAkAAAAEgAoAAAACBAIACAArBAIAAQAAAggAyRmwAII/fAEGgAAAAAAAAggAyRmwAII/fAEjCAEAAAAHDgABAAAAAwBgAMgAAABPSAAAAAAEgAsAAAAAAggAxxm/AGI6lgEAAASADAAAAAIEAgAIACsEAgABAAACCADJGbAAuDWwAQaAAAAAAAACCADJGbAAuDWwASMIAQAAAAcOAAEAAAADAGAAyAAAAE9IAAAAAAWAHAAAAAQGBAAKAAAABQYEAAsAAAAAAAWAHQAAAAQGBAALAAAABQYEAAwAAAAAAAAAA4ANAAAABIAOAAAAAAIIAHsEnACQ32gCAAAEgA8AAAAAAggAuqatAJgkgQIAAASAEAAAAAACCAAWL8oAgN93AgAABIARAAAAAAIIABYvygCc31kCAAAEgBIAAAAAAggAuqatAISaUAIAAAWAHgAAAAQGBAAOAAAABQYEABIAAAAAAAWAHwAAAAQGBAASAAAABQYEABEAAAAAAAWAIAAAAAQGBAARAAAABQYEABAAAAAAAAWAIQAAAAQGBAAQAAAABQYEAA8AAAAAAAWAIgAAAAQGBAAPAAAABQYEAA4AAAAAAAAAIYATAAAABAIQAMcZswDuIFcBxxmzAPRVIwE3CgIAAAA1CgIAAgAvCgIAAwAgCgIAWAIwCgIAWAIxCgIAlgAzCgIAWAIHAgwA7qBWAccZswAAAAAACAIMAPTVIwHHGbMAAAAAAAAAB4AjAAAAEwAEABMAAAAACgIAAQACCgIAIAAgCgIAWAIEAhAAxxmzAO6gVgHHGbMA9NUjAQAAIYAWAAAABAIQAG8urgD0VyQCby6uAFqT7gE3CgIAAAAvCgIAAQAgCgIAyggxCgIAMwI1CgIAAgAwCgIAGQAHAgwA9FckAm8urgAAAAAACAIMAFqT7gFvLq4AAAAAAAAADYAAAAAADoAAAAAAAQwEAAQAAAACDAQADQAAAAQMBAAjAAAAAAAOgAAAAAABDAQACQAAAAIMBAAEAAAABAwEABYAAAAAAAAAAAAAAAAA \ No newline at end of file diff --git a/api/tests/integration/tests/formats/ref/ket_retro_arrow_and_simple_arrow.cdxml b/api/tests/integration/tests/formats/ref/ket_retro_arrow_and_simple_arrow.cdxml index 58b91269bb..07a9ba4c5e 100644 --- a/api/tests/integration/tests/formats/ref/ket_retro_arrow_and_simple_arrow.cdxml +++ b/api/tests/integration/tests/formats/ref/ket_retro_arrow_and_simple_arrow.cdxml @@ -32,38 +32,38 @@ - - - - - - - - - - - - - + OH - - + + OH - - + + + + + + + + + + + + + + - - + + diff --git a/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.b64cdx b/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.b64cdx index f4810c3b78..2f46df441c 100644 --- a/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.b64cdx +++ b/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.b64cdx @@ -1 +1 @@ -VmpDRDAxMDAEAwIBAAAAAAAAAAAAAAAAAAAAAAUIBAAAAB4AGggCAAMAGwgCAAQAAAEkAAAAAgACAOn9BQBBcmlhbAMA6f0PAFRpbWVzIE5ldyBSb21hbgADMgAIAP///////wAAAAAAAP//AAAAAP////8AAAAA//8AAAAA/////wAAAAD/////AAD//wGAAAAAABAIAgABAA8IAgABAAOABAAAAASABQAAAAACCAALVtYA1E6sAgAABIAGAAAAAAIIAEv45wDck8QCAAAEgAcAAAAAAggAqIAEAchOuwIAAASACAAAAAACCACogAQB4E6dAgAABIAJAAAAAAIIAEv45wDICZQCAAAFgCIAAAAEBgQABQAAAAUGBAAJAAAAAAAFgCMAAAAEBgQACQAAAAUGBAAIAAAAAAAFgCQAAAAEBgQACAAAAAUGBAAHAAAAAAAFgCUAAAAEBgQABwAAAAUGBAAGAAAAAAAFgCYAAAAEBgQABgAAAAUGBAAFAAAAAAAAAAOACgAAAASACwAAAAACCABlUdYAMM8TAwAABIAMAAAAAAIIAE6FBAEs0iIDAAAEgA0AAAAAAggAPCLoACAZLAMAAASADgAAAAACCABOhQQBOMwEAwAABIAPAAAAAAIIADwi6AB8hPsCAAAFgCcAAAAEBgQACwAAAAUGBAAPAAAAAAAFgCgAAAAEBgQADwAAAAUGBAAOAAAAAAYCAAIAAAAFgCkAAAAEBgQADgAAAAUGBAAMAAAAAAAFgCoAAAAEBgQADAAAAAUGBAANAAAAAAYCAAIAAAAFgCsAAAAEBgQADQAAAAUGBAALAAAAAAAAAAOAEAAAAASAEQAAAAIEAgAIACsEAgABAAACCABaa+oAyK6/AQaAAAAAAAACCABaa+oAyK6/ASMIAQAAAAcOAAEAAAADAGAAyAAAAE9IAAAAAASAEgAAAAACCABYa/kApqnZAQAABIATAAAAAgQCAAgAKwQCAAEAAAIIAFpr6gD8pPMBBoAAAAAAAAIIAFpr6gD8pPMBIwgBAAAABw4AAQAAAAMAYADIAAAAT0gAAAAABYAsAAAABAYEABEAAAAFBgQAEgAAAAAABYAtAAAABAYEABIAAAAFBgQAEwAAAAAAAAADgBQAAAAEgBUAAAAAAggAVmsIAahzMQEAAASAFgAAAAACCABaa+oAqHMxAQAABIAXAAAAAAIIAFtr2wCaeBcBAAAEgBgAAAACBAIABwArBAIAAgAAAggAW2vbALxuSwEGgAAAAAAAAggAW2vbALxuSwEjCAEAAAAHGQACAAAAAwBgAMgAAAACAAMAIADIAAAATkgyAAAAAAWALgAAAAQGBAAVAAAABQYEABYAAAAAAAWALwAAAAQGBAAWAAAABQYEABcAAAAAAAWAMAAAAAQGBAAWAAAABQYEABgAAAAAAAAAIYAZAAAABAIQAFhr7QA0kJoBWGvtADrFZgE3CgIAAAAvCgIAAQAgCgIAyggxCgIAMwI1CgIAAgAwCgIAGQAHAgwANJCaAVhr7QAAAAAACAIMADrFZgFYa+0AAAAAAAAAIYAcAAAABAIQAP//7AD4wHAC///sAABAJwI3CgIAAAA1CgIAAgAvCgIAAwAgCgIAWAIwCgIAWAIxCgIAlgAzCgIAWAIHAgwA+EBwAv//7AAAAAAACAIMAADAJwL//+wAAAAAAAAAB4AxAAAAEwAEABwAAAAACgIAAQACCgIAIAAgCgIAWAIEAhAA///sAPhAcAL//+wAAMAnAgAAB4AfAAAABAIQAFpr+QDMjuECWuvxAMyO4QIACgIABwAHCgIACAAAAA2AAAAAAA6AAAAAAAEMCAAEAAAACgAAAAIMBAAQAAAABAwEABkAAAAAAA6AAAAAAAEMBAAUAAAAAgwEABAAAAAEDAQAMQAAAAAAAAAAAAAAAAA= \ No newline at end of file +VmpDRDAxMDAEAwIBAAAAAAAAAAAAAAAAAAAAAAUIBAAAAB4AGggCAAMAGwgCAAQAAAEkAAAAAgACAOn9BQBBcmlhbAMA6f0PAFRpbWVzIE5ldyBSb21hbgADMgAIAP///////wAAAAAAAP//AAAAAP////8AAAAA//8AAAAA/////wAAAAD/////AAD//wGAAAAAABAIAgABAA8IAgABAAOABAAAAASABQAAAAACCAALVtYA1E6sAgAABIAGAAAAAAIIAEv45wDck8QCAAAEgAcAAAAAAggAqIAEAchOuwIAAASACAAAAAACCACogAQB4E6dAgAABIAJAAAAAAIIAEv45wDICZQCAAAFgCIAAAAEBgQABQAAAAUGBAAJAAAAAAAFgCMAAAAEBgQACQAAAAUGBAAIAAAAAAAFgCQAAAAEBgQACAAAAAUGBAAHAAAAAAAFgCUAAAAEBgQABwAAAAUGBAAGAAAAAAAFgCYAAAAEBgQABgAAAAUGBAAFAAAAAAAAAAOACgAAAASACwAAAAACCABlUdYAMM8TAwAABIAMAAAAAAIIAE6FBAEs0iIDAAAEgA0AAAAAAggAPCLoACAZLAMAAASADgAAAAACCABOhQQBOMwEAwAABIAPAAAAAAIIADwi6AB8hPsCAAAFgCcAAAAEBgQACwAAAAUGBAAPAAAAAAAFgCgAAAAEBgQADwAAAAUGBAAOAAAAAAYCAAIAAAAFgCkAAAAEBgQADgAAAAUGBAAMAAAAAAAFgCoAAAAEBgQADAAAAAUGBAANAAAAAAYCAAIAAAAFgCsAAAAEBgQADQAAAAUGBAALAAAAAAAAAAOAEAAAAASAEQAAAAACCABWawgBqHMxAQAABIASAAAAAAIIAFpr6gCoczEBAAAEgBMAAAAAAggAW2vbAJp4FwEAAASAFAAAAAIEAgAHACsEAgACAAACCABba9sAvG5LAQaAAAAAAAACCABba9sAvG5LASMIAQAAAAcZAAIAAAADAGAAyAAAAAIAAwAgAMgAAABOSDIAAAAABYAsAAAABAYEABEAAAAFBgQAEgAAAAAABYAtAAAABAYEABIAAAAFBgQAEwAAAAAABYAuAAAABAYEABIAAAAFBgQAFAAAAAAAAAADgBUAAAAEgBYAAAACBAIACAArBAIAAQAAAggAWmvqAMiuvwEGgAAAAAAAAggAWmvqAMiuvwEjCAEAAAAHDgABAAAAAwBgAMgAAABPSAAAAAAEgBcAAAAAAggAWGv5AKap2QEAAASAGAAAAAIEAgAIACsEAgABAAACCABaa+oA/KTzAQaAAAAAAAACCABaa+oA/KTzASMIAQAAAAcOAAEAAAADAGAAyAAAAE9IAAAAAAWALwAAAAQGBAAWAAAABQYEABcAAAAAAAWAMAAAAAQGBAAXAAAABQYEABgAAAAAAAAAIYAZAAAABAIQAFhr7QA0kJoBWGvtADrFZgE3CgIAAAAvCgIAAQAgCgIAyggxCgIAMwI1CgIAAgAwCgIAGQAHAgwANJCaAVhr7QAAAAAACAIMADrFZgFYa+0AAAAAAAAAIYAcAAAABAIQAP//7AD4wHAC///sAABAJwI3CgIAAAA1CgIAAgAvCgIAAwAgCgIAWAIwCgIAWAIxCgIAlgAzCgIAWAIHAgwA+EBwAv//7AAAAAAACAIMAADAJwL//+wAAAAAAAAAB4AxAAAAEwAEABwAAAAACgIAAQACCgIAIAAgCgIAWAIEAhAA///sAPhAcAL//+wAAMAnAgAAB4AfAAAABAIQAFpr+QDMjuECWuvxAMyO4QIACgIABwAHCgIACAAAAA2AAAAAAA6AAAAAAAEMCAAEAAAACgAAAAIMBAAVAAAABAwEABkAAAAAAA6AAAAAAAEMBAAQAAAAAgwEABUAAAAEDAQAMQAAAAAAAAAAAAAAAAA= \ No newline at end of file diff --git a/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.cdxml b/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.cdxml index 4d9f70dd48..0b016f9dc4 100644 --- a/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.cdxml +++ b/api/tests/integration/tests/formats/ref/ket_simple_arrow_retro_arrow_sum_of_products.cdxml @@ -42,41 +42,41 @@ - + + + + + + NH + 2 + + + + + + + + OH - - + + OH - - - - - - - - - - NH - 2 - - - - + - - + + diff --git a/api/tests/integration/tests/formats/ref/ket_two_retro_arrows.b64cdx b/api/tests/integration/tests/formats/ref/ket_two_retro_arrows.b64cdx index 97563871ba..2f5a635001 100644 --- a/api/tests/integration/tests/formats/ref/ket_two_retro_arrows.b64cdx +++ b/api/tests/integration/tests/formats/ref/ket_two_retro_arrows.b64cdx @@ -1 +1 @@ -VmpDRDAxMDAEAwIBAAAAAAAAAAAAAAAAAAAAAAUIBAAAAB4AGggCAAMAGwgCAAQAAAEkAAAAAgACAOn9BQBBcmlhbAMA6f0PAFRpbWVzIE5ldyBSb21hbgADMgAIAP///////wAAAAAAAP//AAAAAP////8AAAAA//8AAAAA/////wAAAAD/////AAD//wGAAAAAABAIAgABAA8IAgABAAOABAAAAASABQAAAAACCADCWwMBzLtcAgAABIAGAAAAAAIIAAD+FAHUAHUCAAAEgAcAAAAAAggAXIYxAby7awIAAASACAAAAAACCABchjEB2LtNAgAABIAJAAAAAAIIAAD+FAHAdkQCAAAFgBkAAAAEBgQABQAAAAUGBAAJAAAAAAAFgBoAAAAEBgQACQAAAAUGBAAIAAAAAAAFgBsAAAAEBgQACAAAAAUGBAAHAAAAAAAFgBwAAAAEBgQABwAAAAUGBAAGAAAAAAAFgB0AAAAEBgQABgAAAAUGBAAFAAAAAAAAAAOACgAAAASACwAAAAACCAAMcTUBoODhAAAABIAMAAAAAAIIAA5xFwGg4OEAAAAEgA0AAAAAAggAEHEIAZLlxwAAAASADgAAAAIEAgAHACsEAgACAAACCAAQcQgBtdv7AAaAAAAAAAACCAAQcQgBtdv7ACMIAQAAAAcZAAIAAAADAGAAyAAAAAIAAwAgAMgAAABOSDIAAAAABYAeAAAABAYEAAsAAAAFBgQADAAAAAAABYAfAAAABAYEAAwAAAAFBgQADQAAAAAABYAgAAAABAYEAAwAAAAFBgQADgAAAAAAAAADgA8AAAAEgBAAAAACBAIACAArBAIAAQAAAggADnEXAcAbcAEGgAAAAAAAAggADnEXAcAbcAEjCAEAAAAHDgABAAAAAwBgAMgAAABPSAAAAAAEgBEAAAAAAggADHEmAZ4WigEAAASAEgAAAAIEAgAIACsEAgABAAACCAAOcRcB9BGkAQaAAAAAAAACCAAOcRcB9BGkASMIAQAAAAcOAAEAAAADAGAAyAAAAE9IAAAAAAWAIQAAAAQGBAAQAAAABQYEABEAAAAAAAWAIgAAAAQGBAARAAAABQYEABIAAAAAAAAAIYATAAAABAIQAA7xFQEyckYBDvEVARRoHAE3CgIAAAA1CgIAAgAvCgIAAwAgCgIAWAIwCgIAWAIxCgIAlgAzCgIAWAIHAgwAMvJFAQ7xFQEAAAAACAIMABToHAEO8RUBAAAAAAAAB4AjAAAAEwAEABMAAAAACgIAAQACCgIAIAAgCgIAWAIEAhAADvEVATLyRQEO8RUBFOgcAQAAIYAWAAAABAIQALaFGAGYbw8CtoUYASRz5gE3CgIAAAA1CgIAAgAvCgIAAwAgCgIAWAIwCgIAWAIxCgIAlgAzCgIAWAIHAgwAmO8OAraFGAEAAAAACAIMACTz5gG2hRgBAAAAAAAAB4AkAAAAEwAEABYAAAAACgIAAQACCgIAIAAgCgIAWAIEAhAAtoUYAZjvDgK2hRgBJPPmAQAADYAAAAAADoAAAAAABAwEACMAAAAAAA6AAAAAAAQMBAAkAAAAAAAAAAAAAAAAAA== \ No newline at end of file +VmpDRDAxMDAEAwIBAAAAAAAAAAAAAAAAAAAAAAUIBAAAAB4AGggCAAMAGwgCAAQAAAEkAAAAAgACAOn9BQBBcmlhbAMA6f0PAFRpbWVzIE5ldyBSb21hbgADMgAIAP///////wAAAAAAAP//AAAAAP////8AAAAA//8AAAAA/////wAAAAD/////AAD//wGAAAAAABAIAgABAA8IAgABAAOABAAAAASABQAAAAACCAAMcTUBoODhAAAABIAGAAAAAAIIAA5xFwGg4OEAAAAEgAcAAAAAAggAEHEIAZLlxwAAAASACAAAAAIEAgAHACsEAgACAAACCAAQcQgBtdv7AAaAAAAAAAACCAAQcQgBtdv7ACMIAQAAAAcZAAIAAAADAGAAyAAAAAIAAwAgAMgAAABOSDIAAAAABYAZAAAABAYEAAUAAAAFBgQABgAAAAAABYAaAAAABAYEAAYAAAAFBgQABwAAAAAABYAbAAAABAYEAAYAAAAFBgQACAAAAAAAAAADgAkAAAAEgAoAAAACBAIACAArBAIAAQAAAggADnEXAcAbcAEGgAAAAAAAAggADnEXAcAbcAEjCAEAAAAHDgABAAAAAwBgAMgAAABPSAAAAAAEgAsAAAAAAggADHEmAZ4WigEAAASADAAAAAIEAgAIACsEAgABAAACCAAOcRcB9BGkAQaAAAAAAAACCAAOcRcB9BGkASMIAQAAAAcOAAEAAAADAGAAyAAAAE9IAAAAAAWAHAAAAAQGBAAKAAAABQYEAAsAAAAAAAWAHQAAAAQGBAALAAAABQYEAAwAAAAAAAAAA4ANAAAABIAOAAAAAAIIAMJbAwHMu1wCAAAEgA8AAAAAAggAAP4UAdQAdQIAAASAEAAAAAACCABchjEBvLtrAgAABIARAAAAAAIIAFyGMQHYu00CAAAEgBIAAAAAAggAAP4UAcB2RAIAAAWAHgAAAAQGBAAOAAAABQYEABIAAAAAAAWAHwAAAAQGBAASAAAABQYEABEAAAAAAAWAIAAAAAQGBAARAAAABQYEABAAAAAAAAWAIQAAAAQGBAAQAAAABQYEAA8AAAAAAAWAIgAAAAQGBAAPAAAABQYEAA4AAAAAAAAAIYATAAAABAIQAA7xFQEyckYBDvEVARRoHAE3CgIAAAA1CgIAAgAvCgIAAwAgCgIAWAIwCgIAWAIxCgIAlgAzCgIAWAIHAgwAMvJFAQ7xFQEAAAAACAIMABToHAEO8RUBAAAAAAAAB4AjAAAAEwAEABMAAAAACgIAAQACCgIAIAAgCgIAWAIEAhAADvEVATLyRQEO8RUBFOgcAQAAIYAWAAAABAIQALaFGAGYbw8CtoUYASRz5gE3CgIAAAA1CgIAAgAvCgIAAwAgCgIAWAIwCgIAWAIxCgIAlgAzCgIAWAIHAgwAmO8OAraFGAEAAAAACAIMACTz5gG2hRgBAAAAAAAAB4AkAAAAEwAEABYAAAAACgIAAQACCgIAIAAgCgIAWAIEAhAAtoUYAZjvDgK2hRgBJPPmAQAADYAAAAAADoAAAAAAAQwEAA0AAAACDAQABAAAAAQMBAAjAAAAAAAOgAAAAAABDAQADQAAAAIMBAAJAAAABAwEACQAAAAAAAAAAAAAAAAA \ No newline at end of file diff --git a/api/tests/integration/tests/formats/ref/ket_two_retro_arrows.cdxml b/api/tests/integration/tests/formats/ref/ket_two_retro_arrows.cdxml index 51992f46a5..48940a2bba 100644 --- a/api/tests/integration/tests/formats/ref/ket_two_retro_arrows.cdxml +++ b/api/tests/integration/tests/formats/ref/ket_two_retro_arrows.cdxml @@ -18,53 +18,53 @@ - - - - - - - - - - - - - - - - + + + + NH 2 - - - + + + - - + + OH - - + + OH - - + + + + + + + + + + + + + + - - + + diff --git a/api/tests/integration/tests/formats/ref/multi_overlap.cdxml b/api/tests/integration/tests/formats/ref/multi_overlap.cdxml index 73117e894c..b8b04bc8d1 100644 --- a/api/tests/integration/tests/formats/ref/multi_overlap.cdxml +++ b/api/tests/integration/tests/formats/ref/multi_overlap.cdxml @@ -36,34 +36,34 @@ - - - - - - - - - - - - - - - - - + + + + + + + O - - - - - - - + + + + + + + + + + + + + + + + + @@ -98,8 +98,8 @@ - - + + diff --git a/core/indigo-core/reaction/base_reaction.h b/core/indigo-core/reaction/base_reaction.h index ffa8eed87e..0bbe077a5f 100644 --- a/core/indigo-core/reaction/base_reaction.h +++ b/core/indigo-core/reaction/base_reaction.h @@ -199,7 +199,14 @@ namespace indigo virtual int reactionBegin() { - return 0; + int i = 0; + for (; i < _reactionBlocks.size(); ++i) + { + auto& rb = _reactionBlocks[i]; + if (rb.products.size() || rb.reactants.size()) + break; + } + return i; } virtual int reactionEnd() diff --git a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp index e555199949..ba20bd4159 100644 --- a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp +++ b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp @@ -621,65 +621,51 @@ void ReactionMultistepDetector::constructMultipleArrowReaction(BaseReaction& rxn for (int i = 0; i < (int)_component_summ_blocks.size(); ++i) { auto& csb = _component_summ_blocks[i]; - auto& rb = rxn.addReactionBlock(); - if (csb.indexes.size() && csb.role != BaseReaction::PRODUCT) + for (auto idx : csb.indexes) { - for (auto idx : csb.indexes) - { - auto& rc = _reaction_components[idx]; - int mol_idx = -1; - auto it_copied = copied_components.find(idx); - if (it_copied != copied_components.end()) - mol_idx = it_copied->second; + auto& rc = _reaction_components[idx]; + if (!copied_components.count(idx)) switch (csb.role) { case BaseReaction::INTERMEDIATE: - if (mol_idx < 0) - { - mol_idx = rxn.addIntermediateCopy(*rc.molecule, 0, 0); - copied_components.emplace(idx, mol_idx); - } - rb.reactants.push(mol_idx); + copied_components.emplace(idx, rxn.addIntermediateCopy(*rc.molecule, 0, 0)); break; case BaseReaction::REACTANT: - if (mol_idx < 0) - { - mol_idx = rxn.addReactantCopy(*rc.molecule, 0, 0); - copied_components.emplace(idx, mol_idx); - } - rb.reactants.push(mol_idx); + copied_components.emplace(idx, rxn.addReactantCopy(*rc.molecule, 0, 0)); + break; + case BaseReaction::PRODUCT: + copied_components.emplace(idx, rxn.addProductCopy(*rc.molecule, 0, 0)); break; case BaseReaction::UNDEFINED: copied_components.emplace(idx, rxn.addUndefinedCopy(*rc.molecule, 0, 0)); break; default: - // skip products here break; } + } + } + + for (int i = 0; i < (int)_component_summ_blocks.size(); ++i) + { + auto& csb = _component_summ_blocks[i]; + for (auto csb_index : csb.arrows_to) + { + auto& rb = rxn.addReactionBlock(); + // add reactants + for (auto ridx : csb.indexes) + { + auto r_it = copied_components.find(ridx); + if (r_it != copied_components.end()) + rb.reactants.push(r_it->second); } - for (auto csb_index : csb.arrows_to) + // add products + auto& csb_product = _component_summ_blocks[csb_index]; + for (auto pidx : csb_product.indexes) { - auto& csb_product = _component_summ_blocks[csb_index]; - for (auto pidx : csb_product.indexes) - { - auto& rc = _reaction_components[pidx]; - auto it_copied = copied_components.find(pidx); - int mol_idx = -1; - if (it_copied != copied_components.end()) - { - mol_idx = it_copied->second; - } - else - { - if (csb_product.role == BaseReaction::PRODUCT) - mol_idx = rxn.addProductCopy(*rc.molecule, 0, 0); - else if (csb_product.role == BaseReaction::INTERMEDIATE) - mol_idx = rxn.addIntermediateCopy(*rc.molecule, 0, 0); - copied_components.emplace(pidx, mol_idx); - } - rb.products.push(mol_idx); - } + auto p_it = copied_components.find(pidx); + if (p_it != copied_components.end()) + rb.products.push(p_it->second); } } } diff --git a/utils/indigo-depict/main.c b/utils/indigo-depict/main.c index 74f0c58b84..d3586919bd 100644 --- a/utils/indigo-depict/main.c +++ b/utils/indigo-depict/main.c @@ -1058,7 +1058,7 @@ int main(int argc, char* argv[]) _prepare(obj, p.aromatization); if (p.action == ACTION_LAYOUT) { - indigoLayout(obj); + //indigoLayout(obj); if (p.out_ext == OEXT_CML) indigoSaveCmlToFile(obj, p.outfile); else if (p.out_ext == OEXT_RXN) From f107079d2ba9097a77a9ba37ad89c593e58709bd Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Thu, 19 Sep 2024 06:22:39 +0200 Subject: [PATCH 19/30] all fixed --- core/indigo-core/layout/src/reaction_layout.cpp | 5 +++-- core/indigo-core/reaction/pathway_reaction.h | 6 ++++++ utils/indigo-depict/main.c | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/core/indigo-core/layout/src/reaction_layout.cpp b/core/indigo-core/layout/src/reaction_layout.cpp index 7a0e61a43d..b0eaaa289c 100644 --- a/core/indigo-core/layout/src/reaction_layout.cpp +++ b/core/indigo-core/layout/src/reaction_layout.cpp @@ -39,7 +39,8 @@ void ReactionLayout::fixLayout() { int arrows_count = _r.meta().getMetaCount(KETReactionArrow::CID); int simple_count = _r.meta().getMetaCount(KETSimpleObject::CID) + _r.meta().getMetaCount(KETTextObject::CID); - if (arrows_count > 1 || simple_count) + int multi_count = _r.meta().getMetaCount(KETReactionMultitailArrow::CID); + if (arrows_count > 1 || simple_count || multi_count) return; Rect2f bb; @@ -209,7 +210,7 @@ void ReactionLayout::makePathwayFromSimple() PathwayReactionBuilder prb; auto pwr = prb.buildPathwayReaction(reactions); _r.meta().resetReactionData(); - pwr->meta().clone(_r.meta()); + pwr->meta().append(_r.meta()); pwr->copyToReaction(_r); } diff --git a/core/indigo-core/reaction/pathway_reaction.h b/core/indigo-core/reaction/pathway_reaction.h index 27761914ad..73cffbaec6 100644 --- a/core/indigo-core/reaction/pathway_reaction.h +++ b/core/indigo-core/reaction/pathway_reaction.h @@ -186,6 +186,12 @@ namespace indigo case INTERMEDIATE: reaction.addIntermediateCopy(*_molecules[kvp.first], 0, 0); break; + case CATALYST: + reaction.addCatalystCopy(*_molecules[kvp.first], 0, 0); + break; + case UNDEFINED: + reaction.addUndefinedCopy(*_molecules[kvp.first], 0, 0); + break; } } } diff --git a/utils/indigo-depict/main.c b/utils/indigo-depict/main.c index d3586919bd..74f0c58b84 100644 --- a/utils/indigo-depict/main.c +++ b/utils/indigo-depict/main.c @@ -1058,7 +1058,7 @@ int main(int argc, char* argv[]) _prepare(obj, p.aromatization); if (p.action == ACTION_LAYOUT) { - //indigoLayout(obj); + indigoLayout(obj); if (p.out_ext == OEXT_CML) indigoSaveCmlToFile(obj, p.outfile); else if (p.out_ext == OEXT_RXN) From 39200a83d77983fbb062c75d408f0b7667304720 Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Thu, 19 Sep 2024 07:19:45 +0200 Subject: [PATCH 20/30] all fixed --- .../tests/basic/ref/crazystereo.ket | 108 +++++++++--------- .../integration/tests/layout/ref/balance.ket | 36 +++--- .../layout/src/reaction_layout.cpp | 2 +- core/indigo-core/reaction/pathway_reaction.h | 4 +- 4 files changed, 75 insertions(+), 75 deletions(-) diff --git a/api/tests/integration/tests/basic/ref/crazystereo.ket b/api/tests/integration/tests/basic/ref/crazystereo.ket index c9e0734e6a..31c229d90a 100644 --- a/api/tests/integration/tests/basic/ref/crazystereo.ket +++ b/api/tests/integration/tests/basic/ref/crazystereo.ket @@ -13,13 +13,13 @@ "mode": "open-angle", "pos": [ { - "x": -5.879899978637695, - "y": 0.5597999691963196, + "x": -5.2799, + "y": 0.5598, "z": 0.0 }, { - "x": -3.7695000171661379, - "y": 0.8544500470161438, + "x": -4.3695, + "y": 0.85445, "z": 0.0 } ] @@ -33,80 +33,80 @@ { "label": "C", "location": [ - -8.308899879455567, - 0.9722999930381776, + -8.3089, + 0.9723, 0.0 ] }, { "label": "C", "location": [ - -9.02340030670166, - 1.3847999572753909, + -9.0234, + 1.3848, 0.0 ] }, { "label": "C", "location": [ - -9.737899780273438, - 0.9722999930381776, + -9.7379, + 0.9723, 0.0 ] }, { "label": "C", "location": [ - -9.737899780273438, - 0.14730000495910645, + -9.7379, + 0.1473, 0.0 ] }, { "label": "C", "location": [ - -9.02340030670166, - -0.2651999890804291, + -9.0234, + -0.2652, 0.0 ] }, { "label": "C", "location": [ - -8.308899879455567, - 0.14730000495910645, + -8.3089, + 0.1473, 0.0 ] }, { "label": "C", "location": [ - -7.594500064849854, - -0.2651999890804291, + -7.5945, + -0.2652, 0.0 ] }, { "label": "C", "location": [ - -6.879899978637695, - 0.14730000495910645, + -6.8799, + 0.1473, 0.0 ] }, { "label": "C", "location": [ - -6.879899978637695, - 0.9722999930381776, + -6.8799, + 0.9723, 0.0 ] }, { "label": "C", "location": [ - -7.594500064849854, - 1.3847999572753909, + -7.5945, + 1.3848, 0.0 ] } @@ -197,24 +197,24 @@ { "label": "C", "location": [ - 0.08839999884366989, - 2.710700035095215, + 0.0884, + 2.7107, 0.0 ] }, { "label": "C", "location": [ - -0.6261000037193298, - 2.2981998920440676, + -0.6261, + 2.2982, 0.0 ] }, { "label": "C", "location": [ - -0.6261000037193298, - 1.4731999635696412, + -0.6261, + 1.4732, 0.0 ], "stereoLabel": "&1" @@ -222,32 +222,32 @@ { "label": "C", "location": [ - 0.08839999884366989, - 1.0607000589370728, + 0.0884, + 1.0607, 0.0 ] }, { "label": "C", "location": [ - 0.8029000163078308, - 1.4731999635696412, + 0.8029, + 1.4732, 0.0 ] }, { "label": "C", "location": [ - 0.8029000163078308, - 2.2981998920440676, + 0.8029, + 2.2982, 0.0 ] }, { "label": "C", "location": [ - -1.340499997138977, - 1.0607000589370728, + -1.3405, + 1.0607, 0.0 ], "stereoLabel": "&1" @@ -255,64 +255,64 @@ { "label": "C", "location": [ - -2.055000066757202, - 1.4731999635696412, + -2.055, + 1.4732, 0.0 ] }, { "label": "C", "location": [ - -2.769500017166138, - 1.0607000589370728, + -2.7695, + 1.0607, 0.0 ] }, { "label": "C", "location": [ - -2.769500017166138, - 0.23569999635219578, + -2.7695, + 0.2357, 0.0 ] }, { "label": "C", "location": [ - -2.055000066757202, - -0.1767999976873398, + -2.055, + -0.1768, 0.0 ] }, { "label": "C", "location": [ - -1.340499997138977, - 0.23569999635219578, + -1.3405, + 0.2357, 0.0 ] }, { "label": "P", "location": [ - -0.6261000037193298, - -0.1767999976873398, + -0.6261, + -0.1768, 0.0 ] }, { "label": "C", "location": [ - 0.1988999992609024, - -0.1767999976873398, + 0.1989, + -0.1768, 0.0 ] }, { "label": "C", "location": [ - -0.6261000037193298, - -1.0017999410629273, + -0.6261, + -1.0018, 0.0 ] } diff --git a/api/tests/integration/tests/layout/ref/balance.ket b/api/tests/integration/tests/layout/ref/balance.ket index 5e8dbe1d8a..322e161556 100644 --- a/api/tests/integration/tests/layout/ref/balance.ket +++ b/api/tests/integration/tests/layout/ref/balance.ket @@ -16,7 +16,7 @@ { "type": "plus", "location": [ - 4.699999809265137, + 4.099999904632568, 0.0, 0.0 ] @@ -24,7 +24,7 @@ { "type": "plus", "location": [ - 17.700000762939454, + 17.099998474121099, 0.0, 0.0 ] @@ -35,12 +35,12 @@ "mode": "equilibrium-filled-half-bow", "pos": [ { - "x": 9.100000381469729, + "x": 9.0, "y": 0.0, "z": 0.0 }, { - "x": 13.30000114440918, + "x": 12.199999809265137, "y": 0.0, "z": 0.0 } @@ -55,7 +55,7 @@ { "label": "C", "location": [ - 1.2999999523162842, + 0.800000011920929, 0.6928203105926514, 0.0 ] @@ -63,7 +63,7 @@ { "label": "C", "location": [ - 2.899999856948853, + 2.399999856948853, 0.6928203105926514, 0.0 ] @@ -71,7 +71,7 @@ { "label": "C", "location": [ - 2.0999999046325685, + 1.5999999046325684, -0.6928203105926514, 0.0 ] @@ -107,7 +107,7 @@ { "label": "C", "location": [ - 6.5, + 5.800000190734863, 0.7999999523162842, 0.0 ] @@ -115,7 +115,7 @@ { "label": "C", "location": [ - 8.100000381469727, + 7.400000095367432, 0.7999999523162842, 0.0 ] @@ -123,7 +123,7 @@ { "label": "C", "location": [ - 6.5, + 5.800000190734863, -0.7999999523162842, 0.0 ] @@ -131,7 +131,7 @@ { "label": "C", "location": [ - 8.100000381469727, + 7.400000095367432, -0.7999999523162842, 0.0 ] @@ -174,7 +174,7 @@ { "label": "C", "location": [ - 14.30000114440918, + 13.800000190734864, 0.7999999523162842, 0.0 ] @@ -182,7 +182,7 @@ { "label": "C", "location": [ - 15.900001525878908, + 15.399999618530274, 0.7999999523162842, 0.0 ] @@ -190,7 +190,7 @@ { "label": "C", "location": [ - 14.30000114440918, + 13.800000190734864, -0.7999999523162842, 0.0 ] @@ -198,7 +198,7 @@ { "label": "C", "location": [ - 15.900001525878908, + 15.399999618530274, -0.7999999523162842, 0.0 ] @@ -241,7 +241,7 @@ { "label": "C", "location": [ - 19.5, + 18.799997329711919, 0.6928203105926514, 0.0 ] @@ -249,7 +249,7 @@ { "label": "C", "location": [ - 21.100000381469728, + 20.39999771118164, 0.6928203105926514, 0.0 ] @@ -257,7 +257,7 @@ { "label": "C", "location": [ - 20.299999237060548, + 19.59999656677246, -0.6928203105926514, 0.0 ] diff --git a/core/indigo-core/layout/src/reaction_layout.cpp b/core/indigo-core/layout/src/reaction_layout.cpp index 800b78c83d..be99be97c6 100644 --- a/core/indigo-core/layout/src/reaction_layout.cpp +++ b/core/indigo-core/layout/src/reaction_layout.cpp @@ -15,9 +15,9 @@ * See the License for the specific language governing permissions and * limitations under the License. ***************************************************************************/ +#include #include #include -#include #include "layout/molecule_layout.h" #include "layout/reaction_layout.h" diff --git a/core/indigo-core/reaction/pathway_reaction.h b/core/indigo-core/reaction/pathway_reaction.h index 73cffbaec6..7894a566a4 100644 --- a/core/indigo-core/reaction/pathway_reaction.h +++ b/core/indigo-core/reaction/pathway_reaction.h @@ -187,8 +187,8 @@ namespace indigo reaction.addIntermediateCopy(*_molecules[kvp.first], 0, 0); break; case CATALYST: - reaction.addCatalystCopy(*_molecules[kvp.first], 0, 0); - break; + reaction.addCatalystCopy(*_molecules[kvp.first], 0, 0); + break; case UNDEFINED: reaction.addUndefinedCopy(*_molecules[kvp.first], 0, 0); break; From 1b87d854b5cee7137350ffc6200b97d17a07bf4f Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Thu, 19 Sep 2024 08:25:32 +0200 Subject: [PATCH 21/30] all fixed --- api/tests/integration/tests/layout/acs_style_reaction.py | 8 ++++++++ api/tests/integration/tests/layout/smiles_layout.py | 4 ++-- core/render2d/src/render_item_aux.cpp | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/api/tests/integration/tests/layout/acs_style_reaction.py b/api/tests/integration/tests/layout/acs_style_reaction.py index 6bee3142c0..256e51f3f5 100644 --- a/api/tests/integration/tests/layout/acs_style_reaction.py +++ b/api/tests/integration/tests/layout/acs_style_reaction.py @@ -25,6 +25,10 @@ rxn = indigo.loadReactionFromFile(os.path.join(root, "acs_before_layout.ket")) indigo.setOption("reaction-component-margin-size", "0.0") rxn.layout() + +with open(os.path.join(ref, "acs_after_layout_zero_margin.ket"), "w") as file: + file.write(rxn.json()) + res = reactionLayoutDiff( indigo, rxn, @@ -39,6 +43,10 @@ indigo.setOption("bond-length", "40.0") indigo.setOption("reaction-component-margin-size", "20.0") rxn.layout() + +with open(os.path.join(ref, "acs_after_layout_default_margin.ket"), "w") as file: + file.write(rxn.json()) + res = reactionLayoutDiff( indigo, rxn, diff --git a/api/tests/integration/tests/layout/smiles_layout.py b/api/tests/integration/tests/layout/smiles_layout.py index 7e1f6b1adf..97c456c7c7 100644 --- a/api/tests/integration/tests/layout/smiles_layout.py +++ b/api/tests/integration/tests/layout/smiles_layout.py @@ -31,8 +31,8 @@ def find_diff(a, b): rea.layout() ket = rea.json() - # with open(os.path.join(ref_path, filename) + ".ket", "w") as file: - # file.write(ket) + with open(os.path.join(ref_path, filename) + ".ket", "w") as file: + file.write(ket) with open(os.path.join(ref_path, filename) + ".ket", "r") as file: ket_ref = file.read() diff --git a/core/render2d/src/render_item_aux.cpp b/core/render2d/src/render_item_aux.cpp index b64cb27b7f..05e6263d9e 100644 --- a/core/render2d/src/render_item_aux.cpp +++ b/core/render2d/src/render_item_aux.cpp @@ -263,6 +263,7 @@ void RenderItemAuxiliary::_drawArrow(const KETReactionArrow& ar) void RenderItemAuxiliary::_drawArrow(const KETReactionMultitailArrow& ar) { + _rc.setLineWidth(_settings.bondLineWidth); const float radius = KETReactionMultitailArrow::TAIL_ARC_RADIUS; // In order to avoid a slight gap, that becomes apparent with the highest zoom. const float gap = .01f; From 5d08d3cc7e79815f28de76d09ab2a681dad83679 Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Thu, 19 Sep 2024 08:45:07 +0200 Subject: [PATCH 22/30] all fixed --- .../tests/layout/acs_style_reaction.py | 8 +++--- .../tests/layout/ref/932-agents.ket | 26 +++++++++---------- .../ref/acs_after_layout_default_margin.ket | 14 +++++----- .../ref/acs_after_layout_zero_margin.ket | 14 +++++----- .../integration/tests/layout/smiles_layout.py | 4 +-- third_party/lunasvg/CMakeLists.txt | 2 +- 6 files changed, 34 insertions(+), 34 deletions(-) diff --git a/api/tests/integration/tests/layout/acs_style_reaction.py b/api/tests/integration/tests/layout/acs_style_reaction.py index 256e51f3f5..0153700e56 100644 --- a/api/tests/integration/tests/layout/acs_style_reaction.py +++ b/api/tests/integration/tests/layout/acs_style_reaction.py @@ -26,8 +26,8 @@ indigo.setOption("reaction-component-margin-size", "0.0") rxn.layout() -with open(os.path.join(ref, "acs_after_layout_zero_margin.ket"), "w") as file: - file.write(rxn.json()) +# with open(os.path.join(ref, "acs_after_layout_zero_margin.ket"), "w") as file: +# file.write(rxn.json()) res = reactionLayoutDiff( indigo, @@ -44,8 +44,8 @@ indigo.setOption("reaction-component-margin-size", "20.0") rxn.layout() -with open(os.path.join(ref, "acs_after_layout_default_margin.ket"), "w") as file: - file.write(rxn.json()) +# with open(os.path.join(ref, "acs_after_layout_default_margin.ket"), "w") as file: +# file.write(rxn.json()) res = reactionLayoutDiff( indigo, diff --git a/api/tests/integration/tests/layout/ref/932-agents.ket b/api/tests/integration/tests/layout/ref/932-agents.ket index 86cf6df7ec..f0424dbbc4 100644 --- a/api/tests/integration/tests/layout/ref/932-agents.ket +++ b/api/tests/integration/tests/layout/ref/932-agents.ket @@ -232,7 +232,7 @@ "label": "C", "location": [ 14.000001, - 2.69282, + 2.39282, 0.0 ] }, @@ -240,7 +240,7 @@ "label": "C", "location": [ 15.385641, - 1.89282, + 1.59282, 0.0 ] }, @@ -248,7 +248,7 @@ "label": "C", "location": [ 16.771282, - 2.69282, + 2.39282, 0.0 ] } @@ -277,7 +277,7 @@ "label": "C", "location": [ 19.17128, - 2.29282, + 1.99282, 0.0 ] } @@ -291,7 +291,7 @@ "label": "P", "location": [ 21.571278, - 2.29282, + 1.99282, 0.0 ] } @@ -305,7 +305,7 @@ "label": "C", "location": [ 23.971275, - 2.69282, + 2.39282, 0.0 ] }, @@ -313,7 +313,7 @@ "label": "C", "location": [ 25.356916, - 1.89282, + 1.59282, 0.0 ] }, @@ -321,7 +321,7 @@ "label": "C", "location": [ 26.742556, - 2.69282, + 2.39282, 0.0 ] } @@ -350,7 +350,7 @@ "label": "C", "location": [ 29.142553, - 2.985641, + 2.685641, 0.0 ] }, @@ -358,7 +358,7 @@ "label": "C", "location": [ 30.742554, - 2.985641, + 2.685641, 0.0 ] }, @@ -366,7 +366,7 @@ "label": "C", "location": [ 29.942553, - 1.6, + 1.3, 0.0 ] } @@ -402,7 +402,7 @@ "label": "F", "location": [ 33.142551, - 2.29282, + 1.99282, 0.0 ] } @@ -416,7 +416,7 @@ "label": "I", "location": [ 35.542549, - 2.29282, + 1.99282, 0.0 ] } diff --git a/api/tests/integration/tests/layout/ref/acs_after_layout_default_margin.ket b/api/tests/integration/tests/layout/ref/acs_after_layout_default_margin.ket index 574b2dd3dd..3218c3a4db 100644 --- a/api/tests/integration/tests/layout/ref/acs_after_layout_default_margin.ket +++ b/api/tests/integration/tests/layout/ref/acs_after_layout_default_margin.ket @@ -298,7 +298,7 @@ "label": "N", "location": [ 16.925787, - 5.10503, + 4.80503, 0.0 ] }, @@ -306,7 +306,7 @@ "label": "N", "location": [ 15.325788, - 5.10503, + 4.80503, 0.0 ] }, @@ -314,7 +314,7 @@ "label": "C", "location": [ 14.328203, - 3.8541, + 3.5541, 0.0 ] }, @@ -322,7 +322,7 @@ "label": "C", "location": [ 14.684236, - 2.294215, + 1.994215, 0.0 ] }, @@ -330,7 +330,7 @@ "label": "C", "location": [ 17.923372, - 3.854097, + 3.554097, 0.0 ] }, @@ -338,7 +338,7 @@ "label": "N", "location": [ 16.125786, - 1.6, + 1.3, 0.0 ] }, @@ -346,7 +346,7 @@ "label": "C", "location": [ 17.567337, - 2.294213, + 1.994213, 0.0 ] } diff --git a/api/tests/integration/tests/layout/ref/acs_after_layout_zero_margin.ket b/api/tests/integration/tests/layout/ref/acs_after_layout_zero_margin.ket index 33b2f3ea27..3e1bf992a0 100644 --- a/api/tests/integration/tests/layout/ref/acs_after_layout_zero_margin.ket +++ b/api/tests/integration/tests/layout/ref/acs_after_layout_zero_margin.ket @@ -298,7 +298,7 @@ "label": "N", "location": [ 14.525787, - 4.30503, + 4.00503, 0.0 ] }, @@ -306,7 +306,7 @@ "label": "N", "location": [ 12.925788, - 4.30503, + 4.00503, 0.0 ] }, @@ -314,7 +314,7 @@ "label": "C", "location": [ 11.928204, - 3.0541, + 2.754099, 0.0 ] }, @@ -322,7 +322,7 @@ "label": "C", "location": [ 12.284236, - 1.494215, + 1.194215, 0.0 ] }, @@ -330,7 +330,7 @@ "label": "C", "location": [ 15.523372, - 3.054097, + 2.754097, 0.0 ] }, @@ -338,7 +338,7 @@ "label": "N", "location": [ 13.725786, - 0.8, + 0.5, 0.0 ] }, @@ -346,7 +346,7 @@ "label": "C", "location": [ 15.167336, - 1.494213, + 1.194212, 0.0 ] } diff --git a/api/tests/integration/tests/layout/smiles_layout.py b/api/tests/integration/tests/layout/smiles_layout.py index 97c456c7c7..7e1f6b1adf 100644 --- a/api/tests/integration/tests/layout/smiles_layout.py +++ b/api/tests/integration/tests/layout/smiles_layout.py @@ -31,8 +31,8 @@ def find_diff(a, b): rea.layout() ket = rea.json() - with open(os.path.join(ref_path, filename) + ".ket", "w") as file: - file.write(ket) + # with open(os.path.join(ref_path, filename) + ".ket", "w") as file: + # file.write(ket) with open(os.path.join(ref_path, filename) + ".ket", "r") as file: ket_ref = file.read() diff --git a/third_party/lunasvg/CMakeLists.txt b/third_party/lunasvg/CMakeLists.txt index 0e7ed4b17f..24acd90009 100644 --- a/third_party/lunasvg/CMakeLists.txt +++ b/third_party/lunasvg/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.15) +cmake_minimum_required(VERSION 3.13.4) set(LUNASVG_VERSION_MAJOR 3) set(LUNASVG_VERSION_MINOR 0) From ce7371b7fa1a6829449e9a96c13e4a80f3a47a47 Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Thu, 19 Sep 2024 08:59:45 +0200 Subject: [PATCH 23/30] all fixed --- third_party/lunasvg/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third_party/lunasvg/CMakeLists.txt b/third_party/lunasvg/CMakeLists.txt index 24acd90009..16b6fb0928 100644 --- a/third_party/lunasvg/CMakeLists.txt +++ b/third_party/lunasvg/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.13.4) +cmake_minimum_required(VERSION 3.13) set(LUNASVG_VERSION_MAJOR 3) set(LUNASVG_VERSION_MINOR 0) From b56fbadab999c99468aba3d709e4a58990a19075 Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Thu, 19 Sep 2024 09:03:10 +0200 Subject: [PATCH 24/30] all fixed --- third_party/lunasvg/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third_party/lunasvg/CMakeLists.txt b/third_party/lunasvg/CMakeLists.txt index 16b6fb0928..0e7ed4b17f 100644 --- a/third_party/lunasvg/CMakeLists.txt +++ b/third_party/lunasvg/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.13) +cmake_minimum_required(VERSION 3.15) set(LUNASVG_VERSION_MAJOR 3) set(LUNASVG_VERSION_MINOR 0) From e98b36a2e0db66da6c5565b0e643a7479132a866 Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Thu, 19 Sep 2024 22:58:16 +0200 Subject: [PATCH 25/30] all fixed --- .../reaction/src/reaction_multistep_detector.cpp | 6 ++++++ utils/indigo-depict/main.c | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp index ba20bd4159..469053f793 100644 --- a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp +++ b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp @@ -656,7 +656,10 @@ void ReactionMultistepDetector::constructMultipleArrowReaction(BaseReaction& rxn { auto r_it = copied_components.find(ridx); if (r_it != copied_components.end()) + { + std::cout << "reaction:" << i << " reactant:" << r_it->second << std::endl; rb.reactants.push(r_it->second); + } } // add products @@ -665,7 +668,10 @@ void ReactionMultistepDetector::constructMultipleArrowReaction(BaseReaction& rxn { auto p_it = copied_components.find(pidx); if (p_it != copied_components.end()) + { + std::cout << "reaction:" << i << " product:" << p_it->second << std::endl; rb.products.push(p_it->second); + } } } } diff --git a/utils/indigo-depict/main.c b/utils/indigo-depict/main.c index 74f0c58b84..d3586919bd 100644 --- a/utils/indigo-depict/main.c +++ b/utils/indigo-depict/main.c @@ -1058,7 +1058,7 @@ int main(int argc, char* argv[]) _prepare(obj, p.aromatization); if (p.action == ACTION_LAYOUT) { - indigoLayout(obj); + //indigoLayout(obj); if (p.out_ext == OEXT_CML) indigoSaveCmlToFile(obj, p.outfile); else if (p.out_ext == OEXT_RXN) From f9e7b9401530e9238242d9a0de33cc8a75a3d0ac Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Fri, 20 Sep 2024 00:56:20 +0200 Subject: [PATCH 26/30] all fixed --- core/indigo-core/common/math/algebra.h | 2 +- .../reaction/src/reaction_multistep_detector.cpp | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/core/indigo-core/common/math/algebra.h b/core/indigo-core/common/math/algebra.h index 65250e10ae..0c7d2ca0a0 100644 --- a/core/indigo-core/common/math/algebra.h +++ b/core/indigo-core/common/math/algebra.h @@ -301,7 +301,7 @@ namespace indigo // Calculate the cross products float cross1 = Vec2f::cross(ray, segment); - if (abs(cross1) < 1e-6) + if (fabs(cross1) < 1e-6) { // Parallel segments return false; diff --git a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp index 469053f793..ba20bd4159 100644 --- a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp +++ b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp @@ -656,10 +656,7 @@ void ReactionMultistepDetector::constructMultipleArrowReaction(BaseReaction& rxn { auto r_it = copied_components.find(ridx); if (r_it != copied_components.end()) - { - std::cout << "reaction:" << i << " reactant:" << r_it->second << std::endl; rb.reactants.push(r_it->second); - } } // add products @@ -668,10 +665,7 @@ void ReactionMultistepDetector::constructMultipleArrowReaction(BaseReaction& rxn { auto p_it = copied_components.find(pidx); if (p_it != copied_components.end()) - { - std::cout << "reaction:" << i << " product:" << p_it->second << std::endl; rb.products.push(p_it->second); - } } } } From 879e38274351a27850fab309ccdc53cf8aea4335 Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Fri, 20 Sep 2024 00:56:54 +0200 Subject: [PATCH 27/30] all fixed --- utils/indigo-depict/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/indigo-depict/main.c b/utils/indigo-depict/main.c index d3586919bd..74f0c58b84 100644 --- a/utils/indigo-depict/main.c +++ b/utils/indigo-depict/main.c @@ -1058,7 +1058,7 @@ int main(int argc, char* argv[]) _prepare(obj, p.aromatization); if (p.action == ACTION_LAYOUT) { - //indigoLayout(obj); + indigoLayout(obj); if (p.out_ext == OEXT_CML) indigoSaveCmlToFile(obj, p.outfile); else if (p.out_ext == OEXT_RXN) From bec786343792b95fcabe87771701b8b49527655a Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Fri, 20 Sep 2024 02:23:13 +0200 Subject: [PATCH 28/30] all fixed --- .../tests/layout/ref/932-agents.ket | 26 +++++++++---------- .../ref/acs_after_layout_default_margin.ket | 14 +++++----- .../ref/acs_after_layout_zero_margin.ket | 14 +++++----- .../tests/layout/ref/acs_issue_2389.ket | 8 +++--- 4 files changed, 31 insertions(+), 31 deletions(-) diff --git a/api/tests/integration/tests/layout/ref/932-agents.ket b/api/tests/integration/tests/layout/ref/932-agents.ket index 7f3ee63b8c..02732241e6 100644 --- a/api/tests/integration/tests/layout/ref/932-agents.ket +++ b/api/tests/integration/tests/layout/ref/932-agents.ket @@ -232,7 +232,7 @@ "label": "C", "location": [ 15.200002, - 2.69282, + 2.39282, 0.0 ] }, @@ -240,7 +240,7 @@ "label": "C", "location": [ 16.585642, - 1.89282, + 1.59282, 0.0 ] }, @@ -248,7 +248,7 @@ "label": "C", "location": [ 17.971283, - 2.69282, + 2.39282, 0.0 ] } @@ -277,7 +277,7 @@ "label": "C", "location": [ 20.371281, - 2.29282, + 1.99282, 0.0 ] } @@ -291,7 +291,7 @@ "label": "P", "location": [ 22.771278, - 2.29282, + 1.99282, 0.0 ] } @@ -305,7 +305,7 @@ "label": "C", "location": [ 25.171276, - 2.69282, + 2.39282, 0.0 ] }, @@ -313,7 +313,7 @@ "label": "C", "location": [ 26.556917, - 1.89282, + 1.59282, 0.0 ] }, @@ -321,7 +321,7 @@ "label": "C", "location": [ 27.942556, - 2.69282, + 2.39282, 0.0 ] } @@ -350,7 +350,7 @@ "label": "C", "location": [ 30.342554, - 2.985641, + 2.685641, 0.0 ] }, @@ -358,7 +358,7 @@ "label": "C", "location": [ 31.942554, - 2.985641, + 2.685641, 0.0 ] }, @@ -366,7 +366,7 @@ "label": "C", "location": [ 31.142553, - 1.6, + 1.3, 0.0 ] } @@ -402,7 +402,7 @@ "label": "F", "location": [ 34.342552, - 2.29282, + 1.99282, 0.0 ] } @@ -416,7 +416,7 @@ "label": "I", "location": [ 36.74255, - 2.29282, + 1.99282, 0.0 ] } diff --git a/api/tests/integration/tests/layout/ref/acs_after_layout_default_margin.ket b/api/tests/integration/tests/layout/ref/acs_after_layout_default_margin.ket index 25db5ab4b4..39fbce4a03 100644 --- a/api/tests/integration/tests/layout/ref/acs_after_layout_default_margin.ket +++ b/api/tests/integration/tests/layout/ref/acs_after_layout_default_margin.ket @@ -298,7 +298,7 @@ "label": "N", "location": [ 17.525787, - 5.10503, + 4.80503, 0.0 ] }, @@ -306,7 +306,7 @@ "label": "N", "location": [ 15.925788, - 5.10503, + 4.80503, 0.0 ] }, @@ -314,7 +314,7 @@ "label": "C", "location": [ 14.928204, - 3.8541, + 3.5541, 0.0 ] }, @@ -322,7 +322,7 @@ "label": "C", "location": [ 15.284236, - 2.294215, + 1.994215, 0.0 ] }, @@ -330,7 +330,7 @@ "label": "C", "location": [ 18.523373, - 3.854097, + 3.554097, 0.0 ] }, @@ -338,7 +338,7 @@ "label": "N", "location": [ 16.725786, - 1.6, + 1.3, 0.0 ] }, @@ -346,7 +346,7 @@ "label": "C", "location": [ 18.167337, - 2.294213, + 1.994213, 0.0 ] } diff --git a/api/tests/integration/tests/layout/ref/acs_after_layout_zero_margin.ket b/api/tests/integration/tests/layout/ref/acs_after_layout_zero_margin.ket index ebdf125553..e9fa3ff5ad 100644 --- a/api/tests/integration/tests/layout/ref/acs_after_layout_zero_margin.ket +++ b/api/tests/integration/tests/layout/ref/acs_after_layout_zero_margin.ket @@ -298,7 +298,7 @@ "label": "N", "location": [ 14.325787, - 4.30503, + 4.00503, 0.0 ] }, @@ -306,7 +306,7 @@ "label": "N", "location": [ 12.725787, - 4.30503, + 4.00503, 0.0 ] }, @@ -314,7 +314,7 @@ "label": "C", "location": [ 11.728203, - 3.0541, + 2.754099, 0.0 ] }, @@ -322,7 +322,7 @@ "label": "C", "location": [ 12.084235, - 1.494215, + 1.194215, 0.0 ] }, @@ -330,7 +330,7 @@ "label": "C", "location": [ 15.323371, - 3.054097, + 2.754097, 0.0 ] }, @@ -338,7 +338,7 @@ "label": "N", "location": [ 13.525785, - 0.8, + 0.5, 0.0 ] }, @@ -346,7 +346,7 @@ "label": "C", "location": [ 14.967336, - 1.494213, + 1.194212, 0.0 ] } diff --git a/api/tests/integration/tests/layout/ref/acs_issue_2389.ket b/api/tests/integration/tests/layout/ref/acs_issue_2389.ket index 2bbbd9420c..1a30999a1a 100644 --- a/api/tests/integration/tests/layout/ref/acs_issue_2389.ket +++ b/api/tests/integration/tests/layout/ref/acs_issue_2389.ket @@ -122,7 +122,7 @@ "label": "C", "location": [ 11.200002, - 1.6, + 1.3, 0.0 ] }, @@ -130,7 +130,7 @@ "label": "C", "location": [ 12.800002, - 1.6, + 1.3, 0.0 ] } @@ -152,7 +152,7 @@ "label": "C", "location": [ 15.200003, - 1.6, + 1.3, 0.0 ] }, @@ -160,7 +160,7 @@ "label": "C", "location": [ 16.800003, - 1.6, + 1.3, 0.0 ] } From b891730eb53fc04e905c4c7e68dbccef12a8d031 Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Fri, 20 Sep 2024 02:39:35 +0200 Subject: [PATCH 29/30] all fixed --- api/c/indigo/src/indigo_reaction.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/c/indigo/src/indigo_reaction.cpp b/api/c/indigo/src/indigo_reaction.cpp index 72b76b6f19..da78489477 100644 --- a/api/c/indigo/src/indigo_reaction.cpp +++ b/api/c/indigo/src/indigo_reaction.cpp @@ -64,7 +64,7 @@ const char* IndigoBaseReaction::debugInfo() const // IndigoPathwayReaction // -IndigoPathwayReaction::IndigoPathwayReaction() : IndigoBaseReaction(REACTION) +IndigoPathwayReaction::IndigoPathwayReaction() : IndigoBaseReaction(PATHWAY_REACTION) { init(); } From df86cde540f7d6361984c5b880bd508e302358a8 Mon Sep 17 00:00:00 2001 From: Roman Porozhnetov Date: Fri, 20 Sep 2024 04:53:18 +0200 Subject: [PATCH 30/30] all fixed --- .../reaction/src/reaction_multistep_detector.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp index ba20bd4159..a02ca5d415 100644 --- a/core/indigo-core/reaction/src/reaction_multistep_detector.cpp +++ b/core/indigo-core/reaction/src/reaction_multistep_detector.cpp @@ -343,11 +343,11 @@ bool ReactionMultistepDetector::detectMultitailArrows() for (int j = 0; j < tails.size(); ++j) { - auto& arr_begin = tails[j]; + auto arr_begin = tails[j]; auto arr_end = arr_begin; - arr_end.x = multi.getSpineBegin().x; + arr_begin.x = multi.getSpineBegin().x; - if (csb.bbox.rayIntersectsRect(arr_begin, arr_end)) + if (csb.bbox.rayIntersectsRect(arr_end, arr_begin)) { auto dist = csb.bbox.pointDistance(arr_begin); if (min_dist_reactants[j].first < 0 || dist < min_dist_reactants[j].first) @@ -359,7 +359,7 @@ bool ReactionMultistepDetector::detectMultitailArrows() } } - for (auto& [min_dist, idx_cs_min_prod] : min_dist_reactants) + for (auto& [min_dist, idx_cs_min_rc] : min_dist_reactants) { if (min_dist < 0) bad_pathway = true;