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;
}
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).
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;
}
See also
OEImageGrid class in the OEDepict TK manual
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.
only atom |
both atom and bond |
only bond |