⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdkutilities.java

📁 化学图形处理软件
💻 JAVA
字号:
/* $RCSfile: $
 * $Author: egonw $
 * $Date: 2006-05-04 19:29:58 +0000 (Thu, 04 May 2006) $
 * $Revision: 6171 $
 *
 * Copyright (C) 2006-2007  Todd Martin (Environmental Protection Agency)
 *
 * 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.tools;

import java.util.HashMap;
import java.util.List;
import java.util.Iterator;

import org.openscience.cdk.CDKConstants;
import org.openscience.cdk.aromaticity.HueckelAromaticityDetector;
import org.openscience.cdk.interfaces.IAtom;
import org.openscience.cdk.interfaces.IBond;
import org.openscience.cdk.interfaces.IMolecule;
import org.openscience.cdk.interfaces.IRingSet;
import org.openscience.cdk.interfaces.IRing;
import org.openscience.cdk.ringsearch.AllRingsFinder;

/**
 * Utility class written by Todd Martin, for help in his QSAR descriptors and SMILES
 * parser. Seems to have overlap with, at least, cdk.tools.Normalizer.
 * 
 * <p>TODO: merge with Normalizer.
 * 
 * @author     Todd Martin
 * @cdk.module extra
 * 
 * @see        org.openscience.cdk.tools.Normalizer
 */
public class CDKUtilities {
		
	public static String fixSmiles(String Smiles) {
		Smiles=Smiles.replaceAll("CL","Cl");
		Smiles=Smiles.replaceAll("(H)","([H])");
//		Smiles=Smiles.replace("N=N#N","N=[N+]=[N-]");
//		Smiles=Smiles.replace("#N=O","#[N+][O-]");
		Smiles=Smiles.trim();
		
		return Smiles;
		
	}
	
	
	private static boolean fixNitroGroups(IMolecule m) {
		// changes nitros given by N(=O)(=O) to [N+](=O)[O-]
		boolean changed=false;
		try {
		for (int i=0;i<=m.getAtomCount()-1;i++) {
			IAtom a=m.getAtom(i);
			boolean nitro=false;
			
			if (a.getSymbol().equals("N")) {
				List ca=m.getConnectedAtomsList(a);
				
				if (ca.size()==3) {					
					
					IAtom [] cao= new IAtom[2];
					
					int count=0;
					
					for (int j=0;j<=2;j++) {					
						if (((IAtom)ca.get(j)).getSymbol().equals("O")) {
							count++;
						}						
					}
					
					if (count>1) {
					
						count=0;
						for (int j=0;j<=2;j++) {
							IAtom caj = (IAtom)ca.get(j);
							if (caj.getSymbol().equals("O")) {
								if (m.getConnectedAtomsCount(caj)==1) {// account for possibility of ONO2
									cao[count]=caj;
									count++;									
								}
							}						
						}
						
						
						double order1=m.getBond(a,cao[0]).getOrder();
						double order2=m.getBond(a,cao[1]).getOrder();
						
						
						//if (totalobonds==4) { // need to fix (FIXME)
						if (order1==2 && order2==2) {
							a.setFormalCharge(1);
							cao[0].setFormalCharge(-1); // pick first O arbitrarily
							m.getBond(a,cao[0]).setOrder(1);
							changed=true;
						}
					} //else if (count==1) {// end if count>1
					
				}// end ca==3 if
				
			} // end symbol == N
			
			
		}
		
		return changed;
		
		
		} catch (Exception e) {
			return changed;
		}
		
	}
	
	public static boolean fixNitroGroups2(IMolecule m) {
		// changes nitros given by [N+](=O)[O-] to N(=O)(=O) 
		boolean changed=false;
		try {
		for (int i=0;i<=m.getAtomCount()-1;i++) {
			IAtom a=m.getAtom(i);
			boolean nitro=false;
			
			if (a.getSymbol().equals("N")) {
				List ca=m.getConnectedAtomsList(a);
				
				if (ca.size()==3) {					
					
					IAtom [] cao=new IAtom[2];
					
					int count=0;
					
					for (int j=0;j<=2;j++) {
						IAtom caj = (IAtom)ca.get(j);
						if (caj.getSymbol().equals("O")) {
							count++;
						}						
					}
					
					if (count>1) {
					
						count=0;
						for (int j=0;j<=2;j++) {
							IAtom caj = (IAtom)ca.get(j);
							if (caj.getSymbol().equals("O")) {
								if (m.getConnectedAtomsCount(caj) == 1) {// account for possibility of ONO2
									cao[count]=caj;
									count++;									
								}
							}						
						}
						
						
						double order1=m.getBond(a,cao[0]).getOrder();
						double order2=m.getBond(a,cao[1]).getOrder();
						
						//int totalobonds=0;						
						//totalobonds+=m.getBond(a,cao[0]).getOrder();
//						totalobonds+=m.getBond(a,cao[1]).getOrder();
						
						//if (totalobonds==4) { // need to fix
						if ((order1==1 && order2==2) || (order1==2 && order2==1) ) {
							a.setFormalCharge(0);
							cao[0].setFormalCharge(0); // pick first O arbitrarily
							cao[1].setFormalCharge(0); // pick first O arbitrarily
							m.getBond(a,cao[0]).setOrder(2);
							m.getBond(a,cao[1]).setOrder(2);
							changed=true;
						}
					} // end if count>1
					
					
				}// end ca==3 if
				
			} // end symbol == N
			
			
		}
		
		return changed;
		} catch (Exception e) {
			return changed;
		}
	}
	
	
	
	
	
