/*  $RCSfile$
 *  $Author$
 *  $Date$
 *  $Revision$
 *
 *  Copyright (C) 2005-2007  Christian Hoppe <chhoppe@users.sf.net>
 *
 *  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.
 *  All we ask is that proper credit is given for our work, which includes
 *  - but is not limited to - adding the above copyright notice to the beginning
 *  of your source code files, and to any copyright notice that you may distribute
 *  with programs based on this work.
 *
 *  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.modeling.builder3d;

import java.util.List;
import java.util.Vector;
import java.util.regex.Pattern;

/**
 *  Class stores hose code patterns to identify mm2 force field atom types.
 *
 * @author      chhoppe
 * @cdk.created 2004-09-07
 * @cdk.module  forcefield
 * @cdk.githash
 */
public class MM2BasedAtomTypePattern {

	private List<Pattern> atomTypePatterns = new Vector<Pattern>();

	/**
	 *Constructor for the MM2BasedAtomTypePattern object
	 */
	MM2BasedAtomTypePattern() {
		this.createPattern();
	}

	/**
	 *  Gets the atomTypePatterns attribute of the MM2BasedAtomTypePattern object
	 *
	 * @return    The atomTypePatterns as a vector
	 */
	public List<Pattern> getAtomTypePatterns() {
		return atomTypePatterns;
	}

	/**
	 *  Creates the atom type pattern
	 */
	private void createPattern() {
		atomTypePatterns.add(Pattern.compile("[CSP]-[0-4][-]?+;[A-Za-z+-]{0,6}[(].*+"));
		//Csp3
		atomTypePatterns.add(Pattern.compile("[CS]-[0-3];[H]{0,2}+[A-Za-z]*+=[A-Z]{1,2}+.*+"));
		//Csp2
		atomTypePatterns.add(Pattern.compile("C-[0-3];=O.*+"));
		//C carbonyl
		atomTypePatterns.add(Pattern.compile("C-[1-2][-]?+;[H]{0,1}+%.*+"));
		//csp
		atomTypePatterns.add(Pattern.compile("H-[0-1];[C].*+"));
		//H
		atomTypePatterns.add(Pattern.compile("[OS]-[0-2][-]?+;[A-Za-z]{1,4}+[+]?+[(].*+"));
		//O Ether,Alcohol
		atomTypePatterns.add(Pattern.compile("O-[1-2][+]?+;[H]{0,1}+=[SPC].[^O]++.*+"));
		//=0 Carbonyl
		atomTypePatterns.add(Pattern.compile("N-[0-3][+-]?+;[A-Z &&[^=%]]{1,3}+.*+"));
		//nsp3
		atomTypePatterns.add(Pattern.compile("N-[1-3][-+]?+;=?+[ON]?+[+]?+[CH]*+.(=O)?+.*+"));
		//nsp2amide
		atomTypePatterns.add(Pattern.compile("N-[1-2][+]?+;%.*+"));
		//nsp (10)
		atomTypePatterns.add(Pattern.compile("F.*+"));
		//F
		atomTypePatterns.add(Pattern.compile("Cl.*+"));
		//Cl
		atomTypePatterns.add(Pattern.compile("Br.*+"));
		//Br
		atomTypePatterns.add(Pattern.compile("I.*+"));
		//I
		atomTypePatterns.add(Pattern.compile("S-[1-2][-]?+;[HCSON]{1,2}+[(].*+"));
		//S Sulfide
		atomTypePatterns.add(Pattern.compile("S-3+;.?+[A-Za-z]++.*+"));
		//S+Sulfonium
		atomTypePatterns.add(Pattern.compile("S-[1-2][+]?+;=[OCNP][A-Z]++.*+"));
		//S=0
		atomTypePatterns.add(Pattern.compile("S-4;=O=O[A-Za-z]++.*+"));
		//So2
		atomTypePatterns.add(Pattern.compile("Si.*+"));
		//Silane
		atomTypePatterns.add(Pattern.compile("LP.*+"));
		//Lonepair (20)
		atomTypePatterns.add(Pattern.compile("H-1;O[+-]?+.[PSCN]{0,2}+/.*+"));
		//H- OH
		atomTypePatterns.add(Pattern.compile("C-3;CCC..?+&?+[A-Za-z]?+,?+.?+&?+,?+.?+&?+.*+"));
		//C Cyclopropane
		atomTypePatterns.add(Pattern.compile("H-1;[NP][+]?+[(][H]{0,2}+=?+[A-Z]{0,2}+/.*+"));
		//H- NH amine
		atomTypePatterns.add(Pattern.compile("H-1;O[+]?+.=?+C/=?+[OCSP]{1,2}+/.*+"));
		//H- COOH
		atomTypePatterns.add(Pattern.compile("P-[0-3];[A-Za-z]{1,3}[(].*+"));
		//>P
		atomTypePatterns.add(Pattern.compile("B-[0-3];[A-Za-z]{1,2}.*+"));
		//>B
		atomTypePatterns.add(Pattern.compile("B-4;[A-Za-z]{1,4}.*+"));
		//>B<
		atomTypePatterns.add(Pattern.compile("SPECIAL DEFINITON "));
		//H- Amide/Enol
		atomTypePatterns.add(Pattern.compile("NOT Implemented"));
		//C* Carbonradical
		atomTypePatterns.add(Pattern.compile("C-[0-9][+];.*+"));
		//C+ (30)
		atomTypePatterns.add(Pattern.compile("Ge.*+"));
		//Ge
		atomTypePatterns.add(Pattern.compile("Sn.*+"));
		//Sn
		atomTypePatterns.add(Pattern.compile("Pb.*+"));
		//Pb
		atomTypePatterns.add(Pattern.compile("Se.*+"));
		//Se
		atomTypePatterns.add(Pattern.compile("Te.*+"));
		//Te
		atomTypePatterns.add(Pattern.compile("D-1;.*+"));
		//D
		atomTypePatterns.add(Pattern.compile("N-2;=CC..*+"));
		//-N= azo,Pyridin
		atomTypePatterns.add(Pattern.compile("C-2;=CC..?+[A-Za-z]?+,?+&?+,?+C?+&?+.*+"));
		//Csp2 Cyclopropene
		atomTypePatterns.add(Pattern.compile("N-4[+]?+;.*+"));
		//nsp3 ammonium
		atomTypePatterns.add(Pattern.compile("N-[2-3];H?+CC.[^(=O)].*+"));
		//nsp2pyrrole (40)
		atomTypePatterns.add(Pattern.compile("O-2;CC.=C.*+&.*+&.*+"));
		//osp2furan
		atomTypePatterns.add(Pattern.compile("S-2;CC.*+"));
		//s sp2 thiophene
		atomTypePatterns.add(Pattern.compile("N-[2-3][+]?+;=N.*+C?+O?+[-]?+.*+"));
		//-N=N-O
		atomTypePatterns.add(Pattern.compile("H-1;S.*+"));
		//H- S hiol
		atomTypePatterns.add(Pattern.compile("N-2[+];=?+%?+[NC][-=]{0,2}+[NC][-]?+.*+"));
		//Azide Center n
		atomTypePatterns.add(Pattern.compile("N-3[+];=O[A-Z]-?+[A-Z]-?+.*+"));
		//n no2
		atomTypePatterns.add(Pattern.compile("O-1-?+;=?+[CS][(][=0]?+[OCSNH]*+/.*+"));
		//0 carboxylate
		atomTypePatterns.add(Pattern.compile("H-1;N[+].[A-Z]{0,3}+/.*+"));
		//h ammonium
		atomTypePatterns.add(Pattern.compile("O-2;CC.H?+,?+H?+,?+&,&.*+"));
		//Epoxy
		atomTypePatterns.add(Pattern.compile("C-2;=CC.*+"));
		//C Benzene (50)
		atomTypePatterns.add(Pattern.compile("He.*+"));
		//He
		atomTypePatterns.add(Pattern.compile("Ne.*+"));
		//Ne
		atomTypePatterns.add(Pattern.compile("Ar.*+"));
		//Ar
		atomTypePatterns.add(Pattern.compile("Kr.*+"));
		//Kr
		atomTypePatterns.add(Pattern.compile("Xe.*+"));
		//Xe
		atomTypePatterns.add(Pattern.compile("NotImplemented"));
		atomTypePatterns.add(Pattern.compile("NotImplemented"));
		atomTypePatterns.add(Pattern.compile("NotImplemented"));
		atomTypePatterns.add(Pattern.compile("Mg.*+"));
		//Mg
		atomTypePatterns.add(Pattern.compile("P-[2-4];.*"));
		//P (60)
		atomTypePatterns.add(Pattern.compile("Fe.*+"));
		//Fe 2
		atomTypePatterns.add(Pattern.compile("Fe.*+"));
		//Fe 3
		atomTypePatterns.add(Pattern.compile("Ni.*+"));
		//Ni 2
		atomTypePatterns.add(Pattern.compile("Ni.*+"));
		//Ni 3
		atomTypePatterns.add(Pattern.compile("Co.*+"));
		//Co 2
		atomTypePatterns.add(Pattern.compile("Co.*+"));
		//Co 3
		atomTypePatterns.add(Pattern.compile("NotImplemented"));
		atomTypePatterns.add(Pattern.compile("NotImplemented"));
		atomTypePatterns.add(Pattern.compile("O-1[-]?+;=?+N.*+"));
		//Amineoxide
		atomTypePatterns.add(Pattern.compile("O-3[+];[H]{0,3}+[C]{0,3}+[(].*+"));
		//Ketoniumoxygen (70)
		atomTypePatterns.add(Pattern.compile("C-1NotImplemented"));
		//Ketoniumcarbon
		atomTypePatterns.add(Pattern.compile("N-2;=C[^CO].*+"));
		//N =N-Imine,Oxime
		atomTypePatterns.add(Pattern.compile("N-3[+];[H]{0,2}+=?+[C]{0,3}+[(].*+"));
		//N+ =N+Pyridinium
		atomTypePatterns.add(Pattern.compile("N-[2-3][+];=C[CO]{2}+.?+[(].*+"));
		//N+ =N+Imminium
		atomTypePatterns.add(Pattern.compile("N-[2-3][+]?+;=CO.*+"));
		//N-0H Oxime
		atomTypePatterns.add(Pattern.compile("H-1;N[(]{1}+[CH]{2,2}+/[H]{0,3}+[,]?+=OC.*+"));
		//H- Amide
		atomTypePatterns.add(Pattern.compile("H-1;O.C/=CC/.*+"));
		//H- AEnol (77)
		atomTypePatterns.add(Pattern.compile("N-[1-3];[CH]{1,3}.{1}+[A-Z]{0,3}+[,]?+=OC.*+"));
		//amid
	}
}

