Depicting Property Maps

The previous chapters give examples about how to depict atom properties either by using glyphs (see Annotating Atoms and Bonds chapter) or projecting them into a 2D molecule surface (see Drawing a Molecule Surface chapter). Grapheme TK can also map atom properties into a 2D grid, called a property map, using a Gaussian function. After the grid is generated, colors are rendered to each cell using the OELinearColorGradient class that interpolates colors between a specified range.

The following Listing 1 example demonstrates how to depict partial charges using the property map. After constructing the molecule and preparing it for depiction, the MMFF partial charges are calculated. These partial charges are attached to the corresponding atom as generic data with a specific tagname. A OE2DPropMap object is then generated by specifying three colors:

  • the background color of the property map

  • one that represents negative values (in this case charges), and

  • the color that represents positive values in the property map

When the OE2DPropMap::Render method is called with the tagname, the properties that were attached to the atoms as generic data are retrieved and a 2D grid is generated along with an OELinearColorGradient object that is used to assign colors to the cells of the grid. The colored grid is then rendered into the below layer of the OE2DMolDisplay object, i.e., it appears underneath the molecular diagram. The image created by Listing 1 is shown in Figure: Example of depicting a property map.

Listing 1: Depicting partial charges using property map

void SetPartialCharge(OEMolBase& mol, const string& tagname)
{
  OEMMFFAtomTypes(mol);
  OEMMFF94PartialCharges(mol);

  unsigned tag = OEGetTag(tagname);
  for (OEIter<OEAtomBase> atom = mol.GetAtoms(); atom; ++atom)
    atom->SetData<double>(tag, atom->GetPartialCharge());
}

int main()
{
  OEGraphMol mol;
  OESmilesToMol(mol, "Cc1cc(cc(c1[N+](=O)[O-])F)[N+]#C");
  OEPrepareDepiction(mol);

  string tagname("PartialCharge");
  SetPartialCharge(mol, tagname);

  OEPrepareDepiction(mol);

  const unsigned width  = 450u;
  const unsigned height = 350u;

  OE2DMolDisplayOptions opts(width, height, OEScale::AutoScale);
  opts.SetScale(OEGetMoleculeSurfaceScale(mol, opts));
  opts.SetAtomColorStyle(OEAtomColorStyle::WhiteMonochrome);
  opts.SetTitleLocation(OETitleLocation::Hidden);
  OE2DMolDisplay disp(mol, opts);

  OE2DPropMap propmap(opts.GetBackgroundColor());
  propmap.SetNegativeColor(OEDarkRed);
  propmap.SetPositiveColor(OEDarkBlue);
  propmap.Render(disp, tagname);

  OERenderMolecule("Draw2DPropMapPartialCharge.png", disp);
  return 0;
}
../_images/Draw2DPropMapPartialCharge.png

Example of depicting a property map

See also

  • Generic Data chapter in the OEChem TK manual.

When the OE2DPropMap::Render method is called, the color gradient is initialized by searching for the minimum and maximum values by the given tagname. This means that when more than one molecule is depicted, each depiction will have its own independent value range. (See Figure: Example of depicting a property map).

../_images/Draw2DPropMapPartialChargeMulti-NoRange.png

Example of depicting multiple property maps

In the Listing 2 example, the value range of the property map is pre-set by identifying the minimum and maximum atom partial charges for a whole molecule set. See the result in Figure: Example of depicting property maps in the same value range. Each black box around the color gradient legend indicates the range of the atom partial charges for the corresponding molecule.

Listing 2: Depicting multiple molecules using property map

void SetPartialCharge(OEMolBase& mol, const string& tagname,
                      double& minvalue, double& maxvalue)
{
  OEMMFFAtomTypes(mol);
  OEMMFF94PartialCharges(mol);

  unsigned int tag = OEGetTag(tagname);
  for (OEIter<OEAtomBase> atom = mol.GetAtoms(); atom; ++atom)
  {
    const double charge = atom->GetPartialCharge();
    atom->SetData<double>(tag, charge);
    minvalue = std::min(minvalue, charge);
    maxvalue = std::max(maxvalue, charge);
  }
}

int main()
{
  vector<string> smiles = {"c1ccnc(c1)[N+](=O)[O-]", "c1ccccc1F", "c1ccc(cc1)S(=O)(=O)[O-]"};

  double minvalue = std::numeric_limits<double>::max();
  double maxvalue = std::numeric_limits<double>::min();
  const string tagname = "PartialCharge";

  vector<OEGraphMol> molecules;
  for (const auto& smi : smiles)
  {
    OEGraphMol mol;
    OESmilesToMol(mol, smi);
    OEPrepareDepiction(mol);
    SetPartialCharge(mol, tagname, minvalue, maxvalue);
    molecules.push_back(mol);
  }

  const unsigned width  = 750u;
  const unsigned height = 250u;
  OEImage image(width, height);

  const unsigned rows = 1u;
  const unsigned cols = 3u;
  OEImageGrid grid(image, rows, cols);

  OE2DMolDisplayOptions opts(grid.GetCellWidth(), grid.GetCellHeight(), OEScale::Default);
  opts.SetAtomColorStyle(OEAtomColorStyle::WhiteMonochrome);
  opts.SetTitleLocation(OETitleLocation::Hidden);

  OE2DPropMap  propmap(opts.GetBackgroundColor());
  propmap.SetNegativeColor(OEDarkRed);
  propmap.SetPositiveColor(OEDarkBlue);
  propmap.SetLegendLocation(OELegendLocation::Left);

  propmap.SetMinValue(minvalue);
  propmap.SetMaxValue(maxvalue);

  OEIter<OEImageBase> cell = grid.GetCells();
  for (auto m = 0u; (bool)cell && m < molecules.size(); ++cell, ++m)
  {
    OE2DMolDisplay disp(molecules[m], opts);
    propmap.Render(disp, tagname);

    OERenderMolecule(*cell, disp);
  }

  OEWriteImage("Draw2DPropMapPartialChargeMulti.png", image);
  return 0;
}
../_images/Draw2DPropMapPartialChargeMulti.png

Example of depicting a property maps in the same value range

See also

The above examples show how to project atom properties (such as partial charges) into the property map. However, the OE2DPropMap class can also be used to visualize bond properties by attaching a value to each bond as a generic data using a tagname. When the OE2DPropMap::Render method is called with the same tagname, the property that was attached to a bond is retrieved and projected at the middle of that bond before applying a Gaussian function to blur out the 2D grid underneath the molecular graph. The Table: Depicting atom or/and bond properties table shows the differences between visualizing atom or/and bond properties using the OE2DPropMap class.

Depicting atom or/and bond properties
../_images/OE2DPropMap_AtomProperties.png ../_images/OE2DPropMap_AtomAndBondProperties.png ../_images/OE2DPropMap_BondProperties.png

only atom

both atom and bond

only bond