1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
//
// 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
|