File: PNGParser.cpp

package info (click to toggle)
rdkit 202503.6-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 222,024 kB
  • sloc: cpp: 411,111; python: 78,482; ansic: 26,181; java: 8,285; javascript: 4,404; sql: 2,393; yacc: 1,626; lex: 1,267; cs: 1,090; makefile: 580; xml: 229; fortran: 183; sh: 121
file content (86 lines) | stat: -rw-r--r-- 2,978 bytes parent folder | download | duplicates (4)
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