Files
rdkit/Code/GraphMol/ChemReactions/PNGParser.cpp
Greg Landrum 09aa009f19 [v2 API] reaction parsers (#7138)
* basic approach to v2api

* does not work, backup commit

* well, that now compiles

* cleaner

* more cleanup and testing

* get the SWIG wrappers to build

* swig wrappers now build

* switch back to using references to default values

* adjust to new catch version

* move the implementation to v2 and call it from v1

* update the parameter object too

* move debugParse down

* a couple of review changes

* make v2 naming consistent with Python

* first pass at v2 for the ctab parsers

* move a the writing functionality to a different header

this is just an organizational thing at the moment; we still import the writers header in the parsers header so as to not break code

* do v2 of the tpl parser

* fix missing dependency

* Mol2 parser

* move over the XYZ parser

* switch over the PDB parsers too

* get mac and java builds working (hopefully)

* add v2 API for the reaction parsers

Fixes #7075

* v2 of the fileparser API about done

This cannot be completed until the CDXML changes are merged
2024-02-07 17:41:01 +01:00

87 lines
2.9 KiB
C++

//
// Copyright (c) 2020 Greg Landrum
//
// @@ All Rights Reserved @@
// This file is part of the RDKit.
// The contents are covered by the terms of the BSD license
// which is included in the file license.txt, found at the root
// of the RDKit source tree.
//
#include <GraphMol/ChemReactions/Reaction.h>
#include <GraphMol/ChemReactions/ReactionPickler.h>
#include <GraphMol/ChemReactions/ReactionParser.h>
#include <GraphMol/FileParsers/PNGParser.h>
#include <boost/algorithm/string.hpp>
namespace RDKit {
namespace PNGData {
const std::string rxnSmilesTag = "ReactionSmiles";
const std::string rxnSmartsTag = "ReactionSmarts";
const std::string rxnRxnTag = "ReactionRxn";
const std::string rxnPklTag = "rdkitReactionPKL";
} // namespace PNGData
std::string addChemicalReactionToPNGStream(const ChemicalReaction &rxn,
std::istream &iStream,
bool includePkl, bool includeSmiles,
bool includeSmarts,
bool includeRxn) {
std::vector<std::pair<std::string, std::string>> metadata;
if (includePkl) {
std::string pkl;
ReactionPickler::pickleReaction(rxn, pkl);
metadata.push_back(std::make_pair(augmentTagName(PNGData::rxnPklTag), pkl));
}
if (includeSmiles) {
std::string smi = ChemicalReactionToRxnSmiles(rxn);
metadata.push_back(
std::make_pair(augmentTagName(PNGData::rxnSmilesTag), smi));
}
if (includeSmarts) {
std::string smi = ChemicalReactionToRxnSmarts(rxn);
metadata.push_back(
std::make_pair(augmentTagName(PNGData::rxnSmartsTag), smi));
}
if (includeRxn) {
std::string mb = ChemicalReactionToRxnBlock(rxn);
metadata.push_back(std::make_pair(augmentTagName(PNGData::rxnRxnTag), mb));
}
return addMetadataToPNGStream(iStream, metadata);
};
namespace v2 {
namespace ReactionParser {
std::unique_ptr<ChemicalReaction> ReactionFromPNGStream(
std::istream &inStream) {
std::unique_ptr<ChemicalReaction> res;
auto metadata = PNGStreamToMetadata(inStream);
bool formatFound = false;
for (const auto &pr : metadata) {
if (boost::starts_with(pr.first, PNGData::rxnPklTag)) {
res.reset(new ChemicalReaction(pr.second));
formatFound = true;
} else if (boost::starts_with(pr.first, PNGData::rxnSmilesTag)) {
ReactionFromSmiles(pr.second).swap(res);
formatFound = true;
} else if (boost::starts_with(pr.first, PNGData::rxnSmartsTag)) {
ReactionFromSmarts(pr.second).swap(res);
formatFound = true;
} else if (boost::starts_with(pr.first, PNGData::rxnRxnTag)) {
ReactionFromRxnBlock(pr.second).swap(res);
formatFound = true;
}
if (formatFound) {
break;
}
}
if (!formatFound) {
throw FileParseException("No suitable metadata found.");
}
return res;
}
} // namespace ReactionParser
} // namespace v2
} // namespace RDKit