# Molecule Alignment¶

The following three code examples demonstrate how to align molecules either based on:

## Molecule Alignment Based on MCS¶

The Figure: Example of depiction without alignment is generated by highlighting the maximum common substructure of two molecules (MCS), but keeping the original orientation of the compounds.

Example of depiction without alignment

The Listing 1 code example shows how to align these two molecules by their maximum common substructures (i.e. by the highlighted atoms and bonds in Figure: Example of depiction without alignment).

• First, two molecules are initialized from SMILES string and prepared for depiction.
• A OEMCSSearch object is initialized with the reference 2D molecule onto which the fit molecule will be aligned.
• An OEImageGrid object is constructed that allows to render the two molecules in a grid next to each other.
• The fit molecule is then aligned to the reference by calling the OEPrepareAlignedDepiction function that performs MCS search and then aligns the fit molecule to the reference based on the detected common substructure(s).
• An OE2DMolDisplayOptions object is initialized that stores the properties determine how the molecules are rendered. In order to render the molecules in equal size the smallest depiction scaling factor is calculated.
• If the molecule alignment was successful (i.e OEAlignmentResult::IsValid is true), then the correspondence between the two molecules stored in the OEAlignmentResult returned by the OEPrepareAlignedDepiction function. This OEAlignmentResult object can be used to highlight the matched common substructure by invoking the OEAddHighlighting function.
• After both molecules are rendered into the separate cells of the grid layout, the image is written into a png file.

After initializing the two molecules and the OEMCSSearch object, the OEMCSSearch::Match method is called to perform the search and return an iterator over the identified maximum common substructures. The first match is then utilized to call the OEPrepareAlignedDepiction function that aligns one molecule to the other based on the given match. After the alignment, the common atoms and bonds are highlighted by invoking the OEAddHighlighting function. The image created by Listing 1 is shown in Figure: Example of depiction with alignment based on MCS.

Listing 1: Example of molecule alignment based on MCS

int main()
{
OEGraphMol refmol;
OESmilesToMol(refmol, "c1cc(c2cc(cnc2c1)CCCO)C(=O)CCO");
OEPrepareDepiction(refmol);

OEGraphMol fitmol;
OESmilesToMol(fitmol, "c1cc2ccc(cc2c(c1)C(=O)O)CCO");
OEPrepareDepiction(fitmol);

OEMCSSearch mcss(OEMCSType::Approximate);
const auto atomexpr = OEExprOpts::DefaultAtoms;
const auto bondexpr = OEExprOpts::DefaultBonds;
mcss.Init(refmol, atomexpr, bondexpr);
mcss.SetMCSFunc(OEMCSMaxBondsCompleteCycles());

OEAlignmentResult alignres = OEPrepareAlignedDepiction(fitmol, mcss);

OEImage image(400, 200);

const auto rows = 1u;
const auto cols = 2u;
OEImageGrid grid(image, rows, cols);

OE2DMolDisplayOptions opts(grid.GetCellWidth(), grid.GetCellHeight(), OEScale::AutoScale);
opts.SetTitleLocation(OETitleLocation::Hidden);

const double refscale = OEGetMoleculeScale(refmol, opts);
const double fitscale = OEGetMoleculeScale(fitmol, opts);
opts.SetScale(std::min(refscale, fitscale));

OE2DMolDisplay refdisp(mcss.GetPattern(), opts);
OE2DMolDisplay fitdisp(fitmol, opts);

if (alignres.IsValid())
{
OEAtomBondSet refabset(alignres.GetPatternAtoms(), alignres.GetPatternBonds());

OEAtomBondSet fitabset(alignres.GetTargetAtoms(), alignres.GetTargetBonds());
}

OEImageBase* refcell = grid.GetCell(1, 1);
OERenderMolecule(*refcell, refdisp);

OEImageBase* fitcell = grid.GetCell(1, 2);
OERenderMolecule(*fitcell, fitdisp);

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


Example of depiction with alignment based on maximum common substructure

## Molecule Alignment Based on Molecular Similarity¶

The Figure: Example of depiction without alignment is generated by keeping the original orientation of the compounds.

Example of depiction without alignment

The Listing 3 code example shows how to align these molecules based on their molecular similarity.

• First, two molecules are initialized from SMILES string and prepared for depiction.
• An OEImageGrid object is constructed that allows to render the two molecules in a grid next to each other.
• The fit molecule is then aligned to the reference. The OEGetFPOverlap function is utilized to return all common fragments found between two molecules based on a given fingerprint type. These common fragments reveal the similar parts of the two molecules being compared that are used by the OEPrepareMultiAlignedDepiction function to find the best alignment between the molecules. See more fingerprint types in the Fingerprint Types chapter of the GraphSim TK manual.
• An OE2DMolDisplayOptions object is initialized that stores the properties determine how the molecules are rendered. In order to render the molecules in equal size the smallest depiction scaling factor is calculated.
• Then both molecules are rendered into the separate cells of the grid layout, the image is written into a png file.

The image created by Listing 3 is shown in Figure: Example of depiction with alignment based on molecular similarity.

Note

GraphSim TK license in not required to run the Listing 3 example.

Listing 3: Example of molecule alignment based on molecular similarity

int main()
{
OEGraphMol refmol;
OESmilesToMol(refmol, "C[C@H](C(=O)N1CCC[C@H]1C(=O)O)OC(=O)[C@@H](Cc2ccccc2)S");
OEPrepareDepiction(refmol);

OEGraphMol fitmol;
OESmilesToMol(fitmol, "C[C@H](C(=O)N1CCC[C@H]1C(=O)O)NC(=O)[C@@H](Cc2ccccn2)S");
OEPrepareDepiction(fitmol);

OEImage image(500, 300);

const auto rows = 1u;
const auto cols = 2u;
OEImageGrid grid(image, rows, cols);

const OEGraphSim::OEFPTypeBase* fptype = OEGraphSim::OEGetFPType(OEGraphSim::OEFPType::Tree);
OEIter<OEMatchBase> overlaps = OEGraphSim::OEGetFPOverlap(refmol, fitmol, fptype);
OEPrepareMultiAlignedDepiction(fitmol, refmol, overlaps);

OE2DMolDisplayOptions opts(grid.GetCellWidth(), grid.GetCellHeight(), OEScale::AutoScale);
opts.SetTitleLocation(OETitleLocation::Hidden);

const double refscale = OEGetMoleculeScale(refmol, opts);
const double fitscale = OEGetMoleculeScale(fitmol, opts);
opts.SetScale(std::min(refscale, fitscale));

OEImageBase* refcell = grid.GetCell(1u, 1u);
OE2DMolDisplay refdisp(refmol, opts);
OERenderMolecule(*refcell, refdisp);

OEImageBase* fitcell = grid.GetCell(1u, 2u);
OE2DMolDisplay fitdisp(fitmol, opts);
OERenderMolecule(*fitcell, fitdisp);

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


Example of depiction with alignment based on molecule similarity