Search in sources :

Example 6 with Molecule

use of org.openscience.cdk.Molecule in project Smiles2Monomers by yoann-dufresne.

the class Chain method getMolecule.

/**
 * construct recursively a molecule corresponding to the bloc.
 * Attention, this function is not very efficient because of multiple molecules creation.
 * @return Bloc molecule. Can return null if there are problems of compatibility between sub-bloc and extension positions.
 */
public IMolecule getMolecule() {
    if (this.mol != null)
        return this.mol;
    IMolecule mol = null;
    this.atoms = new ArrayList<>();
    // Sub-bloc molecule
    if (this.getSize() > 1) {
        IMolecule subMol = this.subBlc.getMolecule();
        mol = new Molecule();
        for (IAtom a : subMol.atoms()) mol.addAtom(a);
        for (IBond b : subMol.bonds()) mol.addBond(b);
        for (IAtom a : this.subBlc.atoms) {
            IAtom cloneA = mol.getAtom(subMol.getAtomNumber(a));
            this.atoms.add(cloneA);
        }
    } else {
        mol = new Molecule();
    }
    // Extension of mol
    IAtom a1 = this.ext.getBond().getAtom(0);
    if (this.position1 == -1) {
        try {
            a1 = (IAtom) a1.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        mol.addAtom(a1);
        this.atoms.add(a1);
        // Hydrogens
        int hydrogens = this.ext.getBond().getAtom(0).getImplicitHydrogenCount();
        a1.setImplicitHydrogenCount(hydrogens);
        // Aromatic
        if (this.ext.getBond().getAtom(0).getFlag(CDKConstants.ISAROMATIC))
            a1.setFlag(CDKConstants.ISAROMATIC, true);
        else
            a1.setFlag(CDKConstants.ISAROMATIC, false);
    } else {
        if (a1.getAtomicNumber() == this.atoms.get(this.position1).getAtomicNumber())
            a1 = this.atoms.get(this.position1);
        else
            return null;
    }
    IAtom a2 = this.ext.getBond().getAtom(1);
    if (this.position2 == -1) {
        try {
            a2 = (IAtom) a2.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        mol.addAtom(a2);
        this.atoms.add(a2);
        // Hydrogen
        int hydrogens = this.ext.getBond().getAtom(1).getImplicitHydrogenCount();
        a2.setImplicitHydrogenCount(hydrogens);
        // Aromatic
        if (this.ext.getBond().getAtom(1).getFlag(CDKConstants.ISAROMATIC))
            a2.setFlag(CDKConstants.ISAROMATIC, true);
        else
            a2.setFlag(CDKConstants.ISAROMATIC, false);
    } else if (a2.getAtomicNumber() == this.atoms.get(this.position2).getAtomicNumber())
        a2 = this.atoms.get(this.position2);
    else
        return null;
    mol.addBond(new Bond(a1, a2, this.ext.getBond().getOrder()));
    this.mol = mol;
    return mol;
}
Also used : Molecule(org.openscience.cdk.Molecule) IMolecule(org.openscience.cdk.interfaces.IMolecule) IMolecule(org.openscience.cdk.interfaces.IMolecule) IBond(org.openscience.cdk.interfaces.IBond) Bond(org.openscience.cdk.Bond) IBond(org.openscience.cdk.interfaces.IBond) IAtom(org.openscience.cdk.interfaces.IAtom)

Example 7 with Molecule

use of org.openscience.cdk.Molecule in project Smiles2Monomers by yoann-dufresne.

the class ResidueCreator method createResidue.

// Create residue when it was found
private Set<Residue> createResidue(List<RMap> match, Rule rule, Residue res) {
    Set<Residue> residues = new HashSet<>();
    // Create index
    int[] index = new int[match.size()];
    for (RMap rm : match) {
        index[rm.getId2()] = rm.getId1();
    }
    for (Replacement replace : rule.getReplacements()) {
        // Clone molecule
        Molecule oldMol = res.getMolecule();
        Molecule mol = null;
        try {
            mol = (Molecule) oldMol.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        // Save links atoms
        Map<IAtom, IAtom> convesionAtom = new HashMap<>();
        for (IAtom a : res.getAtomicLinks().keySet()) {
            int idx = oldMol.getAtomNumber(a);
            IAtom newA = mol.getAtom(idx);
            convesionAtom.put(a, newA);
        }
        // Prepare deletions
        List<IAtom> deletedAtoms = new ArrayList<>();
        List<IAtom> linkedAtoms = new ArrayList<>();
        for (int i : replace.toDelete) deletedAtoms.add(mol.getAtom(index[i]));
        for (int i : replace.toReplace) {
            IAtom atom = mol.getAtom(index[i]);
            deletedAtoms.add(atom);
            for (IAtom neighbor : mol.getConnectedAtomsList(atom)) if (!neighbor.getSymbol().equals("H") && !deletedAtoms.contains(neighbor))
                linkedAtoms.add(neighbor);
        }
        // Delete atoms
        for (IAtom a : deletedAtoms) {
            for (IBond b : mol.getConnectedBondsList(a)) mol.removeBond(b);
            mol.removeAtom(a);
        }
        String smarts = this.sg.createSMILES(mol);
        if (!Residue.existingResidue(smarts, res.getMonoName())) {
            Residue residue = Residue.constructResidue(res.getMonoName(), smarts);
            residue.setMol(mol);
            // Add old links
            for (IAtom oldA : convesionAtom.keySet()) {
                IAtom newA = convesionAtom.get(oldA);
                // int oldIdx = oldMol.getAtomNumber(oldA);
                // int newIdx = mol.getAtomNumber(newA);
                residue.getAtomicLinks().put(newA, res.getAtomicLinks().get(oldA));
            }
            // Add new Links
            for (IAtom a : linkedAtoms) residue.addLink(a, rule);
            residues.add(residue);
        } else {
            Residue residue = Residue.constructResidue(res.getMonoName(), smarts);
            residues.add(residue);
        }
    }
    return residues;
}
Also used : HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) IBond(org.openscience.cdk.interfaces.IBond) Replacement(model.Rule.Replacement) RMap(org.openscience.cdk.isomorphism.mcss.RMap) Molecule(org.openscience.cdk.Molecule) IMolecule(org.openscience.cdk.interfaces.IMolecule) Residue(model.Residue) IAtom(org.openscience.cdk.interfaces.IAtom) HashSet(java.util.HashSet)

Example 8 with Molecule

use of org.openscience.cdk.Molecule in project Smiles2Monomers by yoann-dufresne.

the class ResidueCreator method createResidues.

/**
 * Create all residues from the argument monomers database according to rules entered in paramaters of the constructor.
 * @param monosDBName A monomers database.
 * @return All possible residues found.
 */
public FamilyDB createResidues(MonomersDB monosDB) {
    FamilyDB famDB = new FamilyDB();
    famDB.init(monosDB);
    for (Family family : famDB.getFamilies()) {
        this.residuesFromMonomers(family);
        for (Residue res : family.getResidues()) {
            IMolecule oldMol = res.getMolecule();
            res.setMol(new Molecule(AtomContainerManipulator.removeHydrogens(res.getMolecule())));
            IMolecule newMol = res.getMolecule();
            Map<IAtom, IAtom> conversion = new HashMap<>();
            int idx = 0;
            for (IAtom a : oldMol.atoms()) {
                if (!"H".equals(a.getSymbol())) {
                    conversion.put(a, newMol.getAtom(idx));
                    idx++;
                }
            }
            Map<IAtom, Rule> oldLinks = new HashMap<>(res.getAtomicLinks());
            res.getAtomicLinks().clear();
            for (IAtom oldA : oldLinks.keySet()) {
                Rule rule = oldLinks.get(oldA);
                res.addLink(conversion.get(oldA), rule);
            }
        }
    }
    return famDB;
}
Also used : Molecule(org.openscience.cdk.Molecule) IMolecule(org.openscience.cdk.interfaces.IMolecule) IMolecule(org.openscience.cdk.interfaces.IMolecule) Residue(model.Residue) HashMap(java.util.HashMap) Family(model.Family) FamilyDB(db.FamilyDB) Rule(model.Rule) IAtom(org.openscience.cdk.interfaces.IAtom)

Aggregations

Molecule (org.openscience.cdk.Molecule)8 IAtom (org.openscience.cdk.interfaces.IAtom)6 IMolecule (org.openscience.cdk.interfaces.IMolecule)6 IBond (org.openscience.cdk.interfaces.IBond)3 HashMap (java.util.HashMap)2 HashSet (java.util.HashSet)2 Residue (model.Residue)2 CDKException (org.openscience.cdk.exception.CDKException)2 InvalidSmilesException (org.openscience.cdk.exception.InvalidSmilesException)2 StructureDiagramGenerator (org.openscience.cdk.layout.StructureDiagramGenerator)2 ExtendsNTimes (algorithms.isomorphism.conditions.ExtendsNTimes)1 Coverage (algorithms.utils.Coverage)1 FamilyDB (db.FamilyDB)1 ArrayList (java.util.ArrayList)1 Family (model.Family)1 OtherChemicalObject (model.OtherChemicalObject)1 Rule (model.Rule)1 Replacement (model.Rule.Replacement)1 ContractedGraph (model.graph.ContractedGraph)1 Bond (org.openscience.cdk.Bond)1