Files
rdkit/Code/ForceField/UFF/Params.cpp
2015-11-14 14:58:11 +01:00

347 lines
12 KiB
C++

// $Id$
//
// Copyright (C) 2004-2006 Rational Discovery LLC
//
// @@ All Rights Reserved @@
// This file is part of the RDKit.
// The contents are covered by the terms of the BSD license
// which is included in the file license.txt, found at the root
// of the RDKit source tree.
//
#ifdef WIN32
#define _USE_MATH_DEFINES
#endif
#include <cmath>
#include "Params.h"
#include <iostream>
#include <sstream>
#include <RDGeneral/StreamOps.h>
#include <boost/lexical_cast.hpp>
#include <boost/tokenizer.hpp>
#include <Geometry/point.h>
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
namespace ForceFields {
namespace UFF {
class ParamCollection *ParamCollection::ds_instance = 0;
extern const std::string defaultParamData;
ParamCollection *ParamCollection::getParams(const std::string &paramData) {
if (ds_instance == 0) {
ds_instance = new ParamCollection(paramData);
} else if (paramData != "") {
delete ds_instance;
ds_instance = 0;
ds_instance = new ParamCollection(paramData);
}
return ds_instance;
}
ParamCollection::ParamCollection(std::string paramData) {
if (paramData == "") paramData = defaultParamData;
std::istringstream inStream(paramData);
std::string inLine = RDKit::getLine(inStream);
while (!inStream.eof()) {
if (inLine[0] != '#') {
AtomicParams paramObj;
boost::char_separator<char> tabSep("\t");
tokenizer tokens(inLine, tabSep);
tokenizer::iterator token = tokens.begin();
std::string label = *token;
++token;
paramObj.r1 = boost::lexical_cast<double>(*token);
++token;
paramObj.theta0 = boost::lexical_cast<double>(*token);
++token;
paramObj.theta0 = paramObj.theta0 * M_PI / 180.;
paramObj.x1 = boost::lexical_cast<double>(*token);
++token;
paramObj.D1 = boost::lexical_cast<double>(*token);
++token;
paramObj.zeta = boost::lexical_cast<double>(*token);
++token;
paramObj.Z1 = boost::lexical_cast<double>(*token);
++token;
paramObj.V1 = boost::lexical_cast<double>(*token);
++token;
paramObj.U1 = boost::lexical_cast<double>(*token);
++token;
paramObj.GMP_Xi = boost::lexical_cast<double>(*token);
++token;
paramObj.GMP_Hardness = boost::lexical_cast<double>(*token);
++token;
paramObj.GMP_Radius = boost::lexical_cast<double>(*token);
++token;
d_params[label] = paramObj;
}
inLine = RDKit::getLine(inStream);
}
}
const std::string defaultParamData =
"#Atom r1 theta0 x1 D1 zeta Z1 Vi Uj "
"Xi Hard Radius\n"
"H_ 0.354 180 2.886 0.044 12 0.712 0 0 "
"4.528 6.9452 0.371\n"
"H_b 0.46 83.5 2.886 0.044 12 0.712 0 0 "
"4.528 6.9452 0.371\n"
"He4+4 0.849 90 2.362 0.056 15.24 0.098 0 0 "
"9.66 14.92 1.3\n"
"Li 1.336 180 2.451 0.025 12 1.026 0 2 "
"3.006 2.386 1.557\n"
"Be3+2 1.074 109.47 2.745 0.085 12 1.565 0 2 "
"4.877 4.443 1.24\n"
"B_3 0.838 109.47 4.083 0.18 12.052 1.755 0 2 "
"5.11 4.75 0.822\n"
"B_2 0.828 120 4.083 0.18 12.052 1.755 0 2 "
"5.11 4.75 0.822\n"
"C_3 0.757 109.47 3.851 0.105 12.73 1.912 2.119 2 "
"5.343 5.063 0.759\n"
"C_R 0.729 120 3.851 0.105 12.73 1.912 0 2 "
"5.343 5.063 0.759\n"
"C_2 0.732 120 3.851 0.105 12.73 1.912 0 2 "
"5.343 5.063 0.759\n"
"C_1 0.706 180 3.851 0.105 12.73 1.912 0 2 "
"5.343 5.063 0.759\n"
"N_3 0.7 106.7 3.66 0.069 13.407 2.544 0.45 2 "
"6.899 5.88 0.715\n"
"N_R 0.699 120 3.66 0.069 13.407 2.544 0 2 "
"6.899 5.88 0.715\n"
"N_2 0.685 111.2 3.66 0.069 13.407 2.544 0 2 "
"6.899 5.88 0.715\n"
"N_1 0.656 180 3.66 0.069 13.407 2.544 0 2 "
"6.899 5.88 0.715\n"
"O_3 0.658 104.51 3.5 0.06 14.085 2.3 0.018 2 "
"8.741 6.682 0.669\n"
"O_3_z 0.528 146 3.5 0.06 14.085 2.3 0.018 2 "
"8.741 6.682 0.669\n"
"O_R 0.68 110 3.5 0.06 14.085 2.3 0 2 "
"8.741 6.682 0.669\n"
"O_2 0.634 120 3.5 0.06 14.085 2.3 0 2 "
"8.741 6.682 0.669\n"
"O_1 0.639 180 3.5 0.06 14.085 2.3 0 2 "
"8.741 6.682 0.669\n"
"F_ 0.668 180 3.364 0.05 14.762 1.735 0 2 "
"10.874 7.474 0.706\n"
"Ne4+4 0.92 90 3.243 0.042 15.44 0.194 0 2 "
"11.04 10.55 1.768\n"
"Na 1.539 180 2.983 0.03 12 1.081 0 1.25 "
"2.843 2.296 2.085\n"
"Mg3+2 1.421 109.47 3.021 0.111 12 1.787 0 1.25 "
"3.951 3.693 1.5\n"
"Al3 1.244 109.47 4.499 0.505 11.278 1.792 0 1.25 "
"4.06 3.59 1.201\n"
"Si3 1.117 109.47 4.295 0.402 12.175 2.323 1.225 1.25 "
"4.168 3.487 1.176\n"
"P_3+3 1.101 93.8 4.147 0.305 13.072 2.863 2.4 1.25 "
"5.463 4 1.102\n"
"P_3+5 1.056 109.47 4.147 0.305 13.072 2.863 2.4 1.25 "
"5.463 4 1.102\n"
"P_3+q 1.056 109.47 4.147 0.305 13.072 2.863 2.4 1.25 "
"5.463 4 1.102\n"
"S_3+2 1.064 92.1 4.035 0.274 13.969 2.703 0.484 1.25 "
"6.928 4.486 1.047\n"
"S_3+4 1.049 103.2 4.035 0.274 13.969 2.703 0.484 1.25 "
"6.928 4.486 1.047\n"
"S_3+6 1.027 109.47 4.035 0.274 13.969 2.703 0.484 1.25 "
"6.928 4.486 1.047\n"
"S_R 1.077 92.2 4.035 0.274 13.969 2.703 0 1.25 "
"6.928 4.486 1.047\n"
"S_2 0.854 120 4.035 0.274 13.969 2.703 0 1.25 "
"6.928 4.486 1.047\n"
"Cl 1.044 180 3.947 0.227 14.866 2.348 0 1.25 "
"8.564 4.946 0.994\n"
"Ar4+4 1.032 90 3.868 0.185 15.763 0.3 0 1.25 "
"9.465 6.355 2.108\n"
"K_ 1.953 180 3.812 0.035 12 1.165 0 0.7 "
"2.421 1.92 2.586\n"
"Ca6+2 1.761 90 3.399 0.238 12 2.141 0 0.7 "
"3.231 2.88 2\n"
"Sc3+3 1.513 109.47 3.295 0.019 12 2.592 0 0.7 "
"3.395 3.08 1.75\n"
"Ti3+4 1.412 109.47 3.175 0.017 12 2.659 0 0.7 "
"3.47 3.38 1.607\n"
"Ti6+4 1.412 90 3.175 0.017 12 2.659 0 0.7 "
"3.47 3.38 1.607\n"
"V_3+5 1.402 109.47 3.144 0.016 12 2.679 0 0.7 "
"3.65 3.41 1.47\n"
"Cr6+3 1.345 90 3.023 0.015 12 2.463 0 0.7 "
"3.415 3.865 1.402\n"
"Mn6+2 1.382 90 2.961 0.013 12 2.43 0 0.7 "
"3.325 4.105 1.533\n"
"Fe3+2 1.27 109.47 2.912 0.013 12 2.43 0 0.7 "
"3.76 4.14 1.393\n"
"Fe6+2 1.335 90 2.912 0.013 12 2.43 0 0.7 "
"3.76 4.14 1.393\n"
"Co6+3 1.241 90 2.872 0.014 12 2.43 0 0.7 "
"4.105 4.175 1.406\n"
"Ni4+2 1.164 90 2.834 0.015 12 2.43 0 0.7 "
"4.465 4.205 1.398\n"
"Cu3+1 1.302 109.47 3.495 0.005 12 1.756 0 0.7 "
"4.2 4.22 1.434\n"
"Zn3+2 1.193 109.47 2.763 0.124 12 1.308 0 0.7 "
"5.106 4.285 1.4\n"
"Ga3+3 1.26 109.47 4.383 0.415 11 1.821 0 0.7 "
"3.641 3.16 1.211\n"
"Ge3 1.197 109.47 4.28 0.379 12 2.789 0.701 0.7 "
"4.051 3.438 1.189\n"
"As3+3 1.211 92.1 4.23 0.309 13 2.864 1.5 0.7 "
"5.188 3.809 1.204\n"
"Se3+2 1.19 90.6 4.205 0.291 14 2.764 0.335 0.7 "
"6.428 4.131 1.224\n"
"Br 1.192 180 4.189 0.251 15 2.519 0 0.7 "
"7.79 4.425 1.141\n"
"Kr4+4 1.147 90 4.141 0.22 16 0.452 0 0.7 "
"8.505 5.715 2.27\n"
"Rb 2.26 180 4.114 0.04 12 1.592 0 0.2 "
"2.331 1.846 2.77\n"
"Sr6+2 2.052 90 3.641 0.235 12 2.449 0 0.2 "
"3.024 2.44 2.415\n"
"Y_3+3 1.698 109.47 3.345 0.072 12 3.257 0 0.2 "
"3.83 2.81 1.998\n"
"Zr3+4 1.564 109.47 3.124 0.069 12 3.667 0 0.2 "
"3.4 3.55 1.758\n"
"Nb3+5 1.473 109.47 3.165 0.059 12 3.618 0 0.2 "
"3.55 3.38 1.603\n"
"Mo6+6 1.467 90 3.052 0.056 12 3.4 0 0.2 "
"3.465 3.755 1.53\n"
"Mo3+6 1.484 109.47 3.052 0.056 12 3.4 0 0.2 "
"3.465 3.755 1.53\n"
"Tc6+5 1.322 90 2.998 0.048 12 3.4 0 0.2 "
"3.29 3.99 1.5\n"
"Ru6+2 1.478 90 2.963 0.056 12 3.4 0 0.2 "
"3.575 4.015 1.5\n"
"Rh6+3 1.332 90 2.929 0.053 12 3.5 0 0.2 "
"3.975 4.005 1.509\n"
"Pd4+2 1.338 90 2.899 0.048 12 3.21 0 0.2 "
"4.32 4 1.544\n"
"Ag1+1 1.386 180 3.148 0.036 12 1.956 0 0.2 "
"4.436 3.134 1.622\n"
"Cd3+2 1.403 109.47 2.848 0.228 12 1.65 0 0.2 "
"5.034 3.957 1.6\n"
"In3+3 1.459 109.47 4.463 0.599 11 2.07 0 0.2 "
"3.506 2.896 1.404\n"
"Sn3 1.398 109.47 4.392 0.567 12 2.961 0.199 0.2 "
"3.987 3.124 1.354\n"
"Sb3+3 1.407 91.6 4.42 0.449 13 2.704 1.1 0.2 "
"4.899 3.342 1.404\n"
"Te3+2 1.386 90.25 4.47 0.398 14 2.882 0.3 0.2 "
"5.816 3.526 1.38\n"
"I_ 1.382 180 4.5 0.339 15 2.65 0 0.2 "
"6.822 3.762 1.333\n"
"Xe4+4 1.267 90 4.404 0.332 12 0.556 0 0.2 "
"7.595 4.975 2.459\n"
"Cs 2.57 180 4.517 0.045 12 1.573 0 0.1 "
"2.183 1.711 2.984\n"
"Ba6+2 2.277 90 3.703 0.364 12 2.727 0 0.1 "
"2.814 2.396 2.442\n"
"La3+3 1.943 109.47 3.522 0.017 12 3.3 0 0.1 "
"2.8355 2.7415 2.071\n"
"Ce6+3 1.841 90 3.556 0.013 12 3.3 0 0.1 "
"2.774 2.692 1.925\n"
"Pr6+3 1.823 90 3.606 0.01 12 3.3 0 0.1 "
"2.858 2.564 2.007\n"
"Nd6+3 1.816 90 3.575 0.01 12 3.3 0 0.1 "
"2.8685 2.6205 2.007\n"
"Pm6+3 1.801 90 3.547 0.009 12 3.3 0 0.1 "
"2.881 2.673 2\n"
"Sm6+3 1.78 90 3.52 0.008 12 3.3 0 0.1 "
"2.9115 2.7195 1.978\n"
"Eu6+3 1.771 90 3.493 0.008 12 3.3 0 0.1 "
"2.8785 2.7875 2.227\n"
"Gd6+3 1.735 90 3.368 0.009 12 3.3 0 0.1 "
"3.1665 2.9745 1.968\n"
"Tb6+3 1.732 90 3.451 0.007 12 3.3 0 0.1 "
"3.018 2.834 1.954\n"
"Dy6+3 1.71 90 3.428 0.007 12 3.3 0 0.1 "
"3.0555 2.8715 1.934\n"
"Ho6+3 1.696 90 3.409 0.007 12 3.416 0 0.1 "
"3.127 2.891 1.925\n"
"Er6+3 1.673 90 3.391 0.007 12 3.3 0 0.1 "
"3.1865 2.9145 1.915\n"
"Tm6+3 1.66 90 3.374 0.006 12 3.3 0 0.1 "
"3.2514 2.9329 2\n"
"Yb6+3 1.637 90 3.355 0.228 12 2.618 0 0.1 "
"3.2889 2.965 2.158\n"
"Lu6+3 1.671 90 3.64 0.041 12 3.271 0 0.1 "
"2.9629 2.4629 1.896\n"
"Hf3+4 1.611 109.47 3.141 0.072 12 3.921 0 0.1 "
"3.7 3.4 1.759\n"
"Ta3+5 1.511 109.47 3.17 0.081 12 4.075 0 0.1 "
"5.1 2.85 1.605\n"
"W_6+6 1.392 90 3.069 0.067 12 3.7 0 0.1 "
"4.63 3.31 1.538\n"
"W_3+4 1.526 109.47 3.069 0.067 12 3.7 0 0.1 "
"4.63 3.31 1.538\n"
"W_3+6 1.38 109.47 3.069 0.067 12 3.7 0 0.1 "
"4.63 3.31 1.538\n"
"Re6+5 1.372 90 2.954 0.066 12 3.7 0 0.1 "
"3.96 3.92 1.6\n"
"Re3+7 1.314 109.47 2.954 0.066 12 3.7 0 0.1 "
"3.96 3.92 1.6\n"
"Os6+6 1.372 90 3.12 0.037 12 3.7 0 0.1 "
"5.14 3.63 1.7\n"
"Ir6+3 1.371 90 2.84 0.073 12 3.731 0 0.1 "
"5 4 1.866\n"
"Pt4+2 1.364 90 2.754 0.08 12 3.382 0 0.1 "
"4.79 4.43 1.557\n"
"Au4+3 1.262 90 3.293 0.039 12 2.625 0 0.1 "
"4.894 2.586 1.618\n"
"Hg1+2 1.34 180 2.705 0.385 12 1.75 0 0.1 "
"6.27 4.16 1.6\n"
"Tl3+3 1.518 120 4.347 0.68 11 2.068 0 0.1 "
"3.2 2.9 1.53\n"
"Pb3 1.459 109.47 4.297 0.663 12 2.846 0.1 0.1 "
"3.9 3.53 1.444\n"
"Bi3+3 1.512 90 4.37 0.518 13 2.47 1 0.1 "
"4.69 3.74 1.514\n"
"Po3+2 1.5 90 4.709 0.325 14 2.33 0.3 0.1 "
"4.21 4.21 1.48\n"
"At 1.545 180 4.75 0.284 15 2.24 0 0.1 "
"4.75 4.75 1.47\n"
"Rn4+4 1.42 90 4.765 0.248 16 0.583 0 0.1 "
"5.37 5.37 2.2\n"
"Fr 2.88 180 4.9 0.05 12 1.847 0 0 "
"2 2 2.3\n"
"Ra6+2 2.512 90 3.677 0.404 12 2.92 0 0 "
"2.843 2.434 2.2\n"
"Ac6+3 1.983 90 3.478 0.033 12 3.9 0 0 "
"2.835 2.835 2.108\n"
"Th6+4 1.721 90 3.396 0.026 12 4.202 0 0 "
"3.175 2.905 2.018\n"
"Pa6+4 1.711 90 3.424 0.022 12 3.9 0 0 "
"2.985 2.905 1.8\n"
"U_6+4 1.684 90 3.395 0.022 12 3.9 0 0 "
"3.341 2.853 1.713\n"
"Np6+4 1.666 90 3.424 0.019 12 3.9 0 0 "
"3.549 2.717 1.8\n"
"Pu6+4 1.657 90 3.424 0.016 12 3.9 0 0 "
"3.243 2.819 1.84\n"
"Am6+4 1.66 90 3.381 0.014 12 3.9 0 0 "
"2.9895 3.0035 1.942\n"
"Cm6+3 1.801 90 3.326 0.013 12 3.9 0 0 "
"2.8315 3.1895 1.9\n"
"Bk6+3 1.761 90 3.339 0.013 12 3.9 0 0 "
"3.1935 3.0355 1.9\n"
"Cf6+3 1.75 90 3.313 0.013 12 3.9 0 0 "
"3.197 3.101 1.9\n"
"Es6+3 1.724 90 3.299 0.012 12 3.9 0 0 "
"3.333 3.089 1.9\n"
"Fm6+3 1.712 90 3.286 0.012 12 3.9 0 0 "
"3.4 3.1 1.9\n"
"Md6+3 1.689 90 3.274 0.011 12 3.9 0 0 "
"3.47 3.11 1.9\n"
"No6+3 1.679 90 3.248 0.011 12 3.9 0 0 "
"3.475 3.175 1.9\n"
"Lw6+3 1.698 90 3.236 0.011 12 3.9 0 0 "
"3.5 3.2 1.9\n";
} // end of namespace UFF
} // end of namespace ForceFields