2014-11-12 14:30:26 +01:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
import sqlite3
|
|
|
|
import re
|
2014-11-12 18:12:07 +01:00
|
|
|
import sys
|
|
|
|
import os
|
2014-11-19 11:47:55 +01:00
|
|
|
import time
|
2014-11-12 18:12:07 +01:00
|
|
|
|
2015-01-09 15:44:03 +01:00
|
|
|
debug = True
|
|
|
|
|
|
|
|
elt_path = os.path.dirname(sys.argv[0]) + "/src/elts_abrev.dat"
|
|
|
|
|
|
|
|
with open(elt_path, "r") as f:
|
|
|
|
data = f.readlines()
|
|
|
|
|
|
|
|
dict_ele = dict()
|
|
|
|
for i in data:
|
|
|
|
l = i.split("-")
|
|
|
|
dict_ele[l[1].strip().lower()] = l[2].strip().lower()
|
2014-11-12 14:30:26 +01:00
|
|
|
|
|
|
|
|
2015-01-12 14:22:13 +01:00
|
|
|
def install_with_pip(name):
|
|
|
|
|
|
|
|
ins = False
|
|
|
|
d = {'y': True,
|
|
|
|
'n': False}
|
|
|
|
|
|
|
|
while True:
|
|
|
|
choice = raw_input('Do you want to install it ? [Y/N]')
|
|
|
|
try:
|
|
|
|
ins = d[choice.lower()]
|
|
|
|
break
|
|
|
|
except:
|
|
|
|
print "not a valid choice"
|
|
|
|
|
|
|
|
if ins:
|
|
|
|
try:
|
|
|
|
import pip
|
|
|
|
pip.main(['install', name])
|
|
|
|
except:
|
|
|
|
print "You need pip, (http://pip.readthedocs.org/en/latest/installing.html)"
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
|
2015-01-08 16:12:15 +01:00
|
|
|
def cond_sql_or(table_name, l_value):
|
|
|
|
|
|
|
|
l = []
|
|
|
|
dmy = " OR ".join(['%s = "%s"' % (table_name, i) for i in l_value])
|
|
|
|
if dmy:
|
|
|
|
l.append("(%s)" % dmy)
|
|
|
|
|
|
|
|
return l
|
|
|
|
|
|
|
|
|
2014-11-12 14:30:26 +01:00
|
|
|
class EMSL_dump:
|
|
|
|
|
|
|
|
def __init__(self, db_path=None, format="GAMESS-US", contraction="True"):
|
|
|
|
self.db_path = db_path
|
|
|
|
self.format = format
|
2014-11-12 15:35:31 +01:00
|
|
|
self.contraction = str(contraction)
|
2014-11-12 14:30:26 +01:00
|
|
|
|
2015-01-12 14:22:13 +01:00
|
|
|
try:
|
|
|
|
import requests
|
|
|
|
except:
|
|
|
|
print "You need the requests package"
|
|
|
|
install_with_pip("requests")
|
|
|
|
finally:
|
|
|
|
self.requests = requests
|
2014-11-12 14:30:26 +01:00
|
|
|
|
|
|
|
def set_db_path(self, path):
|
|
|
|
"""Define the database path"""
|
|
|
|
self.db_path = path
|
|
|
|
|
|
|
|
def dwl_basis_list_raw(self):
|
2014-11-19 11:47:55 +01:00
|
|
|
print "Download all the name available in EMSL. It can take some time.",
|
2014-11-12 14:30:26 +01:00
|
|
|
sys.stdout.flush()
|
|
|
|
|
|
|
|
"""Download the source code of the iframe who contains the list of the basis set available"""
|
|
|
|
|
|
|
|
url = "https://bse.pnl.gov/bse/portal/user/anon/js_peid/11535052407933/panel/Main/template/content"
|
2014-11-12 16:29:11 +01:00
|
|
|
if debug:
|
2014-11-12 18:12:07 +01:00
|
|
|
import cPickle as pickle
|
|
|
|
dbcache = 'db/cache'
|
|
|
|
if not os.path.isfile(dbcache):
|
|
|
|
page = self.requests.get(url).text
|
|
|
|
file = open(dbcache, 'w')
|
|
|
|
pickle.dump(page, file)
|
|
|
|
else:
|
|
|
|
file = open(dbcache, 'r')
|
|
|
|
page = pickle.load(file)
|
|
|
|
file.close()
|
2014-11-12 16:29:11 +01:00
|
|
|
|
|
|
|
else:
|
2014-11-12 18:12:07 +01:00
|
|
|
page = self.requests.get(url).text
|
2014-11-12 14:30:26 +01:00
|
|
|
|
|
|
|
print "Done"
|
|
|
|
return page
|
|
|
|
|
|
|
|
def bl_raw_to_array(self, data_raw):
|
|
|
|
"""Parse the raw html to create a basis set array whith all the info:
|
|
|
|
url, name,description"""
|
|
|
|
|
2014-11-19 11:47:55 +01:00
|
|
|
d = {}
|
2014-11-12 14:30:26 +01:00
|
|
|
|
|
|
|
for line in data_raw.split('\n'):
|
|
|
|
if "new basisSet(" in line:
|
|
|
|
b = line.find("(")
|
|
|
|
e = line.find(");")
|
|
|
|
|
|
|
|
s = line[b + 1:e]
|
|
|
|
|
|
|
|
tup = eval(s)
|
|
|
|
url = tup[0]
|
|
|
|
name = tup[1]
|
|
|
|
|
|
|
|
junkers = re.compile('[[" \]]')
|
|
|
|
elts = junkers.sub('', tup[3]).split(',')
|
|
|
|
|
|
|
|
des = tup[-1]
|
|
|
|
|
|
|
|
if "-ecp" in url.lower():
|
|
|
|
continue
|
2014-11-19 11:47:55 +01:00
|
|
|
d[name] = [name, url, des, elts]
|
|
|
|
|
|
|
|
"""Tric for the unicity of the name"""
|
|
|
|
array = [d[key] for key in d]
|
2014-11-12 14:30:26 +01:00
|
|
|
|
2014-11-19 11:47:55 +01:00
|
|
|
array_sort = sorted(array, key=lambda x: x[0])
|
|
|
|
print len(array_sort), "basisset will be download"
|
2014-11-12 14:30:26 +01:00
|
|
|
|
2014-11-19 11:47:55 +01:00
|
|
|
return array_sort
|
2014-11-12 14:30:26 +01:00
|
|
|
|
|
|
|
def create_url(self, url, name, elts):
|
|
|
|
"""Create the adequate url to get the basis data"""
|
|
|
|
|
|
|
|
elts_string = " ".join(elts)
|
|
|
|
|
|
|
|
path = "https://bse.pnl.gov:443/bse/portal/user/anon/js_peid/11535052407933/action/portlets.BasisSetAction/template/courier_content/panel/Main/"
|
|
|
|
path += "/eventSubmit_doDownload/true"
|
|
|
|
path += "?bsurl=" + url
|
|
|
|
path += "&bsname=" + name
|
|
|
|
path += "&elts=" + elts_string
|
|
|
|
path += "&format=" + self.format
|
|
|
|
path += "&minimize=" + self.contraction
|
|
|
|
return path
|
|
|
|
|
|
|
|
def basis_data_row_to_array(self, data, name, des, elts):
|
|
|
|
"""Parse the basis data raw html to get a nice tuple"""
|
|
|
|
|
|
|
|
d = []
|
|
|
|
|
|
|
|
b = data.find("$DATA")
|
|
|
|
e = data.find("$END")
|
|
|
|
if (b == -1 or data.find("$DATA$END") != -1):
|
2014-11-19 11:47:55 +01:00
|
|
|
if debug:
|
|
|
|
print data
|
2015-01-08 16:12:15 +01:00
|
|
|
raise Exception("WARNING not DATA")
|
2014-11-12 14:30:26 +01:00
|
|
|
else:
|
2015-01-09 15:44:03 +01:00
|
|
|
data = data.replace("PHOSPHOROUS", "PHOSPHORUS")
|
2015-01-09 16:32:40 +01:00
|
|
|
data = data.replace("D+", "E+")
|
|
|
|
data = data.replace("D-", "E-")
|
|
|
|
|
2015-01-12 14:22:13 +01:00
|
|
|
data = data[b + 5:e - 1].split('\n\n')
|
2015-01-09 15:44:03 +01:00
|
|
|
|
2014-11-12 14:30:26 +01:00
|
|
|
for (elt, data_elt) in zip(elts, data):
|
|
|
|
|
2015-01-09 15:44:03 +01:00
|
|
|
elt_long_th = dict_ele[elt.lower()]
|
|
|
|
elt_long_exp = data_elt.split()[0].lower()
|
|
|
|
|
2015-01-09 16:32:40 +01:00
|
|
|
if "$" in data_elt:
|
|
|
|
print "Eror",
|
|
|
|
raise Exception("WARNING not bad split")
|
|
|
|
|
2015-01-09 15:44:03 +01:00
|
|
|
if elt_long_th == elt_long_exp:
|
|
|
|
d.append((name, des, elt, data_elt.strip()))
|
|
|
|
else:
|
|
|
|
print "th", elt_long_th
|
|
|
|
print "exp", elt_long_exp
|
|
|
|
print "abv", elt
|
|
|
|
raise Exception("WARNING not good ELEMENT")
|
2014-11-12 14:30:26 +01:00
|
|
|
|
|
|
|
return d
|
|
|
|
|
|
|
|
def create_sql(self, list_basis_array):
|
|
|
|
"""Create the sql from the list of basis available data"""
|
|
|
|
|
|
|
|
conn = sqlite3.connect(self.db_path)
|
|
|
|
c = conn.cursor()
|
|
|
|
|
|
|
|
# Create table
|
|
|
|
c.execute('''CREATE TABLE all_value
|
|
|
|
(name text, description text, elt text, data text)''')
|
|
|
|
|
2014-11-12 16:29:11 +01:00
|
|
|
import Queue
|
|
|
|
import threading
|
2014-11-12 14:30:26 +01:00
|
|
|
|
2014-11-12 18:12:07 +01:00
|
|
|
num_worker_threads = 7
|
2015-01-09 15:44:03 +01:00
|
|
|
attemps_max = 20
|
2014-11-19 11:47:55 +01:00
|
|
|
|
2014-11-12 18:12:07 +01:00
|
|
|
q_in = Queue.Queue(num_worker_threads)
|
2014-11-12 16:29:11 +01:00
|
|
|
q_out = Queue.Queue(num_worker_threads)
|
2014-11-12 14:30:26 +01:00
|
|
|
|
2014-11-12 16:29:11 +01:00
|
|
|
def worker():
|
2014-11-19 11:47:55 +01:00
|
|
|
"""get a Job from the q_in, do stuff, when finish put it in the q_out"""
|
2014-11-12 18:12:07 +01:00
|
|
|
while True:
|
|
|
|
[name, url, des, elts] = q_in.get()
|
|
|
|
url = self.create_url(url, name, elts)
|
2014-11-19 11:47:55 +01:00
|
|
|
|
2015-01-09 15:44:03 +01:00
|
|
|
attemps = 0
|
|
|
|
while attemps < attemps_max:
|
2014-11-19 11:47:55 +01:00
|
|
|
text = self.requests.get(url).text
|
|
|
|
try:
|
|
|
|
basis_data = self.basis_data_row_to_array(
|
|
|
|
text, name, des, elts)
|
|
|
|
break
|
|
|
|
except:
|
|
|
|
time.sleep(0.1)
|
2015-01-09 15:44:03 +01:00
|
|
|
attemps += 1
|
|
|
|
|
|
|
|
try:
|
|
|
|
q_out.put(([name, url, des, elts], basis_data))
|
|
|
|
q_in.task_done()
|
|
|
|
except:
|
2015-01-12 14:22:13 +01:00
|
|
|
print name, url, des
|
2015-01-09 15:44:03 +01:00
|
|
|
raise
|
2014-11-12 16:29:11 +01:00
|
|
|
|
|
|
|
def enqueue():
|
2014-11-12 18:12:07 +01:00
|
|
|
for [name, url, des, elts] in list_basis_array:
|
|
|
|
q_in.put(([name, url, des, elts]))
|
2014-11-19 11:47:55 +01:00
|
|
|
|
2014-11-12 18:12:07 +01:00
|
|
|
return 0
|
2014-11-12 14:30:26 +01:00
|
|
|
|
2014-11-12 16:29:11 +01:00
|
|
|
t = threading.Thread(target=enqueue)
|
|
|
|
t.daemon = True
|
|
|
|
t.start()
|
|
|
|
|
|
|
|
for i in range(num_worker_threads):
|
|
|
|
t = threading.Thread(target=worker)
|
|
|
|
t.daemon = True
|
|
|
|
t.start()
|
|
|
|
|
2014-11-19 11:47:55 +01:00
|
|
|
nb_basis = len(list_basis_array)
|
|
|
|
|
|
|
|
for i in range(nb_basis):
|
|
|
|
[name, url, des, elts], basis_data = q_out.get()
|
|
|
|
|
2014-11-12 14:30:26 +01:00
|
|
|
try:
|
|
|
|
c.executemany(
|
|
|
|
"INSERT INTO all_value VALUES (?,?,?,?)", basis_data)
|
|
|
|
conn.commit()
|
2014-11-19 11:47:55 +01:00
|
|
|
|
|
|
|
print '{:>3}'.format(i + 1), "/", nb_basis, name
|
2014-11-12 14:30:26 +01:00
|
|
|
except:
|
2014-11-19 11:47:55 +01:00
|
|
|
print '{:>3}'.format(i + 1), "/", nb_basis, name, "fail",
|
|
|
|
print ' ', [url, des, elts]
|
|
|
|
raise
|
2014-11-12 14:30:26 +01:00
|
|
|
conn.close()
|
2014-11-19 11:47:55 +01:00
|
|
|
|
2014-11-12 16:29:11 +01:00
|
|
|
q_in.join()
|
2014-11-12 14:30:26 +01:00
|
|
|
|
|
|
|
def new_db(self):
|
|
|
|
"""Create new_db from scratch"""
|
|
|
|
|
|
|
|
_data = self.dwl_basis_list_raw()
|
|
|
|
array_basis = self.bl_raw_to_array(_data)
|
|
|
|
del _data
|
|
|
|
|
|
|
|
self.create_sql(array_basis)
|
|
|
|
|
|
|
|
|
|
|
|
class EMSL_local:
|
|
|
|
|
|
|
|
def __init__(self, db_path=None):
|
|
|
|
self.db_path = db_path
|
|
|
|
|
2014-11-20 15:33:26 +01:00
|
|
|
def get_list_basis_available(self, elts=[]):
|
2014-11-12 14:30:26 +01:00
|
|
|
|
|
|
|
conn = sqlite3.connect(self.db_path)
|
|
|
|
c = conn.cursor()
|
|
|
|
|
2014-11-20 15:33:26 +01:00
|
|
|
if not elts:
|
|
|
|
|
2014-11-24 12:22:31 +01:00
|
|
|
c.execute("SELECT DISTINCT name,description from all_value")
|
2014-11-20 15:33:26 +01:00
|
|
|
data = c.fetchall()
|
|
|
|
|
|
|
|
else:
|
2015-01-08 16:12:15 +01:00
|
|
|
cmd = [
|
|
|
|
"SELECT name,description FROM all_value WHERE elt=?"] * len(elts)
|
2014-11-20 15:33:26 +01:00
|
|
|
cmd = " INTERSECT ".join(cmd) + ";"
|
|
|
|
|
|
|
|
c.execute(cmd, elts)
|
|
|
|
data = c.fetchall()
|
2014-11-12 14:30:26 +01:00
|
|
|
|
2014-11-24 12:22:31 +01:00
|
|
|
data = [i[:] for i in data]
|
2014-11-12 14:30:26 +01:00
|
|
|
|
|
|
|
conn.close()
|
2015-01-09 13:17:37 +01:00
|
|
|
|
2014-11-12 14:30:26 +01:00
|
|
|
return data
|
|
|
|
|
|
|
|
def get_list_element_available(self, basis_name):
|
|
|
|
|
|
|
|
conn = sqlite3.connect(self.db_path)
|
|
|
|
c = conn.cursor()
|
|
|
|
|
2015-01-08 16:12:15 +01:00
|
|
|
c.execute(
|
|
|
|
"SELECT DISTINCT elt from all_value WHERE name=:name_us COLLATE NOCASE", {
|
|
|
|
"name_us": basis_name})
|
2014-11-12 14:30:26 +01:00
|
|
|
|
|
|
|
data = c.fetchall()
|
|
|
|
|
|
|
|
data = [str(i[0]) for i in data]
|
|
|
|
|
|
|
|
conn.close()
|
|
|
|
return data
|
|
|
|
|
2015-01-09 13:17:37 +01:00
|
|
|
def get_basis(self, basis_name, elts=None, with_l=False):
|
|
|
|
|
|
|
|
def get_list_type(l_line):
|
|
|
|
l = []
|
|
|
|
for i, line in enumerate(l_line):
|
|
|
|
|
|
|
|
m = re.search(p, line)
|
|
|
|
if m:
|
|
|
|
l.append([m.group(1), i])
|
|
|
|
try:
|
|
|
|
l[-2].append(i)
|
|
|
|
except IndexError:
|
|
|
|
pass
|
|
|
|
|
|
|
|
l[-1].append(i + 1)
|
|
|
|
return l
|
|
|
|
|
|
|
|
import re
|
2014-11-12 14:30:26 +01:00
|
|
|
|
2015-01-09 13:17:37 +01:00
|
|
|
# __ _
|
|
|
|
# /__ _ _|_ _|_ ._ _ ._ _ _ _. |
|
|
|
|
# \_| (/_ |_ | | (_) | | | _> (_| |
|
|
|
|
# |
|
2014-11-12 14:30:26 +01:00
|
|
|
conn = sqlite3.connect(self.db_path)
|
|
|
|
c = conn.cursor()
|
|
|
|
|
2015-01-08 16:12:15 +01:00
|
|
|
if elts:
|
|
|
|
cmd_ele = "AND " + " ".join(cond_sql_or("elt", elts))
|
|
|
|
else:
|
|
|
|
cmd_ele = ""
|
|
|
|
|
|
|
|
c.execute('''SELECT DISTINCT data from all_value
|
|
|
|
WHERE name="{basis_name}" COLLATE NOCASE
|
|
|
|
{cmd_ele}'''.format(basis_name=basis_name,
|
|
|
|
cmd_ele=cmd_ele))
|
2014-11-12 14:30:26 +01:00
|
|
|
|
2015-01-09 13:17:37 +01:00
|
|
|
l_data_raw = c.fetchall()
|
2014-11-12 14:30:26 +01:00
|
|
|
conn.close()
|
2015-01-09 13:17:37 +01:00
|
|
|
|
|
|
|
# |_| _. ._ _| | _ || | ||
|
|
|
|
# | | (_| | | (_| | (/_ |_
|
|
|
|
#
|
|
|
|
|
|
|
|
p = re.compile(ur'^(\w)\s+\d+\b')
|
|
|
|
|
|
|
|
l_data = []
|
|
|
|
|
|
|
|
for data_raw in l_data_raw:
|
|
|
|
|
|
|
|
basis = data_raw[0].strip()
|
|
|
|
|
|
|
|
l_line_raw = basis.split("\n")
|
|
|
|
|
|
|
|
l_line = [l_line_raw[0]]
|
|
|
|
|
2015-01-09 14:26:54 +01:00
|
|
|
for symmetry, begin, end in get_list_type(l_line_raw):
|
2015-01-09 13:17:37 +01:00
|
|
|
|
2015-01-09 14:26:54 +01:00
|
|
|
if not(with_l) and symmetry in "L":
|
2015-01-09 14:01:27 +01:00
|
|
|
|
2015-01-09 14:26:54 +01:00
|
|
|
body_s = []
|
|
|
|
body_p = []
|
2015-01-09 14:01:27 +01:00
|
|
|
|
|
|
|
for i_l in l_line_raw[begin + 1:end]:
|
2015-01-09 14:26:54 +01:00
|
|
|
|
2015-01-09 14:01:27 +01:00
|
|
|
a = i_l.split()
|
|
|
|
|
|
|
|
common = "{:>3}".format(a[0])
|
|
|
|
common += "{:>15.7f}".format(float(a[1]))
|
|
|
|
|
|
|
|
tail_s = common + "{:>23.7f}".format(float(a[2]))
|
|
|
|
body_s.append(tail_s)
|
|
|
|
|
|
|
|
tail_p = common + "{:>23.7f}".format(float(a[3]))
|
|
|
|
body_p.append(tail_p)
|
2015-01-09 13:17:37 +01:00
|
|
|
|
|
|
|
l_line += [l_line_raw[begin].replace("L", "S")]
|
2015-01-09 14:01:27 +01:00
|
|
|
l_line += body_s
|
2015-01-09 13:17:37 +01:00
|
|
|
|
|
|
|
l_line += [l_line_raw[begin].replace("L", "P")]
|
2015-01-09 14:01:27 +01:00
|
|
|
l_line += body_p
|
2015-01-09 13:17:37 +01:00
|
|
|
else:
|
|
|
|
l_line += l_line_raw[begin:end]
|
|
|
|
|
|
|
|
l_data.append("\n".join(l_line))
|
|
|
|
|
|
|
|
return l_data
|
|
|
|
|
2014-11-12 14:30:26 +01:00
|
|
|
|
2014-11-12 15:35:31 +01:00
|
|
|
format_dict = \
|
2014-11-12 18:12:07 +01:00
|
|
|
{
|
|
|
|
"g94": "Gaussian94",
|
|
|
|
"gamess-us": "GAMESS-US",
|
|
|
|
"gamess-uk": "GAMESS-UK",
|
|
|
|
"turbomole": "Turbomole",
|
|
|
|
"tx93": "TX93",
|
|
|
|
"molpro": "Molpro",
|
|
|
|
"molproint": "MolproInt",
|
|
|
|
"hondo": "Hondo",
|
|
|
|
"supermolecule": "SuperMolecule",
|
|
|
|
"molcas": "Molcas",
|
|
|
|
"hyperchem": "HyperChem",
|
|
|
|
"dalton": "Dalton",
|
|
|
|
"demon-ks": "deMon-KS",
|
|
|
|
"demon2k": "deMon2k",
|
|
|
|
"aces2": "AcesII",
|
|
|
|
}
|
2014-11-12 15:35:31 +01:00
|
|
|
|
2014-11-12 14:30:26 +01:00
|
|
|
if __name__ == "__main__":
|
|
|
|
|
|
|
|
e = EMSL_local(db_path="EMSL.db")
|
|
|
|
l = e.get_list_basis_available()
|
|
|
|
for i in l:
|
|
|
|
print i
|
|
|
|
|
|
|
|
l = e.get_list_element_available("pc-0")
|
|
|
|
print l
|
|
|
|
|
|
|
|
l = e.get_basis("cc-pVTZ", ["H", "He"])
|
|
|
|
for i in l:
|
|
|
|
print i
|