/* $Revision: 9167 $ $Author: rajarshi $ $Date: 2007-10-22 01:26:11 +0200 (Mon, 22 Oct 2007) $ * * Copyright (C) 2008 Rajarshi Guha <rajarshi@users.sf.net> * * Contact: cdk-devel@lists.sf.net * * This library 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 library 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 library; if not, write to the Free Software * Foundation, 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ package org.openscience.cdk.tools.periodictable; import org.openscience.cdk.CDKConstants; import org.openscience.cdk.annotations.TestClass; import org.openscience.cdk.annotations.TestMethod; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Represents elements of the Periodic Table. * <p/> * Though individual elements can be obtained from instances * of {@link org.openscience.cdk.tools.periodictable.PeriodicTableElement}, this utility * class is useful when one wants generic properties of elements such * as atomic number, VdW radius etc. * * @author Rajarshi Guha * @cdk.created 2008-06-12 * @cdk.keyword element * @cdk.keyword periodic table * @cdk.keyword radius, vanderwaals * @cdk.keyword electronegativity * @cdk.module standard * @cdk.githash */ @TestClass("org.openscience.cdk.tools.periodictable.PeriodicTableTest") public class PeriodicTable { private static boolean isInitialized = false; private static Map<String, PeriodicTableElement> elements; private static Map<Integer, PeriodicTableElement> elementsByNumber; private static void initialize() { if (isInitialized) return; ElementPTFactory factory; try { factory = ElementPTFactory.getInstance(); } catch (IOException e) { elements = null; return; } elements = new HashMap<String, PeriodicTableElement>(); elementsByNumber = new HashMap<Integer, PeriodicTableElement>(); List<PeriodicTableElement> tmp = factory.getElements(); for (PeriodicTableElement element : tmp) { elements.put(element.getSymbol(), element); elementsByNumber.put(element.getAtomicNumber(), element); } try { readVDW(); readCovalent(); readPEneg(); } catch (IOException e) { return; } isInitialized = true; } private static void readVDW() throws IOException { // now read in the VdW radii String filename = "org/openscience/cdk/config/data/radii-vdw.txt"; InputStream ins = PeriodicTable.class.getClassLoader().getResourceAsStream(filename); BufferedReader reader = new BufferedReader(new InputStreamReader(ins)); for (int i = 0; i < 6; i++) reader.readLine(); String line; while ((line = reader.readLine()) != null) { String[] toks = line.split("\\s"); int atnum = Integer.parseInt(toks[0]); double vdw = Double.parseDouble(toks[1]); PeriodicTableElement e = elementsByNumber.get(atnum); if (e != null) { String symbol = e.getSymbol(); if (vdw == 2) elements.get(symbol).setVdwRadius((Double) CDKConstants.UNSET); else elements.get(symbol).setVdwRadius(vdw); } } } private static void readCovalent() throws IOException { // now read in the covalent radi String filename = "org/openscience/cdk/config/data/radii-covalent.txt"; InputStream ins = PeriodicTable.class.getClassLoader().getResourceAsStream(filename); BufferedReader reader = new BufferedReader(new InputStreamReader(ins)); for (int i = 0; i < 5; i++) reader.readLine(); String line; while ((line = reader.readLine()) != null) { String[] toks = line.split("\\s"); int atnum = Integer.parseInt(toks[0]); double vdw = Double.parseDouble(toks[1]); PeriodicTableElement e = elementsByNumber.get(atnum); if (e != null) { String symbol = e.getSymbol(); elements.get(symbol).setCovalentRadius(vdw); } } } private static void readPEneg() throws IOException { // now read in the VdW radii String filename = "org/openscience/cdk/config/data/electroneg-pauling.txt"; InputStream ins = PeriodicTable.class.getClassLoader().getResourceAsStream(filename); BufferedReader reader = new BufferedReader(new InputStreamReader(ins)); for (int i = 0; i < 6; i++) reader.readLine(); String line; while ((line = reader.readLine()) != null) { String[] toks = line.split("\\s"); int atnum = Integer.parseInt(toks[0]); double eneg = Double.parseDouble(toks[1]); PeriodicTableElement e = elementsByNumber.get(atnum); if (e != null) { String symbol = e.getSymbol(); elements.get(symbol).setPaulingEneg(eneg); } } } @TestMethod("testTable") public static Double getVdwRadius(String symbol) { initialize(); PeriodicTableElement element = elements.get(symbol); if (element == null) return null; else return element.getVdwRadius(); } @TestMethod("testTable") public static Double getCovalentRadius(String symbol) { initialize(); PeriodicTableElement element = elements.get(symbol); if (element == null) return null; else return element.getCovalentRadius(); } @TestMethod("testTable") public static String getCASId(String symbol) { initialize(); PeriodicTableElement element = elements.get(symbol); if (element == null) return null; else return element.getCASid(); } @TestMethod("testTable") public static String getChemicalSeries(String symbol) { initialize(); PeriodicTableElement element = elements.get(symbol); if (element == null) return null; else return element.getChemicalSerie(); } @TestMethod("testTable") public static Integer getGroup(String symbol) { initialize(); PeriodicTableElement element = elements.get(symbol); if (element == null) return null; else return element.getGroup(); } @TestMethod("testTable") public static String getName(String symbol) { initialize(); PeriodicTableElement element = elements.get(symbol); if (element == null) return null; else return element.getName(); } @TestMethod("testTable") public static Integer getPeriod(String symbol) { initialize(); PeriodicTableElement element = elements.get(symbol); if (element == null) return null; else return element.getPeriod(); } @TestMethod("testTable") public static String getPhase(String symbol) { initialize(); PeriodicTableElement element = elements.get(symbol); if (element == null) return null; else return element.getPhase(); } @TestMethod("testTable") public static Integer getAtomicNumber(String symbol) { initialize(); PeriodicTableElement element = elements.get(symbol); if (element == null) return null; else return element.getAtomicNumber(); } @TestMethod("testTable") public static Double getPaulingElectronegativity(String symbol) { initialize(); PeriodicTableElement element = elements.get(symbol); if (element == null) return null; else return element.getPaulingEneg(); } @TestMethod("testTable") public static String getSymbol(int atomicNumber) { initialize(); PeriodicTableElement element = elementsByNumber.get(atomicNumber); if (element == null) return null; else return element.getSymbol(); } @TestMethod("testTable") public static int getElementCount() { initialize(); return elements.size(); } }