	public static void makeHydrogensExplicit(IMolecule molecule)
	{		
		
		HydrogenAdder hydrogenAdder = null;
		hydrogenAdder = new HydrogenAdder("org.openscience.cdk.tools.ValencyChecker");

		//AtomContainer changedAtomsAndBonds = null;
			
		try
		{
			
			if (molecule != null) {
				// remove explicit hydrogen if necessary
				Iterator atoms = molecule.atoms();
				
				while (atoms.hasNext())
				{
					IAtom atom = (IAtom)atoms.next();
					if (atom.getSymbol().equals("H"))
					{
						molecule.removeAtomAndConnectedElectronContainers(atom);
					}
				}
				// add implicit hydrogen
				HashMap hydrogenAtomMap = hydrogenAdder.addImplicitHydrogensToSatisfyValency(molecule);
				
			}
		} catch (Exception e) {
			
		}
	}

	public static void addHydrogens(IMolecule m) {
		HydrogenAdder hydrogenAdder = null;
		hydrogenAdder = new HydrogenAdder("org.openscience.cdk.tools.ValencyChecker");

		try {
			hydrogenAdder.addExplicitHydrogensToSatisfyValency(m);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void fixAromaticityForXLogP(IMolecule m) {
		// need to find rings and aromaticity again since added H's
		
		IRingSet rs=null;
		try {
			AllRingsFinder arf = new AllRingsFinder();
			rs = arf.findAllRings(m);

			// SSSRFinder s = new SSSRFinder(m);
			// srs = s.findEssentialRings();

		} catch (Exception e) {
			e.printStackTrace();
		}
		
		try {
			// figure out which atoms are in aromatic rings:
			HueckelAromaticityDetector.detectAromaticity(m);
			// figure out which rings are aromatic:
			HueckelAromaticityDetector.detectAromaticity(m, rs);
			// figure out which simple (non cycles) rings are aromatic:
			// HueckelAromaticityDetector.detectAromaticity(m, srs);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
		// only atoms in 6 membered rings are aromatic
		// determine largest ring that each atom is a part of
		
		for (int i=0;i<=m.getAtomCount()-1;i++) {
			
			m.getAtom(i).setFlag(CDKConstants.ISAROMATIC,false);
			
			jloop:
			for (int j=0;j<=rs.getAtomContainerCount()-1;j++) {
				//logger.debug(i+"\t"+j);
				IRing r=(IRing)rs.getAtomContainer(j);
				if (!r.getFlag(CDKConstants.ISAROMATIC)) {
					continue jloop;
				}
				
				boolean haveatom=r.contains(m.getAtom(i));

				//logger.debug("haveatom="+haveatom);
				
				if (haveatom && r.getAtomCount()==6) {
					m.getAtom(i).setFlag(CDKConstants.ISAROMATIC,true);
				}
				
			}
			
		}

		
	}
	
	
	public static void fixSulphurH(IMolecule m) {
		// removes extra H's attached to sulphurs
		//logger.debug("EnterFixSulphur");
		
		for (int i = 0; i <= m.getAtomCount()-1; i++)
		{
			IAtom a=m.getAtom(i);
			
			if (a.getSymbol().equals("S")) {
				List connectedAtoms=m.getConnectedAtomsList(a);
				
				
				int bondOrderSum=0;
				
				double oldBondOrderSum = m.getBondOrderSum(a); // includes H's
												
				for (int j=0;j<connectedAtoms.size();j++) {
					IAtom conAtom = (IAtom)connectedAtoms.get(j);
					if (!conAtom.getSymbol().equals("H")) {
						IBond b=m.getBond(a,conAtom);
						bondOrderSum+=b.getOrder();						
					}
				}
								
				if (bondOrderSum>1) {
					for (int j=0;j<connectedAtoms.size();j++) {
						IAtom conAtom = (IAtom)connectedAtoms.get(j);
						if (conAtom.getSymbol().equals("H")) {
							m.removeAtomAndConnectedElectronContainers(conAtom);
						}
					}
				}
																	
			}
			
		}
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -