#!/usr/bin/env python
# (C) 2022 Cadence Design Systems, Inc. (Cadence) 
# All rights reserved.
# TERMS FOR USE OF SAMPLE CODE The software below ("Sample Code") is
# provided to current licensees or subscribers of Cadence products or
# SaaS offerings (each a "Customer").
# Customer is hereby permitted to use, copy, and modify the Sample Code,
# subject to these terms. Cadence claims no rights to Customer's
# modifications. Modification of Sample Code is at Customer's sole and
# exclusive risk. Sample Code may require Customer to have a then
# current license or subscription to the applicable Cadence offering.
# THE SAMPLE CODE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED.  OPENEYE DISCLAIMS ALL WARRANTIES, INCLUDING, BUT
# NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
# PARTICULAR PURPOSE AND NONINFRINGEMENT. In no event shall Cadence be
# liable for any damages or liability in connection with the Sample Code
# or its use.

# @ <SNIPPET>
from openeye import oechem

pattern = oechem.OEGraphMol()
target = oechem.OEGraphMol()
oechem.OESmilesToMol(pattern, "c1cc(O)c(O)cc1CCN")
oechem.OESmilesToMol(target, "c1c(O)c(O)c(Cl)cc1CCCBr")

atomexpr = oechem.OEExprOpts_DefaultAtoms
bondexpr = oechem.OEExprOpts_DefaultBonds
# create maximum common substructure object
# @ <SNIPPET-INIT>
mcss = oechem.OEMCSSearch(pattern, atomexpr, bondexpr, oechem.OEMCSType_Exhaustive)
# @ </SNIPPET-INIT>
# set scoring function
# @ <SNIPPET-SCORE>
mcss.SetMCSFunc(oechem.OEMCSMaxAtoms())
# @ </SNIPPET-SCORE>
# ignore matches smaller than 6 atoms
# @ <SNIPPET-MINATOMS>
mcss.SetMinAtoms(6)
# @ </SNIPPET-MINATOMS>
unique = True
# loop over matches
# @ <SNIPPET-MATCH>
for count, match in enumerate(mcss.Match(target, unique)):
    # @ </SNIPPET-MATCH>
    print("Match %d:" % (count + 1))
    print("pattern atoms:", end=" ")
    for ma in match.GetAtoms():
        print(ma.pattern.GetIdx(), end=" ")
    print("\ntarget atoms: ", end=" ")
    for ma in match.GetAtoms():
        print(ma.target.GetIdx(), end=" ")

    # create match subgraph
    m = oechem.OEGraphMol()
    # @ <SNIPPET-SUBSET>
    oechem.OESubsetMol(m, match, True)
    # @ </SNIPPET-SUBSET>

    print("\nmatch smiles =", oechem.OEMolToSmiles(m))
# @ </SNIPPET>
