/* $RCSfile$ * $Author$ * $Date$ * $Revision$ * * Copyright (C) 2004-2008 Rajarshi Guha <rajarshi.guha@gmail.com> * * Contact: cdk-devel@lists.sourceforge.net * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ package org.openscience.cdk.pharmacophore; import org.openscience.cdk.Atom; import org.openscience.cdk.annotations.TestClass; import org.openscience.cdk.annotations.TestMethod; import javax.vecmath.Point3d; import java.util.Arrays; /** * A representation of a pharmacophore group. * <p/> * In general this class is used internally for pharmacophore matchin and does not be instantiated * by the user. However after a successful match the user will get access to objects of this class * which match parts of a query. * <p/> * The main features of a pharmacophore group are the SMARTS pattern defining what the group * is meant to identify and the atoms of a molecule that correspond to the SMARTS pattern. * * @author Rajarshi Guha * @cdk.module pcore * @cdk.githash * @cdk.keyword pharmacophore * @cdk.keyword 3D isomorphism * @see org.openscience.cdk.pharmacophore.PharmacophoreMatcher * @see org.openscience.cdk.pharmacophore.PharmacophoreBond */ @TestClass("org.openscience.cdk.pharmacophore.PharmacophoreAtomTest") public class PharmacophoreAtom extends Atom { private String smarts; private int[] matchingAtoms; /** * Create a pharmacophore group. * * @param smarts The SMARTS pattern for the group * @param symbol The label for this group. * @param coordinates The coordinates for the group. Note that since a pharmacophore group may match * multiple atoms (say a c1ccccc1 group), the coordinates for the group are the effective coordinates * of all the atoms for the group. In effect this means that for multi-atom groups, the coordinate * is simply the mean of the coordinates of the individual atoms for the group. */ public PharmacophoreAtom(String smarts, String symbol, Point3d coordinates) { this.smarts = smarts; this.symbol = symbol; setPoint3d(coordinates); } /** * Create a pharmacophore group. * * @param pharmacophoreAtom A previously created pharmacophore group */ public PharmacophoreAtom(PharmacophoreAtom pharmacophoreAtom) { this.smarts = pharmacophoreAtom.getSmarts(); this.symbol = pharmacophoreAtom.getSymbol(); setPoint3d(new Point3d(pharmacophoreAtom.getPoint3d())); if (pharmacophoreAtom.getMatchingAtoms() != null) { int[] indices = pharmacophoreAtom.getMatchingAtoms(); matchingAtoms = new int[indices.length]; System.arraycopy(indices, 0, matchingAtoms, 0, indices.length); } } /** * Set the SMARTS for the group. * * @param smarts The SMARTS pattern */ @TestMethod("testGetterSetter") public void setSmarts(String smarts) { this.smarts = smarts; } /** * Get the SMARTS for the group. * * @return The SMARTS pattern * @see #setSmarts(String) */ @TestMethod("testGetterSetter") public String getSmarts() { return smarts; } /** * Set the atoms of a target molecule that correspond to this group. * <p/> * This method is generally only useful in the context of pharmacophore matching * * @param atomIndices The indicies of the atoms in a molecule that match * the pattern for this group. * @see #getMatchingAtoms() * @see org.openscience.cdk.pharmacophore.PharmacophoreMatcher */ @TestMethod("testMatchingAtoms") public void setMatchingAtoms(int[] atomIndices) { this.matchingAtoms = new int[atomIndices.length]; System.arraycopy(atomIndices, 0, this.matchingAtoms, 0, atomIndices.length); } /** * Get the atoms of a target molecule that correspond to this group. * <p/> * This method is generally only useful in the context of pharmacophore matching * * @return The indices of the atoms, in a molecule, that match the pattern for this group. * @see #setMatchingAtoms(int[]) * @see org.openscience.cdk.pharmacophore.PharmacophoreMatcher */ @TestMethod("testMatchingAtoms") public int[] getMatchingAtoms() { return matchingAtoms; } @TestMethod("testEquals") public boolean equals(Object o) { if (!(o instanceof PharmacophoreAtom)) return false; PharmacophoreAtom patom = (PharmacophoreAtom) o; Arrays.sort(matchingAtoms); int[] tmp = patom.getMatchingAtoms(); Arrays.sort(tmp); boolean atomIndicesMatch = true; if (matchingAtoms.length == tmp.length) { for (int i = 0; i < matchingAtoms.length; i++) { if (tmp[i] != matchingAtoms[i]) { atomIndicesMatch = false; break; } } } else atomIndicesMatch = false; return smarts.equals(patom.getSmarts()) && symbol.equals(patom.getSymbol()) && point3d.equals(patom.getPoint3d()) && atomIndicesMatch; } }