# 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 int tag = OEGetTag(tagname);
for (OEIter<OEAtomBase> ai = mol.GetAtoms(); ai; ++ai)
ai->SetData<double>(tag, ai->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);

unsigned int width  = 450;
unsigned int height = 350;

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;
}


Example of depicting a property map

• 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).

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> ai = mol.GetAtoms(); ai; ++ai)
{
double charge = ai->GetPartialCharge();
ai->SetData<double>(tag, charge);
minvalue = std::min(minvalue, charge);
maxvalue = std::max(maxvalue, charge);
}
}

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

double minvalue = DBL_MAX;
double maxvalue = DBL_MIN;
string tagname = "PartialCharge";

vector<OEGraphMol> molecules;
for (unsigned int s = 0; s < smiles.size(); ++s)
{
OEGraphMol mol;
OESmilesToMol(mol, smiles[s]);
OEPrepareDepiction(mol);
SetPartialCharge(mol, tagname, minvalue, maxvalue);
molecules.push_back(mol);
}

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

unsigned int rows = 1;
unsigned int cols = 3;
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> ci = grid.GetCells();
for (unsigned int m = 0; (bool)ci && m < molecules.size(); ++ci, ++m)
{
OE2DMolDisplay disp(molecules[m], opts);
propmap.Render(disp, tagname);

OERenderMolecule(*ci, disp);
}

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


Example of depicting a property maps in the same value range