
com.actelion.research.chem.SmilesCreator Maven / Gradle / Ivy
/***************************************************************************
SmilesCreator.java (June 05, 1998 / Man-Ling Lee)
Last change: Jul. 19, 1998
-->Generate a non-unique Smiles string of a given molecule.
-->Stereo features not yet implemented.
Atom description in SMILES:
[(isotop)(symbol)(implicit H's)(charge)], eg. [15NH2+];
Implicit H's are needed, if symbol is in a bracket.
If only the label (of an organic atom) is given, then brackets are not
required.
****************************************************************************/
package com.actelion.research.chem;
/**
* Use the IsomericSmilesCreator instead!!!
*/
@Deprecated
public class SmilesCreator
{
private ExtendedMolecule mMol;
protected String mSmiles;
private int mVisitedMolAtoms;
private int mMolAtomIsSmiAtom[]; // To get the correspond sAtom.
private boolean mVisitedMolAtom[]; // The atom order here is same as
private boolean mVisitedMolBond[]; // the one in the Molecule mol.
private String mSmiAtomStr[]; // May have another atom order as above.
private int mRingClosures; // Number of Ring closures found.
private int mDisconnections;
/**
public String generateSmiles (Molecule inMol)
Effect on instance variable:
-> increment this.mVisitedMolAtoms
-> increment this.mDisconnections,
if inMol consists of several isolated molecules (or atoms).
-> Build mSmiles.
* This class is deprecated. Use the IsomericSmilesCreator instead!!!
*/
@Deprecated
public String generateSmiles (ExtendedMolecule inMol)
{
int atoms, bonds;
int i;
boolean visitedAllAtoms = false;
// Set variables
mMol = inMol;
mMol.ensureHelperArrays(Molecule.cHelperParities);
atoms = mMol.getAtoms();
bonds = mMol.getBonds();
mVisitedMolBond = new boolean[bonds];
for (i=0; i 0)
mSmiAtomStr[mVisitedMolAtoms++] = ".";
visitMolAtom (i, -1);
++mDisconnections;
break;
}
}
if (i == atoms)
visitedAllAtoms = true;
}
// Build the mSmiles
mSmiles = "";
for (i=0; i increment this.mVisitedMolAtoms
-> increment this.mRingClosures, if rings exist
-> set this.mSmiAtomStr[mVisitedMolAtoms]
*/
private void visitMolAtom (int molAtom, int molBond)
{
boolean addBracket = true;
int atomCharge, atomIsotope, atomicNo;
int branchesToVisit = 0;
int connAtom, connAtoms, connBond;
int currentSmiAtom;
int i, implicitHs;
int skippedConnAtoms = 0;
String atomLabel;
currentSmiAtom = mVisitedMolAtoms;
mMolAtomIsSmiAtom[molAtom] = currentSmiAtom;
// Get atom properties
atomicNo = mMol.getAtomicNo(molAtom);
atomLabel = mMol.getAtomLabel(molAtom);
atomCharge = mMol.getAtomCharge(molAtom);
atomIsotope = mMol.getAtomMass(molAtom);
connAtoms = mMol.getConnAtoms(molAtom);
// Build mSmiAtomStr[currentSmiAtom];
// The order of the elements are defined by Daylight
if (atomCharge == 0 && atomIsotope == 0 && isOrganic(atomicNo))
addBracket = false;
mSmiAtomStr[currentSmiAtom] = ""; // Clear mSmiAtomStr
if (molBond != -1)
{
switch (mMol.getBondOrder(molBond))
{
case 0: mSmiAtomStr[currentSmiAtom] += "~"; break; //Query
case 2: mSmiAtomStr[currentSmiAtom] += "="; break;
case 3: mSmiAtomStr[currentSmiAtom] += "#"; break;
}
}
if (addBracket == true)
mSmiAtomStr[currentSmiAtom] += "[";
if (atomIsotope != 0)
mSmiAtomStr[currentSmiAtom] += java.lang.Integer.toString(atomIsotope);
mSmiAtomStr[currentSmiAtom] += atomLabel;
if (addBracket == true)
{
if (0 < (implicitHs = mMol.getImplicitHydrogens(molAtom)))
{
mSmiAtomStr[currentSmiAtom] += "H";
if (1 < implicitHs)
mSmiAtomStr[currentSmiAtom] += implicitHs;
}
}
if (atomCharge != 0)
{
if (atomCharge > 0)
mSmiAtomStr[currentSmiAtom] += "+";
else
mSmiAtomStr[currentSmiAtom] += "-";
if (Math.abs(atomCharge) > 1)
mSmiAtomStr[currentSmiAtom] += java.lang.Integer.toString(Math.abs(atomCharge));
}
if (addBracket == true)
mSmiAtomStr[currentSmiAtom] += "]";
// When ready with current atom, then
if (molBond != -1)
mVisitedMolBond[molBond] = true;
mVisitedMolAtom[molAtom] = true;
++mVisitedMolAtoms;
// Count the branches which has to be visited
for (i=0; i 9)
{
mSmiAtomStr[mMolAtomIsSmiAtom[connAtom]] += "%";
mSmiAtomStr[currentSmiAtom] += "%";
}
mSmiAtomStr[mMolAtomIsSmiAtom[connAtom]] += java.lang.Integer.toString(mRingClosures);
mSmiAtomStr[currentSmiAtom] += java.lang.Integer.toString(mRingClosures);
continue;
}
if (i-skippedConnAtoms < branchesToVisit-1) // new branch
mSmiAtomStr[mVisitedMolAtoms++] = "(";
visitMolAtom (connAtom, connBond);
// end of a branch
// In meantime all the atoms of the branch starting with
// ith atom neighbor of atom currentSmiAtom have been visited.
// So mVisitedMolAtoms is changed.
if (i-skippedConnAtoms < branchesToVisit-1)
mSmiAtomStr[mVisitedMolAtoms++] = ")";
}
}
private boolean isOrganic (int atomicNo)
{
switch (atomicNo)
{
case 5: // B
case 6: // C
case 7: // N
case 8: // O
case 9: // F
case 15: // P
case 16: // S
case 17: // Cl
case 35: // Br
case 53: return (true); // I
default: return (false); // non-organic atoms in Daylight
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy