/* 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.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Hashtable;
import java.util.Map;


/**
 * Provides atomic property values for descriptor calculations.
 *
 * This class currently provides values for mass, van der Waals volume, electronegativity and
 * polarizability.
 *
 * @author     Todd Martin
 * @cdk.module qsar
 * @cdk.githash
 */
public class AtomicProperties {

    private static AtomicProperties ap                  = null;

    private Map<String, Double>     htMass              = new Hashtable<String, Double>();
    private Map<String, Double>     htVdWVolume         = new Hashtable<String, Double>();
    private Map<String, Double>     htElectronegativity = new Hashtable<String, Double>();
    private Map<String, Double>     htPolarizability    = new Hashtable<String, Double>();

    private AtomicProperties() throws IOException {

        String configFile = "org/openscience/cdk/config/data/whim_weights.txt";
        InputStream ins = this.getClass().getClassLoader().getResourceAsStream(configFile);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(ins));
        bufferedReader.readLine(); // header

        String Line;
        while (true) {
            Line = bufferedReader.readLine();
            if (Line == null) {
                break;
            }
            String[] components = Line.split("\t");

            String symbol = components[0];
            htMass.put(symbol, Double.parseDouble(components[1]));
            htVdWVolume.put(symbol, Double.parseDouble(components[2]));
            htElectronegativity.put(symbol, Double.parseDouble(components[3]));
            htPolarizability.put(symbol, Double.parseDouble(components[4]));
        }

        bufferedReader.close();
    }

    public double getVdWVolume(String symbol) {
        return htVdWVolume.get(symbol);
    }

    public double getNormalizedVdWVolume(String symbol) {
        return this.getVdWVolume(symbol) / this.getVdWVolume("C");
    }

    public double getElectronegativity(String symbol) {
        return htElectronegativity.get(symbol);
    }

    public double getNormalizedElectronegativity(String symbol) {
        return this.getElectronegativity(symbol) / this.getElectronegativity("C");
    }

    public double getPolarizability(String symbol) {
        return htPolarizability.get(symbol);
    }

    public double getNormalizedPolarizability(String symbol) {
        return this.getPolarizability(symbol) / this.getPolarizability("C");
    }

    public double getMass(String symbol) {
        return htMass.get(symbol);
    }

    public double getNormalizedMass(String symbol) {
        return this.getMass(symbol) / this.getMass("C");
    }

    public static AtomicProperties getInstance() throws IOException {
        if (ap == null) {
            ap = new AtomicProperties();
        }
        return ap;
    }

}
