From 9cc0613c962cb9af5d0399baf746b04cb8f565a9 Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Fri, 12 Mar 2021 13:16:53 -0600 Subject: [PATCH 01/27] Allow tinkerio to read TINKERPATH variable from environment --- src/tinkerio.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/tinkerio.py b/src/tinkerio.py index b9f1ab976..fc42600ee 100644 --- a/src/tinkerio.py +++ b/src/tinkerio.py @@ -314,6 +314,10 @@ def __init__(self, name="tinker", **kwargs): self.warn_vn = False super(TINKER,self).__init__(name=name, **kwargs) + def CheckEnvironmentTinker(self): + tinkerpath = os.getenv("TINKERPATH", default="") + return tinkerpath + def setopts(self, **kwargs): """ Called by __init__ ; Set TINKER-specific options. """ @@ -350,7 +354,12 @@ def calltinker(self, command, stdin=None, print_to_screen=False, print_command=F # Sometimes the engine changes dirs and the key goes missing, so we link it. if "%s.key" % self.name in csplit and not os.path.exists("%s.key" % self.name): LinkFile(self.abskey, "%s.key" % self.name) - prog = os.path.join(self.tinkerpath, csplit[0]) + tinkpath=self.CheckEnvironmentTinker() + if tinkpath!='' and tinkpath!=None: + tinkerpath=tinkpath + else: + tinkerpath=self.tinkerpath + prog = os.path.join(tinkerpath, csplit[0]) csplit[0] = prog o = _exec(' '.join(csplit), stdin=stdin, print_to_screen=print_to_screen, print_command=print_command, rbytes=1024, **kwargs) # Determine the TINKER version number. @@ -360,10 +369,10 @@ def calltinker(self, command, stdin=None, print_to_screen=False, print_command=F if len(vw.split('.')) <= 2: vn = float(vw) else: - ls = vw.split('.') - last = ls[1:] - first = ls[0] - vn = first+'.'+''.join(last) + ls=vw.split('.') + last=ls[1:] + first=ls[0] + vn=first+'.'+''.join(last) vn = float(vn) vn_need = 6.3 try: From 9739cdd982ba9719b701cfaa4914aaf81cfbe315 Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Mon, 15 Mar 2021 13:28:14 -0500 Subject: [PATCH 02/27] 1) If OPENMM_CUDA_COMPILER is detected in environment (needed for tinker openmm on GPU), and gas is not in keyfile name, then switch dynamic to dynamicomm (gpu dynamic program). 2) If OPENMM_CUDA_COMPILER is detected in environment, for NPT dynamics, then add N to dynamic command string (program asks for output info from GPU). 3) MUTAL and THOLE keywords are added to lines that include Polarization in them (latest analyze version), so these are excluded from parsing Polarization energy. 4) Temperature is not printed out in latest version (or gpu version), but since it is constant in NPT/NVT, just append the constant temperature instead of parsing. 5) Switch priority of original commit, if tinkerpath keyword is specified, this supersedes any TINKERPATH detected in environment. --- src/tinkerio.py | 51 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/src/tinkerio.py b/src/tinkerio.py index fc42600ee..a7fbaa83f 100644 --- a/src/tinkerio.py +++ b/src/tinkerio.py @@ -325,7 +325,7 @@ def setopts(self, **kwargs): ## The directory containing TINKER executables (e.g. dynamic) if 'tinkerpath' in kwargs: self.tinkerpath = kwargs['tinkerpath'] - if not os.path.exists(os.path.join(self.tinkerpath,"dynamic")): + if not os.path.exists(os.path.join(self.tinkerpath,"dynamic")) and 'dynamic' not in os.environ.keys(): warn_press_key("The 'dynamic' executable indicated by %s doesn't exist! (Check tinkerpath)" \ % os.path.join(self.tinkerpath,"dynamic")) else: @@ -919,13 +919,13 @@ def molecular_dynamics(self, nsteps, timestep, temperature=None, pressure=None, if temperature is not None: md_defs["integrator"] = "stochastic" else: - md_defs["integrator"] = "beeman" + md_defs["integrator"] = "respa" md_opts["thermostat"] = None # Periodic boundary conditions. if self.pbc: md_opts["vdw-correction"] = '' if temperature is not None and pressure is not None: - md_defs["integrator"] = "beeman" + md_defs["integrator"] = "respa" md_defs["thermostat"] = "bussi" md_defs["barostat"] = "montecarlo" if anisotropic: @@ -942,7 +942,7 @@ def molecular_dynamics(self, nsteps, timestep, temperature=None, pressure=None, eq_opts = deepcopy(md_opts) if self.pbc and temperature is not None and pressure is not None: - eq_opts["integrator"] = "beeman" + eq_opts["integrator"] = "respa" eq_opts["thermostat"] = "bussi" eq_opts["barostat"] = "berendsen" @@ -956,22 +956,37 @@ def molecular_dynamics(self, nsteps, timestep, temperature=None, pressure=None, if nequil > 0: write_key("%s-eq.key" % self.name, eq_opts, "%s.key" % self.name, md_defs) if verbose: printcool("Running equilibration dynamics", color=0) + if 'OPENMM_CUDA_COMPILER' in os.environ.keys() and 'gas' not in self.name: + dynamickeyword='dynamic_omm' + else: + dynamickeyword='dynamic' if self.pbc and pressure is not None: - self.calltinker("dynamic %s -k %s-eq %i %f %f 4 %f %f" % (self.name, self.name, nequil, timestep, float(nsave*timestep)/1000, - temperature, pressure), print_to_screen=verbose) + if 'OPENMM_CUDA_COMPILER' in os.environ.keys(): + self.calltinker(dynamickeyword+" %s -k %s-eq %i %f %f 4 %f %f N" % (self.name, self.name, nequil, timestep, float(nsave*timestep)/1000,temperature, pressure), print_to_screen=verbose) + + + else: + self.calltinker(dynamickeyword+" %s -k %s-eq %i %f %f 4 %f %f" % (self.name, self.name, nequil, timestep, float(nsave*timestep)/1000,temperature, pressure), print_to_screen=verbose) else: - self.calltinker("dynamic %s -k %s-eq %i %f %f 2 %f" % (self.name, self.name, nequil, timestep, float(nsave*timestep)/1000, - temperature), print_to_screen=verbose) + self.calltinker(dynamickeyword+" %s -k %s-eq %i %f %f 2 %f" % (self.name, self.name, nequil, timestep, float(nsave*timestep)/1000,temperature), print_to_screen=verbose) os.system("rm -f %s.arc" % (self.name)) # Run production. if verbose: printcool("Running production dynamics", color=0) write_key("%s-md.key" % self.name, md_opts, "%s.key" % self.name, md_defs) + if 'OPENMM_CUDA_COMPILER' in os.environ.keys() and 'gas' not in self.name: + dynamickeyword='dynamic_omm' + else: + dynamickeyword='dynamic' + if self.pbc and pressure is not None: - odyn = self.calltinker("dynamic %s -k %s-md %i %f %f 4 %f %f" % (self.name, self.name, nsteps, timestep, float(nsave*timestep/1000), - temperature, pressure), print_to_screen=verbose) + if 'OPENMM_CUDA_COMPILER' in os.environ.keys(): + odyn = self.calltinker(dynamickeyword+" %s -k %s-md %i %f %f 4 %f %f N" % (self.name, self.name, nsteps, timestep, float(nsave*timestep/1000),temperature, pressure), print_to_screen=verbose) + + else: + odyn = self.calltinker(dynamickeyword+" %s -k %s-md %i %f %f 4 %f %f" % (self.name, self.name, nsteps, timestep, float(nsave*timestep/1000),temperature, pressure), print_to_screen=verbose) else: - odyn = self.calltinker("dynamic %s -k %s-md %i %f %f 2 %f" % (self.name, self.name, nsteps, timestep, float(nsave*timestep/1000), + odyn = self.calltinker(dynamickeyword+" %s -k %s-md %i %f %f 2 %f" % (self.name, self.name, nsteps, timestep, float(nsave*timestep/1000), temperature), print_to_screen=verbose) # Gather information. @@ -986,8 +1001,7 @@ def molecular_dynamics(self, nsteps, timestep, temperature=None, pressure=None, edyn.append(float(s[2])) if 'Current Kinetic' in line: kdyn.append(float(s[2])) - if len(s) > 0 and s[0] == 'Temperature' and s[2] == 'Kelvin': - temps.append(float(s[1])) + temps.append(temperature) # GPU version does not print out Temperature (or just new dynamic doesnt) # Potential and kinetic energies converted to kJ/mol. edyn = np.array(edyn) * 4.184 @@ -1005,6 +1019,10 @@ def molecular_dynamics(self, nsteps, timestep, temperature=None, pressure=None, havekeys = set() first_shot = True for ln, line in enumerate(oanl): + if 'Polarization' in line: + if 'MUTUAL' in line or 'THOLE' in line: + continue + strip = line.strip() s = line.split() if 'Total System Mass' in line: @@ -1016,10 +1034,13 @@ def molecular_dynamics(self, nsteps, timestep, temperature=None, pressure=None, if first_shot: for key in eckeys: if strip.startswith(key): + + + value=float(s[-2])*4.184 if key in ecomp: - ecomp[key].append(float(s[-2])*4.184) + ecomp[key].append(value) else: - ecomp[key] = [float(s[-2])*4.184] + ecomp[key] = [value] if key in havekeys: first_shot = False havekeys.add(key) From 29cb1e59fc5126b32d7608a46701cb77eda868f7 Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Mon, 15 Mar 2021 13:36:37 -0500 Subject: [PATCH 03/27] Forgot #5 on previous commit. Now, if TINKERPATH is in environoment and tinkerpath is defined, the tinkerpath variable will supersedes TINKERPATH. If tinkerpath variable is None and TINKERPATH in environment, then this is used instead. --- src/tinkerio.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tinkerio.py b/src/tinkerio.py index a7fbaa83f..70347dacf 100644 --- a/src/tinkerio.py +++ b/src/tinkerio.py @@ -355,7 +355,7 @@ def calltinker(self, command, stdin=None, print_to_screen=False, print_command=F if "%s.key" % self.name in csplit and not os.path.exists("%s.key" % self.name): LinkFile(self.abskey, "%s.key" % self.name) tinkpath=self.CheckEnvironmentTinker() - if tinkpath!='' and tinkpath!=None: + if self.tinkerpath==None and tinkpath!=None: tinkerpath=tinkpath else: tinkerpath=self.tinkerpath From bfee90950d0d2d027053021408ad47cf8de3ba6e Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Thu, 6 May 2021 14:01:16 -0500 Subject: [PATCH 04/27] 1) Removed redundant lines for checking envioronment for OPENMMHOME for tinker GPU dynamics 2) Need to overide masterhost TINKERPATH input with enviorment of node since OS /libraries for installation can be different for worker node and master host. --- src/tinkerio.py | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/src/tinkerio.py b/src/tinkerio.py index 70347dacf..5b6dcc66a 100644 --- a/src/tinkerio.py +++ b/src/tinkerio.py @@ -355,7 +355,7 @@ def calltinker(self, command, stdin=None, print_to_screen=False, print_command=F if "%s.key" % self.name in csplit and not os.path.exists("%s.key" % self.name): LinkFile(self.abskey, "%s.key" % self.name) tinkpath=self.CheckEnvironmentTinker() - if self.tinkerpath==None and tinkpath!=None: + if tinkpath!=None: # need to override input masterhost tinkerpath, otherwise if worker node has different )S/ libraries then will crash tinkerpath=tinkpath else: tinkerpath=self.tinkerpath @@ -951,22 +951,19 @@ def molecular_dynamics(self, nsteps, timestep, temperature=None, pressure=None, self.optimize(0, method="bfgs", crit=1) os.system("mv %s.xyz_2 %s.xyz" % (self.name, self.name)) if verbose: logger.info("Done\n") + if 'OPENMM_CUDA_COMPILER' in os.environ.keys() and 'gas' not in self.name: + dynamickeyword='dynamic_omm' + suffix=' N' + else: + dynamickeyword='dynamic' + suffix='' # Run equilibration. if nequil > 0: write_key("%s-eq.key" % self.name, eq_opts, "%s.key" % self.name, md_defs) if verbose: printcool("Running equilibration dynamics", color=0) - if 'OPENMM_CUDA_COMPILER' in os.environ.keys() and 'gas' not in self.name: - dynamickeyword='dynamic_omm' - else: - dynamickeyword='dynamic' if self.pbc and pressure is not None: - if 'OPENMM_CUDA_COMPILER' in os.environ.keys(): - self.calltinker(dynamickeyword+" %s -k %s-eq %i %f %f 4 %f %f N" % (self.name, self.name, nequil, timestep, float(nsave*timestep)/1000,temperature, pressure), print_to_screen=verbose) - - - else: - self.calltinker(dynamickeyword+" %s -k %s-eq %i %f %f 4 %f %f" % (self.name, self.name, nequil, timestep, float(nsave*timestep)/1000,temperature, pressure), print_to_screen=verbose) + self.calltinker(dynamickeyword+" %s -k %s-eq %i %f %f 4 %f %f%s" % (self.name, self.name, nequil, timestep, float(nsave*timestep)/1000,temperature, pressure,suffix), print_to_screen=verbose) else: self.calltinker(dynamickeyword+" %s -k %s-eq %i %f %f 2 %f" % (self.name, self.name, nequil, timestep, float(nsave*timestep)/1000,temperature), print_to_screen=verbose) os.system("rm -f %s.arc" % (self.name)) @@ -974,17 +971,9 @@ def molecular_dynamics(self, nsteps, timestep, temperature=None, pressure=None, # Run production. if verbose: printcool("Running production dynamics", color=0) write_key("%s-md.key" % self.name, md_opts, "%s.key" % self.name, md_defs) - if 'OPENMM_CUDA_COMPILER' in os.environ.keys() and 'gas' not in self.name: - dynamickeyword='dynamic_omm' - else: - dynamickeyword='dynamic' if self.pbc and pressure is not None: - if 'OPENMM_CUDA_COMPILER' in os.environ.keys(): - odyn = self.calltinker(dynamickeyword+" %s -k %s-md %i %f %f 4 %f %f N" % (self.name, self.name, nsteps, timestep, float(nsave*timestep/1000),temperature, pressure), print_to_screen=verbose) - - else: - odyn = self.calltinker(dynamickeyword+" %s -k %s-md %i %f %f 4 %f %f" % (self.name, self.name, nsteps, timestep, float(nsave*timestep/1000),temperature, pressure), print_to_screen=verbose) + odyn = self.calltinker(dynamickeyword+" %s -k %s-md %i %f %f 4 %f %f%s" % (self.name, self.name, nsteps, timestep, float(nsave*timestep/1000),temperature, pressure,suffix), print_to_screen=verbose) else: odyn = self.calltinker(dynamickeyword+" %s -k %s-md %i %f %f 2 %f" % (self.name, self.name, nsteps, timestep, float(nsave*timestep/1000), temperature), print_to_screen=verbose) From 6467d43e102dc7052d31f3dc591b15b15626f9af Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Wed, 19 May 2021 14:59:53 -0500 Subject: [PATCH 05/27] Remove extra lines (blank lines) in data.csv file before processing, otherwise it will crash. --- src/liquid.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/liquid.py b/src/liquid.py index a56d6649a..adb41ab11 100644 --- a/src/liquid.py +++ b/src/liquid.py @@ -255,6 +255,7 @@ def read_data(self): # Read the 'data.csv' file. The file should contain guidelines. with open(os.path.join(self.tgtdir,'data.csv'),'rU') as f: R0 = list(csv.reader(f)) # All comments are erased. + R0=[i for i in R0 if len(i)>0] # remove lines without any content first, otherwise it crashes R1 = [[sub('#.*$','',word) for word in line] for line in R0 if len(line[0]) > 0 and line[0][0] != "#"] # All empty lines are deleted and words are converted to lowercase. R = [[wrd.lower() for wrd in line] for line in R1 if any([len(wrd) for wrd in line]) > 0] From d733a7d0521f0fdf65f3dd57aa81dce7c293af00 Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Wed, 19 May 2021 15:11:29 -0500 Subject: [PATCH 06/27] Example script for parsing NIST database and generating input for forcebalance data.csv file. --- tools/gentargetcsv.py | 846 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 846 insertions(+) create mode 100644 tools/gentargetcsv.py diff --git a/tools/gentargetcsv.py b/tools/gentargetcsv.py new file mode 100644 index 000000000..f7b7d243c --- /dev/null +++ b/tools/gentargetcsv.py @@ -0,0 +1,846 @@ +import os, numpy as np +import pyilt2 +import sys +import cirpy +import pint +from pint import UnitRegistry +import csv +import getopt +from tqdm import tqdm + + +from bs4 import BeautifulSoup # for parsing NIST +import requests +import re +import pandas as pd +import numpy as np + +''' +conda create --name FBTest --yes +conda activate FBTest +conda install pip --yes +pip install pyilt2 +conda install -c conda-forge cirpy --yes +conda install -c conda-forge pint --yes +conda install -c conda-forge tqdm --yes +conda install -c anaconda beautifulsoup4 --yes +conda install -c anaconda pandas --yes + + +''' + +# https://ilthermo.boulder.nist.gov/ +# Be careful by default tries first name it finds with molecule match, but may not be correct name. Use printnames to find possible names that are found in database. Use truename to only grab data from the correct molecule name (according to the database) + +# python gentargetcsv.py --smiles=C(Cl)(Cl)(Cl)Cl +# python gentargetcsv.py --smiles=C(Cl)(Cl)(Cl)Cl --printnames +# python gentargetcsv.py --smiles=C(Cl)(Cl)(Cl)Cl --truename=Tetrachloromethane +# python gentargetcsv.py --truename=Water + +smiles=None +truename=None +printnames=False +searchILDB=False # search NIST by default + +opts, xargs = getopt.getopt(sys.argv[1:],'',["smiles=","truename=",'printnames','searchILDB']) +for o, a in opts: + if o in ("--smiles"): + smiles=a + elif o in ("--truename"): + truename=a.capitalize() # the database has first letter capitalized + elif o in ("--printnames"): + printnames=True + elif o in ("--searchILDB"): + searchILDB=False + +# originally taken from https://github.com/sabidhasan/NistPy +# modified to take inputs for force balance +class NistCompoundById(object): + '''This class creates a NIST compound using a provided NIST code. + NIST identifying codes consist of a letter followed by several numbers''' + + #A search result is NistResult object. It's instantiated is False. This is for user + #to see whether the object has been instantaited in a friendly manner. Really you can + #just do type(object); if it's NistCpdById then it is instantiated; if NistResult, it's not. + INSTANTIATED = True + + @staticmethod + def extract_CAS(cas_string): + '''Extracts a CAS number using RegEx from a given string cas_string''' + reg = re.search(r'\d{2,7}-\d{2}-\d', cas_string) + if reg: + return reg.group(0) + return None + + def __init__(self, id, souped_page=None): + if souped_page==None: + cpd_url = "http://webbook.nist.gov/cgi/cbook.cgi?ID=%s" % id + cpd_soup = download_page(cpd_url) + + if cpd_soup is None: + #download failed + return None + else: + #we are given a souped page already! + cpd_soup = souped_page + + #check for erroneous number + if "Registry Number Not Found" in cpd_soup: + print("" % id) + return None + + #Set compound name + self.name = cpd_soup.find('h1').text + self.id = id + + + + def __str__(self): + return 'Compound %s' % self.name + + def __repr__(self): + return "NistCompoundById('%s')" % self.id + + def _get_fluid_data(self,cid,temp,plow=0,phigh=2,pinc=.01,table=0): + + url='https://webbook.nist.gov/cgi/fluid.cgi?Action=Load&ID='+str(cid)+'&Type=IsoTherm&Digits=5&PLow='+str(plow)+'&PHigh='+str(phigh)+'&PInc='+str(pinc)+'&T='+str(temp)+'&RefState=DEF&TUnit=K&PUnit=atm&DUnit=kg%2Fm3&HUnit=kJ%2Fmol&WUnit=m%2Fs&VisUnit=uPa*s&STUnit=N%2Fm' + prop_soup = download_page(url) + prop_table = prop_soup.find_all("table")[table].find_all('tr') + table=[] + for row in prop_table: + subrow=[] + if len(row.find_all('td')) > 0: + for j in range(14): + subrow.append(row.find_all('td')[j].text) + elif len(row.find_all('th')) > 0: + for j in range(14): + subrow.append(row.find_all('th')[j].text) + table.append(subrow) + + return np.array(table) + + def _get_fluid_Saturation_data(self,cid,tlow=50,thigh=350,tinc=1,table=0): # for surface tension + url='https://webbook.nist.gov/cgi/fluid.cgi?Action=Load&ID='+str(cid)+'&Type=SatP&Digits=5&THigh='+str(thigh)+'&'+str(tlow)+'=50&TInc='+str(tinc)+'&RefState=DEF&TUnit=K&PUnit=atm&DUnit=kg%2Fm3&HUnit=kJ%2Fmol&WUnit=m%2Fs&VisUnit=uPa*s&STUnit=N%2Fm' + prop_soup = download_page(url) + prop_table = prop_soup.find_all("table")[table].find_all('tr') + table=[] + for row in prop_table: + subrow=[] + if len(row.find_all('td')) > 0: + for j in range(14): + subrow.append(row.find_all('td')[j].text) + elif len(row.find_all('th')) > 0: + for j in range(14): + subrow.append(row.find_all('th')[j].text) + table.append(subrow) + + + return np.array(table) + + def _get_PhaseChange_data(self,cid,table=2): + + prop_url = "https://webbook.nist.gov/cgi/cbook.cgi?ID="+str(cid)+"&Mask=4#"+"Thermo-Phase" + prop_soup = download_page(prop_url) + + tables=prop_soup.find_all("table") + + thetab=tables[2] + content=thetab.find_all('td') + hcontent=thetab.find_all('th') + + table=[] + header=[] + for row in hcontent: + header.append(row.text) + foundenthalpy=False + for e in header: + if 'vapH' in e: + foundenthalpy=True + if foundenthalpy==False: + return table + table.append(header) + count=0 + ls=[] + for rowidx in range(len(content)): + row=content[rowidx] + if count==len(header): + count=0 + if count==0: + if len(ls)!=0: + table.append(ls) + ls=[] + value=row.text + count+=1 + if value.strip()=='': + value='N/A' + ls.append(value) + + + return table + + + + +def download_page(url): + '''This function downloads a page given and URL. If fail, it returns a status-code''' + page = requests.get(url) + page_content = page.content + #test for erroneous download + if page.status_code != 200: + print("" % cpd_page.status_code) + return None + + return BeautifulSoup(page_content, 'html.parser') + +class NistResult(object): + '''NistResult class is used to return search results. This class is like a + NistCompoundById but only has id and name. It has the instantiate method + to elaborate and return NistCompoundById objects''' + + INSTANTIATED = False + + def __init__(self, id_num, name, souped_page=None): + self.id = id_num + self.name = name + self.page = souped_page + + def instantiate(self): + #This will instantiate the compound + if self.page is None: + self.page = download_page("http://webbook.nist.gov/cgi/cbook.cgi?ID=%s" % self.id) + + return NistCompoundById(self.id, souped_page=self.page) + + def __str__(self): + return self.id + + def __repr__(self): + return 'NistResult(%s, %s)' % (self.id, self.name) + +def search_nist(options=None, instantiate=False, **kwargs): + '''Search NIST database for string search_str using the search keyword [formula, name, inchi key, CAS number, + structure]. If instantiate is selected, then it returns NistCompoundById object (which has a bunch of data within it) + Otherwise it returns a NistResult object, which only has the name and ID code and must be called with the + .instantiate() method before further use''' + + #Error checking + if len(kwargs) != 1: + print("" % len(kwargs)) + return None + search_type=list(kwargs.keys())[0] + search_str=list(kwargs.values())[0] + + #Check for value of kwarg + types = { + 'formula': "http://webbook.nist.gov/cgi/cbook.cgi?Formula=%s" % search_str, + 'name' : "http://webbook.nist.gov/cgi/cbook.cgi?Name=%s" % search_str, + 'inchi' : "http://webbook.nist.gov/cgi/cbook.cgi?InChI=%s" % search_str, + 'cas' : "http://webbook.nist.gov/cgi/cbook.cgi?ID=%s" % search_str, + } + if not(search_type) in types: + print("" % types.keys()) + return None + + #Download the search page, and check to see whether it's a single compound + search_page = download_page(types[search_type]) + #will be returned to user + search_results = [] + + if "Search Results" in search_page.text: + #Loop through all results. The results are in an ordered list! + + for raw_result in search_page.ol.find_all('li'): + id_code = re.search(r'ID=([A-Za-z]\d{1,})', raw_result.a['href']).group(1) + name = raw_result.a.text + if instantiate == True: + search_results.append(NistResult(id_code, name).instantiate()) + else: + search_results.append(NistResult(id_code, name)) + #there is only one search result! + else: + #Find the ID (basically it's the ID-like text that appears the most on the page!) + links_on_page = [] + #loop through all the links + for link in search_page.find_all('a'): + curr_href = link.attrs.get('href') + #sometimes, there is no hfref (eg. it's an anchor or something), so check for NoneType + if curr_href is not None and re.search(r'ID=([A-Za-z]\d{1,})', curr_href): + #add the current link's ID code + #group(0) is the entire search result, so group(1) is the bracketed thing in the search query + links_on_page.append(re.search(r'ID=([A-Za-z]\d{1,})', curr_href).group(1)) + if len(links_on_page)==0: + raise ValueError('NIST Name search failed') + id_code = max(links_on_page, key=links_on_page.count) + + name = search_page.title.text + + if instantiate == True: + search_results.append(NistResult(id_code, name, souped_page=search_page).instantiate()) + else: + search_results.append(NistResult(id_code, name, souped_page=search_page)) + + return search_results + + + + +def ConvertSmilestoNames(smiles,rep): + results=cirpy.query(smiles, rep) + if len(results)==0: + raise ValueError('SMILES could not be converted to name') + else: + return results[0].value + +def SanitizeUnit(currentunit): + if currentunit!=None: + currentunit=currentunit.replace('m3','m**3') + + return currentunit + + + +def QueryLiquidProperties(names,truename=None,printnames=False): + if truename==None: + foundname=False + else: + foundname=True + thename=truename + foundnames=[] + foundhit=False + ureg = UnitRegistry() + fbabbrtotargetunits={'Eps0':'debye**2/(nm**3 .J)','Eps0_err':'debye**2/(nm**3 .J)','Cp':'kJ/(mol.K)','Cp_err':'kJ/(mol.K)','Kappa':'1/bar','Kappa_err':'1/bar','Alpha':'1/K','Alpha_err':'1/K','Surf_Ten':'mJ/m**2','Surf_Ten_err':'mJ/m**2','T':'K','P':'atm','Rho':'kg/m**3','Rho_err':'kg/m**3','Hvap':'kJ/mol','Hvap_err':'kJ/mol'} + nistnametofbabbr={'Enthalpy_of_vaporization_or_sublimation':'Hvap', 'Delta[Enthalpy_of_vaporization_or_sublimation]':'Hvap_err','Surface_tension_liquid-gas':'Surf_Ten', 'Delta[Surface_tension_liquid-gas]':'Surf_Ten_err','Relative_permittivity_at_zero_frequency':'Eps0', 'Delta[Relative_permittivity_at_zero_frequency]':'Eps0_err','Isothermal_compressibility':'Kappa', 'Delta[Isothermal_compressibility]':'Kappa_err','Isobaric_coefficient_of_volume_expansion':'Alpha', 'Delta[Isobaric_coefficient_of_volume_expansion]':'Alpha_err','Heat_capacity_at_constant_pressure*':'Cp', 'Delta[Heat_capacity_at_constant_pressure*]':'Cp_err','Pressure':'P', 'Temperature':'T','Specific_density':'Rho', 'Delta[Specific_density]':'Rho_err','Specific_density*':'Rho', 'Delta[Specific_density*]':'Rho_err','Heat_capacity_at_constant_pressure':'Cp', 'Delta[Heat_capacity_at_constant_pressure]':'Cp_err'} + desiredprops=['Isothermal compressibility','Heat capacity at constant pressure','Density','Isobaric coefficient of volume expansion','Surface tension liquid-gas','Relative permittivity',"Enthalpy of vaporization or sublimation"] + propertynamearray=list(fbabbrtotargetunits.keys()) + refstoproptoarray={} + for name in names: + if foundname==True and printnames==False: + if name==thename: + pass + else: + continue + + for prop,aprop in tqdm(pyilt2.prop2abr.items(),desc='Property search for '+name): + if prop in desiredprops: + results = pyilt2.query(comp = name,prop=aprop) + + length=len(results.refs) + if length>0: + foundhit=True + if name not in foundnames: + foundnames.append(name) + if printnames==False: + if foundname==False: + foundname=True + thename=name + for hit in results.refs: + hitrefdict=hit.refDict + hitref=hitrefdict['ref'] + if hitref not in refstoproptoarray.keys(): + ls=[None for i in propertynamearray] + dic=dict(zip(propertynamearray,ls)) + refstoproptoarray[hitref]=dic + try: + dataset=hit.get() + except: + print('Error, in accessing database!') + continue + props=dataset.physProps + units=dataset.physUnits + data=dataset.data + fullref=dataset.fullcite + refstoproptoarray[hitref]['cite']=fullref + refstoproptoarray[hitref]['name']=thename + for pidx in range(len(props)): + p=props[pidx] + currentunit=units[pidx] + if p in nistnametofbabbr.keys() and currentunit==None: + break + currentunit=SanitizeUnit(currentunit) + col=data[:,pidx] + if 'fraction' not in p and 'MolaLity' not in p and 'MolaRity' not in p and 'Mole' not in p and 'Molar' not in p: + fbabbr=nistnametofbabbr[p] + targetunit=fbabbrtotargetunits[fbabbr] + if currentunit!=targetunit: + value=str(1) + string=value+' * '+currentunit+' to '+targetunit + src, dst = string.split(' to ') + Q_ = ureg.Quantity + convobj=Q_(src).to(dst) + convfactor=convobj._magnitude + converted=col*convfactor + refstoproptoarray[hitref][fbabbr]=converted + else: + refstoproptoarray[hitref][fbabbr]=col + if printnames==True: + print('possible names',foundnames) + sys.exit() + if foundhit==False: + raise ValueError('no references found for name '+thename) + return refstoproptoarray + +def SortReferences(refstoproptoarray,searchILDB): + sortedrefstoproptoarray={} + refstodates={} + for ref in refstoproptoarray.keys(): + if searchILDB==True: + first='(' + last=')' + start = ref.rindex( first ) + len( first ) + end = ref.rindex( last, start ) + string=ref[start:end] + numstring=[e for e in string if e.isdigit()==True] + numstring=''.join(numstring) + num=int(numstring) + else: + if ',' in ref: + refsplit=ref.split(',') + datestring=refsplit[-1] + datestring=datestring.lstrip().rstrip() + num=int(datestring) + else: + num=0 + refstodates[ref]=num + sortedreftodates=dict(sorted(refstodates.items(), key=lambda item: item[1],reverse=True)) # later dates first + for sortedref,date in sortedreftodates.items(): + proptoarray=refstoproptoarray[sortedref] + sortedrefstoproptoarray[sortedref]=proptoarray + + + return sortedrefstoproptoarray + +def PropertyToReferences(sortedrefstoproptoarray): + proptorefs={} + for sortedref,proptoarray in sortedrefstoproptoarray.items(): + for prop in proptoarray.keys(): + if prop!='cite' and prop!='name' and 'err' not in prop and prop!='T' and prop!='P': + try: + value=proptoarray[prop] + if len(value)>0: + if prop not in proptorefs.keys(): + proptorefs[prop]=[] + if sortedref not in proptorefs[prop]: + proptorefs[prop].append(sortedref) + except: + continue + if len(proptorefs.keys())==0: + raise ValueError('Missing property data!') + return proptorefs + + +def GrabUniqueProps(proptoarray): + uniqueprops=[] + for prop,array in proptoarray.items(): + if prop!='name' and prop!='cite' and 'err' not in prop and prop!='T' and prop!='P': + try: + length=len(array) + if length>0: + uniqueprops.append(prop) + except: + pass + + return tuple(set(uniqueprops)) + +def RoundTPData(sortedrefstoproptoarray,decimalplaces): + for ref,proptoarray in sortedrefstoproptoarray.items(): + tarray=proptoarray['T'] + parray=proptoarray['P'] + try: # might not be an P data + parray=[round(i,decimalplaces) for i in parray] + except: + pass + + first=tarray[0] + if '-' in first: + firstsplit=first.split('-') + firsttemp=firstsplit[0].lstrip().rstrip() + if firsttemp[-1]=='.': + firsttemp=firsttemp[:-1] + secondtemp=firstsplit[1].lstrip().rstrip() + if secondtemp[-1]=='.': + secondtemp=secondtemp[:-1] + firsttemp=int(firsttemp) + secondtemp=int(secondtemp) + tarray=np.arange(firsttemp, secondtemp, 0.01).tolist() + tarray=[float(i) for i in tarray] + tarray=[round(i,decimalplaces) for i in tarray] + sortedrefstoproptoarray[ref]['T']=tarray + sortedrefstoproptoarray[ref]['P']=parray + + + return sortedrefstoproptoarray + +def CountTPFrequency(sortedrefstoproptoarray): + uniquepropstotemppressurecounts={} + for ref,proptoarray in sortedrefstoproptoarray.items(): + tarray=proptoarray['T'] + parray=proptoarray['P'] + setuniqueprops=GrabUniqueProps(proptoarray) + if setuniqueprops not in uniquepropstotemppressurecounts.keys(): + uniquepropstotemppressurecounts[setuniqueprops]={} + for i in range(len(tarray)): + T=tarray[i] + try: + P=parray[i] + except: + P=1 # assume atmospheric but better be safe and check! + tp=tuple([T,P]) + if tp not in uniquepropstotemppressurecounts[setuniqueprops].keys(): + uniquepropstotemppressurecounts[setuniqueprops][tp]=0 + uniquepropstotemppressurecounts[setuniqueprops][tp]+=1 + temppressurecounts={} + for uniqueprop,tptocounts in uniquepropstotemppressurecounts.items(): + for tp in tptocounts.keys(): + if tp not in temppressurecounts.keys(): + temppressurecounts[tp]=0 + temppressurecounts[tp]+=1 + sortedtemppressurecounts=dict(sorted(temppressurecounts.items(), key=lambda item: item[1],reverse=True)) + + return sortedtemppressurecounts + + +def GrabNearestTPPoint(temp,tppoints): + difftotppoint={} + for tp in tppoints: + t=tp[0] + p=tp[1] + diff=np.abs(t-temp) + difftotppoint[diff]=tp + mindiff=min(difftotppoint.keys()) + mintp=difftotppoint[mindiff] + return mintp + + + +def GrabTPPoints(proptoarray): + tppoints=[] + tarray=proptoarray['T'] + parray=proptoarray['P'] + for i in range(len(tarray)): + T=tarray[i] + try: + P=parray[i] + except: + P=1 + tp=tuple([T,P]) + tppoints.append(tp) + + + return tppoints + + +def GrabPropValue(T,tarray,array): + try: # sometimes no error array: + length=len(array) + + except: # return None if no error is reported + return None + for i in range(len(tarray)): + t=tarray[i] + value=array[i] + if t==T: + return value + + +def FindMinimalTPPointsAllProps(tppoint,proptorefs,sortedrefstoproptoarray,truename): + tptoproptovalue={} + T=tppoint[0] + for prop,refs in proptorefs.items(): + for ref in refs: + proptoarray=sortedrefstoproptoarray[ref] + tppoints=GrabTPPoints(proptoarray) + if 'cite' in proptoarray.keys(): + cite=proptoarray['cite'] + else: + cite=ref + if 'name' in proptoarray.keys(): + name=proptoarray['name'] + else: + name=truename + if tppoint in tppoints: # else need to find nearest TP point + truepoint=tppoint + else: + othertppoint=GrabNearestTPPoint(T,tppoints) + truepoint=othertppoint + if truepoint not in tptoproptovalue.keys(): + tptoproptovalue[truepoint]={} + tptoproptovalue[truepoint]['cite']=cite + tptoproptovalue[truepoint]['name']=name + for prop,array in proptoarray.items(): + errprop=prop+'_err' + length=0 + if prop!='T' and prop!='P': + try: + length=len(array) + if length>0: + array=proptoarray[prop] + tarray=proptoarray['T'] + value=GrabPropValue(T,tarray,array) + array=proptoarray[errprop] + errvalue=GrabPropValue(T,tarray,array) + tptoproptovalue[truepoint][prop]=value + tptoproptovalue[truepoint][errprop]=errvalue + except: + + + if prop not in tptoproptovalue[truepoint].keys(): + tptoproptovalue[truepoint][prop]=None + tptoproptovalue[truepoint][errprop]=None + + + break # find the first reference with data point, refs sorted by year, grab most recent + + + return tptoproptovalue + + +def GrabTPPointOutsideBound(tppoint,tol,tppoints,string): + T=tppoint[0] + if string=='low': + bound=T-tol + elif string=='upper': + bound=T+tol + for pt in tppoints: + t=pt[0] + if string=='low': + if t<=bound: + return pt # grab first instance (sorted by highest occuring minimize # TP points) + elif string=='upper': + if t>=bound: + return pt + +def AddDefaultValues(tptoproptovalue): + for tp,proptovalue in tptoproptovalue.items(): + globaldic={} + defaultdenomvalue=1 + wtkeywordtovalue={} + + for prop,value in proptovalue.items(): + if prop!='name' and prop!='cite' and 'err' not in prop and prop!='T' and prop!='P': + lowerprop=prop.lower() + keyword=lowerprop+'_denom' + globaldic[keyword]=defaultdenomvalue + weightkeyword=prop+'_wt' + try: + length=float(value) + defaultwtvalue=1 + except: + defaultwtvalue=0 + wtkeywordtovalue[weightkeyword]=defaultwtvalue + + + proptovalue['global']=globaldic + for wtkeyword,wtvalue in wtkeywordtovalue.items(): + proptovalue[wtkeyword]=wtvalue + + tptoproptovalue[tp]=proptovalue + + + return tptoproptovalue + + +def WriteCSVFile(listoftpdics): + firsttpdic=listoftpdics[0] + firsttpdicvalues=list(firsttpdic.values()) + firsttppointvalues=firsttpdicvalues[0] + firstglobaldic=firsttppointvalues['global'] + + with open('data.csv', mode='w') as write_file: + writer = csv.writer(write_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL) + for keyword,value in firstglobaldic.items(): + ls=['Global',keyword,value] + writer.writerow(ls) + writer.writerow([]) + listofcommentrows=[] + listoftprows=[] + listoftpcommentrows=[] + for tpdic in listoftpdics: + for tp,proptovalue in tpdic.items(): + name=proptovalue['name'] + citation=proptovalue['cite'] + namels=['# Name',name] + refls=['# Ref',citation] + propls=['T','P'] + propvaluels=[str(tp[0]),str(tp[1])+' '+'atm'] + properrls=[] + properrvaluels=[] + commentpropvaluels=['# '+str(tp[0]),str(tp[1])+' '+'atm'] + + ls=[namels,refls,commentpropvaluels] + for prop,value in proptovalue.items(): + if prop!='name' and prop!='cite' and 'wt' not in prop and 'err' not in prop and prop!='T' and prop!='P' and 'global' not in prop: + if value==None: + continue + + propls.append(prop) + propvaluels.append(value) + wtkeyword=prop+'_wt' + wtvalue=proptovalue[wtkeyword] + propls.append(wtkeyword) + propvaluels.append(wtvalue) + errkeyword=prop+'_err' + errvalue=proptovalue[errkeyword] + if errvalue==None: + errvalue=0 + properrls.append(errkeyword) + properrvaluels.append(errvalue) + properrls[0]='# '+str(properrls[0]) + properrvaluels[0]='# '+str(properrvaluels[0]) + + ls.append(properrls) + ls.append(properrvaluels) + listofcommentrows.append(ls) + listoftpcommentrows.append(propls) + listoftprows.append(propvaluels) + for grpls in listofcommentrows: + for ls in grpls: + writer.writerow(ls) + writer.writerow([]) + first=listoftpcommentrows[0] + writer.writerow(first) + for ls in listoftprows: + writer.writerow(ls) + +def AddNistData(refstoproptoarray,propertynamearray,table,fbabbrtotargetunits): + ls=[None for i in propertynamearray] + if len(table)==0: + return refstoproptoarray + ureg = UnitRegistry() + tableheader=table[0] + nisttofbkeys={'vapH (kJ/mol)':'Hvap','Temperature (K)':'T','Cp (J/mol*K)':'Cp','Surf. Tension (N/m)':'Surf_Ten','Density (kg/m3)':'Rho'} + if 'Reference' in tableheader: + refidx=tableheader.index('Reference') + else: + refidx=None + for row in table[1:]: + for i in range(len(row)): + tablehead=tableheader[i] + value=row[i] + if tablehead=='Phase': + if value=='vapor': # skip, only want liquid + continue + if tablehead in nisttofbkeys.keys(): + fbvalue=nisttofbkeys[tablehead] + if refidx!=None: + ref=row[refidx] + else: + ref='Unknown' + if tablehead=='Cp (J/mol*K)': # NIST doesnt allow kJ for this so just convert here + value=float(value)*.001 + if tablehead=='Surf. Tension (N/m)': # NIST doesnt allow desired units so convert here + currentunit='N/m' + targetunit=fbabbrtotargetunits[fbvalue] + string=value+' * '+currentunit+' to '+targetunit + src, dst = string.split(' to ') + Q_ = ureg.Quantity + convobj=Q_(src).to(dst) + convfactor=convobj._magnitude + converted=float(value)*convfactor + value=converted + dic=dict(zip(propertynamearray,ls)) + if ref not in refstoproptoarray.keys(): + refstoproptoarray[ref]=dic + if refstoproptoarray[ref][fbvalue]==None: + refstoproptoarray[ref][fbvalue]=[] + refstoproptoarray[ref][fbvalue].append(value) + + return refstoproptoarray + +def QueryNISTProperties(truename): + fbabbrtotargetunits={'Eps0':'debye**2/(nm**3 .J)','Eps0_err':'debye**2/(nm**3 .J)','Cp':'kJ/(mol.K)','Cp_err':'kJ/(mol.K)','Kappa':'1/bar','Kappa_err':'1/bar','Alpha':'1/K','Alpha_err':'1/K','Surf_Ten':'mJ/m**2','Surf_Ten_err':'mJ/m**2','T':'K','P':'atm','Rho':'kg/m**3','Rho_err':'kg/m**3','Hvap':'kJ/mol','Hvap_err':'kJ/mol'} + refstoproptoarray={} + print('truename',truename) + x = search_nist(name=truename) + print('x',x) + firstx=x[0]# # by default try first item in search results + y = firstx.instantiate() + temp=300 + try: # query error, no data available (sometimes not fluid data or just wrong temperature) + table=y._get_fluid_data(firstx,temp) + except: + table=None + phasechange=y._get_PhaseChange_data(firstx,temp) + + try: + sattable=y._get_fluid_Saturation_data(firstx) + except: + sattable=None + + propertynamearray=list(fbabbrtotargetunits.keys()) + try: + length=len(sattable) + refstoproptoarray=AddNistData(refstoproptoarray,propertynamearray,sattable,fbabbrtotargetunits) + except: + pass + try: + length=len(table) + refstoproptoarray=AddNistData(refstoproptoarray,propertynamearray,table,fbabbrtotargetunits) + except: + pass + try: + length=len(phasechange) + refstoproptoarray=AddNistData(refstoproptoarray,propertynamearray,phasechange,fbabbrtotargetunits) + except: + pass + + + return refstoproptoarray + +def RemoveSamePoints(listoftpdics): + newlistoftpdics=[] + for tpdic in listoftpdics: + if tpdic not in newlistoftpdics: + newlistoftpdics.append(tpdic) + + return newlistoftpdics + +def RemoveDictionariesWithNoExpDataAtTargetTP(listoftpdics): + newlistoftpdics=[] + for tpdic in listoftpdics: + newdic={} + for tppoint,dic in tpdic.items(): + founddata=False + for key,value in dic.items(): + if key!='global' and key!='cite' and key!='name' and '_wt' not in key and '_denom' not in key: + if value!=None: + founddata=True + if founddata==True: + newdic[tppoint]=dic + if len(newdic.keys())>0: + newlistoftpdics.append(newdic) + + return newlistoftpdics + +rep='names' +roomtemp=295.5 +lowertol=10 +uppertol=10 +names=[] +if smiles!=None: + names=ConvertSmilestoNames(smiles,rep) +if printnames==True: + print('names from pubchem',names) +if searchILDB==True: + refstoproptoarray=QueryLiquidProperties(names,truename,printnames) +else: + if truename==None: # then take first (might be wrong please check) + truename=names[0] + refstoproptoarray=QueryNISTProperties(truename) + +sortedrefstoproptoarray=SortReferences(refstoproptoarray,searchILDB) +sortedrefstoproptoarray=RoundTPData(sortedrefstoproptoarray,2) # round to two decimal places +proptorefs=PropertyToReferences(sortedrefstoproptoarray) +sortedtemppressurecounts=CountTPFrequency(sortedrefstoproptoarray) +tppoint=GrabNearestTPPoint(roomtemp,list(sortedtemppressurecounts.keys())) +tptoproptovalue=FindMinimalTPPointsAllProps(tppoint,proptorefs,sortedrefstoproptoarray,truename) +tptoproptovalue=AddDefaultValues(tptoproptovalue) +lowertppoint=GrabTPPointOutsideBound(tppoint,lowertol,list(sortedtemppressurecounts.keys()),'low') +uppertppoint=GrabTPPointOutsideBound(tppoint,uppertol,list(sortedtemppressurecounts.keys()),'upper') +lowertptoproptovalue=FindMinimalTPPointsAllProps(lowertppoint,proptorefs,sortedrefstoproptoarray,truename) +lowertptoproptovalue=AddDefaultValues(lowertptoproptovalue) +uppertptoproptovalue=FindMinimalTPPointsAllProps(uppertppoint,proptorefs,sortedrefstoproptoarray,truename) +uppertptoproptovalue=AddDefaultValues(uppertptoproptovalue) +listoftpdics=[tptoproptovalue,lowertptoproptovalue,uppertptoproptovalue] +listoftpdics=RemoveDictionariesWithNoExpDataAtTargetTP(listoftpdics) +listoftpdics=RemoveSamePoints(listoftpdics) +WriteCSVFile(listoftpdics) From a72133537444892f1625026cef152b7f60aef50b Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Wed, 23 Jun 2021 17:00:39 -0500 Subject: [PATCH 07/27] Add wrapper for Poltype to setup ForceBalance simulations for vdw parameterization --- tools/PoltypeInterface/README.MD | 73 + tools/PoltypeInterface/amoebabio18.prm | 7994 +++++++++++++++++ tools/PoltypeInterface/data.csv | 30 + .../forcebalancepoltypeinterface.py | 1445 +++ tools/PoltypeInterface/optimize.in | 55 + 5 files changed, 9597 insertions(+) create mode 100644 tools/PoltypeInterface/README.MD create mode 100644 tools/PoltypeInterface/amoebabio18.prm create mode 100644 tools/PoltypeInterface/data.csv create mode 100644 tools/PoltypeInterface/forcebalancepoltypeinterface.py create mode 100644 tools/PoltypeInterface/optimize.in diff --git a/tools/PoltypeInterface/README.MD b/tools/PoltypeInterface/README.MD new file mode 100644 index 000000000..6731fa490 --- /dev/null +++ b/tools/PoltypeInterface/README.MD @@ -0,0 +1,73 @@ +# Readme for ForceBalance Poltype Wrapper + +* Install modified forcebalance for tinker +``` +git clone https://github.com/bdw2292/forcebalance.git +``` + +* ForceBalance conda environment +``` +conda create --name FBTest python=3.8 --yes +conda activate FBTest +conda install -c conda-forge ndcctools --yes +conda install -c conda-forge forcebalance --yes +conda install pip --yes +pip install pyilt2 +conda install -c conda-forge cirpy --yes +conda install -c conda-forge pint --yes +conda install -c conda-forge tqdm --yes +conda install -c anaconda beautifulsoup4 --yes +conda install -c anaconda pandas --yes +conda install openbabel --yes +conda install -c conda-forge rdkit --yes +``` + +* If you want to use Tinker9's gpu dynamics, make sure that your bashrc for each Tinker9 env contains the below export statement as well as function for dynamics_gpu (to call GPU dynamics and not CPU dynamics) +``` +export GPUDYNAMICS=True + +``` + +* https://ilthermo.boulder.nist.gov/ +* Be careful by default tries first name it finds with molecule match, but may not be correct name. Use printnames to find possible names that are found in database. Use truename to only grab data from the correct molecule name (according to the database) + +* Make sure Tinker is sourced in your path so program can use xyzedit! +* Environment Bashrc Example For CPU Tinker +``` +conda activate FBTest +export PATH=/home/bdw2292/NewestTinker/bin:$PATH +``` +* Make sure to copy files from modified forcebalance to conda site packages (for example mine are located /home/bdw2292/miniconda3/envs/FBTest/lib/python3.8/site-packages/forcebalance/) +* If you just want to use the NIST parser +``` +python forcebalancepoltypeinterface.py --smiles=C(Cl)(Cl)(Cl)Cl +python forcebalancepoltypeinterface.py --smiles=C(Cl)(Cl)(Cl)Cl --printnames +python forcebalancepoltypeinterface.py --smiles=C(Cl)(Cl)(Cl)Cl --truename=Tetrachloromethane +python forcebalancepoltypeinterface.py --truename=Water +``` +* If you want to use NIST parser and grab data/files from poltype job do set up Force Balance job +* Make a folder for input/outputs from ForceBalence and navigate to that folder +``` +python /home/bdw2292/FBInterface/forcebalancepoltypeinterface.py --poltypepath=/home/bdw2292/TestDaemonSubmissionScript/DrugTestMolecules/944 --vdwtypes=401,402 +``` +``` +poltypepath Path to completed poltypejob +vdwtypes List of vdw types to parameterize +liquid_equ_steps Equilibrium steps MD +liquid_prod_steps Production dynamic steps MD +liquid_timestep Time step for liquid MD +liquid_interval +gas_equ_steps Equilibrium steps MD +gas_prod_steps Production dynamic steps MD +gas_timestep +gas_interval +md_threads CPU cores +liquid_prod_time Total time liquid sim +gas_prod_time Total time gas sim +nvtprops This controls whether to include surface tension or not (NVT) property +skipNIST This will skip parsing NIST and generation of data.csv +density This will input density for liquid.xyz + + + +``` diff --git a/tools/PoltypeInterface/amoebabio18.prm b/tools/PoltypeInterface/amoebabio18.prm new file mode 100644 index 000000000..36b016851 --- /dev/null +++ b/tools/PoltypeInterface/amoebabio18.prm @@ -0,0 +1,7994 @@ + + ############################## + ## ## + ## Force Field Definition ## + ## ## + ############################## + + +forcefield AMOEBA-BIO-2018 + +bond-cubic -2.55 +bond-quartic 3.793125 +angle-cubic -0.014 +angle-quartic 0.000056 +angle-pentic -0.0000007 +angle-sextic 0.000000022 +opbendtype ALLINGER +opbend-cubic -0.014 +opbend-quartic 0.000056 +opbend-pentic -0.0000007 +opbend-sextic 0.000000022 +torsionunit 0.5 +vdwtype BUFFERED-14-7 +radiusrule CUBIC-MEAN +radiustype R-MIN +radiussize DIAMETER +epsilonrule HHG +dielectric 1.0 +polarization MUTUAL +vdw-12-scale 0.0 +vdw-13-scale 0.0 +vdw-14-scale 1.0 +vdw-15-scale 1.0 +mpole-12-scale 0.0 +mpole-13-scale 0.0 +mpole-14-scale 0.4 +mpole-15-scale 0.8 +polar-12-scale 0.0 +polar-13-scale 0.0 +polar-14-scale 1.0 +polar-15-scale 1.0 +polar-12-intra 0.0 +polar-13-intra 0.0 +polar-14-intra 0.5 +polar-15-intra 1.0 +direct-11-scale 0.0 +direct-12-scale 1.0 +direct-13-scale 1.0 +direct-14-scale 1.0 +mutual-11-scale 1.0 +mutual-12-scale 1.0 +mutual-13-scale 1.0 +mutual-14-scale 1.0 + + + ############################# + ## ## + ## Literature References ## + ## ## + ############################# + + +This file contains the 2018 AMOEBA biopolymer force field, with contents +combined from the 2013 AMOEBA protein parameters and the 2017 AMOEBA nucleic +acid parameters as described in articles listed immediately below + +Y. Shi, Z. Xia, J. Zhang, R. Best, J. W. Ponder and P. Ren, "Polarizable +Atomic Multipole-Based AMOEBA Force Field for Proteins", J. Chem. Theory +Comput., 9, 4046-4063 (2013) + +C. Zhang, C. Lu, Z. Jing, C. Wu, J.-P. Piquemal, J. W. Ponder and P. Ren, +"AMOEBA Polarizable Atomic Multipole Force Field for Nucleic Acids", +J. Chem. Theory Comput., 14, 2084-2108 (2018) + + + ################################################## + ## ## + ## AMOEBA Biopolymer Force Field Atom Classes ## + ## ## + ## 1 Backbone Amide Nitrogen ## + ## 2 Glycine Alpha Carbon ## + ## 3 Backbone Carbonyl Carbon ## + ## 4 Amide or Guanidinium Hydrogen ## + ## 5 Amide Carbonyl Oxygen ## + ## 6 Methine Hydrogen ## + ## 7 Methine Carbon ## + ## 8 Methyl or Methylene Carbon ## + ## 9 Methyl or Methylene Hydrogen ## + ## 10 Hydroxyl Oxygen ## + ## 11 Hydroxyl Hydrogen ## + ## 12 Sulfide or Disulfide Sulfur ## + ## 13 Sulfhydryl Hydrogen ## + ## 14 Thiolate Sulfur ## + ## 15 Proline Backbone Nitrogen ## + ## 16 Proline Ring Methylene Carbon ## + ## 17 Phenyl Carbon ## + ## 18 Phenyl Hydrogen ## + ## 19 Phenolic Oxygen ## + ## 20 Phenolic Hydrogen ## + ## 21 Phenoxide Oxygen ## + ## 22 Indole Carbon ## + ## 23 Indole CH Hydrogen ## + ## 24 Imidazole or Indole NH Nitrogen ## + ## 25 Imidazole or Indole NH Hydrogen ## + ## 26 Imidazole C=C Carbon ## + ## 27 Imidazole CH Hydrogen ## + ## 28 Imidazole N=C-N Carbon ## + ## 29 Imidazole C=N Nitrogen ## + ## 30 Carboxylate Carbon ## + ## 31 Carboxylate Oxygen ## + ## 32 Carboxylic Acid Carbonyl Oxygen ## + ## 33 Carboxylic Acid Carbonyl Oxygen ## + ## 34 Carboxylic Acid Hydroxyl Oxygen ## + ## 35 Carboxylic Acid Hydrogen ## + ## 36 Lysine/Ornithine Gamma Carbon ## + ## 37 Ammonium Nitrogen ## + ## 38 Ammonium Hydrogen ## + ## 39 Guanidinium Carbon ## + ## 40 Acetyl or NMe Methyl Carbon ## + ## 41 N-Terminal Ammonium Nitrogen ## + ## 42 N-Terminal Ammonium Hydrogen ## + ## 43-64 Nucleotide Bases (ACGTU) ## + ## 65-74 Ribose Sugar Ring ## + ## 75-83 Deoxyribose Sugar Ring ## + ## 84-89 DNA/RNA Terminal Groups ## + ## ## + ################################################## + + + ############################# + ## ## + ## Atom Type Definitions ## + ## ## + ############################# + + +atom 1 1 N "Glycine N" 7 14.007 3 +atom 2 2 CA "Glycine CA" 6 12.011 4 +atom 3 3 C "Glycine C" 6 12.011 3 +atom 4 4 HN "Glycine HN" 1 1.008 1 +atom 5 5 O "Glycine O" 8 15.999 1 +atom 6 6 H "Glycine HA" 1 1.008 1 +atom 7 1 N "Alanine N" 7 14.007 3 +atom 8 7 CA "Alanine CA" 6 12.011 4 +atom 9 3 C "Alanine C" 6 12.011 3 +atom 10 4 HN "Alanine HN" 1 1.008 1 +atom 11 5 O "Alanine O" 8 15.999 1 +atom 12 6 H "Alanine HA" 1 1.008 1 +atom 13 8 C "Alanine CB" 6 12.011 4 +atom 14 9 H "Alanine HB" 1 1.008 1 +atom 15 7 C "Valine CB" 6 12.011 4 +atom 16 6 H "Valine HB" 1 1.008 1 +atom 17 8 C "Valine CG" 6 12.011 4 +atom 18 9 H "Valine HG" 1 1.008 1 +atom 19 8 C "Leucine CB" 6 12.011 4 +atom 20 9 H "Leucine HB" 1 1.008 1 +atom 21 7 C "Leucine CG" 6 12.011 4 +atom 22 6 H "Leucine HG" 1 1.008 1 +atom 23 8 C "Leucine CD" 6 12.011 4 +atom 24 9 H "Leucine HD" 1 1.008 1 +atom 25 7 C "Isoleucine CB" 6 12.011 4 +atom 26 6 H "Isoleucine HB" 1 1.008 1 +atom 27 8 C "Isoleucine CG1" 6 12.011 4 +atom 28 9 H "Isoleucine HG1" 1 1.008 1 +atom 29 8 C "Isoleucine CG2" 6 12.011 4 +atom 30 9 H "Isoleucine HG2" 1 1.008 1 +atom 31 8 C "Isoleucine CD" 6 12.011 4 +atom 32 9 H "Isoleucine HD" 1 1.008 1 +atom 33 8 C "Serine CB" 6 12.011 4 +atom 34 9 H "Serine HB" 1 1.008 1 +atom 35 10 OH "Serine OG" 8 15.999 2 +atom 36 11 HO "Serine HG" 1 1.008 1 +atom 37 7 C "Threonine CB" 6 12.011 4 +atom 38 6 H "Threonine HB" 1 1.008 1 +atom 39 10 OH "Threonine OG1" 8 15.999 2 +atom 40 11 HO "Threonine HG1" 1 1.008 1 +atom 41 8 C "Threonine CG2" 6 12.011 4 +atom 42 9 H "Threonine HG2" 1 1.008 1 +atom 43 8 C "Cysteine CB" 6 12.011 4 +atom 44 9 H "Cysteine HB" 1 1.008 1 +atom 45 12 SH "Cysteine SG" 16 32.066 2 +atom 46 13 HS "Cysteine HG" 1 1.008 1 +atom 47 12 SS "Cystine SG" 16 32.066 2 +atom 48 7 CA "Cysteine Anion CA" 6 12.011 4 +atom 49 14 S "Cysteine Anion S-" 16 32.066 1 +atom 50 15 N "Proline N" 7 14.007 3 +atom 51 7 CA "Proline CA" 6 12.011 4 +atom 52 3 C "Proline C" 6 12.011 3 +atom 53 5 O "Proline O" 8 15.999 1 +atom 54 6 H "Proline HA" 1 1.008 1 +atom 55 16 C "Proline CB" 6 12.011 4 +atom 56 9 H "Proline HB" 1 1.008 1 +atom 57 16 C "Proline CG" 6 12.011 4 +atom 58 9 H "Proline HG" 1 1.008 1 +atom 59 16 C "Proline CD" 6 12.011 4 +atom 60 6 H "Proline HD" 1 1.008 1 +atom 61 8 C "Phenylalanine CB" 6 12.011 4 +atom 62 9 H "Phenylalanine HB" 1 1.008 1 +atom 63 17 C "Phenylalanine CG" 6 12.011 3 +atom 64 17 C "Phenylalanine CD" 6 12.011 3 +atom 65 18 H "Phenylalanine HD" 1 1.008 1 +atom 66 17 C "Phenylalanine CE" 6 12.011 3 +atom 67 18 H "Phenylalanine HE" 1 1.008 1 +atom 68 17 C "Phenylalanine CZ" 6 12.011 3 +atom 69 18 H "Phenylalanine HZ" 1 1.008 1 +atom 70 8 C "Tyrosine CB" 6 12.011 4 +atom 71 9 H "Tyrosine HB" 1 1.008 1 +atom 72 17 C "Tyrosine CG" 6 12.011 3 +atom 73 17 C "Tyrosine CD" 6 12.011 3 +atom 74 18 H "Tyrosine HD" 1 1.008 1 +atom 75 17 C "Tyrosine CE" 6 12.011 3 +atom 76 18 H "Tyrosine HE" 1 1.008 1 +atom 77 17 C "Tyrosine CZ" 6 12.011 3 +atom 78 19 OH "Tyrosine OH" 8 15.999 2 +atom 79 20 HO "Tyrosine HH" 1 1.008 1 +atom 80 8 C "Tyrosine Anion CB" 6 12.011 4 +atom 81 9 H "Tyrosine Anion HB" 1 1.008 1 +atom 82 17 C "Tyrosine Anion CG" 6 12.011 3 +atom 83 17 C "Tyrosine Anion CD" 6 12.011 3 +atom 84 18 H "Tyrosine Anion HD" 1 1.008 1 +atom 85 17 C "Tyrosine Anion CE" 6 12.011 3 +atom 86 18 H "Tyrosine Anion HE" 1 1.008 1 +atom 87 17 C "Tyrosine Anion CZ" 6 12.011 3 +atom 88 21 O- "Tyrosine Anion O-" 8 15.999 1 +atom 89 8 C "Tryptophan CB" 6 12.011 4 +atom 90 9 H "Tryptophan HB" 1 1.008 1 +atom 91 22 C "Tryptophan CG" 6 12.011 3 +atom 92 22 C "Tryptophan CD1" 6 12.011 3 +atom 93 23 H "Tryptophan HD1" 1 1.008 1 +atom 94 22 C "Tryptophan CD2" 6 12.011 3 +atom 95 24 N "Tryptophan NE1" 7 14.007 3 +atom 96 25 HN "Tryptophan HE1" 1 1.008 1 +atom 97 22 C "Tryptophan CE2" 6 12.011 3 +atom 98 22 C "Tryptophan CE3" 6 12.011 3 +atom 99 23 H "Tryptophan HE3" 1 1.008 1 +atom 100 22 C "Tryptophan CZ2" 6 12.011 3 +atom 101 23 H "Tryptophan HZ2" 1 1.008 1 +atom 102 22 C "Tryptophan CZ3" 6 12.011 3 +atom 103 23 H "Tryptophan HZ3" 1 1.008 1 +atom 104 22 C "Tryptophan CH2" 6 12.011 3 +atom 105 23 H "Tryptophan HH2" 1 1.008 1 +atom 106 8 C "Histidine (+) CB" 6 12.011 4 +atom 107 9 H "Histidine (+) HB" 1 1.008 1 +atom 108 26 C "Histidine (+) CG" 6 12.011 3 +atom 109 24 N "Histidine (+) ND1" 7 14.007 3 +atom 110 25 HN "Histidine (+) HD1" 1 1.008 1 +atom 111 26 C "Histidine (+) CD2" 6 12.011 3 +atom 112 27 H "Histidine (+) HD2" 1 1.008 1 +atom 113 28 C "Histidine (+) CE1" 6 12.011 3 +atom 114 27 H "Histidine (+) HE1" 1 1.008 1 +atom 115 24 N "Histidine (+) NE2" 7 14.007 3 +atom 116 25 HN "Histidine (+) HE2" 1 1.008 1 +atom 117 8 C "Histidine (HD) CB" 6 12.011 4 +atom 118 9 H "Histidine (HD) HB" 1 1.008 1 +atom 119 26 C "Histidine (HD) CG" 6 12.011 3 +atom 120 24 N "Histidine (HD) ND1" 7 14.007 3 +atom 121 25 HN "Histidine (HD) HD1" 1 1.008 1 +atom 122 26 C "Histidine (HD) CD2" 6 12.011 3 +atom 123 27 H "Histidine (HD) HD2" 1 1.008 1 +atom 124 28 C "Histidine (HD) CE1" 6 12.011 3 +atom 125 27 H "Histidine (HD) HE1" 1 1.008 1 +atom 126 29 N "Histidine (HD) NE2" 7 14.007 2 +atom 127 8 C "Histidine (HE) CB" 6 12.011 4 +atom 128 9 H "Histidine (HE) HB" 1 1.008 1 +atom 129 26 C "Histidine (HE) CG" 6 12.011 3 +atom 130 29 N "Histidine (HE) ND1" 7 14.007 2 +atom 131 26 C "Histidine (HE) CD2" 6 12.011 3 +atom 132 27 H "Histidine (HE) HD2" 1 1.008 1 +atom 133 28 C "Histidine (HE) CE1" 6 12.011 3 +atom 134 27 H "Histidine (HE) HE1" 1 1.008 1 +atom 135 24 N "Histidine (HE) NE2" 7 14.007 3 +atom 136 25 HN "Histidine (HE) HE2" 1 1.008 1 +atom 137 8 C "Aspartate CB" 6 12.011 4 +atom 138 9 H "Aspartate HB" 1 1.008 1 +atom 139 30 C "Aspartate CG" 6 12.011 3 +atom 140 31 O "Aspartate OD" 8 15.999 1 +atom 141 8 C "Aspartic Acid CB" 6 12.011 4 +atom 142 9 H "Aspartic Acid HB" 1 1.008 1 +atom 143 32 C "Aspartic Acid CG" 6 12.011 3 +atom 144 33 O "Aspartic Acid OD1" 8 15.999 1 +atom 145 34 OH "Aspartic Acid OD2" 8 15.999 2 +atom 146 35 HO "Aspartic Acid HD2" 1 1.008 1 +atom 147 8 C "Asparagine CB" 6 12.011 4 +atom 148 9 H "Asparagine HB" 1 1.008 1 +atom 149 3 C "Asparagine CG" 6 12.011 3 +atom 150 5 O "Asparagine OD1" 8 15.999 1 +atom 151 1 N "Asparagine ND2" 7 14.007 3 +atom 152 4 HN "Asparagine HD2" 1 1.008 1 +atom 153 8 C "Glutamate CB" 6 12.011 4 +atom 154 9 H "Glutamate HB" 1 1.008 1 +atom 155 8 C "Glutamate CG" 6 12.011 4 +atom 156 9 H "Glutamate HG" 1 1.008 1 +atom 157 30 C "Glutamate CD" 6 12.011 3 +atom 158 31 O "Glutamate OE" 8 15.999 1 +atom 159 8 C "Glutamic Acid CB" 6 12.011 4 +atom 160 9 H "Glutamic Acid HB" 1 1.008 1 +atom 161 8 C "Glutamic Acid CG" 6 12.011 4 +atom 162 9 H "Glutamic Acid HG" 1 1.008 1 +atom 163 32 C "Glutamic Acid CD" 6 12.011 3 +atom 164 33 O "Glutamic Acid OE1" 8 15.999 1 +atom 165 34 O "Glutamic Acid OE2" 8 15.999 2 +atom 166 35 H "Glutamic Acid HE2" 8 1.008 1 +atom 167 8 C "Glutamine CB" 6 12.011 4 +atom 168 9 H "Glutamine HB" 1 1.008 1 +atom 169 8 C "Glutamine CG" 6 12.011 4 +atom 170 9 H "Glutamine HG" 1 1.008 1 +atom 171 3 C "Glutamine CD" 6 12.011 3 +atom 172 5 O "Glutamine OE1" 8 15.999 1 +atom 173 1 N "Glutamine NE2" 7 14.007 3 +atom 174 4 HN "Glutamine HE2" 1 1.008 1 +atom 175 8 C "Methionine CB" 6 12.011 4 +atom 176 9 H "Methionine HB" 1 1.008 1 +atom 177 8 C "Methionine CG" 6 12.011 4 +atom 178 9 H "Methionine HG" 1 1.008 1 +atom 179 12 S "Methionine SD" 16 32.066 2 +atom 180 8 C "Methionine CE" 6 12.011 4 +atom 181 9 H "Methionine HE" 1 1.008 1 +atom 182 8 C "Lysine CB" 6 12.011 4 +atom 183 9 H "Lysine HB" 1 1.008 1 +atom 184 36 C "Lysine CG" 6 12.011 4 +atom 185 9 H "Lysine HG" 1 1.008 1 +atom 186 8 C "Lysine CD" 6 12.011 4 +atom 187 9 H "Lysine HD" 1 1.008 1 +atom 188 8 C "Lysine CE" 6 12.011 4 +atom 189 9 H "Lysine HE" 1 1.008 1 +atom 190 37 N "Lysine NZ" 7 14.007 4 +atom 191 38 HN "Lysine HN" 1 1.008 1 +atom 192 8 C "Lysine (Neutral) CB" 6 12.011 4 +atom 193 9 H "Lysine (Neutral) HB" 1 1.008 1 +atom 194 36 C "Lysine (Neutral) CG" 6 12.011 4 +atom 195 9 H "Lysine (Neutral) HG" 1 1.008 1 +atom 196 8 C "Lysine (Neutral) CD" 6 12.011 4 +atom 197 9 H "Lysine (Neutral) HD" 1 1.008 1 +atom 198 8 C "Lysine (Neutral) CE" 6 12.011 4 +atom 199 9 H "Lysine (Neutral) HE" 1 1.008 1 +atom 200 37 N "Lysine (Neutral) NZ" 7 14.007 3 +atom 201 38 HN "Lysine (Neutral) HN" 1 1.008 1 +atom 202 8 C "Arginine CB" 6 12.011 4 +atom 203 9 H "Arginine HB" 1 1.008 1 +atom 204 8 C "Arginine CG" 6 12.011 4 +atom 205 9 H "Arginine HG" 1 1.008 1 +atom 206 8 C "Arginine CD" 6 12.011 4 +atom 207 9 H "Arginine HD" 1 1.008 1 +atom 208 1 N "Arginine NE" 7 14.007 3 +atom 209 4 HN "Arginine HE" 1 1.008 1 +atom 210 39 C "Arginine CZ" 6 12.011 3 +atom 211 1 N "Arginine NH" 7 14.007 3 +atom 212 4 HN "Arginine HH" 1 1.008 1 +atom 213 8 C "Ornithine CB" 6 12.011 4 +atom 214 9 H "Ornithine HB" 1 1.008 1 +atom 215 36 C "Ornithine CG" 6 12.011 4 +atom 216 9 H "Ornithine HG" 1 1.008 1 +atom 217 8 C "Ornithine CD" 6 12.011 4 +atom 218 9 H "Ornithine HD" 1 1.008 1 +atom 219 37 N "Ornithine NE" 7 14.007 4 +atom 220 38 HN "Ornithine HE" 1 1.008 1 +atom 221 40 C "Acetyl Cap CH3" 6 12.011 4 +atom 222 6 H "Acetyl Cap H3C" 1 1.008 1 +atom 223 3 C "Acetyl Cap C" 6 12.011 3 +atom 224 5 O "Acetyl Cap O" 8 15.999 1 +atom 225 1 N "Amide Cap NH2" 7 14.007 3 +atom 226 4 HN "Amide Cap H2N" 1 1.008 1 +atom 227 1 N "N-MeAmide Cap N" 7 14.007 3 +atom 228 4 HN "N-MeAmide Cap HN" 1 1.008 1 +atom 229 40 C "N-MeAmide Cap CH3" 6 12.011 4 +atom 230 6 H "N-MeAmide Cap H3C" 1 1.008 1 +atom 231 41 N "N-Terminal NH3+" 7 14.007 4 +atom 232 42 H "N-Terminal H3N+" 1 1.008 1 +atom 233 30 C "C-Terminal COO-" 6 12.011 3 +atom 234 31 O "C-Terminal COO-" 8 15.999 1 +atom 235 32 C "C-Terminal COOH C=O" 6 12.011 3 +atom 236 33 O "C-Terminal COOH O=C" 8 15.999 1 +atom 237 34 OH "C-Terminal COOH OH" 8 15.999 2 +atom 238 35 HO "C-Terminal COOH HO" 1 1.008 1 +atom 239 41 N "N-Terminal PRO NH2+" 7 14.007 4 +atom 240 42 HN "N-Terminal PRO H2N+" 1 1.008 1 +atom 241 7 CA "N-Terminal PRO CA" 6 12.011 4 +atom 242 3 C "N-Terminal PRO C" 6 12.011 3 +atom 243 5 O "N-Terminal PRO O" 8 15.999 1 +atom 244 6 H "N-Terminal PRO HA" 1 1.008 1 +atom 245 16 C "N-Terminal PRO CD" 6 12.011 4 +atom 246 6 H "N-Terminal PRO HD" 1 1.008 1 +atom 247 43 C "Adenine C4" 6 12.011 3 +atom 248 44 C "Adenine C8" 6 12.011 3 +atom 249 45 C "Adenine C6" 6 12.011 3 +atom 250 43 C "Adenine C5" 6 12.011 3 +atom 251 46 N "Adenine N9 RNA" 7 14.007 3 +atom 252 46 N "Adenine N9 DNA" 7 14.007 3 +atom 253 47 N "Adenine N6" 7 14.007 3 +atom 254 48 C "Adenine C2" 6 12.011 3 +atom 255 49 N "Adenine N7" 7 14.007 2 +atom 256 50 N "Adenine N3" 7 14.007 2 +atom 257 50 N "Adenine N1" 7 14.007 2 +atom 258 51 H "Adenine H8" 1 1.008 1 +atom 259 52 H "Adenine H2" 1 1.008 1 +atom 260 53 H "Adenine H61" 1 1.008 1 +atom 261 54 N "Cytosine N1 RNA" 7 14.007 3 +atom 262 54 N "Cytosine N1 DNA" 7 14.007 3 +atom 263 55 C "Cytosine C5" 6 12.011 3 +atom 264 47 N "Cytosine N4" 7 14.007 3 +atom 265 48 C "Cytosine C6" 6 12.011 3 +atom 266 56 C "Cytosine C2" 6 12.011 3 +atom 267 45 C "Cytosine C4" 6 12.011 3 +atom 268 50 N "Cytosine N3" 7 14.007 2 +atom 269 57 H "Cytosine H5" 1 1.008 1 +atom 270 58 O "Cytosine O2" 8 15.999 1 +atom 271 51 H "Cytosine H6" 1 1.008 1 +atom 272 53 H "Cytosine H41" 1 1.008 1 +atom 273 59 C "Guanine C2" 6 12.011 3 +atom 274 56 C "Guanine C6" 6 12.011 3 +atom 275 43 C "Guanine C4" 6 12.011 3 +atom 276 44 C "Guanine C8" 6 12.011 3 +atom 277 54 N "Guanine N1" 7 14.007 3 +atom 278 47 N "Guanine N2" 7 14.007 3 +atom 279 43 C "Guanine C5" 6 12.011 3 +atom 280 60 N "Guanine N9 RNA" 7 14.007 3 +atom 281 60 N "Guanine N9 DNA" 7 14.007 3 +atom 282 49 N "Guanine N7" 7 14.007 2 +atom 283 50 N "Guanine N3" 7 14.007 2 +atom 284 61 H "Guanine H1" 1 1.008 1 +atom 285 58 O "Guanine O6" 8 15.999 1 +atom 286 51 H "Guanine H8" 1 1.008 1 +atom 287 53 H "Guanine H21" 1 1.008 1 +atom 288 62 C "Thymine C7" 6 12.011 4 +atom 289 48 C "Thymine C5" 6 12.011 3 +atom 290 56 C "Thymine C4" 6 12.011 3 +atom 291 48 C "Thymine C6" 6 12.011 3 +atom 292 63 N "Thymine N1" 7 14.007 3 +atom 293 54 N "Thymine N3" 7 14.007 3 +atom 294 56 C "Thymine C2" 6 12.011 3 +atom 295 64 H "Thymine H7" 1 1.008 1 +atom 296 58 O "Thymine O2" 8 15.999 1 +atom 297 51 H "Thymine H6" 1 1.008 1 +atom 298 58 O "Thymine O4" 8 15.999 1 +atom 299 61 H "Thymine H3" 1 1.008 1 +atom 300 56 C "Uracil C2" 6 12.011 3 +atom 301 48 C "Uracil C6" 6 12.011 3 +atom 302 56 C "Uracil C4" 6 12.011 3 +atom 303 54 N "Uracil N3" 7 14.007 3 +atom 304 63 N "Uracil N1" 7 14.007 3 +atom 305 48 C "Uracil C5" 6 12.011 3 +atom 306 61 H "Uracil H3" 1 1.008 1 +atom 307 52 H "Uracil H5" 1 1.008 1 +atom 308 58 O "Uracil O2" 8 15.999 1 +atom 309 58 O "Uracil O4" 8 15.999 1 +atom 310 51 H "Uracil H6" 1 1.008 1 +atom 311 65 O "Ribose O4'" 8 15.999 2 +atom 312 66 C "Ribose C4'" 6 12.011 4 +atom 313 67 H "Ribose H4'" 1 1.008 1 +atom 314 68 C "Ribose C1'" 6 12.011 4 +atom 315 67 H "Ribose H1'" 1 1.008 1 +atom 316 68 C "Ribose C2'" 6 12.011 4 +atom 317 67 H "Ribose H2'1" 1 1.008 1 +atom 318 68 C "Ribose C3'" 6 12.011 4 +atom 319 67 H "Ribose H3'" 1 1.008 1 +atom 320 69 O "Ribose O2'" 8 15.999 2 +atom 321 70 H "Ribose HO'2" 1 1.008 1 +atom 322 71 O "Ribose O3'" 8 15.999 2 +atom 323 70 H "Ribose HO'3" 1 1.008 1 +atom 324 72 C "Ribose C5'" 6 12.011 4 +atom 325 73 H "Ribose H5'" 1 1.008 1 +atom 326 74 O "Ribose O5'" 8 15.999 2 +atom 327 70 H "Ribose HO'5" 1 1.008 1 +atom 328 75 C "Deoxyribose C4'" 6 12.011 4 +atom 329 76 C "Deoxyribose C3'" 6 12.011 4 +atom 330 76 C "Deoxyribose C2'" 6 12.011 4 +atom 331 76 C "Deoxyribose C1'" 6 12.011 4 +atom 332 77 O "Deoxyribose O4'" 8 15.999 2 +atom 333 78 H "Deoxyribose H2'1" 1 1.008 1 +atom 334 78 H "Deoxyribose H1'" 1 1.008 1 +atom 335 78 H "Deoxyribose H3'" 1 1.008 1 +atom 336 78 H "Deoxyribose H4'" 1 1.008 1 +atom 337 79 C "Deoxyribose C5'" 6 12.011 4 +atom 338 80 O "Deoxyribose O3'" 8 15.999 2 +atom 339 81 H "Deoxyribose HO'3" 1 1.008 1 +atom 340 82 H "Deoxyribose H5'1" 1 1.008 1 +atom 341 83 O "Deoxyribose O5'" 8 15.999 2 +atom 342 81 H "Deoxyribose HO'5" 1 1.008 1 +atom 343 84 P "Phosphodiester P" 15 30.974 4 +atom 344 85 O "Phosphodiester OP" 8 15.999 1 +atom 345 86 O "R-5'-Hydroxyl O5'T" 8 15.999 2 +atom 346 87 O "R-3'-Hydroxyl O3'T" 8 15.999 2 +atom 347 88 O "D-3'-Hydroxyl O3'T" 8 15.999 2 +atom 348 89 O "D-5'-Hydroxyl O5'T" 8 15.999 2 +atom 349 90 O "AMOEBA Water O" 8 15.999 2 +atom 350 91 H "AMOEBA Water H" 1 1.008 1 +atom 351 92 Li+ "Lithium Ion Li+" 3 6.941 0 +atom 352 93 Na+ "Sodium Ion Na+" 11 22.990 0 +atom 353 94 K+ "Potassium Ion K+" 19 39.098 0 +atom 354 95 Rb+ "Rubidium Ion Rb+" 37 85.468 0 +atom 355 96 Cs+ "Cesium Ion Cs+" 55 132.905 0 +atom 356 97 Be+ "Beryllium Ion Be+2" 4 9.012 0 +atom 357 98 Mg+ "Magnesium Ion Mg+2" 12 24.305 0 +atom 358 99 Ca+ "Calcium Ion Ca+2" 20 40.078 0 +atom 359 100 Zn+ "Zinc Ion Zn+2" 30 65.380 0 +atom 360 101 F- "Fluoride Ion F-" 9 18.998 0 +atom 361 102 Cl- "Chloride Ion Cl-" 17 35.453 0 +atom 362 103 Br- "Bromide Ion Br-" 35 79.904 0 +atom 363 104 I- "Iodide Ion I-" 53 126.904 0 + + + ################################ + ## ## + ## Van der Waals Parameters ## + ## ## + ################################ + + +vdw 1 3.7100 0.1100 +vdw 2 3.8200 0.1010 +vdw 3 3.8200 0.1060 +vdw 4 2.5900 0.0220 0.900 +vdw 5 3.3000 0.1120 +vdw 6 2.9400 0.0260 0.910 +vdw 7 3.6500 0.1010 +vdw 8 3.8200 0.1010 +vdw 9 2.9800 0.0240 0.920 +vdw 10 3.4050 0.1100 +vdw 11 2.6550 0.0135 0.910 +vdw 12 4.0050 0.3550 +vdw 14 4.2000 0.3550 +vdw 13 3.0000 0.0265 0.980 +vdw 15 3.7100 0.1100 +vdw 16 3.8200 0.1010 +vdw 17 3.8000 0.0890 +vdw 18 2.9800 0.0260 0.920 +vdw 19 3.4050 0.1100 +vdw 20 2.6550 0.0135 0.910 +vdw 21 3.3200 0.1120 +vdw 22 3.8000 0.1010 +vdw 23 2.9800 0.0260 0.920 +vdw 24 3.7100 0.1100 +vdw 25 2.5900 0.0220 0.900 +vdw 26 3.8000 0.1010 +vdw 27 2.9800 0.0260 0.920 +vdw 28 3.8000 0.1010 +vdw 29 3.7100 0.1100 +vdw 30 3.8200 0.1060 +vdw 31 3.5500 0.0950 +vdw 32 3.8200 0.1060 +vdw 33 3.3000 0.1120 +vdw 34 3.4050 0.1100 +vdw 35 2.6550 0.0150 0.910 +vdw 36 3.8200 0.1010 +vdw 37 3.8100 0.1050 +vdw 38 2.4800 0.0130 0.910 +vdw 39 3.6500 0.1010 +vdw 40 3.8200 0.1010 +vdw 41 3.7600 0.1050 +vdw 42 2.7000 0.0200 0.910 +vdw 43 3.7200 0.1120 +vdw 44 3.7400 0.1060 +vdw 45 3.7200 0.1060 +vdw 46 3.7000 0.1270 +vdw 47 3.6000 0.1240 +vdw 48 3.7400 0.1060 +vdw 49 3.6400 0.1270 +vdw 50 3.6400 0.1270 +vdw 51 2.9500 0.0290 0.920 +vdw 52 3.0800 0.0290 0.920 +vdw 53 2.6500 0.0200 0.880 +vdw 54 3.7000 0.1270 +vdw 55 3.7900 0.1060 +vdw 56 3.7200 0.0950 +vdw 57 3.0500 0.0290 0.910 +vdw 58 3.3500 0.1290 +vdw 59 3.7200 0.1060 +vdw 60 3.7000 0.1270 +vdw 61 2.6500 0.0200 0.890 +vdw 62 3.8000 0.1010 +vdw 63 3.7000 0.1270 +vdw 64 2.9000 0.0250 0.910 +vdw 65 3.4050 0.1120 +vdw 66 3.8200 0.1010 +vdw 67 2.8900 0.0240 0.920 +vdw 68 3.8200 0.1010 +vdw 69 3.4050 0.1120 +vdw 70 2.6550 0.0135 0.910 +vdw 71 3.4500 0.1080 +vdw 72 3.8200 0.1010 +vdw 73 2.9400 0.0240 0.920 +vdw 74 3.4500 0.1080 +vdw 75 3.8200 0.1010 +vdw 76 3.8200 0.1010 +vdw 77 3.4050 0.1120 +vdw 78 2.8900 0.0240 0.920 +vdw 79 3.8200 0.1010 +vdw 80 3.4500 0.1080 +vdw 81 2.6550 0.0135 0.910 +vdw 82 2.9400 0.0240 0.920 +vdw 83 3.4500 0.1080 +vdw 84 4.4500 0.3000 +vdw 85 3.4000 0.1100 +vdw 86 3.4050 0.1120 +vdw 87 3.4050 0.1120 +vdw 88 3.4050 0.1120 +vdw 89 3.4050 0.1120 +vdw 90 3.4050 0.1100 +vdw 91 2.6550 0.0135 0.910 +vdw 92 2.2000 0.0660 +vdw 93 2.9550 0.2800 +vdw 94 3.6800 0.3500 +vdw 95 3.9000 0.3800 +vdw 96 4.1400 0.4200 +vdw 97 1.8800 0.0910 +vdw 98 2.9000 0.2800 +vdw 99 3.5900 0.3500 +vdw 100 2.6800 0.2220 +vdw 101 3.4300 0.2500 +vdw 102 4.1200 0.3400 +vdw 103 4.3200 0.4300 +vdw 104 4.6100 0.5200 + + + + ##################################### + ## ## + ## Van der Waals Pair Parameters ## + ## ## + ##################################### + + +vdwpr 4 31 3.1000 0.0400 +vdwpr 5 98 3.0000 0.1530 +vdwpr 5 99 3.2700 0.1750 +vdwpr 5 100 2.8900 0.1750 +vdwpr 49 93 3.3870 0.2400 +vdwpr 49 94 3.6760 0.2900 +vdwpr 49 98 3.4250 0.2150 +vdwpr 50 93 3.3870 0.2400 +vdwpr 50 94 3.6760 0.2900 +vdwpr 50 98 3.4250 0.2150 +vdwpr 58 98 3.2130 0.1820 +vdwpr 94 102 4.2360 0.1512 +vdwpr 94 103 4.3790 0.1664 +vdwpr 94 104 4.6360 0.1720 +vdwpr 95 102 4.3150 0.1859 +vdwpr 95 103 4.4480 0.2068 +vdwpr 95 104 4.6900 0.2145 +vdwpr 96 102 4.3450 0.2894 +vdwpr 96 103 4.4750 0.3307 +vdwpr 96 104 4.7110 0.3466 + + + ################################## + ## ## + ## Bond Stretching Parameters ## + ## ## + ################################## + + +bond 1 2 375.00 1.4370 +bond 1 3 482.00 1.3450 +bond 1 4 487.00 1.0280 +bond 1 7 375.00 1.4370 +bond 1 8 374.80 1.4460 +bond 1 39 491.40 1.3250 +bond 1 40 375.00 1.4370 +bond 2 3 345.00 1.5090 +bond 2 6 341.00 1.1120 +bond 2 30 345.00 1.5090 +bond 2 32 345.00 1.5090 +bond 2 41 381.30 1.4480 +bond 3 5 662.00 1.2255 +bond 3 7 345.00 1.5090 +bond 3 8 345.00 1.5090 +bond 3 15 482.00 1.3450 +bond 3 40 345.00 1.5090 +bond 6 7 341.00 1.1120 +bond 6 16 341.00 1.1120 +bond 6 40 341.00 1.1120 +bond 7 7 323.00 1.5250 +bond 7 8 323.00 1.5250 +bond 7 10 410.00 1.4130 +bond 7 15 375.00 1.4370 +bond 7 16 323.00 1.5250 +bond 7 30 345.00 1.5090 +bond 7 32 345.00 1.5090 +bond 7 41 381.30 1.4480 +bond 8 8 323.00 1.5250 +bond 8 9 341.00 1.1120 +bond 8 10 410.00 1.4130 +bond 8 12 215.80 1.8050 +bond 8 14 215.80 1.8130 +bond 8 17 453.20 1.4990 +bond 8 22 345.00 1.5090 +bond 8 26 453.20 1.4930 +bond 8 30 345.00 1.5090 +bond 8 32 345.00 1.5090 +bond 8 36 323.00 1.5250 +bond 8 37 381.30 1.4480 +bond 9 16 341.00 1.1120 +bond 9 36 341.00 1.1120 +bond 10 11 548.90 0.9470 +bond 12 12 188.50 2.0190 +bond 12 13 278.40 1.3420 +bond 15 16 375.00 1.4370 +bond 16 16 323.00 1.5247 +bond 16 41 381.30 1.4480 +bond 17 17 471.90 1.3887 +bond 17 18 370.50 1.1000 +bond 17 19 431.60 1.3550 +bond 17 21 680.00 1.2747 +bond 19 20 548.90 0.9470 +bond 22 22 471.90 1.3887 +bond 22 23 370.50 1.1010 +bond 22 24 653.90 1.3550 +bond 24 25 467.60 1.0300 +bond 24 26 653.90 1.3730 +bond 24 28 653.90 1.3520 +bond 26 26 539.60 1.3710 +bond 26 27 370.50 1.0810 +bond 26 29 670.00 1.3740 +bond 27 28 370.50 1.0810 +bond 28 29 670.00 1.3270 +bond 30 31 705.00 1.2553 +bond 32 33 705.00 1.2255 +bond 32 34 431.60 1.3498 +bond 34 35 514.40 0.9737 +bond 37 38 461.90 1.0150 +bond 41 42 461.90 1.0150 +bond 43 43 268.00 1.4040 +bond 43 45 340.00 1.4060 +bond 43 46 340.00 1.3700 +bond 43 49 460.00 1.3720 +bond 43 50 340.00 1.3500 +bond 43 56 340.00 1.4370 +bond 43 60 340.00 1.3700 +bond 44 46 400.00 1.3620 +bond 44 49 478.00 1.3350 +bond 44 51 420.00 1.0760 +bond 44 60 400.00 1.3620 +bond 45 47 420.00 1.3550 +bond 45 50 400.00 1.3260 +bond 45 55 390.00 1.4200 +bond 46 68 390.00 1.4320 +bond 46 76 390.00 1.4320 +bond 47 53 540.00 1.0040 +bond 47 59 420.00 1.3610 +bond 48 48 420.00 1.3530 +bond 48 50 400.00 1.3340 +bond 48 51 405.00 1.0810 +bond 48 52 405.00 1.0810 +bond 48 54 400.00 1.3420 +bond 48 55 390.00 1.3810 +bond 48 56 420.00 1.4450 +bond 48 62 360.00 1.4930 +bond 48 63 400.00 1.3420 +bond 50 56 478.00 1.3690 +bond 50 59 400.00 1.3100 +bond 54 56 325.00 1.3970 +bond 54 59 400.00 1.3660 +bond 54 61 512.00 1.0110 +bond 54 68 360.00 1.4150 +bond 54 76 360.00 1.4150 +bond 55 57 408.00 1.0800 +bond 56 58 530.00 1.2240 +bond 56 63 325.00 1.3970 +bond 60 68 390.00 1.4320 +bond 60 76 390.00 1.4320 +bond 61 63 512.00 1.0110 +bond 62 64 384.00 1.0870 +bond 63 68 360.00 1.4150 +bond 63 76 360.00 1.4150 +bond 65 66 384.00 1.4320 +bond 65 68 384.00 1.4140 +bond 66 67 389.50 1.0920 +bond 66 68 320.00 1.5100 +bond 66 72 380.00 1.5020 +bond 67 68 389.50 1.0920 +bond 68 68 320.00 1.5100 +bond 68 69 384.00 1.4100 +bond 68 71 384.00 1.4100 +bond 68 87 384.00 1.4100 +bond 69 70 615.50 0.9710 +bond 70 71 615.50 0.9710 +bond 70 74 615.50 0.9710 +bond 70 86 615.50 0.9710 +bond 70 87 615.50 0.9710 +bond 71 84 320.00 1.6060 +bond 72 73 398.50 1.0920 +bond 72 74 484.00 1.4100 +bond 72 86 484.00 1.4100 +bond 74 84 320.00 1.6060 +bond 75 76 320.00 1.5100 +bond 75 77 384.00 1.4320 +bond 75 78 389.50 1.0920 +bond 75 79 380.00 1.5020 +bond 76 76 320.00 1.5100 +bond 76 77 384.00 1.4140 +bond 76 78 389.50 1.0920 +bond 76 80 384.00 1.4100 +bond 76 88 384.00 1.4100 +bond 79 82 398.50 1.0920 +bond 79 83 484.00 1.4100 +bond 79 89 484.00 1.4100 +bond 80 81 615.50 0.9710 +bond 80 84 320.00 1.6060 +bond 81 83 615.50 0.9710 +bond 81 88 615.50 0.9710 +bond 81 89 615.50 0.9710 +bond 83 84 320.00 1.6060 +bond 84 85 700.00 1.4960 +bond 90 91 556.85 0.9572 + + + ################################ + ## ## + ## Angle Bending Parameters ## + ## ## + ################################ + + +anglep 2 1 3 50.00 122.00 +anglep 2 1 4 32.00 117.00 +anglep 3 1 4 36.00 121.00 +anglep 3 1 7 50.00 122.00 +anglep 3 1 40 50.00 121.00 +anglep 4 1 4 29.50 123.00 +anglep 4 1 7 32.00 117.00 +anglep 4 1 8 13.70 122.40 +anglep 4 1 39 41.70 120.50 +anglep 4 1 40 32.00 117.00 +anglep 8 1 39 52.50 120.40 +angle 1 2 3 55.00 109.80 +angle 1 2 6 55.00 111.00 +angle 1 2 30 61.00 109.60 +angle 1 2 32 61.00 109.60 +angle 3 2 6 39.00 109.50 +angle 3 2 41 75.20 110.70 +angle 6 2 6 40.00 107.60 +angle 6 2 30 39.00 109.50 +angle 6 2 32 39.00 109.50 +angle 6 2 41 59.00 109.30 +anglep 1 3 2 70.00 113.40 +anglep 1 3 5 77.00 124.20 +anglep 1 3 7 70.00 113.40 +anglep 1 3 8 70.00 113.40 +anglep 1 3 40 41.00 113.40 +anglep 2 3 5 80.00 122.40 +anglep 2 3 15 70.00 113.40 +anglep 5 3 7 80.00 122.40 +anglep 5 3 8 80.00 122.40 +anglep 5 3 15 77.00 124.20 +anglep 5 3 40 80.00 122.40 +anglep 7 3 15 70.00 113.40 +anglep 15 3 40 41.00 113.40 +angle 1 7 3 61.00 109.60 +angle 1 7 6 55.00 111.00 +angle 1 7 7 54.00 111.30 +angle 1 7 8 54.00 111.30 +angle 1 7 30 61.00 109.60 +angle 1 7 32 61.00 109.60 +angle 3 7 6 39.00 109.50 +angle 3 7 7 58.00 110.60 +angle 3 7 8 58.00 110.60 +angle 3 7 15 61.00 109.60 +angle 3 7 16 58.00 110.60 +angle 3 7 41 75.20 110.70 +angle 6 7 7 42.00 110.70 +angle 6 7 8 42.00 112.80 +angle 6 7 10 59.00 110.00 108.90 108.70 +angle 6 7 15 55.00 111.00 +angle 6 7 16 42.00 112.80 +angle 6 7 30 39.00 109.50 +angle 6 7 32 39.00 109.50 +angle 6 7 41 59.00 109.30 +angle 7 7 8 48.20 109.50 110.20 111.00 +angle 7 7 10 59.70 107.50 +angle 7 7 30 58.00 110.60 +angle 7 7 41 56.10 108.50 +angle 8 7 8 48.20 109.50 110.20 111.00 +angle 8 7 10 59.70 107.50 +angle 8 7 30 58.00 110.60 +angle 8 7 32 58.00 110.60 +angle 8 7 41 75.20 110.70 +angle 15 7 16 54.00 104.00 +angle 15 7 30 61.00 109.60 +angle 16 7 30 58.00 110.60 +angle 16 7 41 54.00 104.00 +angle 1 8 8 56.10 109.50 +angle 1 8 9 54.60 111.00 +angle 3 8 7 47.60 110.60 +angle 3 8 8 47.60 110.60 +angle 3 8 9 39.00 109.50 +angle 7 8 7 48.20 109.50 110.20 111.00 +angle 7 8 8 48.20 109.50 110.20 111.00 +angle 7 8 9 42.00 110.70 +angle 7 8 10 59.70 107.50 +angle 7 8 12 53.20 108.00 109.50 110.10 +angle 7 8 14 53.20 108.00 109.50 110.10 +angle 7 8 17 38.90 110.60 +angle 7 8 22 48.20 109.50 110.20 111.00 +angle 7 8 26 38.80 112.70 +angle 7 8 30 47.60 110.60 +angle 7 8 32 47.60 110.60 +angle 7 8 36 48.20 109.50 110.20 111.00 +angle 8 8 8 48.20 109.50 110.20 111.00 +angle 8 8 9 42.00 110.70 +angle 8 8 12 53.20 108.00 109.50 110.10 +angle 8 8 30 47.60 110.60 +angle 8 8 32 47.60 110.60 +angle 8 8 36 48.20 109.50 110.20 111.00 +angle 8 8 37 56.10 109.50 +angle 9 8 9 40.00 107.80 +angle 9 8 10 59.00 110.00 108.90 108.70 +angle 9 8 12 53.20 110.80 110.80 108.00 +angle 9 8 14 53.20 110.80 110.80 108.00 +angle 9 8 17 39.60 109.50 109.30 110.40 +angle 9 8 22 61.20 109.80 109.30 110.70 +angle 9 8 26 39.60 109.50 +angle 9 8 30 39.00 109.50 +angle 9 8 32 39.00 109.50 +angle 9 8 36 42.00 110.70 +angle 9 8 37 59.00 109.30 +angle 36 8 37 56.10 109.50 +angle 7 10 11 54.00 106.80 +angle 8 10 11 54.00 106.80 +angle 8 12 8 60.40 95.90 +angle 8 12 12 71.90 101.80 +angle 8 12 13 46.80 96.00 +anglep 3 15 7 50.00 122.00 +anglep 3 15 16 50.00 122.00 +anglep 7 15 16 54.70 112.50 +angle 6 16 6 40.00 107.80 +angle 6 16 15 55.00 111.00 +angle 6 16 16 42.00 110.70 +angle 6 16 41 55.00 111.00 +angle 7 16 9 42.00 110.70 +angle 7 16 16 48.20 104.00 +angle 9 16 9 40.00 107.80 +angle 9 16 16 42.00 110.70 +angle 15 16 16 54.00 104.00 +angle 16 16 16 48.20 104.00 +angle 16 16 41 54.00 104.00 +anglep 8 17 17 33.80 122.30 +anglep 17 17 17 54.70 121.70 +anglep 17 17 18 35.30 120.00 120.50 0.00 +anglep 17 17 19 43.20 120.00 +anglep 17 17 21 60.00 123.57 +angle 17 19 20 25.90 109.00 +anglep 8 22 22 61.90 127.00 +anglep 22 22 22 63.30 120.00 +anglep 22 22 23 35.30 128.00 +anglep 22 22 24 47.50 109.00 +anglep 23 22 24 86.30 122.50 +anglep 22 24 22 86.30 109.00 +anglep 22 24 25 35.30 125.50 +anglep 25 24 26 35.30 125.50 +anglep 25 24 28 35.30 125.50 +anglep 26 24 28 86.30 110.80 +anglep 8 26 24 36.00 122.00 +anglep 8 26 26 36.00 131.00 +anglep 8 26 29 36.00 122.00 +anglep 24 26 26 47.50 104.70 +anglep 24 26 27 38.10 122.50 +anglep 24 26 29 28.80 111.50 +anglep 26 26 27 35.30 128.00 +anglep 26 26 29 47.50 110.50 +anglep 27 26 29 38.10 122.50 +anglep 24 28 24 28.80 110.30 +anglep 24 28 27 38.10 122.50 +anglep 24 28 29 28.80 112.20 +anglep 27 28 29 38.10 122.50 +angle 26 29 28 86.30 104.30 +anglep 2 30 31 80.00 122.40 +anglep 7 30 31 80.00 122.40 +anglep 8 30 31 80.00 122.40 +anglep 8 30 33 80.00 122.40 +anglep 8 30 34 111.50 110.30 +anglep 31 30 31 57.60 134.00 +anglep 2 32 33 80.00 122.40 +anglep 2 32 34 80.00 122.40 +anglep 7 32 33 80.00 122.40 +anglep 7 32 34 80.00 122.40 +anglep 8 32 33 80.00 122.40 +anglep 8 32 34 111.50 110.30 +anglep 33 32 34 122.30 121.50 +angle 30 34 35 49.60 108.70 +angle 32 34 35 49.60 108.70 +angle 8 36 8 48.20 109.50 110.20 111.00 +angle 8 36 9 42.00 110.70 +angle 9 36 9 40.00 107.80 +angle 8 37 38 43.20 110.90 +angle 38 37 38 43.50 107.00 +anglep 1 39 1 28.80 120.00 +angle 1 40 6 55.00 111.00 +angle 3 40 6 39.00 109.50 +angle 6 40 6 40.00 107.80 +angle 2 41 42 43.20 108.50 +angle 7 41 16 54.70 112.50 +angle 7 41 42 43.20 108.50 +angle 16 41 42 43.20 110.90 +angle 42 41 42 43.20 105.40 +anglep 43 43 45 42.00 115.90 +anglep 43 43 46 60.00 105.88 +anglep 43 43 49 60.00 111.38 +anglep 43 43 50 60.00 128.40 +anglep 43 43 56 42.00 118.49 +anglep 43 43 60 60.00 105.88 +anglep 45 43 49 90.00 132.47 +anglep 46 43 50 90.00 126.37 +anglep 49 43 56 90.00 130.37 +anglep 50 43 60 90.00 126.37 +anglep 46 44 49 130.00 113.18 +anglep 46 44 51 41.00 121.27 +anglep 49 44 51 40.00 124.53 +anglep 49 44 60 130.00 113.18 +anglep 51 44 60 41.00 121.27 +anglep 43 45 47 32.00 122.40 +anglep 43 45 50 60.00 119.30 +anglep 47 45 50 135.00 118.00 +anglep 47 45 55 32.00 119.50 +anglep 50 45 55 60.00 122.50 +anglep 43 46 44 42.00 107.20 +anglep 43 46 68 48.00 126.48 +anglep 43 46 76 48.00 126.48 +anglep 44 46 68 58.00 125.40 +anglep 44 46 76 58.00 125.40 +angle 45 47 53 41.50 120.00 +angle 53 47 53 19.50 120.00 +angle 53 47 59 41.50 120.00 +anglep 48 48 51 32.50 121.46 +anglep 48 48 52 32.50 121.46 +anglep 48 48 54 130.00 123.56 +anglep 48 48 56 130.00 118.99 +anglep 48 48 62 28.00 123.52 +anglep 48 48 63 130.00 123.56 +anglep 50 48 50 135.00 127.90 +anglep 50 48 52 41.20 116.07 +anglep 50 48 55 60.00 123.28 +anglep 51 48 54 40.00 115.75 +anglep 51 48 55 32.50 121.49 +anglep 51 48 63 40.00 115.75 +anglep 52 48 56 32.50 116.87 +anglep 54 48 55 130.00 120.74 +anglep 55 48 63 130.00 120.74 +anglep 56 48 62 28.00 118.28 +angle 43 49 44 128.00 103.47 +angle 43 50 48 128.00 110.86 +angle 43 50 59 128.00 111.66 +angle 45 50 48 128.00 118.67 +angle 45 50 56 128.00 120.30 +angle 48 50 48 128.00 117.03 +anglep 48 54 56 80.00 123.84 +anglep 48 54 61 32.80 120.00 +anglep 48 54 68 52.00 116.20 +anglep 48 54 76 52.00 116.20 +anglep 56 54 56 125.00 128.52 +anglep 56 54 59 80.00 127.19 +anglep 56 54 61 43.50 114.97 +anglep 56 54 68 48.00 119.00 +anglep 56 54 76 48.00 119.00 +anglep 59 54 61 32.80 119.77 +anglep 45 55 48 112.00 116.50 +anglep 45 55 55 112.00 118.66 +anglep 45 55 57 37.60 121.50 +anglep 47 55 55 32.00 120.63 +anglep 48 55 48 112.00 116.90 +anglep 48 55 57 37.60 120.47 +anglep 43 56 54 45.00 109.14 +anglep 43 56 58 85.00 131.17 +anglep 43 56 63 45.00 109.14 +anglep 48 56 54 45.00 113.34 +anglep 48 56 58 85.00 126.37 +anglep 48 56 63 45.00 113.34 +anglep 50 56 54 60.00 117.24 +anglep 50 56 58 135.00 124.73 +anglep 54 56 54 60.00 113.94 +anglep 54 56 58 60.00 120.00 +anglep 54 56 63 60.00 113.94 +anglep 58 56 63 60.00 120.00 +anglep 63 56 63 60.00 113.94 +anglep 47 59 50 135.00 119.25 +anglep 47 59 54 32.00 117.10 +anglep 47 59 63 32.00 117.10 +anglep 50 59 54 60.00 123.65 +anglep 43 60 44 42.00 107.20 +anglep 43 60 68 48.00 126.48 +anglep 43 60 76 48.00 126.48 +anglep 44 60 68 58.00 125.40 +anglep 44 60 76 58.00 125.40 +angle 48 62 64 61.40 110.61 +angle 64 62 64 34.50 109.06 +anglep 48 63 56 80.00 123.84 +anglep 48 63 61 32.80 120.00 +anglep 48 63 68 52.00 116.20 +anglep 48 63 76 52.00 116.20 +anglep 56 63 56 125.00 128.52 +anglep 56 63 61 43.50 114.97 +anglep 56 63 68 48.00 119.00 +anglep 56 63 76 48.00 119.00 +angle 66 65 68 88.25 109.90 +angle 65 66 67 54.50 108.50 +angle 65 66 68 87.95 105.30 +angle 65 66 72 64.50 109.20 +angle 67 66 68 38.00 109.25 +angle 67 66 72 39.40 108.50 +angle 68 66 72 50.50 115.00 +angle 46 68 65 49.34 106.60 +angle 46 68 67 54.78 106.60 +angle 46 68 68 87.95 112.80 +angle 54 68 65 49.34 106.60 +angle 54 68 67 54.78 106.60 +angle 54 68 68 87.95 112.80 +angle 60 68 65 49.34 106.60 +angle 60 68 67 54.78 106.60 +angle 60 68 68 87.95 112.80 +angle 63 68 65 49.34 106.60 +angle 63 68 67 54.78 106.60 +angle 63 68 68 87.95 112.80 +angle 65 68 67 54.50 110.62 +angle 65 68 68 87.95 106.58 +angle 66 68 67 38.00 111.30 +angle 66 68 68 60.30 102.10 +angle 66 68 71 87.25 109.50 +angle 66 68 87 87.25 109.50 +angle 67 68 68 38.00 111.65 +angle 67 68 69 54.20 109.90 +angle 67 68 71 54.20 111.30 +angle 67 68 87 54.20 111.30 +angle 68 68 68 60.40 101.70 +angle 68 68 69 86.54 110.85 +angle 68 68 71 87.95 108.25 +angle 68 68 87 87.95 108.25 +angle 68 69 70 63.26 104.70 +angle 68 71 70 64.50 107.65 +angle 68 71 84 78.00 110.00 +angle 66 72 73 37.35 108.65 +angle 66 72 74 75.40 108.30 +angle 66 72 86 75.40 108.30 +angle 73 72 73 34.20 108.38 +angle 73 72 74 51.75 110.80 +angle 73 72 86 51.75 110.80 +angle 70 74 72 64.50 107.65 +angle 72 74 84 78.00 110.00 +angle 76 75 77 87.95 105.30 +angle 76 75 78 38.00 109.25 +angle 76 75 79 50.50 115.00 +angle 77 75 78 54.50 108.50 +angle 77 75 79 64.50 109.20 +angle 78 75 79 39.40 108.50 +angle 46 76 76 87.95 112.80 +angle 46 76 77 49.34 106.60 +angle 46 76 78 54.78 106.60 +angle 54 76 76 87.95 112.80 +angle 54 76 77 49.34 106.60 +angle 54 76 78 54.78 106.60 +angle 60 76 76 87.95 112.80 +angle 60 76 77 49.34 106.60 +angle 60 76 78 54.78 106.60 +angle 63 76 76 87.95 112.80 +angle 63 76 77 49.34 106.60 +angle 63 76 78 54.78 106.60 +angle 75 76 76 60.30 102.10 +angle 75 76 78 38.00 111.30 +angle 75 76 80 87.25 109.50 +angle 75 76 88 87.25 109.50 +angle 76 76 76 60.40 101.70 +angle 76 76 77 87.95 106.58 +angle 76 76 78 38.00 111.65 +angle 76 76 80 87.95 110.50 +angle 76 76 88 87.95 110.50 +angle 77 76 78 54.50 110.62 +angle 78 76 78 26.23 109.30 +angle 78 76 80 54.20 111.30 +angle 78 76 88 54.20 111.30 +angle 75 77 76 88.25 109.90 +angle 75 79 82 37.35 108.65 +angle 75 79 83 75.40 108.30 +angle 75 79 89 75.40 108.30 +angle 82 79 82 34.20 108.38 +angle 82 79 83 51.75 110.80 +angle 82 79 89 51.75 110.80 +angle 76 80 81 64.50 107.65 +angle 76 80 84 78.00 110.00 +angle 79 83 81 64.50 107.65 +angle 79 83 84 78.00 110.00 +angle 71 84 74 64.00 98.40 +angle 71 84 85 90.00 108.80 +angle 74 84 85 90.00 108.80 +angle 80 84 83 64.00 98.40 +angle 80 84 85 90.00 108.80 +angle 83 84 85 90.00 108.80 +angle 85 84 85 125.00 122.90 +angle 70 86 72 64.50 107.65 +angle 68 87 70 64.50 107.65 +angle 76 88 81 64.50 107.65 +angle 79 89 81 64.50 107.65 +angle 91 90 91 48.70 108.50 + + + ############################### + ## ## + ## Stretch-Bend Parameters ## + ## ## + ############################### + + +strbnd 2 1 3 7.20 7.20 +strbnd 2 1 4 4.30 4.30 +strbnd 3 1 4 4.30 4.30 +strbnd 3 1 7 7.20 7.20 +strbnd 3 1 40 7.20 7.20 +strbnd 4 1 7 4.30 4.30 +strbnd 4 1 8 4.30 4.30 +strbnd 4 1 39 4.30 4.30 +strbnd 4 1 40 4.30 4.30 +strbnd 8 1 39 7.20 7.20 +strbnd 1 2 3 18.70 18.70 +strbnd 1 2 6 11.50 11.50 +strbnd 1 2 30 18.70 18.70 +strbnd 1 2 32 18.70 18.70 +strbnd 3 2 6 11.50 11.50 +strbnd 3 2 41 18.70 18.70 +strbnd 6 2 30 11.50 11.50 +strbnd 6 2 32 11.50 11.50 +strbnd 6 2 41 11.50 11.50 +strbnd 1 3 2 18.70 18.70 +strbnd 1 3 5 18.70 18.70 +strbnd 1 3 7 18.70 18.70 +strbnd 1 3 8 18.70 18.70 +strbnd 1 3 40 18.70 18.70 +strbnd 2 3 5 18.70 18.70 +strbnd 2 3 15 18.70 18.70 +strbnd 5 3 7 18.70 18.70 +strbnd 5 3 8 18.70 18.70 +strbnd 5 3 15 18.70 18.70 +strbnd 5 3 40 18.70 18.70 +strbnd 7 3 15 18.70 18.70 +strbnd 15 3 40 18.70 18.70 +strbnd 1 7 3 18.70 18.70 +strbnd 1 7 6 11.50 11.50 +strbnd 1 7 7 18.70 18.70 +strbnd 1 7 8 18.70 18.70 +strbnd 1 7 30 18.70 18.70 +strbnd 1 7 32 18.70 18.70 +strbnd 3 7 6 11.50 11.50 +strbnd 3 7 7 18.70 18.70 +strbnd 3 7 8 18.70 18.70 +strbnd 3 7 15 18.70 18.70 +strbnd 3 7 16 18.70 18.70 +strbnd 3 7 41 18.70 18.70 +strbnd 6 7 7 11.50 11.50 +strbnd 6 7 8 11.50 11.50 +strbnd 6 7 10 11.50 11.50 +strbnd 6 7 15 11.50 11.50 +strbnd 6 7 16 11.50 11.50 +strbnd 6 7 30 11.50 11.50 +strbnd 6 7 32 11.50 11.50 +strbnd 6 7 41 11.50 11.50 +strbnd 7 7 8 18.70 18.70 +strbnd 7 7 10 18.70 18.70 +strbnd 7 7 30 18.70 18.70 +strbnd 7 7 41 18.70 18.70 +strbnd 8 7 8 18.70 18.70 +strbnd 8 7 10 18.70 18.70 +strbnd 8 7 30 18.70 18.70 +strbnd 8 7 32 18.70 18.70 +strbnd 8 7 41 18.70 18.70 +strbnd 15 7 16 18.70 18.70 +strbnd 15 7 30 18.70 18.70 +strbnd 16 7 30 18.70 18.70 +strbnd 16 7 41 18.70 18.70 +strbnd 1 8 8 18.70 18.70 +strbnd 1 8 9 11.50 11.50 +strbnd 3 8 7 18.70 18.70 +strbnd 3 8 8 18.70 18.70 +strbnd 3 8 9 11.50 11.50 +strbnd 7 8 7 18.70 18.70 +strbnd 7 8 8 18.70 18.70 +strbnd 7 8 9 11.50 11.50 +strbnd 7 8 10 18.70 18.70 +strbnd 7 8 12 18.70 18.70 +strbnd 7 8 14 18.70 18.70 +strbnd 7 8 17 18.70 18.70 +strbnd 7 8 22 18.70 18.70 +strbnd 7 8 26 18.70 18.70 +strbnd 7 8 30 18.70 18.70 +strbnd 7 8 32 18.70 18.70 +strbnd 7 8 36 18.70 18.70 +strbnd 8 8 8 18.70 18.70 +strbnd 8 8 9 11.50 11.50 +strbnd 8 8 12 18.70 18.70 +strbnd 8 8 30 18.70 18.70 +strbnd 8 8 32 18.70 18.70 +strbnd 8 8 36 18.70 18.70 +strbnd 8 8 37 18.70 18.70 +strbnd 9 8 10 11.50 11.50 +strbnd 9 8 12 11.50 11.50 +strbnd 9 8 14 11.50 11.50 +strbnd 9 8 17 11.50 11.50 +strbnd 9 8 22 11.50 11.50 +strbnd 9 8 26 11.50 11.50 +strbnd 9 8 30 11.50 11.50 +strbnd 9 8 32 11.50 11.50 +strbnd 9 8 36 11.50 11.50 +strbnd 9 8 37 11.50 11.50 +strbnd 36 8 37 18.70 18.70 +strbnd 7 10 11 12.95 12.95 +strbnd 8 10 11 12.95 12.95 +strbnd 8 12 8 -5.75 -5.75 +strbnd 8 12 12 -5.75 -5.75 +strbnd 8 12 13 1.45 1.45 +strbnd 3 15 7 7.20 7.20 +strbnd 3 15 16 7.20 7.20 +strbnd 7 15 16 7.20 7.20 +strbnd 6 16 15 11.50 11.50 +strbnd 6 16 16 11.50 11.50 +strbnd 6 16 41 11.50 11.50 +strbnd 7 16 9 11.50 11.50 +strbnd 7 16 16 18.70 18.70 +strbnd 9 16 16 11.50 11.50 +strbnd 15 16 16 18.70 18.70 +strbnd 16 16 16 18.70 18.70 +strbnd 16 16 41 18.70 18.70 +strbnd 8 17 17 18.70 18.70 +strbnd 17 17 17 18.70 18.70 +strbnd 17 17 18 11.50 11.50 +strbnd 17 17 19 18.70 18.70 +strbnd 17 17 21 18.70 18.70 +strbnd 17 19 20 12.95 12.95 +strbnd 8 22 22 18.70 18.70 +strbnd 22 22 22 18.70 18.70 +strbnd 22 22 23 11.50 11.50 +strbnd 22 22 24 18.70 18.70 +strbnd 23 22 24 11.50 11.50 +strbnd 22 24 22 14.40 14.40 +strbnd 22 24 25 4.30 4.30 +strbnd 25 24 26 4.30 4.30 +strbnd 25 24 28 4.30 4.30 +strbnd 26 24 28 14.40 14.40 +strbnd 8 26 24 18.70 18.70 +strbnd 8 26 26 18.70 18.70 +strbnd 8 26 29 18.70 18.70 +strbnd 24 26 26 18.70 18.70 +strbnd 24 26 27 11.50 11.50 +strbnd 24 26 29 18.70 18.70 +strbnd 26 26 27 11.50 11.50 +strbnd 26 26 29 18.70 18.70 +strbnd 27 26 29 11.50 11.50 +strbnd 24 28 24 18.70 18.70 +strbnd 24 28 27 11.50 11.50 +strbnd 24 28 29 18.70 18.70 +strbnd 27 28 29 11.50 11.50 +strbnd 26 29 28 14.40 14.40 +strbnd 2 30 31 18.70 18.70 +strbnd 7 30 31 18.70 18.70 +strbnd 8 30 31 18.70 18.70 +strbnd 8 30 33 18.70 18.70 +strbnd 8 30 34 18.70 18.70 +strbnd 31 30 31 18.70 18.70 +strbnd 2 32 33 18.70 18.70 +strbnd 2 32 34 18.70 18.70 +strbnd 7 32 33 18.70 18.70 +strbnd 7 32 34 18.70 18.70 +strbnd 8 32 33 18.70 18.70 +strbnd 8 32 34 18.70 18.70 +strbnd 33 32 34 18.70 18.70 +strbnd 8 36 8 18.70 18.70 +strbnd 8 36 9 11.50 11.50 +strbnd 9 36 9 11.50 11.50 +strbnd 8 37 38 4.30 4.30 +strbnd 1 39 1 18.70 18.70 +strbnd 1 40 6 11.50 11.50 +strbnd 3 40 6 11.50 11.50 +strbnd 2 41 42 4.30 4.30 +strbnd 7 41 16 7.20 7.20 +strbnd 7 41 42 4.30 4.30 +strbnd 16 41 42 4.30 4.30 +strbnd 43 43 45 18.70 18.70 +strbnd 43 43 46 18.70 18.70 +strbnd 43 43 49 18.70 18.70 +strbnd 43 43 50 18.70 18.70 +strbnd 43 43 56 18.70 18.70 +strbnd 43 43 60 18.70 18.70 +strbnd 45 43 49 18.70 18.70 +strbnd 46 43 50 18.70 18.70 +strbnd 49 43 56 18.70 18.70 +strbnd 50 43 60 18.70 18.70 +strbnd 46 44 49 18.70 18.70 +strbnd 46 44 51 11.50 11.50 +strbnd 49 44 51 11.50 11.50 +strbnd 49 44 60 18.70 18.70 +strbnd 51 44 60 11.50 11.50 +strbnd 43 45 47 18.70 18.70 +strbnd 43 45 50 18.70 18.70 +strbnd 47 45 50 18.70 18.70 +strbnd 47 45 55 18.70 18.70 +strbnd 50 45 55 18.70 18.70 +strbnd 43 46 44 14.40 14.40 +strbnd 43 46 68 14.40 14.40 +strbnd 43 46 76 14.40 14.40 +strbnd 44 46 68 14.40 14.40 +strbnd 44 46 76 14.40 14.40 +strbnd 45 47 53 4.30 4.30 +strbnd 53 47 53 4.30 4.30 +strbnd 53 47 59 4.30 4.30 +strbnd 48 48 51 11.50 11.50 +strbnd 48 48 52 18.70 18.70 +strbnd 48 48 54 18.70 18.70 +strbnd 48 48 56 18.70 18.70 +strbnd 48 48 62 18.70 18.70 +strbnd 48 48 63 18.70 18.70 +strbnd 50 48 50 18.70 18.70 +strbnd 50 48 52 18.70 18.70 +strbnd 50 48 55 18.70 18.70 +strbnd 51 48 54 11.50 11.50 +strbnd 51 48 55 11.50 11.50 +strbnd 51 48 63 11.50 11.50 +strbnd 52 48 56 18.70 18.70 +strbnd 54 48 55 18.70 18.70 +strbnd 55 48 63 18.70 18.70 +strbnd 56 48 62 18.70 18.70 +strbnd 43 49 44 14.40 14.40 +strbnd 43 50 48 14.40 14.40 +strbnd 43 50 59 14.40 14.40 +strbnd 45 50 48 14.40 14.40 +strbnd 45 50 56 14.40 14.40 +strbnd 48 50 48 14.40 14.40 +strbnd 48 54 56 14.40 14.40 +strbnd 48 54 61 4.30 4.30 +strbnd 48 54 68 14.40 14.40 +strbnd 48 54 76 14.40 14.40 +strbnd 56 54 56 7.20 7.20 +strbnd 56 54 59 7.20 7.20 +strbnd 56 54 61 4.30 4.30 +strbnd 56 54 68 14.40 14.40 +strbnd 56 54 76 14.40 14.40 +strbnd 59 54 61 4.30 4.30 +strbnd 45 55 48 18.70 18.70 +strbnd 45 55 55 18.70 18.70 +strbnd 45 55 57 18.70 18.70 +strbnd 47 55 55 18.70 18.70 +strbnd 48 55 48 18.70 18.70 +strbnd 48 55 57 18.70 18.70 +strbnd 43 56 54 18.70 18.70 +strbnd 43 56 58 18.70 18.70 +strbnd 43 56 63 18.70 18.70 +strbnd 48 56 54 18.70 18.70 +strbnd 48 56 58 18.70 18.70 +strbnd 48 56 63 18.70 18.70 +strbnd 50 56 54 18.70 18.70 +strbnd 50 56 58 18.70 18.70 +strbnd 54 56 54 18.70 18.70 +strbnd 54 56 58 18.70 18.70 +strbnd 54 56 63 18.70 18.70 +strbnd 58 56 63 18.70 18.70 +strbnd 63 56 63 18.70 18.70 +strbnd 47 59 50 18.70 18.70 +strbnd 47 59 54 18.70 18.70 +strbnd 47 59 63 18.70 18.70 +strbnd 50 59 54 18.70 18.70 +strbnd 43 60 44 14.40 14.40 +strbnd 43 60 68 14.40 14.40 +strbnd 43 60 76 14.40 14.40 +strbnd 44 60 68 14.40 14.40 +strbnd 44 60 76 14.40 14.40 +strbnd 48 62 64 11.50 11.50 +strbnd 64 62 64 11.50 11.50 +strbnd 48 63 56 7.20 7.20 +strbnd 48 63 61 4.30 4.30 +strbnd 48 63 68 14.40 14.40 +strbnd 48 63 76 14.40 14.40 +strbnd 56 63 56 18.70 18.70 +strbnd 56 63 61 4.30 4.30 +strbnd 56 63 68 14.40 14.40 +strbnd 56 63 76 14.40 14.40 +strbnd 65 66 67 11.50 11.50 +strbnd 65 66 68 18.70 18.70 +strbnd 65 66 72 18.70 18.70 +strbnd 67 66 68 11.50 11.50 +strbnd 67 66 72 11.50 11.50 +strbnd 68 66 69 18.70 18.70 +strbnd 68 66 72 18.70 18.70 +strbnd 46 68 65 18.70 18.70 +strbnd 46 68 67 11.50 11.50 +strbnd 46 68 68 18.70 18.70 +strbnd 54 68 65 18.70 18.70 +strbnd 54 68 67 11.50 11.50 +strbnd 54 68 68 18.70 18.70 +strbnd 60 68 65 18.70 18.70 +strbnd 60 68 67 11.50 11.50 +strbnd 60 68 68 18.70 18.70 +strbnd 63 68 65 18.70 18.70 +strbnd 63 68 67 11.50 11.50 +strbnd 63 68 68 18.70 18.70 +strbnd 65 68 67 11.50 11.50 +strbnd 65 68 68 18.70 18.70 +strbnd 66 68 67 11.50 11.50 +strbnd 66 68 68 18.70 18.70 +strbnd 66 68 71 18.70 18.70 +strbnd 66 68 87 18.70 18.70 +strbnd 67 68 68 11.50 11.50 +strbnd 67 68 69 11.50 11.50 +strbnd 67 68 71 11.50 11.50 +strbnd 67 68 87 11.50 11.50 +strbnd 68 68 68 18.70 18.70 +strbnd 68 68 69 18.70 18.70 +strbnd 68 68 71 18.70 18.70 +strbnd 68 68 87 18.70 18.70 +strbnd 66 72 73 11.50 11.50 +strbnd 66 72 74 18.70 18.70 +strbnd 66 72 86 18.70 18.70 +strbnd 73 72 74 11.50 11.50 +strbnd 73 72 86 11.50 11.50 +strbnd 72 74 84 14.40 14.40 +strbnd 76 75 77 18.70 18.70 +strbnd 76 75 78 11.50 11.50 +strbnd 76 75 79 18.70 18.70 +strbnd 77 75 78 11.50 11.50 +strbnd 77 75 79 18.70 18.70 +strbnd 78 75 79 11.50 11.50 +strbnd 46 76 76 18.70 18.70 +strbnd 46 76 77 18.70 18.70 +strbnd 46 76 78 11.50 11.50 +strbnd 54 76 76 18.70 18.70 +strbnd 54 76 77 18.70 18.70 +strbnd 54 76 78 11.50 11.50 +strbnd 60 76 76 18.70 18.70 +strbnd 60 76 77 18.70 18.70 +strbnd 60 76 78 11.50 11.50 +strbnd 63 76 76 18.70 18.70 +strbnd 63 76 77 18.70 18.70 +strbnd 63 76 78 11.50 11.50 +strbnd 75 76 76 18.70 18.70 +strbnd 75 76 78 11.50 11.50 +strbnd 75 76 80 18.70 18.70 +strbnd 75 76 88 18.70 18.70 +strbnd 76 76 76 18.70 18.70 +strbnd 76 76 77 18.70 18.70 +strbnd 76 76 78 11.50 11.50 +strbnd 76 76 80 18.70 18.70 +strbnd 76 76 88 18.70 18.70 +strbnd 77 76 78 11.50 11.50 +strbnd 78 76 80 11.50 11.50 +strbnd 78 76 88 11.50 11.50 +strbnd 75 79 82 11.50 11.50 +strbnd 75 79 83 18.70 18.70 +strbnd 75 79 89 18.70 18.70 +strbnd 82 79 83 11.50 11.50 +strbnd 82 79 89 11.50 11.50 +strbnd 79 83 84 14.40 14.40 + + + ############################### + ## ## + ## Urey-Bradley Parameters ## + ## ## + ############################### + + +ureybrad 91 90 91 -7.60 1.5537 + + + #################################### + ## ## + ## Out-of-Plane Bend Parameters ## + ## ## + #################################### + + +opbend 2 1 0 0 41.70 +opbend 3 1 0 0 70.50 +opbend 4 1 0 0 12.90 +opbend 7 1 0 0 41.70 +opbend 8 1 0 0 0.70 +opbend 39 1 0 0 3.60 +opbend 40 1 0 0 41.70 +opbend 1 3 0 0 107.90 +opbend 2 3 0 0 49.60 +opbend 5 3 0 0 54.00 +opbend 7 3 0 0 49.60 +opbend 8 3 0 0 20.90 +opbend 15 3 0 0 49.60 +opbend 40 3 0 0 49.60 +opbend 3 15 0 0 14.40 +opbend 7 15 0 0 14.40 +opbend 16 15 0 0 14.40 +opbend 40 15 0 0 14.40 +opbend 8 17 0 0 14.40 +opbend 17 17 0 0 14.40 +opbend 18 17 0 0 15.10 +opbend 19 17 0 0 14.40 +opbend 21 17 0 0 14.40 +opbend 8 22 0 0 14.40 +opbend 22 22 0 0 14.40 +opbend 23 22 0 0 15.10 +opbend 24 22 0 0 14.40 +opbend 22 24 0 0 34.50 +opbend 25 24 0 0 12.90 +opbend 26 24 0 0 15.10 +opbend 28 24 0 0 15.10 +opbend 8 26 0 0 14.40 +opbend 24 26 0 0 14.40 +opbend 26 26 0 0 14.40 +opbend 27 26 0 0 14.40 +opbend 29 26 0 0 14.40 +opbend 24 28 0 0 14.40 +opbend 27 28 0 0 14.40 +opbend 29 28 0 0 14.40 +opbend 2 30 0 0 121.60 +opbend 7 30 0 0 121.60 +opbend 8 30 0 0 121.60 +opbend 31 30 0 0 118.70 +opbend 2 32 0 0 121.60 +opbend 7 32 0 0 121.60 +opbend 8 32 0 0 121.60 +opbend 33 32 0 0 118.70 +opbend 34 32 0 0 133.10 +opbend 1 39 0 0 14.40 +opbend 43 43 45 49 7.94 +opbend 43 43 46 50 5.87 +opbend 43 43 49 56 6.92 +opbend 43 43 50 60 5.87 +opbend 45 43 43 49 7.94 +opbend 46 43 43 50 5.87 +opbend 49 43 43 45 7.94 +opbend 49 43 43 56 6.92 +opbend 50 43 43 46 5.87 +opbend 50 43 43 60 5.87 +opbend 56 43 43 49 6.92 +opbend 60 43 43 50 5.87 +opbend 46 44 49 51 8.88 +opbend 49 44 46 51 8.88 +opbend 49 44 51 60 8.88 +opbend 51 44 46 49 8.88 +opbend 51 44 49 60 8.88 +opbend 60 44 49 51 8.88 +opbend 43 45 47 50 12.74 +opbend 47 45 43 50 12.74 +opbend 47 45 50 55 12.54 +opbend 50 45 43 47 12.74 +opbend 50 45 47 55 12.54 +opbend 55 45 47 50 12.54 +opbend 43 46 44 68 8.11 +opbend 43 46 44 76 8.11 +opbend 44 46 43 68 8.11 +opbend 44 46 43 76 8.11 +opbend 68 46 43 44 8.11 +opbend 76 46 43 44 8.11 +opbend 48 48 51 54 13.05 +opbend 48 48 51 63 13.05 +opbend 48 48 52 56 9.28 +opbend 48 48 56 62 8.50 +opbend 50 48 50 52 5.91 +opbend 51 48 48 54 13.05 +opbend 51 48 48 63 13.05 +opbend 51 48 54 55 10.31 +opbend 51 48 55 63 10.31 +opbend 52 48 48 56 9.28 +opbend 52 48 50 50 10.96 +opbend 54 48 48 51 13.05 +opbend 54 48 51 55 10.31 +opbend 55 48 51 54 10.31 +opbend 55 48 51 63 10.31 +opbend 56 48 48 52 9.28 +opbend 56 48 48 62 8.50 +opbend 62 48 48 56 8.50 +opbend 63 48 48 51 13.05 +opbend 63 48 51 55 10.31 +opbend 48 54 56 68 2.17 +opbend 48 54 56 76 2.17 +opbend 56 54 48 68 2.17 +opbend 56 54 48 76 2.17 +opbend 56 54 56 61 7.47 +opbend 56 54 59 61 7.05 +opbend 59 54 56 61 7.05 +opbend 61 54 56 56 7.47 +opbend 61 54 56 59 7.05 +opbend 68 54 48 56 2.17 +opbend 76 54 48 56 2.17 +opbend 45 55 48 57 10.23 +opbend 45 55 48 57 10.23 +opbend 48 55 45 57 10.23 +opbend 48 55 45 57 10.23 +opbend 48 55 48 57 10.34 +opbend 57 55 45 48 10.23 +opbend 57 55 45 48 10.23 +opbend 57 55 48 48 13.17 +opbend 43 56 54 58 13.16 +opbend 43 56 58 63 13.16 +opbend 48 56 54 58 12.64 +opbend 48 56 58 63 12.64 +opbend 50 56 54 58 12.62 +opbend 50 56 58 63 12.62 +opbend 54 56 43 58 13.16 +opbend 54 56 48 58 12.64 +opbend 54 56 50 58 12.62 +opbend 54 56 54 58 7.50 +opbend 54 56 58 63 7.50 +opbend 58 56 43 54 70.16 +opbend 58 56 43 63 70.16 +opbend 58 56 48 54 70.64 +opbend 58 56 48 63 70.64 +opbend 58 56 50 54 70.62 +opbend 58 56 50 63 70.62 +opbend 58 56 54 54 71.00 +opbend 58 56 54 63 71.00 +opbend 58 56 54 63 71.00 +opbend 58 56 63 63 71.00 +opbend 63 56 43 58 13.16 +opbend 63 56 48 58 12.64 +opbend 63 56 50 58 12.62 +opbend 63 56 54 58 7.50 +opbend 63 56 58 63 7.50 +opbend 47 59 50 54 12.45 +opbend 47 59 50 63 12.45 +opbend 50 59 47 54 12.45 +opbend 50 59 47 63 12.45 +opbend 54 59 47 50 12.45 +opbend 63 59 47 50 12.45 +opbend 43 60 44 68 8.11 +opbend 43 60 44 76 8.11 +opbend 44 60 43 68 8.11 +opbend 44 60 43 76 8.11 +opbend 68 60 43 44 8.11 +opbend 76 60 43 44 8.11 +opbend 48 63 56 68 2.17 +opbend 48 63 56 76 2.17 +opbend 56 63 48 68 2.17 +opbend 56 63 48 76 2.17 +opbend 56 63 56 61 7.47 +opbend 56 63 59 61 7.05 +opbend 59 63 56 61 7.05 +opbend 61 63 56 56 7.47 +opbend 61 63 56 59 7.05 +opbend 68 63 48 56 2.17 +opbend 76 63 48 56 2.17 + + + ############################ + ## ## + ## Torsional Parameters ## + ## ## + ############################ + + +torsion 3 1 2 3 -3.805 0.0 1 1.646 180.0 2 1.239 0.0 3 +torsion 3 1 2 6 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 3 1 2 30 -0.856 0.0 1 0.048 180.0 2 -1.842 0.0 3 +torsion 3 1 2 32 -6.037 0.0 1 -0.396 180.0 2 2.176 0.0 3 +torsion 4 1 2 3 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 4 1 2 6 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 4 1 2 30 0.000 0.0 1 8.000 180.0 2 0.000 0.0 3 +torsion 4 1 2 32 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 2 1 3 2 -1.000 0.0 1 2.000 180.0 2 2.000 0.0 3 +torsion 2 1 3 5 1.000 0.0 1 2.250 180.0 2 -2.250 0.0 3 +torsion 2 1 3 7 -1.000 0.0 1 2.000 180.0 2 2.000 0.0 3 +torsion 2 1 3 40 -1.000 0.0 1 2.000 180.0 2 2.000 0.0 3 +torsion 4 1 3 2 0.000 0.0 1 1.000 180.0 2 0.800 0.0 3 +torsion 4 1 3 5 0.000 0.0 1 1.000 180.0 2 -0.550 0.0 3 +torsion 4 1 3 7 0.000 0.0 1 1.000 180.0 2 0.800 0.0 3 +torsion 4 1 3 8 0.000 0.0 1 1.000 180.0 2 0.800 0.0 3 +torsion 4 1 3 40 0.000 0.0 1 1.000 180.0 2 0.800 0.0 3 +torsion 7 1 3 2 -1.000 0.0 1 2.000 180.0 2 2.000 0.0 3 +torsion 7 1 3 5 1.000 0.0 1 2.250 180.0 2 -2.250 0.0 3 +torsion 7 1 3 7 -1.000 0.0 1 2.000 180.0 2 2.000 0.0 3 +torsion 7 1 3 40 -1.000 0.0 1 2.000 180.0 2 2.000 0.0 3 +torsion 40 1 3 2 -1.000 0.0 1 2.000 180.0 2 2.000 0.0 3 +torsion 40 1 3 5 1.000 0.0 1 2.250 180.0 2 -2.250 0.0 3 +torsion 40 1 3 7 -1.000 0.0 1 2.000 180.0 2 2.000 0.0 3 +torsion 3 1 7 3 -1.407 0.0 1 -0.068 180.0 2 0.000 0.0 3 +torsion 3 1 7 6 0.000 0.0 1 0.000 180.0 2 -0.126 0.0 3 +torsion 3 1 7 7 2.576 0.0 1 1.011 180.0 2 0.825 0.0 3 +torsion 3 1 7 8 2.576 0.0 1 1.011 180.0 2 0.825 0.0 3 +torsion 3 1 7 30 -0.856 0.0 1 0.048 180.0 2 -1.842 0.0 3 +torsion 3 1 7 32 -2.296 0.0 1 -0.249 180.0 2 -0.097 0.0 3 +torsion 4 1 7 3 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 4 1 7 6 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 4 1 7 7 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 4 1 7 8 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 4 1 7 30 0.000 0.0 1 8.000 180.0 2 0.000 0.0 3 +torsion 4 1 7 32 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 4 1 8 8 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 4 1 8 9 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 39 1 8 8 -0.150 0.0 1 0.550 180.0 2 -0.450 0.0 3 +torsion 39 1 8 9 0.000 0.0 1 0.000 180.0 2 -0.126 0.0 3 +torsion 4 1 39 1 0.000 0.0 1 4.000 180.0 2 0.000 0.0 3 +torsion 8 1 39 1 0.000 0.0 1 4.500 180.0 2 0.000 0.0 3 +torsion 3 1 40 6 0.000 0.0 1 0.000 180.0 2 -0.126 0.0 3 +torsion 4 1 40 6 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 1 2 3 1 -2.411 0.0 1 -0.587 180.0 2 0.493 0.0 3 +torsion 1 2 3 5 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 1 2 3 15 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 6 2 3 1 0.000 0.0 1 0.000 180.0 2 -0.010 0.0 3 +torsion 6 2 3 5 0.000 0.0 1 0.000 180.0 2 0.235 0.0 3 +torsion 6 2 3 15 0.000 0.0 1 0.000 180.0 2 -0.010 0.0 3 +torsion 41 2 3 1 -0.397 0.0 1 2.196 180.0 2 -0.371 0.0 3 +torsion 41 2 3 5 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 41 2 3 15 -0.397 0.0 1 2.196 180.0 2 -0.371 0.0 3 +torsion 1 2 30 31 -0.059 0.0 1 3.400 180.0 2 -0.045 0.0 3 +torsion 6 2 30 31 -0.154 0.0 1 0.044 180.0 2 -0.086 0.0 3 +torsion 1 2 32 33 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 1 2 32 34 -0.523 0.0 1 3.984 180.0 2 0.545 0.0 3 +torsion 6 2 32 33 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 6 2 32 34 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 3 2 41 42 1.239 0.0 1 -0.405 180.0 2 0.035 0.0 3 +torsion 6 2 41 42 0.000 0.0 1 -0.081 180.0 2 0.370 0.0 3 +torsion 1 3 7 1 -0.495 0.0 1 3.000 180.0 2 -0.792 0.0 3 +torsion 1 3 7 6 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 1 3 7 7 0.929 0.0 1 0.328 180.0 2 0.000 0.0 3 +torsion 1 3 7 8 0.929 0.0 1 0.328 180.0 2 0.000 0.0 3 +torsion 1 3 7 15 0.476 0.0 1 1.100 180.0 2 -0.160 0.0 3 +torsion 1 3 7 16 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 1 3 7 41 -0.397 0.0 1 2.196 180.0 2 -0.371 0.0 3 +torsion 5 3 7 1 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 5 3 7 6 0.000 0.0 1 0.000 180.0 2 0.235 0.0 3 +torsion 5 3 7 7 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 5 3 7 8 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 5 3 7 15 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 5 3 7 16 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 5 3 7 41 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 15 3 7 1 -1.804 0.0 1 3.612 180.0 2 -0.196 0.0 3 +torsion 15 3 7 6 0.000 0.0 1 0.000 180.0 2 -0.010 0.0 3 +torsion 15 3 7 7 0.355 0.0 1 1.478 180.0 2 -0.896 0.0 3 +torsion 15 3 7 8 0.355 0.0 1 1.478 180.0 2 -0.896 0.0 3 +torsion 15 3 7 15 -2.118 0.0 1 1.173 180.0 2 0.000 0.0 3 +torsion 15 3 7 16 2.225 0.0 1 -1.252 180.0 2 -1.067 0.0 3 +torsion 15 3 7 41 -0.397 0.0 1 2.196 180.0 2 -0.371 0.0 3 +torsion 1 3 8 7 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 1 3 8 8 1.780 0.0 1 1.100 180.0 2 -1.270 0.0 3 +torsion 1 3 8 9 0.000 0.0 1 0.000 180.0 2 0.230 0.0 3 +torsion 5 3 8 7 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 5 3 8 8 0.454 0.0 1 0.080 180.0 2 -0.310 0.0 3 +torsion 5 3 8 9 -0.154 0.0 1 0.044 180.0 2 -0.086 0.0 3 +torsion 2 3 15 7 -1.000 0.0 1 2.000 180.0 2 2.000 0.0 3 +torsion 2 3 15 16 -1.000 0.0 1 2.000 180.0 2 2.000 0.0 3 +torsion 5 3 15 7 1.000 0.0 1 2.250 180.0 2 -2.250 0.0 3 +torsion 5 3 15 16 1.000 0.0 1 2.250 180.0 2 -2.250 0.0 3 +torsion 7 3 15 7 -1.000 0.0 1 2.000 180.0 2 2.000 0.0 3 +torsion 7 3 15 16 -1.000 0.0 1 2.000 180.0 2 2.000 0.0 3 +torsion 40 3 15 7 -1.000 0.0 1 2.000 180.0 2 2.000 0.0 3 +torsion 40 3 15 16 -1.000 0.0 1 2.000 180.0 2 2.000 0.0 3 +torsion 1 3 40 6 0.000 0.0 1 0.000 180.0 2 -0.010 0.0 3 +torsion 5 3 40 6 0.000 0.0 1 0.000 180.0 2 0.235 0.0 3 +torsion 15 3 40 6 0.000 0.0 1 0.000 180.0 2 -0.010 0.0 3 +torsion 1 7 7 6 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 1 7 7 8 0.800 0.0 1 1.000 180.0 2 0.500 0.0 3 +torsion 1 7 7 10 -1.500 0.0 1 0.720 180.0 2 1.260 0.0 3 +torsion 3 7 7 6 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 3 7 7 8 0.650 0.0 1 1.025 180.0 2 0.120 0.0 3 +torsion 3 7 7 10 -3.490 0.0 1 2.340 180.0 2 0.000 0.0 3 +torsion 6 7 7 6 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 6 7 7 8 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 6 7 7 10 0.000 0.0 1 0.000 180.0 2 0.341 0.0 3 +torsion 6 7 7 30 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 6 7 7 41 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 8 7 7 30 0.650 0.0 1 1.025 180.0 2 0.120 0.0 3 +torsion 8 7 7 41 0.800 0.0 1 1.000 180.0 2 0.500 0.0 3 +torsion 10 7 7 29 -3.490 0.0 1 2.340 180.0 2 0.000 0.0 3 +torsion 10 7 7 41 -1.500 0.0 1 0.720 180.0 2 1.260 0.0 3 +torsion 1 7 8 3 -0.933 0.0 1 -0.929 180.0 2 0.153 0.0 3 +torsion 1 7 8 7 0.902 0.0 1 0.520 180.0 2 1.000 0.0 3 +torsion 1 7 8 8 -2.280 0.0 1 0.970 180.0 2 3.700 0.0 3 +torsion 1 7 8 9 0.000 0.0 1 0.000 180.0 2 0.500 0.0 3 +torsion 1 7 8 10 0.630 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 1 7 8 12 -0.160 0.0 1 1.080 180.0 2 -1.520 0.0 3 +torsion 1 7 8 14 -6.170 0.0 1 1.440 180.0 2 0.760 0.0 3 +torsion 1 7 8 17 -1.470 0.0 1 1.530 180.0 2 0.260 0.0 3 +torsion 1 7 8 22 -1.000 0.0 1 0.100 180.0 2 1.150 0.0 3 +torsion 1 7 8 26 0.730 0.0 1 1.780 180.0 2 0.000 0.0 3 +torsion 1 7 8 30 -2.900 0.0 1 1.800 180.0 2 0.000 0.0 3 +torsion 1 7 8 32 -4.150 0.0 1 2.060 180.0 2 0.000 0.0 3 +torsion 1 7 8 36 -0.500 0.0 1 0.800 180.0 2 -1.110 0.0 3 +torsion 3 7 8 3 -0.911 0.0 1 3.500 180.0 2 -0.198 0.0 3 +torsion 3 7 8 7 0.740 0.0 1 0.270 180.0 2 -1.316 0.0 3 +torsion 3 7 8 8 0.160 0.0 1 1.655 180.0 2 -2.520 0.0 3 +torsion 3 7 8 9 0.000 0.0 1 0.000 180.0 2 0.180 0.0 3 +torsion 3 7 8 10 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 3 7 8 12 -1.010 0.0 1 1.230 180.0 2 1.000 0.0 3 +torsion 3 7 8 14 -5.680 0.0 1 3.000 180.0 2 1.000 0.0 3 +torsion 3 7 8 17 1.020 0.0 1 1.150 180.0 2 -0.300 0.0 3 +torsion 3 7 8 22 0.700 0.0 1 1.800 180.0 2 0.000 0.0 3 +torsion 3 7 8 26 -0.660 0.0 1 0.200 180.0 2 0.000 0.0 3 +torsion 3 7 8 30 -6.950 0.0 1 -1.150 180.0 2 0.000 0.0 3 +torsion 3 7 8 32 1.000 0.0 1 -0.130 180.0 2 0.000 0.0 3 +torsion 3 7 8 36 -1.810 0.0 1 0.150 180.0 2 1.000 0.0 3 +torsion 6 7 8 3 0.000 0.0 1 0.000 180.0 2 0.180 0.0 3 +torsion 6 7 8 7 0.000 0.0 1 0.000 180.0 2 0.341 0.0 3 +torsion 6 7 8 8 0.000 0.0 1 0.000 180.0 2 0.341 0.0 3 +torsion 6 7 8 9 0.000 0.0 1 0.000 180.0 2 0.299 0.0 3 +torsion 6 7 8 10 0.000 0.0 1 0.000 180.0 2 0.341 0.0 3 +torsion 6 7 8 12 0.000 0.0 1 0.000 180.0 2 0.475 0.0 3 +torsion 6 7 8 14 0.000 0.0 1 0.000 180.0 2 0.475 0.0 3 +torsion 6 7 8 17 0.000 0.0 1 0.000 180.0 2 0.500 0.0 3 +torsion 6 7 8 22 0.000 0.0 1 0.000 180.0 2 0.341 0.0 3 +torsion 6 7 8 26 0.000 0.0 1 0.000 180.0 2 0.500 0.0 3 +torsion 6 7 8 30 0.000 0.0 1 0.000 180.0 2 0.180 0.0 3 +torsion 6 7 8 32 0.000 0.0 1 0.000 180.0 2 0.180 0.0 3 +torsion 6 7 8 36 0.000 0.0 1 0.000 180.0 2 0.341 0.0 3 +torsion 7 7 8 8 -0.640 0.0 1 0.360 180.0 2 -0.089 0.0 3 +torsion 7 7 8 9 0.000 0.0 1 0.000 180.0 2 0.341 0.0 3 +torsion 8 7 8 7 -0.083 0.0 1 -0.045 180.0 2 -0.120 0.0 3 +torsion 8 7 8 8 -0.640 0.0 1 0.360 180.0 2 -0.089 0.0 3 +torsion 8 7 8 9 0.000 0.0 1 0.000 180.0 2 0.341 0.0 3 +torsion 10 7 8 9 0.000 0.0 1 0.000 180.0 2 0.341 0.0 3 +torsion 30 7 8 3 0.000 0.0 1 0.000 180.0 2 0.100 0.0 3 +torsion 30 7 8 7 0.740 0.0 1 0.270 180.0 2 -1.316 0.0 3 +torsion 30 7 8 8 1.190 0.0 1 0.520 180.0 2 0.520 0.0 3 +torsion 30 7 8 9 0.000 0.0 1 0.000 180.0 2 0.180 0.0 3 +torsion 30 7 8 10 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 30 7 8 12 -1.010 0.0 1 1.230 180.0 2 1.000 0.0 3 +torsion 30 7 8 14 -5.680 0.0 1 3.000 180.0 2 1.000 0.0 3 +torsion 30 7 8 17 1.020 0.0 1 1.150 180.0 2 -0.300 0.0 3 +torsion 30 7 8 22 0.700 0.0 1 1.800 180.0 2 0.000 0.0 3 +torsion 30 7 8 26 -0.660 0.0 1 0.200 180.0 2 0.000 0.0 3 +torsion 30 7 8 30 -2.450 0.0 1 1.688 180.0 2 0.000 0.0 3 +torsion 30 7 8 32 1.000 0.0 1 -0.130 180.0 2 0.000 0.0 3 +torsion 30 7 8 36 -1.810 0.0 1 0.150 180.0 2 1.000 0.0 3 +torsion 32 7 8 9 0.000 0.0 1 0.000 180.0 2 0.180 0.0 3 +torsion 41 7 8 3 -3.000 0.0 1 0.500 180.0 2 0.100 0.0 3 +torsion 41 7 8 7 0.902 0.0 1 0.520 180.0 2 1.000 0.0 3 +torsion 41 7 8 8 -0.513 0.0 1 0.568 180.0 2 -0.750 0.0 3 +torsion 41 7 8 9 0.000 0.0 1 0.000 180.0 2 0.500 0.0 3 +torsion 41 7 8 10 0.630 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 41 7 8 12 -0.160 0.0 1 1.080 180.0 2 -1.520 0.0 3 +torsion 41 7 8 14 -6.170 0.0 1 1.440 180.0 2 0.760 0.0 3 +torsion 41 7 8 17 -1.470 0.0 1 1.530 180.0 2 0.260 0.0 3 +torsion 41 7 8 22 -1.000 0.0 1 0.100 180.0 2 1.150 0.0 3 +torsion 41 7 8 26 0.730 0.0 1 1.780 180.0 2 0.000 0.0 3 +torsion 41 7 8 30 -4.150 0.0 1 2.060 180.0 2 0.000 0.0 3 +torsion 41 7 8 32 -3.400 0.0 1 0.900 180.0 2 0.000 0.0 3 +torsion 41 7 8 36 -0.500 0.0 1 0.800 180.0 2 -1.110 0.0 3 +torsion 6 7 10 11 0.000 0.0 1 0.000 180.0 2 0.250 0.0 3 +torsion 7 7 10 11 -0.266 0.0 1 -0.910 180.0 2 0.322 0.0 3 +torsion 8 7 10 11 -0.266 0.0 1 -0.910 180.0 2 0.322 0.0 3 +torsion 3 7 15 3 0.000 0.0 1 0.000 180.0 2 0.030 0.0 3 +torsion 3 7 15 16 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 6 7 15 3 0.000 0.0 1 0.000 180.0 2 -0.126 0.0 3 +torsion 6 7 15 16 0.000 0.0 1 0.000 180.0 2 -0.126 0.0 3 +torsion 16 7 15 3 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 16 7 15 16 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 30 7 15 3 0.000 0.0 1 0.000 180.0 2 0.030 0.0 3 +torsion 30 7 15 16 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 3 7 16 9 0.000 0.0 1 0.000 180.0 2 0.180 0.0 3 +torsion 3 7 16 16 1.660 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 6 7 16 9 0.000 0.0 1 0.000 180.0 2 0.299 0.0 3 +torsion 6 7 16 16 0.000 0.0 1 0.000 180.0 2 0.341 0.0 3 +torsion 15 7 16 9 0.000 0.0 1 0.000 180.0 2 0.500 0.0 3 +torsion 15 7 16 16 0.201 0.0 1 0.687 180.0 2 0.000 0.0 3 +torsion 30 7 16 9 0.000 0.0 1 0.000 180.0 2 0.180 0.0 3 +torsion 30 7 16 16 1.660 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 41 7 16 9 0.000 0.0 1 0.000 180.0 2 0.180 0.0 3 +torsion 41 7 16 16 1.660 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 1 7 30 31 -0.059 0.0 1 1.900 180.0 2 -0.045 0.0 3 +torsion 6 7 30 31 -0.154 0.0 1 0.044 180.0 2 -0.086 0.0 3 +torsion 7 7 30 31 0.000 0.0 1 -0.489 180.0 2 0.000 0.0 3 +torsion 8 7 30 31 0.000 0.0 1 -0.489 180.0 2 0.000 0.0 3 +torsion 15 7 30 31 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 16 7 30 31 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 1 7 32 33 0.000 0.0 1 -0.136 180.0 2 0.000 0.0 3 +torsion 1 7 32 34 0.000 0.0 1 1.645 180.0 2 0.000 0.0 3 +torsion 6 7 32 33 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 6 7 32 34 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 8 7 32 33 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 8 7 32 34 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 3 7 41 16 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 3 7 41 42 1.239 0.0 1 -0.405 180.0 2 0.035 0.0 3 +torsion 6 7 41 16 0.000 0.0 1 0.000 180.0 2 -0.126 0.0 3 +torsion 6 7 41 42 0.000 0.0 1 -0.081 180.0 2 0.370 0.0 3 +torsion 7 7 41 42 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 8 7 41 42 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 16 7 41 16 2.216 0.0 1 0.215 180.0 2 0.810 0.0 3 +torsion 16 7 41 42 -0.939 0.0 1 -0.159 180.0 2 0.246 0.0 3 +torsion 1 8 8 8 0.000 0.0 1 3.000 180.0 2 0.000 0.0 3 +torsion 1 8 8 9 0.000 0.0 1 0.000 180.0 2 0.341 0.0 3 +torsion 3 8 8 7 0.750 0.0 1 -1.240 180.0 2 -0.190 0.0 3 +torsion 3 8 8 9 0.000 0.0 1 0.000 180.0 2 0.380 0.0 3 +torsion 7 8 8 8 -1.100 0.0 1 -1.150 180.0 2 0.000 0.0 3 +torsion 7 8 8 9 0.000 0.0 1 0.000 180.0 2 0.341 0.0 3 +torsion 7 8 8 12 -0.500 0.0 1 -0.310 180.0 2 -1.290 0.0 3 +torsion 7 8 8 30 -2.500 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 7 8 8 32 1.000 0.0 1 1.000 180.0 2 0.500 0.0 3 +torsion 8 8 8 9 0.000 0.0 1 0.000 180.0 2 0.341 0.0 3 +torsion 9 8 8 9 0.000 0.0 1 0.000 180.0 2 0.299 0.0 3 +torsion 9 8 8 12 0.000 0.0 1 0.000 180.0 2 0.475 0.0 3 +torsion 9 8 8 30 0.000 0.0 1 0.000 180.0 2 1.300 0.0 3 +torsion 9 8 8 32 0.000 0.0 1 0.000 180.0 2 0.300 0.0 3 +torsion 9 8 8 36 0.000 0.0 1 0.000 180.0 2 0.341 0.0 3 +torsion 9 8 8 37 0.000 0.0 1 0.000 180.0 2 0.374 0.0 3 +torsion 36 8 8 37 -0.800 0.0 1 1.064 180.0 2 0.000 0.0 3 +torsion 7 8 10 11 3.000 0.0 1 -1.000 180.0 2 0.000 0.0 3 +torsion 9 8 10 11 0.000 0.0 1 0.000 180.0 2 0.250 0.0 3 +torsion 7 8 12 12 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 7 8 12 13 0.042 0.0 1 -0.091 180.0 2 0.068 0.0 3 +torsion 8 8 12 8 -1.250 0.0 1 0.170 180.0 2 0.509 0.0 3 +torsion 9 8 12 8 0.000 0.0 1 0.000 180.0 2 0.660 0.0 3 +torsion 9 8 12 12 0.300 0.0 1 0.000 180.0 2 0.600 0.0 3 +torsion 9 8 12 13 0.000 0.0 1 0.000 180.0 2 0.343 0.0 3 +torsion 7 8 17 17 0.000 0.0 1 -0.574 180.0 2 0.000 0.0 3 +torsion 9 8 17 17 0.000 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 7 8 22 22 0.000 0.0 1 -0.450 180.0 2 0.000 0.0 3 +torsion 9 8 22 22 0.000 0.0 1 0.000 180.0 2 0.341 0.0 3 +torsion 7 8 26 24 -2.000 0.0 1 0.000 180.0 2 1.000 0.0 3 +torsion 7 8 26 26 0.350 0.0 1 0.280 180.0 2 0.000 0.0 3 +torsion 7 8 26 29 -1.520 0.0 1 0.000 180.0 2 0.000 0.0 3 +torsion 9 8 26 24 0.000 0.0 1 0.000 180.0 2 0.299 0.0 3 +torsion 9 8 26 26 0.000 0.0 1 0.000 180.0 2 0.299 0.0 3 +torsion 9 8 26 29 0.000 0.0 1 0.000 180.0 2 0.299 0.0 3 +torsion 7 8 30 31 0.000 0.0 1 1.700 180.0 2 0.000 0.0 3 +torsion 8 8 30 31 0.000 0.0 1 1.460 180.0 2 0.000 0.0 3 +torsion 9 8 30 31 -0.154 0.0 1 0.044 180.0 2 -0.086 0.0 3 +torsion 7 8 32 33 -0.092 0.0 1 1.124 180.0 2 0.435 0.0 3 +torsion 7 8 32 34 0.677 0.0 1 1.020 180.0 2 0.163 0.0 3 +torsion 8 8 32 33 0.000 0.0 1 0.800 180.0 2 0.000 0.0 3 +torsion 8 8 32 34 0.000 0.0 1 0.800 180.0 2 0.000 0.0 3 +torsion 9 8 32 33 -0.154 0.0 1 0.044 180.0 2 -0.086 0.0 3 +torsion 9 8 32 34 0.250 0.0 1 0.850 180.0 2 0.000 0.0 3 +torsion 7 8 36 8 1.000 0.0 1 0.070 180.0 2 -1.220 0.0 3 +torsion 7 8 36 9 0.000 0.0 1 0.000 180.0 2 0.341 0.0 3 +torsion 8 8 36 8 0.000 0.0 1 0.000 180.0 2 -1.000 0.0 3 +torsion 8 8 36 9 0.000 0.0 1 0.000 180.0 2 0.341 0.0 3 +torsion 9 8 36 8 0.000 0.0 1 0.000 180.0 2 0.341 0.0 3 +torsion 9 8 36 9 0.000 0.0 1 0.000 180.0 2 0.299 0.0 3 +torsion 37 8 36 8 -0.800 0.0 1 1.064 180.0 2 0.000 0.0 3 +torsion 37 8 36 9 0.000 0.0 1 0.000 180.0 2 0.374 0.0 3 +torsion 8 8 37 38 0.000 0.0 1 0.000 180.0 2 -0.110 0.0 3 +torsion 9 8 37 38 0.000 0.0 1 -0.081 180.0 2 0.370 0.0 3 +torsion 36 8 37 38 0.000 0.0 1 0.000 180.0 2 -0.110 0.0 3 +torsion 8 12 12 8 -0.940 0.0 1 -6.900 180.0 2 0.300 0.0 3 +torsion 3 15 16 6 0.000 0.0 1 0.000 180.0 2 -0.126 0.0 3 +torsion 3 15 16 16 -2.216 0.0 1 0.215 180.0 2 -0.810 0.0 3 +torsion 7 15 16 6 0.000 0.0 1 0.000 180.0 2 -0.126 0.0 3 +torsion 7 15 16 16 -2.216 0.0 1 0.215 180.0 2 -0.810 0.0 3 +torsion 6 16 16 9 0.000 0.0 1 0.000 180.0 2 0.299 0.0 3 +torsion 6 16 16 16 0.000 0.0 1 0.000 180.0 2 0.341 0.0 3 +torsion 7 16 16 9 0.000 0.0 1 0.000 180.0 2 0.341 0.0 3 +torsion 7 16 16 16 -2.000 0.0 1 -0.500 180.0 2 0.000 0.0 3 +torsion 9 16 16 9 0.000 0.0 1 0.000 180.0 2 0.299 0.0 3 +torsion 9 16 16 15 0.000 0.0 1 0.000 180.0 2 0.500 0.0 3 +torsion 9 16 16 16 0.000 0.0 1 0.000 180.0 2 0.341 0.0 3 +torsion 9 16 16 41 0.000 0.0 1 0.000 180.0 2 0.500 0.0 3 +torsion 15 16 16 16 -2.201 0.0 1 0.687 180.0 2 0.000 0.0 3 +torsion 16 16 16 41 -0.201 0.0 1 0.687 180.0 2 0.000 0.0 3 +torsion 6 16 41 7 0.000 0.0 1 0.000 180.0 2 -0.126 0.0 3 +torsion 6 16 41 42 0.000 0.0 1 -0.014 180.0 2 0.295 0.0 3 +torsion 16 16 41 7 2.216 0.0 1 0.215 180.0 2 0.810 0.0 3 +torsion 16 16 41 42 -0.939 0.0 1 -0.159 180.0 2 0.246 0.0 3 +torsion 8 17 17 17 -0.610 0.0 1 4.212 180.0 2 0.000 0.0 3 +torsion 8 17 17 18 0.000 0.0 1 4.104 180.0 2 0.000 0.0 3 +torsion 17 17 17 17 -0.670 0.0 1 4.004 180.0 2 0.000 0.0 3 +torsion 17 17 17 18 0.550 0.0 1 4.534 180.0 2 -0.550 0.0 3 +torsion 17 17 17 19 0.000 0.0 1 4.470 180.0 2 0.000 0.0 3 +torsion 17 17 17 21 0.000 0.0 1 4.470 180.0 2 0.000 0.0 3 +torsion 18 17 17 18 0.000 0.0 1 4.072 180.0 2 0.000 0.0 3 +torsion 18 17 17 19 0.000 0.0 1 4.470 180.0 2 0.000 0.0 3 +torsion 18 17 17 21 0.000 0.0 1 4.470 180.0 2 0.000 0.0 3 +torsion 17 17 19 20 0.000 0.0 1 2.300 180.0 2 0.000 0.0 3 +torsion 8 22 22 22 -0.610 0.0 1 4.212 180.0 2 0.000 0.0 3 +torsion 8 22 22 23 0.000 0.0 1 3.104 180.0 2 0.000 0.0 3 +torsion 8 22 22 24 0.000 0.0 1 4.470 180.0 2 0.000 0.0 3 +torsion 22 22 22 22 -0.670 0.0 1 4.304 180.0 2 0.000 0.0 3 +torsion 22 22 22 23 0.250 0.0 1 4.534 180.0 2 -0.550 0.0 3 +torsion 22 22 22 24 0.000 0.0 1 4.470 180.0 2 0.000 0.0 3 +torsion 23 22 22 23 0.000 0.0 1 3.072 180.0 2 0.000 0.0 3 +torsion 23 22 22 24 -3.150 0.0 1 3.000 180.0 2 0.000 0.0 3 +torsion 22 22 24 22 0.000 0.0 1 10.000 180.0 2 0.000 0.0 3 +torsion 22 22 24 25 -3.150 0.0 1 5.000 180.0 2 0.000 0.0 3 +torsion 23 22 24 22 -6.650 0.0 1 10.000 180.0 2 0.000 0.0 3 +torsion 23 22 24 25 -0.530 0.0 1 3.000 180.0 2 0.000 0.0 3 +torsion 25 24 26 8 0.000 0.0 1 4.104 180.0 2 0.000 0.0 3 +torsion 25 24 26 26 -3.150 0.0 1 3.000 180.0 2 0.000 0.0 3 +torsion 25 24 26 27 -0.530 0.0 1 3.000 180.0 2 0.000 0.0 3 +torsion 28 24 26 8 0.000 0.0 1 4.212 180.0 2 0.000 0.0 3 +torsion 28 24 26 26 0.000 0.0 1 6.000 180.0 2 0.000 0.0 3 +torsion 28 24 26 27 0.000 0.0 1 3.000 180.0 2 0.000 0.0 3 +torsion 25 24 28 24 -2.744 0.0 1 3.000 180.0 2 0.000 0.0 3 +torsion 25 24 28 27 -0.530 0.0 1 3.000 180.0 2 0.000 0.0 3 +torsion 25 24 28 29 -2.744 0.0 1 3.000 180.0 2 0.000 0.0 3 +torsion 26 24 28 24 0.000 0.0 1 8.000 180.0 2 0.000 0.0 3 +torsion 26 24 28 27 0.000 0.0 1 3.000 180.0 2 0.000 0.0 3 +torsion 26 24 28 29 0.000 0.0 1 8.000 180.0 2 0.000 0.0 3 +torsion 8 26 26 24 0.000 0.0 1 4.212 180.0 2 0.000 0.0 3 +torsion 8 26 26 27 0.000 0.0 1 4.102 180.0 2 0.000 0.0 3 +torsion 8 26 26 29 0.000 0.0 1 4.212 180.0 2 0.000 0.0 3 +torsion 24 26 26 24 0.900 0.0 1 8.000 180.0 2 0.000 0.0 3 +torsion 24 26 26 27 0.755 0.0 1 3.000 180.0 2 0.000 0.0 3 +torsion 24 26 26 29 0.900 0.0 1 8.000 180.0 2 0.000 0.0 3 +torsion 27 26 26 29 0.755 0.0 1 3.000 180.0 2 0.000 0.0 3 +torsion 8 26 29 28 0.000 0.0 1 4.212 180.0 2 0.000 0.0 3 +torsion 26 26 29 28 0.000 0.0 1 6.000 180.0 2 0.000 0.0 3 +torsion 27 26 29 28 0.000 0.0 1 3.000 180.0 2 0.000 0.0 3 +torsion 24 28 29 26 0.000 0.0 1 8.000 180.0 2 0.000 0.0 3 +torsion 27 28 29 26 0.000 0.0 1 3.000 180.0 2 0.000 0.0 3 +torsion 2 32 34 35 0.000 0.0 1 5.390 180.0 2 1.230 0.0 3 +torsion 7 32 34 35 0.000 0.0 1 5.390 180.0 2 1.230 0.0 3 +torsion 8 32 34 35 0.000 0.0 1 5.390 180.0 2 1.230 0.0 3 +torsion 33 32 34 35 -1.200 0.0 1 5.390 180.0 2 0.400 0.0 3 +torsion 45 43 43 46 0.000 0.0 1 3.696 180.0 2 0.000 0.0 3 +torsion 45 43 43 50 0.000 0.0 1 3.584 180.0 2 0.000 0.0 3 +torsion 46 43 43 49 0.000 0.0 1 3.810 180.0 2 0.000 0.0 3 +torsion 46 43 43 56 0.000 0.0 1 3.595 180.0 2 0.000 0.0 3 +torsion 49 43 43 50 0.000 0.0 1 2.777 180.0 2 0.000 0.0 3 +torsion 49 43 43 60 0.000 0.0 1 12.635 180.0 2 0.000 0.0 3 +torsion 50 43 43 56 0.000 0.0 1 3.540 180.0 2 0.000 0.0 3 +torsion 56 43 43 60 0.000 0.0 1 3.595 180.0 2 0.000 0.0 3 +torsion 43 43 45 47 0.000 0.0 1 9.885 180.0 2 0.000 0.0 3 +torsion 43 43 45 50 0.000 0.0 1 4.256 180.0 2 0.000 0.0 3 +torsion 49 43 45 47 0.000 0.0 1 3.777 180.0 2 0.000 0.0 3 +torsion 49 43 45 50 0.000 0.0 1 3.776 180.0 2 0.000 0.0 3 +torsion 43 43 46 44 0.000 0.0 1 14.189 180.0 2 0.000 0.0 3 +torsion 43 43 46 68 0.000 0.0 1 3.551 180.0 2 0.000 0.0 3 +torsion 43 43 46 76 0.000 0.0 1 3.551 180.0 2 0.000 0.0 3 +torsion 50 43 46 44 0.000 0.0 1 3.031 180.0 2 0.000 0.0 3 +torsion 50 43 46 68 0.000 0.0 1 2.502 180.0 2 0.000 0.0 3 +torsion 50 43 46 76 0.000 0.0 1 2.502 180.0 2 0.000 0.0 3 +torsion 43 43 49 44 0.000 0.0 1 20.157 180.0 2 0.000 0.0 3 +torsion 45 43 49 44 0.000 0.0 1 3.485 180.0 2 0.000 0.0 3 +torsion 56 43 49 44 0.000 0.0 1 3.441 180.0 2 0.000 0.0 3 +torsion 43 43 50 48 0.000 0.0 1 10.504 180.0 2 0.000 0.0 3 +torsion 43 43 50 59 0.000 0.0 1 7.861 180.0 2 0.000 0.0 3 +torsion 46 43 50 48 0.000 0.0 1 11.410 180.0 2 0.000 0.0 3 +torsion 60 43 50 59 0.000 0.0 1 13.900 180.0 2 0.000 0.0 3 +torsion 43 43 56 54 0.000 0.0 1 7.980 180.0 2 0.000 0.0 3 +torsion 43 43 56 58 0.000 0.0 1 6.051 180.0 2 0.000 0.0 3 +torsion 43 43 56 63 0.000 0.0 1 7.980 180.0 2 0.000 0.0 3 +torsion 49 43 56 54 0.000 0.0 1 3.810 180.0 2 0.000 0.0 3 +torsion 49 43 56 58 0.000 0.0 1 3.810 180.0 2 0.000 0.0 3 +torsion 49 43 56 63 0.000 0.0 1 3.810 180.0 2 0.000 0.0 3 +torsion 43 43 60 44 0.000 0.0 1 14.189 180.0 2 0.000 0.0 3 +torsion 43 43 60 68 0.000 0.0 1 3.551 180.0 2 0.000 0.0 3 +torsion 43 43 60 76 0.000 0.0 1 3.551 180.0 2 0.000 0.0 3 +torsion 50 43 60 44 0.000 0.0 1 3.031 180.0 2 0.000 0.0 3 +torsion 50 43 60 68 0.000 0.0 1 2.502 180.0 2 0.000 0.0 3 +torsion 50 43 60 76 0.000 0.0 1 2.502 180.0 2 0.000 0.0 3 +torsion 49 44 46 43 0.000 0.0 1 26.463 180.0 2 0.000 0.0 3 +torsion 49 44 46 68 0.000 0.0 1 3.014 180.0 2 0.000 0.0 3 +torsion 49 44 46 76 0.000 0.0 1 3.014 180.0 2 0.000 0.0 3 +torsion 51 44 46 43 0.000 0.0 1 3.590 180.0 2 0.000 0.0 3 +torsion 51 44 46 68 0.000 0.0 1 2.075 180.0 2 0.000 0.0 3 +torsion 51 44 46 76 0.000 0.0 1 2.075 180.0 2 0.000 0.0 3 +torsion 46 44 49 43 0.000 0.0 1 26.315 180.0 2 0.000 0.0 3 +torsion 51 44 49 43 0.000 0.0 1 7.650 180.0 2 0.000 0.0 3 +torsion 60 44 49 43 0.000 0.0 1 26.315 180.0 2 0.000 0.0 3 +torsion 49 44 60 43 0.000 0.0 1 26.463 180.0 2 0.000 0.0 3 +torsion 49 44 60 68 0.000 0.0 1 3.014 180.0 2 0.000 0.0 3 +torsion 49 44 60 76 0.000 0.0 1 3.014 180.0 2 0.000 0.0 3 +torsion 51 44 60 43 0.000 0.0 1 3.590 180.0 2 0.000 0.0 3 +torsion 51 44 60 68 0.000 0.0 1 2.075 180.0 2 0.000 0.0 3 +torsion 51 44 60 76 0.000 0.0 1 2.075 180.0 2 0.000 0.0 3 +torsion 43 45 47 53 0.000 0.0 1 1.885 180.0 2 0.000 0.0 3 +torsion 50 45 47 53 0.000 0.0 1 0.622 180.0 2 0.000 0.0 3 +torsion 55 45 47 53 0.000 0.0 1 2.075 180.0 2 0.000 0.0 3 +torsion 43 45 50 48 0.000 0.0 1 9.537 180.0 2 0.000 0.0 3 +torsion 47 45 50 48 0.000 0.0 1 11.976 180.0 2 0.000 0.0 3 +torsion 47 45 50 56 0.000 0.0 1 17.562 180.0 2 0.000 0.0 3 +torsion 55 45 50 56 0.000 0.0 1 3.856 180.0 2 0.000 0.0 3 +torsion 47 45 55 48 0.000 0.0 1 4.702 180.0 2 0.000 0.0 3 +torsion 47 45 55 57 0.000 0.0 1 4.163 180.0 2 0.000 0.0 3 +torsion 50 45 55 48 0.000 0.0 1 8.735 180.0 2 0.000 0.0 3 +torsion 50 45 55 57 0.000 0.0 1 4.043 180.0 2 0.000 0.0 3 +torsion 43 46 68 65 0.871 0.0 1 -0.939 180.0 2 2.324 0.0 3 +torsion 43 46 68 67 -0.200 0.0 1 -0.272 180.0 2 0.741 0.0 3 +torsion 43 46 68 68 -0.661 0.0 1 0.186 180.0 2 -1.167 0.0 3 +torsion 44 46 68 65 -1.147 0.0 1 -1.082 180.0 2 -0.750 0.0 3 +torsion 44 46 68 67 0.108 0.0 1 -0.262 180.0 2 -0.427 0.0 3 +torsion 44 46 68 68 0.233 0.0 1 0.289 180.0 2 2.754 0.0 3 +torsion 43 46 76 76 -0.221 0.0 1 1.258 180.0 2 0.971 0.0 3 +torsion 43 46 76 77 0.648 0.0 1 -0.088 180.0 2 -0.233 0.0 3 +torsion 43 46 76 78 1.075 0.0 1 -0.251 180.0 2 0.302 0.0 3 +torsion 44 46 76 76 -1.675 0.0 1 -0.401 180.0 2 1.310 0.0 3 +torsion 44 46 76 77 -0.771 0.0 1 -0.276 180.0 2 1.758 0.0 3 +torsion 44 46 76 78 -0.237 0.0 1 1.294 180.0 2 -0.128 0.0 3 +torsion 53 47 59 50 0.000 0.0 1 1.303 180.0 2 0.000 0.0 3 +torsion 53 47 59 54 0.000 0.0 1 1.071 180.0 2 0.000 0.0 3 +torsion 51 48 48 52 0.000 0.0 1 3.699 180.0 2 0.000 0.0 3 +torsion 51 48 48 56 0.000 0.0 1 3.682 180.0 2 0.000 0.0 3 +torsion 51 48 48 62 0.000 0.0 1 4.026 180.0 2 0.000 0.0 3 +torsion 52 48 48 63 0.000 0.0 1 3.941 180.0 2 0.000 0.0 3 +torsion 56 48 48 63 0.000 0.0 1 3.925 180.0 2 0.000 0.0 3 +torsion 62 48 48 63 0.000 0.0 1 10.272 180.0 2 0.000 0.0 3 +torsion 50 48 50 43 0.000 0.0 1 7.259 180.0 2 0.000 0.0 3 +torsion 50 48 50 45 0.000 0.0 1 7.710 180.0 2 0.000 0.0 3 +torsion 52 48 50 43 0.000 0.0 1 14.604 180.0 2 0.000 0.0 3 +torsion 52 48 50 45 0.000 0.0 1 13.794 180.0 2 0.000 0.0 3 +torsion 48 48 54 68 0.000 0.0 1 3.925 180.0 2 0.000 0.0 3 +torsion 48 48 54 76 0.000 0.0 1 3.925 180.0 2 0.000 0.0 3 +torsion 51 48 54 56 0.000 0.0 1 5.896 180.0 2 0.000 0.0 3 +torsion 51 48 54 68 0.000 0.0 1 4.904 180.0 2 0.000 0.0 3 +torsion 51 48 54 76 0.000 0.0 1 4.904 180.0 2 0.000 0.0 3 +torsion 55 48 54 56 0.000 0.0 1 3.971 180.0 2 0.000 0.0 3 +torsion 55 48 54 68 0.000 0.0 1 6.856 180.0 2 0.000 0.0 3 +torsion 55 48 54 76 0.000 0.0 1 6.856 180.0 2 0.000 0.0 3 +torsion 51 48 55 45 0.000 0.0 1 4.730 180.0 2 0.000 0.0 3 +torsion 51 48 55 57 0.000 0.0 1 3.311 180.0 2 0.000 0.0 3 +torsion 54 48 55 45 0.000 0.0 1 8.884 180.0 2 0.000 0.0 3 +torsion 54 48 55 57 0.000 0.0 1 5.035 180.0 2 0.000 0.0 3 +torsion 63 48 55 57 0.000 0.0 1 5.035 180.0 2 0.000 0.0 3 +torsion 48 48 56 54 0.000 0.0 1 3.890 180.0 2 0.000 0.0 3 +torsion 48 48 56 58 0.000 0.0 1 3.872 180.0 2 0.000 0.0 3 +torsion 48 48 56 63 0.000 0.0 1 3.890 180.0 2 0.000 0.0 3 +torsion 52 48 56 54 0.000 0.0 1 9.149 180.0 2 0.000 0.0 3 +torsion 52 48 56 58 0.000 0.0 1 4.789 180.0 2 0.000 0.0 3 +torsion 62 48 56 54 0.000 0.0 1 9.439 180.0 2 0.000 0.0 3 +torsion 62 48 56 58 0.000 0.0 1 4.645 180.0 2 0.000 0.0 3 +torsion 62 48 56 63 0.000 0.0 1 9.439 180.0 2 0.000 0.0 3 +torsion 48 48 62 64 0.000 0.0 1 2.400 180.0 2 0.000 0.0 3 +torsion 56 48 62 64 0.000 0.0 1 0.283 180.0 2 0.494 0.0 3 +torsion 48 48 63 56 0.000 0.0 1 7.148 180.0 2 0.000 0.0 3 +torsion 48 48 63 68 0.000 0.0 1 3.925 180.0 2 0.000 0.0 3 +torsion 48 48 63 76 0.000 0.0 1 3.925 180.0 2 0.000 0.0 3 +torsion 51 48 63 56 0.000 0.0 1 5.896 180.0 2 0.000 0.0 3 +torsion 51 48 63 68 0.000 0.0 1 4.904 180.0 2 0.000 0.0 3 +torsion 51 48 63 76 0.000 0.0 1 4.904 180.0 2 0.000 0.0 3 +torsion 55 48 63 56 0.000 0.0 1 3.971 180.0 2 0.000 0.0 3 +torsion 55 48 63 68 0.000 0.0 1 6.856 180.0 2 0.000 0.0 3 +torsion 55 48 63 76 0.000 0.0 1 6.856 180.0 2 0.000 0.0 3 +torsion 45 50 56 54 0.000 0.0 1 3.798 180.0 2 0.000 0.0 3 +torsion 45 50 56 58 0.000 0.0 1 17.613 180.0 2 0.000 0.0 3 +torsion 43 50 59 47 0.000 0.0 1 16.908 180.0 2 0.000 0.0 3 +torsion 43 50 59 54 0.000 0.0 1 4.852 180.0 2 0.000 0.0 3 +torsion 48 54 56 50 0.000 0.0 1 3.774 180.0 2 0.000 0.0 3 +torsion 48 54 56 58 0.000 0.0 1 3.231 180.0 2 0.000 0.0 3 +torsion 56 54 56 48 0.000 0.0 1 3.659 180.0 2 0.000 0.0 3 +torsion 56 54 56 58 0.000 0.0 1 3.572 180.0 2 0.000 0.0 3 +torsion 56 54 56 63 0.000 0.0 1 3.511 180.0 2 0.000 0.0 3 +torsion 59 54 56 43 0.000 0.0 1 3.649 180.0 2 0.000 0.0 3 +torsion 59 54 56 58 0.000 0.0 1 3.730 180.0 2 0.000 0.0 3 +torsion 61 54 56 43 0.000 0.0 1 3.812 180.0 2 0.000 0.0 3 +torsion 61 54 56 48 0.000 0.0 1 3.666 180.0 2 0.000 0.0 3 +torsion 61 54 56 58 0.000 0.0 1 10.490 180.0 2 0.000 0.0 3 +torsion 61 54 56 63 0.000 0.0 1 3.869 180.0 2 0.000 0.0 3 +torsion 68 54 56 50 0.000 0.0 1 4.295 180.0 2 0.000 0.0 3 +torsion 68 54 56 54 0.000 0.0 1 3.986 180.0 2 0.000 0.0 3 +torsion 68 54 56 58 0.000 0.0 1 10.374 180.0 2 0.000 0.0 3 +torsion 68 54 56 63 0.000 0.0 1 3.986 180.0 2 0.000 0.0 3 +torsion 76 54 56 50 0.000 0.0 1 4.295 180.0 2 0.000 0.0 3 +torsion 76 54 56 54 0.000 0.0 1 3.986 180.0 2 0.000 0.0 3 +torsion 76 54 56 58 0.000 0.0 1 10.374 180.0 2 0.000 0.0 3 +torsion 76 54 56 63 0.000 0.0 1 3.986 180.0 2 0.000 0.0 3 +torsion 56 54 59 47 0.000 0.0 1 3.924 180.0 2 0.000 0.0 3 +torsion 56 54 59 50 0.000 0.0 1 3.854 180.0 2 0.000 0.0 3 +torsion 61 54 59 47 0.000 0.0 1 3.777 180.0 2 0.000 0.0 3 +torsion 61 54 59 50 0.000 0.0 1 3.928 180.0 2 0.000 0.0 3 +torsion 48 54 68 65 -2.316 0.0 1 0.596 180.0 2 -0.493 0.0 3 +torsion 48 54 68 67 1.107 0.0 1 -0.142 180.0 2 -0.178 0.0 3 +torsion 48 54 68 68 -2.163 0.0 1 0.794 180.0 2 1.420 0.0 3 +torsion 56 54 68 65 3.068 0.0 1 0.722 180.0 2 1.339 0.0 3 +torsion 56 54 68 67 -0.988 0.0 1 -0.186 180.0 2 0.346 0.0 3 +torsion 56 54 68 68 2.890 0.0 1 0.880 180.0 2 -0.605 0.0 3 +torsion 48 54 76 76 0.819 0.0 1 3.809 180.0 2 -0.110 0.0 3 +torsion 48 54 76 77 -3.184 0.0 1 -2.234 180.0 2 0.000 0.0 3 +torsion 48 54 76 78 -0.480 0.0 1 -0.684 180.0 2 -0.281 0.0 3 +torsion 56 54 76 76 0.044 0.0 1 0.571 180.0 2 -0.102 0.0 3 +torsion 56 54 76 77 4.300 0.0 1 -1.454 180.0 2 -0.052 0.0 3 +torsion 56 54 76 78 -0.945 0.0 1 2.121 180.0 2 0.337 0.0 3 +torsion 43 56 63 61 0.000 0.0 1 3.812 180.0 2 0.000 0.0 3 +torsion 48 56 63 56 0.000 0.0 1 3.659 180.0 2 0.000 0.0 3 +torsion 50 56 63 48 0.000 0.0 1 3.774 180.0 2 0.000 0.0 3 +torsion 50 56 63 68 0.000 0.0 1 4.295 180.0 2 0.000 0.0 3 +torsion 50 56 63 76 0.000 0.0 1 4.295 180.0 2 0.000 0.0 3 +torsion 54 56 63 48 0.000 0.0 1 3.856 180.0 2 0.000 0.0 3 +torsion 54 56 63 68 0.000 0.0 1 3.986 180.0 2 0.000 0.0 3 +torsion 54 56 63 76 0.000 0.0 1 3.986 180.0 2 0.000 0.0 3 +torsion 58 56 63 48 0.000 0.0 1 3.231 180.0 2 0.000 0.0 3 +torsion 58 56 63 56 0.000 0.0 1 3.572 180.0 2 0.000 0.0 3 +torsion 58 56 63 61 0.000 0.0 1 10.490 180.0 2 0.000 0.0 3 +torsion 58 56 63 68 0.000 0.0 1 10.374 180.0 2 0.000 0.0 3 +torsion 58 56 63 76 0.000 0.0 1 10.374 180.0 2 0.000 0.0 3 +torsion 63 56 63 68 0.000 0.0 1 3.986 180.0 2 0.000 0.0 3 +torsion 63 56 63 76 0.000 0.0 1 3.986 180.0 2 0.000 0.0 3 +torsion 43 60 68 65 0.871 0.0 1 -0.939 180.0 2 2.324 0.0 3 +torsion 43 60 68 67 -0.200 0.0 1 -0.272 180.0 2 0.741 0.0 3 +torsion 43 60 68 68 -0.661 0.0 1 0.186 180.0 2 -1.167 0.0 3 +torsion 44 60 68 65 -1.147 0.0 1 -1.082 180.0 2 -0.750 0.0 3 +torsion 44 60 68 67 0.108 0.0 1 -0.262 180.0 2 -0.427 0.0 3 +torsion 44 60 68 68 0.233 0.0 1 0.289 180.0 2 2.754 0.0 3 +torsion 43 60 76 76 -0.221 0.0 1 1.258 180.0 2 0.971 0.0 3 +torsion 43 60 76 77 0.648 0.0 1 -0.088 180.0 2 -0.233 0.0 3 +torsion 43 60 76 78 1.075 0.0 1 -0.251 180.0 2 0.302 0.0 3 +torsion 44 60 76 76 -1.675 0.0 1 -0.401 180.0 2 1.310 0.0 3 +torsion 44 60 76 77 -0.771 0.0 1 -0.276 180.0 2 1.758 0.0 3 +torsion 44 60 76 78 -0.237 0.0 1 1.294 180.0 2 -0.128 0.0 3 +torsion 48 63 68 65 -2.316 0.0 1 0.596 180.0 2 -0.493 0.0 3 +torsion 48 63 68 67 1.107 0.0 1 -0.142 180.0 2 -0.178 0.0 3 +torsion 48 63 68 68 -2.163 0.0 1 0.794 180.0 2 1.420 0.0 3 +torsion 56 63 68 65 3.068 0.0 1 0.722 180.0 2 1.339 0.0 3 +torsion 56 63 68 67 -0.988 0.0 1 -0.186 180.0 2 0.346 0.0 3 +torsion 56 63 68 68 2.890 0.0 1 0.880 180.0 2 -0.605 0.0 3 +torsion 48 63 76 76 0.819 0.0 1 3.809 180.0 2 0.604 0.0 3 +torsion 48 63 76 77 -3.184 0.0 1 -2.234 180.0 2 0.000 0.0 3 +torsion 48 63 76 78 -0.480 0.0 1 -0.684 180.0 2 -0.282 0.0 3 +torsion 56 63 76 76 0.044 0.0 1 0.571 180.0 2 -0.516 0.0 3 +torsion 56 63 76 77 4.300 0.0 1 -1.454 180.0 2 -0.052 0.0 3 +torsion 56 63 76 78 -0.945 0.0 1 2.121 180.0 2 0.337 0.0 3 +torsion 68 65 66 67 -0.161 0.0 1 -0.026 180.0 2 0.277 0.0 3 +torsion 68 65 66 68 -0.563 0.0 1 0.770 180.0 2 -0.322 0.0 3 +torsion 68 65 66 72 -0.791 0.0 1 -0.829 180.0 2 1.101 0.0 3 +torsion 66 65 68 46 0.245 0.0 1 -0.367 180.0 2 0.305 0.0 3 +torsion 66 65 68 54 -0.444 0.0 1 -1.457 180.0 2 1.051 0.0 3 +torsion 66 65 68 60 0.245 0.0 1 -0.367 180.0 2 0.305 0.0 3 +torsion 66 65 68 63 -0.444 0.0 1 -1.457 180.0 2 1.051 0.0 3 +torsion 66 65 68 67 -0.135 0.0 1 0.678 180.0 2 0.846 0.0 3 +torsion 66 65 68 68 -0.320 0.0 1 -0.209 180.0 2 0.318 0.0 3 +torsion 65 66 68 67 -0.182 0.0 1 -0.745 180.0 2 0.727 0.0 3 +torsion 65 66 68 68 -0.702 0.0 1 -0.307 180.0 2 2.879 0.0 3 +torsion 65 66 68 71 1.164 0.0 1 0.732 180.0 2 -0.836 0.0 3 +torsion 65 66 68 87 1.164 0.0 1 0.732 180.0 2 -0.836 0.0 3 +torsion 67 66 68 67 0.081 0.0 1 -0.066 180.0 2 0.422 0.0 3 +torsion 67 66 68 68 -0.190 0.0 1 -0.101 180.0 2 0.543 0.0 3 +torsion 67 66 68 71 0.006 0.0 1 -0.170 180.0 2 -0.168 0.0 3 +torsion 67 66 68 87 0.006 0.0 1 -0.170 180.0 2 -0.168 0.0 3 +torsion 72 66 68 67 -0.265 0.0 1 0.360 180.0 2 -0.039 0.0 3 +torsion 72 66 68 68 -0.483 0.0 1 -1.984 180.0 2 0.091 0.0 3 +torsion 72 66 68 71 1.090 0.0 1 3.549 180.0 2 -1.833 0.0 3 +torsion 72 66 68 87 1.090 0.0 1 3.549 180.0 2 -1.833 0.0 3 +torsion 65 66 72 73 0.000 0.0 1 0.257 180.0 2 0.096 0.0 3 +torsion 65 66 72 74 1.333 0.0 1 -1.311 180.0 2 0.000 0.0 3 +torsion 65 66 72 86 1.333 0.0 1 -1.311 180.0 2 0.000 0.0 3 +torsion 67 66 72 73 0.000 0.0 1 0.000 180.0 2 0.133 0.0 3 +torsion 67 66 72 74 0.000 0.0 1 0.287 180.0 2 0.132 0.0 3 +torsion 67 66 72 86 0.000 0.0 1 0.287 180.0 2 0.132 0.0 3 +torsion 68 66 72 73 0.000 0.0 1 0.000 180.0 2 0.136 0.0 3 +torsion 68 66 72 74 -0.401 0.0 1 0.496 180.0 2 2.714 0.0 3 +torsion 68 66 72 86 -0.401 0.0 1 0.496 180.0 2 2.714 0.0 3 +torsion 46 68 68 67 -0.125 0.0 1 0.021 180.0 2 -0.086 0.0 3 +torsion 46 68 68 68 -1.702 0.0 1 0.379 180.0 2 0.262 0.0 3 +torsion 46 68 68 69 0.677 0.0 1 0.358 180.0 2 1.781 0.0 3 +torsion 54 68 68 67 0.151 0.0 1 -0.318 180.0 2 0.229 0.0 3 +torsion 54 68 68 68 1.331 0.0 1 -0.470 180.0 2 -0.535 0.0 3 +torsion 54 68 68 69 -1.812 0.0 1 1.755 180.0 2 0.933 0.0 3 +torsion 60 68 68 67 -0.125 0.0 1 0.021 180.0 2 -0.086 0.0 3 +torsion 60 68 68 68 -1.702 0.0 1 0.379 180.0 2 0.262 0.0 3 +torsion 60 68 68 69 0.677 0.0 1 0.358 180.0 2 1.781 0.0 3 +torsion 63 68 68 67 0.151 0.0 1 -0.318 180.0 2 0.229 0.0 3 +torsion 63 68 68 68 1.331 0.0 1 -0.470 180.0 2 -0.535 0.0 3 +torsion 63 68 68 69 -1.812 0.0 1 1.755 180.0 2 0.933 0.0 3 +torsion 65 68 68 67 0.005 0.0 1 0.133 180.0 2 -0.244 0.0 3 +torsion 65 68 68 68 -0.734 0.0 1 0.779 180.0 2 -1.058 0.0 3 +torsion 65 68 68 69 0.016 0.0 1 -0.949 180.0 2 0.636 0.0 3 +torsion 66 68 68 67 0.155 0.0 1 0.097 180.0 2 0.148 0.0 3 +torsion 66 68 68 68 -0.940 0.0 1 1.490 180.0 2 -1.143 0.0 3 +torsion 66 68 68 69 -1.280 0.0 1 0.457 180.0 2 0.975 0.0 3 +torsion 67 68 68 67 -0.244 0.0 1 -0.103 180.0 2 0.537 0.0 3 +torsion 67 68 68 68 -0.090 0.0 1 -0.366 180.0 2 0.190 0.0 3 +torsion 67 68 68 69 0.360 0.0 1 -1.026 180.0 2 0.826 0.0 3 +torsion 67 68 68 71 -0.163 0.0 1 0.092 180.0 2 0.174 0.0 3 +torsion 67 68 68 87 -0.163 0.0 1 0.092 180.0 2 0.174 0.0 3 +torsion 68 68 68 71 0.600 0.0 1 -0.511 180.0 2 -1.857 0.0 3 +torsion 68 68 68 87 0.600 0.0 1 -0.511 180.0 2 -1.857 0.0 3 +torsion 69 68 68 71 0.044 0.0 1 -1.208 180.0 2 1.530 0.0 3 +torsion 69 68 68 87 0.044 0.0 1 -1.208 180.0 2 1.530 0.0 3 +torsion 67 68 69 70 0.320 0.0 1 -0.343 180.0 2 0.264 0.0 3 +torsion 68 68 69 70 -1.051 0.0 1 2.670 180.0 2 0.052 0.0 3 +torsion 66 68 71 84 0.060 0.0 1 1.996 180.0 2 3.820 0.0 3 +torsion 67 68 71 84 4.441 0.0 1 -1.148 180.0 2 -2.262 0.0 3 +torsion 68 68 71 84 -5.421 0.0 1 0.856 180.0 2 -2.090 0.0 3 +torsion 66 68 87 70 0.477 0.0 1 -0.199 180.0 2 0.652 0.0 3 +torsion 67 68 87 70 0.950 0.0 1 1.111 180.0 2 0.075 0.0 3 +torsion 68 68 87 70 -1.807 0.0 1 -0.383 180.0 2 -0.263 0.0 3 +torsion 68 71 84 74 -4.666 0.0 1 6.282 180.0 2 0.996 0.0 3 +torsion 68 71 84 85 -6.338 0.0 1 6.788 180.0 2 0.370 0.0 3 +torsion 66 72 74 84 0.000 0.0 1 1.905 180.0 2 0.000 0.0 3 +torsion 73 72 74 84 0.000 0.0 1 0.000 180.0 2 0.120 0.0 3 +torsion 66 72 86 70 -0.863 0.0 1 1.141 180.0 2 -1.090 0.0 3 +torsion 73 72 86 70 0.403 0.0 1 -0.303 180.0 2 0.428 0.0 3 +torsion 72 74 84 71 -4.666 0.0 1 6.282 180.0 2 0.996 0.0 3 +torsion 72 74 84 85 -6.338 0.0 1 6.788 180.0 2 0.370 0.0 3 +torsion 77 75 76 76 -0.484 0.0 1 0.023 180.0 2 0.416 0.0 3 +torsion 77 75 76 78 -0.562 0.0 1 -0.153 180.0 2 0.720 0.0 3 +torsion 77 75 76 80 0.386 0.0 1 -0.247 180.0 2 0.617 0.0 3 +torsion 77 75 76 88 0.386 0.0 1 -0.247 180.0 2 0.617 0.0 3 +torsion 78 75 76 76 -0.150 0.0 1 0.032 180.0 2 0.114 0.0 3 +torsion 78 75 76 78 -0.056 0.0 1 -0.283 180.0 2 0.428 0.0 3 +torsion 78 75 76 80 -0.367 0.0 1 -0.153 180.0 2 0.277 0.0 3 +torsion 78 75 76 88 -0.367 0.0 1 -0.153 180.0 2 0.277 0.0 3 +torsion 79 75 76 76 -0.609 0.0 1 -1.399 180.0 2 -0.326 0.0 3 +torsion 79 75 76 78 -0.340 0.0 1 -0.204 180.0 2 0.030 0.0 3 +torsion 79 75 76 80 0.354 0.0 1 0.507 180.0 2 -0.226 0.0 3 +torsion 79 75 76 88 0.354 0.0 1 0.507 180.0 2 -0.226 0.0 3 +torsion 76 75 77 76 0.285 0.0 1 -1.512 180.0 2 -0.212 0.0 3 +torsion 78 75 77 76 -1.461 0.0 1 1.145 180.0 2 0.303 0.0 3 +torsion 79 75 77 76 0.058 0.0 1 0.000 180.0 2 0.048 0.0 3 +torsion 76 75 79 82 0.000 0.0 1 0.000 180.0 2 0.194 0.0 3 +torsion 76 75 79 83 -0.434 0.0 1 0.630 180.0 2 2.364 0.0 3 +torsion 76 75 79 89 -0.434 0.0 1 0.630 180.0 2 2.364 0.0 3 +torsion 77 75 79 82 0.000 0.0 1 0.607 180.0 2 0.028 0.0 3 +torsion 77 75 79 83 0.456 0.0 1 -1.166 180.0 2 0.000 0.0 3 +torsion 77 75 79 89 0.456 0.0 1 -1.166 180.0 2 0.000 0.0 3 +torsion 78 75 79 82 0.000 0.0 1 0.000 180.0 2 0.326 0.0 3 +torsion 78 75 79 83 0.000 0.0 1 0.654 180.0 2 0.154 0.0 3 +torsion 78 75 79 89 0.000 0.0 1 0.654 180.0 2 0.154 0.0 3 +torsion 46 76 76 76 -0.583 0.0 1 -0.616 180.0 2 0.411 0.0 3 +torsion 46 76 76 78 0.499 0.0 1 -1.065 180.0 2 -0.019 0.0 3 +torsion 54 76 76 76 3.366 0.0 1 -2.257 180.0 2 -1.299 0.0 3 +torsion 54 76 76 78 1.119 0.0 1 -0.552 180.0 2 1.140 0.0 3 +torsion 60 76 76 76 -0.583 0.0 1 -0.616 180.0 2 0.411 0.0 3 +torsion 60 76 76 78 0.499 0.0 1 -1.065 180.0 2 -0.019 0.0 3 +torsion 63 76 76 76 3.366 0.0 1 -2.257 180.0 2 -1.299 0.0 3 +torsion 63 76 76 78 1.119 0.0 1 -0.552 180.0 2 1.140 0.0 3 +torsion 75 76 76 76 -0.545 0.0 1 0.230 180.0 2 0.306 0.0 3 +torsion 75 76 76 78 0.036 0.0 1 -1.454 180.0 2 0.014 0.0 3 +torsion 76 76 76 77 0.068 0.0 1 -1.039 180.0 2 -0.102 0.0 3 +torsion 76 76 76 78 -0.464 0.0 1 0.159 180.0 2 0.896 0.0 3 +torsion 76 76 76 80 -0.354 0.0 1 0.007 180.0 2 0.129 0.0 3 +torsion 76 76 76 88 -0.354 0.0 1 0.007 180.0 2 0.129 0.0 3 +torsion 77 76 76 78 -0.886 0.0 1 0.249 180.0 2 -1.124 0.0 3 +torsion 78 76 76 78 -0.758 0.0 1 0.104 180.0 2 0.868 0.0 3 +torsion 78 76 76 80 -0.569 0.0 1 0.086 180.0 2 -0.337 0.0 3 +torsion 78 76 76 88 -0.569 0.0 1 0.086 180.0 2 -0.337 0.0 3 +torsion 46 76 77 75 -0.201 0.0 1 -0.654 180.0 2 -0.791 0.0 3 +torsion 54 76 77 75 -0.209 0.0 1 1.352 180.0 2 -2.522 0.0 3 +torsion 60 76 77 75 -0.201 0.0 1 -0.654 180.0 2 -0.791 0.0 3 +torsion 63 76 77 75 -0.209 0.0 1 1.352 180.0 2 -2.522 0.0 3 +torsion 76 76 77 75 0.774 0.0 1 -2.681 180.0 2 0.498 0.0 3 +torsion 78 76 77 75 -1.252 0.0 1 1.892 180.0 2 0.059 0.0 3 +torsion 75 76 80 84 -1.164 0.0 1 0.505 180.0 2 0.239 0.0 3 +torsion 76 76 80 84 -1.502 0.0 1 0.223 180.0 2 0.056 0.0 3 +torsion 78 76 80 84 0.897 0.0 1 -0.136 180.0 2 0.147 0.0 3 +torsion 75 76 88 81 0.138 0.0 1 0.401 180.0 2 0.438 0.0 3 +torsion 76 76 88 81 -0.727 0.0 1 -0.708 180.0 2 0.974 0.0 3 +torsion 78 76 88 81 -0.263 0.0 1 -0.458 180.0 2 0.409 0.0 3 +torsion 75 79 83 84 -0.690 0.0 1 0.000 180.0 2 -0.148 0.0 3 +torsion 82 79 83 84 0.000 0.0 1 0.000 180.0 2 0.120 0.0 3 +torsion 75 79 89 81 -1.207 0.0 1 -1.651 180.0 2 -0.176 0.0 3 +torsion 82 79 89 81 0.659 0.0 1 0.975 180.0 2 -0.414 0.0 3 +torsion 76 80 84 83 -4.666 0.0 1 6.282 180.0 2 0.996 0.0 3 +torsion 76 80 84 85 -6.338 0.0 1 6.788 180.0 2 0.370 0.0 3 +torsion 79 83 84 80 -4.666 0.0 1 6.282 180.0 2 0.996 0.0 3 +torsion 79 83 84 85 -6.338 0.0 1 6.788 180.0 2 0.370 0.0 3 + + + ############################# + ## ## + ## Pi-Torsion Parameters ## + ## ## + ############################# + + +pitors 1 3 6.85 +pitors 3 15 6.85 +pitors 17 17 6.85 +pitors 22 22 6.85 +pitors 22 24 6.85 +pitors 24 26 6.85 +pitors 24 28 6.85 +pitors 26 26 6.85 +pitors 43 43 4.00 +pitors 43 45 4.00 +pitors 43 46 6.00 +pitors 43 56 3.00 +pitors 43 60 6.00 +pitors 44 46 6.00 +pitors 44 60 6.00 +pitors 45 47 6.00 +pitors 45 55 4.00 +pitors 47 59 4.00 +pitors 48 48 4.00 +pitors 48 54 3.00 +pitors 48 55 4.00 +pitors 48 56 3.00 +pitors 48 63 3.00 +pitors 54 56 3.00 +pitors 54 59 3.00 +pitors 56 63 3.00 +pitors 59 63 3.00 + + + ################################## + ## ## + ## Stretch-Torsion Parameters ## + ## ## + ################################## + + +strtors 44 46 68 65 0.000 0.000 1.500 0.000 0.000 -4.000 0.000 0.000 5.200 +strtors 44 46 76 77 0.000 0.000 1.500 0.000 0.000 -4.000 0.000 0.000 5.200 +strtors 48 54 68 65 0.000 0.000 1.500 0.000 0.000 -4.000 0.000 0.000 5.200 +strtors 48 54 76 77 0.000 0.000 1.500 0.000 0.000 -4.000 0.000 0.000 5.200 +strtors 44 60 68 65 0.000 0.000 1.500 0.000 0.000 -4.000 0.000 0.000 5.200 +strtors 44 60 76 77 0.000 0.000 1.500 0.000 0.000 -4.000 0.000 0.000 5.200 +strtors 48 63 68 65 0.000 0.000 1.500 0.000 0.000 -4.000 0.000 0.000 5.200 +strtors 48 63 76 77 0.000 0.000 1.500 0.000 0.000 -4.000 0.000 0.000 5.200 +strtors 68 71 84 74 0.000 0.000 0.000 0.000 1.814 0.000 -4.254 0.000 0.000 +strtors 72 74 84 71 0.000 0.000 0.000 0.000 1.814 0.000 -4.254 0.000 0.000 +strtors 76 80 84 83 0.000 0.000 0.000 0.000 1.814 0.000 -4.254 0.000 0.000 +strtors 79 83 84 80 0.000 0.000 0.000 0.000 1.814 0.000 -4.254 0.000 0.000 + + + ################################ + ## ## + ## Angle-Torsion Parameters ## + ## ## + ################################ + + +angtors 44 46 68 65 0.014 0.000 -0.058 0.000 0.000 -0.011 +angtors 44 46 76 77 0.014 0.000 -0.058 0.000 0.000 -0.011 +angtors 48 54 68 65 0.014 0.000 -0.058 0.000 0.000 -0.011 +angtors 48 54 76 77 0.014 0.000 -0.058 0.000 0.000 -0.011 +angtors 44 60 68 65 0.014 0.000 -0.058 0.000 0.000 -0.011 +angtors 44 60 76 77 0.014 0.000 -0.058 0.000 0.000 -0.011 +angtors 48 63 68 65 0.014 0.000 -0.058 0.000 0.000 -0.011 +angtors 48 63 76 77 0.014 0.000 -0.058 0.000 0.000 -0.011 +angtors 68 71 84 85 0.000 0.000 -0.011 0.000 -0.116 0.000 +angtors 72 74 84 85 0.000 0.000 -0.011 0.000 -0.116 0.000 +angtors 76 80 84 85 0.000 0.000 -0.011 0.000 -0.116 0.000 +angtors 79 83 84 85 0.000 0.000 -0.011 0.000 -0.116 0.000 + + + ################################## + ## ## + ## Torsion-Torsion Parameters ## + ## ## + ################################## + + +tortors 3 1 2 3 1 25 25 + -180.0 -180.0 -0.41030 + -165.0 -180.0 -0.67838 + -150.0 -180.0 -1.32284 + -135.0 -180.0 -2.35817 + -120.0 -180.0 -3.54199 + -105.0 -180.0 -4.74648 + -90.0 -180.0 -5.73614 + -75.0 -180.0 -6.35918 + -60.0 -180.0 -6.35328 + -45.0 -180.0 -5.25542 + -30.0 -180.0 -3.16646 + -15.0 -180.0 -1.09098 + 0.0 -180.0 1.38787 + 15.0 -180.0 -1.09098 + 30.0 -180.0 -3.16646 + 45.0 -180.0 -5.25542 + 60.0 -180.0 -6.35328 + 75.0 -180.0 -6.36063 + 90.0 -180.0 -5.73614 + 105.0 -180.0 -4.74648 + 120.0 -180.0 -3.54199 + 135.0 -180.0 -2.35817 + 150.0 -180.0 -1.32284 + 165.0 -180.0 -0.67848 + 180.0 -180.0 -0.41030 + -180.0 -165.0 -0.41413 + -165.0 -165.0 -0.90052 + -150.0 -165.0 -1.68618 + -135.0 -165.0 -2.64483 + -120.0 -165.0 -3.73864 + -105.0 -165.0 -4.87747 + -90.0 -165.0 -5.89392 + -75.0 -165.0 -6.55928 + -60.0 -165.0 -6.49751 + -45.0 -165.0 -5.22067 + -30.0 -165.0 -2.94954 + -15.0 -165.0 -0.08376 + 0.0 -165.0 0.32603 + 15.0 -165.0 -1.02648 + 30.0 -165.0 -3.08291 + 45.0 -165.0 -4.96362 + 60.0 -165.0 -5.89147 + 75.0 -165.0 -5.87160 + 90.0 -165.0 -5.26258 + 105.0 -165.0 -4.24252 + 120.0 -165.0 -3.01099 + 135.0 -165.0 -1.80556 + 150.0 -165.0 -0.85965 + 165.0 -165.0 -0.38834 + 180.0 -165.0 -0.41413 + -180.0 -150.0 -0.34547 + -165.0 -150.0 -0.91119 + -150.0 -150.0 -1.61128 + -135.0 -150.0 -2.39523 + -120.0 -150.0 -3.36374 + -105.0 -150.0 -4.51571 + -90.0 -150.0 -5.59097 + -75.0 -150.0 -6.28648 + -60.0 -150.0 -4.83329 + -45.0 -150.0 -4.62413 + -30.0 -150.0 -1.82424 + -15.0 -150.0 1.19531 + 0.0 -150.0 0.65267 + 15.0 -150.0 -0.72633 + 30.0 -150.0 -2.63732 + 45.0 -150.0 -4.32002 + 60.0 -150.0 -5.24397 + 75.0 -150.0 -5.11358 + 90.0 -150.0 -4.47212 + 105.0 -150.0 -3.43923 + 120.0 -150.0 -2.21872 + 135.0 -150.0 -1.09788 + 150.0 -150.0 -0.34336 + 165.0 -150.0 -0.09173 + 180.0 -150.0 -0.34547 + -180.0 -135.0 0.11457 + -165.0 -135.0 -0.35767 + -150.0 -135.0 -0.86749 + -135.0 -135.0 -1.46100 + -120.0 -135.0 -2.41372 + -105.0 -135.0 -3.62454 + -90.0 -135.0 -4.73673 + -75.0 -135.0 -5.35985 + -60.0 -135.0 -4.95241 + -45.0 -135.0 -2.94717 + -30.0 -135.0 1.07212 + -15.0 -135.0 1.77725 + 0.0 -135.0 1.29409 + 15.0 -135.0 -0.05629 + 30.0 -135.0 -1.78936 + 45.0 -135.0 -3.31494 + 60.0 -135.0 -4.15255 + 75.0 -135.0 -4.14746 + 90.0 -135.0 -3.48022 + 105.0 -135.0 -2.57323 + 120.0 -135.0 -1.38411 + 135.0 -135.0 -0.26179 + 150.0 -135.0 0.30336 + 165.0 -135.0 0.39970 + 180.0 -135.0 0.11457 + -180.0 -120.0 0.94012 + -165.0 -120.0 0.68619 + -150.0 -120.0 0.39856 + -135.0 -120.0 -0.12378 + -120.0 -120.0 -1.19823 + -105.0 -120.0 -2.58368 + -90.0 -120.0 -3.50628 + -75.0 -120.0 -3.94292 + -60.0 -120.0 -3.11264 + -45.0 -120.0 -0.39145 + -30.0 -120.0 2.74127 + -15.0 -120.0 2.72433 + 0.0 -120.0 2.15560 + 15.0 -120.0 1.05732 + 30.0 -120.0 -0.33944 + 45.0 -120.0 -1.83317 + 60.0 -120.0 -2.90987 + 75.0 -120.0 -3.08145 + 90.0 -120.0 -2.45277 + 105.0 -120.0 -1.58770 + 120.0 -120.0 -0.45731 + 135.0 -120.0 0.42439 + 150.0 -120.0 0.94220 + 165.0 -120.0 1.14392 + 180.0 -120.0 0.94012 + -180.0 -105.0 1.95487 + -165.0 -105.0 1.89156 + -150.0 -105.0 1.74844 + -135.0 -105.0 1.09827 + -120.0 -105.0 -0.23826 + -105.0 -105.0 -1.44395 + -90.0 -105.0 -2.34446 + -75.0 -105.0 -2.46809 + -60.0 -105.0 -1.05326 + -45.0 -105.0 1.58629 + -30.0 -105.0 3.35587 + -15.0 -105.0 3.45811 + 0.0 -105.0 3.26537 + 15.0 -105.0 2.74774 + 30.0 -105.0 1.68837 + 45.0 -105.0 0.01966 + 60.0 -105.0 -1.39335 + 75.0 -105.0 -2.00163 + 90.0 -105.0 -1.75770 + 105.0 -105.0 -0.79043 + 120.0 -105.0 0.25289 + 135.0 -105.0 1.13229 + 150.0 -105.0 1.65296 + 165.0 -105.0 1.97933 + 180.0 -105.0 1.95487 + -180.0 -90.0 2.74331 + -165.0 -90.0 2.74719 + -150.0 -90.0 2.65974 + -135.0 -90.0 1.59315 + -120.0 -90.0 0.44790 + -105.0 -90.0 -0.60009 + -90.0 -90.0 -1.24738 + -75.0 -90.0 -1.04633 + -60.0 -90.0 0.58385 + -45.0 -90.0 2.52552 + -30.0 -90.0 3.38653 + -15.0 -90.0 3.96283 + 0.0 -90.0 4.49297 + 15.0 -90.0 4.70534 + 30.0 -90.0 3.46788 + 45.0 -90.0 1.48393 + 60.0 -90.0 -0.28428 + 75.0 -90.0 -1.08330 + 90.0 -90.0 -1.11458 + 105.0 -90.0 -0.40231 + 120.0 -90.0 0.62829 + 135.0 -90.0 1.55961 + 150.0 -90.0 2.27845 + 165.0 -90.0 2.58188 + 180.0 -90.0 2.74331 + -180.0 -75.0 2.77751 + -165.0 -75.0 2.93260 + -150.0 -75.0 2.55866 + -135.0 -75.0 1.67411 + -120.0 -75.0 0.59458 + -105.0 -75.0 -0.17181 + -90.0 -75.0 -0.48079 + -75.0 -75.0 0.13385 + -60.0 -75.0 0.58100 + -45.0 -75.0 1.59048 + -30.0 -75.0 2.74299 + -15.0 -75.0 4.08945 + 0.0 -75.0 5.44049 + 15.0 -75.0 5.94623 + 30.0 -75.0 4.24483 + 45.0 -75.0 1.98183 + 60.0 -75.0 0.19866 + 75.0 -75.0 -0.95978 + 90.0 -75.0 -1.06248 + 105.0 -75.0 -0.43657 + 120.0 -75.0 0.70386 + 135.0 -75.0 1.60144 + 150.0 -75.0 2.18997 + 165.0 -75.0 2.53115 + 180.0 -75.0 2.77751 + -180.0 -60.0 1.75943 + -165.0 -60.0 1.79376 + -150.0 -60.0 1.47445 + -135.0 -60.0 0.86891 + -120.0 -60.0 0.19601 + -105.0 -60.0 -0.17426 + -90.0 -60.0 -1.15692 + -75.0 -60.0 -1.49008 + -60.0 -60.0 -1.04413 + -45.0 -60.0 0.12852 + -30.0 -60.0 1.88655 + -15.0 -60.0 3.95852 + 0.0 -60.0 5.75134 + 15.0 -60.0 5.31247 + 30.0 -60.0 3.44060 + 45.0 -60.0 1.34478 + 60.0 -60.0 -0.72835 + 75.0 -60.0 -1.64238 + 90.0 -60.0 -1.77690 + 105.0 -60.0 -1.08681 + 120.0 -60.0 -0.01095 + 135.0 -60.0 0.71371 + 150.0 -60.0 1.18267 + 165.0 -60.0 1.51071 + 180.0 -60.0 1.75943 + -180.0 -45.0 -0.27385 + -165.0 -45.0 -0.26642 + -150.0 -45.0 -0.36210 + -135.0 -45.0 -0.41066 + -120.0 -45.0 -1.56700 + -105.0 -45.0 -2.58412 + -90.0 -45.0 -3.31258 + -75.0 -45.0 -3.48890 + -60.0 -45.0 -2.82064 + -45.0 -45.0 -1.15606 + -30.0 -45.0 1.17974 + -15.0 -45.0 3.56251 + 0.0 -45.0 4.30355 + 15.0 -45.0 3.60759 + 30.0 -45.0 1.82415 + 45.0 -45.0 -0.23679 + 60.0 -45.0 -2.11507 + 75.0 -45.0 -3.16780 + 90.0 -45.0 -3.23377 + 105.0 -45.0 -2.42000 + 120.0 -45.0 -1.56505 + 135.0 -45.0 -1.07442 + 150.0 -45.0 -0.69448 + 165.0 -45.0 -0.39460 + 180.0 -45.0 -0.27385 + -180.0 -30.0 -2.58364 + -165.0 -30.0 -2.46195 + -150.0 -30.0 -2.03519 + -135.0 -30.0 -3.32323 + -120.0 -30.0 -4.15184 + -105.0 -30.0 -4.81605 + -90.0 -30.0 -5.26121 + -75.0 -30.0 -5.15227 + -60.0 -30.0 -4.04692 + -45.0 -30.0 -2.03450 + -30.0 -30.0 0.38805 + -15.0 -30.0 1.96687 + 0.0 -30.0 2.31228 + 15.0 -30.0 1.55486 + 30.0 -30.0 -0.06654 + 45.0 -30.0 -2.00755 + 60.0 -30.0 -3.84363 + 75.0 -30.0 -4.69688 + 90.0 -30.0 -4.67162 + 105.0 -30.0 -4.04096 + 120.0 -30.0 -3.61554 + 135.0 -30.0 -3.21036 + 150.0 -30.0 -2.88548 + 165.0 -30.0 -2.68532 + 180.0 -30.0 -2.58364 + -180.0 -15.0 -4.27536 + -165.0 -15.0 -3.60137 + -150.0 -15.0 -4.68528 + -135.0 -15.0 -5.26619 + -120.0 -15.0 -5.75171 + -105.0 -15.0 -6.18609 + -90.0 -15.0 -6.40257 + -75.0 -15.0 -5.99165 + -60.0 -15.0 -4.68897 + -45.0 -15.0 -2.79424 + -30.0 -15.0 -0.88273 + -15.0 -15.0 0.42755 + 0.0 -15.0 0.73235 + 15.0 -15.0 0.05777 + 30.0 -15.0 -1.33943 + 45.0 -15.0 -3.22837 + 60.0 -15.0 -4.85236 + 75.0 -15.0 -5.72489 + 90.0 -15.0 -5.75813 + 105.0 -15.0 -5.59602 + 120.0 -15.0 -5.30079 + 135.0 -15.0 -4.95535 + 150.0 -15.0 -4.67044 + 165.0 -15.0 -4.46238 + 180.0 -15.0 -4.27536 + -180.0 0.0 -4.22230 + -165.0 0.0 -5.04625 + -150.0 0.0 -5.41586 + -135.0 0.0 -5.74456 + -120.0 0.0 -6.10583 + -105.0 0.0 -6.42560 + -90.0 0.0 -6.50266 + -75.0 0.0 -6.06098 + -60.0 0.0 -5.05604 + -45.0 0.0 -3.40770 + -30.0 0.0 -1.55029 + -15.0 0.0 -0.29366 + 0.0 0.0 0.07505 + 15.0 0.0 -0.34966 + 30.0 0.0 -1.55069 + 45.0 0.0 -3.40780 + 60.0 0.0 -5.05604 + 75.0 0.0 -6.06088 + 90.0 0.0 -6.50276 + 105.0 0.0 -6.42560 + 120.0 0.0 -6.10583 + 135.0 0.0 -5.74466 + 150.0 0.0 -5.41586 + 165.0 0.0 -5.04645 + 180.0 0.0 -4.22230 + -180.0 15.0 -4.27526 + -165.0 15.0 -4.46238 + -150.0 15.0 -4.67044 + -135.0 15.0 -4.95535 + -120.0 15.0 -5.30069 + -105.0 15.0 -5.59602 + -90.0 15.0 -5.75823 + -75.0 15.0 -5.72479 + -60.0 15.0 -4.85236 + -45.0 15.0 -3.22837 + -30.0 15.0 -1.33903 + -15.0 15.0 0.05777 + 0.0 15.0 0.73245 + 15.0 15.0 0.42655 + 30.0 15.0 -0.88283 + 45.0 15.0 -2.79424 + 60.0 15.0 -4.68897 + 75.0 15.0 -5.99165 + 90.0 15.0 -6.40257 + 105.0 15.0 -6.18609 + 120.0 15.0 -5.75161 + 135.0 15.0 -5.26619 + 150.0 15.0 -4.68528 + 165.0 15.0 -3.60147 + 180.0 15.0 -4.27526 + -180.0 30.0 -2.58364 + -165.0 30.0 -2.68532 + -150.0 30.0 -2.88548 + -135.0 30.0 -3.21036 + -120.0 30.0 -3.61554 + -105.0 30.0 -4.04096 + -90.0 30.0 -4.67162 + -75.0 30.0 -4.69688 + -60.0 30.0 -3.84373 + -45.0 30.0 -2.00765 + -30.0 30.0 -0.06654 + -15.0 30.0 1.55486 + 0.0 30.0 2.31188 + 15.0 30.0 1.95817 + 30.0 30.0 0.38855 + 45.0 30.0 -2.03450 + 60.0 30.0 -4.04682 + 75.0 30.0 -5.15227 + 90.0 30.0 -5.26121 + 105.0 30.0 -4.81605 + 120.0 30.0 -4.15184 + 135.0 30.0 -3.32353 + 150.0 30.0 -2.03519 + 165.0 30.0 -2.46185 + 180.0 30.0 -2.58364 + -180.0 45.0 -0.27385 + -165.0 45.0 -0.39460 + -150.0 45.0 -0.69448 + -135.0 45.0 -1.07442 + -120.0 45.0 -1.56505 + -105.0 45.0 -2.42000 + -90.0 45.0 -3.23377 + -75.0 45.0 -3.16790 + -60.0 45.0 -2.11507 + -45.0 45.0 -0.23679 + -30.0 45.0 1.82415 + -15.0 45.0 3.60759 + 0.0 45.0 4.30295 + 15.0 45.0 3.56251 + 30.0 45.0 1.17974 + 45.0 45.0 -1.15606 + 60.0 45.0 -2.82064 + 75.0 45.0 -3.48890 + 90.0 45.0 -3.31258 + 105.0 45.0 -2.58412 + 120.0 45.0 -1.56700 + 135.0 45.0 -0.41066 + 150.0 45.0 -0.36210 + 165.0 45.0 -0.26642 + 180.0 45.0 -0.27385 + -180.0 60.0 1.75943 + -165.0 60.0 1.51071 + -150.0 60.0 1.18267 + -135.0 60.0 0.71371 + -120.0 60.0 -0.01095 + -105.0 60.0 -1.08681 + -90.0 60.0 -1.77710 + -75.0 60.0 -1.64228 + -60.0 60.0 -0.72835 + -45.0 60.0 1.34478 + -30.0 60.0 3.44050 + -15.0 60.0 5.31247 + 0.0 60.0 5.75134 + 15.0 60.0 3.95862 + 30.0 60.0 1.88655 + 45.0 60.0 0.12792 + 60.0 60.0 -1.04403 + 75.0 60.0 -1.49008 + 90.0 60.0 -1.15692 + 105.0 60.0 -0.17426 + 120.0 60.0 0.19601 + 135.0 60.0 0.86911 + 150.0 60.0 1.47445 + 165.0 60.0 1.79366 + 180.0 60.0 1.75943 + -180.0 75.0 2.77761 + -165.0 75.0 2.53125 + -150.0 75.0 2.18987 + -135.0 75.0 1.60144 + -120.0 75.0 0.70386 + -105.0 75.0 -0.43657 + -90.0 75.0 -1.06238 + -75.0 75.0 -0.95978 + -60.0 75.0 0.19866 + -45.0 75.0 1.98173 + -30.0 75.0 4.24483 + -15.0 75.0 5.94623 + 0.0 75.0 5.44049 + 15.0 75.0 4.08935 + 30.0 75.0 2.74299 + 45.0 75.0 1.59048 + 60.0 75.0 0.58100 + 75.0 75.0 0.13385 + 90.0 75.0 -0.48069 + 105.0 75.0 -0.17171 + 120.0 75.0 0.59458 + 135.0 75.0 1.67401 + 150.0 75.0 2.55876 + 165.0 75.0 2.93260 + 180.0 75.0 2.77761 + -180.0 90.0 2.74331 + -165.0 90.0 2.58198 + -150.0 90.0 2.27845 + -135.0 90.0 1.55961 + -120.0 90.0 0.62829 + -105.0 90.0 -0.40231 + -90.0 90.0 -1.11458 + -75.0 90.0 -1.08320 + -60.0 90.0 -0.28428 + -45.0 90.0 1.48393 + -30.0 90.0 3.46788 + -15.0 90.0 4.70554 + 0.0 90.0 4.49327 + 15.0 90.0 3.96283 + 30.0 90.0 3.38653 + 45.0 90.0 2.52482 + 60.0 90.0 0.58385 + 75.0 90.0 -1.04633 + 90.0 90.0 -1.24738 + 105.0 90.0 -0.60009 + 120.0 90.0 0.44790 + 135.0 90.0 1.59315 + 150.0 90.0 2.65974 + 165.0 90.0 2.74719 + 180.0 90.0 2.74331 + -180.0 105.0 1.95497 + -165.0 105.0 1.97933 + -150.0 105.0 1.65296 + -135.0 105.0 1.13219 + -120.0 105.0 0.25289 + -105.0 105.0 -0.79043 + -90.0 105.0 -1.75760 + -75.0 105.0 -2.00163 + -60.0 105.0 -1.39335 + -45.0 105.0 0.01966 + -30.0 105.0 1.68837 + -15.0 105.0 2.74754 + 0.0 105.0 3.26537 + 15.0 105.0 3.45811 + 30.0 105.0 3.35587 + 45.0 105.0 1.58629 + 60.0 105.0 -1.05326 + 75.0 105.0 -2.46809 + 90.0 105.0 -2.34446 + 105.0 105.0 -1.44395 + 120.0 105.0 -0.23836 + 135.0 105.0 1.09817 + 150.0 105.0 1.74844 + 165.0 105.0 1.89146 + 180.0 105.0 1.95497 + -180.0 120.0 0.94002 + -165.0 120.0 1.14392 + -150.0 120.0 0.94220 + -135.0 120.0 0.42439 + -120.0 120.0 -0.45731 + -105.0 120.0 -1.58770 + -90.0 120.0 -2.45287 + -75.0 120.0 -3.08135 + -60.0 120.0 -2.90997 + -45.0 120.0 -1.83307 + -30.0 120.0 -0.33944 + -15.0 120.0 1.05732 + 0.0 120.0 2.15560 + 15.0 120.0 2.72433 + 30.0 120.0 2.73567 + 45.0 120.0 -0.51565 + 60.0 120.0 -3.11264 + 75.0 120.0 -3.94292 + 90.0 120.0 -3.50628 + 105.0 120.0 -2.58378 + 120.0 120.0 -1.19823 + 135.0 120.0 -0.12378 + 150.0 120.0 0.39856 + 165.0 120.0 0.68619 + 180.0 120.0 0.94002 + -180.0 135.0 0.11457 + -165.0 135.0 0.39970 + -150.0 135.0 0.30326 + -135.0 135.0 -0.26169 + -120.0 135.0 -1.38411 + -105.0 135.0 -2.57323 + -90.0 135.0 -3.48022 + -75.0 135.0 -4.14746 + -60.0 135.0 -4.15255 + -45.0 135.0 -3.31494 + -30.0 135.0 -1.78936 + -15.0 135.0 -0.05629 + 0.0 135.0 1.29409 + 15.0 135.0 1.77725 + 30.0 135.0 1.07212 + 45.0 135.0 -2.94717 + 60.0 135.0 -4.95241 + 75.0 135.0 -5.35985 + 90.0 135.0 -4.73673 + 105.0 135.0 -3.62454 + 120.0 135.0 -2.41382 + 135.0 135.0 -1.46090 + 150.0 135.0 -0.86739 + 165.0 135.0 -0.35767 + 180.0 135.0 0.11457 + -180.0 150.0 -0.34547 + -165.0 150.0 -0.09173 + -150.0 150.0 -0.34336 + -135.0 150.0 -1.09788 + -120.0 150.0 -2.21872 + -105.0 150.0 -3.43923 + -90.0 150.0 -4.47202 + -75.0 150.0 -5.11368 + -60.0 150.0 -5.15707 + -45.0 150.0 -4.32002 + -30.0 150.0 -2.63712 + -15.0 150.0 -0.72643 + 0.0 150.0 0.43227 + 15.0 150.0 1.19521 + 30.0 150.0 -1.82424 + 45.0 150.0 -4.62413 + 60.0 150.0 -6.11149 + 75.0 150.0 -6.28648 + 90.0 150.0 -5.59097 + 105.0 150.0 -4.51581 + 120.0 150.0 -3.36364 + 135.0 150.0 -2.39523 + 150.0 150.0 -1.61138 + 165.0 150.0 -0.91119 + 180.0 150.0 -0.34547 + -180.0 165.0 -0.41413 + -165.0 165.0 -0.38834 + -150.0 165.0 -0.85965 + -135.0 165.0 -1.80556 + -120.0 165.0 -3.01099 + -105.0 165.0 -4.24252 + -90.0 165.0 -5.26258 + -75.0 165.0 -5.87160 + -60.0 165.0 -5.89147 + -45.0 165.0 -4.96362 + -30.0 165.0 -3.08291 + -15.0 165.0 -1.02648 + 0.0 165.0 0.32603 + 15.0 165.0 -0.08376 + 30.0 165.0 -2.94954 + 45.0 165.0 -5.22077 + 60.0 165.0 -6.49751 + 75.0 165.0 -6.55928 + 90.0 165.0 -5.89392 + 105.0 165.0 -4.87737 + 120.0 165.0 -3.73864 + 135.0 165.0 -2.64493 + 150.0 165.0 -1.68618 + 165.0 165.0 -0.90052 + 180.0 165.0 -0.41413 + -180.0 180.0 -0.41030 + -165.0 180.0 -0.67838 + -150.0 180.0 -1.32284 + -135.0 180.0 -2.35817 + -120.0 180.0 -3.54199 + -105.0 180.0 -4.74648 + -90.0 180.0 -5.73614 + -75.0 180.0 -6.35918 + -60.0 180.0 -6.35328 + -45.0 180.0 -5.25542 + -30.0 180.0 -3.16646 + -15.0 180.0 -1.09098 + 0.0 180.0 1.38787 + 15.0 180.0 -1.09098 + 30.0 180.0 -3.16646 + 45.0 180.0 -5.25542 + 60.0 180.0 -6.35328 + 75.0 180.0 -6.36063 + 90.0 180.0 -5.73614 + 105.0 180.0 -4.74648 + 120.0 180.0 -3.54199 + 135.0 180.0 -2.35817 + 150.0 180.0 -1.32284 + 165.0 180.0 -0.67848 + 180.0 180.0 -0.41030 + +tortors 3 1 2 32 34 25 25 + -180.0 -180.0 -0.41030 + -165.0 -180.0 -0.67838 + -150.0 -180.0 -1.32284 + -135.0 -180.0 -2.35817 + -120.0 -180.0 -3.54199 + -105.0 -180.0 -4.74648 + -90.0 -180.0 -5.73614 + -75.0 -180.0 -6.35918 + -60.0 -180.0 -6.35328 + -45.0 -180.0 -5.25542 + -30.0 -180.0 -3.16646 + -15.0 -180.0 -1.09098 + 0.0 -180.0 1.38787 + 15.0 -180.0 -1.09098 + 30.0 -180.0 -3.16646 + 45.0 -180.0 -5.25542 + 60.0 -180.0 -6.35328 + 75.0 -180.0 -6.36063 + 90.0 -180.0 -5.73614 + 105.0 -180.0 -4.74648 + 120.0 -180.0 -3.54199 + 135.0 -180.0 -2.35817 + 150.0 -180.0 -1.32284 + 165.0 -180.0 -0.67848 + 180.0 -180.0 -0.41030 + -180.0 -165.0 -0.41413 + -165.0 -165.0 -0.90052 + -150.0 -165.0 -1.68618 + -135.0 -165.0 -2.64483 + -120.0 -165.0 -3.73864 + -105.0 -165.0 -4.87747 + -90.0 -165.0 -5.89392 + -75.0 -165.0 -6.55928 + -60.0 -165.0 -6.49751 + -45.0 -165.0 -5.22067 + -30.0 -165.0 -2.94954 + -15.0 -165.0 -0.08376 + 0.0 -165.0 0.32603 + 15.0 -165.0 -1.02648 + 30.0 -165.0 -3.08291 + 45.0 -165.0 -4.96362 + 60.0 -165.0 -5.89147 + 75.0 -165.0 -5.87160 + 90.0 -165.0 -5.26258 + 105.0 -165.0 -4.24252 + 120.0 -165.0 -3.01099 + 135.0 -165.0 -1.80556 + 150.0 -165.0 -0.85965 + 165.0 -165.0 -0.38834 + 180.0 -165.0 -0.41413 + -180.0 -150.0 -0.34547 + -165.0 -150.0 -0.91119 + -150.0 -150.0 -1.61128 + -135.0 -150.0 -2.39523 + -120.0 -150.0 -3.36374 + -105.0 -150.0 -4.51571 + -90.0 -150.0 -5.59097 + -75.0 -150.0 -6.28648 + -60.0 -150.0 -4.83329 + -45.0 -150.0 -4.62413 + -30.0 -150.0 -1.82424 + -15.0 -150.0 1.19531 + 0.0 -150.0 0.65267 + 15.0 -150.0 -0.72633 + 30.0 -150.0 -2.63732 + 45.0 -150.0 -4.32002 + 60.0 -150.0 -5.24397 + 75.0 -150.0 -5.11358 + 90.0 -150.0 -4.47212 + 105.0 -150.0 -3.43923 + 120.0 -150.0 -2.21872 + 135.0 -150.0 -1.09788 + 150.0 -150.0 -0.34336 + 165.0 -150.0 -0.09173 + 180.0 -150.0 -0.34547 + -180.0 -135.0 0.11457 + -165.0 -135.0 -0.35767 + -150.0 -135.0 -0.86749 + -135.0 -135.0 -1.46100 + -120.0 -135.0 -2.41372 + -105.0 -135.0 -3.62454 + -90.0 -135.0 -4.73673 + -75.0 -135.0 -5.35985 + -60.0 -135.0 -4.95241 + -45.0 -135.0 -2.94717 + -30.0 -135.0 1.07212 + -15.0 -135.0 1.77725 + 0.0 -135.0 1.29409 + 15.0 -135.0 -0.05629 + 30.0 -135.0 -1.78936 + 45.0 -135.0 -3.31494 + 60.0 -135.0 -4.15255 + 75.0 -135.0 -4.14746 + 90.0 -135.0 -3.48022 + 105.0 -135.0 -2.57323 + 120.0 -135.0 -1.38411 + 135.0 -135.0 -0.26179 + 150.0 -135.0 0.30336 + 165.0 -135.0 0.39970 + 180.0 -135.0 0.11457 + -180.0 -120.0 0.94012 + -165.0 -120.0 0.68619 + -150.0 -120.0 0.39856 + -135.0 -120.0 -0.12378 + -120.0 -120.0 -1.19823 + -105.0 -120.0 -2.58368 + -90.0 -120.0 -3.50628 + -75.0 -120.0 -3.94292 + -60.0 -120.0 -3.11264 + -45.0 -120.0 -0.39145 + -30.0 -120.0 2.74127 + -15.0 -120.0 2.72433 + 0.0 -120.0 2.15560 + 15.0 -120.0 1.05732 + 30.0 -120.0 -0.33944 + 45.0 -120.0 -1.83317 + 60.0 -120.0 -2.90987 + 75.0 -120.0 -3.08145 + 90.0 -120.0 -2.45277 + 105.0 -120.0 -1.58770 + 120.0 -120.0 -0.45731 + 135.0 -120.0 0.42439 + 150.0 -120.0 0.94220 + 165.0 -120.0 1.14392 + 180.0 -120.0 0.94012 + -180.0 -105.0 1.95487 + -165.0 -105.0 1.89156 + -150.0 -105.0 1.74844 + -135.0 -105.0 1.09827 + -120.0 -105.0 -0.23826 + -105.0 -105.0 -1.44395 + -90.0 -105.0 -2.34446 + -75.0 -105.0 -2.46809 + -60.0 -105.0 -1.05326 + -45.0 -105.0 1.58629 + -30.0 -105.0 3.35587 + -15.0 -105.0 3.45811 + 0.0 -105.0 3.26537 + 15.0 -105.0 2.74774 + 30.0 -105.0 1.68837 + 45.0 -105.0 0.01966 + 60.0 -105.0 -1.39335 + 75.0 -105.0 -2.00163 + 90.0 -105.0 -1.75770 + 105.0 -105.0 -0.79043 + 120.0 -105.0 0.25289 + 135.0 -105.0 1.13229 + 150.0 -105.0 1.65296 + 165.0 -105.0 1.97933 + 180.0 -105.0 1.95487 + -180.0 -90.0 2.74331 + -165.0 -90.0 2.74719 + -150.0 -90.0 2.65974 + -135.0 -90.0 1.59315 + -120.0 -90.0 0.44790 + -105.0 -90.0 -0.60009 + -90.0 -90.0 -1.24738 + -75.0 -90.0 -1.04633 + -60.0 -90.0 0.58385 + -45.0 -90.0 2.52552 + -30.0 -90.0 3.38653 + -15.0 -90.0 3.96283 + 0.0 -90.0 4.49297 + 15.0 -90.0 4.70534 + 30.0 -90.0 3.46788 + 45.0 -90.0 1.48393 + 60.0 -90.0 -0.28428 + 75.0 -90.0 -1.08330 + 90.0 -90.0 -1.11458 + 105.0 -90.0 -0.40231 + 120.0 -90.0 0.62829 + 135.0 -90.0 1.55961 + 150.0 -90.0 2.27845 + 165.0 -90.0 2.58188 + 180.0 -90.0 2.74331 + -180.0 -75.0 2.77751 + -165.0 -75.0 2.93260 + -150.0 -75.0 2.55866 + -135.0 -75.0 1.67411 + -120.0 -75.0 0.59458 + -105.0 -75.0 -0.17181 + -90.0 -75.0 -0.48079 + -75.0 -75.0 0.13385 + -60.0 -75.0 0.58100 + -45.0 -75.0 1.59048 + -30.0 -75.0 2.74299 + -15.0 -75.0 4.08945 + 0.0 -75.0 5.44049 + 15.0 -75.0 5.94623 + 30.0 -75.0 4.24483 + 45.0 -75.0 1.98183 + 60.0 -75.0 0.19866 + 75.0 -75.0 -0.95978 + 90.0 -75.0 -1.06248 + 105.0 -75.0 -0.43657 + 120.0 -75.0 0.70386 + 135.0 -75.0 1.60144 + 150.0 -75.0 2.18997 + 165.0 -75.0 2.53115 + 180.0 -75.0 2.77751 + -180.0 -60.0 1.75943 + -165.0 -60.0 1.79376 + -150.0 -60.0 1.47445 + -135.0 -60.0 0.86891 + -120.0 -60.0 0.19601 + -105.0 -60.0 -0.17426 + -90.0 -60.0 -1.15692 + -75.0 -60.0 -1.49008 + -60.0 -60.0 -1.04413 + -45.0 -60.0 0.12852 + -30.0 -60.0 1.88655 + -15.0 -60.0 3.95852 + 0.0 -60.0 5.75134 + 15.0 -60.0 5.31247 + 30.0 -60.0 3.44060 + 45.0 -60.0 1.34478 + 60.0 -60.0 -0.72835 + 75.0 -60.0 -1.64238 + 90.0 -60.0 -1.77690 + 105.0 -60.0 -1.08681 + 120.0 -60.0 -0.01095 + 135.0 -60.0 0.71371 + 150.0 -60.0 1.18267 + 165.0 -60.0 1.51071 + 180.0 -60.0 1.75943 + -180.0 -45.0 -0.27385 + -165.0 -45.0 -0.26642 + -150.0 -45.0 -0.36210 + -135.0 -45.0 -0.41066 + -120.0 -45.0 -1.56700 + -105.0 -45.0 -2.58412 + -90.0 -45.0 -3.31258 + -75.0 -45.0 -3.48890 + -60.0 -45.0 -2.82064 + -45.0 -45.0 -1.15606 + -30.0 -45.0 1.17974 + -15.0 -45.0 3.56251 + 0.0 -45.0 4.30355 + 15.0 -45.0 3.60759 + 30.0 -45.0 1.82415 + 45.0 -45.0 -0.23679 + 60.0 -45.0 -2.11507 + 75.0 -45.0 -3.16780 + 90.0 -45.0 -3.23377 + 105.0 -45.0 -2.42000 + 120.0 -45.0 -1.56505 + 135.0 -45.0 -1.07442 + 150.0 -45.0 -0.69448 + 165.0 -45.0 -0.39460 + 180.0 -45.0 -0.27385 + -180.0 -30.0 -2.58364 + -165.0 -30.0 -2.46195 + -150.0 -30.0 -2.03519 + -135.0 -30.0 -3.32323 + -120.0 -30.0 -4.15184 + -105.0 -30.0 -4.81605 + -90.0 -30.0 -5.26121 + -75.0 -30.0 -5.15227 + -60.0 -30.0 -4.04692 + -45.0 -30.0 -2.03450 + -30.0 -30.0 0.38805 + -15.0 -30.0 1.96687 + 0.0 -30.0 2.31228 + 15.0 -30.0 1.55486 + 30.0 -30.0 -0.06654 + 45.0 -30.0 -2.00755 + 60.0 -30.0 -3.84363 + 75.0 -30.0 -4.69688 + 90.0 -30.0 -4.67162 + 105.0 -30.0 -4.04096 + 120.0 -30.0 -3.61554 + 135.0 -30.0 -3.21036 + 150.0 -30.0 -2.88548 + 165.0 -30.0 -2.68532 + 180.0 -30.0 -2.58364 + -180.0 -15.0 -4.27536 + -165.0 -15.0 -3.60137 + -150.0 -15.0 -4.68528 + -135.0 -15.0 -5.26619 + -120.0 -15.0 -5.75171 + -105.0 -15.0 -6.18609 + -90.0 -15.0 -6.40257 + -75.0 -15.0 -5.99165 + -60.0 -15.0 -4.68897 + -45.0 -15.0 -2.79424 + -30.0 -15.0 -0.88273 + -15.0 -15.0 0.42755 + 0.0 -15.0 0.73235 + 15.0 -15.0 0.05777 + 30.0 -15.0 -1.33943 + 45.0 -15.0 -3.22837 + 60.0 -15.0 -4.85236 + 75.0 -15.0 -5.72489 + 90.0 -15.0 -5.75813 + 105.0 -15.0 -5.59602 + 120.0 -15.0 -5.30079 + 135.0 -15.0 -4.95535 + 150.0 -15.0 -4.67044 + 165.0 -15.0 -4.46238 + 180.0 -15.0 -4.27536 + -180.0 0.0 -4.22230 + -165.0 0.0 -5.04625 + -150.0 0.0 -5.41586 + -135.0 0.0 -5.74456 + -120.0 0.0 -6.10583 + -105.0 0.0 -6.42560 + -90.0 0.0 -6.50266 + -75.0 0.0 -6.06098 + -60.0 0.0 -5.05604 + -45.0 0.0 -3.40770 + -30.0 0.0 -1.55029 + -15.0 0.0 -0.29366 + 0.0 0.0 0.07505 + 15.0 0.0 -0.34966 + 30.0 0.0 -1.55069 + 45.0 0.0 -3.40780 + 60.0 0.0 -5.05604 + 75.0 0.0 -6.06088 + 90.0 0.0 -6.50276 + 105.0 0.0 -6.42560 + 120.0 0.0 -6.10583 + 135.0 0.0 -5.74466 + 150.0 0.0 -5.41586 + 165.0 0.0 -5.04645 + 180.0 0.0 -4.22230 + -180.0 15.0 -4.27526 + -165.0 15.0 -4.46238 + -150.0 15.0 -4.67044 + -135.0 15.0 -4.95535 + -120.0 15.0 -5.30069 + -105.0 15.0 -5.59602 + -90.0 15.0 -5.75823 + -75.0 15.0 -5.72479 + -60.0 15.0 -4.85236 + -45.0 15.0 -3.22837 + -30.0 15.0 -1.33903 + -15.0 15.0 0.05777 + 0.0 15.0 0.73245 + 15.0 15.0 0.42655 + 30.0 15.0 -0.88283 + 45.0 15.0 -2.79424 + 60.0 15.0 -4.68897 + 75.0 15.0 -5.99165 + 90.0 15.0 -6.40257 + 105.0 15.0 -6.18609 + 120.0 15.0 -5.75161 + 135.0 15.0 -5.26619 + 150.0 15.0 -4.68528 + 165.0 15.0 -3.60147 + 180.0 15.0 -4.27526 + -180.0 30.0 -2.58364 + -165.0 30.0 -2.68532 + -150.0 30.0 -2.88548 + -135.0 30.0 -3.21036 + -120.0 30.0 -3.61554 + -105.0 30.0 -4.04096 + -90.0 30.0 -4.67162 + -75.0 30.0 -4.69688 + -60.0 30.0 -3.84373 + -45.0 30.0 -2.00765 + -30.0 30.0 -0.06654 + -15.0 30.0 1.55486 + 0.0 30.0 2.31188 + 15.0 30.0 1.95817 + 30.0 30.0 0.38855 + 45.0 30.0 -2.03450 + 60.0 30.0 -4.04682 + 75.0 30.0 -5.15227 + 90.0 30.0 -5.26121 + 105.0 30.0 -4.81605 + 120.0 30.0 -4.15184 + 135.0 30.0 -3.32353 + 150.0 30.0 -2.03519 + 165.0 30.0 -2.46185 + 180.0 30.0 -2.58364 + -180.0 45.0 -0.27385 + -165.0 45.0 -0.39460 + -150.0 45.0 -0.69448 + -135.0 45.0 -1.07442 + -120.0 45.0 -1.56505 + -105.0 45.0 -2.42000 + -90.0 45.0 -3.23377 + -75.0 45.0 -3.16790 + -60.0 45.0 -2.11507 + -45.0 45.0 -0.23679 + -30.0 45.0 1.82415 + -15.0 45.0 3.60759 + 0.0 45.0 4.30295 + 15.0 45.0 3.56251 + 30.0 45.0 1.17974 + 45.0 45.0 -1.15606 + 60.0 45.0 -2.82064 + 75.0 45.0 -3.48890 + 90.0 45.0 -3.31258 + 105.0 45.0 -2.58412 + 120.0 45.0 -1.56700 + 135.0 45.0 -0.41066 + 150.0 45.0 -0.36210 + 165.0 45.0 -0.26642 + 180.0 45.0 -0.27385 + -180.0 60.0 1.75943 + -165.0 60.0 1.51071 + -150.0 60.0 1.18267 + -135.0 60.0 0.71371 + -120.0 60.0 -0.01095 + -105.0 60.0 -1.08681 + -90.0 60.0 -1.77710 + -75.0 60.0 -1.64228 + -60.0 60.0 -0.72835 + -45.0 60.0 1.34478 + -30.0 60.0 3.44050 + -15.0 60.0 5.31247 + 0.0 60.0 5.75134 + 15.0 60.0 3.95862 + 30.0 60.0 1.88655 + 45.0 60.0 0.12792 + 60.0 60.0 -1.04403 + 75.0 60.0 -1.49008 + 90.0 60.0 -1.15692 + 105.0 60.0 -0.17426 + 120.0 60.0 0.19601 + 135.0 60.0 0.86911 + 150.0 60.0 1.47445 + 165.0 60.0 1.79366 + 180.0 60.0 1.75943 + -180.0 75.0 2.77761 + -165.0 75.0 2.53125 + -150.0 75.0 2.18987 + -135.0 75.0 1.60144 + -120.0 75.0 0.70386 + -105.0 75.0 -0.43657 + -90.0 75.0 -1.06238 + -75.0 75.0 -0.95978 + -60.0 75.0 0.19866 + -45.0 75.0 1.98173 + -30.0 75.0 4.24483 + -15.0 75.0 5.94623 + 0.0 75.0 5.44049 + 15.0 75.0 4.08935 + 30.0 75.0 2.74299 + 45.0 75.0 1.59048 + 60.0 75.0 0.58100 + 75.0 75.0 0.13385 + 90.0 75.0 -0.48069 + 105.0 75.0 -0.17171 + 120.0 75.0 0.59458 + 135.0 75.0 1.67401 + 150.0 75.0 2.55876 + 165.0 75.0 2.93260 + 180.0 75.0 2.77761 + -180.0 90.0 2.74331 + -165.0 90.0 2.58198 + -150.0 90.0 2.27845 + -135.0 90.0 1.55961 + -120.0 90.0 0.62829 + -105.0 90.0 -0.40231 + -90.0 90.0 -1.11458 + -75.0 90.0 -1.08320 + -60.0 90.0 -0.28428 + -45.0 90.0 1.48393 + -30.0 90.0 3.46788 + -15.0 90.0 4.70554 + 0.0 90.0 4.49327 + 15.0 90.0 3.96283 + 30.0 90.0 3.38653 + 45.0 90.0 2.52482 + 60.0 90.0 0.58385 + 75.0 90.0 -1.04633 + 90.0 90.0 -1.24738 + 105.0 90.0 -0.60009 + 120.0 90.0 0.44790 + 135.0 90.0 1.59315 + 150.0 90.0 2.65974 + 165.0 90.0 2.74719 + 180.0 90.0 2.74331 + -180.0 105.0 1.95497 + -165.0 105.0 1.97933 + -150.0 105.0 1.65296 + -135.0 105.0 1.13219 + -120.0 105.0 0.25289 + -105.0 105.0 -0.79043 + -90.0 105.0 -1.75760 + -75.0 105.0 -2.00163 + -60.0 105.0 -1.39335 + -45.0 105.0 0.01966 + -30.0 105.0 1.68837 + -15.0 105.0 2.74754 + 0.0 105.0 3.26537 + 15.0 105.0 3.45811 + 30.0 105.0 3.35587 + 45.0 105.0 1.58629 + 60.0 105.0 -1.05326 + 75.0 105.0 -2.46809 + 90.0 105.0 -2.34446 + 105.0 105.0 -1.44395 + 120.0 105.0 -0.23836 + 135.0 105.0 1.09817 + 150.0 105.0 1.74844 + 165.0 105.0 1.89146 + 180.0 105.0 1.95497 + -180.0 120.0 0.94002 + -165.0 120.0 1.14392 + -150.0 120.0 0.94220 + -135.0 120.0 0.42439 + -120.0 120.0 -0.45731 + -105.0 120.0 -1.58770 + -90.0 120.0 -2.45287 + -75.0 120.0 -3.08135 + -60.0 120.0 -2.90997 + -45.0 120.0 -1.83307 + -30.0 120.0 -0.33944 + -15.0 120.0 1.05732 + 0.0 120.0 2.15560 + 15.0 120.0 2.72433 + 30.0 120.0 2.73567 + 45.0 120.0 -0.51565 + 60.0 120.0 -3.11264 + 75.0 120.0 -3.94292 + 90.0 120.0 -3.50628 + 105.0 120.0 -2.58378 + 120.0 120.0 -1.19823 + 135.0 120.0 -0.12378 + 150.0 120.0 0.39856 + 165.0 120.0 0.68619 + 180.0 120.0 0.94002 + -180.0 135.0 0.11457 + -165.0 135.0 0.39970 + -150.0 135.0 0.30326 + -135.0 135.0 -0.26169 + -120.0 135.0 -1.38411 + -105.0 135.0 -2.57323 + -90.0 135.0 -3.48022 + -75.0 135.0 -4.14746 + -60.0 135.0 -4.15255 + -45.0 135.0 -3.31494 + -30.0 135.0 -1.78936 + -15.0 135.0 -0.05629 + 0.0 135.0 1.29409 + 15.0 135.0 1.77725 + 30.0 135.0 1.07212 + 45.0 135.0 -2.94717 + 60.0 135.0 -4.95241 + 75.0 135.0 -5.35985 + 90.0 135.0 -4.73673 + 105.0 135.0 -3.62454 + 120.0 135.0 -2.41382 + 135.0 135.0 -1.46090 + 150.0 135.0 -0.86739 + 165.0 135.0 -0.35767 + 180.0 135.0 0.11457 + -180.0 150.0 -0.34547 + -165.0 150.0 -0.09173 + -150.0 150.0 -0.34336 + -135.0 150.0 -1.09788 + -120.0 150.0 -2.21872 + -105.0 150.0 -3.43923 + -90.0 150.0 -4.47202 + -75.0 150.0 -5.11368 + -60.0 150.0 -5.15707 + -45.0 150.0 -4.32002 + -30.0 150.0 -2.63712 + -15.0 150.0 -0.72643 + 0.0 150.0 0.43227 + 15.0 150.0 1.19521 + 30.0 150.0 -1.82424 + 45.0 150.0 -4.62413 + 60.0 150.0 -6.11149 + 75.0 150.0 -6.28648 + 90.0 150.0 -5.59097 + 105.0 150.0 -4.51581 + 120.0 150.0 -3.36364 + 135.0 150.0 -2.39523 + 150.0 150.0 -1.61138 + 165.0 150.0 -0.91119 + 180.0 150.0 -0.34547 + -180.0 165.0 -0.41413 + -165.0 165.0 -0.38834 + -150.0 165.0 -0.85965 + -135.0 165.0 -1.80556 + -120.0 165.0 -3.01099 + -105.0 165.0 -4.24252 + -90.0 165.0 -5.26258 + -75.0 165.0 -5.87160 + -60.0 165.0 -5.89147 + -45.0 165.0 -4.96362 + -30.0 165.0 -3.08291 + -15.0 165.0 -1.02648 + 0.0 165.0 0.32603 + 15.0 165.0 -0.08376 + 30.0 165.0 -2.94954 + 45.0 165.0 -5.22077 + 60.0 165.0 -6.49751 + 75.0 165.0 -6.55928 + 90.0 165.0 -5.89392 + 105.0 165.0 -4.87737 + 120.0 165.0 -3.73864 + 135.0 165.0 -2.64493 + 150.0 165.0 -1.68618 + 165.0 165.0 -0.90052 + 180.0 165.0 -0.41413 + -180.0 180.0 -0.41030 + -165.0 180.0 -0.67838 + -150.0 180.0 -1.32284 + -135.0 180.0 -2.35817 + -120.0 180.0 -3.54199 + -105.0 180.0 -4.74648 + -90.0 180.0 -5.73614 + -75.0 180.0 -6.35918 + -60.0 180.0 -6.35328 + -45.0 180.0 -5.25542 + -30.0 180.0 -3.16646 + -15.0 180.0 -1.09098 + 0.0 180.0 1.38787 + 15.0 180.0 -1.09098 + 30.0 180.0 -3.16646 + 45.0 180.0 -5.25542 + 60.0 180.0 -6.35328 + 75.0 180.0 -6.36063 + 90.0 180.0 -5.73614 + 105.0 180.0 -4.74648 + 120.0 180.0 -3.54199 + 135.0 180.0 -2.35817 + 150.0 180.0 -1.32284 + 165.0 180.0 -0.67848 + 180.0 180.0 -0.41030 + +tortors 3 1 2 3 15 25 25 + -180.0 -180.0 -0.41030 + -165.0 -180.0 -0.67838 + -150.0 -180.0 -1.32284 + -135.0 -180.0 -2.35817 + -120.0 -180.0 -3.54199 + -105.0 -180.0 -4.74648 + -90.0 -180.0 -5.73614 + -75.0 -180.0 -6.35918 + -60.0 -180.0 -6.35328 + -45.0 -180.0 -5.25542 + -30.0 -180.0 -3.16646 + -15.0 -180.0 -1.09098 + 0.0 -180.0 1.38787 + 15.0 -180.0 -1.09098 + 30.0 -180.0 -3.16646 + 45.0 -180.0 -5.25542 + 60.0 -180.0 -6.35328 + 75.0 -180.0 -6.36063 + 90.0 -180.0 -5.73614 + 105.0 -180.0 -4.74648 + 120.0 -180.0 -3.54199 + 135.0 -180.0 -2.35817 + 150.0 -180.0 -1.32284 + 165.0 -180.0 -0.67848 + 180.0 -180.0 -0.41030 + -180.0 -165.0 -0.41413 + -165.0 -165.0 -0.90052 + -150.0 -165.0 -1.68618 + -135.0 -165.0 -2.64483 + -120.0 -165.0 -3.73864 + -105.0 -165.0 -4.87747 + -90.0 -165.0 -5.89392 + -75.0 -165.0 -6.55928 + -60.0 -165.0 -6.49751 + -45.0 -165.0 -5.22067 + -30.0 -165.0 -2.94954 + -15.0 -165.0 -0.08376 + 0.0 -165.0 0.32603 + 15.0 -165.0 -1.02648 + 30.0 -165.0 -3.08291 + 45.0 -165.0 -4.96362 + 60.0 -165.0 -5.89147 + 75.0 -165.0 -5.87160 + 90.0 -165.0 -5.26258 + 105.0 -165.0 -4.24252 + 120.0 -165.0 -3.01099 + 135.0 -165.0 -1.80556 + 150.0 -165.0 -0.85965 + 165.0 -165.0 -0.38834 + 180.0 -165.0 -0.41413 + -180.0 -150.0 -0.34547 + -165.0 -150.0 -0.91119 + -150.0 -150.0 -1.61128 + -135.0 -150.0 -2.39523 + -120.0 -150.0 -3.36374 + -105.0 -150.0 -4.51571 + -90.0 -150.0 -5.59097 + -75.0 -150.0 -6.28648 + -60.0 -150.0 -4.83329 + -45.0 -150.0 -4.62413 + -30.0 -150.0 -1.82424 + -15.0 -150.0 1.19531 + 0.0 -150.0 0.65267 + 15.0 -150.0 -0.72633 + 30.0 -150.0 -2.63732 + 45.0 -150.0 -4.32002 + 60.0 -150.0 -5.24397 + 75.0 -150.0 -5.11358 + 90.0 -150.0 -4.47212 + 105.0 -150.0 -3.43923 + 120.0 -150.0 -2.21872 + 135.0 -150.0 -1.09788 + 150.0 -150.0 -0.34336 + 165.0 -150.0 -0.09173 + 180.0 -150.0 -0.34547 + -180.0 -135.0 0.11457 + -165.0 -135.0 -0.35767 + -150.0 -135.0 -0.86749 + -135.0 -135.0 -1.46100 + -120.0 -135.0 -2.41372 + -105.0 -135.0 -3.62454 + -90.0 -135.0 -4.73673 + -75.0 -135.0 -5.35985 + -60.0 -135.0 -4.95241 + -45.0 -135.0 -2.94717 + -30.0 -135.0 1.07212 + -15.0 -135.0 1.77725 + 0.0 -135.0 1.29409 + 15.0 -135.0 -0.05629 + 30.0 -135.0 -1.78936 + 45.0 -135.0 -3.31494 + 60.0 -135.0 -4.15255 + 75.0 -135.0 -4.14746 + 90.0 -135.0 -3.48022 + 105.0 -135.0 -2.57323 + 120.0 -135.0 -1.38411 + 135.0 -135.0 -0.26179 + 150.0 -135.0 0.30336 + 165.0 -135.0 0.39970 + 180.0 -135.0 0.11457 + -180.0 -120.0 0.94012 + -165.0 -120.0 0.68619 + -150.0 -120.0 0.39856 + -135.0 -120.0 -0.12378 + -120.0 -120.0 -1.19823 + -105.0 -120.0 -2.58368 + -90.0 -120.0 -3.50628 + -75.0 -120.0 -3.94292 + -60.0 -120.0 -3.11264 + -45.0 -120.0 -0.39145 + -30.0 -120.0 2.74127 + -15.0 -120.0 2.72433 + 0.0 -120.0 2.15560 + 15.0 -120.0 1.05732 + 30.0 -120.0 -0.33944 + 45.0 -120.0 -1.83317 + 60.0 -120.0 -2.90987 + 75.0 -120.0 -3.08145 + 90.0 -120.0 -2.45277 + 105.0 -120.0 -1.58770 + 120.0 -120.0 -0.45731 + 135.0 -120.0 0.42439 + 150.0 -120.0 0.94220 + 165.0 -120.0 1.14392 + 180.0 -120.0 0.94012 + -180.0 -105.0 1.95487 + -165.0 -105.0 1.89156 + -150.0 -105.0 1.74844 + -135.0 -105.0 1.09827 + -120.0 -105.0 -0.23826 + -105.0 -105.0 -1.44395 + -90.0 -105.0 -2.34446 + -75.0 -105.0 -2.46809 + -60.0 -105.0 -1.05326 + -45.0 -105.0 1.58629 + -30.0 -105.0 3.35587 + -15.0 -105.0 3.45811 + 0.0 -105.0 3.26537 + 15.0 -105.0 2.74774 + 30.0 -105.0 1.68837 + 45.0 -105.0 0.01966 + 60.0 -105.0 -1.39335 + 75.0 -105.0 -2.00163 + 90.0 -105.0 -1.75770 + 105.0 -105.0 -0.79043 + 120.0 -105.0 0.25289 + 135.0 -105.0 1.13229 + 150.0 -105.0 1.65296 + 165.0 -105.0 1.97933 + 180.0 -105.0 1.95487 + -180.0 -90.0 2.74331 + -165.0 -90.0 2.74719 + -150.0 -90.0 2.65974 + -135.0 -90.0 1.59315 + -120.0 -90.0 0.44790 + -105.0 -90.0 -0.60009 + -90.0 -90.0 -1.24738 + -75.0 -90.0 -1.04633 + -60.0 -90.0 0.58385 + -45.0 -90.0 2.52552 + -30.0 -90.0 3.38653 + -15.0 -90.0 3.96283 + 0.0 -90.0 4.49297 + 15.0 -90.0 4.70534 + 30.0 -90.0 3.46788 + 45.0 -90.0 1.48393 + 60.0 -90.0 -0.28428 + 75.0 -90.0 -1.08330 + 90.0 -90.0 -1.11458 + 105.0 -90.0 -0.40231 + 120.0 -90.0 0.62829 + 135.0 -90.0 1.55961 + 150.0 -90.0 2.27845 + 165.0 -90.0 2.58188 + 180.0 -90.0 2.74331 + -180.0 -75.0 2.77751 + -165.0 -75.0 2.93260 + -150.0 -75.0 2.55866 + -135.0 -75.0 1.67411 + -120.0 -75.0 0.59458 + -105.0 -75.0 -0.17181 + -90.0 -75.0 -0.48079 + -75.0 -75.0 0.13385 + -60.0 -75.0 0.58100 + -45.0 -75.0 1.59048 + -30.0 -75.0 2.74299 + -15.0 -75.0 4.08945 + 0.0 -75.0 5.44049 + 15.0 -75.0 5.94623 + 30.0 -75.0 4.24483 + 45.0 -75.0 1.98183 + 60.0 -75.0 0.19866 + 75.0 -75.0 -0.95978 + 90.0 -75.0 -1.06248 + 105.0 -75.0 -0.43657 + 120.0 -75.0 0.70386 + 135.0 -75.0 1.60144 + 150.0 -75.0 2.18997 + 165.0 -75.0 2.53115 + 180.0 -75.0 2.77751 + -180.0 -60.0 1.75943 + -165.0 -60.0 1.79376 + -150.0 -60.0 1.47445 + -135.0 -60.0 0.86891 + -120.0 -60.0 0.19601 + -105.0 -60.0 -0.17426 + -90.0 -60.0 -1.15692 + -75.0 -60.0 -1.49008 + -60.0 -60.0 -1.04413 + -45.0 -60.0 0.12852 + -30.0 -60.0 1.88655 + -15.0 -60.0 3.95852 + 0.0 -60.0 5.75134 + 15.0 -60.0 5.31247 + 30.0 -60.0 3.44060 + 45.0 -60.0 1.34478 + 60.0 -60.0 -0.72835 + 75.0 -60.0 -1.64238 + 90.0 -60.0 -1.77690 + 105.0 -60.0 -1.08681 + 120.0 -60.0 -0.01095 + 135.0 -60.0 0.71371 + 150.0 -60.0 1.18267 + 165.0 -60.0 1.51071 + 180.0 -60.0 1.75943 + -180.0 -45.0 -0.27385 + -165.0 -45.0 -0.26642 + -150.0 -45.0 -0.36210 + -135.0 -45.0 -0.41066 + -120.0 -45.0 -1.56700 + -105.0 -45.0 -2.58412 + -90.0 -45.0 -3.31258 + -75.0 -45.0 -3.48890 + -60.0 -45.0 -2.82064 + -45.0 -45.0 -1.15606 + -30.0 -45.0 1.17974 + -15.0 -45.0 3.56251 + 0.0 -45.0 4.30355 + 15.0 -45.0 3.60759 + 30.0 -45.0 1.82415 + 45.0 -45.0 -0.23679 + 60.0 -45.0 -2.11507 + 75.0 -45.0 -3.16780 + 90.0 -45.0 -3.23377 + 105.0 -45.0 -2.42000 + 120.0 -45.0 -1.56505 + 135.0 -45.0 -1.07442 + 150.0 -45.0 -0.69448 + 165.0 -45.0 -0.39460 + 180.0 -45.0 -0.27385 + -180.0 -30.0 -2.58364 + -165.0 -30.0 -2.46195 + -150.0 -30.0 -2.03519 + -135.0 -30.0 -3.32323 + -120.0 -30.0 -4.15184 + -105.0 -30.0 -4.81605 + -90.0 -30.0 -5.26121 + -75.0 -30.0 -5.15227 + -60.0 -30.0 -4.04692 + -45.0 -30.0 -2.03450 + -30.0 -30.0 0.38805 + -15.0 -30.0 1.96687 + 0.0 -30.0 2.31228 + 15.0 -30.0 1.55486 + 30.0 -30.0 -0.06654 + 45.0 -30.0 -2.00755 + 60.0 -30.0 -3.84363 + 75.0 -30.0 -4.69688 + 90.0 -30.0 -4.67162 + 105.0 -30.0 -4.04096 + 120.0 -30.0 -3.61554 + 135.0 -30.0 -3.21036 + 150.0 -30.0 -2.88548 + 165.0 -30.0 -2.68532 + 180.0 -30.0 -2.58364 + -180.0 -15.0 -4.27536 + -165.0 -15.0 -3.60137 + -150.0 -15.0 -4.68528 + -135.0 -15.0 -5.26619 + -120.0 -15.0 -5.75171 + -105.0 -15.0 -6.18609 + -90.0 -15.0 -6.40257 + -75.0 -15.0 -5.99165 + -60.0 -15.0 -4.68897 + -45.0 -15.0 -2.79424 + -30.0 -15.0 -0.88273 + -15.0 -15.0 0.42755 + 0.0 -15.0 0.73235 + 15.0 -15.0 0.05777 + 30.0 -15.0 -1.33943 + 45.0 -15.0 -3.22837 + 60.0 -15.0 -4.85236 + 75.0 -15.0 -5.72489 + 90.0 -15.0 -5.75813 + 105.0 -15.0 -5.59602 + 120.0 -15.0 -5.30079 + 135.0 -15.0 -4.95535 + 150.0 -15.0 -4.67044 + 165.0 -15.0 -4.46238 + 180.0 -15.0 -4.27536 + -180.0 0.0 -4.22230 + -165.0 0.0 -5.04625 + -150.0 0.0 -5.41586 + -135.0 0.0 -5.74456 + -120.0 0.0 -6.10583 + -105.0 0.0 -6.42560 + -90.0 0.0 -6.50266 + -75.0 0.0 -6.06098 + -60.0 0.0 -5.05604 + -45.0 0.0 -3.40770 + -30.0 0.0 -1.55029 + -15.0 0.0 -0.29366 + 0.0 0.0 0.07505 + 15.0 0.0 -0.34966 + 30.0 0.0 -1.55069 + 45.0 0.0 -3.40780 + 60.0 0.0 -5.05604 + 75.0 0.0 -6.06088 + 90.0 0.0 -6.50276 + 105.0 0.0 -6.42560 + 120.0 0.0 -6.10583 + 135.0 0.0 -5.74466 + 150.0 0.0 -5.41586 + 165.0 0.0 -5.04645 + 180.0 0.0 -4.22230 + -180.0 15.0 -4.27526 + -165.0 15.0 -4.46238 + -150.0 15.0 -4.67044 + -135.0 15.0 -4.95535 + -120.0 15.0 -5.30069 + -105.0 15.0 -5.59602 + -90.0 15.0 -5.75823 + -75.0 15.0 -5.72479 + -60.0 15.0 -4.85236 + -45.0 15.0 -3.22837 + -30.0 15.0 -1.33903 + -15.0 15.0 0.05777 + 0.0 15.0 0.73245 + 15.0 15.0 0.42655 + 30.0 15.0 -0.88283 + 45.0 15.0 -2.79424 + 60.0 15.0 -4.68897 + 75.0 15.0 -5.99165 + 90.0 15.0 -6.40257 + 105.0 15.0 -6.18609 + 120.0 15.0 -5.75161 + 135.0 15.0 -5.26619 + 150.0 15.0 -4.68528 + 165.0 15.0 -3.60147 + 180.0 15.0 -4.27526 + -180.0 30.0 -2.58364 + -165.0 30.0 -2.68532 + -150.0 30.0 -2.88548 + -135.0 30.0 -3.21036 + -120.0 30.0 -3.61554 + -105.0 30.0 -4.04096 + -90.0 30.0 -4.67162 + -75.0 30.0 -4.69688 + -60.0 30.0 -3.84373 + -45.0 30.0 -2.00765 + -30.0 30.0 -0.06654 + -15.0 30.0 1.55486 + 0.0 30.0 2.31188 + 15.0 30.0 1.95817 + 30.0 30.0 0.38855 + 45.0 30.0 -2.03450 + 60.0 30.0 -4.04682 + 75.0 30.0 -5.15227 + 90.0 30.0 -5.26121 + 105.0 30.0 -4.81605 + 120.0 30.0 -4.15184 + 135.0 30.0 -3.32353 + 150.0 30.0 -2.03519 + 165.0 30.0 -2.46185 + 180.0 30.0 -2.58364 + -180.0 45.0 -0.27385 + -165.0 45.0 -0.39460 + -150.0 45.0 -0.69448 + -135.0 45.0 -1.07442 + -120.0 45.0 -1.56505 + -105.0 45.0 -2.42000 + -90.0 45.0 -3.23377 + -75.0 45.0 -3.16790 + -60.0 45.0 -2.11507 + -45.0 45.0 -0.23679 + -30.0 45.0 1.82415 + -15.0 45.0 3.60759 + 0.0 45.0 4.30295 + 15.0 45.0 3.56251 + 30.0 45.0 1.17974 + 45.0 45.0 -1.15606 + 60.0 45.0 -2.82064 + 75.0 45.0 -3.48890 + 90.0 45.0 -3.31258 + 105.0 45.0 -2.58412 + 120.0 45.0 -1.56700 + 135.0 45.0 -0.41066 + 150.0 45.0 -0.36210 + 165.0 45.0 -0.26642 + 180.0 45.0 -0.27385 + -180.0 60.0 1.75943 + -165.0 60.0 1.51071 + -150.0 60.0 1.18267 + -135.0 60.0 0.71371 + -120.0 60.0 -0.01095 + -105.0 60.0 -1.08681 + -90.0 60.0 -1.77710 + -75.0 60.0 -1.64228 + -60.0 60.0 -0.72835 + -45.0 60.0 1.34478 + -30.0 60.0 3.44050 + -15.0 60.0 5.31247 + 0.0 60.0 5.75134 + 15.0 60.0 3.95862 + 30.0 60.0 1.88655 + 45.0 60.0 0.12792 + 60.0 60.0 -1.04403 + 75.0 60.0 -1.49008 + 90.0 60.0 -1.15692 + 105.0 60.0 -0.17426 + 120.0 60.0 0.19601 + 135.0 60.0 0.86911 + 150.0 60.0 1.47445 + 165.0 60.0 1.79366 + 180.0 60.0 1.75943 + -180.0 75.0 2.77761 + -165.0 75.0 2.53125 + -150.0 75.0 2.18987 + -135.0 75.0 1.60144 + -120.0 75.0 0.70386 + -105.0 75.0 -0.43657 + -90.0 75.0 -1.06238 + -75.0 75.0 -0.95978 + -60.0 75.0 0.19866 + -45.0 75.0 1.98173 + -30.0 75.0 4.24483 + -15.0 75.0 5.94623 + 0.0 75.0 5.44049 + 15.0 75.0 4.08935 + 30.0 75.0 2.74299 + 45.0 75.0 1.59048 + 60.0 75.0 0.58100 + 75.0 75.0 0.13385 + 90.0 75.0 -0.48069 + 105.0 75.0 -0.17171 + 120.0 75.0 0.59458 + 135.0 75.0 1.67401 + 150.0 75.0 2.55876 + 165.0 75.0 2.93260 + 180.0 75.0 2.77761 + -180.0 90.0 2.74331 + -165.0 90.0 2.58198 + -150.0 90.0 2.27845 + -135.0 90.0 1.55961 + -120.0 90.0 0.62829 + -105.0 90.0 -0.40231 + -90.0 90.0 -1.11458 + -75.0 90.0 -1.08320 + -60.0 90.0 -0.28428 + -45.0 90.0 1.48393 + -30.0 90.0 3.46788 + -15.0 90.0 4.70554 + 0.0 90.0 4.49327 + 15.0 90.0 3.96283 + 30.0 90.0 3.38653 + 45.0 90.0 2.52482 + 60.0 90.0 0.58385 + 75.0 90.0 -1.04633 + 90.0 90.0 -1.24738 + 105.0 90.0 -0.60009 + 120.0 90.0 0.44790 + 135.0 90.0 1.59315 + 150.0 90.0 2.65974 + 165.0 90.0 2.74719 + 180.0 90.0 2.74331 + -180.0 105.0 1.95497 + -165.0 105.0 1.97933 + -150.0 105.0 1.65296 + -135.0 105.0 1.13219 + -120.0 105.0 0.25289 + -105.0 105.0 -0.79043 + -90.0 105.0 -1.75760 + -75.0 105.0 -2.00163 + -60.0 105.0 -1.39335 + -45.0 105.0 0.01966 + -30.0 105.0 1.68837 + -15.0 105.0 2.74754 + 0.0 105.0 3.26537 + 15.0 105.0 3.45811 + 30.0 105.0 3.35587 + 45.0 105.0 1.58629 + 60.0 105.0 -1.05326 + 75.0 105.0 -2.46809 + 90.0 105.0 -2.34446 + 105.0 105.0 -1.44395 + 120.0 105.0 -0.23836 + 135.0 105.0 1.09817 + 150.0 105.0 1.74844 + 165.0 105.0 1.89146 + 180.0 105.0 1.95497 + -180.0 120.0 0.94002 + -165.0 120.0 1.14392 + -150.0 120.0 0.94220 + -135.0 120.0 0.42439 + -120.0 120.0 -0.45731 + -105.0 120.0 -1.58770 + -90.0 120.0 -2.45287 + -75.0 120.0 -3.08135 + -60.0 120.0 -2.90997 + -45.0 120.0 -1.83307 + -30.0 120.0 -0.33944 + -15.0 120.0 1.05732 + 0.0 120.0 2.15560 + 15.0 120.0 2.72433 + 30.0 120.0 2.73567 + 45.0 120.0 -0.51565 + 60.0 120.0 -3.11264 + 75.0 120.0 -3.94292 + 90.0 120.0 -3.50628 + 105.0 120.0 -2.58378 + 120.0 120.0 -1.19823 + 135.0 120.0 -0.12378 + 150.0 120.0 0.39856 + 165.0 120.0 0.68619 + 180.0 120.0 0.94002 + -180.0 135.0 0.11457 + -165.0 135.0 0.39970 + -150.0 135.0 0.30326 + -135.0 135.0 -0.26169 + -120.0 135.0 -1.38411 + -105.0 135.0 -2.57323 + -90.0 135.0 -3.48022 + -75.0 135.0 -4.14746 + -60.0 135.0 -4.15255 + -45.0 135.0 -3.31494 + -30.0 135.0 -1.78936 + -15.0 135.0 -0.05629 + 0.0 135.0 1.29409 + 15.0 135.0 1.77725 + 30.0 135.0 1.07212 + 45.0 135.0 -2.94717 + 60.0 135.0 -4.95241 + 75.0 135.0 -5.35985 + 90.0 135.0 -4.73673 + 105.0 135.0 -3.62454 + 120.0 135.0 -2.41382 + 135.0 135.0 -1.46090 + 150.0 135.0 -0.86739 + 165.0 135.0 -0.35767 + 180.0 135.0 0.11457 + -180.0 150.0 -0.34547 + -165.0 150.0 -0.09173 + -150.0 150.0 -0.34336 + -135.0 150.0 -1.09788 + -120.0 150.0 -2.21872 + -105.0 150.0 -3.43923 + -90.0 150.0 -4.47202 + -75.0 150.0 -5.11368 + -60.0 150.0 -5.15707 + -45.0 150.0 -4.32002 + -30.0 150.0 -2.63712 + -15.0 150.0 -0.72643 + 0.0 150.0 0.43227 + 15.0 150.0 1.19521 + 30.0 150.0 -1.82424 + 45.0 150.0 -4.62413 + 60.0 150.0 -6.11149 + 75.0 150.0 -6.28648 + 90.0 150.0 -5.59097 + 105.0 150.0 -4.51581 + 120.0 150.0 -3.36364 + 135.0 150.0 -2.39523 + 150.0 150.0 -1.61138 + 165.0 150.0 -0.91119 + 180.0 150.0 -0.34547 + -180.0 165.0 -0.41413 + -165.0 165.0 -0.38834 + -150.0 165.0 -0.85965 + -135.0 165.0 -1.80556 + -120.0 165.0 -3.01099 + -105.0 165.0 -4.24252 + -90.0 165.0 -5.26258 + -75.0 165.0 -5.87160 + -60.0 165.0 -5.89147 + -45.0 165.0 -4.96362 + -30.0 165.0 -3.08291 + -15.0 165.0 -1.02648 + 0.0 165.0 0.32603 + 15.0 165.0 -0.08376 + 30.0 165.0 -2.94954 + 45.0 165.0 -5.22077 + 60.0 165.0 -6.49751 + 75.0 165.0 -6.55928 + 90.0 165.0 -5.89392 + 105.0 165.0 -4.87737 + 120.0 165.0 -3.73864 + 135.0 165.0 -2.64493 + 150.0 165.0 -1.68618 + 165.0 165.0 -0.90052 + 180.0 165.0 -0.41413 + -180.0 180.0 -0.41030 + -165.0 180.0 -0.67838 + -150.0 180.0 -1.32284 + -135.0 180.0 -2.35817 + -120.0 180.0 -3.54199 + -105.0 180.0 -4.74648 + -90.0 180.0 -5.73614 + -75.0 180.0 -6.35918 + -60.0 180.0 -6.35328 + -45.0 180.0 -5.25542 + -30.0 180.0 -3.16646 + -15.0 180.0 -1.09098 + 0.0 180.0 1.38787 + 15.0 180.0 -1.09098 + 30.0 180.0 -3.16646 + 45.0 180.0 -5.25542 + 60.0 180.0 -6.35328 + 75.0 180.0 -6.36063 + 90.0 180.0 -5.73614 + 105.0 180.0 -4.74648 + 120.0 180.0 -3.54199 + 135.0 180.0 -2.35817 + 150.0 180.0 -1.32284 + 165.0 180.0 -0.67848 + 180.0 180.0 -0.41030 + + + ################################### + ## ## + ## Atomic Multipole Parameters ## + ## ## + ################################### + + +multipole 1 2 4 -0.22483 + 0.12482 0.00000 0.32382 + 0.10689 + 0.00000 -0.84021 + -0.14175 0.00000 0.73332 +multipole 2 1 3 -0.09722 + 0.29356 0.00000 0.16702 + 0.08444 + 0.00000 -0.32288 + -0.24845 0.00000 0.23844 +multipole 2 1 233 -0.31113 + 0.29356 0.00000 0.16702 + 0.08444 + 0.00000 -0.32288 + -0.24845 0.00000 0.23844 +multipole 2 1 235 -0.18217 + 0.30273 0.00000 0.14966 + -0.00540 + 0.00000 -0.58515 + -0.15734 0.00000 0.59055 +multipole 2 231 3 -0.06142 + 0.15310 0.00000 0.58485 + -1.10051 + 0.00000 -0.52551 + -0.23601 0.00000 1.62602 +multipole 3 5 2 0.79586 + -0.13770 0.00000 0.29742 + 0.14120 + 0.00000 -0.29053 + 0.00632 0.00000 0.14933 +multipole 4 1 2 0.13964 + 0.00855 0.00000 -0.12105 + 0.00073 + 0.00000 -0.01705 + -0.03619 0.00000 0.01632 +multipole 5 3 2 -0.76219 + 0.02701 0.00000 -0.11735 + -0.52988 + 0.00000 0.17528 + 0.04451 0.00000 0.35460 +multipole 6 2 6 0.07437 + 0.01314 0.00000 -0.06475 + 0.08205 + 0.00000 0.01765 + 0.00706 0.00000 -0.09970 +multipole 7 8 10 -0.15418 + 0.09038 0.00000 0.44023 + 0.11417 + 0.00000 -1.09602 + -0.18333 0.00000 0.98185 +multipole 7 48 10 -0.14115 + 0.12232 0.00000 0.52872 + -0.43015 + 0.00000 -0.90054 + -0.20486 0.00000 1.33069 +multipole 8 7 9 12 -0.17302 + 0.20245 0.00000 0.14886 + -0.19394 + 0.00000 -0.38164 + -0.02856 0.00000 0.57558 +multipole 8 7 233 12 -0.36199 + -0.12137 0.00000 0.18627 + -0.91798 + 0.00000 0.05376 + 0.15506 0.00000 0.86422 +multipole 8 7 235 12 -0.11441 + 0.20245 0.00000 0.14886 + -0.19394 + 0.00000 -0.38164 + -0.02856 0.00000 0.57558 +multipole 8 231 9 12 0.04440 + 0.09865 0.00000 0.46297 + -1.02943 + 0.00000 -0.69704 + -0.49818 0.00000 1.72647 +multipole 9 11 8 0.81010 + -0.03747 0.00000 0.23377 + 0.31967 + 0.00000 -0.32818 + -0.03412 0.00000 0.00851 +multipole 9 11 48 0.85003 + -0.02491 0.00000 0.25777 + 0.45171 + 0.00000 -0.12926 + -0.10936 0.00000 -0.32245 +multipole 10 7 8 0.12044 + -0.00442 0.00000 -0.13836 + 0.03666 + 0.00000 0.02185 + -0.10048 0.00000 -0.05851 +multipole 10 7 48 0.12637 + -0.02506 0.00000 -0.11601 + 0.15583 + 0.00000 0.22096 + 0.19740 0.00000 -0.37679 +multipole 11 9 8 -0.75149 + -0.00495 0.00000 -0.15871 + -0.53066 + 0.00000 0.27820 + 0.10276 0.00000 0.25246 +multipole 11 9 48 -0.77014 + 0.03419 0.00000 -0.15399 + -0.55689 + 0.00000 -0.04221 + 0.10937 0.00000 0.59910 +multipole 12 8 13 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 8 15 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 8 19 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 8 25 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 8 33 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 8 37 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 8 43 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 8 61 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 8 70 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 8 80 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 8 89 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 8 106 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 8 117 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 8 127 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 8 137 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 8 141 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 8 147 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 8 153 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 8 159 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 8 167 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 8 175 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 8 182 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 8 192 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 8 202 0.08514 + 0.02910 0.00000 0.05267 + 0.04149 + 0.00000 -0.00658 + -0.00600 0.00000 -0.03491 +multipole 12 48 43 0.07834 + 0.07720 0.00000 0.12670 + 0.05776 + 0.00000 -0.05378 + -0.00817 0.00000 -0.00398 +multipole 13 8 12 -0.15959 + -0.01994 0.00000 0.37655 + -0.25740 + 0.00000 -0.29981 + -0.04929 0.00000 0.55721 +multipole 14 13 8 0.07420 + -0.02399 0.00000 -0.11050 + 0.00932 + 0.00000 0.05597 + -0.06329 0.00000 -0.06529 +multipole 15 16 8 -0.06548 + 0.18863 0.00000 -0.25977 + 0.38994 + 0.00000 0.04868 + -0.23538 0.00000 -0.43862 +multipole 16 15 8 0.07117 + -0.02192 0.00000 -0.09528 + -0.12013 + 0.00000 0.08153 + -0.00394 0.00000 0.03860 +multipole 17 15 8 -0.16832 + -0.08635 0.00000 0.33587 + -0.27420 + 0.00000 -0.17464 + -0.25682 0.00000 0.44884 +multipole 18 17 15 0.06566 + -0.02088 0.00000 -0.10166 + 0.01623 + 0.00000 0.04728 + 0.00231 0.00000 -0.06351 +multipole 19 8 21 -0.13173 + 0.18350 0.00000 0.29386 + 0.00999 + 0.00000 -0.65954 + -0.21063 0.00000 0.64955 +multipole 20 19 21 0.06916 + 0.05664 0.00000 -0.13463 + 0.04076 + 0.00000 0.11032 + 0.10592 0.00000 -0.15108 +multipole 21 22 19 -0.02887 + 0.11379 0.00000 -0.33524 + 0.32588 + 0.00000 0.22134 + -0.11449 0.00000 -0.54722 +multipole 22 21 19 0.08767 + -0.01393 0.00000 -0.07934 + -0.05712 + 0.00000 0.16068 + 0.00191 0.00000 -0.10356 +multipole 23 21 19 -0.17741 + -0.04820 0.00000 0.27453 + -0.28572 + 0.00000 -0.21363 + -0.06394 0.00000 0.49935 +multipole 24 23 21 0.05874 + 0.00734 0.00000 -0.09498 + 0.04549 + 0.00000 0.01789 + 0.01922 0.00000 -0.06338 +multipole 25 26 27 -0.08555 + -0.10128 0.00000 -0.23524 + 0.20588 + 0.00000 0.35986 + -0.06061 0.00000 -0.56574 +multipole 26 25 27 0.08230 + 0.04789 0.00000 -0.08924 + 0.01057 + 0.00000 0.11342 + 0.06251 0.00000 -0.12399 +multipole 27 31 25 -0.11939 + 0.32104 0.00000 0.10406 + 0.26796 + 0.00000 -0.55943 + -0.32286 0.00000 0.29147 +multipole 28 27 25 0.07096 + -0.02472 0.00000 -0.08760 + -0.02354 + 0.00000 0.07793 + -0.09866 0.00000 -0.05439 +multipole 29 25 27 -0.17217 + 0.01336 0.00000 0.38349 + -0.31978 + 0.00000 -0.13786 + 0.11205 0.00000 0.45764 +multipole 30 29 25 0.06823 + -0.01947 0.00000 -0.09588 + 0.04494 + 0.00000 0.05530 + 0.00419 0.00000 -0.10024 +multipole 31 27 32 -0.16882 + 0.02110 0.00000 0.24422 + -0.25302 + 0.00000 -0.13559 + 0.02868 0.00000 0.38861 +multipole 32 31 27 0.06001 + 0.00612 0.00000 -0.10697 + 0.03438 + 0.00000 0.06956 + -0.03511 0.00000 -0.10394 +multipole 33 8 35 0.16229 + 0.22880 0.00000 0.30596 + 0.12912 + 0.00000 -0.06006 + -0.66812 0.00000 -0.06906 +multipole 34 33 8 0.05600 + -0.14483 0.00000 -0.07492 + -0.00102 + 0.00000 -0.06173 + -0.03044 0.00000 0.06275 +multipole 35 36 33 -0.44145 + 0.23477 0.00000 0.13825 + 0.06803 + 0.00000 -0.49343 + -0.14987 0.00000 0.42541 +multipole 36 35 33 0.23017 + -0.12968 0.00000 0.01379 + -0.06824 + 0.00000 -0.11228 + -0.08774 0.00000 0.18052 +multipole 37 39 8 0.10834 + 0.24982 0.00000 0.27937 + 0.08477 + 0.00000 -0.58656 + -0.19826 0.00000 0.50179 +multipole 38 37 39 0.06805 + 0.02048 0.00000 -0.09220 + -0.00303 + 0.00000 -0.01146 + -0.05463 0.00000 0.01449 +multipole 39 40 37 -0.40177 + 0.35143 0.00000 0.04331 + 0.31002 + 0.00000 -0.84324 + -0.38927 0.00000 0.53322 +multipole 40 39 37 0.24568 + -0.10665 0.00000 0.01809 + -0.15372 + 0.00000 -0.05391 + 0.00480 0.00000 0.20763 +multipole 41 37 42 -0.16081 + -0.01376 0.00000 0.41130 + -0.26001 + 0.00000 -0.18818 + -0.12509 0.00000 0.44819 +multipole 42 41 37 0.06784 + -0.05387 0.00000 -0.13358 + 0.00765 + 0.00000 0.10555 + -0.15569 0.00000 -0.11320 +multipole 43 8 45 -0.30144 + 0.07672 0.00000 0.42645 + -0.35442 + 0.00000 -0.51033 + -0.35331 0.00000 0.86475 +multipole 43 8 47 -0.30144 + 0.07672 0.00000 0.42645 + -0.35442 + 0.00000 -0.51033 + -0.35331 0.00000 0.86475 +multipole 43 48 49 -0.08027 + 0.13313 0.00000 0.28094 + -0.73267 + 0.00000 0.44660 + -0.05681 0.00000 0.28607 +multipole 44 43 8 0.14381 + -0.07645 0.00000 0.01699 + -0.09149 + 0.00000 -0.03033 + -0.15284 0.00000 0.12182 +multipole 44 43 48 0.00975 + -0.14579 0.00000 -0.00614 + -0.22868 + 0.00000 0.13700 + -0.21056 0.00000 0.09168 +multipole 45 46 43 -0.03264 + 0.49460 0.00000 -0.04347 + 1.63727 + 0.00000 -2.40778 + -0.45566 0.00000 0.77051 +multipole 46 45 43 0.10947 + -0.10504 0.00000 -0.03823 + -0.08656 + 0.00000 -0.01943 + -0.23485 0.00000 0.10599 +multipole 47 47 43 0.07683 + 0.30088 0.00000 0.27072 + 1.04951 + 0.00000 -2.57126 + -0.50502 0.00000 1.52175 +multipole 48 7 9 12 -0.23113 + 0.27663 0.00000 0.12440 + -0.20625 + 0.00000 -0.28389 + 0.15574 0.00000 0.49014 +multipole 48 7 233 12 0.60118 + 0.27663 0.00000 0.12440 + -0.20625 + 0.00000 -0.28389 + 0.15574 0.00000 0.49014 +multipole 49 43 48 -0.85155 + 0.15871 0.00000 0.56464 + -1.49210 + 0.00000 -1.58110 + -0.20334 0.00000 3.07320 +multipole 50 51 59 -0.13558 + 0.39735 0.00000 0.41339 + 0.27347 + 0.00000 -1.36200 + -0.22439 0.00000 1.08853 +multipole 51 50 52 54 -0.26070 + 0.08712 0.00000 0.33920 + -0.37488 + 0.00000 -0.33230 + 0.21154 0.00000 0.70718 +multipole 51 50 233 54 -0.37342 + 0.08712 0.00000 0.33920 + -0.37488 + 0.00000 -0.33230 + 0.21154 0.00000 0.70718 +multipole 52 53 51 0.90470 + 0.06004 0.00000 0.25405 + 0.35305 + 0.00000 -0.30405 + 0.20110 0.00000 -0.04900 +multipole 53 52 51 -0.76984 + -0.05467 0.00000 -0.23073 + -0.46593 + 0.00000 0.27107 + -0.00005 0.00000 0.19486 +multipole 54 51 55 0.09550 + 0.05530 0.00000 0.17764 + -0.07670 + 0.00000 -0.13879 + -0.00767 0.00000 0.21549 +multipole 55 51 57 -0.13205 + 0.32755 0.00000 0.46077 + 0.17752 + 0.00000 -0.61073 + -0.35102 0.00000 0.43321 +multipole 55 241 57 -0.12680 + 0.31318 0.00000 0.41341 + 0.26389 + 0.00000 -0.70262 + -0.10425 0.00000 0.43873 +multipole 56 55 51 0.09686 + -0.08812 0.00000 -0.10597 + -0.00614 + 0.00000 0.10040 + -0.16651 0.00000 -0.09426 +multipole 56 55 241 0.11510 + 0.00090 0.00000 -0.07548 + -0.00989 + 0.00000 -0.01502 + 0.00444 0.00000 0.02491 +multipole 57 55 59 -0.16591 + 0.43907 0.00000 0.23052 + 0.21670 + 0.00000 -0.57363 + -0.09937 0.00000 0.35693 +multipole 57 55 245 -0.14420 + 0.42355 0.00000 0.25235 + 0.34755 + 0.00000 -0.69761 + -0.08434 0.00000 0.35006 +multipole 58 57 55 0.08886 + -0.00234 0.00000 -0.08982 + 0.07325 + 0.00000 0.05889 + -0.03278 0.00000 -0.13214 +multipole 58 57 245 0.12121 + -0.00270 0.00000 -0.06030 + -0.00918 + 0.00000 -0.01098 + 0.00194 0.00000 0.02016 +multipole 59 50 57 -0.03932 + 0.17998 0.00000 0.43068 + -0.10117 + 0.00000 -0.38138 + 0.01443 0.00000 0.48255 +multipole 60 59 50 0.06588 + -0.03733 0.00000 -0.07724 + 0.02650 + 0.00000 -0.00717 + -0.08958 0.00000 -0.01933 +multipole 61 63 8 -0.11216 + 0.38620 0.00000 0.08762 + 0.47377 + 0.00000 -0.59723 + -0.25956 0.00000 0.12346 +multipole 62 61 63 0.09205 + 0.04929 0.00000 -0.11825 + 0.02631 + 0.00000 0.10410 + 0.09871 0.00000 -0.13041 +multipole 63 61 64 -0.04246 + 0.01409 0.00000 0.21398 + 0.05117 + 0.00000 -0.26849 + -0.07370 0.00000 0.21732 +multipole 64 63 66 0.04681 + 0.17684 0.00000 0.12228 + 0.48702 + 0.00000 -0.40448 + 0.34751 0.00000 -0.08254 +multipole 65 64 63 0.00023 + -0.01320 0.00000 -0.17110 + 0.08705 + 0.00000 0.10296 + 0.00895 0.00000 -0.19001 +multipole 66 64 68 -0.02656 + -0.02571 0.00000 0.00360 + -0.00110 + 0.00000 -0.14275 + -0.09779 0.00000 0.14385 +multipole 67 66 64 0.00719 + 0.00137 0.00000 -0.18600 + 0.05207 + 0.00000 -0.00064 + 0.00676 0.00000 -0.05143 +multipole 68 66 66 -0.02866 + -0.02759 0.00000 -0.00699 + -0.01545 + 0.00000 -0.19273 + -0.12394 0.00000 0.20818 +multipole 69 68 66 0.00685 + -0.00666 0.00000 -0.18375 + 0.05602 + 0.00000 -0.00631 + 0.00545 0.00000 -0.04971 +multipole 70 72 8 -0.10731 + 0.38034 0.00000 0.08372 + 0.50724 + 0.00000 -0.62647 + -0.18907 0.00000 0.11923 +multipole 71 70 72 0.09011 + 0.04522 0.00000 -0.12453 + 0.04012 + 0.00000 0.06958 + 0.07019 0.00000 -0.10970 +multipole 72 70 73 -0.05309 + 0.06610 0.00000 0.18549 + 0.04921 + 0.00000 -0.33224 + -0.11333 0.00000 0.28303 +multipole 73 72 75 0.07134 + 0.24299 0.00000 0.14377 + 0.57252 + 0.00000 -0.47541 + 0.42651 0.00000 -0.09711 +multipole 74 73 72 0.00345 + -0.01772 0.00000 -0.17185 + 0.14345 + 0.00000 0.12181 + 0.02031 0.00000 -0.26526 +multipole 75 73 77 -0.12512 + -0.11733 0.00000 0.00000 + 0.04101 + 0.00000 -0.14140 + -0.08647 0.00000 0.10039 +multipole 76 75 73 0.01090 + 0.02337 0.00000 -0.19140 + 0.03985 + 0.00000 0.06312 + -0.01694 0.00000 -0.10297 +multipole 77 78 75 0.35744 + 0.02001 0.00000 0.42701 + -0.19251 + 0.00000 -0.38151 + 0.27981 0.00000 0.57402 +multipole 78 77 79 -0.46438 + 0.19713 0.00000 0.00614 + 0.42591 + 0.00000 -0.39511 + -0.34625 0.00000 -0.03080 +multipole 79 78 77 0.22899 + -0.06109 0.00000 -0.01309 + -0.11816 + 0.00000 -0.15815 + 0.04555 0.00000 0.27631 +multipole 80 8 82 -0.14909 + 0.11344 0.00000 0.39909 + 0.03628 + 0.00000 -0.47377 + 0.02261 0.00000 0.43749 +multipole 81 80 81 0.07954 + 0.01404 0.00000 -0.09182 + 0.04405 + 0.00000 0.01752 + 0.03456 0.00000 -0.06157 +multipole 82 80 83 -0.21590 + 0.00000 0.00000 0.19889 + 0.43753 + 0.00000 -0.84736 + 0.00000 0.00000 0.40983 +multipole 83 82 85 -0.04549 + 0.32216 0.00000 0.13839 + 0.73596 + 0.00000 -0.60409 + 0.25285 0.00000 -0.13187 +multipole 84 83 82 0.01759 + -0.02121 0.00000 -0.10542 + 0.08078 + 0.00000 0.10479 + -0.00935 0.00000 -0.18557 +multipole 85 83 87 -0.15892 + 0.03729 0.00000 0.15665 + 0.59432 + 0.00000 -0.78857 + 0.29227 0.00000 0.19425 +multipole 86 85 87 -0.03324 + 0.03781 0.00000 -0.15021 + 0.16274 + 0.00000 0.11972 + 0.03565 0.00000 -0.28246 +multipole 87 88 85 0.62054 + 0.00000 0.00000 0.43281 + 0.41363 + 0.00000 -0.34255 + 0.00000 0.00000 -0.07108 +multipole 88 87 85 -0.91150 + 0.00000 0.00000 -0.26161 + -0.27372 + 0.00000 0.34305 + 0.00000 0.00000 -0.06933 +multipole 89 8 91 -0.16339 + -0.12477 0.00000 0.53121 + -0.30582 + 0.00000 -0.43704 + 0.40713 0.00000 0.74286 +multipole 90 89 91 0.08819 + 0.06555 0.00000 -0.10115 + -0.10247 + 0.00000 0.15243 + 0.03296 0.00000 -0.04996 +multipole 91 92 94 -0.14846 + -0.32645 0.00000 -0.13851 + 0.16205 + 0.00000 -0.20283 + 0.53464 0.00000 0.04078 +multipole 92 95 91 0.09676 + 0.02936 0.00000 0.48291 + -0.05924 + 0.00000 -0.39203 + 0.57677 0.00000 0.45127 +multipole 93 92 95 0.02989 + -0.00149 0.00000 -0.20147 + -0.02175 + 0.00000 0.07153 + 0.04234 0.00000 -0.04978 +multipole 94 91 98 0.00548 + 0.26321 0.00000 -0.09442 + 0.27216 + 0.00000 -0.00293 + -0.14493 0.00000 -0.26923 +multipole 95 92 97 -0.03588 + 0.13305 0.00000 0.32467 + 0.47653 + 0.00000 -0.93115 + 0.99076 0.00000 0.45462 +multipole 96 95 92 0.08805 + 0.00174 0.00000 -0.22101 + 0.07562 + 0.00000 0.06395 + 0.01790 0.00000 -0.13957 +multipole 97 95 100 0.27382 + -0.01350 0.00000 -0.01650 + -0.51808 + 0.00000 -0.74455 + -0.04923 0.00000 1.26263 +multipole 98 102 94 -0.20979 + -0.34622 0.00000 0.10170 + -0.36832 + 0.00000 0.33475 + 0.35509 0.00000 0.03357 +multipole 99 98 102 0.00102 + 0.00505 0.00000 -0.17714 + 0.06900 + 0.00000 0.06904 + -0.03904 0.00000 -0.13804 +multipole 100 104 97 -0.11296 + -0.13812 0.00000 -0.03163 + -0.06766 + 0.00000 0.01833 + -0.00493 0.00000 0.04933 +multipole 101 100 104 0.00446 + 0.00790 0.00000 -0.18506 + 0.03323 + 0.00000 0.01707 + -0.02718 0.00000 -0.05030 +multipole 102 98 104 0.06902 + 0.27757 0.00000 0.10967 + 0.56142 + 0.00000 -0.53401 + 0.44766 0.00000 -0.02741 +multipole 103 102 98 0.00474 + 0.00358 0.00000 -0.18227 + 0.04939 + 0.00000 0.01436 + 0.01490 0.00000 -0.06375 +multipole 104 102 100 -0.01987 + 0.02835 0.00000 0.04818 + 0.20675 + 0.00000 -0.27604 + 0.00990 0.00000 0.06929 +multipole 105 104 102 0.00374 + 0.00125 0.00000 -0.18390 + 0.04446 + 0.00000 -0.01545 + -0.01437 0.00000 -0.02901 +multipole 106 8 108 -0.10044 + 0.08050 0.00000 0.31541 + -0.04428 + 0.00000 -0.57160 + -0.15478 0.00000 0.61588 +multipole 107 106 108 0.11241 + 0.00094 0.00000 -0.14233 + 0.02742 + 0.00000 0.10370 + 0.00990 0.00000 -0.13112 +multipole 108 106 109 0.16205 + 0.16361 0.00000 0.27606 + 0.18556 + 0.00000 -0.33531 + -0.34553 0.00000 0.14975 +multipole 109 108 113 -0.10600 + 0.06737 0.00000 0.13621 + 0.52452 + 0.00000 -0.63296 + 0.39427 0.00000 0.10844 +multipole 110 109 108 0.20247 + -0.04159 0.00000 -0.13094 + 0.01709 + 0.00000 -0.01033 + -0.01012 0.00000 -0.00676 +multipole 111 108 115 0.04476 + 0.19634 0.00000 -0.22474 + 0.58980 + 0.00000 -0.17266 + -0.21786 0.00000 -0.41714 +multipole 112 111 115 0.08897 + 0.00602 0.00000 -0.21192 + 0.01372 + 0.00000 0.02533 + 0.02467 0.00000 -0.03905 +multipole 113 109 115 0.39335 + 0.28599 0.00000 0.15648 + 0.09076 + 0.00000 -0.28047 + -0.26152 0.00000 0.18971 +multipole 114 113 115 0.09278 + -0.00527 0.00000 -0.23564 + 0.04222 + 0.00000 -0.00568 + -0.00439 0.00000 -0.03654 +multipole 115 111 113 -0.08186 + -0.06539 0.00000 0.06061 + 0.34422 + 0.00000 -0.66901 + 0.31146 0.00000 0.32479 +multipole 116 115 113 0.14211 + -0.01142 0.00000 -0.24975 + 0.05866 + 0.00000 -0.00893 + -0.00227 0.00000 -0.04973 +multipole 117 8 119 -0.10846 + 0.06915 0.00000 0.34129 + -0.13274 + 0.00000 -0.55071 + -0.03813 0.00000 0.68345 +multipole 118 117 119 0.08849 + 0.06029 0.00000 -0.13194 + 0.02277 + 0.00000 0.08141 + 0.08284 0.00000 -0.10418 +multipole 119 117 120 0.04660 + 0.25752 0.00000 0.19196 + 0.36112 + 0.00000 -0.48799 + -0.42867 0.00000 0.12687 +multipole 120 119 124 -0.16996 + 0.07326 0.00000 0.05464 + 0.44029 + 0.00000 -0.71866 + 0.32632 0.00000 0.27837 +multipole 121 120 124 0.13110 + 0.02575 0.00000 -0.14558 + 0.00657 + 0.00000 -0.01572 + 0.00411 0.00000 0.00915 +multipole 122 119 126 0.08866 + 0.18994 0.00000 -0.17003 + 0.37335 + 0.00000 -0.27499 + -0.18897 0.00000 -0.09836 +multipole 123 122 126 0.02049 + 0.03210 0.00000 -0.20183 + 0.00721 + 0.00000 0.04324 + 0.00501 0.00000 -0.05045 +multipole 124 120 126 0.34991 + 0.30562 0.00000 0.16281 + -0.05686 + 0.00000 -0.39010 + -0.16611 0.00000 0.44696 +multipole 125 124 126 0.03404 + 0.02495 0.00000 -0.20391 + 0.00173 + 0.00000 -0.02858 + 0.01013 0.00000 0.02685 +multipole 126 122 124 -0.50635 + 0.18134 0.00000 0.26499 + -0.07393 + 0.00000 -0.04385 + -0.12432 0.00000 0.11778 +multipole 127 8 129 -0.11338 + 0.22119 0.00000 0.30702 + -0.06116 + 0.00000 -0.60019 + 0.03111 0.00000 0.66135 +multipole 128 127 129 0.08990 + 0.03505 0.00000 -0.12631 + 0.02431 + 0.00000 0.08784 + 0.08710 0.00000 -0.11215 +multipole 129 127 130 0.20611 + 0.29762 0.00000 0.05580 + 0.13649 + 0.00000 -0.54039 + -0.01448 0.00000 0.40390 +multipole 130 129 133 -0.56975 + 0.21589 0.00000 0.18560 + 0.00927 + 0.00000 -0.03572 + -0.10374 0.00000 0.02645 +multipole 131 129 135 -0.02289 + 0.28325 0.00000 -0.15990 + 0.65227 + 0.00000 -0.37726 + -0.23589 0.00000 -0.27501 +multipole 132 131 135 0.03876 + -0.00320 0.00000 -0.17520 + 0.06180 + 0.00000 0.00375 + -0.07542 0.00000 -0.06555 +multipole 133 130 135 0.33110 + 0.22778 0.00000 0.23060 + 0.19791 + 0.00000 -0.37320 + -0.38619 0.00000 0.17529 +multipole 134 133 135 0.03651 + -0.02898 0.00000 -0.20060 + 0.03456 + 0.00000 -0.00906 + -0.01436 0.00000 -0.02550 +multipole 135 131 133 -0.13121 + -0.01623 0.00000 0.07052 + 0.22148 + 0.00000 -0.71860 + 0.21693 0.00000 0.49712 +multipole 136 135 133 0.10796 + 0.00816 0.00000 -0.20977 + 0.04667 + 0.00000 -0.02930 + 0.04575 0.00000 -0.01737 +multipole 137 8 139 -0.33682 + -0.09973 0.00000 0.38664 + -0.56710 + 0.00000 -0.27996 + 0.12769 0.00000 0.84706 +multipole 138 137 139 0.04965 + 0.04752 0.00000 -0.13859 + 0.11994 + 0.00000 0.04796 + 0.03771 0.00000 -0.16790 +multipole 139 140 -140 1.01811 + -0.00488 0.00000 -0.15412 + 0.00000 + 0.00000 0.00000 + 0.00000 0.00000 0.00000 +multipole 140 139 137 -0.85879 + -0.08949 0.00000 -0.07764 + 0.00000 + 0.00000 0.00000 + 0.00000 0.00000 0.00000 +multipole 141 8 143 -0.17303 + 0.44945 0.00000 0.30728 + -0.07251 + 0.00000 -0.67903 + 0.08175 0.00000 0.75154 +multipole 142 141 143 0.10446 + -0.08174 0.00000 -0.18518 + -0.00080 + 0.00000 0.13227 + -0.04979 0.00000 -0.13147 +multipole 143 144 145 0.85923 + 0.11304 0.00000 0.10040 + 0.31104 + 0.00000 -0.30726 + -0.25489 0.00000 -0.00378 +multipole 144 143 145 -0.63514 + -0.04784 0.00000 -0.07224 + -0.41873 + 0.00000 0.25275 + -0.15048 0.00000 0.16598 +multipole 145 143 146 -0.43939 + 0.21541 0.00000 -0.02221 + 0.36981 + 0.00000 -0.36139 + -0.26932 0.00000 -0.00842 +multipole 146 145 143 0.24242 + -0.05297 0.00000 -0.03262 + -0.15414 + 0.00000 -0.15395 + -0.00414 0.00000 0.30809 +multipole 147 8 149 -0.15914 + 0.20696 0.00000 0.39766 + 0.04998 + 0.00000 -0.56038 + 0.16613 0.00000 0.51040 +multipole 148 147 149 0.10149 + 0.02977 0.00000 -0.15557 + -0.01454 + 0.00000 0.17295 + 0.10589 0.00000 -0.15841 +multipole 149 151 150 0.76984 + 0.28242 0.00000 -0.15875 + 0.01831 + 0.00000 -0.16686 + 0.09056 0.00000 0.14855 +multipole 150 149 151 -0.74313 + -0.04904 0.00000 -0.17638 + -0.37631 + 0.00000 0.37623 + -0.05205 0.00000 0.00008 +multipole 151 149 150 -0.28938 + 0.12918 0.00000 -0.08416 + 0.48804 + 0.00000 -0.69748 + -0.01277 0.00000 0.20944 +multipole 152 151 149 0.14092 + -0.00409 0.00000 -0.17075 + 0.00327 + 0.00000 -0.00106 + 0.19714 0.00000 -0.00221 +multipole 153 8 155 -0.10324 + 0.09831 0.00000 0.33772 + 0.29786 + 0.00000 -0.73875 + -0.12488 0.00000 0.44089 +multipole 154 153 155 0.06492 + 0.02097 0.00000 -0.14796 + 0.09102 + 0.00000 0.12078 + -0.12342 0.00000 -0.21180 +multipole 155 153 157 -0.35416 + -0.08035 0.00000 0.17352 + -0.33142 + 0.00000 -0.02713 + 0.00000 0.00000 0.35855 +multipole 156 155 157 0.06420 + 0.07412 0.00000 -0.09544 + 0.40117 + 0.00000 -0.10252 + 0.00000 0.00000 -0.29865 +multipole 157 158 -158 1.05691 + -0.08698 0.00000 0.00867 + 0.00000 + 0.00000 0.00000 + 0.00000 0.00000 0.00000 +multipole 158 157 158 -0.89737 + -0.03977 0.00000 -0.09456 + 0.00000 + 0.00000 0.00000 + 0.00000 0.00000 0.00000 +multipole 159 8 161 -0.10668 + 0.29642 0.00000 0.28365 + 0.39855 + 0.00000 -0.41154 + 0.04273 0.00000 0.01299 +multipole 160 159 8 0.09513 + -0.05887 0.00000 -0.04640 + -0.03611 + 0.00000 -0.02016 + -0.01670 0.00000 0.05627 +multipole 161 159 163 -0.23637 + 0.34729 0.00000 0.09253 + -0.40537 + 0.00000 -0.00346 + -0.52649 0.00000 0.40883 +multipole 162 161 163 0.10600 + -0.20910 0.00000 -0.08841 + -0.14892 + 0.00000 0.17218 + -0.34482 0.00000 -0.02326 +multipole 163 164 165 0.90086 + 0.11874 0.00000 0.10181 + -0.08663 + 0.00000 0.03649 + -0.12175 0.00000 0.05014 +multipole 164 163 165 -0.60677 + 0.02332 0.00000 -0.04031 + -0.46754 + 0.00000 0.22363 + 0.10574 0.00000 0.24391 +multipole 165 163 164 -0.53100 + 0.05936 0.00000 -0.00202 + 0.03421 + 0.00000 0.00132 + 0.18532 0.00000 -0.03553 +multipole 166 165 163 0.24071 + -0.19323 0.00000 -0.29128 + 0.07422 + 0.00000 0.09278 + -0.19140 0.00000 -0.16700 +multipole 167 8 169 -0.07575 + 0.20886 0.00000 0.29708 + 0.20862 + 0.00000 -0.53751 + -0.38031 0.00000 0.32889 +multipole 168 167 8 0.09458 + -0.04304 0.00000 -0.08810 + -0.17118 + 0.00000 0.05903 + 0.10731 0.00000 0.11215 +multipole 169 167 171 -0.27255 + 0.04245 0.00000 0.29740 + 0.02354 + 0.00000 -0.03872 + 0.02994 0.00000 0.01518 +multipole 170 169 171 0.10149 + 0.02977 0.00000 -0.15557 + -0.01454 + 0.00000 0.17295 + 0.10589 0.00000 -0.15841 +multipole 171 173 172 0.76984 + 0.28242 0.00000 -0.15875 + 0.01831 + 0.00000 -0.16686 + 0.09056 0.00000 0.14855 +multipole 172 171 173 -0.74313 + -0.04904 0.00000 -0.17638 + -0.37631 + 0.00000 0.37623 + -0.05205 0.00000 0.00008 +multipole 173 171 172 -0.28938 + 0.12918 0.00000 -0.08416 + 0.48804 + 0.00000 -0.69748 + -0.01277 0.00000 0.20944 +multipole 174 173 171 0.14092 + -0.00409 0.00000 -0.17075 + 0.00327 + 0.00000 -0.00106 + 0.19714 0.00000 -0.00221 +multipole 175 8 177 -0.14215 + 0.12943 0.00000 0.31867 + 0.18924 + 0.00000 -0.71964 + -0.21203 0.00000 0.53040 +multipole 176 175 177 0.08383 + 0.08229 0.00000 -0.07905 + -0.01759 + 0.00000 0.08087 + 0.02604 0.00000 -0.06328 +multipole 177 179 175 -0.22038 + 0.23726 0.00000 -0.16299 + 0.36732 + 0.00000 -0.44121 + -0.37426 0.00000 0.07389 +multipole 178 177 179 0.07884 + 0.03596 0.00000 -0.06087 + -0.03114 + 0.00000 0.01997 + 0.06174 0.00000 0.01117 +multipole 179 177 180 0.14780 + 0.54807 0.00000 0.51535 + 1.30094 + 0.00000 -2.99992 + -0.76856 0.00000 1.69898 +multipole 180 179 181 -0.21776 + 0.01805 0.00000 0.06009 + -0.28800 + 0.00000 0.12124 + -0.18981 0.00000 0.16676 +multipole 181 180 179 0.05672 + 0.01469 0.00000 -0.10715 + 0.09749 + 0.00000 -0.02112 + 0.03039 0.00000 -0.07637 +multipole 182 8 184 -0.08975 + 0.20388 0.00000 0.25551 + 0.08393 + 0.00000 -0.69546 + -0.19022 0.00000 0.61153 +multipole 183 182 184 0.08202 + 0.03852 0.00000 -0.09266 + 0.00460 + 0.00000 0.05897 + -0.05937 0.00000 -0.06357 +multipole 184 186 182 -0.21565 + 0.30101 0.00000 0.17456 + 0.15633 + 0.00000 -0.62215 + -0.22099 0.00000 0.46582 +multipole 185 184 185 0.08265 + 0.03106 0.00000 -0.09591 + 0.04227 + 0.00000 0.02301 + 0.08405 0.00000 -0.06528 +multipole 186 188 184 -0.02245 + 0.22603 0.00000 0.33147 + 0.15933 + 0.00000 -0.60475 + -0.25158 0.00000 0.44542 +multipole 187 186 187 0.07982 + -0.02778 0.00000 -0.06593 + 0.07962 + 0.00000 0.06169 + 0.09443 0.00000 -0.14131 +multipole 188 190 186 -0.01637 + 0.17686 0.00000 0.14050 + -0.14798 + 0.00000 -0.81782 + -0.11856 0.00000 0.96580 +multipole 189 188 189 0.09822 + -0.04651 0.00000 -0.07618 + -0.01229 + 0.00000 -0.00776 + -0.13903 0.00000 0.02005 +multipole 190 188 191 0.10000 + 0.03808 0.00000 0.22325 + -0.22293 + 0.00000 -0.22476 + 0.00964 0.00000 0.44769 +multipole 191 190 188 0.20727 + 0.03469 0.00000 -0.12995 + -0.04317 + 0.00000 -0.08341 + 0.18046 0.00000 0.12658 +multipole 192 8 194 -0.14610 + 0.04867 0.00000 0.34432 + 0.09079 + 0.00000 -0.55511 + -0.18572 0.00000 0.46432 +multipole 193 192 194 0.06260 + 0.02182 0.00000 -0.14723 + 0.09446 + 0.00000 0.10407 + -0.12330 0.00000 -0.19853 +multipole 194 196 192 -0.13934 + 0.20906 0.00000 0.01228 + 0.22665 + 0.00000 -0.42949 + -0.27135 0.00000 0.20284 +multipole 195 194 195 0.07212 + 0.00697 0.00000 -0.07338 + 0.14505 + 0.00000 -0.06944 + 0.16099 0.00000 -0.07561 +multipole 196 198 194 -0.12642 + 0.20234 0.00000 0.13874 + 0.10501 + 0.00000 -0.54234 + -0.24399 0.00000 0.43733 +multipole 197 196 197 0.06261 + -0.00129 0.00000 -0.07060 + 0.02999 + 0.00000 0.03807 + 0.03535 0.00000 -0.06806 +multipole 198 200 196 0.04761 + 0.09262 0.00000 -0.03821 + 0.29739 + 0.00000 -0.34473 + -0.15365 0.00000 0.04734 +multipole 199 198 199 0.02822 + -0.09076 0.00000 -0.01870 + 0.06435 + 0.00000 -0.07401 + -0.07089 0.00000 0.00966 +multipole 200 198 201 -0.20360 + 0.12136 0.00000 0.24914 + -0.14128 + 0.00000 -0.79272 + 0.08516 0.00000 0.93400 +multipole 201 200 198 0.08988 + 0.10885 0.00000 -0.33633 + 0.25980 + 0.00000 -0.00123 + 0.38791 0.00000 -0.25857 +multipole 202 8 204 -0.09097 + 0.31208 0.00000 0.34711 + 0.26802 + 0.00000 -0.71303 + 0.08629 0.00000 0.44501 +multipole 203 202 204 0.07770 + -0.02034 0.00000 -0.11842 + -0.07729 + 0.00000 0.11869 + -0.15759 0.00000 -0.04140 +multipole 204 202 206 -0.21722 + 0.33699 0.00000 0.20660 + 0.18535 + 0.00000 -0.29250 + -0.24900 0.00000 0.10715 +multipole 205 204 205 0.08258 + 0.04941 0.00000 -0.09810 + 0.14471 + 0.00000 -0.09703 + 0.04718 0.00000 -0.04768 +multipole 206 204 208 -0.01121 + 0.30142 0.00000 0.15967 + 0.51002 + 0.00000 -0.64074 + -0.39142 0.00000 0.13072 +multipole 207 206 207 0.07564 + -0.04299 0.00000 -0.06409 + 0.03411 + 0.00000 0.16042 + 0.14615 0.00000 -0.19453 +multipole 208 206 210 -0.27936 + -0.19230 0.00000 0.47650 + 0.08293 + 0.00000 -0.98827 + 0.10755 0.00000 0.90534 +multipole 209 208 210 0.15532 + -0.11954 0.00000 -0.12082 + 0.01544 + 0.00000 -0.19834 + -0.04507 0.00000 0.18290 +multipole 210 211 -211 0.98761 + -0.04689 0.00000 -0.18100 + -0.19176 + 0.00000 -0.18380 + -0.09197 0.00000 0.37556 +multipole 211 210 211 -0.29224 + -0.02579 0.00000 -0.18729 + 0.46099 + 0.00000 -0.80088 + -0.06689 0.00000 0.33989 +multipole 212 211 210 0.15787 + 0.00500 0.00000 -0.16579 + 0.13325 + 0.00000 -0.16718 + -0.06599 0.00000 0.03393 +multipole 213 8 215 -0.08587 + 0.20388 0.00000 0.25551 + 0.08393 + 0.00000 -0.69546 + -0.19022 0.00000 0.61153 +multipole 214 213 215 0.08588 + 0.03852 0.00000 -0.09266 + 0.00460 + 0.00000 0.05897 + -0.05937 0.00000 -0.06357 +multipole 215 217 213 -0.01858 + 0.22603 0.00000 0.33147 + 0.15933 + 0.00000 -0.60475 + -0.25158 0.00000 0.44542 +multipole 216 215 216 0.08368 + -0.02778 0.00000 -0.06593 + 0.07962 + 0.00000 0.06169 + 0.09443 0.00000 -0.14131 +multipole 217 219 215 -0.01249 + 0.17686 0.00000 0.14050 + -0.14798 + 0.00000 -0.81782 + -0.11856 0.00000 0.96580 +multipole 218 217 218 0.10208 + -0.04651 0.00000 -0.07618 + -0.01229 + 0.00000 -0.00776 + -0.13903 0.00000 0.02005 +multipole 219 217 220 0.10000 + 0.03808 0.00000 0.22325 + -0.22293 + 0.00000 -0.22476 + 0.00964 0.00000 0.44769 +multipole 220 219 217 0.20727 + 0.03469 0.00000 -0.12995 + -0.04317 + 0.00000 -0.08341 + 0.18046 0.00000 0.12658 +multipole 221 223 224 -0.19058 + -0.06827 0.00000 0.32517 + -0.13529 + 0.00000 -0.15457 + -0.05672 0.00000 0.28986 +multipole 222 221 223 0.07778 + -0.01715 0.00000 -0.10934 + 0.05355 + 0.00000 0.05042 + -0.02825 0.00000 -0.10397 +multipole 223 224 221 0.68484 + -0.31279 0.00000 0.38571 + 0.14709 + 0.00000 -0.12737 + 0.07287 0.00000 -0.01972 +multipole 224 223 221 -0.72760 + 0.09427 0.00000 -0.12507 + -0.42919 + 0.00000 0.22290 + 0.14497 0.00000 0.20629 +multipole 225 226 -226 -0.30948 + -0.07657 0.00000 0.16462 + 0.51606 + 0.00000 -0.99579 + -0.25470 0.00000 0.47973 +multipole 226 225 226 0.15474 + -0.06307 0.00000 -0.12148 + 0.17239 + 0.00000 -0.07008 + -0.03484 0.00000 -0.10231 +multipole 227 229 228 -0.26804 + 0.11821 0.00000 0.25875 + 0.09964 + 0.00000 -0.79062 + -0.22323 0.00000 0.69098 +multipole 228 227 229 0.11919 + 0.04956 0.00000 -0.09552 + 0.10300 + 0.00000 -0.00278 + -0.03565 0.00000 -0.10022 +multipole 229 227 228 -0.00970 + 0.06190 0.00000 0.26240 + -0.41933 + 0.00000 -0.31279 + 0.05123 0.00000 0.73212 +multipole 230 229 227 0.05285 + -0.00218 0.00000 -0.11166 + 0.02154 + 0.00000 0.04194 + -0.06597 0.00000 -0.06348 +multipole 231 2 232 0.07891 + 0.00245 0.00000 0.24784 + -0.48795 + 0.00000 -0.41413 + 0.01190 0.00000 0.90208 +multipole 231 8 232 0.11164 + 0.27906 0.00000 0.31455 + -0.62632 + 0.00000 -0.62629 + 1.11853 0.00000 1.25261 +multipole 231 48 232 0.11164 + 0.27906 0.00000 0.31455 + -0.62632 + 0.00000 -0.62629 + 1.11853 0.00000 1.25261 +multipole 232 231 2 0.26670 + 0.06933 0.00000 0.04172 + -0.17154 + 0.00000 -0.07853 + 0.07867 0.00000 0.25007 +multipole 232 231 8 0.21240 + 0.02872 0.00000 -0.04889 + -0.22692 + 0.00000 0.04052 + 0.01035 0.00000 0.18640 +multipole 232 231 48 0.21240 + 0.00000 0.00000 -0.12490 + 0.03622 + 0.00000 -0.01437 + 0.00000 0.00000 -0.02185 +multipole 233 234 -234 1.02670 + -0.11581 0.00000 -0.04116 + 0.39082 + 0.00000 -0.32381 + 0.38691 0.00000 -0.06701 +multipole 234 233 234 -0.88956 + 0.17189 0.00000 -0.22995 + -0.43857 + 0.00000 0.34721 + 0.38935 0.00000 0.09136 +multipole 235 236 2 0.92336 + -0.20027 0.00000 -0.03856 + 0.31193 + 0.00000 -0.40576 + 0.16648 0.00000 0.09383 +multipole 235 236 8 0.83309 + -0.40323 0.00000 0.21520 + 0.22432 + 0.00000 -0.07777 + 0.17848 0.00000 -0.14655 +multipole 235 236 44 0.83309 + -0.40323 0.00000 0.21520 + 0.22432 + 0.00000 -0.07777 + 0.17848 0.00000 -0.14655 +multipole 236 235 2 -0.58827 + 0.04503 0.00000 -0.13615 + -0.44066 + 0.00000 0.28331 + 0.05541 0.00000 0.15735 +multipole 236 235 8 -0.61662 + 0.11446 0.00000 0.01734 + -0.55506 + 0.00000 0.08419 + 0.16576 0.00000 0.47087 +multipole 236 235 44 -0.61662 + 0.11446 0.00000 0.01734 + -0.55506 + 0.00000 0.08419 + 0.16576 0.00000 0.47087 +multipole 237 235 238 -0.46459 + 0.15200 0.00000 0.02356 + 0.42562 + 0.00000 -0.67227 + -0.48912 0.00000 0.24665 +multipole 238 237 235 0.24812 + -0.03635 0.00000 -0.05034 + -0.06195 + 0.00000 -0.06380 + -0.05902 0.00000 0.12575 +multipole 239 241 245 0.07219 + 0.28913 0.00000 0.29472 + 0.20132 + 0.00000 -0.54286 + 0.05155 0.00000 0.34154 +multipole 240 239 240 0.23262 + -0.02789 0.00000 -0.04288 + 0.00231 + 0.00000 0.03311 + -0.02313 0.00000 -0.03542 +multipole 241 239 242 -0.16428 + 0.16276 0.20457 0.47894 + -0.28250 + -0.26022 -0.34943 + 0.25272 -0.20303 0.63193 +multipole 242 243 241 0.94625 + 0.00000 0.00000 0.32359 + 0.14171 + 0.00000 -0.31370 + 0.03825 0.00000 0.17199 +multipole 243 242 241 -0.74794 + 0.02444 0.00000 -0.13267 + -0.59982 + 0.00000 0.24285 + -0.01926 0.00000 0.35697 +multipole 244 241 55 0.12611 + 0.01772 0.00000 0.00501 + 0.02059 + 0.00000 -0.01260 + 0.01759 0.00000 -0.00799 +multipole 245 57 239 -0.04567 + 0.56406 0.00000 0.09733 + 0.69818 + 0.00000 -0.78665 + -0.18468 0.00000 0.08847 +multipole 246 245 239 0.10559 + -0.01503 0.00000 -0.07122 + 0.00434 + 0.00000 -0.00248 + -0.01523 0.00000 -0.00186 +multipole 247 250 251 0.19705 + 0.05235 0.00000 -0.55644 + -0.17689 + 0.00000 0.07507 + -0.26977 0.00000 0.10182 +multipole 247 250 252 0.19705 + 0.05235 0.00000 -0.55644 + -0.17689 + 0.00000 0.07507 + -0.26977 0.00000 0.10182 +multipole 248 251 255 0.35474 + 0.27278 0.00000 0.17660 + -0.11495 + 0.00000 -0.52849 + -0.24464 0.00000 0.64344 +multipole 248 252 255 0.35474 + 0.27278 0.00000 0.17660 + -0.11495 + 0.00000 -0.52849 + -0.24464 0.00000 0.64344 +multipole 249 250 253 0.62323 + 0.04051 0.00000 -0.40121 + -0.16700 + 0.00000 -0.05202 + 0.14286 0.00000 0.21902 +multipole 250 247 249 0.11018 + -0.27451 0.00000 -0.16246 + -0.43024 + 0.00000 0.15634 + 0.11274 0.00000 0.27390 +multipole 251 247 248 -0.16574 + -0.15654 0.00000 -0.29303 + 0.81194 + 0.00000 -0.31643 + -0.09665 0.00000 -0.49551 +multipole 252 247 248 -0.19177 + -0.15102 0.00000 -0.28082 + 1.02852 + 0.00000 0.19924 + -0.11670 0.00000 -1.22776 +multipole 253 249 260 -0.30216 + 0.00000 0.00000 -0.23479 + -0.18214 + 0.00000 -0.18214 + 0.00000 0.00000 0.36428 +multipole 254 256 257 0.53583 + 0.46262 0.00000 0.23806 + 0.30445 + 0.00000 -0.30622 + 0.27296 0.00000 0.00177 +multipole 255 248 250 -0.50058 + 0.27961 0.00000 0.29857 + -0.21774 + 0.00000 -0.20902 + -0.22060 0.00000 0.42676 +multipole 256 247 254 -0.59923 + 0.25112 0.00000 -0.03017 + 0.05684 + 0.00000 0.03677 + -0.42077 0.00000 -0.09361 +multipole 257 249 254 -0.68218 + 0.26819 0.00000 -0.11771 + -0.22542 + 0.00000 0.23562 + -0.49764 0.00000 -0.01020 +multipole 258 248 251 0.03522 + -0.00715 0.00000 -0.19094 + 0.12022 + 0.00000 -0.00738 + -0.01223 0.00000 -0.11284 +multipole 258 248 252 0.03522 + -0.00715 0.00000 -0.19094 + 0.12022 + 0.00000 -0.00738 + -0.01223 0.00000 -0.11284 +multipole 259 254 256 0.01012 + 0.00378 0.00000 -0.20885 + 0.29328 + 0.00000 -0.03702 + 0.01627 0.00000 -0.25626 +multipole 260 253 249 0.11946 + 0.10111 0.00000 -0.36228 + 0.30681 + 0.00000 0.00962 + 0.09733 0.00000 -0.31643 +multipole 261 265 266 -0.24104 + -0.46930 0.00000 -0.00215 + -0.63770 + 0.00000 -0.12764 + -0.21639 0.00000 0.76534 +multipole 262 265 266 -0.26707 + -0.43500 0.00000 -0.02543 + -0.80418 + 0.00000 -0.16395 + -0.56679 0.00000 0.96813 +multipole 263 265 267 -0.21855 + -0.02433 0.00000 -0.04067 + 0.07073 + 0.00000 -0.29598 + 0.18324 0.00000 0.22525 +multipole 264 267 272 -0.26774 + 0.00000 0.00000 -0.14722 + -0.20683 + 0.00000 -0.20683 + 0.00000 0.00000 0.41366 +multipole 265 261 263 0.21574 + 0.02713 0.00000 0.38093 + -0.32457 + 0.00000 -0.21073 + 0.24767 0.00000 0.53530 +multipole 265 262 263 0.21574 + 0.02713 0.00000 0.38093 + -0.32457 + 0.00000 -0.21073 + 0.24767 0.00000 0.53530 +multipole 266 261 268 0.99441 + -0.20032 0.00000 -0.07584 + 0.26825 + 0.00000 -0.16618 + -0.12141 0.00000 -0.10207 +multipole 266 262 268 0.99441 + -0.20032 0.00000 -0.07584 + 0.26825 + 0.00000 -0.16618 + -0.12141 0.00000 -0.10207 +multipole 267 263 264 0.63287 + 0.11720 0.00000 -0.36908 + -0.70790 + 0.00000 -0.09015 + 0.13248 0.00000 0.79805 +multipole 268 266 267 -0.72673 + 0.11437 0.00000 0.27430 + -0.36580 + 0.00000 0.16860 + -0.15967 0.00000 0.19720 +multipole 269 263 265 0.03287 + -0.02386 0.00000 -0.16869 + 0.19235 + 0.00000 -0.04497 + -0.11320 0.00000 -0.14738 +multipole 270 266 261 -0.80802 + -0.13691 0.00000 -0.17532 + -0.06093 + 0.00000 -0.00808 + -0.25644 0.00000 0.06901 +multipole 270 266 262 -0.80802 + -0.13691 0.00000 -0.17532 + -0.06093 + 0.00000 -0.00808 + -0.25644 0.00000 0.06901 +multipole 271 265 261 0.01925 + 0.00579 0.00000 -0.19218 + 0.10120 + 0.00000 0.03689 + 0.06622 0.00000 -0.13809 +multipole 271 265 262 0.01925 + 0.00579 0.00000 -0.19218 + 0.10120 + 0.00000 0.03689 + 0.06622 0.00000 -0.13809 +multipole 272 264 267 0.11117 + 0.06785 0.00000 -0.34828 + 0.25530 + 0.00000 0.00041 + 0.07371 0.00000 -0.25571 +multipole 273 277 278 0.81575 + 0.07393 0.00000 -0.07697 + -1.62256 + 0.00000 0.42511 + 0.47701 0.00000 1.19745 +multipole 274 277 279 0.91682 + -0.28939 0.00000 -0.03405 + -0.49481 + 0.00000 0.06805 + 0.30090 0.00000 0.42676 +multipole 275 279 280 0.25636 + -0.06429 0.00000 -0.39303 + -0.02366 + 0.00000 -0.11189 + -0.68217 0.00000 0.13555 +multipole 275 279 281 0.25636 + -0.06429 0.00000 -0.39303 + -0.02366 + 0.00000 -0.11189 + -0.68217 0.00000 0.13555 +multipole 276 280 282 0.33548 + 0.26446 0.00000 0.19054 + -0.14954 + 0.00000 -0.63553 + -0.24037 0.00000 0.78507 +multipole 276 281 282 0.33548 + 0.26446 0.00000 0.19054 + -0.14954 + 0.00000 -0.63553 + -0.24037 0.00000 0.78507 +multipole 277 273 274 -0.46516 + -0.20039 0.00000 -0.02958 + 0.18319 + 0.00000 -0.31924 + 0.55206 0.00000 0.13605 +multipole 278 273 287 -0.34777 + 0.00000 0.00000 0.09810 + -0.22674 + 0.00000 -0.22674 + 0.00000 0.00000 0.45348 +multipole 279 274 275 -0.00139 + -0.34214 0.00000 -0.25452 + 0.57109 + 0.00000 0.08638 + -0.46661 0.00000 -0.65747 +multipole 280 275 276 -0.13948 + -0.16345 0.00000 -0.28631 + 0.81099 + 0.00000 -0.38335 + 0.22009 0.00000 -0.42764 +multipole 281 275 276 -0.16551 + -0.15213 0.00000 -0.24822 + 0.87781 + 0.00000 -0.04263 + 0.16842 0.00000 -0.83518 +multipole 282 276 279 -0.49075 + 0.19750 0.00000 0.34115 + -0.18411 + 0.00000 0.02266 + -0.00528 0.00000 0.16145 +multipole 283 273 275 -0.68515 + 0.30301 0.00000 0.07467 + 0.27482 + 0.00000 0.10098 + 0.18985 0.00000 -0.37580 +multipole 284 277 273 0.13360 + -0.01556 0.00000 -0.29570 + 0.16829 + 0.00000 0.14413 + -0.17971 0.00000 -0.31242 +multipole 285 274 277 -0.75414 + -0.02651 0.00000 -0.22256 + -0.25663 + 0.00000 0.15963 + -0.07481 0.00000 0.09700 +multipole 286 276 280 0.03471 + 0.00549 0.00000 -0.20010 + 0.02971 + 0.00000 0.08931 + 0.04294 0.00000 -0.11902 +multipole 286 276 281 0.03471 + 0.00549 0.00000 -0.20010 + 0.02971 + 0.00000 0.08931 + 0.04294 0.00000 -0.11902 +multipole 287 278 273 0.12326 + -0.12194 0.00000 -0.40562 + 0.04772 + 0.00000 0.25205 + -0.10563 0.00000 -0.29977 +multipole 288 289 295 -0.12472 + 0.00000 0.00000 0.23414 + -0.16670 + 0.00000 -0.16670 + 0.00000 0.00000 0.33340 +multipole 289 288 290 -0.32491 + -0.11852 0.00000 0.38086 + 0.04438 + 0.00000 -0.36513 + 0.61277 0.00000 0.32075 +multipole 290 289 293 0.94792 + -0.37385 0.00000 -0.16991 + 0.27250 + 0.00000 -0.11690 + -0.46630 0.00000 -0.15560 +multipole 291 289 292 0.13457 + 0.28512 0.00000 -0.15252 + 0.24926 + 0.00000 -0.37318 + -0.29476 0.00000 0.12392 +multipole 292 291 294 -0.20596 + -0.28927 0.00000 0.05138 + -0.61284 + 0.00000 -0.37546 + -0.25749 0.00000 0.98830 +multipole 293 290 294 -0.37323 + -0.03823 0.00000 -0.10180 + 0.54796 + 0.00000 -0.43130 + 0.23181 0.00000 -0.11666 +multipole 294 292 293 0.96217 + -0.16525 0.00000 -0.11314 + 0.36596 + 0.00000 -0.21822 + -0.05615 0.00000 -0.14774 +multipole 295 288 289 0.07468 + 0.01065 0.00000 -0.01558 + -0.01394 + 0.00000 -0.06177 + 0.02095 0.00000 0.07571 +multipole 296 294 292 -0.81528 + -0.05664 0.00000 -0.20927 + -0.13286 + 0.00000 0.05238 + -0.06252 0.00000 0.08048 +multipole 297 291 289 0.03316 + 0.00796 0.00000 -0.15603 + 0.06552 + 0.00000 0.00785 + -0.01504 0.00000 -0.07337 +multipole 298 290 289 -0.79250 + -0.09925 0.00000 -0.24004 + -0.27421 + 0.00000 0.16551 + -0.12860 0.00000 0.10870 +multipole 299 293 290 0.16411 + 0.00839 0.00000 -0.12442 + -0.09057 + 0.00000 0.00294 + 0.00693 0.00000 0.08763 +multipole 300 303 304 0.96728 + -0.16517 0.00000 -0.11030 + -0.14243 + 0.00000 -0.19294 + 0.11920 0.00000 0.33537 +multipole 301 304 305 0.20155 + 0.10244 0.00000 0.30074 + -0.12081 + 0.00000 -0.38422 + -0.06545 0.00000 0.50503 +multipole 302 303 305 0.85168 + -0.22270 0.00000 -0.07763 + -0.00198 + 0.00000 -0.01706 + -0.28197 0.00000 0.01904 +multipole 303 300 302 -0.38069 + -0.14505 0.00000 -0.04085 + 0.47767 + 0.00000 -0.40383 + 0.32823 0.00000 -0.07384 +multipole 304 300 301 -0.19639 + -0.16349 0.00000 -0.36007 + 0.98907 + 0.00000 -1.02460 + -0.18271 0.00000 0.03553 +multipole 305 301 302 -0.30583 + -0.17480 0.00000 -0.07381 + -0.09671 + 0.00000 -0.36088 + 0.02211 0.00000 0.45759 +multipole 306 303 300 0.16490 + 0.00383 0.00000 -0.15117 + 0.07794 + 0.00000 -0.04305 + 0.06224 0.00000 -0.03489 +multipole 307 305 301 0.03819 + -0.01137 0.00000 -0.19659 + 0.13645 + 0.00000 0.01095 + -0.04797 0.00000 -0.14740 +multipole 308 300 303 -0.80827 + 0.04828 0.00000 -0.21537 + -0.20344 + 0.00000 0.08236 + 0.10174 0.00000 0.12108 +multipole 309 302 303 -0.71662 + -0.03231 0.00000 -0.16721 + -0.47288 + 0.00000 0.23591 + -0.01906 0.00000 0.23697 +multipole 310 301 304 0.03960 + -0.00001 0.00000 -0.18599 + 0.07673 + 0.00000 0.06769 + 0.06469 0.00000 -0.14442 +multipole 311 -314 -312 -0.21219 + 0.14040 0.00000 0.44294 + 1.12348 + 0.00000 -0.86617 + 0.03072 0.00000 -0.25731 +multipole 312 311 318 -0.04958 + 0.13334 0.00000 0.11242 + -0.15679 + 0.00000 -0.51619 + 0.33627 0.00000 0.67298 +multipole 312 311 346 -0.04958 + 0.13334 0.00000 0.11242 + -0.15679 + 0.00000 -0.51619 + 0.33627 0.00000 0.67298 +multipole 313 312 311 0.05304 + 0.02860 0.00000 -0.02198 + -0.05851 + 0.00000 0.07881 + -0.01698 0.00000 -0.02030 +multipole 314 311 316 0.22509 + -0.02635 0.00000 0.29464 + -0.08112 + 0.00000 -0.47377 + 0.09344 0.00000 0.55489 +multipole 315 314 311 0.01372 + -0.00919 0.00000 -0.08228 + -0.07774 + 0.00000 0.12514 + -0.03924 0.00000 -0.04740 +multipole 316 320 314 0.03216 + 0.10990 0.00000 -0.01958 + 0.37889 + 0.00000 -0.28717 + -0.17655 0.00000 -0.09172 +multipole 317 316 320 0.02686 + 0.00928 0.00000 -0.08296 + 0.06542 + 0.00000 0.05572 + -0.06717 0.00000 -0.12114 +multipole 318 322 312 0.20366 + 0.20594 0.00000 0.09319 + -0.11723 + 0.00000 -0.31762 + -0.43984 0.00000 0.43485 +multipole 318 346 312 0.20366 + 0.20594 0.00000 0.09319 + -0.11723 + 0.00000 -0.31762 + -0.43984 0.00000 0.43485 +multipole 319 318 322 0.05807 + 0.02182 0.00000 -0.04741 + -0.01189 + 0.00000 0.01995 + 0.00147 0.00000 -0.00806 +multipole 319 318 346 0.05807 + 0.02182 0.00000 -0.04741 + -0.01189 + 0.00000 0.01995 + 0.00147 0.00000 -0.00806 +multipole 320 316 321 -0.46715 + -0.24005 0.00000 0.22215 + -0.23660 + 0.00000 -0.43315 + -0.40748 0.00000 0.66975 +multipole 321 320 316 0.36314 + 0.09447 0.00000 -0.13458 + 0.10571 + 0.00000 0.03601 + 0.09130 0.00000 -0.14172 +multipole 322 318 312 -0.54322 + -0.13139 0.00000 -0.09707 + 0.25255 + 0.00000 -0.62094 + 0.53908 0.00000 0.36839 +multipole 323 346 318 0.36509 + -0.03477 0.00000 -0.07061 + 0.00668 + 0.00000 -0.00878 + -0.03884 0.00000 0.00210 +multipole 324 326 312 0.21472 + 0.26025 0.00000 0.34835 + 0.07978 + 0.00000 -0.45645 + -0.03790 0.00000 0.37667 +multipole 324 345 312 0.21472 + 0.26025 0.00000 0.34835 + 0.07978 + 0.00000 -0.45645 + -0.03790 0.00000 0.37667 +multipole 325 324 326 0.01769 + -0.00317 0.00000 -0.11654 + 0.10449 + 0.00000 -0.04493 + -0.02925 0.00000 -0.05956 +multipole 325 324 345 0.01769 + -0.00317 0.00000 -0.11654 + 0.10449 + 0.00000 -0.04493 + -0.02925 0.00000 -0.05956 +multipole 326 324 312 -0.56592 + -0.32270 0.00000 -0.10112 + 0.42126 + 0.00000 -1.13829 + 0.05033 0.00000 0.71703 +multipole 327 345 324 0.36475 + 0.00908 0.00000 -0.09922 + 0.06175 + 0.00000 -0.02643 + 0.03413 0.00000 -0.03532 +multipole 328 332 329 -0.04092 + 0.09394 0.00000 0.14534 + -0.08972 + 0.00000 -0.36979 + 0.35252 0.00000 0.45951 +multipole 329 338 328 0.09541 + 0.23270 0.00000 0.16242 + -0.08206 + 0.00000 -0.24668 + -0.05092 0.00000 0.32874 +multipole 329 347 328 0.09541 + 0.23270 0.00000 0.16242 + -0.08206 + 0.00000 -0.24668 + -0.05092 0.00000 0.32874 +multipole 330 331 329 -0.16585 + 0.34883 0.00000 0.32833 + 0.52159 + 0.00000 -0.79855 + -0.04388 0.00000 0.27696 +multipole 331 332 330 0.36158 + 0.07286 0.00000 0.32523 + 0.20365 + 0.00000 -0.53379 + -0.16275 0.00000 0.33014 +multipole 332 -331 -328 -0.20726 + 0.17196 0.00000 0.47089 + 1.34014 + 0.00000 -1.03558 + 0.09226 0.00000 -0.30456 +multipole 333 330 329 0.07594 + -0.00339 0.00000 -0.12482 + 0.03839 + 0.00000 0.06287 + -0.06388 0.00000 -0.10126 +multipole 334 331 332 -0.02874 + -0.02540 0.00000 -0.16522 + 0.03324 + 0.00000 0.05278 + -0.02045 0.00000 -0.08602 +multipole 335 329 338 0.04534 + 0.03745 0.00000 -0.06219 + 0.05688 + 0.00000 0.05897 + 0.04350 0.00000 -0.11585 +multipole 335 329 347 0.04534 + 0.03745 0.00000 -0.06219 + 0.05688 + 0.00000 0.05897 + 0.04350 0.00000 -0.11585 +multipole 336 328 332 0.06371 + -0.00143 0.00000 0.03820 + -0.07016 + 0.00000 -0.02994 + -0.02128 0.00000 0.10010 +multipole 337 341 328 0.20884 + 0.23256 0.00000 0.32780 + 0.07966 + 0.00000 -0.49936 + -0.23651 0.00000 0.41970 +multipole 337 348 328 0.20884 + 0.23256 0.00000 0.32780 + 0.07966 + 0.00000 -0.49936 + -0.23651 0.00000 0.41970 +multipole 338 329 328 -0.53633 + -0.15241 0.00000 0.08515 + -0.15239 + 0.00000 -0.52084 + 0.11305 0.00000 0.67323 +multipole 339 347 329 0.35299 + -0.02338 0.00000 -0.07709 + 0.08385 + 0.00000 -0.02966 + -0.02571 0.00000 -0.05419 +multipole 340 337 341 0.01484 + -0.00257 0.00000 -0.14412 + 0.09017 + 0.00000 0.03078 + -0.02370 0.00000 -0.12095 +multipole 340 337 348 0.01484 + -0.00257 0.00000 -0.14412 + 0.09017 + 0.00000 0.03078 + -0.02370 0.00000 -0.12095 +multipole 341 337 328 -0.56353 + -0.22239 0.00000 -0.06011 + 0.38656 + 0.00000 -1.00409 + 0.25289 0.00000 0.61753 +multipole 342 348 337 0.36821 + -0.00780 0.00000 -0.05456 + 0.01443 + 0.00000 -0.02693 + 0.00842 0.00000 0.01250 +multipole 343 -326 -322 1.70654 + 0.00000 0.00000 -0.01783 + 0.54887 + 0.00000 -0.40394 + 0.00000 0.00000 -0.14493 +multipole 343 -341 -338 1.70654 + 0.00000 0.00000 -0.01783 + 0.54887 + 0.00000 -0.40394 + 0.00000 0.00000 -0.14493 +multipole 344 343 344 -0.97486 + 0.00176 0.00000 -0.07975 + -0.17391 + 0.00000 -0.19149 + -0.01158 0.00000 0.36540 +multipole 345 -324 -327 -0.55194 + -0.28854 0.00000 0.13115 + 0.52394 + 0.00000 -0.49611 + -0.53329 0.00000 -0.02783 +multipole 346 -318 -323 -0.53022 + -0.30181 0.00000 0.07347 + 0.67028 + 0.00000 -0.55976 + -0.27623 0.00000 -0.11052 +multipole 347 -329 -339 -0.51852 + -0.33062 0.00000 0.16496 + 0.59735 + 0.00000 -0.64156 + -0.24661 0.00000 0.04421 +multipole 348 -337 -342 -0.54572 + -0.35421 0.00000 0.09483 + 0.77382 + 0.00000 -0.63430 + -0.30271 0.00000 -0.13952 +multipole 349 -350 -350 -0.51966 + 0.00000 0.00000 0.14279 + 0.37928 + 0.00000 -0.41809 + 0.00000 0.00000 0.03881 +multipole 350 349 350 0.25983 + -0.03859 0.00000 -0.05818 + -0.03673 + 0.00000 -0.10739 + -0.00203 0.00000 0.14412 +multipole 351 0 0 1.00000 + 0.00000 0.00000 0.00000 + 0.00000 + 0.00000 0.00000 + 0.00000 0.00000 0.00000 +multipole 352 0 0 1.00000 + 0.00000 0.00000 0.00000 + 0.00000 + 0.00000 0.00000 + 0.00000 0.00000 0.00000 +multipole 353 0 0 1.00000 + 0.00000 0.00000 0.00000 + 0.00000 + 0.00000 0.00000 + 0.00000 0.00000 0.00000 +multipole 354 0 0 1.00000 + 0.00000 0.00000 0.00000 + 0.00000 + 0.00000 0.00000 + 0.00000 0.00000 0.00000 +multipole 355 0 0 1.00000 + 0.00000 0.00000 0.00000 + 0.00000 + 0.00000 0.00000 + 0.00000 0.00000 0.00000 +multipole 356 0 0 2.00000 + 0.00000 0.00000 0.00000 + 0.00000 + 0.00000 0.00000 + 0.00000 0.00000 0.00000 +multipole 357 0 0 2.00000 + 0.00000 0.00000 0.00000 + 0.00000 + 0.00000 0.00000 + 0.00000 0.00000 0.00000 +multipole 358 0 0 2.00000 + 0.00000 0.00000 0.00000 + 0.00000 + 0.00000 0.00000 + 0.00000 0.00000 0.00000 +multipole 359 0 0 2.00000 + 0.00000 0.00000 0.00000 + 0.00000 + 0.00000 0.00000 + 0.00000 0.00000 0.00000 +multipole 360 0 0 -1.00000 + 0.00000 0.00000 0.00000 + 0.00000 + 0.00000 0.00000 + 0.00000 0.00000 0.00000 +multipole 361 0 0 -1.00000 + 0.00000 0.00000 0.00000 + 0.00000 + 0.00000 0.00000 + 0.00000 0.00000 0.00000 +multipole 362 0 0 -1.00000 + 0.00000 0.00000 0.00000 + 0.00000 + 0.00000 0.00000 + 0.00000 0.00000 0.00000 +multipole 363 0 0 -1.00000 + 0.00000 0.00000 0.00000 + 0.00000 + 0.00000 0.00000 + 0.00000 0.00000 0.00000 + + + ######################################## + ## ## + ## Dipole Polarizability Parameters ## + ## ## + ######################################## + + +polarize 1 1.0730 0.3900 3 4 9 52 223 242 +polarize 2 1.3340 0.3900 6 +polarize 3 1.3340 0.3900 1 5 7 50 225 227 +polarize 4 0.4960 0.3900 1 +polarize 5 0.8370 0.3900 3 +polarize 6 0.4960 0.3900 2 +polarize 7 1.0730 0.3900 3 9 10 52 223 242 +polarize 8 1.3340 0.3900 12 +polarize 9 1.3340 0.3900 1 7 11 50 225 227 +polarize 10 0.4960 0.3900 7 +polarize 11 0.8370 0.3900 9 +polarize 12 0.4960 0.3900 8 48 +polarize 13 1.3340 0.3900 14 +polarize 14 0.4960 0.3900 13 +polarize 15 1.3340 0.3900 16 17 +polarize 16 0.4960 0.3900 15 +polarize 17 1.3340 0.3900 15 18 +polarize 18 0.4960 0.3900 17 +polarize 19 1.3340 0.3900 20 21 +polarize 20 0.4960 0.3900 19 +polarize 21 1.3340 0.3900 19 22 23 +polarize 22 0.4960 0.3900 21 +polarize 23 1.3340 0.3900 21 24 +polarize 24 0.4960 0.3900 23 +polarize 25 1.3340 0.3900 26 29 +polarize 26 0.4960 0.3900 25 +polarize 27 1.3340 0.3900 28 31 +polarize 28 0.4960 0.3900 27 +polarize 29 1.3340 0.3900 25 30 +polarize 30 0.4960 0.3900 29 +polarize 31 1.3340 0.3900 27 32 +polarize 32 0.4960 0.3900 31 +polarize 33 1.3340 0.3900 34 35 +polarize 34 0.4960 0.3900 33 +polarize 35 0.8370 0.3900 33 36 +polarize 36 0.4960 0.3900 35 +polarize 37 1.3340 0.3900 38 39 +polarize 38 0.4960 0.3900 37 +polarize 39 0.8370 0.3900 37 40 +polarize 40 0.4960 0.3900 39 +polarize 41 1.3340 0.3900 42 +polarize 42 0.4960 0.3900 41 +polarize 43 1.3340 0.3900 44 48 49 +polarize 44 0.4960 0.3900 43 +polarize 45 2.8000 0.3900 46 +polarize 46 0.4960 0.3900 45 +polarize 47 2.8000 0.3900 47 +polarize 48 1.3340 0.3900 12 43 +polarize 49 4.0000 0.3900 43 +polarize 50 1.0730 0.3900 3 9 52 59 223 242 +polarize 51 1.3340 0.3900 54 +polarize 52 1.3340 0.3900 1 7 50 53 225 227 +polarize 53 0.8370 0.3900 52 +polarize 54 0.4960 0.3900 51 +polarize 55 1.3340 0.3900 56 +polarize 56 0.4960 0.3900 55 +polarize 57 1.3340 0.3900 58 +polarize 58 0.4960 0.3900 57 +polarize 59 1.3340 0.3900 50 60 +polarize 60 0.4960 0.3900 59 +polarize 61 1.3340 0.3900 62 63 +polarize 62 0.4960 0.3900 61 +polarize 63 1.7500 0.3900 61 64 +polarize 64 1.7500 0.3900 63 65 66 +polarize 65 0.6960 0.3900 64 +polarize 66 1.7500 0.3900 64 67 68 +polarize 67 0.6960 0.3900 66 +polarize 68 1.7500 0.3900 66 69 +polarize 69 0.6960 0.3900 68 +polarize 70 1.3340 0.3900 71 72 +polarize 71 0.4960 0.3900 70 +polarize 72 1.7500 0.3900 70 73 +polarize 73 1.7500 0.3900 72 74 75 +polarize 74 0.6960 0.3900 73 +polarize 75 1.7500 0.3900 73 76 77 +polarize 76 0.6960 0.3900 75 +polarize 77 1.7500 0.3900 75 78 +polarize 78 0.8370 0.3900 77 79 +polarize 79 0.4960 0.3900 78 +polarize 80 1.3340 0.3900 81 +polarize 81 0.4960 0.3900 80 +polarize 82 1.7500 0.3900 83 +polarize 83 1.7500 0.3900 82 84 85 +polarize 84 0.6960 0.3900 83 +polarize 85 1.7500 0.3900 83 86 87 +polarize 86 0.6960 0.3900 85 +polarize 87 1.7500 0.3900 85 88 +polarize 88 0.8370 0.3900 87 +polarize 89 1.3340 0.3900 90 +polarize 90 0.4960 0.3900 89 +polarize 91 1.7500 0.3900 92 94 +polarize 92 1.7500 0.3900 91 93 95 +polarize 93 0.6960 0.3900 92 +polarize 94 1.7500 0.3900 91 97 98 +polarize 95 1.0730 0.3900 92 96 97 +polarize 96 0.4960 0.3900 95 +polarize 97 1.7500 0.3900 94 95 100 +polarize 98 1.7500 0.3900 94 99 102 +polarize 99 0.6960 0.3900 98 +polarize 100 1.7500 0.3900 97 101 104 +polarize 101 0.6960 0.3900 100 +polarize 102 1.7500 0.3900 98 103 104 +polarize 103 0.6960 0.3900 102 +polarize 104 1.7500 0.3900 100 102 105 +polarize 105 0.6960 0.3900 104 +polarize 106 1.3340 0.3900 107 108 +polarize 107 0.4960 0.3900 106 +polarize 108 1.7500 0.3900 106 109 111 +polarize 109 1.5000 0.3900 108 110 113 +polarize 110 0.6960 0.3900 109 +polarize 111 1.7500 0.3900 108 112 115 +polarize 112 0.6960 0.3900 111 +polarize 113 1.7500 0.3900 109 114 115 +polarize 114 0.6960 0.3900 113 +polarize 115 1.5000 0.3900 111 113 116 +polarize 116 0.6960 0.3900 115 +polarize 117 1.3340 0.3900 118 119 +polarize 118 0.4960 0.3900 117 +polarize 119 1.7500 0.3900 117 120 122 +polarize 120 1.5000 0.3900 119 121 122 124 +polarize 121 0.6960 0.3900 120 +polarize 122 1.7500 0.3900 119 120 123 126 +polarize 123 0.6960 0.3900 122 +polarize 124 1.7500 0.3900 120 125 126 +polarize 125 0.6960 0.3900 124 +polarize 126 1.5000 0.3900 122 124 +polarize 127 1.3340 0.3900 128 129 +polarize 128 0.4960 0.3900 127 +polarize 129 1.7500 0.3900 127 130 131 +polarize 130 1.5000 0.3900 129 133 +polarize 131 1.7500 0.3900 129 132 135 +polarize 132 0.6960 0.3900 131 +polarize 133 1.7500 0.3900 130 134 135 +polarize 134 0.6960 0.3900 133 +polarize 135 1.5000 0.3900 131 133 136 +polarize 136 0.6960 0.3900 135 +polarize 137 1.3340 0.3900 138 139 +polarize 138 0.4960 0.3900 137 +polarize 139 1.3340 0.3900 137 140 +polarize 140 1.2000 0.3900 139 +polarize 141 1.3340 0.3900 142 143 +polarize 142 0.4960 0.3900 141 +polarize 143 1.3340 0.3900 141 144 145 +polarize 144 0.8370 0.3900 143 +polarize 145 0.8370 0.3900 143 146 +polarize 146 0.4960 0.3900 145 +polarize 147 1.3340 0.3900 148 149 +polarize 148 0.4960 0.3900 147 +polarize 149 1.3340 0.3900 147 150 151 +polarize 150 0.8340 0.3900 149 +polarize 151 1.0730 0.3900 149 152 +polarize 152 0.4960 0.3900 151 +polarize 153 1.3340 0.3900 154 +polarize 154 0.4960 0.3900 153 +polarize 155 1.3340 0.3900 156 157 +polarize 156 0.4960 0.3900 155 +polarize 157 1.3340 0.3900 155 158 +polarize 158 1.2000 0.3900 157 +polarize 159 1.3340 0.3900 160 +polarize 160 0.4960 0.3900 159 +polarize 161 1.3340 0.3900 162 163 +polarize 162 0.4960 0.3900 161 +polarize 163 1.3340 0.3900 161 164 165 +polarize 164 0.8370 0.3900 163 +polarize 165 0.8370 0.3900 163 166 +polarize 166 0.4960 0.3900 165 +polarize 167 1.3340 0.3900 168 +polarize 168 0.4960 0.3900 167 +polarize 169 1.3340 0.3900 170 171 +polarize 170 0.4960 0.3900 169 +polarize 171 1.3340 0.3900 169 172 173 +polarize 172 0.8340 0.3900 171 +polarize 173 1.0730 0.3900 171 174 +polarize 174 0.4960 0.3900 173 +polarize 175 1.3340 0.3900 176 +polarize 176 0.4960 0.3900 175 +polarize 177 1.3340 0.3900 178 179 +polarize 178 0.4960 0.3900 177 +polarize 179 3.3000 0.3900 177 180 +polarize 180 1.3340 0.3900 179 181 +polarize 181 0.4960 0.3900 180 +polarize 182 1.3340 0.3900 183 184 +polarize 183 0.4960 0.3900 182 +polarize 184 1.3340 0.3900 182 185 186 +polarize 185 0.4960 0.3900 184 +polarize 186 1.3340 0.3900 184 187 +polarize 187 0.4960 0.3900 186 +polarize 188 1.3340 0.3900 189 190 +polarize 189 0.4960 0.3900 188 +polarize 190 1.0730 0.3900 188 191 +polarize 191 0.4960 0.3900 190 +polarize 192 1.3340 0.3900 193 194 +polarize 193 0.4960 0.3900 192 +polarize 194 1.3340 0.3900 192 195 196 +polarize 195 0.4960 0.3900 194 +polarize 196 1.3340 0.3900 194 197 +polarize 197 0.4960 0.3900 196 +polarize 198 1.3340 0.3900 199 200 +polarize 199 0.4960 0.3900 198 +polarize 200 1.0730 0.3900 198 201 +polarize 201 0.4960 0.3900 200 +polarize 202 1.3340 0.3900 203 204 +polarize 203 0.4960 0.3900 202 +polarize 204 1.3340 0.3900 202 205 206 +polarize 205 0.4960 0.3900 204 +polarize 206 1.3340 0.3900 204 207 +polarize 207 0.4960 0.3900 206 +polarize 208 1.0730 0.3900 209 210 +polarize 209 0.4960 0.3900 208 +polarize 210 1.3340 0.3900 208 211 +polarize 211 1.0730 0.3900 210 212 +polarize 212 0.4960 0.3900 211 +polarize 213 1.3340 0.3900 214 215 +polarize 214 0.4960 0.3900 213 +polarize 215 1.3340 0.3900 213 216 +polarize 216 0.4960 0.3900 215 +polarize 217 1.3340 0.3900 218 219 +polarize 218 0.4960 0.3900 217 +polarize 219 1.0730 0.3900 217 220 +polarize 220 0.4960 0.3900 219 +polarize 221 1.3340 0.3900 222 +polarize 222 0.4960 0.3900 221 +polarize 223 1.3340 0.3900 1 7 50 224 +polarize 224 0.8370 0.3900 223 +polarize 225 1.0730 0.3900 3 9 52 226 242 +polarize 226 0.4960 0.3900 225 +polarize 227 1.0730 0.3900 3 9 52 228 242 +polarize 228 0.4960 0.3900 227 +polarize 229 1.3340 0.3900 230 +polarize 230 0.4960 0.3900 229 +polarize 231 1.0730 0.3900 232 +polarize 232 0.4960 0.3900 231 +polarize 233 1.3340 0.3900 234 +polarize 234 0.8370 0.3900 233 +polarize 235 1.3340 0.3900 236 237 +polarize 236 0.8370 0.3900 235 +polarize 237 0.8370 0.3900 235 238 +polarize 238 0.4960 0.3900 237 +polarize 239 1.0730 0.3900 240 +polarize 240 0.4960 0.3900 239 +polarize 241 1.3340 0.3900 244 +polarize 242 1.3340 0.3900 1 7 50 225 227 243 +polarize 243 0.8370 0.3900 242 +polarize 244 0.4960 0.3900 241 +polarize 245 1.3340 0.3900 246 +polarize 246 0.4960 0.3900 245 +polarize 247 1.7500 0.3900 250 251 252 256 +polarize 248 1.7500 0.3900 251 252 255 258 +polarize 249 2.2500 0.3900 250 253 257 +polarize 250 2.2500 0.3900 247 249 255 +polarize 251 1.0730 0.3900 247 248 +polarize 252 1.0730 0.3900 247 248 +polarize 253 1.4500 0.3900 249 260 +polarize 254 1.7500 0.3900 256 257 259 +polarize 255 1.4500 0.3900 248 250 +polarize 256 1.4500 0.3900 247 254 +polarize 257 1.4500 0.3900 249 254 +polarize 258 0.6960 0.3900 248 +polarize 259 0.6960 0.3900 254 +polarize 260 0.6960 0.3900 253 +polarize 261 1.0730 0.3900 265 266 +polarize 262 1.0730 0.3900 265 266 +polarize 263 1.7500 0.3900 265 267 269 +polarize 264 1.4500 0.3900 267 272 +polarize 265 1.7500 0.3900 261 262 263 271 +polarize 266 1.7500 0.3900 261 262 268 270 +polarize 267 1.7500 0.3900 263 264 268 +polarize 268 1.4500 0.3900 266 267 +polarize 269 0.6960 0.3900 263 +polarize 270 1.3000 0.3900 266 +polarize 271 0.6960 0.3900 265 +polarize 272 0.6960 0.3900 264 +polarize 273 1.7500 0.3900 277 278 283 +polarize 274 1.7500 0.3900 277 279 285 +polarize 275 2.2500 0.3900 279 280 281 283 +polarize 276 1.7500 0.3900 280 281 282 286 +polarize 277 1.0730 0.3900 273 274 284 +polarize 278 1.4500 0.3900 273 287 +polarize 279 2.2500 0.3900 274 275 282 +polarize 280 1.0730 0.3900 275 276 +polarize 281 1.0730 0.3900 275 276 +polarize 282 1.4500 0.3900 276 279 +polarize 283 1.4500 0.3900 273 275 +polarize 284 0.4960 0.3900 277 +polarize 285 1.3000 0.3900 274 +polarize 286 0.6960 0.3900 276 +polarize 287 0.6960 0.3900 278 +polarize 288 1.3340 0.3900 289 295 +polarize 289 1.7500 0.3900 288 290 291 +polarize 290 1.7500 0.3900 289 293 298 +polarize 291 1.7500 0.3900 289 292 297 +polarize 292 1.0730 0.3900 291 294 +polarize 293 1.0730 0.3900 290 294 299 +polarize 294 1.7500 0.3900 292 293 296 +polarize 295 0.4960 0.3900 288 +polarize 296 1.3000 0.3900 294 +polarize 297 0.6960 0.3900 291 +polarize 298 1.3000 0.3900 290 +polarize 299 0.4960 0.3900 293 +polarize 300 1.7500 0.3900 303 304 308 +polarize 301 1.7500 0.3900 304 305 310 +polarize 302 1.7500 0.3900 303 305 309 +polarize 303 1.0730 0.3900 300 302 306 +polarize 304 1.0730 0.3900 300 301 +polarize 305 1.7500 0.3900 301 302 307 +polarize 306 0.4960 0.3900 303 +polarize 307 0.6960 0.3900 305 +polarize 308 1.3000 0.3900 300 +polarize 309 1.3000 0.3900 302 +polarize 310 0.6960 0.3900 301 +polarize 311 0.8370 0.3900 312 314 +polarize 312 1.3340 0.3900 311 313 +polarize 313 0.4960 0.3900 312 +polarize 314 1.3340 0.3900 311 315 +polarize 315 0.4960 0.3900 314 +polarize 316 1.3340 0.3900 317 320 +polarize 317 0.4960 0.3900 316 +polarize 318 1.3340 0.3900 319 322 346 +polarize 319 0.4960 0.3900 318 +polarize 320 0.8370 0.3900 316 321 +polarize 321 0.4960 0.3900 320 +polarize 322 0.8370 0.3900 318 343 +polarize 323 0.4960 0.3900 346 +polarize 324 1.3340 0.3900 325 326 345 +polarize 325 0.4960 0.3900 324 +polarize 326 0.8370 0.3900 324 343 +polarize 327 0.4960 0.3900 345 +polarize 328 1.3340 0.3900 332 336 +polarize 329 1.3340 0.3900 335 338 347 +polarize 330 1.3340 0.3900 333 +polarize 331 1.3340 0.3900 332 334 +polarize 332 0.8370 0.3900 328 331 +polarize 333 0.4960 0.3900 330 +polarize 334 0.4960 0.3900 331 +polarize 335 0.4960 0.3900 329 +polarize 336 0.4960 0.3900 328 +polarize 337 1.3340 0.3900 340 341 348 +polarize 338 0.8370 0.3900 329 343 +polarize 339 0.4960 0.3900 347 +polarize 340 0.4960 0.3900 337 +polarize 341 0.8370 0.3900 337 343 +polarize 342 0.4960 0.3900 348 +polarize 343 1.7880 0.3900 322 326 338 341 344 +polarize 344 1.7240 0.3900 343 +polarize 345 0.8370 0.3900 324 327 +polarize 346 0.8370 0.3900 318 323 +polarize 347 0.8370 0.3900 329 339 +polarize 348 0.8370 0.3900 337 342 +polarize 349 0.8370 0.3900 350 +polarize 350 0.4960 0.3900 349 +polarize 351 0.0280 0.3900 +polarize 352 0.1200 0.3900 +polarize 353 0.7800 0.3900 +polarize 354 1.3500 0.3900 +polarize 355 2.2600 0.3900 +polarize 356 0.0100 0.0650 +polarize 357 0.0800 0.1150 +polarize 358 0.5500 0.1800 +polarize 359 0.2600 0.2096 +polarize 360 1.3500 0.3900 +polarize 361 4.0000 0.3900 +polarize 362 5.6500 0.3900 +polarize 363 7.2500 0.3900 + + + ######################################## + ## ## + ## Biopolymer Atom Type Conversions ## + ## ## + ######################################## + + +biotype 1 N "Glycine" 1 +biotype 2 CA "Glycine" 2 +biotype 3 C "Glycine" 3 +biotype 4 HN "Glycine" 4 +biotype 5 O "Glycine" 5 +biotype 6 HA "Glycine" 6 +biotype 7 N "Alanine" 7 +biotype 8 CA "Alanine" 8 +biotype 9 C "Alanine" 9 +biotype 10 HN "Alanine" 10 +biotype 11 O "Alanine" 11 +biotype 12 HA "Alanine" 12 +biotype 13 CB "Alanine" 13 +biotype 14 HB "Alanine" 14 +biotype 15 N "Valine" 7 +biotype 16 CA "Valine" 8 +biotype 17 C "Valine" 9 +biotype 18 HN "Valine" 10 +biotype 19 O "Valine" 11 +biotype 20 HA "Valine" 12 +biotype 21 CB "Valine" 15 +biotype 22 HB "Valine" 16 +biotype 23 CG1 "Valine" 17 +biotype 24 HG1 "Valine" 18 +biotype 25 CG2 "Valine" 17 +biotype 26 HG2 "Valine" 18 +biotype 27 N "Leucine" 7 +biotype 28 CA "Leucine" 8 +biotype 29 C "Leucine" 9 +biotype 30 HN "Leucine" 10 +biotype 31 O "Leucine" 11 +biotype 32 HA "Leucine" 12 +biotype 33 CB "Leucine" 19 +biotype 34 HB "Leucine" 20 +biotype 35 CG "Leucine" 21 +biotype 36 HG "Leucine" 22 +biotype 37 CD1 "Leucine" 23 +biotype 38 HD1 "Leucine" 24 +biotype 39 CD2 "Leucine" 23 +biotype 40 HD2 "Leucine" 24 +biotype 41 N "Isoleucine" 7 +biotype 42 CA "Isoleucine" 8 +biotype 43 C "Isoleucine" 9 +biotype 44 HN "Isoleucine" 10 +biotype 45 O "Isoleucine" 11 +biotype 46 HA "Isoleucine" 12 +biotype 47 CB "Isoleucine" 25 +biotype 48 HB "Isoleucine" 26 +biotype 49 CG1 "Isoleucine" 27 +biotype 50 HG1 "Isoleucine" 28 +biotype 51 CG2 "Isoleucine" 29 +biotype 52 HG2 "Isoleucine" 30 +biotype 53 CD "Isoleucine" 31 +biotype 54 HD "Isoleucine" 32 +biotype 55 N "Serine" 7 +biotype 56 CA "Serine" 8 +biotype 57 C "Serine" 9 +biotype 58 HN "Serine" 10 +biotype 59 O "Serine" 11 +biotype 60 HA "Serine" 12 +biotype 61 CB "Serine" 33 +biotype 62 HB "Serine" 34 +biotype 63 OG "Serine" 35 +biotype 64 HG "Serine" 36 +biotype 65 N "Threonine" 7 +biotype 66 CA "Threonine" 8 +biotype 67 C "Threonine" 9 +biotype 68 HN "Threonine" 10 +biotype 69 O "Threonine" 11 +biotype 70 HA "Threonine" 12 +biotype 71 CB "Threonine" 37 +biotype 72 HB "Threonine" 38 +biotype 73 OG1 "Threonine" 39 +biotype 74 HG1 "Threonine" 40 +biotype 75 CG2 "Threonine" 41 +biotype 76 HG2 "Threonine" 42 +biotype 77 N "Cysteine (SH)" 7 +biotype 78 CA "Cysteine (SH)" 8 +biotype 79 C "Cysteine (SH)" 9 +biotype 80 HN "Cysteine (SH)" 10 +biotype 81 O "Cysteine (SH)" 11 +biotype 82 HA "Cysteine (SH)" 12 +biotype 83 CB "Cysteine (SH)" 43 +biotype 84 HB "Cysteine (SH)" 44 +biotype 85 SG "Cysteine (SH)" 45 +biotype 86 HG "Cysteine (SH)" 46 +biotype 87 N "Cystine (SS)" 7 +biotype 88 CA "Cystine (SS)" 8 +biotype 89 C "Cystine (SS)" 9 +biotype 90 HN "Cystine (SS)" 10 +biotype 91 O "Cystine (SS)" 11 +biotype 92 HA "Cystine (SS)" 12 +biotype 93 CB "Cystine (SS)" 43 +biotype 94 HB "Cystine (SS)" 44 +biotype 95 SG "Cystine (SS)" 47 +biotype 96 N "Cysteine (S-)" 7 +biotype 97 CA "Cysteine (S-)" 48 +biotype 98 C "Cysteine (S-)" 9 +biotype 99 HN "Cysteine (S-)" 10 +biotype 100 O "Cysteine (S-)" 11 +biotype 101 HA "Cysteine (S-)" 12 +biotype 102 CB "Cysteine (S-)" 43 +biotype 103 HB "Cysteine (S-)" 44 +biotype 104 SG "Cysteine (S-)" 49 +biotype 105 N "Proline" 50 +biotype 106 CA "Proline" 51 +biotype 107 C "Proline" 52 +biotype 108 O "Proline" 53 +biotype 109 HA "Proline" 54 +biotype 110 CB "Proline" 55 +biotype 111 HB "Proline" 56 +biotype 112 CG "Proline" 57 +biotype 113 HG "Proline" 58 +biotype 114 CD "Proline" 59 +biotype 115 HD "Proline" 60 +biotype 116 N "Phenylalanine" 7 +biotype 117 CA "Phenylalanine" 8 +biotype 118 C "Phenylalanine" 9 +biotype 119 HN "Phenylalanine" 10 +biotype 120 O "Phenylalanine" 11 +biotype 121 HA "Phenylalanine" 12 +biotype 122 CB "Phenylalanine" 61 +biotype 123 HB "Phenylalanine" 62 +biotype 124 CG "Phenylalanine" 63 +biotype 125 CD "Phenylalanine" 64 +biotype 126 HD "Phenylalanine" 65 +biotype 127 CE "Phenylalanine" 66 +biotype 128 HE "Phenylalanine" 67 +biotype 129 CZ "Phenylalanine" 68 +biotype 130 HZ "Phenylalanine" 69 +biotype 131 N "Tyrosine" 7 +biotype 132 CA "Tyrosine" 8 +biotype 133 C "Tyrosine" 9 +biotype 134 HN "Tyrosine" 10 +biotype 135 O "Tyrosine" 11 +biotype 136 HA "Tyrosine" 12 +biotype 137 CB "Tyrosine" 70 +biotype 138 HB "Tyrosine" 71 +biotype 139 CG "Tyrosine" 72 +biotype 140 CD "Tyrosine" 73 +biotype 141 HD "Tyrosine" 74 +biotype 142 CE "Tyrosine" 75 +biotype 143 HE "Tyrosine" 76 +biotype 144 CZ "Tyrosine" 77 +biotype 145 OH "Tyrosine" 78 +biotype 146 HH "Tyrosine" 79 +biotype 147 N "Tyrosine (O-)" 7 +biotype 148 CA "Tyrosine (O-)" 8 +biotype 149 C "Tyrosine (O-)" 9 +biotype 150 HN "Tyrosine (O-)" 10 +biotype 151 O "Tyrosine (O-)" 11 +biotype 152 HA "Tyrosine (O-)" 12 +biotype 153 CB "Tyrosine (O-)" 80 +biotype 154 HB "Tyrosine (O-)" 81 +biotype 155 CG "Tyrosine (O-)" 82 +biotype 156 CD "Tyrosine (O-)" 83 +biotype 157 HD "Tyrosine (O-)" 84 +biotype 158 CE "Tyrosine (O-)" 85 +biotype 159 HE "Tyrosine (O-)" 86 +biotype 160 CZ "Tyrosine (O-)" 87 +biotype 161 OH "Tyrosine (O-)" 88 +biotype 162 N "Tryptophan" 7 +biotype 163 CA "Tryptophan" 8 +biotype 164 C "Tryptophan" 9 +biotype 165 HN "Tryptophan" 10 +biotype 166 O "Tryptophan" 11 +biotype 167 HA "Tryptophan" 12 +biotype 168 CB "Tryptophan" 89 +biotype 169 HB "Tryptophan" 90 +biotype 170 CG "Tryptophan" 91 +biotype 171 CD1 "Tryptophan" 92 +biotype 172 HD1 "Tryptophan" 93 +biotype 173 CD2 "Tryptophan" 94 +biotype 174 NE1 "Tryptophan" 95 +biotype 175 HE1 "Tryptophan" 96 +biotype 176 CE2 "Tryptophan" 97 +biotype 177 CE3 "Tryptophan" 98 +biotype 178 HE3 "Tryptophan" 99 +biotype 179 CZ2 "Tryptophan" 100 +biotype 180 HZ2 "Tryptophan" 101 +biotype 181 CZ3 "Tryptophan" 102 +biotype 182 HZ3 "Tryptophan" 103 +biotype 183 CH2 "Tryptophan" 104 +biotype 184 HH2 "Tryptophan" 105 +biotype 185 N "Histidine (+)" 7 +biotype 186 CA "Histidine (+)" 8 +biotype 187 C "Histidine (+)" 9 +biotype 188 HN "Histidine (+)" 10 +biotype 189 O "Histidine (+)" 11 +biotype 190 HA "Histidine (+)" 12 +biotype 191 CB "Histidine (+)" 106 +biotype 192 HB "Histidine (+)" 107 +biotype 193 CG "Histidine (+)" 108 +biotype 194 ND1 "Histidine (+)" 109 +biotype 195 HD1 "Histidine (+)" 110 +biotype 196 CD2 "Histidine (+)" 111 +biotype 197 HD2 "Histidine (+)" 112 +biotype 198 CE1 "Histidine (+)" 113 +biotype 199 HE1 "Histidine (+)" 114 +biotype 200 NE2 "Histidine (+)" 115 +biotype 201 HE2 "Histidine (+)" 116 +biotype 202 N "Histidine (HD)" 7 +biotype 203 CA "Histidine (HD)" 8 +biotype 204 C "Histidine (HD)" 9 +biotype 205 HN "Histidine (HD)" 10 +biotype 206 O "Histidine (HD)" 11 +biotype 207 HA "Histidine (HD)" 12 +biotype 208 CB "Histidine (HD)" 117 +biotype 209 HB "Histidine (HD)" 118 +biotype 210 CG "Histidine (HD)" 119 +biotype 211 ND1 "Histidine (HD)" 120 +biotype 212 HD1 "Histidine (HD)" 121 +biotype 213 CD2 "Histidine (HD)" 122 +biotype 214 HD2 "Histidine (HD)" 123 +biotype 215 CE1 "Histidine (HD)" 124 +biotype 216 HE1 "Histidine (HD)" 125 +biotype 217 NE2 "Histidine (HD)" 126 +biotype 218 N "Histidine (HE)" 7 +biotype 219 CA "Histidine (HE)" 8 +biotype 220 C "Histidine (HE)" 9 +biotype 221 HN "Histidine (HE)" 10 +biotype 222 O "Histidine (HE)" 11 +biotype 223 HA "Histidine (HE)" 12 +biotype 224 CB "Histidine (HE)" 127 +biotype 225 HB "Histidine (HE)" 128 +biotype 226 CG "Histidine (HE)" 129 +biotype 227 ND1 "Histidine (HE)" 130 +biotype 228 CD2 "Histidine (HE)" 131 +biotype 229 HD2 "Histidine (HE)" 132 +biotype 230 CE1 "Histidine (HE)" 133 +biotype 231 HE1 "Histidine (HE)" 134 +biotype 232 NE2 "Histidine (HE)" 135 +biotype 233 HE2 "Histidine (HE)" 136 +biotype 234 N "Aspartic Acid" 7 +biotype 235 CA "Aspartic Acid" 8 +biotype 236 C "Aspartic Acid" 9 +biotype 237 HN "Aspartic Acid" 10 +biotype 238 O "Aspartic Acid" 11 +biotype 239 HA "Aspartic Acid" 12 +biotype 240 CB "Aspartic Acid" 137 +biotype 241 HB "Aspartic Acid" 138 +biotype 242 CG "Aspartic Acid" 139 +biotype 243 OD "Aspartic Acid" 140 +biotype 244 N "Aspartic Acid (COOH)" 7 +biotype 245 CA "Aspartic Acid (COOH)" 8 +biotype 246 C "Aspartic Acid (COOH)" 9 +biotype 247 HN "Aspartic Acid (COOH)" 10 +biotype 248 O "Aspartic Acid (COOH)" 11 +biotype 249 HA "Aspartic Acid (COOH)" 12 +biotype 250 CB "Aspartic Acid (COOH)" 141 +biotype 251 HB "Aspartic Acid (COOH)" 142 +biotype 252 CG "Aspartic Acid (COOH)" 143 +biotype 253 OD1 "Aspartic Acid (COOH)" 144 +biotype 254 OD2 "Aspartic Acid (COOH)" 145 +biotype 255 HD2 "Aspartic Acid (COOH)" 146 +biotype 256 N "Asparagine" 7 +biotype 257 CA "Asparagine" 8 +biotype 258 C "Asparagine" 9 +biotype 259 HN "Asparagine" 10 +biotype 260 O "Asparagine" 11 +biotype 261 HA "Asparagine" 12 +biotype 262 CB "Asparagine" 147 +biotype 263 HB "Asparagine" 148 +biotype 264 CG "Asparagine" 149 +biotype 265 OD1 "Asparagine" 150 +biotype 266 ND2 "Asparagine" 151 +biotype 267 HD2 "Asparagine" 152 +biotype 268 N "Glutamic Acid" 7 +biotype 269 CA "Glutamic Acid" 8 +biotype 270 C "Glutamic Acid" 9 +biotype 271 HN "Glutamic Acid" 10 +biotype 272 O "Glutamic Acid" 11 +biotype 273 HA "Glutamic Acid" 12 +biotype 274 CB "Glutamic Acid" 153 +biotype 275 HB "Glutamic Acid" 154 +biotype 276 CG "Glutamic Acid" 155 +biotype 277 HG "Glutamic Acid" 156 +biotype 278 CD "Glutamic Acid" 157 +biotype 279 OE "Glutamic Acid" 158 +biotype 280 N "Glutamic Acid (COOH)" 7 +biotype 281 CA "Glutamic Acid (COOH)" 8 +biotype 282 C "Glutamic Acid (COOH)" 9 +biotype 283 HN "Glutamic Acid (COOH)" 10 +biotype 284 O "Glutamic Acid (COOH)" 11 +biotype 285 HA "Glutamic Acid (COOH)" 12 +biotype 286 CB "Glutamic Acid (COOH)" 159 +biotype 287 HB "Glutamic Acid (COOH)" 160 +biotype 288 CG "Glutamic Acid (COOH)" 161 +biotype 289 HG "Glutamic Acid (COOH)" 162 +biotype 290 CD "Glutamic Acid (COOH)" 163 +biotype 291 OE1 "Glutamic Acid (COOH)" 164 +biotype 292 OE2 "Glutamic Acid (COOH)" 165 +biotype 293 HE2 "Glutamic Acid (COOH)" 166 +biotype 294 N "Glutamine" 7 +biotype 295 CA "Glutamine" 8 +biotype 296 C "Glutamine" 9 +biotype 297 HN "Glutamine" 10 +biotype 298 O "Glutamine" 11 +biotype 299 HA "Glutamine" 12 +biotype 300 CB "Glutamine" 167 +biotype 301 HB "Glutamine" 168 +biotype 302 CG "Glutamine" 169 +biotype 303 HG "Glutamine" 170 +biotype 304 CD "Glutamine" 171 +biotype 305 OE1 "Glutamine" 172 +biotype 306 NE2 "Glutamine" 173 +biotype 307 HE2 "Glutamine" 174 +biotype 308 N "Methionine" 7 +biotype 309 CA "Methionine" 8 +biotype 310 C "Methionine" 9 +biotype 311 HN "Methionine" 10 +biotype 312 O "Methionine" 11 +biotype 313 HA "Methionine" 12 +biotype 314 CB "Methionine" 175 +biotype 315 HB "Methionine" 176 +biotype 316 CG "Methionine" 177 +biotype 317 HG "Methionine" 178 +biotype 318 SD "Methionine" 179 +biotype 319 CE "Methionine" 180 +biotype 320 HE "Methionine" 181 +biotype 321 N "Lysine" 7 +biotype 322 CA "Lysine" 8 +biotype 323 C "Lysine" 9 +biotype 324 HN "Lysine" 10 +biotype 325 O "Lysine" 11 +biotype 326 HA "Lysine" 12 +biotype 327 CB "Lysine" 182 +biotype 328 HB "Lysine" 183 +biotype 329 CG "Lysine" 184 +biotype 330 HG "Lysine" 185 +biotype 331 CD "Lysine" 186 +biotype 332 HD "Lysine" 187 +biotype 333 CE "Lysine" 188 +biotype 334 HE "Lysine" 189 +biotype 335 NZ "Lysine" 190 +biotype 336 HZ "Lysine" 191 +biotype 337 N "Lysine (NH2)" 7 +biotype 338 CA "Lysine (NH2)" 8 +biotype 339 C "Lysine (NH2)" 9 +biotype 340 HN "Lysine (NH2)" 10 +biotype 341 O "Lysine (NH2)" 11 +biotype 342 HA "Lysine (NH2)" 12 +biotype 343 CB "Lysine (NH2)" 192 +biotype 344 HB "Lysine (NH2)" 193 +biotype 345 CG "Lysine (NH2)" 194 +biotype 346 HG "Lysine (NH2)" 195 +biotype 347 CD "Lysine (NH2)" 196 +biotype 348 HD "Lysine (NH2)" 197 +biotype 349 CE "Lysine (NH2)" 198 +biotype 350 HE "Lysine (NH2)" 199 +biotype 351 NZ "Lysine (NH2)" 200 +biotype 352 HZ "Lysine (NH2)" 201 +biotype 353 N "Arginine" 7 +biotype 354 CA "Arginine" 8 +biotype 355 C "Arginine" 9 +biotype 356 HN "Arginine" 10 +biotype 357 O "Arginine" 11 +biotype 358 HA "Arginine" 12 +biotype 359 CB "Arginine" 202 +biotype 360 HB "Arginine" 203 +biotype 361 CG "Arginine" 204 +biotype 362 HG "Arginine" 205 +biotype 363 CD "Arginine" 206 +biotype 364 HD "Arginine" 207 +biotype 365 NE "Arginine" 208 +biotype 366 HE "Arginine" 209 +biotype 367 CZ "Arginine" 210 +biotype 368 NH "Arginine" 211 +biotype 369 HH "Arginine" 212 +biotype 370 N "Ornithine" 7 +biotype 371 CA "Ornithine" 8 +biotype 372 C "Ornithine" 9 +biotype 373 HN "Ornithine" 10 +biotype 374 O "Ornithine" 11 +biotype 375 HA "Ornithine" 12 +biotype 376 CB "Ornithine" 213 +biotype 377 HB "Ornithine" 214 +biotype 378 CG "Ornithine" 215 +biotype 379 HG "Ornithine" 216 +biotype 380 CD "Ornithine" 217 +biotype 381 HD "Ornithine" 218 +biotype 382 NE "Ornithine" 219 +biotype 383 HE "Ornithine" 220 +biotype 384 N "MethylAlanine (AIB)" -1 +biotype 385 CA "MethylAlanine (AIB)" -1 +biotype 386 C "MethylAlanine (AIB)" -1 +biotype 387 HN "MethylAlanine (AIB)" -1 +biotype 388 O "MethylAlanine (AIB)" -1 +biotype 389 CB "MethylAlanine (AIB)" -1 +biotype 390 HB "MethylAlanine (AIB)" -1 +biotype 391 N "Pyroglutamic Acid" -1 +biotype 392 CA "Pyroglutamic Acid" -1 +biotype 393 C "Pyroglutamic Acid" -1 +biotype 394 HN "Pyroglutamic Acid" -1 +biotype 395 O "Pyroglutamic Acid" -1 +biotype 396 HA "Pyroglutamic Acid" -1 +biotype 397 CB "Pyroglutamic Acid" -1 +biotype 398 HB "Pyroglutamic Acid" -1 +biotype 399 CG "Pyroglutamic Acid" -1 +biotype 400 HG "Pyroglutamic Acid" -1 +biotype 401 CD "Pyroglutamic Acid" -1 +biotype 402 OE "Pyroglutamic Acid" -1 +biotype 403 N "N-Terminal GLY" 231 +biotype 404 CA "N-Terminal GLY" 2 +biotype 405 C "N-Terminal GLY" 3 +biotype 406 HN "N-Terminal GLY" 232 +biotype 407 O "N-Terminal GLY" 5 +biotype 408 HA "N-Terminal GLY" 6 +biotype 409 N "N-Terminal ALA" 231 +biotype 410 CA "N-Terminal ALA" 8 +biotype 411 C "N-Terminal ALA" 9 +biotype 412 HN "N-Terminal ALA" 232 +biotype 413 O "N-Terminal ALA" 11 +biotype 414 HA "N-Terminal ALA" 12 +biotype 415 N "N-Terminal VAL" 231 +biotype 416 CA "N-Terminal VAL" 8 +biotype 417 C "N-Terminal VAL" 9 +biotype 418 HN "N-Terminal VAL" 232 +biotype 419 O "N-Terminal VAL" 11 +biotype 420 HA "N-Terminal VAL" 12 +biotype 421 N "N-Terminal LEU" 231 +biotype 422 CA "N-Terminal LEU" 8 +biotype 423 C "N-Terminal LEU" 9 +biotype 424 HN "N-Terminal LEU" 232 +biotype 425 O "N-Terminal LEU" 11 +biotype 426 HA "N-Terminal LEU" 12 +biotype 427 N "N-Terminal ILE" 231 +biotype 428 CA "N-Terminal ILE" 8 +biotype 429 C "N-Terminal ILE" 9 +biotype 430 HN "N-Terminal ILE" 232 +biotype 431 O "N-Terminal ILE" 11 +biotype 432 HA "N-Terminal ILE" 12 +biotype 433 N "N-Terminal SER" 231 +biotype 434 CA "N-Terminal SER" 8 +biotype 435 C "N-Terminal SER" 9 +biotype 436 HN "N-Terminal SER" 232 +biotype 437 O "N-Terminal SER" 11 +biotype 438 HA "N-Terminal SER" 12 +biotype 439 N "N-Terminal THR" 231 +biotype 440 CA "N-Terminal THR" 8 +biotype 441 C "N-Terminal THR" 9 +biotype 442 HN "N-Terminal THR" 232 +biotype 443 O "N-Terminal THR" 11 +biotype 444 HA "N-Terminal THR" 12 +biotype 445 N "N-Terminal CYS (SH)" 231 +biotype 446 CA "N-Terminal CYS (SH)" 8 +biotype 447 C "N-Terminal CYS (SH)" 9 +biotype 448 HN "N-Terminal CYS (SH)" 232 +biotype 449 O "N-Terminal CYS (SH)" 11 +biotype 450 HA "N-Terminal CYS (SH)" 12 +biotype 451 N "N-Terminal CYX (SS)" 231 +biotype 452 CA "N-Terminal CYX (SS)" 8 +biotype 453 C "N-Terminal CYX (SS)" 9 +biotype 454 HN "N-Terminal CYX (SS)" 232 +biotype 455 O "N-Terminal CYX (SS)" 11 +biotype 456 HA "N-Terminal CYX (SS)" 12 +biotype 457 N "N-Terminal CYD (S-)" 231 +biotype 458 CA "N-Terminal CYD (S-)" 48 +biotype 459 C "N-Terminal CYD (S-)" 9 +biotype 460 HN "N-Terminal CYD (S-)" 232 +biotype 461 O "N-Terminal CYD (S-)" 11 +biotype 462 HA "N-Terminal CYD (S-)" 12 +biotype 463 N "N-Terminal PRO" 239 +biotype 464 CA "N-Terminal PRO" 241 +biotype 465 C "N-Terminal PRO" 242 +biotype 466 HN "N-Terminal PRO" 240 +biotype 467 O "N-Terminal PRO" 243 +biotype 468 HA "N-Terminal PRO" 244 +biotype 469 CD "N-Terminal PRO" 245 +biotype 470 HD "N-Terminal PRO" 246 +biotype 471 N "N-Terminal PHE" 231 +biotype 472 CA "N-Terminal PHE" 8 +biotype 473 C "N-Terminal PHE" 9 +biotype 474 HN "N-Terminal PHE" 232 +biotype 475 O "N-Terminal PHE" 11 +biotype 476 HA "N-Terminal PHE" 12 +biotype 477 N "N-Terminal TYR" 231 +biotype 478 CA "N-Terminal TYR" 8 +biotype 479 C "N-Terminal TYR" 9 +biotype 480 HN "N-Terminal TYR" 232 +biotype 481 O "N-Terminal TYR" 11 +biotype 482 HA "N-Terminal TYR" 12 +biotype 483 N "N-Terminal TYD (O-)" 231 +biotype 484 CA "N-Terminal TYD (O-)" 8 +biotype 485 C "N-Terminal TYD (O-)" 9 +biotype 486 HN "N-Terminal TYD (O-)" 232 +biotype 487 O "N-Terminal TYD (O-)" 11 +biotype 488 HA "N-Terminal TYD (O-)" 12 +biotype 489 N "N-Terminal TRP" 231 +biotype 490 CA "N-Terminal TRP" 8 +biotype 491 C "N-Terminal TRP" 9 +biotype 492 HN "N-Terminal TRP" 232 +biotype 493 O "N-Terminal TRP" 11 +biotype 494 HA "N-Terminal TRP" 12 +biotype 495 N "N-Terminal HIS (+)" 231 +biotype 496 CA "N-Terminal HIS (+)" 8 +biotype 497 C "N-Terminal HIS (+)" 9 +biotype 498 HN "N-Terminal HIS (+)" 232 +biotype 499 O "N-Terminal HIS (+)" 11 +biotype 500 HA "N-Terminal HIS (+)" 12 +biotype 501 N "N-Terminal HIS (HD)" 231 +biotype 502 CA "N-Terminal HIS (HD)" 8 +biotype 503 C "N-Terminal HIS (HD)" 9 +biotype 504 HN "N-Terminal HIS (HD)" 232 +biotype 505 O "N-Terminal HIS (HD)" 11 +biotype 506 HA "N-Terminal HIS (HD)" 12 +biotype 507 N "N-Terminal HIS (HE)" 231 +biotype 508 CA "N-Terminal HIS (HE)" 8 +biotype 509 C "N-Terminal HIS (HE)" 9 +biotype 510 HN "N-Terminal HIS (HE)" 232 +biotype 511 O "N-Terminal HIS (HE)" 11 +biotype 512 HA "N-Terminal HIS (HE)" 12 +biotype 513 N "N-Terminal ASP" 231 +biotype 514 CA "N-Terminal ASP" 8 +biotype 515 C "N-Terminal ASP" 9 +biotype 516 HN "N-Terminal ASP" 232 +biotype 517 O "N-Terminal ASP" 11 +biotype 518 HA "N-Terminal ASP" 12 +biotype 519 N "N-Terminal ASH (COOH)" 231 +biotype 520 CA "N-Terminal ASH (COOH)" 8 +biotype 521 C "N-Terminal ASH (COOH)" 9 +biotype 522 HN "N-Terminal ASH (COOH)" 232 +biotype 523 O "N-Terminal ASH (COOH)" 11 +biotype 524 HA "N-Terminal ASH (COOH)" 12 +biotype 525 N "N-Terminal ASN" 231 +biotype 526 CA "N-Terminal ASN" 8 +biotype 527 C "N-Terminal ASN" 9 +biotype 528 HN "N-Terminal ASN" 232 +biotype 529 O "N-Terminal ASN" 11 +biotype 530 HA "N-Terminal ASN" 12 +biotype 531 N "N-Terminal GLU" 231 +biotype 532 CA "N-Terminal GLU" 8 +biotype 533 C "N-Terminal GLU" 9 +biotype 534 HN "N-Terminal GLU" 232 +biotype 535 O "N-Terminal GLU" 11 +biotype 536 HA "N-Terminal GLU" 12 +biotype 537 N "N-Terminal GLH (COOH)" 231 +biotype 538 CA "N-Terminal GLH (COOH)" 8 +biotype 539 C "N-Terminal GLH (COOH)" 9 +biotype 540 HN "N-Terminal GLH (COOH)" 232 +biotype 541 O "N-Terminal GLH (COOH)" 11 +biotype 542 HA "N-Terminal GLH (COOH)" 12 +biotype 543 N "N-Terminal GLN" 231 +biotype 544 CA "N-Terminal GLN" 8 +biotype 545 C "N-Terminal GLN" 9 +biotype 546 HN "N-Terminal GLN" 232 +biotype 547 O "N-Terminal GLN" 11 +biotype 548 HA "N-Terminal GLN" 12 +biotype 549 N "N-Terminal MET" 231 +biotype 550 CA "N-Terminal MET" 8 +biotype 551 C "N-Terminal MET" 9 +biotype 552 HN "N-Terminal MET" 232 +biotype 553 O "N-Terminal MET" 11 +biotype 554 HA "N-Terminal MET" 12 +biotype 555 N "N-Terminal LYS" 231 +biotype 556 CA "N-Terminal LYS" 8 +biotype 557 C "N-Terminal LYS" 9 +biotype 558 HN "N-Terminal LYS" 232 +biotype 559 O "N-Terminal LYS" 11 +biotype 560 HA "N-Terminal LYS" 12 +biotype 561 N "N-Terminal LYD (NH2)" 231 +biotype 562 CA "N-Terminal LYD (NH2)" 8 +biotype 563 C "N-Terminal LYD (NH2)" 9 +biotype 564 HN "N-Terminal LYD (NH2)" 232 +biotype 565 O "N-Terminal LYD (NH2)" 11 +biotype 566 HA "N-Terminal LYD (NH2)" 12 +biotype 567 N "N-Terminal ARG" 231 +biotype 568 CA "N-Terminal ARG" 8 +biotype 569 C "N-Terminal ARG" 9 +biotype 570 HN "N-Terminal ARG" 232 +biotype 571 O "N-Terminal ARG" 11 +biotype 572 HA "N-Terminal ARG" 12 +biotype 573 N "N-Terminal ORN" 231 +biotype 574 CA "N-Terminal ORN" 8 +biotype 575 C "N-Terminal ORN" 9 +biotype 576 HN "N-Terminal ORN" 232 +biotype 577 O "N-Terminal ORN" 11 +biotype 578 HA "N-Terminal ORN" 12 +biotype 579 N "N-Terminal AIB" -1 +biotype 580 CA "N-Terminal AIB" -1 +biotype 581 C "N-Terminal AIB" -1 +biotype 582 HN "N-Terminal AIB" -1 +biotype 583 O "N-Terminal AIB" -1 +biotype 584 N "C-Terminal GLY" 1 +biotype 585 CA "C-Terminal GLY" 2 +biotype 586 C "C-Terminal GLY" 233 +biotype 587 HN "C-Terminal GLY" 4 +biotype 588 OXT "C-Terminal GLY" 234 +biotype 589 HA "C-Terminal GLY" 6 +biotype 590 N "C-Terminal ALA" 7 +biotype 591 CA "C-Terminal ALA" 8 +biotype 592 C "C-Terminal ALA" 233 +biotype 593 HN "C-Terminal ALA" 10 +biotype 594 OXT "C-Terminal ALA" 234 +biotype 595 HA "C-Terminal ALA" 12 +biotype 596 N "C-Terminal VAL" 7 +biotype 597 CA "C-Terminal VAL" 8 +biotype 598 C "C-Terminal VAL" 233 +biotype 599 HN "C-Terminal VAL" 10 +biotype 600 OXT "C-Terminal VAL" 234 +biotype 601 HA "C-Terminal VAL" 12 +biotype 602 N "C-Terminal LEU" 7 +biotype 603 CA "C-Terminal LEU" 8 +biotype 604 C "C-Terminal LEU" 233 +biotype 605 HN "C-Terminal LEU" 10 +biotype 606 OXT "C-Terminal LEU" 234 +biotype 607 HA "C-Terminal LEU" 12 +biotype 608 N "C-Terminal ILE" 7 +biotype 609 CA "C-Terminal ILE" 8 +biotype 610 C "C-Terminal ILE" 233 +biotype 611 HN "C-Terminal ILE" 10 +biotype 612 OXT "C-Terminal ILE" 234 +biotype 613 HA "C-Terminal ILE" 12 +biotype 614 N "C-Terminal SER" 7 +biotype 615 CA "C-Terminal SER" 8 +biotype 616 C "C-Terminal SER" 233 +biotype 617 HN "C-Terminal SER" 10 +biotype 618 OXT "C-Terminal SER" 234 +biotype 619 HA "C-Terminal SER" 12 +biotype 620 N "C-Terminal THR" 7 +biotype 621 CA "C-Terminal THR" 8 +biotype 622 C "C-Terminal THR" 233 +biotype 623 HN "C-Terminal THR" 10 +biotype 624 OXT "C-Terminal THR" 234 +biotype 625 HA "C-Terminal THR" 12 +biotype 626 N "C-Terminal CYS (SH)" 7 +biotype 627 CA "C-Terminal CYS (SH)" 8 +biotype 628 C "C-Terminal CYS (SH)" 233 +biotype 629 HN "C-Terminal CYS (SH)" 10 +biotype 630 OXT "C-Terminal CYS (SH)" 234 +biotype 631 HA "C-Terminal CYS (SH)" 12 +biotype 632 N "C-Terminal CYX (SS)" 7 +biotype 633 CA "C-Terminal CYX (SS)" 8 +biotype 634 C "C-Terminal CYX (SS)" 233 +biotype 635 HN "C-Terminal CYX (SS)" 10 +biotype 636 OXT "C-Terminal CYX (SS)" 234 +biotype 637 HA "C-Terminal CYX (SS)" 12 +biotype 638 N "C-Terminal CYD (S-)" 7 +biotype 639 CA "C-Terminal CYD (S-)" 48 +biotype 640 C "C-Terminal CYD (S-)" 233 +biotype 641 HN "C-Terminal CYD (S-)" 10 +biotype 642 OXT "C-Terminal CYD (S-)" 234 +biotype 643 HA "C-Terminal CYD (S-)" 12 +biotype 644 N "C-Terminal PRO" 50 +biotype 645 CA "C-Terminal PRO" 51 +biotype 646 C "C-Terminal PRO" 233 +biotype 647 OXT "C-Terminal PRO" 234 +biotype 648 HA "C-Terminal PRO" 54 +biotype 649 N "C-Terminal PHE" 7 +biotype 650 CA "C-Terminal PHE" 8 +biotype 651 C "C-Terminal PHE" 233 +biotype 652 HN "C-Terminal PHE" 10 +biotype 653 OXT "C-Terminal PHE" 234 +biotype 654 HA "C-Terminal PHE" 12 +biotype 655 N "C-Terminal TYR" 7 +biotype 656 CA "C-Terminal TYR" 8 +biotype 657 C "C-Terminal TYR" 233 +biotype 658 HN "C-Terminal TYR" 10 +biotype 659 OXT "C-Terminal TYR" 234 +biotype 660 HA "C-Terminal TYR" 12 +biotype 661 N "C-Terminal TYD (O-)" 7 +biotype 662 CA "C-Terminal TYD (O-)" 8 +biotype 663 C "C-Terminal TYD (O-)" 233 +biotype 664 HN "C-Terminal TYD (O-)" 10 +biotype 665 OXT "C-Terminal TYD (O-)" 234 +biotype 666 HA "C-Terminal TYD (O-)" 12 +biotype 667 N "C-Terminal TRP" 7 +biotype 668 CA "C-Terminal TRP" 8 +biotype 669 C "C-Terminal TRP" 233 +biotype 670 HN "C-Terminal TRP" 10 +biotype 671 OXT "C-Terminal TRP" 234 +biotype 672 HA "C-Terminal TRP" 12 +biotype 673 N "C-Terminal HIS (+)" 7 +biotype 674 CA "C-Terminal HIS (+)" 8 +biotype 675 C "C-Terminal HIS (+)" 233 +biotype 676 HN "C-Terminal HIS (+)" 10 +biotype 677 OXT "C-Terminal HIS (+)" 234 +biotype 678 HA "C-Terminal HIS (+)" 12 +biotype 679 N "C-Terminal HIS (HD)" 7 +biotype 680 CA "C-Terminal HIS (HD)" 8 +biotype 681 C "C-Terminal HIS (HD)" 233 +biotype 682 HN "C-Terminal HIS (HD)" 10 +biotype 683 OXT "C-Terminal HIS (HD)" 234 +biotype 684 HA "C-Terminal HIS (HD)" 12 +biotype 685 N "C-Terminal HIS (HE)" 7 +biotype 686 CA "C-Terminal HIS (HE)" 8 +biotype 687 C "C-Terminal HIS (HE)" 233 +biotype 688 HN "C-Terminal HIS (HE)" 10 +biotype 689 OXT "C-Terminal HIS (HE)" 234 +biotype 690 HA "C-Terminal HIS (HE)" 12 +biotype 691 N "C-Terminal ASP" 7 +biotype 692 CA "C-Terminal ASP" 8 +biotype 693 C "C-Terminal ASP" 233 +biotype 694 HN "C-Terminal ASP" 10 +biotype 695 OXT "C-Terminal ASP" 234 +biotype 696 HA "C-Terminal ASP" 12 +biotype 697 N "C-Terminal ASH (COOH)" 7 +biotype 698 CA "C-Terminal ASH (COOH)" 8 +biotype 699 C "C-Terminal ASH (COOH)" 233 +biotype 700 HN "C-Terminal ASH (COOH)" 10 +biotype 701 OXT "C-Terminal ASH (COOH)" 234 +biotype 702 HA "C-Terminal ASH (COOH)" 12 +biotype 703 N "C-Terminal ASN" 7 +biotype 704 CA "C-Terminal ASN" 8 +biotype 705 C "C-Terminal ASN" 233 +biotype 706 HN "C-Terminal ASN" 10 +biotype 707 OXT "C-Terminal ASN" 234 +biotype 708 HA "C-Terminal ASN" 12 +biotype 709 N "C-Terminal GLU" 7 +biotype 710 CA "C-Terminal GLU" 8 +biotype 711 C "C-Terminal GLU" 233 +biotype 712 HN "C-Terminal GLU" 10 +biotype 713 OXT "C-Terminal GLU" 234 +biotype 714 HA "C-Terminal GLU" 12 +biotype 715 N "C-Terminal GLH (COOH)" 7 +biotype 716 CA "C-Terminal GLH (COOH)" 8 +biotype 717 C "C-Terminal GLH (COOH)" 233 +biotype 718 HN "C-Terminal GLH (COOH)" 10 +biotype 719 OXT "C-Terminal GLH (COOH)" 234 +biotype 720 HA "C-Terminal GLH (COOH)" 12 +biotype 721 N "C-Terminal GLN" 7 +biotype 722 CA "C-Terminal GLN" 8 +biotype 723 C "C-Terminal GLN" 233 +biotype 724 HN "C-Terminal GLN" 10 +biotype 725 OXT "C-Terminal GLN" 234 +biotype 726 HA "C-Terminal GLN" 12 +biotype 727 N "C-Terminal MET" 7 +biotype 728 CA "C-Terminal MET" 8 +biotype 729 C "C-Terminal MET" 233 +biotype 730 HN "C-Terminal MET" 10 +biotype 731 OXT "C-Terminal MET" 234 +biotype 732 HA "C-Terminal MET" 12 +biotype 733 N "C-Terminal LYS" 7 +biotype 734 CA "C-Terminal LYS" 8 +biotype 735 C "C-Terminal LYS" 233 +biotype 736 HN "C-Terminal LYS" 10 +biotype 737 OXT "C-Terminal LYS" 234 +biotype 738 HA "C-Terminal LYS" 12 +biotype 739 N "C-Terminal LYD (NH2)" 7 +biotype 740 CA "C-Terminal LYD (NH2)" 8 +biotype 741 C "C-Terminal LYD (NH2)" 233 +biotype 742 HN "C-Terminal LYD (NH2)" 10 +biotype 743 OXT "C-Terminal LYD (NH2)" 234 +biotype 744 HA "C-Terminal LYD (NH2)" 12 +biotype 745 N "C-Terminal ARG" 7 +biotype 746 CA "C-Terminal ARG" 8 +biotype 747 C "C-Terminal ARG" 233 +biotype 748 HN "C-Terminal ARG" 10 +biotype 749 OXT "C-Terminal ARG" 234 +biotype 750 HA "C-Terminal ARG" 12 +biotype 751 N "C-Terminal ORN" 7 +biotype 752 CA "C-Terminal ORN" 8 +biotype 753 C "C-Terminal ORN" 233 +biotype 754 HN "C-Terminal ORN" 10 +biotype 755 OXT "C-Terminal ORN" 234 +biotype 756 HA "C-Terminal ORN" 12 +biotype 757 N "C-Terminal AIB" -1 +biotype 758 CA "C-Terminal AIB" -1 +biotype 759 C "C-Terminal AIB" -1 +biotype 760 HN "C-Terminal AIB" -1 +biotype 761 OXT "C-Terminal AIB" -1 +biotype 762 N "Deprotonated N-Terminus" -1 +biotype 763 H "Deprotonated N-Terminus" -1 +biotype 764 C "Formyl N-Terminus" -1 +biotype 765 H "Formyl N-Terminus" -1 +biotype 766 O "Formyl N-Terminus" -1 +biotype 767 CH3 "Acetyl N-Terminus" 221 +biotype 768 H "Acetyl N-Terminus" 222 +biotype 769 C "Acetyl N-Terminus" 223 +biotype 770 O "Acetyl N-Terminus" 224 +biotype 771 C "Protonated C-Terminus" 235 +biotype 772 O "Protonated C-Terminus" 236 +biotype 773 OH "Protonated C-Terminus" 237 +biotype 774 HO "Protonated C-Terminus" 238 +biotype 775 N "Amide C-Terminus" 225 +biotype 776 HN "Amide C-Terminus" 226 +biotype 777 N "N-MeAmide C-Terminus" 227 +biotype 778 HN "N-MeAmide C-Terminus" 228 +biotype 779 CH3 "N-MeAmide C-Terminus" 229 +biotype 780 H "N-MeAmide C-Terminus" 230 +biotype 1001 O5* "Adenosine" 326 +biotype 1002 C5* "Adenosine" 324 +biotype 1003 H5* "Adenosine" 325 +biotype 1004 H5* "Adenosine" 325 +biotype 1005 C4* "Adenosine" 312 +biotype 1006 H4* "Adenosine" 313 +biotype 1007 O4* "Adenosine" 311 +biotype 1008 C1* "Adenosine" 314 +biotype 1009 H1* "Adenosine" 315 +biotype 1010 C3* "Adenosine" 318 +biotype 1011 H3* "Adenosine" 319 +biotype 1012 C2* "Adenosine" 316 +biotype 1013 H2* "Adenosine" 317 +biotype 1014 O2* "Adenosine" 320 +biotype 1015 HO* "Adenosine" 321 +biotype 1016 O3* "Adenosine" 322 +biotype 1017 N9 "Adenosine" 251 +biotype 1018 C4 "Adenosine" 247 +biotype 1019 C5 "Adenosine" 250 +biotype 1020 N7 "Adenosine" 255 +biotype 1021 C8 "Adenosine" 248 +biotype 1022 N3 "Adenosine" 256 +biotype 1023 C2 "Adenosine" 254 +biotype 1024 N1 "Adenosine" 257 +biotype 1025 C6 "Adenosine" 249 +biotype 1026 H2 "Adenosine" 259 +biotype 1027 N6 "Adenosine" 253 +biotype 1028 H61 "Adenosine" 260 +biotype 1029 H62 "Adenosine" 260 +biotype 1030 H8 "Adenosine" 258 +biotype 1031 O5* "Guanosine" 326 +biotype 1032 C5* "Guanosine" 324 +biotype 1033 H5* "Guanosine" 325 +biotype 1034 H5* "Guanosine" 325 +biotype 1035 C4* "Guanosine" 312 +biotype 1036 H4* "Guanosine" 313 +biotype 1037 O4* "Guanosine" 311 +biotype 1038 C1* "Guanosine" 314 +biotype 1039 H1* "Guanosine" 315 +biotype 1040 C3* "Guanosine" 318 +biotype 1041 H3* "Guanosine" 319 +biotype 1042 C2* "Guanosine" 316 +biotype 1043 H2* "Guanosine" 317 +biotype 1044 O2* "Guanosine" 320 +biotype 1045 HO* "Guanosine" 321 +biotype 1046 O3* "Guanosine" 322 +biotype 1047 N9 "Guanosine" 280 +biotype 1048 C4 "Guanosine" 275 +biotype 1049 C5 "Guanosine" 279 +biotype 1050 N7 "Guanosine" 282 +biotype 1051 C8 "Guanosine" 276 +biotype 1052 N3 "Guanosine" 283 +biotype 1053 C2 "Guanosine" 273 +biotype 1054 N1 "Guanosine" 277 +biotype 1055 C6 "Guanosine" 274 +biotype 1056 H1 "Guanosine" 284 +biotype 1057 N2 "Guanosine" 278 +biotype 1058 H21 "Guanosine" 287 +biotype 1059 H22 "Guanosine" 287 +biotype 1060 O6 "Guanosine" 285 +biotype 1061 H8 "Guanosine" 286 +biotype 1062 O5* "Cytidine" 326 +biotype 1063 C5* "Cytidine" 324 +biotype 1064 H5* "Cytidine" 325 +biotype 1065 H5* "Cytidine" 325 +biotype 1066 C4* "Cytidine" 312 +biotype 1067 H4* "Cytidine" 313 +biotype 1068 O4* "Cytidine" 311 +biotype 1069 C1* "Cytidine" 314 +biotype 1070 H1* "Cytidine" 315 +biotype 1071 C3* "Cytidine" 318 +biotype 1072 H3* "Cytidine" 319 +biotype 1073 C2* "Cytidine" 316 +biotype 1074 H2* "Cytidine" 317 +biotype 1075 O2* "Cytidine" 320 +biotype 1076 HO* "Cytidine" 321 +biotype 1077 O3* "Cytidine" 322 +biotype 1078 N1 "Cytidine" 261 +biotype 1079 C2 "Cytidine" 266 +biotype 1080 N3 "Cytidine" 268 +biotype 1081 C4 "Cytidine" 267 +biotype 1082 C5 "Cytidine" 263 +biotype 1083 C6 "Cytidine" 265 +biotype 1084 O2 "Cytidine" 270 +biotype 1085 N4 "Cytidine" 264 +biotype 1086 H41 "Cytidine" 272 +biotype 1087 H42 "Cytidine" 272 +biotype 1088 H5 "Cytidine" 269 +biotype 1089 H6 "Cytidine" 271 +biotype 1090 O5* "Uridine" 326 +biotype 1091 C5* "Uridine" 324 +biotype 1092 H5* "Uridine" 325 +biotype 1093 H5* "Uridine" 325 +biotype 1094 C4* "Uridine" 312 +biotype 1095 H4* "Uridine" 313 +biotype 1096 O4* "Uridine" 311 +biotype 1097 C1* "Uridine" 314 +biotype 1098 H1* "Uridine" 315 +biotype 1099 C3* "Uridine" 318 +biotype 1100 H3* "Uridine" 319 +biotype 1101 C2* "Uridine" 316 +biotype 1102 H2* "Uridine" 317 +biotype 1103 O2* "Uridine" 320 +biotype 1104 HO* "Uridine" 321 +biotype 1105 O3* "Uridine" 322 +biotype 1106 N1 "Uridine" 304 +biotype 1107 C2 "Uridine" 300 +biotype 1108 N3 "Uridine" 303 +biotype 1109 C4 "Uridine" 302 +biotype 1110 C5 "Uridine" 305 +biotype 1111 C6 "Uridine" 301 +biotype 1112 O2 "Uridine" 308 +biotype 1113 H3 "Uridine" 306 +biotype 1114 O4 "Uridine" 309 +biotype 1115 H5 "Uridine" 307 +biotype 1116 H6 "Uridine" 310 +biotype 1117 O5* "Deoxyadenosine" 341 +biotype 1118 C5* "Deoxyadenosine" 337 +biotype 1119 H5* "Deoxyadenosine" 340 +biotype 1120 H5* "Deoxyadenosine" 340 +biotype 1121 C4* "Deoxyadenosine" 328 +biotype 1122 H4* "Deoxyadenosine" 336 +biotype 1123 O4* "Deoxyadenosine" 332 +biotype 1124 C1* "Deoxyadenosine" 331 +biotype 1125 H1* "Deoxyadenosine" 334 +biotype 1126 C3* "Deoxyadenosine" 329 +biotype 1127 H3* "Deoxyadenosine" 335 +biotype 1128 C2* "Deoxyadenosine" 330 +biotype 1129 H2* "Deoxyadenosine" 333 +biotype 1130 H2* "Deoxyadenosine" 333 +biotype 1131 O3* "Deoxyadenosine" 338 +biotype 1132 N9 "Deoxyadenosine" 252 +biotype 1133 C4 "Deoxyadenosine" 247 +biotype 1134 C5 "Deoxyadenosine" 250 +biotype 1135 N7 "Deoxyadenosine" 255 +biotype 1136 C8 "Deoxyadenosine" 248 +biotype 1137 N3 "Deoxyadenosine" 256 +biotype 1138 C2 "Deoxyadenosine" 254 +biotype 1139 N1 "Deoxyadenosine" 257 +biotype 1140 C6 "Deoxyadenosine" 249 +biotype 1141 H2 "Deoxyadenosine" 259 +biotype 1142 N6 "Deoxyadenosine" 253 +biotype 1143 H61 "Deoxyadenosine" 260 +biotype 1144 H62 "Deoxyadenosine" 260 +biotype 1145 H8 "Deoxyadenosine" 258 +biotype 1146 O5* "Deoxyguanosine" 341 +biotype 1147 C5* "Deoxyguanosine" 337 +biotype 1148 H5* "Deoxyguanosine" 340 +biotype 1149 H5* "Deoxyguanosine" 340 +biotype 1150 C4* "Deoxyguanosine" 328 +biotype 1151 H4* "Deoxyguanosine" 336 +biotype 1152 O4* "Deoxyguanosine" 332 +biotype 1153 C1* "Deoxyguanosine" 331 +biotype 1154 H1* "Deoxyguanosine" 334 +biotype 1155 C3* "Deoxyguanosine" 329 +biotype 1156 H3* "Deoxyguanosine" 335 +biotype 1157 C2* "Deoxyguanosine" 330 +biotype 1158 H2* "Deoxyguanosine" 333 +biotype 1159 H2* "Deoxyguanosine" 333 +biotype 1160 O3* "Deoxyguanosine" 338 +biotype 1161 N9 "Deoxyguanosine" 281 +biotype 1162 C4 "Deoxyguanosine" 275 +biotype 1163 C5 "Deoxyguanosine" 279 +biotype 1164 N7 "Deoxyguanosine" 282 +biotype 1165 C8 "Deoxyguanosine" 276 +biotype 1166 N3 "Deoxyguanosine" 283 +biotype 1167 C2 "Deoxyguanosine" 273 +biotype 1168 N1 "Deoxyguanosine" 277 +biotype 1169 C6 "Deoxyguanosine" 274 +biotype 1170 H1 "Deoxyguanosine" 284 +biotype 1171 N2 "Deoxyguanosine" 278 +biotype 1172 H21 "Deoxyguanosine" 287 +biotype 1173 H22 "Deoxyguanosine" 287 +biotype 1174 O6 "Deoxyguanosine" 285 +biotype 1175 H8 "Deoxyguanosine" 286 +biotype 1176 O5* "Deoxycytidine" 341 +biotype 1177 C5* "Deoxycytidine" 337 +biotype 1178 H5* "Deoxycytidine" 340 +biotype 1179 H5* "Deoxycytidine" 340 +biotype 1180 C4* "Deoxycytidine" 328 +biotype 1181 H4* "Deoxycytidine" 336 +biotype 1182 O4* "Deoxycytidine" 332 +biotype 1183 C1* "Deoxycytidine" 331 +biotype 1184 H1* "Deoxycytidine" 334 +biotype 1185 C3* "Deoxycytidine" 329 +biotype 1186 H3* "Deoxycytidine" 335 +biotype 1187 C2* "Deoxycytidine" 330 +biotype 1188 H2* "Deoxycytidine" 333 +biotype 1189 H2* "Deoxycytidine" 333 +biotype 1190 O3* "Deoxycytidine" 338 +biotype 1191 N1 "Deoxycytidine" 262 +biotype 1192 C2 "Deoxycytidine" 266 +biotype 1193 N3 "Deoxycytidine" 268 +biotype 1194 C4 "Deoxycytidine" 267 +biotype 1195 C5 "Deoxycytidine" 263 +biotype 1196 C6 "Deoxycytidine" 265 +biotype 1197 O2 "Deoxycytidine" 270 +biotype 1198 N4 "Deoxycytidine" 264 +biotype 1199 H41 "Deoxycytidine" 272 +biotype 1200 H42 "Deoxycytidine" 272 +biotype 1201 H5 "Deoxycytidine" 269 +biotype 1202 H6 "Deoxycytidine" 271 +biotype 1203 O5* "Deoxythymidine" 341 +biotype 1204 C5* "Deoxythymidine" 337 +biotype 1205 H5* "Deoxythymidine" 340 +biotype 1206 H5* "Deoxythymidine" 340 +biotype 1207 C4* "Deoxythymidine" 328 +biotype 1208 H4* "Deoxythymidine" 336 +biotype 1209 O4* "Deoxythymidine" 332 +biotype 1210 C1* "Deoxythymidine" 331 +biotype 1211 H1* "Deoxythymidine" 334 +biotype 1212 C3* "Deoxythymidine" 329 +biotype 1213 H3* "Deoxythymidine" 335 +biotype 1214 C2* "Deoxythymidine" 330 +biotype 1215 H2* "Deoxythymidine" 333 +biotype 1216 H2* "Deoxythymidine" 333 +biotype 1217 O3* "Deoxythymidine" 338 +biotype 1218 N1 "Deoxythymidine" 292 +biotype 1219 C2 "Deoxythymidine" 294 +biotype 1220 N3 "Deoxythymidine" 293 +biotype 1221 C4 "Deoxythymidine" 290 +biotype 1222 C5 "Deoxythymidine" 289 +biotype 1223 C6 "Deoxythymidine" 291 +biotype 1224 O2 "Deoxythymidine" 296 +biotype 1225 H3 "Deoxythymidine" 299 +biotype 1226 O4 "Deoxythymidine" 298 +biotype 1227 C7 "Deoxythymidine" 288 +biotype 1228 H7 "Deoxythymidine" 295 +biotype 1229 H6 "Deoxythymidine" 297 +biotype 1230 P "Phosphodiester RNA" 343 +biotype 1231 OP "Phosphodiester RNA" 344 +biotype 1232 O5* "5'-Hydroxyl RNA" 345 +biotype 1233 H5T "5'-Hydroxyl RNA" 327 +biotype 1234 O5* "5'-Monophosphate OS RNA" -1 +biotype 1235 P "5'-Monophosphate P RNA" -1 +biotype 1236 OP "5'-Monophosphate OP RNA" -1 +biotype 1237 O3* "3'-Hydroxyl RNA" 346 +biotype 1238 H3T "3'-Hydroxyl RNA" 323 +biotype 1239 O3* "3'-Monophosphate OS RNA" -1 +biotype 1240 P "3'-Monophosphate P RNA" -1 +biotype 1241 OP "3'-Monophosphate OP RNA" -1 +biotype 1242 P "Phosphodiester DNA" 343 +biotype 1243 OP "Phosphodiester DNA" 344 +biotype 1244 O5* "5'-Hydroxyl DNA" 348 +biotype 1245 H5T "5'-Hydroxyl DNA" 342 +biotype 1246 O5* "5'-Monophosphate OS DNA" -1 +biotype 1247 P "5'-Monophosphate P DNA" -1 +biotype 1248 OP "5'-Monophosphate OP DNA" -1 +biotype 1249 O3* "3'-Hydroxyl DNA" 347 +biotype 1250 H3T "3'-Hydroxyl DNA" 339 +biotype 1251 O3* "3'-Monophosphate OS DNA" -1 +biotype 1252 P "3'-Monophosphate P DNA" -1 +biotype 1253 OP "3'-Monophosphate OP DNA" -1 +biotype 2001 O "Water" 349 +biotype 2002 H "Water" 350 +biotype 2003 LI "Lithium Ion" 351 +biotype 2004 NA "Sodium Ion" 352 +biotype 2005 K "Potassium Ion" 353 +biotype 2006 RB "Rubidium Ion" 354 +biotype 2007 CS "Cesium Ion" 355 +biotype 2008 MG "Magnesium Ion" 357 +biotype 2009 CA "Calcium Ion" 358 +biotype 2012 F "Fluoride Ion" 360 +biotype 2013 CL "Chloride Ion" 361 +biotype 2014 BR "Bromide Ion" 362 +biotype 2015 I "Iodide Ion" 363 diff --git a/tools/PoltypeInterface/data.csv b/tools/PoltypeInterface/data.csv new file mode 100644 index 000000000..c6bbd9b3a --- /dev/null +++ b/tools/PoltypeInterface/data.csv @@ -0,0 +1,30 @@ +Global,eps0_denom,1 +Global,cp_denom,1 +Global,kappa_denom,1 +Global,alpha_denom,1 +Global,surf_ten_denom,1 +Global,rho_denom,1 +Global,hvap_denom,1 + +# Name,Water +# Ref,Unknown +# 295.16,1 atm +# Cp_err,Surf_Ten_err,Rho_err +# 0,0,0 + +# Name,Water +# Ref,Unknown +# 273.16,1 atm +# Cp_err,Surf_Ten_err,Rho_err +# 0,0,0 + +# Name,Water +# Ref,Unknown +# 305.16,1 atm +# Cp_err,Surf_Ten_err,Rho_err +# 0,0,0 + +T,P,Cp,Cp_wt,Surf_Ten,Surf_Ten_wt,Rho,Rho_wt +295.16,1 atm,0.075359,1,5.246249761,1,997.73,1 +273.16,1 atm,0.076023,1,5.722317316000001,1,999.79,1 +305.16,1 atm,0.075299,1,5.023549128999999,1,994.98,1 diff --git a/tools/PoltypeInterface/forcebalancepoltypeinterface.py b/tools/PoltypeInterface/forcebalancepoltypeinterface.py new file mode 100644 index 000000000..829a1af5d --- /dev/null +++ b/tools/PoltypeInterface/forcebalancepoltypeinterface.py @@ -0,0 +1,1445 @@ +import os, numpy as np +import pyilt2 +import sys +import cirpy +import pint +from pint import UnitRegistry +import csv +import getopt +from tqdm import tqdm +import shutil +import openbabel +from rdkit.Chem import rdmolfiles +from rdkit.Chem import Descriptors +import itertools +from bs4 import BeautifulSoup # for parsing NIST +import requests +import re +import pandas as pd +import numpy as np +from rdkit import Chem +import subprocess + + +smiles=None +truename=None +printnames=False +searchILDB=False # search NIST by default +poltypepath=None +rep='names' +roomtemp=295.5 +lowertol=10 +uppertol=10 +vdwtypes=None +liquid_equ_steps=10000 +liquid_prod_steps=100000 +liquid_timestep=1.0 +liquid_interval=0.1 +gas_equ_steps=500000 +gas_prod_steps=1000000 +gas_timestep=1.0 +gas_interval=0.1 +md_threads=4 +liquid_prod_time=.1 #ns +gas_prod_time=1 #ns +nvtprops=False # NPT for most props, surface tension requires NVT and force balance complains +addwaterprms=True +skipNIST=False +density=1000 # default water density + +opts, xargs = getopt.getopt(sys.argv[1:],'',["smiles=","truename=",'printnames','searchILDB','poltypepath=','vdwtypes=','liquid_equ_steps=','liquid_prod_steps=','liquid_timestep=','liquid_interval=','gas_equ_steps=','gas_prod_steps=','gas_timestep=','gas_interval=','md_threads=','liquid_prod_time=','gas_prod_time=','nvtpros=','skipNIST','density=']) +for o, a in opts: + if o in ("--smiles"): + smiles=a + elif o in ("--truename"): + truename=a.capitalize() # the database has first letter capitalized + elif o in ("--printnames"): + printnames=True + elif o in ("--searchILDB"): + searchILDB=False + elif o in ("--poltypepath"): + poltypepath=a + elif o in ("--vdwtypes"): + vdwtypes=a.split(',') + vdwtypes=[i.lstrip().rstrip() for i in vdwtypes] + elif o in ("--liquid_equ_steps"): + liquid_equ_steps=int(a) + elif o in ('--liquid_prod_steps'): + liquid_prod_steps=int(a) + elif o in ('--liquid_timestep'): + liquid_timestep=int(a) + elif o in ('--liquid_interval'): + liquid_interval=float(a) + elif o in ('--gas_equ_steps'): + gas_equ_steps=int(a) + elif o in ('--gas_prod_steps'): + gas_prod_steps=int(a) + elif o in ('--gas_timestep'): + gas_timestep=float(a) + elif o in ('--gas_interval'): + gas_interval=float(a) + elif o in ('--md_threads'): + md_threads=int(a) + elif o in ('--liquid_prod_time'): + liquid_prod_time=float(a) + elif o in ('--gas_prod_time'): + gas_prod_time=float(a) + elif o in ('--nvtprops'): + nvtprops=True + elif o in ('--skipNIST'): + skipNIST=True + elif o in ('--density'): + density=float(a) + + +gas_prod_steps=int(1000000*gas_prod_time/gas_timestep) +liquid_prod_steps=int(1000000*liquid_prod_time/liquid_timestep) + +# originally taken from https://github.com/sabidhasan/NistPy +# modified to take inputs for force balance +class NistCompoundById(object): + '''This class creates a NIST compound using a provided NIST code. + NIST identifying codes consist of a letter followed by several numbers''' + + #A search result is NistResult object. It's instantiated is False. This is for user + #to see whether the object has been instantaited in a friendly manner. Really you can + #just do type(object); if it's NistCpdById then it is instantiated; if NistResult, it's not. + INSTANTIATED = True + + @staticmethod + def extract_CAS(cas_string): + '''Extracts a CAS number using RegEx from a given string cas_string''' + reg = re.search(r'\d{2,7}-\d{2}-\d', cas_string) + if reg: + return reg.group(0) + return None + + def __init__(self, id, souped_page=None): + if souped_page==None: + cpd_url = "http://webbook.nist.gov/cgi/cbook.cgi?ID=%s" % id + cpd_soup = download_page(cpd_url) + + if cpd_soup is None: + #download failed + return None + else: + #we are given a souped page already! + cpd_soup = souped_page + + #check for erroneous number + if "Registry Number Not Found" in cpd_soup: + print("" % id) + return None + + #Set compound name + self.name = cpd_soup.find('h1').text + self.id = id + + + + def __str__(self): + return 'Compound %s' % self.name + + def __repr__(self): + return "NistCompoundById('%s')" % self.id + + def _get_fluid_data(self,cid,temp,plow=0,phigh=2,pinc=.01,table=0): + + url='https://webbook.nist.gov/cgi/fluid.cgi?Action=Load&ID='+str(cid)+'&Type=IsoTherm&Digits=5&PLow='+str(plow)+'&PHigh='+str(phigh)+'&PInc='+str(pinc)+'&T='+str(temp)+'&RefState=DEF&TUnit=K&PUnit=atm&DUnit=kg%2Fm3&HUnit=kJ%2Fmol&WUnit=m%2Fs&VisUnit=uPa*s&STUnit=N%2Fm' + prop_soup = download_page(url) + prop_table = prop_soup.find_all("table")[table].find_all('tr') + table=[] + for row in prop_table: + subrow=[] + if len(row.find_all('td')) > 0: + for j in range(14): + subrow.append(row.find_all('td')[j].text) + elif len(row.find_all('th')) > 0: + for j in range(14): + subrow.append(row.find_all('th')[j].text) + table.append(subrow) + + return np.array(table) + + def _get_fluid_Saturation_data(self,cid,tlow=50,thigh=350,tinc=1,table=0): # for surface tension + url='https://webbook.nist.gov/cgi/fluid.cgi?Action=Load&ID='+str(cid)+'&Type=SatP&Digits=5&THigh='+str(thigh)+'&'+str(tlow)+'=50&TInc='+str(tinc)+'&RefState=DEF&TUnit=K&PUnit=atm&DUnit=kg%2Fm3&HUnit=kJ%2Fmol&WUnit=m%2Fs&VisUnit=uPa*s&STUnit=N%2Fm' + prop_soup = download_page(url) + prop_table = prop_soup.find_all("table")[table].find_all('tr') + table=[] + for row in prop_table: + subrow=[] + if len(row.find_all('td')) > 0: + for j in range(14): + subrow.append(row.find_all('td')[j].text) + elif len(row.find_all('th')) > 0: + for j in range(14): + subrow.append(row.find_all('th')[j].text) + table.append(subrow) + + + return np.array(table) + + def _get_PhaseChange_data(self,cid,table=2): + + prop_url = "https://webbook.nist.gov/cgi/cbook.cgi?ID="+str(cid)+"&Mask=4#"+"Thermo-Phase" + prop_soup = download_page(prop_url) + + tables=prop_soup.find_all("table") + + thetab=tables[2] + content=thetab.find_all('td') + hcontent=thetab.find_all('th') + + table=[] + header=[] + for row in hcontent: + header.append(row.text) + foundenthalpy=False + for e in header: + if 'vapH' in e: + foundenthalpy=True + if foundenthalpy==False: + return table + table.append(header) + count=0 + ls=[] + for rowidx in range(len(content)): + row=content[rowidx] + if count==len(header): + count=0 + if count==0: + if len(ls)!=0: + table.append(ls) + ls=[] + value=row.text + count+=1 + if value.strip()=='': + value='N/A' + ls.append(value) + + + return table + + + + +def download_page(url): + '''This function downloads a page given and URL. If fail, it returns a status-code''' + page = requests.get(url) + page_content = page.content + #test for erroneous download + if page.status_code != 200: + print("" % cpd_page.status_code) + return None + + return BeautifulSoup(page_content, 'html.parser') + +class NistResult(object): + '''NistResult class is used to return search results. This class is like a + NistCompoundById but only has id and name. It has the instantiate method + to elaborate and return NistCompoundById objects''' + + INSTANTIATED = False + + def __init__(self, id_num, name, souped_page=None): + self.id = id_num + self.name = name + self.page = souped_page + + def instantiate(self): + #This will instantiate the compound + if self.page is None: + self.page = download_page("http://webbook.nist.gov/cgi/cbook.cgi?ID=%s" % self.id) + + return NistCompoundById(self.id, souped_page=self.page) + + def __str__(self): + return self.id + + def __repr__(self): + return 'NistResult(%s, %s)' % (self.id, self.name) + +def search_nist(options=None, instantiate=False, **kwargs): + '''Search NIST database for string search_str using the search keyword [formula, name, inchi key, CAS number, + structure]. If instantiate is selected, then it returns NistCompoundById object (which has a bunch of data within it) + Otherwise it returns a NistResult object, which only has the name and ID code and must be called with the + .instantiate() method before further use''' + + #Error checking + if len(kwargs) != 1: + print("" % len(kwargs)) + return None + search_type=list(kwargs.keys())[0] + search_str=list(kwargs.values())[0] + + #Check for value of kwarg + types = { + 'formula': "http://webbook.nist.gov/cgi/cbook.cgi?Formula=%s" % search_str, + 'name' : "http://webbook.nist.gov/cgi/cbook.cgi?Name=%s" % search_str, + 'inchi' : "http://webbook.nist.gov/cgi/cbook.cgi?InChI=%s" % search_str, + 'cas' : "http://webbook.nist.gov/cgi/cbook.cgi?ID=%s" % search_str, + } + if not(search_type) in types: + print("" % types.keys()) + return None + + #Download the search page, and check to see whether it's a single compound + search_page = download_page(types[search_type]) + #will be returned to user + search_results = [] + + if "Search Results" in search_page.text: + #Loop through all results. The results are in an ordered list! + + for raw_result in search_page.ol.find_all('li'): + id_code = re.search(r'ID=([A-Za-z]\d{1,})', raw_result.a['href']).group(1) + name = raw_result.a.text + if instantiate == True: + search_results.append(NistResult(id_code, name).instantiate()) + else: + search_results.append(NistResult(id_code, name)) + #there is only one search result! + else: + #Find the ID (basically it's the ID-like text that appears the most on the page!) + links_on_page = [] + #loop through all the links + for link in search_page.find_all('a'): + curr_href = link.attrs.get('href') + #sometimes, there is no hfref (eg. it's an anchor or something), so check for NoneType + if curr_href is not None and re.search(r'ID=([A-Za-z]\d{1,})', curr_href): + #add the current link's ID code + #group(0) is the entire search result, so group(1) is the bracketed thing in the search query + links_on_page.append(re.search(r'ID=([A-Za-z]\d{1,})', curr_href).group(1)) + if len(links_on_page)==0: + raise ValueError('NIST Name search failed') + id_code = max(links_on_page, key=links_on_page.count) + + name = search_page.title.text + + if instantiate == True: + search_results.append(NistResult(id_code, name, souped_page=search_page).instantiate()) + else: + search_results.append(NistResult(id_code, name, souped_page=search_page)) + + return search_results + + + + +def ConvertSmilestoNames(smiles,rep): + results=cirpy.query(smiles, rep) + if len(results)==0: + raise ValueError('SMILES could not be converted to name') + else: + return results[0].value + +def SanitizeUnit(currentunit): + if currentunit!=None: + currentunit=currentunit.replace('m3','m**3') + + return currentunit + + + +def QueryLiquidProperties(names,truename=None,printnames=False): + if truename==None: + foundname=False + else: + foundname=True + thename=truename + foundnames=[] + foundhit=False + ureg = UnitRegistry() + fbabbrtotargetunits={'Eps0':'debye**2/(nm**3 .J)','Eps0_err':'debye**2/(nm**3 .J)','Cp':'kJ/(mol.K)','Cp_err':'kJ/(mol.K)','Kappa':'1/bar','Kappa_err':'1/bar','Alpha':'1/K','Alpha_err':'1/K','Surf_Ten':'mJ/m**2','Surf_Ten_err':'mJ/m**2','T':'K','P':'atm','Rho':'kg/m**3','Rho_err':'kg/m**3','Hvap':'kJ/mol','Hvap_err':'kJ/mol'} + nistnametofbabbr={'Enthalpy_of_vaporization_or_sublimation':'Hvap', 'Delta[Enthalpy_of_vaporization_or_sublimation]':'Hvap_err','Surface_tension_liquid-gas':'Surf_Ten', 'Delta[Surface_tension_liquid-gas]':'Surf_Ten_err','Relative_permittivity_at_zero_frequency':'Eps0', 'Delta[Relative_permittivity_at_zero_frequency]':'Eps0_err','Isothermal_compressibility':'Kappa', 'Delta[Isothermal_compressibility]':'Kappa_err','Isobaric_coefficient_of_volume_expansion':'Alpha', 'Delta[Isobaric_coefficient_of_volume_expansion]':'Alpha_err','Heat_capacity_at_constant_pressure*':'Cp', 'Delta[Heat_capacity_at_constant_pressure*]':'Cp_err','Pressure':'P', 'Temperature':'T','Specific_density':'Rho', 'Delta[Specific_density]':'Rho_err','Specific_density*':'Rho', 'Delta[Specific_density*]':'Rho_err','Heat_capacity_at_constant_pressure':'Cp', 'Delta[Heat_capacity_at_constant_pressure]':'Cp_err'} + desiredprops=['Isothermal compressibility','Heat capacity at constant pressure','Density','Isobaric coefficient of volume expansion','Surface tension liquid-gas','Relative permittivity',"Enthalpy of vaporization or sublimation"] + propertynamearray=list(fbabbrtotargetunits.keys()) + refstoproptoarray={} + for name in names: + if foundname==True and printnames==False: + if name==thename: + pass + else: + continue + + for prop,aprop in tqdm(pyilt2.prop2abr.items(),desc='Property search for '+name): + if prop in desiredprops: + results = pyilt2.query(comp = name,prop=aprop) + + length=len(results.refs) + if length>0: + foundhit=True + if name not in foundnames: + foundnames.append(name) + if printnames==False: + if foundname==False: + foundname=True + thename=name + for hit in results.refs: + hitrefdict=hit.refDict + hitref=hitrefdict['ref'] + if hitref not in refstoproptoarray.keys(): + ls=[None for i in propertynamearray] + dic=dict(zip(propertynamearray,ls)) + refstoproptoarray[hitref]=dic + try: + dataset=hit.get() + except: + print('Error, in accessing database!') + continue + props=dataset.physProps + units=dataset.physUnits + data=dataset.data + fullref=dataset.fullcite + refstoproptoarray[hitref]['cite']=fullref + refstoproptoarray[hitref]['name']=thename + for pidx in range(len(props)): + p=props[pidx] + currentunit=units[pidx] + if p in nistnametofbabbr.keys() and currentunit==None: + break + currentunit=SanitizeUnit(currentunit) + col=data[:,pidx] + if 'fraction' not in p and 'MolaLity' not in p and 'MolaRity' not in p and 'Mole' not in p and 'Molar' not in p: + fbabbr=nistnametofbabbr[p] + targetunit=fbabbrtotargetunits[fbabbr] + if currentunit!=targetunit: + value=str(1) + string=value+' * '+currentunit+' to '+targetunit + src, dst = string.split(' to ') + Q_ = ureg.Quantity + convobj=Q_(src).to(dst) + convfactor=convobj._magnitude + converted=col*convfactor + refstoproptoarray[hitref][fbabbr]=converted + else: + refstoproptoarray[hitref][fbabbr]=col + if printnames==True: + print('possible names',foundnames) + sys.exit() + if foundhit==False: + raise ValueError('no references found for name '+thename) + return refstoproptoarray + +def SortReferences(refstoproptoarray,searchILDB): + sortedrefstoproptoarray={} + refstodates={} + for ref in refstoproptoarray.keys(): + if searchILDB==True: + first='(' + last=')' + start = ref.rindex( first ) + len( first ) + end = ref.rindex( last, start ) + string=ref[start:end] + numstring=[e for e in string if e.isdigit()==True] + numstring=''.join(numstring) + num=int(numstring) + else: + if ',' in ref: + refsplit=ref.split(',') + datestring=refsplit[-1] + datestring=datestring.lstrip().rstrip() + num=int(datestring) + else: + num=0 + refstodates[ref]=num + sortedreftodates=dict(sorted(refstodates.items(), key=lambda item: item[1],reverse=True)) # later dates first + for sortedref,date in sortedreftodates.items(): + proptoarray=refstoproptoarray[sortedref] + sortedrefstoproptoarray[sortedref]=proptoarray + + + return sortedrefstoproptoarray + +def PropertyToReferences(sortedrefstoproptoarray): + proptorefs={} + for sortedref,proptoarray in sortedrefstoproptoarray.items(): + for prop in proptoarray.keys(): + if prop!='cite' and prop!='name' and 'err' not in prop and prop!='T' and prop!='P': + try: + value=proptoarray[prop] + if len(value)>0: + if prop not in proptorefs.keys(): + proptorefs[prop]=[] + if sortedref not in proptorefs[prop]: + proptorefs[prop].append(sortedref) + except: + continue + if len(proptorefs.keys())==0: + raise ValueError('Missing property data!') + return proptorefs + + +def GrabUniqueProps(proptoarray): + uniqueprops=[] + for prop,array in proptoarray.items(): + if prop!='name' and prop!='cite' and 'err' not in prop and prop!='T' and prop!='P': + try: + length=len(array) + if length>0: + uniqueprops.append(prop) + except: + pass + + return tuple(set(uniqueprops)) + +def RoundTPData(sortedrefstoproptoarray,decimalplaces): + for ref,proptoarray in sortedrefstoproptoarray.items(): + tarray=proptoarray['T'] + parray=proptoarray['P'] + try: # might not be an P data + parray=[round(i,decimalplaces) for i in parray] + except: + pass + + first=tarray[0] + if '-' in first: + firstsplit=first.split('-') + firsttemp=firstsplit[0].lstrip().rstrip() + if firsttemp[-1]=='.': + firsttemp=firsttemp[:-1] + secondtemp=firstsplit[1].lstrip().rstrip() + if secondtemp[-1]=='.': + secondtemp=secondtemp[:-1] + firsttemp=int(firsttemp) + secondtemp=int(secondtemp) + tarray=np.arange(firsttemp, secondtemp, 0.01).tolist() + tarray=[float(i) for i in tarray] + tarray=[round(i,decimalplaces) for i in tarray] + sortedrefstoproptoarray[ref]['T']=tarray + sortedrefstoproptoarray[ref]['P']=parray + + + return sortedrefstoproptoarray + +def CountTPFrequency(sortedrefstoproptoarray): + uniquepropstotemppressurecounts={} + for ref,proptoarray in sortedrefstoproptoarray.items(): + tarray=proptoarray['T'] + parray=proptoarray['P'] + setuniqueprops=GrabUniqueProps(proptoarray) + if setuniqueprops not in uniquepropstotemppressurecounts.keys(): + uniquepropstotemppressurecounts[setuniqueprops]={} + for i in range(len(tarray)): + T=tarray[i] + try: + P=parray[i] + except: + P=1 # assume atmospheric but better be safe and check! + tp=tuple([T,P]) + if tp not in uniquepropstotemppressurecounts[setuniqueprops].keys(): + uniquepropstotemppressurecounts[setuniqueprops][tp]=0 + uniquepropstotemppressurecounts[setuniqueprops][tp]+=1 + temppressurecounts={} + for uniqueprop,tptocounts in uniquepropstotemppressurecounts.items(): + for tp in tptocounts.keys(): + if tp not in temppressurecounts.keys(): + temppressurecounts[tp]=0 + temppressurecounts[tp]+=1 + sortedtemppressurecounts=dict(sorted(temppressurecounts.items(), key=lambda item: item[1],reverse=True)) + + return sortedtemppressurecounts + + +def GrabNearestTPPoint(temp,tppoints): + difftotppoint={} + for tp in tppoints: + t=tp[0] + p=tp[1] + diff=np.abs(t-temp) + difftotppoint[diff]=tp + mindiff=min(difftotppoint.keys()) + mintp=difftotppoint[mindiff] + return mintp + + + +def GrabTPPoints(proptoarray): + tppoints=[] + tarray=proptoarray['T'] + parray=proptoarray['P'] + for i in range(len(tarray)): + T=tarray[i] + try: + P=parray[i] + except: + P=1 + tp=tuple([T,P]) + tppoints.append(tp) + + + return tppoints + + +def GrabPropValue(T,tarray,array): + try: # sometimes no error array: + length=len(array) + + except: # return None if no error is reported + return None + for i in range(len(tarray)): + t=tarray[i] + value=array[i] + if t==T: + return value + + +def FindMinimalTPPointsAllProps(tppoint,proptorefs,sortedrefstoproptoarray,truename): + tptoproptovalue={} + T=tppoint[0] + for prop,refs in proptorefs.items(): + for ref in refs: + proptoarray=sortedrefstoproptoarray[ref] + tppoints=GrabTPPoints(proptoarray) + if 'cite' in proptoarray.keys(): + cite=proptoarray['cite'] + else: + cite=ref + if 'name' in proptoarray.keys(): + name=proptoarray['name'] + else: + name=truename + if tppoint in tppoints: # else need to find nearest TP point + truepoint=tppoint + else: + othertppoint=GrabNearestTPPoint(T,tppoints) + truepoint=othertppoint + if truepoint not in tptoproptovalue.keys(): + tptoproptovalue[truepoint]={} + tptoproptovalue[truepoint]['cite']=cite + tptoproptovalue[truepoint]['name']=name + for prop,array in proptoarray.items(): + errprop=prop+'_err' + length=0 + if prop!='T' and prop!='P': + try: + length=len(array) + if length>0: + array=proptoarray[prop] + tarray=proptoarray['T'] + value=GrabPropValue(T,tarray,array) + array=proptoarray[errprop] + errvalue=GrabPropValue(T,tarray,array) + tptoproptovalue[truepoint][prop]=value + tptoproptovalue[truepoint][errprop]=errvalue + except: + + + if prop not in tptoproptovalue[truepoint].keys(): + tptoproptovalue[truepoint][prop]=None + tptoproptovalue[truepoint][errprop]=None + + + break # find the first reference with data point, refs sorted by year, grab most recent + + + return tptoproptovalue + + +def GrabTPPointOutsideBound(tppoint,tol,tppoints,string): + T=tppoint[0] + if string=='low': + bound=T-tol + elif string=='upper': + bound=T+tol + for pt in tppoints: + t=pt[0] + if string=='low': + if t<=bound: + return pt # grab first instance (sorted by highest occuring minimize # TP points) + elif string=='upper': + if t>=bound: + return pt + +def AddDefaultValues(tptoproptovalue): + for tp,proptovalue in tptoproptovalue.items(): + globaldic={} + defaultdenomvalue=1 + wtkeywordtovalue={} + + for prop,value in proptovalue.items(): + if prop!='name' and prop!='cite' and 'err' not in prop and prop!='T' and prop!='P': + lowerprop=prop.lower() + keyword=lowerprop+'_denom' + globaldic[keyword]=defaultdenomvalue + weightkeyword=prop+'_wt' + try: + length=float(value) + defaultwtvalue=1 + except: + defaultwtvalue=0 + wtkeywordtovalue[weightkeyword]=defaultwtvalue + + + proptovalue['global']=globaldic + for wtkeyword,wtvalue in wtkeywordtovalue.items(): + proptovalue[wtkeyword]=wtvalue + + tptoproptovalue[tp]=proptovalue + + + return tptoproptovalue + + +def WriteCSVFile(listoftpdics,nvtprops): + firsttpdic=listoftpdics[0] + firsttpdicvalues=list(firsttpdic.values()) + firsttppointvalues=firsttpdicvalues[0] + firstglobaldic=firsttppointvalues['global'] + nvtproperties=['Surf_Ten'] + with open('data.csv', mode='w') as write_file: + writer = csv.writer(write_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL) + for keyword,value in firstglobaldic.items(): + ls=['Global',keyword,value] + writer.writerow(ls) + writer.writerow([]) + listofcommentrows=[] + listoftprows=[] + listoftpcommentrows=[] + for tpdic in listoftpdics: + for tp,proptovalue in tpdic.items(): + name=proptovalue['name'] + citation=proptovalue['cite'] + namels=['# Name',name] + refls=['# Ref',citation] + propls=['T','P'] + propvaluels=[str(tp[0]),str(tp[1])+' '+'atm'] + properrls=[] + properrvaluels=[] + commentpropvaluels=['# '+str(tp[0]),str(tp[1])+' '+'atm'] + + ls=[namels,refls,commentpropvaluels] + for prop,value in proptovalue.items(): + if prop!='name' and prop!='cite' and 'wt' not in prop and 'err' not in prop and prop!='T' and prop!='P' and 'global' not in prop: + if value==None: + continue + if nvtprops==False and prop in nvtproperties: + continue + + propls.append(prop) + propvaluels.append(value) + wtkeyword=prop+'_wt' + wtvalue=proptovalue[wtkeyword] + propls.append(wtkeyword) + propvaluels.append(wtvalue) + errkeyword=prop+'_err' + errvalue=proptovalue[errkeyword] + if errvalue==None: + errvalue=0 + properrls.append(errkeyword) + properrvaluels.append(errvalue) + properrls[0]='# '+str(properrls[0]) + properrvaluels[0]='# '+str(properrvaluels[0]) + + ls.append(properrls) + ls.append(properrvaluels) + listofcommentrows.append(ls) + listoftpcommentrows.append(propls) + listoftprows.append(propvaluels) + for grpls in listofcommentrows: + for ls in grpls: + writer.writerow(ls) + writer.writerow([]) + first=listoftpcommentrows[0] + writer.writerow(first) + for ls in listoftprows: + writer.writerow(ls) + +def AddNistData(refstoproptoarray,propertynamearray,table,fbabbrtotargetunits): + ls=[None for i in propertynamearray] + if len(table)==0: + return refstoproptoarray + ureg = UnitRegistry() + tableheader=table[0] + nisttofbkeys={'vapH (kJ/mol)':'Hvap','Temperature (K)':'T','Cp (J/mol*K)':'Cp','Surf. Tension (N/m)':'Surf_Ten','Density (kg/m3)':'Rho'} + if 'Reference' in tableheader: + refidx=tableheader.index('Reference') + else: + refidx=None + for row in table[1:]: + for i in range(len(row)): + tablehead=tableheader[i] + value=row[i] + if tablehead=='Phase': + if value=='vapor': # skip, only want liquid + continue + if tablehead in nisttofbkeys.keys(): + fbvalue=nisttofbkeys[tablehead] + if refidx!=None: + ref=row[refidx] + else: + ref='Unknown' + if tablehead=='Cp (J/mol*K)': # NIST doesnt allow kJ for this so just convert here + value=float(value)*.001 + if tablehead=='Surf. Tension (N/m)': # NIST doesnt allow desired units so convert here + currentunit='N/m' + targetunit=fbabbrtotargetunits[fbvalue] + string=value+' * '+currentunit+' to '+targetunit + src, dst = string.split(' to ') + Q_ = ureg.Quantity + convobj=Q_(src).to(dst) + convfactor=convobj._magnitude + converted=float(value)*convfactor + value=converted + dic=dict(zip(propertynamearray,ls)) + if ref not in refstoproptoarray.keys(): + refstoproptoarray[ref]=dic + if refstoproptoarray[ref][fbvalue]==None: + refstoproptoarray[ref][fbvalue]=[] + refstoproptoarray[ref][fbvalue].append(value) + + return refstoproptoarray + +def QueryNISTProperties(truename,names): + fbabbrtotargetunits={'Eps0':'debye**2/(nm**3 .J)','Eps0_err':'debye**2/(nm**3 .J)','Cp':'kJ/(mol.K)','Cp_err':'kJ/(mol.K)','Kappa':'1/bar','Kappa_err':'1/bar','Alpha':'1/K','Alpha_err':'1/K','Surf_Ten':'mJ/m**2','Surf_Ten_err':'mJ/m**2','T':'K','P':'atm','Rho':'kg/m**3','Rho_err':'kg/m**3','Hvap':'kJ/mol','Hvap_err':'kJ/mol'} + refstoproptoarray={} + if truename!=None: + x = search_nist(name=truename) + else: + for tryname in names: + try: + x = search_nist(name=tryname) + break + except: + continue + + + firstx=x[0]# # by default try first item in search results + y = firstx.instantiate() + temp=300 + try: # query error, no data available (sometimes not fluid data or just wrong temperature) + table=y._get_fluid_data(firstx,temp) + except: + table=None + phasechange=y._get_PhaseChange_data(firstx,temp) + + try: + sattable=y._get_fluid_Saturation_data(firstx) + except: + sattable=None + + propertynamearray=list(fbabbrtotargetunits.keys()) + try: + length=len(sattable) + refstoproptoarray=AddNistData(refstoproptoarray,propertynamearray,sattable,fbabbrtotargetunits) + except: + pass + try: + length=len(table) + refstoproptoarray=AddNistData(refstoproptoarray,propertynamearray,table,fbabbrtotargetunits) + except: + pass + try: + length=len(phasechange) + refstoproptoarray=AddNistData(refstoproptoarray,propertynamearray,phasechange,fbabbrtotargetunits) + except: + pass + + + return refstoproptoarray + +def RemoveSamePoints(listoftpdics): + newlistoftpdics=[] + for tpdic in listoftpdics: + if tpdic not in newlistoftpdics: + newlistoftpdics.append(tpdic) + + return newlistoftpdics + +def RemoveDictionariesWithNoExpDataAtTargetTP(listoftpdics): + newlistoftpdics=[] + for tpdic in listoftpdics: + newdic={} + for tppoint,dic in tpdic.items(): + founddata=False + for key,value in dic.items(): + if key!='global' and key!='cite' and key!='name' and '_wt' not in key and '_denom' not in key: + if value!=None: + founddata=True + if founddata==True: + newdic[tppoint]=dic + if len(newdic.keys())>0: + newlistoftpdics.append(newdic) + + return newlistoftpdics + + +def ParseDatabaseGenerateLiquidCSVFile(smiles,truename,printnames,searchILDB,rep,roomtemp,lowertol,uppertol,nvtprops): + + names=[] + if smiles!=None: + names=ConvertSmilestoNames(smiles,rep) + if printnames==True: + print('names from pubchem',names) + print('smiles',smiles) + if searchILDB==True: + refstoproptoarray=QueryLiquidProperties(names,truename,printnames) + else: + refstoproptoarray=QueryNISTProperties(truename,names) + + sortedrefstoproptoarray=SortReferences(refstoproptoarray,searchILDB) + sortedrefstoproptoarray=RoundTPData(sortedrefstoproptoarray,2) # round to two decimal places + proptorefs=PropertyToReferences(sortedrefstoproptoarray) + sortedtemppressurecounts=CountTPFrequency(sortedrefstoproptoarray) + tppoint=GrabNearestTPPoint(roomtemp,list(sortedtemppressurecounts.keys())) + tptoproptovalue=FindMinimalTPPointsAllProps(tppoint,proptorefs,sortedrefstoproptoarray,truename) + tptoproptovalue=AddDefaultValues(tptoproptovalue) + lowertppoint=GrabTPPointOutsideBound(tppoint,lowertol,list(sortedtemppressurecounts.keys()),'low') + uppertppoint=GrabTPPointOutsideBound(tppoint,uppertol,list(sortedtemppressurecounts.keys()),'upper') + lowertptoproptovalue=FindMinimalTPPointsAllProps(lowertppoint,proptorefs,sortedrefstoproptoarray,truename) + lowertptoproptovalue=AddDefaultValues(lowertptoproptovalue) + uppertptoproptovalue=FindMinimalTPPointsAllProps(uppertppoint,proptorefs,sortedrefstoproptoarray,truename) + uppertptoproptovalue=AddDefaultValues(uppertptoproptovalue) + listoftpdics=[tptoproptovalue,lowertptoproptovalue,uppertptoproptovalue] + listoftpdics=RemoveDictionariesWithNoExpDataAtTargetTP(listoftpdics) + listoftpdics=RemoveSamePoints(listoftpdics) + density=GrabDensity(listoftpdics) + WriteCSVFile(listoftpdics,nvtprops) + return density + +def GrabDensity(listoftpdics): + firstdic=listoftpdics[0] + firstproptovaluekeylist=list(firstdic.keys()) + firstkey=firstproptovaluekeylist[0] + proptovalue=firstdic[firstkey] + density=float(proptovalue['Rho']) # in Kg/m**3 + return density + + + +def ReadInPoltypeFiles(poltypepath): + dimertinkerxyzfiles=[] + dimerenergies=[] + dimersplogfiles=[] + curdir=os.getcwd() + os.chdir(poltypepath) + keyfile=os.path.join(poltypepath,'final.key') + xyzfile=os.path.join(poltypepath,'final.xyz') + if not os.path.exists(keyfile) or not os.path.exists(xyzfile): + raise ValueError('Final xyz or keyfile does not exist in '+str(poltypepath)) + if os.path.isdir('vdw'): + os.chdir('vdw') + files=os.listdir() + spext='_sp.log' + for f in files: + if spext in f: + tempxyzfile=f.replace(spext,'.xyz') + dimertinkerxyzfiles.append(os.path.join(os.getcwd(),tempxyzfile)) + dimersplogfiles.append(os.path.join(os.getcwd(),f)) + os.chdir('..') + else: + raise ValueError('vdw folder does not exist for '+poltypepath) + + files=os.listdir() + for f in files: + if '.' in f: + filesplit=f.split('.') + ext=filesplit[1] + if ext=='sdf': # assume poltype input sdf file + molname=filesplit[0] + molfile=f + + + dimerenergies=ReadQMLogFile(dimersplogfiles) + molfile=os.path.join(poltypepath,molfile) + os.chdir(curdir) + return keyfile,xyzfile,dimertinkerxyzfiles,dimerenergies,molname,molfile + + +def GrabMonomerEnergy(line,Hartree2kcal_mol): + linesplit=line.split() + energy=float(linesplit[4]) + monomerenergy=(energy)*Hartree2kcal_mol + return monomerenergy + +def CheckIfLogFileUsingGaussian(f): + use_gaus=False + temp=open(f,'r') + results=temp.readlines() + temp.close() + for line in results: + if 'Entering Gaussian System' in line: + use_gaus=True + break + return use_gaus + + +def ReadQMLogFile(dimersplogfiles): + Hartree2kcal_mol=627.5095 + dimerenergies=[] + for f in dimersplogfiles: + use_gaus=CheckIfLogFileUsingGaussian(f) + tmpfh=open(f,'r') + if use_gaus==True: + frag1calc=False + frag2calc=False + for line in tmpfh: + if 'Counterpoise: corrected energy =' in line: + dimerenergy=float(line.split()[4])*Hartree2kcal_mol + elif 'Counterpoise: doing DCBS calculation for fragment 1' in line: + frag1calc=True + frag2calc=False + elif 'Counterpoise: doing DCBS calculation for fragment 2' in line: + frag1calc=False + frag2calc=True + elif 'SCF Done' in line: + if frag1calc: + frag1energy=GrabMonomerEnergy(line,Hartree2kcal_mol) + elif frag2calc: + frag2energy=GrabMonomerEnergy(line,Hartree2kcal_mol) + interenergy=dimerenergy-(frag1energy+frag2energy) + else: + for line in tmpfh: + if 'CP Energy =' in line and 'print' not in line: + linesplit=line.split() + interenergy=float(linesplit[3])*Hartree2kcal_mol + dimerenergies.append(interenergy) + tmpfh.close() + + + return dimerenergies + + +def GrabVdwTypeLinesFromFinalKey(keyfile,vdwtypes): + vdwtypelines=[] + temp=open(keyfile,'r') + results=temp.readlines() + temp.close() + for line in results: + if 'vdw' in line: + for vdwtype in vdwtypes: + if str(vdwtype) in line: + vdwtypelines.append(line) + + return vdwtypelines + +def GenerateForceFieldFiles(vdwtypelines,moleculeprmfilename): + if not os.path.isdir('forcefield'): + os.mkdir('forcefield') + os.chdir('forcefield') + temp=open(moleculeprmfilename,'w') + for line in vdwtypelines: + linesplit=line.split() + last=float(linesplit[-1]) + linelen=len(linesplit) + linesplit.append('#') + linesplit.append('PRM') + linesplit.append('2') + linesplit.append('3') + if linelen==5 and last!=1: + linesplit.append('4') + newline=' '.join(linesplit)+'\n' + temp.write(newline) + os.chdir('..') + +def RemoveKeyWord(keypath,keystring): + read=open(keypath,'r') + results=read.readlines() + read.close() + tempname=keypath.replace('.key','-t.key') + temp=open(tempname,'w') + for line in results: + if keystring not in line: + temp.write(line) + temp.close() + os.remove(keypath) + os.rename(tempname,keypath) + + +def CommentOutVdwLines(keypath,vdwtypes): + read=open(keypath,'r') + results=read.readlines() + read.close() + tempname=keypath.replace('.key','-t.key') + temp=open(tempname,'w') + for lineidx in range(len(results)): + line=results[lineidx] + for vdwtype in vdwtypes: + if str(vdwtype) in line and 'vdw' in line: + newline='# '+line + results[lineidx]=newline + for line in results: + temp.write(line) + + + + temp.close() + os.remove(keypath) + os.rename(tempname,keypath) + + +def GenerateLiquidTargetsFolder(gaskeyfile,gasxyzfile,liquidkeyfile,liquidxyzfile,datacsvpath,density,liquidfolder,prmfilepath,moleculeprmfilename,vdwtypes,addwaterprms): + if not os.path.isdir('targets'): + os.mkdir('targets') + os.chdir('targets') + if not os.path.isdir(liquidfolder): + os.mkdir(liquidfolder) + os.chdir(liquidfolder) + shutil.copy(gaskeyfile,os.path.join(os.getcwd(),'gas.key')) + RemoveKeyWord(os.path.join(os.getcwd(),'gas.key'),'parameters') + temp=open(prmfilepath,'r') + results=temp.readlines() + temp.close() + temp=open(os.path.join(os.getcwd(),'gas.key'),'a') + if addwaterprms==True: + waterlines=WaterParameters() + for line in waterlines: + temp.write(line+'\n') + temp.close() + string='parameters '+moleculeprmfilename+'\n' + AddKeyWord(os.path.join(os.getcwd(),'gas.key'),string) + CommentOutVdwLines(os.path.join(os.getcwd(),'gas.key'),vdwtypes) + shutil.copy(gasxyzfile,os.path.join(os.getcwd(),'gas.xyz')) + head,tail=os.path.split(liquidkeyfile) + shutil.copy(liquidkeyfile,os.path.join(os.getcwd(),tail)) + CommentOutVdwLines(os.path.join(os.getcwd(),tail),vdwtypes) + head,tail=os.path.split(liquidxyzfile) + shutil.copy(liquidxyzfile,os.path.join(os.getcwd(),tail)) + os.remove(liquidxyzfile) + if datacsvpath!=None: + head,tail=os.path.split(datacsvpath) + shutil.copy(datacsvpath,os.path.join(os.getcwd(),tail)) + os.remove(datacsvpath) + os.chdir('..') + os.chdir('..') + + +def FindDimensionsOfMoleculeTinker(structurefilepath): + veclist=[] + temp=open(structurefilepath,'r') + results=temp.readlines() + temp.close() + for line in results: + linesplit=line.split() + if len(linesplit)!=1 and '90.000000' not in line: # not line containing number of atoms + vec=np.array([float(linesplit[2]),float(linesplit[3]),float(linesplit[4])]) + veclist.append(vec) + + pairs=list(itertools.combinations(veclist, 2)) + distlist=[] + for pairidx in range(len(pairs)): + pair=pairs[pairidx] + progress=(pairidx*100)/len(pairs) + dist=np.linalg.norm(np.array(pair[0])-np.array(pair[1])) + distlist.append(dist) + mindist=np.amax(np.array(distlist)) + return mindist + +def ComputeBoxLength(xyzfile): + vdwcutoff=12 #in angstrom + longestdim=FindDimensionsOfMoleculeTinker(xyzfile) + aaxis = 2*float(vdwcutoff)+longestdim+4 + return aaxis + +def CreateSolventBox(axis,molnumber,prmfilepath,xyzeditpath,tinkerxyzname): + head,tail=os.path.split(tinkerxyzname) + fullkey=tinkerxyzname.replace('.xyz','.key') + key=tail.replace('.xyz','.key') + shutil.copy(tinkerxyzname,os.path.join(os.getcwd(),tail)) + shutil.copy(fullkey,os.path.join(os.getcwd(),key)) + temp=open('xyzedit.in','w') + temp.write(tail+'\n') + temp.write('21'+'\n') + temp.write(str(molnumber)+'\n') + temp.write(str(axis)+','+str(axis)+','+str(axis)+'\n') + temp.write('Y'+'\n') + temp.close() + cmdstr=xyzeditpath+' '+'<'+' '+'xyzedit.in' + call_subsystem(cmdstr,wait=True) + os.replace(tail+'_2','liquid.xyz') + liquidxyzfile=os.path.join(os.getcwd(),'liquid.xyz') + os.remove(key) + os.remove(tail) + return liquidxyzfile + +def call_subsystem(cmdstr,wait=False): + p = subprocess.Popen(cmdstr, shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if wait==True: + p.wait() + if p.returncode != 0: + raise ValueError("ERROR: " + cmdstr+' '+'path'+' = '+os.getcwd()) + + +def InsertKeyfileHeader(keyfilename,moleculeprmfilename,axis): + ewaldcutoff=7 + integrator="RESPA" + thermostat="BUSSI" + vdwcutoff=12 + polareps=.00001 + barostatmethod='montecarlo' + string='parameters '+moleculeprmfilename+'\n' + AddKeyWord(keyfilename,string) + string='a-axis'+' '+str(axis)+'\n' + AddKeyWord(keyfilename,string) + string='archive'+'\n' + AddKeyWord(keyfilename,string) + string='integrator '+integrator+'\n' + AddKeyWord(keyfilename,string) + string='thermostat '+thermostat+'\n' + AddKeyWord(keyfilename,string) + string='ewald'+'\n' + AddKeyWord(keyfilename,string) + string='vdw-cutoff '+str(vdwcutoff)+'\n' + AddKeyWord(keyfilename,string) + string='ewald-cutoff '+str(ewaldcutoff)+'\n' + AddKeyWord(keyfilename,string) + string='polar-eps '+str(polareps)+'\n' + AddKeyWord(keyfilename,string) + string='polar-predict'+'\n' + AddKeyWord(keyfilename,string) + string='barostat'+' '+barostatmethod+'\n' + AddKeyWord(keyfilename,string) + string='vdw-correction'+'\n' + AddKeyWord(keyfilename,string) + + +def AddKeyWord(keypath,string): + read=open(keypath,'r') + results=read.readlines() + read.close() + tempkeyname=keypath.replace('.key','-t.key') + temp=open(tempkeyname,'w') + temp.write(string) + for line in results: + temp.write(line) + temp.close() + os.remove(keypath) + os.rename(tempkeyname,keypath) + + +def WaterParameters(): + lines=[] + lines.append('atom 349 90 O "AMOEBAWaterO" 8 15.999 2') + lines.append('atom 350 91 H "AMOEBAWaterH" 1 1.008 1') + lines.append('vdw 90 3.4050 0.1100') + lines.append('vdw 91 2.6550 0.0135 0.910') + lines.append('bond 90 91 556.85 0.9572') + lines.append('angle 91 90 91 48.70 108.50') + lines.append('ureybrad 91 90 91 -7.60 1.5537') + lines.append('multipole 349 -350 -350 -0.51966') + lines.append(' 0.00000 0.00000 0.14279') + lines.append(' 0.37928') + lines.append(' 0.00000 -0.41809') + lines.append(' 0.00000 0.00000 0.03881') + lines.append('multipole 350 349 350 0.25983') + lines.append(' -0.03859 0.00000 -0.05818') + lines.append(' -0.03673') + lines.append(' 0.00000 -0.10739') + lines.append(' -0.00203 0.00000 0.14412') + lines.append('polarize 349 0.8370 0.3900 350') + lines.append('polarize 350 0.4960 0.3900 349') + return lines + +def GenerateNewKeyFile(keyfile,prmfilepath,moleculeprmfilename,axis,addwaterprms): + liquidkeyfile=shutil.copy(keyfile,os.path.join(os.getcwd(),'liquid.key')) + RemoveKeyWord(liquidkeyfile,'parameters') + temp=open(prmfilepath,'r') + results=temp.readlines() + temp.close() + temp=open(liquidkeyfile,'a') + if addwaterprms==True: + waterlines=WaterParameters() + for line in waterlines: + temp.write(line+'\n') + temp.close() + + InsertKeyfileHeader(liquidkeyfile,moleculeprmfilename,axis) + + return liquidkeyfile + +def GenerateTargetFiles(keyfile,xyzfile,density,rdkitmol,prmfilepath,xyzeditpath,moleculeprmfilename,addwaterprms): + mass=Descriptors.ExactMolWt(rdkitmol)*1.66054*10**(-27) # convert daltons to Kg + axis=ComputeBoxLength(xyzfile) + boxlength=axis*10**-10 # convert angstroms to m + numbermolecules=int(density*boxlength**3/mass) + liquidxyzfile=CreateSolventBox(axis,numbermolecules,prmfilepath,xyzeditpath,xyzfile) + gaskeyfile=keyfile + gasxyzfile=xyzfile + if os.path.exists('data.csv'): + datacsvpath=os.path.join(os.getcwd(),'data.csv') + else: + datacsvpath=None + liquidkeyfile=GenerateNewKeyFile(keyfile,prmfilepath,moleculeprmfilename,axis,addwaterprms) + + return gaskeyfile,gasxyzfile,liquidkeyfile,liquidxyzfile,datacsvpath + +def GenerateQMTargetsFolder(dimertinkerxyzfiles,dimerenergies,liquidkeyfile,qmfolder,vdwtypes): + os.chdir('targets') + if not os.path.isdir(qmfolder): + os.mkdir(qmfolder) + os.chdir(qmfolder) + newnamearray=[] + newenergyarray=[] + arr=np.arange(0,len(dimertinkerxyzfiles)) + arcwriter=open('all.arc','w') + for i in range(len(arr)): + value=arr[i] + tinkerxyzfile=dimertinkerxyzfiles[i] + dimerenergy=dimerenergies[i] + head,tail=os.path.split(tinkerxyzfile) + tinkerxyzfileprefix=tail.split('.')[0] + newname=tinkerxyzfileprefix+str(value) + temp=open(tinkerxyzfile,'r') + results=temp.readlines() + temp.close() + firstline=results[0] + firstlinesplit=firstline.split() + firstlinesplit.append(newname) + newfirstline=' '.join(firstlinesplit)+'\n' + results[0]=newfirstline + newnamearray.append(newname) + newenergyarray.append(dimerenergy) + for line in results: + arcwriter.write(line) + + arcwriter.close() + energywriter=open('qdata.txt','w') + for i in range(len(arr)): + value=arr[i] + energy=newenergyarray[i] + firstline='LABEL'+' '+str(value)+'\n' + secondline='INTERACTION'+' '+str(energy)+'\n' + energywriter.write(firstline) + energywriter.write(secondline) + energywriter.write('\n') + energywriter.close() + head,tail=os.path.split(liquidkeyfile) + shutil.copy(liquidkeyfile,os.path.join(os.getcwd(),tail)) + CommentOutVdwLines(os.path.join(os.getcwd(),tail),vdwtypes) + os.remove(liquidkeyfile) + os.chdir('..') + os.chdir('..') + +def ReadLigandOBMol(structfname): + tmpconv = openbabel.OBConversion() + inFormat = openbabel.OBConversion.FormatFromExt(structfname) + tmpconv.SetInFormat(inFormat) + tmpmol = openbabel.OBMol() + tmpconv.ReadFile(tmpmol, structfname) + return tmpmol + + +def GenerateRdkitMol(ligandfilename): + tmpmol=ReadLigandOBMol(ligandfilename) + tmpconv = openbabel.OBConversion() + tmpconv.SetOutFormat('mol') + temp=ligandfilename.replace('.sdf','.mol') + tmpconv.WriteFile(tmpmol, temp) + rdkitmol=rdmolfiles.MolFromMolFile(temp,removeHs=False) + return rdkitmol + + +def SanitizeMMExecutable(executable,tinkerdir): + # Try to find Tinker executable with/without suffix + if which(executable)!=None: + return executable + if tinkerdir is None: + tinkerdir = os.getenv("TINKERDIR", default="") + exe = os.path.join(tinkerdir, executable) + if which(exe) is None: + exe = exe[:-2] if exe.endswith('.x') else exe + '.x' + if which(exe) is None: + print("ERROR: Cannot find Tinker {} executable".format(executable)) + sys.exit(2) + return exe + +def which(program): + def is_exe(fpath): + try: + return os.path.isfile(fpath) and os.access(fpath, os.X_OK) + except: + return None + + fpath, fname = os.path.split(program) + if fpath: + if is_exe(program): + return program + else: + for path in os.environ["PATH"].split(os.pathsep): + exe_file = os.path.join(path, program) + if is_exe(exe_file): + return exe_file + + return None + + +def ConvertInputMoleculeToSmiles(molfile): + rdkitmol=GenerateRdkitMol(molfile) + smiles=Chem.MolToSmiles(rdkitmol) + return smiles + + +def GenerateForceBalanceInputFile(moleculeprmfilename,qmfolder,liquidfolder,optimizefilepath,atomnum,liquid_equ_steps,liquid_prod_steps,liquid_timestep,liquid_interval,gas_equ_steps,gas_timestep,gas_interval,md_threads): + head,tail=os.path.split(optimizefilepath) + newoptimizefilepath=os.path.join(os.getcwd(),tail) + shutil.copy(optimizefilepath,newoptimizefilepath) + temp=open(newoptimizefilepath,'r') + results=temp.readlines() + temp.close() + for lineidx in range(len(results)): + line=results[lineidx] + linesplit=line.split() + if 'forcefield' in line: + if linesplit[0]=='forcefield': + newline='forcefield '+moleculeprmfilename+'\n' + results[lineidx]=newline + + + temp=open(newoptimizefilepath,'a') + + results.append('$target'+'\n') + results.append('name '+qmfolder+'\n') + results.append('type Interaction_TINKER'+'\n') + results.append('weight 1.0'+'\n') + results.append('energy_denom 1.0'+'\n') + results.append('energy_upper 20.0'+'\n') + results.append('attenuate'+'\n') + lastindex=str(atomnum) + newindex=str(atomnum+1) + lastnewindex=str(atomnum+1+2) + results.append('fragment1 '+'1'+'-'+lastindex+'\n') + results.append('fragment2 '+str(newindex)+'-'+lastnewindex+'\n') + results.append('$end'+'\n') + results.append('$target'+'\n') + results.append('name '+liquidfolder+'\n') + results.append('type Liquid_TINKER'+'\n') + results.append('weight 1.0'+'\n') + results.append('w_rho 1.0'+'\n') + results.append('w_hvap 1.0'+'\n') + results.append('liquid_equ_steps '+str(liquid_equ_steps)+'\n') + results.append('liquid_prod_steps '+str(liquid_prod_steps)+'\n') + results.append('liquid_timestep '+str(liquid_timestep)+'\n') + results.append('liquid_interval '+str(liquid_interval)+'\n') + results.append('gas_equ_steps '+str(gas_equ_steps)+'\n') + results.append('gas_prod_steps '+str(gas_prod_steps)+'\n') + results.append('gas_timestep '+str(gas_timestep)+'\n') + results.append('gas_interval '+str(gas_interval)+'\n') + results.append('md_threads '+str(md_threads)+'\n') + results.append('$end'+'\n') + for line in results: + temp.write(line) + temp.close() + +if poltypepath!=None: + keyfile,xyzfile,dimertinkerxyzfiles,dimerenergies,molname,molfile=ReadInPoltypeFiles(poltypepath) + smiles=ConvertInputMoleculeToSmiles(molfile) + +if skipNIST==False: + density=ParseDatabaseGenerateLiquidCSVFile(smiles,truename,printnames,searchILDB,rep,roomtemp,lowertol,uppertol,nvtprops) +if poltypepath!=None: + prmfilepath=os.path.join(os.path.split(__file__)[0],'amoebabio18.prm') + optimizefilepath=os.path.join(os.path.split(__file__)[0],'optimize.in') + xyzeditpath='xyzedit' + tinkerdir=None + xyzeditpath=SanitizeMMExecutable(xyzeditpath,tinkerdir) + vdwtypelines=GrabVdwTypeLinesFromFinalKey(keyfile,vdwtypes) + moleculeprmfilename='molecule.prm' + GenerateForceFieldFiles(vdwtypelines,moleculeprmfilename) + rdkitmol=GenerateRdkitMol(molfile) + atomnum=rdkitmol.GetNumAtoms() + gaskeyfile,gasxyzfile,liquidkeyfile,liquidxyzfile,datacsvpath=GenerateTargetFiles(keyfile,xyzfile,density,rdkitmol,prmfilepath,xyzeditpath,moleculeprmfilename,addwaterprms) + liquidfolder='Liquid' + qmfolder='QM' + GenerateLiquidTargetsFolder(gaskeyfile,gasxyzfile,liquidkeyfile,liquidxyzfile,datacsvpath,density,liquidfolder,prmfilepath,moleculeprmfilename,vdwtypes,addwaterprms) + GenerateQMTargetsFolder(dimertinkerxyzfiles,dimerenergies,liquidkeyfile,qmfolder,vdwtypes) + GenerateForceBalanceInputFile(moleculeprmfilename,qmfolder,liquidfolder,optimizefilepath,atomnum,liquid_equ_steps,liquid_prod_steps,liquid_timestep,liquid_interval,gas_equ_steps,gas_timestep,gas_interval,md_threads) diff --git a/tools/PoltypeInterface/optimize.in b/tools/PoltypeInterface/optimize.in new file mode 100644 index 000000000..567979d94 --- /dev/null +++ b/tools/PoltypeInterface/optimize.in @@ -0,0 +1,55 @@ +# ForceBalance input file +# The octothorpe '#' is a comment symbol +# Note: If the specified value is 'None' then the option will truly be set to None - not the string 'None' +# Note: 'Section' option types are more complicated and may require you to read the documentation +# Note: Boolean option types require no value, the key being present implies 'True' + +$options +# (string) Type of the penalty, L2 or L1 in the optimizer +penalty_type L2 +finite_difference_h 1e-4 + +# tinkerpath /home/leeping/opt/tinker-6.1.01-intel/bin +tinkerpath NONE +# (allcap) The job type +jobtype newton + +# (list) The names of force fields, corresponding to directory forcefields/file_name.(itp|gen) +# Make sure to tag the parameters that you wish to optimize +forcefield +# (int) Maximum number of steps in an optimization +maxstep 100 + +# (float) Factor for multiplicative penalty function in objective function +penalty_additive 0.01 + +# Negative trust radius means to search over the Levenberg-Marquardt parameter +trust0 0.1 + +# Normalize the objective function using the sum of weights? I usually don't. +normalize_weights no + +# Disable the rudimentary charge constraint code. Even if we had charges, +# I think it's better to use 'evals' to take care of this. +constrain_charge false + +# Priors. THESE ARE IMPORTANT! They dictate how much the parameter is allowed to vary, +# in conjunction with the penalty_additive parameter. +priors + VDWS : 5.0 + VDWT : 0.5 + VDWD : 1.0 +/priors + +criteria 2 +convergence_objective 1e-1 +convergence_gradient 1e-2 +convergence_step 1e-2 + +amoeba_pol mutual +amoeba_eps 1e-5 + +$end + + + From 8fe477b62764f2b0010ee35c97694ac4ecbb4aae Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Wed, 23 Jun 2021 17:05:58 -0500 Subject: [PATCH 08/27] Tinker9 no longer has CUDA_HOME etc in envioronment and dynamic_omm is not longer used. Set gpu dynamics to dynamic_gpu and search for GPUDYNAMICS keyword in envioronment to switch to GPU dynamics. --- src/tinkerio.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tinkerio.py b/src/tinkerio.py index 5b6dcc66a..53f596d1f 100644 --- a/src/tinkerio.py +++ b/src/tinkerio.py @@ -951,8 +951,8 @@ def molecular_dynamics(self, nsteps, timestep, temperature=None, pressure=None, self.optimize(0, method="bfgs", crit=1) os.system("mv %s.xyz_2 %s.xyz" % (self.name, self.name)) if verbose: logger.info("Done\n") - if 'OPENMM_CUDA_COMPILER' in os.environ.keys() and 'gas' not in self.name: - dynamickeyword='dynamic_omm' + if 'GPUDYNAMICS' in os.environ.keys() and 'gas' not in self.name: + dynamickeyword='dynamic_gpu' suffix=' N' else: dynamickeyword='dynamic' From 923fb749a686f0b16c2552641057b82593faa81f Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Thu, 24 Jun 2021 09:42:57 -0500 Subject: [PATCH 09/27] Change version requirement for GPU dynamics in Tinker 9 --- src/tinkerio.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/tinkerio.py b/src/tinkerio.py index 53f596d1f..201bcc906 100644 --- a/src/tinkerio.py +++ b/src/tinkerio.py @@ -373,6 +373,28 @@ def calltinker(self, command, stdin=None, print_to_screen=False, print_command=F last=ls[1:] first=ls[0] vn=first+'.'+''.join(last) + versionstr='' + for e in vn: + if e.isdigit() or e=='.': + versionstr+=e + count=versionstr.count('.') + if count==2: + newversionstr='' + for eidx in range(len(versionstr)): + e=versionstr[eidx] + if eidx>1: + if e!='.': + newversionstr+=e + else: + newversionstr+=e + versionstr=newversionstr + vn=versionstr + vn = float(vn) + if 'GPUDYNAMICS' in os.environ.keys(): # then tinker 9 version + vn_need=1 + else: + vn_need = 6.3 + vn = float(vn) vn_need = 6.3 try: From 8e8411933af5a38a00eabd16a5eb5bf577b85b7b Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Wed, 14 Jul 2021 16:13:42 -0500 Subject: [PATCH 10/27] Remove NIST wrapper from poltypeforcebalance wrapper. Make experimental data as inputs into wrapper. --- tools/PoltypeInterface/README.MD | 81 +- .../forcebalancepoltypeinterface.py | 1631 +++++++---------- 2 files changed, 711 insertions(+), 1001 deletions(-) diff --git a/tools/PoltypeInterface/README.MD b/tools/PoltypeInterface/README.MD index 6731fa490..c73655d09 100644 --- a/tools/PoltypeInterface/README.MD +++ b/tools/PoltypeInterface/README.MD @@ -12,12 +12,6 @@ conda activate FBTest conda install -c conda-forge ndcctools --yes conda install -c conda-forge forcebalance --yes conda install pip --yes -pip install pyilt2 -conda install -c conda-forge cirpy --yes -conda install -c conda-forge pint --yes -conda install -c conda-forge tqdm --yes -conda install -c anaconda beautifulsoup4 --yes -conda install -c anaconda pandas --yes conda install openbabel --yes conda install -c conda-forge rdkit --yes ``` @@ -25,7 +19,6 @@ conda install -c conda-forge rdkit --yes * If you want to use Tinker9's gpu dynamics, make sure that your bashrc for each Tinker9 env contains the below export statement as well as function for dynamics_gpu (to call GPU dynamics and not CPU dynamics) ``` export GPUDYNAMICS=True - ``` * https://ilthermo.boulder.nist.gov/ @@ -38,36 +31,60 @@ conda activate FBTest export PATH=/home/bdw2292/NewestTinker/bin:$PATH ``` * Make sure to copy files from modified forcebalance to conda site packages (for example mine are located /home/bdw2292/miniconda3/envs/FBTest/lib/python3.8/site-packages/forcebalance/) -* If you just want to use the NIST parser +* Make a folder for input/outputs from ForceBalence and navigate to that folder +* Make a file called forcebalancepoltype.ini , inputs will go in here +* Call script via ``` -python forcebalancepoltypeinterface.py --smiles=C(Cl)(Cl)(Cl)Cl -python forcebalancepoltypeinterface.py --smiles=C(Cl)(Cl)(Cl)Cl --printnames -python forcebalancepoltypeinterface.py --smiles=C(Cl)(Cl)(Cl)Cl --truename=Tetrachloromethane -python forcebalancepoltypeinterface.py --truename=Water +python /home/bdw2292/FBInterface/forcebalancepoltypeinterface.py ``` -* If you want to use NIST parser and grab data/files from poltype job do set up Force Balance job -* Make a folder for input/outputs from ForceBalence and navigate to that folder +* Example input ``` -python /home/bdw2292/FBInterface/forcebalancepoltypeinterface.py --poltypepath=/home/bdw2292/TestDaemonSubmissionScript/DrugTestMolecules/944 --vdwtypes=401,402 +poltypepathlist=/home/bdw2292/PoltypeJobs/HalogenPaperMolecules/CBr4,/home/bdw2292/PoltypeJobs/HalogenPaperMolecules/CF4 +vdwtypeslist=401 402 , 401 402 +temperature_list= 300 250 , 300 230 350 +pressure_list= 1 1 , 1 1 1 +density_list=1000 1000 , 1000 1000 1000 +fittypestogether=401 402 , 401 402 ``` +* In the example above, fittypestogether reads fit 401 from molecule 1 and 401 from molecule 2 together, and also fit 402 from molecule 1 and 402 from molecule 2 together +* By default all types in key files are reassigned new type numbers so there is no overlap while fitting together. So input types will be converted internally. +* temperature_list, pressure_list and density_list are required. +* Density units are Kg/m^3 +* Enthalpy of vaporization units kJ/mol +* Thermal expansion units 1/K +* Isothermal compressibility units are 1/bar +* Isobaric heat capacity units are kJ/mol.K +* pressure units are atm ``` -poltypepath Path to completed poltypejob -vdwtypes List of vdw types to parameterize -liquid_equ_steps Equilibrium steps MD -liquid_prod_steps Production dynamic steps MD -liquid_timestep Time step for liquid MD -liquid_interval -gas_equ_steps Equilibrium steps MD -gas_prod_steps Production dynamic steps MD +poltypepathlist Comma seperated list of Paths to completed poltypejobs +vdwtypes Comma seperated list of vdw types lists to parameterize +temperature_list Comma seperated list of temperatures +pressure_list Comma seperated list of pressures +enthalpy_of_vaporization_list Comma seperated list of heat of vaporizations +enthalpy_of_vaporization_err_list Comma seperated list of heat of vaporizations error +surface_tension_list Comma seperated list of surface tensions +surface_tension_err_list Comma seperated list of surface tension errors +relative_permittivity_list Comma seperated list of relative permittivity +relative_permittivity_err_list Comma seperated list of relative permittivity errors +isothermal_compressibility_list Comma seperated list of isothermal_compressibility +isothermal_compressibility_err_list Comma seperated list of isothermal_compressibility errors +isobaric_coefficient_of_volume_expansion_list Comma seperated list of isobaric_coefficient_of_volume_expansion +isobaric_coefficient_of_volume_expansion_err_list Comma seperated list of isobaric_coefficient_of_volume_expansion errors +heat_capacity_at_constant_pressure_list Comma seperated list of heat_capacity +heat_capacity_at_constant_pressure_err_list Comma seperated list of heat_capacity errors +density_list Comma seperated list of density +density_err_list Comma seperated list of density errors +citation_list Comma seperated list of citations +liquid_equ_steps Equilibrium steps MD +liquid_prod_steps Production dynamic steps MD +liquid_timestep Time step for liquid MD +liquid_interval +gas_equ_steps Equilibrium steps MD +gas_prod_steps Production dynamic steps MD gas_timestep gas_interval -md_threads CPU cores -liquid_prod_time Total time liquid sim -gas_prod_time Total time gas sim -nvtprops This controls whether to include surface tension or not (NVT) property -skipNIST This will skip parsing NIST and generation of data.csv -density This will input density for liquid.xyz - - - +md_threads CPU cores +liquid_prod_time Total time liquid sim +gas_prod_time Total time gas sim +nvtprops This controls whether to include surface tension or not (NVT) property ``` diff --git a/tools/PoltypeInterface/forcebalancepoltypeinterface.py b/tools/PoltypeInterface/forcebalancepoltypeinterface.py index 829a1af5d..27dcd362d 100644 --- a/tools/PoltypeInterface/forcebalancepoltypeinterface.py +++ b/tools/PoltypeInterface/forcebalancepoltypeinterface.py @@ -1,38 +1,40 @@ import os, numpy as np -import pyilt2 import sys -import cirpy -import pint -from pint import UnitRegistry import csv import getopt -from tqdm import tqdm import shutil import openbabel from rdkit.Chem import rdmolfiles from rdkit.Chem import Descriptors -import itertools -from bs4 import BeautifulSoup # for parsing NIST -import requests import re -import pandas as pd import numpy as np from rdkit import Chem import subprocess +import itertools + +poltypepathlist=None +vdwtypeslist=None +temperature_list=None +pressure_list=None +enthalpy_of_vaporization_list=None +enthalpy_of_vaporization_err_list=None +surface_tension_list=None +surface_tension_err_list=None +relative_permittivity_list=None +relative_permittivity_err_list=None +isothermal_compressibility_list=None +isothermal_compressibility_err_list=None +isobaric_coefficient_of_volume_expansion_list=None +isobaric_coefficient_of_volume_expansion_err_list=None +heat_capacity_at_constant_pressure_list=None +heat_capacity_at_constant_pressure_err_list=None +density_list=None +density_err_list=None +citation_list=None +fittypestogether=None - -smiles=None -truename=None -printnames=False -searchILDB=False # search NIST by default -poltypepath=None -rep='names' -roomtemp=295.5 -lowertol=10 -uppertol=10 -vdwtypes=None liquid_equ_steps=10000 -liquid_prod_steps=100000 +liquid_prod_steps=5000000 liquid_timestep=1.0 liquid_interval=0.1 gas_equ_steps=500000 @@ -44,613 +46,258 @@ gas_prod_time=1 #ns nvtprops=False # NPT for most props, surface tension requires NVT and force balance complains addwaterprms=True -skipNIST=False -density=1000 # default water density - -opts, xargs = getopt.getopt(sys.argv[1:],'',["smiles=","truename=",'printnames','searchILDB','poltypepath=','vdwtypes=','liquid_equ_steps=','liquid_prod_steps=','liquid_timestep=','liquid_interval=','gas_equ_steps=','gas_prod_steps=','gas_timestep=','gas_interval=','md_threads=','liquid_prod_time=','gas_prod_time=','nvtpros=','skipNIST','density=']) -for o, a in opts: - if o in ("--smiles"): - smiles=a - elif o in ("--truename"): - truename=a.capitalize() # the database has first letter capitalized - elif o in ("--printnames"): - printnames=True - elif o in ("--searchILDB"): - searchILDB=False - elif o in ("--poltypepath"): - poltypepath=a - elif o in ("--vdwtypes"): - vdwtypes=a.split(',') - vdwtypes=[i.lstrip().rstrip() for i in vdwtypes] - elif o in ("--liquid_equ_steps"): + +def ReturnListOfList(string): + newlist=string.split(',') + templist=[] + for ele in newlist: + nums=ele.lstrip().rstrip().split() + temp=[] + for e in nums: + temp.append(int(e)) + templist.append(temp) + newlist=templist + return newlist + +temp=open(os.getcwd()+r'/'+'forcebalancepoltype.ini','r') +results=temp.readlines() +temp.close() +for line in results: + if '#' not in line and line!='\n': + if '=' in line: + linesplit=line.split('=',1) + a=linesplit[1].replace('\n','').rstrip().lstrip() + newline=linesplit[0] + if a=='None': + continue + else: + newline=line + + if "poltypepathlist" in newline: + poltypepathlist=a.split(',') + elif "fittypestogether" in newline: + fittypestogether=ReturnListOfList(a) + elif "vdwtypeslist" in newline: + vdwtypeslist=ReturnListOfList(a) + elif "citation_list" in newline: + citation_list=ReturnListOfList(a) + elif "temperature_list" in newline: + temperature_list=ReturnListOfList(a) + elif "pressure_list" in newline: + pressure_list=ReturnListOfList(a) + elif "enthalpy_of_vaporization_list" in newline: + enthalpy_of_vaporization_list=ReturnListOfList(a) + elif "enthalpy_of_vaporization_err_list" in newline: + enthalpy_of_vaporization_err_list=ReturnListOfList(a) + elif "surface_tension_list" in newline: + surface_tension_list=ReturnListOfList(a) + elif "surface_tension_err_list" in newline: + surface_tension_err_list=ReturnListOfList(a) + elif "relative_permittivity_list" in newline: + relative_permittivity_list=ReturnListOfList(a) + elif "relative_permittivity_err_list" in newline: + relative_permittivity_err_list=ReturnListOfList(a) + elif "isothermal_compressibility_list" in newline: + isothermal_compressibility_list=ReturnListOfList(a) + elif "isothermal_compressibility_err_list" in newline: + isothermal_compressibility_err_list=ReturnListOfList(a) + elif "isobaric_coefficient_of_volume_expansion_list" in newline: + isobaric_coefficient_of_volume_expansion_list=ReturnListOfList(a) + elif "isobaric_coefficient_of_volume_expansion_err_list" in newline: + isobaric_coefficient_of_volume_expansion_err_list=ReturnListOfList(a) + elif "heat_capacity_at_constant_pressure_list" in newline: + heat_capacity_at_constant_pressure_list=ReturnListOfList(a) + elif "heat_capacity_at_constant_pressure_err_list" in newline: + heat_capacity_at_constant_pressure_err_list=ReturnListOfList(a) + elif "density_list" in newline: + density_list=ReturnListOfList(a) + elif "density_err_list" in newline: + density_err_list=ReturnListOfList(a) + elif "liquid_equ_steps" in newline: liquid_equ_steps=int(a) - elif o in ('--liquid_prod_steps'): + elif 'liquid_prod_steps' in newline: liquid_prod_steps=int(a) - elif o in ('--liquid_timestep'): + elif 'liquid_timestep' in newline: liquid_timestep=int(a) - elif o in ('--liquid_interval'): + elif 'liquid_interval' in newline: liquid_interval=float(a) - elif o in ('--gas_equ_steps'): + elif 'gas_equ_steps' in newline: gas_equ_steps=int(a) - elif o in ('--gas_prod_steps'): + elif 'gas_prod_steps' in newline: gas_prod_steps=int(a) - elif o in ('--gas_timestep'): + elif 'gas_timestep' in newline: gas_timestep=float(a) - elif o in ('--gas_interval'): + elif 'gas_interval' in newline: gas_interval=float(a) - elif o in ('--md_threads'): + elif 'md_threads' in newline: md_threads=int(a) - elif o in ('--liquid_prod_time'): + elif 'liquid_prod_time' in newline: liquid_prod_time=float(a) - elif o in ('--gas_prod_time'): + elif 'gas_prod_time' in newline: gas_prod_time=float(a) - elif o in ('--nvtprops'): + elif 'nvtprops' in newline: nvtprops=True - elif o in ('--skipNIST'): - skipNIST=True - elif o in ('--density'): - density=float(a) +if temperature_list==None: + raise ValueError('No temperature data') +if pressure_list==None: + raise ValueError('No pressure data') +if density_list==None: + raise ValueError('No density data') -gas_prod_steps=int(1000000*gas_prod_time/gas_timestep) -liquid_prod_steps=int(1000000*liquid_prod_time/liquid_timestep) +def ShapeOfArray(array): + dimlist=[] + rows=len(array) + dimlist.append(rows) + for i in range(len(array)): + row=array[i] + cols=len(row) + dimlist.append(cols) + return dimlist -# originally taken from https://github.com/sabidhasan/NistPy -# modified to take inputs for force balance -class NistCompoundById(object): - '''This class creates a NIST compound using a provided NIST code. - NIST identifying codes consist of a letter followed by several numbers''' - - #A search result is NistResult object. It's instantiated is False. This is for user - #to see whether the object has been instantaited in a friendly manner. Really you can - #just do type(object); if it's NistCpdById then it is instantiated; if NistResult, it's not. - INSTANTIATED = True - - @staticmethod - def extract_CAS(cas_string): - '''Extracts a CAS number using RegEx from a given string cas_string''' - reg = re.search(r'\d{2,7}-\d{2}-\d', cas_string) - if reg: - return reg.group(0) - return None - - def __init__(self, id, souped_page=None): - if souped_page==None: - cpd_url = "http://webbook.nist.gov/cgi/cbook.cgi?ID=%s" % id - cpd_soup = download_page(cpd_url) - - if cpd_soup is None: - #download failed - return None - else: - #we are given a souped page already! - cpd_soup = souped_page - - #check for erroneous number - if "Registry Number Not Found" in cpd_soup: - print("" % id) - return None - - #Set compound name - self.name = cpd_soup.find('h1').text - self.id = id - - - - def __str__(self): - return 'Compound %s' % self.name - - def __repr__(self): - return "NistCompoundById('%s')" % self.id - - def _get_fluid_data(self,cid,temp,plow=0,phigh=2,pinc=.01,table=0): - - url='https://webbook.nist.gov/cgi/fluid.cgi?Action=Load&ID='+str(cid)+'&Type=IsoTherm&Digits=5&PLow='+str(plow)+'&PHigh='+str(phigh)+'&PInc='+str(pinc)+'&T='+str(temp)+'&RefState=DEF&TUnit=K&PUnit=atm&DUnit=kg%2Fm3&HUnit=kJ%2Fmol&WUnit=m%2Fs&VisUnit=uPa*s&STUnit=N%2Fm' - prop_soup = download_page(url) - prop_table = prop_soup.find_all("table")[table].find_all('tr') - table=[] - for row in prop_table: - subrow=[] - if len(row.find_all('td')) > 0: - for j in range(14): - subrow.append(row.find_all('td')[j].text) - elif len(row.find_all('th')) > 0: - for j in range(14): - subrow.append(row.find_all('th')[j].text) - table.append(subrow) - - return np.array(table) - - def _get_fluid_Saturation_data(self,cid,tlow=50,thigh=350,tinc=1,table=0): # for surface tension - url='https://webbook.nist.gov/cgi/fluid.cgi?Action=Load&ID='+str(cid)+'&Type=SatP&Digits=5&THigh='+str(thigh)+'&'+str(tlow)+'=50&TInc='+str(tinc)+'&RefState=DEF&TUnit=K&PUnit=atm&DUnit=kg%2Fm3&HUnit=kJ%2Fmol&WUnit=m%2Fs&VisUnit=uPa*s&STUnit=N%2Fm' - prop_soup = download_page(url) - prop_table = prop_soup.find_all("table")[table].find_all('tr') - table=[] - for row in prop_table: - subrow=[] - if len(row.find_all('td')) > 0: - for j in range(14): - subrow.append(row.find_all('td')[j].text) - elif len(row.find_all('th')) > 0: - for j in range(14): - subrow.append(row.find_all('th')[j].text) - table.append(subrow) - - - return np.array(table) - - def _get_PhaseChange_data(self,cid,table=2): - - prop_url = "https://webbook.nist.gov/cgi/cbook.cgi?ID="+str(cid)+"&Mask=4#"+"Thermo-Phase" - prop_soup = download_page(prop_url) - - tables=prop_soup.find_all("table") - - thetab=tables[2] - content=thetab.find_all('td') - hcontent=thetab.find_all('th') - - table=[] - header=[] - for row in hcontent: - header.append(row.text) - foundenthalpy=False - for e in header: - if 'vapH' in e: - foundenthalpy=True - if foundenthalpy==False: - return table - table.append(header) - count=0 - ls=[] - for rowidx in range(len(content)): - row=content[rowidx] - if count==len(header): - count=0 - if count==0: - if len(ls)!=0: - table.append(ls) - ls=[] - value=row.text - count+=1 - if value.strip()=='': - value='N/A' - ls.append(value) - - - return table - - - - -def download_page(url): - '''This function downloads a page given and URL. If fail, it returns a status-code''' - page = requests.get(url) - page_content = page.content - #test for erroneous download - if page.status_code != 200: - print("" % cpd_page.status_code) - return None - - return BeautifulSoup(page_content, 'html.parser') - -class NistResult(object): - '''NistResult class is used to return search results. This class is like a - NistCompoundById but only has id and name. It has the instantiate method - to elaborate and return NistCompoundById objects''' - - INSTANTIATED = False - - def __init__(self, id_num, name, souped_page=None): - self.id = id_num - self.name = name - self.page = souped_page - - def instantiate(self): - #This will instantiate the compound - if self.page is None: - self.page = download_page("http://webbook.nist.gov/cgi/cbook.cgi?ID=%s" % self.id) - - return NistCompoundById(self.id, souped_page=self.page) - - def __str__(self): - return self.id - - def __repr__(self): - return 'NistResult(%s, %s)' % (self.id, self.name) - -def search_nist(options=None, instantiate=False, **kwargs): - '''Search NIST database for string search_str using the search keyword [formula, name, inchi key, CAS number, - structure]. If instantiate is selected, then it returns NistCompoundById object (which has a bunch of data within it) - Otherwise it returns a NistResult object, which only has the name and ID code and must be called with the - .instantiate() method before further use''' - - #Error checking - if len(kwargs) != 1: - print("" % len(kwargs)) - return None - search_type=list(kwargs.keys())[0] - search_str=list(kwargs.values())[0] - - #Check for value of kwarg - types = { - 'formula': "http://webbook.nist.gov/cgi/cbook.cgi?Formula=%s" % search_str, - 'name' : "http://webbook.nist.gov/cgi/cbook.cgi?Name=%s" % search_str, - 'inchi' : "http://webbook.nist.gov/cgi/cbook.cgi?InChI=%s" % search_str, - 'cas' : "http://webbook.nist.gov/cgi/cbook.cgi?ID=%s" % search_str, - } - if not(search_type) in types: - print("" % types.keys()) - return None - - #Download the search page, and check to see whether it's a single compound - search_page = download_page(types[search_type]) - #will be returned to user - search_results = [] - - if "Search Results" in search_page.text: - #Loop through all results. The results are in an ordered list! - - for raw_result in search_page.ol.find_all('li'): - id_code = re.search(r'ID=([A-Za-z]\d{1,})', raw_result.a['href']).group(1) - name = raw_result.a.text - if instantiate == True: - search_results.append(NistResult(id_code, name).instantiate()) - else: - search_results.append(NistResult(id_code, name)) - #there is only one search result! - else: - #Find the ID (basically it's the ID-like text that appears the most on the page!) - links_on_page = [] - #loop through all the links - for link in search_page.find_all('a'): - curr_href = link.attrs.get('href') - #sometimes, there is no hfref (eg. it's an anchor or something), so check for NoneType - if curr_href is not None and re.search(r'ID=([A-Za-z]\d{1,})', curr_href): - #add the current link's ID code - #group(0) is the entire search result, so group(1) is the bracketed thing in the search query - links_on_page.append(re.search(r'ID=([A-Za-z]\d{1,})', curr_href).group(1)) - if len(links_on_page)==0: - raise ValueError('NIST Name search failed') - id_code = max(links_on_page, key=links_on_page.count) - - name = search_page.title.text - - if instantiate == True: - search_results.append(NistResult(id_code, name, souped_page=search_page).instantiate()) - else: - search_results.append(NistResult(id_code, name, souped_page=search_page)) - - return search_results - - - - -def ConvertSmilestoNames(smiles,rep): - results=cirpy.query(smiles, rep) - if len(results)==0: - raise ValueError('SMILES could not be converted to name') - else: - return results[0].value +def CheckInputShapes(listofarrays): + combs=itertools.combinations(listofarrays, 2) + for comb in combs: + arr1=comb[0] + arr2=comb[1] + shape1=ShapeOfArray(arr1) + shape2=ShapeOfArray(arr2) + if shape1!=shape2: + raise ValueError('Input dimensions for Temperature, Pressure or Density are not the same') -def SanitizeUnit(currentunit): - if currentunit!=None: - currentunit=currentunit.replace('m3','m**3') +def GenerateNoneList(targetshape): + ls=[] + rows=targetshape[0] + cols=targetshape[1:] + for i in range(rows): + colnum=cols[i] + newls=[] + for j in range(colnum): + newls.append(None) + ls.append(newls) + return ls - return currentunit +CheckInputShapes([temperature_list,pressure_list,density_list]) +numberofmolecules=len(poltypepathlist) +targetshape=ShapeOfArray(temperature_list) +if enthalpy_of_vaporization_list==None: + enthalpy_of_vaporization_list=GenerateNoneList(targetshape) -def QueryLiquidProperties(names,truename=None,printnames=False): - if truename==None: - foundname=False - else: - foundname=True - thename=truename - foundnames=[] - foundhit=False - ureg = UnitRegistry() - fbabbrtotargetunits={'Eps0':'debye**2/(nm**3 .J)','Eps0_err':'debye**2/(nm**3 .J)','Cp':'kJ/(mol.K)','Cp_err':'kJ/(mol.K)','Kappa':'1/bar','Kappa_err':'1/bar','Alpha':'1/K','Alpha_err':'1/K','Surf_Ten':'mJ/m**2','Surf_Ten_err':'mJ/m**2','T':'K','P':'atm','Rho':'kg/m**3','Rho_err':'kg/m**3','Hvap':'kJ/mol','Hvap_err':'kJ/mol'} - nistnametofbabbr={'Enthalpy_of_vaporization_or_sublimation':'Hvap', 'Delta[Enthalpy_of_vaporization_or_sublimation]':'Hvap_err','Surface_tension_liquid-gas':'Surf_Ten', 'Delta[Surface_tension_liquid-gas]':'Surf_Ten_err','Relative_permittivity_at_zero_frequency':'Eps0', 'Delta[Relative_permittivity_at_zero_frequency]':'Eps0_err','Isothermal_compressibility':'Kappa', 'Delta[Isothermal_compressibility]':'Kappa_err','Isobaric_coefficient_of_volume_expansion':'Alpha', 'Delta[Isobaric_coefficient_of_volume_expansion]':'Alpha_err','Heat_capacity_at_constant_pressure*':'Cp', 'Delta[Heat_capacity_at_constant_pressure*]':'Cp_err','Pressure':'P', 'Temperature':'T','Specific_density':'Rho', 'Delta[Specific_density]':'Rho_err','Specific_density*':'Rho', 'Delta[Specific_density*]':'Rho_err','Heat_capacity_at_constant_pressure':'Cp', 'Delta[Heat_capacity_at_constant_pressure]':'Cp_err'} - desiredprops=['Isothermal compressibility','Heat capacity at constant pressure','Density','Isobaric coefficient of volume expansion','Surface tension liquid-gas','Relative permittivity',"Enthalpy of vaporization or sublimation"] - propertynamearray=list(fbabbrtotargetunits.keys()) - refstoproptoarray={} - for name in names: - if foundname==True and printnames==False: - if name==thename: - pass - else: - continue +if enthalpy_of_vaporization_err_list==None: + enthalpy_of_vaporization_err_list=GenerateNoneList(targetshape) - for prop,aprop in tqdm(pyilt2.prop2abr.items(),desc='Property search for '+name): - if prop in desiredprops: - results = pyilt2.query(comp = name,prop=aprop) - - length=len(results.refs) - if length>0: - foundhit=True - if name not in foundnames: - foundnames.append(name) - if printnames==False: - if foundname==False: - foundname=True - thename=name - for hit in results.refs: - hitrefdict=hit.refDict - hitref=hitrefdict['ref'] - if hitref not in refstoproptoarray.keys(): - ls=[None for i in propertynamearray] - dic=dict(zip(propertynamearray,ls)) - refstoproptoarray[hitref]=dic - try: - dataset=hit.get() - except: - print('Error, in accessing database!') - continue - props=dataset.physProps - units=dataset.physUnits - data=dataset.data - fullref=dataset.fullcite - refstoproptoarray[hitref]['cite']=fullref - refstoproptoarray[hitref]['name']=thename - for pidx in range(len(props)): - p=props[pidx] - currentunit=units[pidx] - if p in nistnametofbabbr.keys() and currentunit==None: - break - currentunit=SanitizeUnit(currentunit) - col=data[:,pidx] - if 'fraction' not in p and 'MolaLity' not in p and 'MolaRity' not in p and 'Mole' not in p and 'Molar' not in p: - fbabbr=nistnametofbabbr[p] - targetunit=fbabbrtotargetunits[fbabbr] - if currentunit!=targetunit: - value=str(1) - string=value+' * '+currentunit+' to '+targetunit - src, dst = string.split(' to ') - Q_ = ureg.Quantity - convobj=Q_(src).to(dst) - convfactor=convobj._magnitude - converted=col*convfactor - refstoproptoarray[hitref][fbabbr]=converted - else: - refstoproptoarray[hitref][fbabbr]=col - if printnames==True: - print('possible names',foundnames) - sys.exit() - if foundhit==False: - raise ValueError('no references found for name '+thename) - return refstoproptoarray - -def SortReferences(refstoproptoarray,searchILDB): - sortedrefstoproptoarray={} - refstodates={} - for ref in refstoproptoarray.keys(): - if searchILDB==True: - first='(' - last=')' - start = ref.rindex( first ) + len( first ) - end = ref.rindex( last, start ) - string=ref[start:end] - numstring=[e for e in string if e.isdigit()==True] - numstring=''.join(numstring) - num=int(numstring) - else: - if ',' in ref: - refsplit=ref.split(',') - datestring=refsplit[-1] - datestring=datestring.lstrip().rstrip() - num=int(datestring) - else: - num=0 - refstodates[ref]=num - sortedreftodates=dict(sorted(refstodates.items(), key=lambda item: item[1],reverse=True)) # later dates first - for sortedref,date in sortedreftodates.items(): - proptoarray=refstoproptoarray[sortedref] - sortedrefstoproptoarray[sortedref]=proptoarray - +if surface_tension_list==None: + surface_tension_list=GenerateNoneList(targetshape) - return sortedrefstoproptoarray +if surface_tension_err_list==None: + surface_tension_err_list=GenerateNoneList(targetshape) -def PropertyToReferences(sortedrefstoproptoarray): - proptorefs={} - for sortedref,proptoarray in sortedrefstoproptoarray.items(): - for prop in proptoarray.keys(): - if prop!='cite' and prop!='name' and 'err' not in prop and prop!='T' and prop!='P': - try: - value=proptoarray[prop] - if len(value)>0: - if prop not in proptorefs.keys(): - proptorefs[prop]=[] - if sortedref not in proptorefs[prop]: - proptorefs[prop].append(sortedref) - except: - continue - if len(proptorefs.keys())==0: - raise ValueError('Missing property data!') - return proptorefs - - -def GrabUniqueProps(proptoarray): - uniqueprops=[] - for prop,array in proptoarray.items(): - if prop!='name' and prop!='cite' and 'err' not in prop and prop!='T' and prop!='P': - try: - length=len(array) - if length>0: - uniqueprops.append(prop) - except: - pass - - return tuple(set(uniqueprops)) - -def RoundTPData(sortedrefstoproptoarray,decimalplaces): - for ref,proptoarray in sortedrefstoproptoarray.items(): - tarray=proptoarray['T'] - parray=proptoarray['P'] - try: # might not be an P data - parray=[round(i,decimalplaces) for i in parray] - except: - pass - - first=tarray[0] - if '-' in first: - firstsplit=first.split('-') - firsttemp=firstsplit[0].lstrip().rstrip() - if firsttemp[-1]=='.': - firsttemp=firsttemp[:-1] - secondtemp=firstsplit[1].lstrip().rstrip() - if secondtemp[-1]=='.': - secondtemp=secondtemp[:-1] - firsttemp=int(firsttemp) - secondtemp=int(secondtemp) - tarray=np.arange(firsttemp, secondtemp, 0.01).tolist() - tarray=[float(i) for i in tarray] - tarray=[round(i,decimalplaces) for i in tarray] - sortedrefstoproptoarray[ref]['T']=tarray - sortedrefstoproptoarray[ref]['P']=parray - - - return sortedrefstoproptoarray - -def CountTPFrequency(sortedrefstoproptoarray): - uniquepropstotemppressurecounts={} - for ref,proptoarray in sortedrefstoproptoarray.items(): - tarray=proptoarray['T'] - parray=proptoarray['P'] - setuniqueprops=GrabUniqueProps(proptoarray) - if setuniqueprops not in uniquepropstotemppressurecounts.keys(): - uniquepropstotemppressurecounts[setuniqueprops]={} - for i in range(len(tarray)): - T=tarray[i] - try: - P=parray[i] - except: - P=1 # assume atmospheric but better be safe and check! - tp=tuple([T,P]) - if tp not in uniquepropstotemppressurecounts[setuniqueprops].keys(): - uniquepropstotemppressurecounts[setuniqueprops][tp]=0 - uniquepropstotemppressurecounts[setuniqueprops][tp]+=1 - temppressurecounts={} - for uniqueprop,tptocounts in uniquepropstotemppressurecounts.items(): - for tp in tptocounts.keys(): - if tp not in temppressurecounts.keys(): - temppressurecounts[tp]=0 - temppressurecounts[tp]+=1 - sortedtemppressurecounts=dict(sorted(temppressurecounts.items(), key=lambda item: item[1],reverse=True)) - - return sortedtemppressurecounts - - -def GrabNearestTPPoint(temp,tppoints): - difftotppoint={} - for tp in tppoints: - t=tp[0] - p=tp[1] - diff=np.abs(t-temp) - difftotppoint[diff]=tp - mindiff=min(difftotppoint.keys()) - mintp=difftotppoint[mindiff] - return mintp - - - -def GrabTPPoints(proptoarray): - tppoints=[] - tarray=proptoarray['T'] - parray=proptoarray['P'] - for i in range(len(tarray)): - T=tarray[i] - try: - P=parray[i] - except: - P=1 - tp=tuple([T,P]) - tppoints.append(tp) +if relative_permittivity_list==None: + relative_permittivity_list=GenerateNoneList(targetshape) +if relative_permittivity_err_list==None: + relative_permittivity_err_list=GenerateNoneList(targetshape) - return tppoints +if isothermal_compressibility_list==None: + isothermal_compressibility_list=GenerateNoneList(targetshape) +if isothermal_compressibility_err_list==None: + isothermal_compressibility_err_list=GenerateNoneList(targetshape) -def GrabPropValue(T,tarray,array): - try: # sometimes no error array: - length=len(array) +if isobaric_coefficient_of_volume_expansion_list==None: + isobaric_coefficient_of_volume_expansion_list=GenerateNoneList(targetshape) - except: # return None if no error is reported - return None - for i in range(len(tarray)): - t=tarray[i] - value=array[i] - if t==T: - return value +if isobaric_coefficient_of_volume_expansion_err_list==None: + isobaric_coefficient_of_volume_expansion_err_list=GenerateNoneList(targetshape) +if heat_capacity_at_constant_pressure_list==None: + heat_capacity_at_constant_pressure_list=GenerateNoneList(targetshape) -def FindMinimalTPPointsAllProps(tppoint,proptorefs,sortedrefstoproptoarray,truename): - tptoproptovalue={} - T=tppoint[0] - for prop,refs in proptorefs.items(): - for ref in refs: - proptoarray=sortedrefstoproptoarray[ref] - tppoints=GrabTPPoints(proptoarray) - if 'cite' in proptoarray.keys(): - cite=proptoarray['cite'] - else: - cite=ref - if 'name' in proptoarray.keys(): - name=proptoarray['name'] - else: - name=truename - if tppoint in tppoints: # else need to find nearest TP point - truepoint=tppoint - else: - othertppoint=GrabNearestTPPoint(T,tppoints) - truepoint=othertppoint - if truepoint not in tptoproptovalue.keys(): - tptoproptovalue[truepoint]={} - tptoproptovalue[truepoint]['cite']=cite - tptoproptovalue[truepoint]['name']=name - for prop,array in proptoarray.items(): - errprop=prop+'_err' - length=0 - if prop!='T' and prop!='P': - try: - length=len(array) - if length>0: - array=proptoarray[prop] - tarray=proptoarray['T'] - value=GrabPropValue(T,tarray,array) - array=proptoarray[errprop] - errvalue=GrabPropValue(T,tarray,array) - tptoproptovalue[truepoint][prop]=value - tptoproptovalue[truepoint][errprop]=errvalue - except: - - - if prop not in tptoproptovalue[truepoint].keys(): - tptoproptovalue[truepoint][prop]=None - tptoproptovalue[truepoint][errprop]=None +if heat_capacity_at_constant_pressure_err_list==None: + heat_capacity_at_constant_pressure_err_list=GenerateNoneList(targetshape) - - break # find the first reference with data point, refs sorted by year, grab most recent - +if density_list==None: + density_list=GenerateNoneList(targetshape) - return tptoproptovalue +if density_err_list==None: + density_err_list=GenerateNoneList(targetshape) +if citation_list==None: + citation_list=GenerateNoneList(targetshape) -def GrabTPPointOutsideBound(tppoint,tol,tppoints,string): - T=tppoint[0] - if string=='low': - bound=T-tol - elif string=='upper': - bound=T+tol - for pt in tppoints: - t=pt[0] - if string=='low': - if t<=bound: - return pt # grab first instance (sorted by highest occuring minimize # TP points) - elif string=='upper': - if t>=bound: - return pt - + +gas_prod_steps=int(1000000*gas_prod_time/gas_timestep) +liquid_prod_steps=int(1000000*liquid_prod_time/liquid_timestep) + + + +def CombineData(temperature_list,pressure_list,enthalpy_of_vaporization_list,enthalpy_of_vaporization_err_list,surface_tension_list,surface_tension_err_list,relative_permittivity_list,relative_permittivity_err_list,isothermal_compressibility_list,isothermal_compressibility_err_list,isobaric_coefficient_of_volume_expansion_list,isobaric_coefficient_of_volume_expansion_err_list,heat_capacity_at_constant_pressure_list,heat_capacity_at_constant_pressure_err_list,density_list,density_err_list,citation_list): + listoftptopropdics=[] + for i in range(len(temperature_list)): + temperatures=temperature_list[i] + pressures=pressure_list[i] + enthalpies=enthalpy_of_vaporization_list[i] + enthalpies_err=enthalpy_of_vaporization_err_list[i] + surf_tens=surface_tension_list[i] + surf_tens_err=surface_tension_err_list[i] + perms=relative_permittivity_list[i] + perms_err=relative_permittivity_err_list[i] + compress=isothermal_compressibility_list[i] + compress_err=isothermal_compressibility_err_list[i] + volumeexp=isobaric_coefficient_of_volume_expansion_list[i] + volumeexp_err=isobaric_coefficient_of_volume_expansion_err_list[i] + heatcap=heat_capacity_at_constant_pressure_list[i] + heatcap_err=heat_capacity_at_constant_pressure_err_list[i] + densities=density_list[i] + densities_err=density_err_list[i] + citations=citation_list[i] + tptoproptovalue={} + for j in range(len(temperatures)): + temp=temperatures[j] + pressure=pressures[j] + tp=tuple([temp,pressure]) + tptoproptovalue[tp]={} + enthalpy=enthalpies[j] + enthalpy_err=enthalpies_err[j] + surf_ten=surf_tens[j] + surf_ten_err=surf_tens_err[j] + perm=perms[j] + perm_err=perms_err[j] + comp=compress[j] + comp_err=compress_err[j] + volexp=volumeexp[j] + volexp_err=volumeexp_err[j] + cap=heatcap[j] + cap_err=heatcap_err[j] + density=densities[j] + density_err=densities_err[j] + citation=citations[j] + tptoproptovalue[tp]['T']=temp + tptoproptovalue[tp]['P']=pressure + tptoproptovalue[tp]['Hvap']=enthalpy + tptoproptovalue[tp]['Hvap_err']=enthalpy_err + tptoproptovalue[tp]['Surf_Ten']=surf_ten + tptoproptovalue[tp]['Surf_Ten_err']=surf_ten_err + tptoproptovalue[tp]['Eps0']=perm + tptoproptovalue[tp]['Eps0_err']=perm_err + tptoproptovalue[tp]['Kappa']=comp + tptoproptovalue[tp]['Kappa_err']=comp_err + tptoproptovalue[tp]['Alpha']=volexp + tptoproptovalue[tp]['Alpha_err']=volexp_err + tptoproptovalue[tp]['Cp']=cap + tptoproptovalue[tp]['Cp_err']=cap_err + tptoproptovalue[tp]['Rho']=density + tptoproptovalue[tp]['Rho_err']=density_err + tptoproptovalue[tp]['cite']=citation + + listoftptopropdics.append(tptoproptovalue) + return listoftptopropdics + +listoftptopropdics=CombineData(temperature_list,pressure_list,enthalpy_of_vaporization_list,enthalpy_of_vaporization_err_list,surface_tension_list,surface_tension_err_list,relative_permittivity_list,relative_permittivity_err_list,isothermal_compressibility_list,isothermal_compressibility_err_list,isobaric_coefficient_of_volume_expansion_list,isobaric_coefficient_of_volume_expansion_err_list,heat_capacity_at_constant_pressure_list,heat_capacity_at_constant_pressure_err_list,density_list,density_err_list,citation_list) + + def AddDefaultValues(tptoproptovalue): for tp,proptovalue in tptoproptovalue.items(): globaldic={} @@ -681,13 +328,13 @@ def AddDefaultValues(tptoproptovalue): return tptoproptovalue -def WriteCSVFile(listoftpdics,nvtprops): +def WriteCSVFile(listoftpdics,nvtprops,molname): firsttpdic=listoftpdics[0] firsttpdicvalues=list(firsttpdic.values()) firsttppointvalues=firsttpdicvalues[0] firstglobaldic=firsttppointvalues['global'] nvtproperties=['Surf_Ten'] - with open('data.csv', mode='w') as write_file: + with open('data'+'_'+molname+'.csv', mode='w') as write_file: writer = csv.writer(write_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL) for keyword,value in firstglobaldic.items(): ls=['Global',keyword,value] @@ -698,9 +345,7 @@ def WriteCSVFile(listoftpdics,nvtprops): listoftpcommentrows=[] for tpdic in listoftpdics: for tp,proptovalue in tpdic.items(): - name=proptovalue['name'] citation=proptovalue['cite'] - namels=['# Name',name] refls=['# Ref',citation] propls=['T','P'] propvaluels=[str(tp[0]),str(tp[1])+' '+'atm'] @@ -708,9 +353,9 @@ def WriteCSVFile(listoftpdics,nvtprops): properrvaluels=[] commentpropvaluels=['# '+str(tp[0]),str(tp[1])+' '+'atm'] - ls=[namels,refls,commentpropvaluels] + ls=[refls,commentpropvaluels] for prop,value in proptovalue.items(): - if prop!='name' and prop!='cite' and 'wt' not in prop and 'err' not in prop and prop!='T' and prop!='P' and 'global' not in prop: + if prop!='cite' and 'wt' not in prop and 'err' not in prop and prop!='T' and prop!='P' and 'global' not in prop: if value==None: continue if nvtprops==False and prop in nvtproperties: @@ -745,205 +390,69 @@ def WriteCSVFile(listoftpdics,nvtprops): for ls in listoftprows: writer.writerow(ls) -def AddNistData(refstoproptoarray,propertynamearray,table,fbabbrtotargetunits): - ls=[None for i in propertynamearray] - if len(table)==0: - return refstoproptoarray - ureg = UnitRegistry() - tableheader=table[0] - nisttofbkeys={'vapH (kJ/mol)':'Hvap','Temperature (K)':'T','Cp (J/mol*K)':'Cp','Surf. Tension (N/m)':'Surf_Ten','Density (kg/m3)':'Rho'} - if 'Reference' in tableheader: - refidx=tableheader.index('Reference') - else: - refidx=None - for row in table[1:]: - for i in range(len(row)): - tablehead=tableheader[i] - value=row[i] - if tablehead=='Phase': - if value=='vapor': # skip, only want liquid - continue - if tablehead in nisttofbkeys.keys(): - fbvalue=nisttofbkeys[tablehead] - if refidx!=None: - ref=row[refidx] - else: - ref='Unknown' - if tablehead=='Cp (J/mol*K)': # NIST doesnt allow kJ for this so just convert here - value=float(value)*.001 - if tablehead=='Surf. Tension (N/m)': # NIST doesnt allow desired units so convert here - currentunit='N/m' - targetunit=fbabbrtotargetunits[fbvalue] - string=value+' * '+currentunit+' to '+targetunit - src, dst = string.split(' to ') - Q_ = ureg.Quantity - convobj=Q_(src).to(dst) - convfactor=convobj._magnitude - converted=float(value)*convfactor - value=converted - dic=dict(zip(propertynamearray,ls)) - if ref not in refstoproptoarray.keys(): - refstoproptoarray[ref]=dic - if refstoproptoarray[ref][fbvalue]==None: - refstoproptoarray[ref][fbvalue]=[] - refstoproptoarray[ref][fbvalue].append(value) - - return refstoproptoarray - -def QueryNISTProperties(truename,names): - fbabbrtotargetunits={'Eps0':'debye**2/(nm**3 .J)','Eps0_err':'debye**2/(nm**3 .J)','Cp':'kJ/(mol.K)','Cp_err':'kJ/(mol.K)','Kappa':'1/bar','Kappa_err':'1/bar','Alpha':'1/K','Alpha_err':'1/K','Surf_Ten':'mJ/m**2','Surf_Ten_err':'mJ/m**2','T':'K','P':'atm','Rho':'kg/m**3','Rho_err':'kg/m**3','Hvap':'kJ/mol','Hvap_err':'kJ/mol'} - refstoproptoarray={} - if truename!=None: - x = search_nist(name=truename) - else: - for tryname in names: - try: - x = search_nist(name=tryname) - break - except: - continue - - - firstx=x[0]# # by default try first item in search results - y = firstx.instantiate() - temp=300 - try: # query error, no data available (sometimes not fluid data or just wrong temperature) - table=y._get_fluid_data(firstx,temp) - except: - table=None - phasechange=y._get_PhaseChange_data(firstx,temp) - try: - sattable=y._get_fluid_Saturation_data(firstx) - except: - sattable=None +def GenerateLiquidCSVFile(nvtprops,listoftptopropdics,molnamelist): + for i in range(len(listoftptopropdics)): + tptoproptovalue=listoftptopropdics[i] + molname=molnamelist[i] + tptoproptovalue=AddDefaultValues(tptoproptovalue) + WriteCSVFile([tptoproptovalue],nvtprops,molname) + - propertynamearray=list(fbabbrtotargetunits.keys()) - try: - length=len(sattable) - refstoproptoarray=AddNistData(refstoproptoarray,propertynamearray,sattable,fbabbrtotargetunits) - except: - pass - try: - length=len(table) - refstoproptoarray=AddNistData(refstoproptoarray,propertynamearray,table,fbabbrtotargetunits) - except: - pass - try: - length=len(phasechange) - refstoproptoarray=AddNistData(refstoproptoarray,propertynamearray,phasechange,fbabbrtotargetunits) - except: - pass +def ReadInPoltypeFiles(poltypepathlist): + dimertinkerxyzfileslist=[] + dimerenergieslist=[] + dimersplogfileslist=[] + keyfilelist=[] + xyzfilelist=[] + molnamelist=[] + molfilelist=[] + + for poltypepath in poltypepathlist: + dimertinkerxyzfiles=[] + dimerenergies=[] + dimersplogfiles=[] + curdir=os.getcwd() + os.chdir(poltypepath) + keyfile=os.path.join(poltypepath,'final.key') + xyzfile=os.path.join(poltypepath,'final.xyz') + if not os.path.exists(keyfile) or not os.path.exists(xyzfile): + raise ValueError('Final xyz or keyfile does not exist in '+str(poltypepath)) + if os.path.isdir('vdw'): + os.chdir('vdw') + files=os.listdir() + spext='_sp.log' + for f in files: + if spext in f: + tempxyzfile=f.replace(spext,'.xyz') + dimertinkerxyzfiles.append(os.path.join(os.getcwd(),tempxyzfile)) + dimersplogfiles.append(os.path.join(os.getcwd(),f)) + os.chdir('..') + else: + raise ValueError('vdw folder does not exist for '+poltypepath) - - return refstoproptoarray - -def RemoveSamePoints(listoftpdics): - newlistoftpdics=[] - for tpdic in listoftpdics: - if tpdic not in newlistoftpdics: - newlistoftpdics.append(tpdic) - - return newlistoftpdics - -def RemoveDictionariesWithNoExpDataAtTargetTP(listoftpdics): - newlistoftpdics=[] - for tpdic in listoftpdics: - newdic={} - for tppoint,dic in tpdic.items(): - founddata=False - for key,value in dic.items(): - if key!='global' and key!='cite' and key!='name' and '_wt' not in key and '_denom' not in key: - if value!=None: - founddata=True - if founddata==True: - newdic[tppoint]=dic - if len(newdic.keys())>0: - newlistoftpdics.append(newdic) - - return newlistoftpdics - - -def ParseDatabaseGenerateLiquidCSVFile(smiles,truename,printnames,searchILDB,rep,roomtemp,lowertol,uppertol,nvtprops): - - names=[] - if smiles!=None: - names=ConvertSmilestoNames(smiles,rep) - if printnames==True: - print('names from pubchem',names) - print('smiles',smiles) - if searchILDB==True: - refstoproptoarray=QueryLiquidProperties(names,truename,printnames) - else: - refstoproptoarray=QueryNISTProperties(truename,names) - - sortedrefstoproptoarray=SortReferences(refstoproptoarray,searchILDB) - sortedrefstoproptoarray=RoundTPData(sortedrefstoproptoarray,2) # round to two decimal places - proptorefs=PropertyToReferences(sortedrefstoproptoarray) - sortedtemppressurecounts=CountTPFrequency(sortedrefstoproptoarray) - tppoint=GrabNearestTPPoint(roomtemp,list(sortedtemppressurecounts.keys())) - tptoproptovalue=FindMinimalTPPointsAllProps(tppoint,proptorefs,sortedrefstoproptoarray,truename) - tptoproptovalue=AddDefaultValues(tptoproptovalue) - lowertppoint=GrabTPPointOutsideBound(tppoint,lowertol,list(sortedtemppressurecounts.keys()),'low') - uppertppoint=GrabTPPointOutsideBound(tppoint,uppertol,list(sortedtemppressurecounts.keys()),'upper') - lowertptoproptovalue=FindMinimalTPPointsAllProps(lowertppoint,proptorefs,sortedrefstoproptoarray,truename) - lowertptoproptovalue=AddDefaultValues(lowertptoproptovalue) - uppertptoproptovalue=FindMinimalTPPointsAllProps(uppertppoint,proptorefs,sortedrefstoproptoarray,truename) - uppertptoproptovalue=AddDefaultValues(uppertptoproptovalue) - listoftpdics=[tptoproptovalue,lowertptoproptovalue,uppertptoproptovalue] - listoftpdics=RemoveDictionariesWithNoExpDataAtTargetTP(listoftpdics) - listoftpdics=RemoveSamePoints(listoftpdics) - density=GrabDensity(listoftpdics) - WriteCSVFile(listoftpdics,nvtprops) - return density - -def GrabDensity(listoftpdics): - firstdic=listoftpdics[0] - firstproptovaluekeylist=list(firstdic.keys()) - firstkey=firstproptovaluekeylist[0] - proptovalue=firstdic[firstkey] - density=float(proptovalue['Rho']) # in Kg/m**3 - return density - - - -def ReadInPoltypeFiles(poltypepath): - dimertinkerxyzfiles=[] - dimerenergies=[] - dimersplogfiles=[] - curdir=os.getcwd() - os.chdir(poltypepath) - keyfile=os.path.join(poltypepath,'final.key') - xyzfile=os.path.join(poltypepath,'final.xyz') - if not os.path.exists(keyfile) or not os.path.exists(xyzfile): - raise ValueError('Final xyz or keyfile does not exist in '+str(poltypepath)) - if os.path.isdir('vdw'): - os.chdir('vdw') files=os.listdir() - spext='_sp.log' for f in files: - if spext in f: - tempxyzfile=f.replace(spext,'.xyz') - dimertinkerxyzfiles.append(os.path.join(os.getcwd(),tempxyzfile)) - dimersplogfiles.append(os.path.join(os.getcwd(),f)) - os.chdir('..') - else: - raise ValueError('vdw folder does not exist for '+poltypepath) - - files=os.listdir() - for f in files: - if '.' in f: - filesplit=f.split('.') - ext=filesplit[1] - if ext=='sdf': # assume poltype input sdf file - molname=filesplit[0] - molfile=f - - - dimerenergies=ReadQMLogFile(dimersplogfiles) - molfile=os.path.join(poltypepath,molfile) - os.chdir(curdir) - return keyfile,xyzfile,dimertinkerxyzfiles,dimerenergies,molname,molfile + if '.' in f: + filesplit=f.split('.') + ext=filesplit[1] + if ext=='sdf': # assume poltype input sdf file + molname=filesplit[0] + molfile=f + + + dimerenergies=ReadQMLogFile(dimersplogfiles) + molfile=os.path.join(poltypepath,molfile) + os.chdir(curdir) + dimertinkerxyzfileslist.append(dimertinkerxyzfiles) + dimerenergieslist.append(dimerenergies) + dimersplogfileslist.append(dimersplogfiles) + keyfilelist.append(keyfile) + xyzfilelist.append(xyzfile) + molnamelist.append(molname) + molfilelist.append(molfile) + + return keyfilelist,xyzfilelist,dimertinkerxyzfileslist,dimerenergieslist,molnamelist,molfilelist def GrabMonomerEnergy(line,Hartree2kcal_mol): @@ -1000,36 +509,87 @@ def ReadQMLogFile(dimersplogfiles): return dimerenergies -def GrabVdwTypeLinesFromFinalKey(keyfile,vdwtypes): - vdwtypelines=[] - temp=open(keyfile,'r') - results=temp.readlines() - temp.close() - for line in results: - if 'vdw' in line: - for vdwtype in vdwtypes: - if str(vdwtype) in line: - vdwtypelines.append(line) +def GrabVdwTypeLinesFromFinalKey(keyfilelist,vdwtypeslist): + vdwtypelineslist=[] + for i in range(len(keyfilelist)): + vdwtypelines=[] + keyfile=keyfilelist[i] + vdwtypes=vdwtypeslist[i] + temp=open(keyfile,'r') + results=temp.readlines() + temp.close() + for line in results: + if 'vdw' in line: + for vdwtype in vdwtypes: + if str(vdwtype) in line: + vdwtypelines.append(line) + vdwtypelineslist.append(vdwtypelines) + + return vdwtypelineslist - return vdwtypelines +def GenerateForceFieldFiles(vdwtypelineslist,moleculeprmfilename,fittypestogether): + + try: + length=len(fittypestogether) + array=np.array(fittypestogether) + array=np.transpose(array) + + except: + array=[] -def GenerateForceFieldFiles(vdwtypelines,moleculeprmfilename): if not os.path.isdir('forcefield'): os.mkdir('forcefield') os.chdir('forcefield') + vdwtypetoline={} + vdwtypetored={} + typestonothaveprmkeyword=[] + if len(array)!=0: + for row in array: + firsttype=row[0] # this one we reference and dont append + rest=row[1:] + for vdwtype in rest: + typestonothaveprmkeyword.append(int(vdwtype)) + for vdwtypelines in vdwtypelineslist: + for line in vdwtypelines: + linesplit=line.split() + vdwtype=int(linesplit[1]) + last=float(linesplit[-1]) + linelen=len(linesplit) + linesplit.append('#') + if vdwtype not in typestonothaveprmkeyword: + linesplit.append('PRM') + linesplit.append('2') + linesplit.append('3') + if linelen==5 and last!=1: + linesplit.append('4') + if linelen==5 and last!=1: + vdwtypetored[vdwtype]=True + else: + vdwtypetored[vdwtype]=False + + newline=' '.join(linesplit)+'\n' + vdwtypetoline[vdwtype]=newline + if len(array)!=0: + for row in array: + firsttype=row[0] # this one we reference and dont append + rest=row[1:] + for vdwtype in rest: + line=vdwtypetoline[int(vdwtype)] + red=vdwtypetored[int(vdwtype)] + line=line.replace('\n','') + line+=" EVAL 2 PRM['VDWS/%s']"%(str(firsttype)) + line+=" 3 PRM['VDWT/%s']"%(str(firsttype)) + if red==True: + line+=" 4 PRM['VDWD/%s']"%(str(firsttype)) + + line+='\n' + vdwtypetoline[int(vdwtype)]=line + + temp=open(moleculeprmfilename,'w') - for line in vdwtypelines: - linesplit=line.split() - last=float(linesplit[-1]) - linelen=len(linesplit) - linesplit.append('#') - linesplit.append('PRM') - linesplit.append('2') - linesplit.append('3') - if linelen==5 and last!=1: - linesplit.append('4') - newline=' '.join(linesplit)+'\n' - temp.write(newline) + for vdwtype,line in vdwtypetoline.items(): + temp.write(line) + temp.close() os.chdir('..') def RemoveKeyWord(keypath,keystring): @@ -1068,41 +628,47 @@ def CommentOutVdwLines(keypath,vdwtypes): os.rename(tempname,keypath) -def GenerateLiquidTargetsFolder(gaskeyfile,gasxyzfile,liquidkeyfile,liquidxyzfile,datacsvpath,density,liquidfolder,prmfilepath,moleculeprmfilename,vdwtypes,addwaterprms): - if not os.path.isdir('targets'): - os.mkdir('targets') - os.chdir('targets') - if not os.path.isdir(liquidfolder): - os.mkdir(liquidfolder) - os.chdir(liquidfolder) - shutil.copy(gaskeyfile,os.path.join(os.getcwd(),'gas.key')) - RemoveKeyWord(os.path.join(os.getcwd(),'gas.key'),'parameters') - temp=open(prmfilepath,'r') - results=temp.readlines() - temp.close() - temp=open(os.path.join(os.getcwd(),'gas.key'),'a') - if addwaterprms==True: - waterlines=WaterParameters() - for line in waterlines: - temp.write(line+'\n') - temp.close() - string='parameters '+moleculeprmfilename+'\n' - AddKeyWord(os.path.join(os.getcwd(),'gas.key'),string) - CommentOutVdwLines(os.path.join(os.getcwd(),'gas.key'),vdwtypes) - shutil.copy(gasxyzfile,os.path.join(os.getcwd(),'gas.xyz')) - head,tail=os.path.split(liquidkeyfile) - shutil.copy(liquidkeyfile,os.path.join(os.getcwd(),tail)) - CommentOutVdwLines(os.path.join(os.getcwd(),tail),vdwtypes) - head,tail=os.path.split(liquidxyzfile) - shutil.copy(liquidxyzfile,os.path.join(os.getcwd(),tail)) - os.remove(liquidxyzfile) - if datacsvpath!=None: - head,tail=os.path.split(datacsvpath) - shutil.copy(datacsvpath,os.path.join(os.getcwd(),tail)) - os.remove(datacsvpath) - os.chdir('..') - os.chdir('..') +def GenerateLiquidTargetsFolder(gaskeyfilelist,gasxyzfilelist,liquidkeyfilelist,liquidxyzfilelist,datacsvpathlist,densitylist,originalliquidfolder,prmfilepath,moleculeprmfilename,vdwtypeslist,addwaterprms,molnamelist): + liquidfolderlist=[] + for i in range(len(gaskeyfilelist)): + gaskeyfile=gaskeyfilelist[i] + gasxyzfile=gasxyzfilelist[i] + liquidkeyfile=liquidkeyfilelist[i] + liquidxyzfile=liquidxyzfilelist[i] + datacsvpath=datacsvpathlist[i] + vdwtypes=vdwtypeslist[i] + molname=molnamelist[i] + if not os.path.isdir('targets'): + os.mkdir('targets') + os.chdir('targets') + liquidfolder=originalliquidfolder+'_'+molname + liquidfolderlist.append(liquidfolder) + if not os.path.isdir(liquidfolder): + os.mkdir(liquidfolder) + os.chdir(liquidfolder) + shutil.copy(gaskeyfile,os.path.join(os.getcwd(),'gas.key')) + RemoveKeyWord(os.path.join(os.getcwd(),'gas.key'),'parameters') + temp=open(os.path.join(os.getcwd(),'gas.key'),'a') + if addwaterprms==True: + waterlines=WaterParameters() + for line in waterlines: + temp.write(line+'\n') + temp.close() + string='parameters '+moleculeprmfilename+'\n' + AddKeyWord(os.path.join(os.getcwd(),'gas.key'),string) + CommentOutVdwLines(os.path.join(os.getcwd(),'gas.key'),vdwtypes) + shutil.copy(gasxyzfile,os.path.join(os.getcwd(),'gas.xyz')) + shutil.copy(liquidkeyfile,os.path.join(os.getcwd(),'liquid.key')) + CommentOutVdwLines(os.path.join(os.getcwd(),'liquid.key'),vdwtypes) + shutil.copy(liquidxyzfile,os.path.join(os.getcwd(),'liquid.xyz')) + os.remove(liquidxyzfile) + if datacsvpath!=None: + shutil.copy(datacsvpath,os.path.join(os.getcwd(),'data.csv')) + os.remove(datacsvpath) + os.chdir('..') + os.chdir('..') + return liquidfolderlist def FindDimensionsOfMoleculeTinker(structurefilepath): veclist=[] @@ -1131,7 +697,7 @@ def ComputeBoxLength(xyzfile): aaxis = 2*float(vdwcutoff)+longestdim+4 return aaxis -def CreateSolventBox(axis,molnumber,prmfilepath,xyzeditpath,tinkerxyzname): +def CreateSolventBox(axis,molnumber,prmfilepath,xyzeditpath,tinkerxyzname,molname): head,tail=os.path.split(tinkerxyzname) fullkey=tinkerxyzname.replace('.xyz','.key') key=tail.replace('.xyz','.key') @@ -1146,8 +712,8 @@ def CreateSolventBox(axis,molnumber,prmfilepath,xyzeditpath,tinkerxyzname): temp.close() cmdstr=xyzeditpath+' '+'<'+' '+'xyzedit.in' call_subsystem(cmdstr,wait=True) - os.replace(tail+'_2','liquid.xyz') - liquidxyzfile=os.path.join(os.getcwd(),'liquid.xyz') + os.replace(tail+'_2',molname+'_liquid.xyz') + liquidxyzfile=os.path.join(os.getcwd(),molname+'_liquid.xyz') os.remove(key) os.remove(tail) return liquidxyzfile @@ -1230,8 +796,8 @@ def WaterParameters(): lines.append('polarize 350 0.4960 0.3900 349') return lines -def GenerateNewKeyFile(keyfile,prmfilepath,moleculeprmfilename,axis,addwaterprms): - liquidkeyfile=shutil.copy(keyfile,os.path.join(os.getcwd(),'liquid.key')) +def GenerateNewKeyFile(keyfile,prmfilepath,moleculeprmfilename,axis,addwaterprms,molname): + liquidkeyfile=shutil.copy(keyfile,os.path.join(os.getcwd(),molname+'_liquid.key')) RemoveKeyWord(liquidkeyfile,'parameters') temp=open(prmfilepath,'r') results=temp.readlines() @@ -1247,68 +813,99 @@ def GenerateNewKeyFile(keyfile,prmfilepath,moleculeprmfilename,axis,addwaterprms return liquidkeyfile -def GenerateTargetFiles(keyfile,xyzfile,density,rdkitmol,prmfilepath,xyzeditpath,moleculeprmfilename,addwaterprms): - mass=Descriptors.ExactMolWt(rdkitmol)*1.66054*10**(-27) # convert daltons to Kg - axis=ComputeBoxLength(xyzfile) - boxlength=axis*10**-10 # convert angstroms to m - numbermolecules=int(density*boxlength**3/mass) - liquidxyzfile=CreateSolventBox(axis,numbermolecules,prmfilepath,xyzeditpath,xyzfile) - gaskeyfile=keyfile - gasxyzfile=xyzfile - if os.path.exists('data.csv'): - datacsvpath=os.path.join(os.getcwd(),'data.csv') - else: - datacsvpath=None - liquidkeyfile=GenerateNewKeyFile(keyfile,prmfilepath,moleculeprmfilename,axis,addwaterprms) - - return gaskeyfile,gasxyzfile,liquidkeyfile,liquidxyzfile,datacsvpath - -def GenerateQMTargetsFolder(dimertinkerxyzfiles,dimerenergies,liquidkeyfile,qmfolder,vdwtypes): - os.chdir('targets') - if not os.path.isdir(qmfolder): - os.mkdir(qmfolder) - os.chdir(qmfolder) - newnamearray=[] - newenergyarray=[] - arr=np.arange(0,len(dimertinkerxyzfiles)) - arcwriter=open('all.arc','w') - for i in range(len(arr)): - value=arr[i] - tinkerxyzfile=dimertinkerxyzfiles[i] - dimerenergy=dimerenergies[i] - head,tail=os.path.split(tinkerxyzfile) - tinkerxyzfileprefix=tail.split('.')[0] - newname=tinkerxyzfileprefix+str(value) - temp=open(tinkerxyzfile,'r') - results=temp.readlines() - temp.close() - firstline=results[0] - firstlinesplit=firstline.split() - firstlinesplit.append(newname) - newfirstline=' '.join(firstlinesplit)+'\n' - results[0]=newfirstline - newnamearray.append(newname) - newenergyarray.append(dimerenergy) - for line in results: - arcwriter.write(line) - - arcwriter.close() - energywriter=open('qdata.txt','w') - for i in range(len(arr)): - value=arr[i] - energy=newenergyarray[i] - firstline='LABEL'+' '+str(value)+'\n' - secondline='INTERACTION'+' '+str(energy)+'\n' - energywriter.write(firstline) - energywriter.write(secondline) - energywriter.write('\n') - energywriter.close() - head,tail=os.path.split(liquidkeyfile) - shutil.copy(liquidkeyfile,os.path.join(os.getcwd(),tail)) - CommentOutVdwLines(os.path.join(os.getcwd(),tail),vdwtypes) - os.remove(liquidkeyfile) - os.chdir('..') - os.chdir('..') +def GenerateTargetFiles(keyfilelist,xyzfilelist,densitylist,rdkitmollist,prmfilepath,xyzeditpath,moleculeprmfilename,addwaterprms,molnamelist): + gaskeyfilelist=[] + gasxyzfilelist=[] + liquidkeyfilelist=[] + liquidxyzfilelist=[] + datacsvpathlist=[] + for i in range(len(rdkitmollist)): + rdkitmol=rdkitmollist[i] + xyzfile=xyzfilelist[i] + keyfile=keyfilelist[i] + density=densitylist[i] + molname=molnamelist[i] + mass=Descriptors.ExactMolWt(rdkitmol)*1.66054*10**(-27) # convert daltons to Kg + axis=ComputeBoxLength(xyzfile) + boxlength=axis*10**-10 # convert angstroms to m + numbermolecules=int(density*boxlength**3/mass) + liquidxyzfile=CreateSolventBox(axis,numbermolecules,prmfilepath,xyzeditpath,xyzfile,molname) + gaskeyfile=keyfile.replace('final',molname+'Gas') + gasxyzfile=xyzfile.replace('final',molname+'Gas') + shutil.copy(keyfile,gaskeyfile) + shutil.copy(xyzfile,gasxyzfile) + + name='data'+'_'+molname+'.csv' + if os.path.exists(name): + datacsvpath=os.path.join(os.getcwd(),name) + else: + datacsvpath=None + liquidkeyfile=GenerateNewKeyFile(keyfile,prmfilepath,moleculeprmfilename,axis,addwaterprms,molname) + gaskeyfilelist.append(gaskeyfile) + gasxyzfilelist.append(gasxyzfile) + liquidkeyfilelist.append(liquidkeyfile) + liquidxyzfilelist.append(liquidxyzfile) + datacsvpathlist.append(datacsvpath) + + + return gaskeyfilelist,gasxyzfilelist,liquidkeyfilelist,liquidxyzfilelist,datacsvpathlist + +def GenerateQMTargetsFolder(dimertinkerxyzfileslist,dimerenergieslist,liquidkeyfilelist,originalqmfolder,vdwtypeslist,molnamelist): + qmfolderlist=[] + for j in range(len(dimertinkerxyzfileslist)): + dimertinkerxyzfiles=dimertinkerxyzfileslist[j] + dimerenergies=dimerenergieslist[j] + liquidkeyfile=liquidkeyfilelist[j] + molname=molnamelist[j] + vdwtypes=vdwtypeslist[j] + os.chdir('targets') + qmfolder=originalqmfolder+'_'+molname + qmfolderlist.append(qmfolder) + if not os.path.isdir(qmfolder): + os.mkdir(qmfolder) + os.chdir(qmfolder) + newnamearray=[] + newenergyarray=[] + arr=np.arange(0,len(dimertinkerxyzfiles)) + arcwriter=open('all.arc','w') + for i in range(len(arr)): + value=arr[i] + tinkerxyzfile=dimertinkerxyzfiles[i] + dimerenergy=dimerenergies[i] + head,tail=os.path.split(tinkerxyzfile) + tinkerxyzfileprefix=tail.split('.')[0] + newname=tinkerxyzfileprefix+str(value) + temp=open(tinkerxyzfile,'r') + results=temp.readlines() + temp.close() + firstline=results[0] + firstlinesplit=firstline.split() + firstlinesplit.append(newname) + newfirstline=' '.join(firstlinesplit)+'\n' + results[0]=newfirstline + newnamearray.append(newname) + newenergyarray.append(dimerenergy) + for line in results: + arcwriter.write(line) + + arcwriter.close() + energywriter=open('qdata.txt','w') + for i in range(len(arr)): + value=arr[i] + energy=newenergyarray[i] + firstline='LABEL'+' '+str(value)+'\n' + secondline='INTERACTION'+' '+str(energy)+'\n' + energywriter.write(firstline) + energywriter.write(secondline) + energywriter.write('\n') + energywriter.close() + shutil.copy(liquidkeyfile,os.path.join(os.getcwd(),'liquid.key')) + CommentOutVdwLines(os.path.join(os.getcwd(),'liquid.key'),vdwtypes) + os.remove(liquidkeyfile) + os.chdir('..') + os.chdir('..') + + return qmfolderlist def ReadLigandOBMol(structfname): tmpconv = openbabel.OBConversion() @@ -1329,6 +926,16 @@ def GenerateRdkitMol(ligandfilename): return rdkitmol +def GenerateRdkitMolList(ligandfilenamelist): + rdkitmollist=[] + for ligandfilename in ligandfilenamelist: + rdkitmol=GenerateRdkitMol(ligandfilename) + rdkitmollist.append(rdkitmol) + return rdkitmollist + + + + def SanitizeMMExecutable(executable,tinkerdir): # Try to find Tinker executable with/without suffix if which(executable)!=None: @@ -1363,13 +970,8 @@ def is_exe(fpath): return None -def ConvertInputMoleculeToSmiles(molfile): - rdkitmol=GenerateRdkitMol(molfile) - smiles=Chem.MolToSmiles(rdkitmol) - return smiles - -def GenerateForceBalanceInputFile(moleculeprmfilename,qmfolder,liquidfolder,optimizefilepath,atomnum,liquid_equ_steps,liquid_prod_steps,liquid_timestep,liquid_interval,gas_equ_steps,gas_timestep,gas_interval,md_threads): +def GenerateForceBalanceInputFile(moleculeprmfilename,qmfolderlist,liquidfolderlist,optimizefilepath,atomnumlist,liquid_equ_steps,liquid_prod_steps,liquid_timestep,liquid_interval,gas_equ_steps,gas_timestep,gas_interval,md_threads): head,tail=os.path.split(optimizefilepath) newoptimizefilepath=os.path.join(os.getcwd(),tail) shutil.copy(optimizefilepath,newoptimizefilepath) @@ -1386,60 +988,151 @@ def GenerateForceBalanceInputFile(moleculeprmfilename,qmfolder,liquidfolder,opti temp=open(newoptimizefilepath,'a') - - results.append('$target'+'\n') - results.append('name '+qmfolder+'\n') - results.append('type Interaction_TINKER'+'\n') - results.append('weight 1.0'+'\n') - results.append('energy_denom 1.0'+'\n') - results.append('energy_upper 20.0'+'\n') - results.append('attenuate'+'\n') - lastindex=str(atomnum) - newindex=str(atomnum+1) - lastnewindex=str(atomnum+1+2) - results.append('fragment1 '+'1'+'-'+lastindex+'\n') - results.append('fragment2 '+str(newindex)+'-'+lastnewindex+'\n') - results.append('$end'+'\n') - results.append('$target'+'\n') - results.append('name '+liquidfolder+'\n') - results.append('type Liquid_TINKER'+'\n') - results.append('weight 1.0'+'\n') - results.append('w_rho 1.0'+'\n') - results.append('w_hvap 1.0'+'\n') - results.append('liquid_equ_steps '+str(liquid_equ_steps)+'\n') - results.append('liquid_prod_steps '+str(liquid_prod_steps)+'\n') - results.append('liquid_timestep '+str(liquid_timestep)+'\n') - results.append('liquid_interval '+str(liquid_interval)+'\n') - results.append('gas_equ_steps '+str(gas_equ_steps)+'\n') - results.append('gas_prod_steps '+str(gas_prod_steps)+'\n') - results.append('gas_timestep '+str(gas_timestep)+'\n') - results.append('gas_interval '+str(gas_interval)+'\n') - results.append('md_threads '+str(md_threads)+'\n') - results.append('$end'+'\n') + for i in range(len(qmfolderlist)): + qmfolder=qmfolderlist[i] + liquidfolder=liquidfolderlist[i] + atomnum=atomnumlist[i] + results.append('$target'+'\n') + results.append('name '+qmfolder+'\n') + results.append('type Interaction_TINKER'+'\n') + results.append('weight 1.0'+'\n') + results.append('energy_denom 1.0'+'\n') + results.append('energy_upper 20.0'+'\n') + results.append('attenuate'+'\n') + lastindex=str(atomnum) + newindex=str(atomnum+1) + lastnewindex=str(atomnum+1+2) + results.append('fragment1 '+'1'+'-'+lastindex+'\n') + results.append('fragment2 '+str(newindex)+'-'+lastnewindex+'\n') + results.append('$end'+'\n') + results.append('$target'+'\n') + results.append('name '+liquidfolder+'\n') + results.append('type Liquid_TINKER'+'\n') + results.append('weight 1.0'+'\n') + results.append('w_rho 1.0'+'\n') + results.append('w_hvap 1.0'+'\n') + results.append('liquid_equ_steps '+str(liquid_equ_steps)+'\n') + results.append('liquid_prod_steps '+str(liquid_prod_steps)+'\n') + results.append('liquid_timestep '+str(liquid_timestep)+'\n') + results.append('liquid_interval '+str(liquid_interval)+'\n') + results.append('gas_equ_steps '+str(gas_equ_steps)+'\n') + results.append('gas_prod_steps '+str(gas_prod_steps)+'\n') + results.append('gas_timestep '+str(gas_timestep)+'\n') + results.append('gas_interval '+str(gas_interval)+'\n') + results.append('md_threads '+str(md_threads)+'\n') + results.append('$end'+'\n') for line in results: temp.write(line) temp.close() -if poltypepath!=None: - keyfile,xyzfile,dimertinkerxyzfiles,dimerenergies,molname,molfile=ReadInPoltypeFiles(poltypepath) - smiles=ConvertInputMoleculeToSmiles(molfile) -if skipNIST==False: - density=ParseDatabaseGenerateLiquidCSVFile(smiles,truename,printnames,searchILDB,rep,roomtemp,lowertol,uppertol,nvtprops) -if poltypepath!=None: +def GrabMaxTypeNumber(parameterfile): + maxnumberfromprm=1 + temp=open(parameterfile,'r') + results=temp.readlines() + temp.close() + for line in results: + if 'atom' in line: + linesplit=line.split() + atomtype=int(linesplit[1]) + if atomtype>maxnumberfromprm: + maxnumberfromprm=atomtype + return maxnumberfromprm + +def GrabMinTypeNumber(parameterfile): + minnumberfromprm=10000 + temp=open(parameterfile,'r') + results=temp.readlines() + temp.close() + for line in results: + if 'atom' in line: + linesplit=line.split() + atomtype=int(linesplit[1]) + if atomtypecurrentmax: + currentmax=maxnumberfromkey + types=np.arange(minnumberfromkey,maxnumberfromkey+1,1) + shiftedtypes=types+shift + oldtypetonewtype=dict(zip(types,shiftedtypes)) + oldtypetonewtypelist.append(oldtypetonewtype) + prevmaxnumberfromkey=maxnumberfromkey + prevminnumberfromkey=minnumberfromkey + return oldtypetonewtypelist + +def ShiftVdwTypesLines(vdwtypelineslist,oldtypetonewtypelist): + newvdwtypelineslist=[] + for i in range(len(vdwtypelineslist)): + newvdwtypelines=[] + vdwtypelines=vdwtypelineslist[i] + for vdwtypeline in vdwtypelines: + oldtypetonewtype=oldtypetonewtypelist[i] + linesplit=vdwtypeline.split() + vdwtype=int(linesplit[1]) + newvdwtype=str(oldtypetonewtype[vdwtype]) + linesplit[1]=newvdwtype + newline=' '.join(linesplit) + newvdwtypelines.append(newline) + newvdwtypelineslist.append(newvdwtypelines) + + return newvdwtypelineslist + +def ShiftTypes(typeslist,oldtypetonewtypelist): + if typeslist==None: + return typeslist + newtypeslist=[] + for i in range(len(typeslist)): + types=typeslist[i] + oldtypetonewtype=oldtypetonewtypelist[i] + newtypes=[] + for ttype in types: + ttype=int(ttype) + newtype=str(oldtypetonewtype[ttype]) + newtypes.append(newtype) + newtypeslist.append(newtypes) + + return newtypeslist + +if poltypepathlist!=None: + keyfilelist,xyzfilelist,dimertinkerxyzfileslist,dimerenergieslist,molnamelist,molfilelist=ReadInPoltypeFiles(poltypepathlist) + densitylist=[ls[0] for ls in density_list] # just grab first density + GenerateLiquidCSVFile(nvtprops,listoftptopropdics,molnamelist) prmfilepath=os.path.join(os.path.split(__file__)[0],'amoebabio18.prm') optimizefilepath=os.path.join(os.path.split(__file__)[0],'optimize.in') xyzeditpath='xyzedit' tinkerdir=None xyzeditpath=SanitizeMMExecutable(xyzeditpath,tinkerdir) - vdwtypelines=GrabVdwTypeLinesFromFinalKey(keyfile,vdwtypes) + vdwtypelineslist=GrabVdwTypeLinesFromFinalKey(keyfilelist,vdwtypeslist) + oldtypetonewtypelist=GenerateTypeMaps(keyfilelist) + vdwtypelineslist=ShiftVdwTypesLines(vdwtypelineslist,oldtypetonewtypelist) + fittypestogether=ShiftTypes(fittypestogether,oldtypetonewtypelist) + vdwtypeslist=ShiftTypes(vdwtypeslist,oldtypetonewtypelist) moleculeprmfilename='molecule.prm' - GenerateForceFieldFiles(vdwtypelines,moleculeprmfilename) - rdkitmol=GenerateRdkitMol(molfile) - atomnum=rdkitmol.GetNumAtoms() - gaskeyfile,gasxyzfile,liquidkeyfile,liquidxyzfile,datacsvpath=GenerateTargetFiles(keyfile,xyzfile,density,rdkitmol,prmfilepath,xyzeditpath,moleculeprmfilename,addwaterprms) + GenerateForceFieldFiles(vdwtypelineslist,moleculeprmfilename,fittypestogether) + rdkitmollist=GenerateRdkitMolList(molfilelist) + atomnumlist=[rdkitmol.GetNumAtoms() for rdkitmol in rdkitmollist] + gaskeyfilelist,gasxyzfilelist,liquidkeyfilelist,liquidxyzfilelist,datacsvpathlist=GenerateTargetFiles(keyfilelist,xyzfilelist,densitylist,rdkitmollist,prmfilepath,xyzeditpath,moleculeprmfilename,addwaterprms,molnamelist) liquidfolder='Liquid' qmfolder='QM' - GenerateLiquidTargetsFolder(gaskeyfile,gasxyzfile,liquidkeyfile,liquidxyzfile,datacsvpath,density,liquidfolder,prmfilepath,moleculeprmfilename,vdwtypes,addwaterprms) - GenerateQMTargetsFolder(dimertinkerxyzfiles,dimerenergies,liquidkeyfile,qmfolder,vdwtypes) - GenerateForceBalanceInputFile(moleculeprmfilename,qmfolder,liquidfolder,optimizefilepath,atomnum,liquid_equ_steps,liquid_prod_steps,liquid_timestep,liquid_interval,gas_equ_steps,gas_timestep,gas_interval,md_threads) + + liquidfolderlist=GenerateLiquidTargetsFolder(gaskeyfilelist,gasxyzfilelist,liquidkeyfilelist,liquidxyzfilelist,datacsvpathlist,densitylist,liquidfolder,prmfilepath,moleculeprmfilename,vdwtypeslist,addwaterprms,molnamelist) + qmfolderlist=GenerateQMTargetsFolder(dimertinkerxyzfileslist,dimerenergieslist,liquidkeyfilelist,qmfolder,vdwtypeslist,molnamelist) + GenerateForceBalanceInputFile(moleculeprmfilename,qmfolderlist,liquidfolderlist,optimizefilepath,atomnumlist,liquid_equ_steps,liquid_prod_steps,liquid_timestep,liquid_interval,gas_equ_steps,gas_timestep,gas_interval,md_threads) From 1479bdcb6ce1f75607292081cad3fd472f2baa3b Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Wed, 14 Jul 2021 16:24:24 -0500 Subject: [PATCH 11/27] Update docs. --- tools/PoltypeInterface/README.MD | 3 --- tools/PoltypeInterface/data.csv | 30 ------------------------------ 2 files changed, 33 deletions(-) delete mode 100644 tools/PoltypeInterface/data.csv diff --git a/tools/PoltypeInterface/README.MD b/tools/PoltypeInterface/README.MD index c73655d09..d72e6dacb 100644 --- a/tools/PoltypeInterface/README.MD +++ b/tools/PoltypeInterface/README.MD @@ -21,9 +21,6 @@ conda install -c conda-forge rdkit --yes export GPUDYNAMICS=True ``` -* https://ilthermo.boulder.nist.gov/ -* Be careful by default tries first name it finds with molecule match, but may not be correct name. Use printnames to find possible names that are found in database. Use truename to only grab data from the correct molecule name (according to the database) - * Make sure Tinker is sourced in your path so program can use xyzedit! * Environment Bashrc Example For CPU Tinker ``` diff --git a/tools/PoltypeInterface/data.csv b/tools/PoltypeInterface/data.csv deleted file mode 100644 index c6bbd9b3a..000000000 --- a/tools/PoltypeInterface/data.csv +++ /dev/null @@ -1,30 +0,0 @@ -Global,eps0_denom,1 -Global,cp_denom,1 -Global,kappa_denom,1 -Global,alpha_denom,1 -Global,surf_ten_denom,1 -Global,rho_denom,1 -Global,hvap_denom,1 - -# Name,Water -# Ref,Unknown -# 295.16,1 atm -# Cp_err,Surf_Ten_err,Rho_err -# 0,0,0 - -# Name,Water -# Ref,Unknown -# 273.16,1 atm -# Cp_err,Surf_Ten_err,Rho_err -# 0,0,0 - -# Name,Water -# Ref,Unknown -# 305.16,1 atm -# Cp_err,Surf_Ten_err,Rho_err -# 0,0,0 - -T,P,Cp,Cp_wt,Surf_Ten,Surf_Ten_wt,Rho,Rho_wt -295.16,1 atm,0.075359,1,5.246249761,1,997.73,1 -273.16,1 atm,0.076023,1,5.722317316000001,1,999.79,1 -305.16,1 atm,0.075299,1,5.023549128999999,1,994.98,1 From c592fd384420f488983544b9610c47bafee004b5 Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Fri, 16 Jul 2021 16:10:43 -0500 Subject: [PATCH 12/27] High energy filter for QM data points from poltype. --- tools/PoltypeInterface/README.MD | 2 + .../forcebalancepoltypeinterface.py | 58 ++++++++++++++++++- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/tools/PoltypeInterface/README.MD b/tools/PoltypeInterface/README.MD index d72e6dacb..c09812f51 100644 --- a/tools/PoltypeInterface/README.MD +++ b/tools/PoltypeInterface/README.MD @@ -52,6 +52,8 @@ fittypestogether=401 402 , 401 402 * Isothermal compressibility units are 1/bar * Isobaric heat capacity units are kJ/mol.K * pressure units are atm +* Experimental data can be found at https://webbook.nist.gov/ or https://www.aiche.org/dippr +* QM energies from dimers in poltype (normalized) >=15 kcal/mol are removed and not use for forcebalance. ``` poltypepathlist Comma seperated list of Paths to completed poltypejobs vdwtypes Comma seperated list of vdw types lists to parameterize diff --git a/tools/PoltypeInterface/forcebalancepoltypeinterface.py b/tools/PoltypeInterface/forcebalancepoltypeinterface.py index 27dcd362d..3371a3d89 100644 --- a/tools/PoltypeInterface/forcebalancepoltypeinterface.py +++ b/tools/PoltypeInterface/forcebalancepoltypeinterface.py @@ -452,7 +452,7 @@ def ReadInPoltypeFiles(poltypepathlist): molnamelist.append(molname) molfilelist.append(molfile) - return keyfilelist,xyzfilelist,dimertinkerxyzfileslist,dimerenergieslist,molnamelist,molfilelist + return keyfilelist,xyzfilelist,dimertinkerxyzfileslist,dimerenergieslist,molnamelist,molfilelist,dimersplogfileslist def GrabMonomerEnergy(line,Hartree2kcal_mol): @@ -1111,8 +1111,62 @@ def ShiftTypes(typeslist,oldtypetonewtypelist): return newtypeslist +def FilterHighEnergy(dimertinkerxyzfileslist,dimerenergieslist,dimersplogfileslist): + tol=15 # kcal/mol + newdimertinkerxyzfileslistoflist=[] + newdimerenergieslistoflist=[] + for j in range(len(dimertinkerxyzfileslist)): + newdimertinkerxyzfileslist=[] + newdimerenergieslist=[] + + prefixtoxyzfilelist={} + prefixtoenergylist={} + prefixtooriginalenergylist={} + xyzfilelist=dimertinkerxyzfileslist[j] + energylist=dimerenergieslist[j] + splogfilelist=dimersplogfileslist[j] + for i in range(len(xyzfilelist)): + xyzfile=xyzfilelist[i] + energy=energylist[i] + splogfile=splogfilelist[i] + + filesplit=splogfile.split('_') + filesplit=filesplit[:-2] + prefix=''.join(filesplit) + if prefix not in prefixtoxyzfilelist.keys(): + prefixtoxyzfilelist[prefix]=[] + prefixtoenergylist[prefix]=[] + prefixtoxyzfilelist[prefix].append(xyzfile) + prefixtoenergylist[prefix].append(energy) + for prefix,energyarray in prefixtoenergylist.items(): + normenergyarray=[i-min(energyarray) for i in energyarray] + prefixtoenergylist[prefix]=normenergyarray + prefixtooriginalenergylist[prefix]=energyarray + + for prefix,energyarray in prefixtoenergylist.items(): + normenergyarray=prefixtoenergylist[prefix] + energyarray=prefixtooriginalenergylist[prefix] + + xyzfilelist=prefixtoxyzfilelist[prefix] + for eidx in range(len(normenergyarray)): + e=normenergyarray[eidx] + originale=energyarray[eidx] + xyzfile=xyzfilelist[eidx] + if e>=tol: + pass + else: + newdimertinkerxyzfileslist.append(xyzfile) + newdimerenergieslist.append(originale) + newdimertinkerxyzfileslistoflist.append(newdimertinkerxyzfileslist) + newdimerenergieslistoflist.append(newdimerenergieslist) + + + return newdimertinkerxyzfileslistoflist,newdimerenergieslistoflist + + if poltypepathlist!=None: - keyfilelist,xyzfilelist,dimertinkerxyzfileslist,dimerenergieslist,molnamelist,molfilelist=ReadInPoltypeFiles(poltypepathlist) + keyfilelist,xyzfilelist,dimertinkerxyzfileslist,dimerenergieslist,molnamelist,molfilelist,dimersplogfileslist=ReadInPoltypeFiles(poltypepathlist) + dimertinkerxyzfileslist,dimerenergieslist=FilterHighEnergy(dimertinkerxyzfileslist,dimerenergieslist,dimersplogfileslist) densitylist=[ls[0] for ls in density_list] # just grab first density GenerateLiquidCSVFile(nvtprops,listoftptopropdics,molnamelist) prmfilepath=os.path.join(os.path.split(__file__)[0],'amoebabio18.prm') From 5f979975835f62374dd467a7f679380b44670b23 Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Tue, 20 Jul 2021 16:45:05 -0500 Subject: [PATCH 13/27] Weight the Liquid experimental data twice as much as QM data. --- tools/PoltypeInterface/forcebalancepoltypeinterface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/PoltypeInterface/forcebalancepoltypeinterface.py b/tools/PoltypeInterface/forcebalancepoltypeinterface.py index 3371a3d89..82a141188 100644 --- a/tools/PoltypeInterface/forcebalancepoltypeinterface.py +++ b/tools/PoltypeInterface/forcebalancepoltypeinterface.py @@ -995,7 +995,7 @@ def GenerateForceBalanceInputFile(moleculeprmfilename,qmfolderlist,liquidfolderl results.append('$target'+'\n') results.append('name '+qmfolder+'\n') results.append('type Interaction_TINKER'+'\n') - results.append('weight 1.0'+'\n') + results.append('weight .5'+'\n') results.append('energy_denom 1.0'+'\n') results.append('energy_upper 20.0'+'\n') results.append('attenuate'+'\n') From b27a8ab1439090891a9d5b7e180a530a6436aa5b Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Mon, 26 Jul 2021 15:57:29 -0500 Subject: [PATCH 14/27] Allow gaps in input data (sometimes experimental data missing for some temp/pressure points. Read input csv example with experimental data. --- tools/PoltypeInterface/ExpHalogenData.csv | 71 ++++ tools/PoltypeInterface/README.MD | 10 +- .../forcebalancepoltypeinterface.py | 370 +++++++++++++----- 3 files changed, 347 insertions(+), 104 deletions(-) create mode 100644 tools/PoltypeInterface/ExpHalogenData.csv diff --git a/tools/PoltypeInterface/ExpHalogenData.csv b/tools/PoltypeInterface/ExpHalogenData.csv new file mode 100644 index 000000000..9bf364268 --- /dev/null +++ b/tools/PoltypeInterface/ExpHalogenData.csv @@ -0,0 +1,71 @@ +Name,Temperature (K),Pressure (atm),Density (Kg/m^3),Enthalpy (kJ/mol),Heat Capacity (Isobaric J/mol.K),Heat Capacity (Isobaric kJ/mol.K),Reference,Paper,Similar to Nist? (y/n or N/A) +CI4,,,,,,,,, +CH3I,301,1,2255.1,27881,82.459,0.082459,DIPPR,, +CH3I,286,1,2298.6,28510,82.138,0.082138,DIPPR,, +CH3I,307,1,2237.4,27617,82.588,0.082588,DIPPR,, +CH2I2,300,1,3301.5,50.703,133.66,0.13366,DIPPR,, +CH2I2,285,1,3336.8,51.751,UNK,UNK,DIPPR,, +CH2I2,315,1,3265.7,49.654,136.12,0.13612,DIPPR,, +CH2I2,298,1,3306.2,50.843,133.34,0.13334,DIPPR,, +CHI3,,,,,,,,, +CF4,226,1,,2.5025,UNK,UNK,DIPPR,, +CF4,216,1,,5.6852,UNK,UNK,DIPPR,, +CF4,206,1,,7.2707,UNK,UNK,DIPPR,, +CF4,144,1,1610,11.867,79.897,0.079897,DIPPR,, +CF4,134,1,1661.6,12.329,78.551,0.078551,DIPPR,, +CF4,124,1,1710.8,12.767,77.661,0.077661,DIPPR,, +CH3F,300,1,564.85,8.9333,UNK,UNK,DIPPR,, +CH3F,285,1,634.2,10.934,93.87,0.09387,DIPPR,, +CH3F,315,1,435.13,4.9032,UNK,UNK,DIPPR,, +CH3F,275,1,671.1,11.961,89.317,0.089317,DIPPR,, +CH3F,265,1,703.78,12.844,85.216,0.085216,DIPPR,, +CH2F2,300,1,951.72,14.74,UNK,UNK,DIPPR,, +CH2F2,315,1,882.39,13.034,UNK,UNK,DIPPR,, +CH2F2,285,1,1011.6,16.094,UNK,UNK,DIPPR,, +CH2F2,250,1,1130.4,18.49,89.118,0.089118,DIPPR,, +CH2F2,240,1,1160.8,19.055,85.632,0.085632,DIPPR,, +CH2F2,230,1,1190,19.586,83.02,0.08302,DIPPR,, +CHF3,298,1,694.51,0.6861,UNK,UNK,DIPPR,, +CHF3,275,1,1024.2,2.2738,UNK,UNK,DIPPR,, +CHF3,260,1,1126.8,2.7348,UNK,UNK,DIPPR,, +CHF3,242,1,1225.7,13.21,100.48,0.10048,DIPPR,, +CHF3,232,1,1273.9,14.038,96.974,0.096974,DIPPR,, +CHF3,222,1,1318.8,14.788,93.869,0.093869,DIPPR,, +METHYL CHLORIDE,300,1,907.12,19.207,81.581,0.081581,DIPPR,, +METHYL CHLORIDE,315,1,875.1,18.271,UNK,UNK,DIPPR,, +METHYL CHLORIDE,285,1,937.32,20.055,79.443,0.079443,DIPPR,, +METHYL CHLORIDE,303,1,900.87,19.027,82.052,0.082052,DIPPR,, +DICHLOROMETHANE,300,1,1314.7,28.913,101.02,0.10102,DIPPR,, +DICHLOROMETHANE,315,1,1285.7,28.038,102.23,0.10223,DIPPR,, +DICHLOROMETHANE,285,1,1343,29.771,99.927,0.099927,DIPPR,, +CHLOROFORM,300,1,1479.4,31.289,113.84,0.11384,DIPPR,, +CHLOROFORM,285,1,1506.9,32.133,112.54,0.11254,DIPPR,, +CHLOROFORM,315,1,1451.2,30.447,115.33,0.11533,DIPPR,, +CARBON TETRACHLORIDE,300,1,1580.1,32.334,131.96,0.13196,DIPPR,, +CARBON TETRACHLORIDE,315,1,1552.3,31.568,132.7,0.1327,DIPPR,, +CARBON TETRACHLORIDE,285,1,1607.3,33.083,131.49,0.13149,DIPPR,, +CBr4,384,1,UNK,48.2,UNK,UNK,NIST,, +CBr4,390,1,UNK,48.3,UNK,UNK,DIPPR,, +CHBr3,300,1,2871.4,44.03,130.84,0.13084,DIPPR,, +CHBr3,315,1,2832.6,43.338,132.02,0.13202,DIPPR,, +CHBr3,285,1,2909.6,44.689,UNK,UNK,DIPPR,, +CHBr3,298,1,2876.5,44.12,130.73,0.13073,DIPPR,, +CH2Br2,370.1,1,UNK,32.92,UNK,UNK,NIST,, +CH2Br2,288,1,UNK,36.5,UNK,UNK,NIST,, +CH2Br2,253,1,UNK,37.8,UNK,UNK,NIST,, +CH3Br,281,1,UNK,24.6,UNK,UNK,NIST,, +CH3Br,262,1,UNK,25.2,UNK,UNK,NIST,, +CH3Br,276.71,1,UNK,23.912,UNK,UNK,NIST,, +FluoroBenzene,318,1,UNK,33.5,UNK,UNK,NIST,, +FluoroBenzene,337,1,UNK,32.4,UNK,UNK,NIST,, +FluoroBenzene,358,1,UNK,31.2,UNK,UNK,NIST,, +ChloroBenzene,300,1,1098.5,40.675,150.28,0.15028,DIPPR,, +ChloroBenzene,315,1,1083.1,40.675,152.62,0.15262,DIPPR,, +ChloroBenzene,285,1,1113.6,41.266,149.37,0.14937,DIPPR,, +BromoBenzene,300,1,1484.9,44.696,150.99,0.15099,DIPPR,, +BromoBenzene,315,1,1465.8,43.965,154.15,0.15415,DIPPR,, +BromoBenzene,285,1,1503.8,45.395,UNK,UNK,DIPPR,, +BromoBenzene,294,1,1492.5,44.98,149.77,0.14977,DIPPR,, +IodoBenzene,300,1,1819.3,49.269,159.08,0.15908,DIPPR,, +IodoBenzene,315,1,1797.7,48.464,160.26,0.16026,DIPPR,, +IodoBenzene,285,1,1840.5,50.082,157.91,0.15791,DIPPR,, diff --git a/tools/PoltypeInterface/README.MD b/tools/PoltypeInterface/README.MD index c09812f51..172efc457 100644 --- a/tools/PoltypeInterface/README.MD +++ b/tools/PoltypeInterface/README.MD @@ -36,7 +36,7 @@ python /home/bdw2292/FBInterface/forcebalancepoltypeinterface.py ``` * Example input ``` -poltypepathlist=/home/bdw2292/PoltypeJobs/HalogenPaperMolecules/CBr4,/home/bdw2292/PoltypeJobs/HalogenPaperMolecules/CF4 +poltypepathlist=/home/bdw2292/PoltypeJobs/HalogenPaperMolecules/CHI3,/home/bdw2292/PoltypeJobs/HalogenPaperMolecules/CF4 vdwtypeslist=401 402 , 401 402 temperature_list= 300 250 , 300 230 350 pressure_list= 1 1 , 1 1 1 @@ -44,6 +44,14 @@ density_list=1000 1000 , 1000 1000 1000 fittypestogether=401 402 , 401 402 ``` * In the example above, fittypestogether reads fit 401 from molecule 1 and 401 from molecule 2 together, and also fit 402 from molecule 1 and 402 from molecule 2 together +* Alternative example input +``` +poltypepathlist=/home/bdw2292/PoltypeJobs/HalogenPaperMolecules/CHI3,/home/bdw2292/PoltypeJobs/HalogenPaperMolecules/CF4 +csvexpdatafile=ExpHalogenData.csv +vdwtypeslist=401 402 , 401 402 +``` +* Can use UNK for when unknown data property for input arrays +* If using csvexpdatafile, please use correct units as below and the column headers in example csv file, make sure the molecule name under the Name column are same as poltype molecule folder name * By default all types in key files are reassigned new type numbers so there is no overlap while fitting together. So input types will be converted internally. * temperature_list, pressure_list and density_list are required. * Density units are Kg/m^3 diff --git a/tools/PoltypeInterface/forcebalancepoltypeinterface.py b/tools/PoltypeInterface/forcebalancepoltypeinterface.py index 82a141188..246f48de5 100644 --- a/tools/PoltypeInterface/forcebalancepoltypeinterface.py +++ b/tools/PoltypeInterface/forcebalancepoltypeinterface.py @@ -11,6 +11,7 @@ from rdkit import Chem import subprocess import itertools +import csv poltypepathlist=None vdwtypeslist=None @@ -32,7 +33,7 @@ density_err_list=None citation_list=None fittypestogether=None - +csvexpdatafile=None liquid_equ_steps=10000 liquid_prod_steps=5000000 liquid_timestep=1.0 @@ -47,6 +48,116 @@ nvtprops=False # NPT for most props, surface tension requires NVT and force balance complains addwaterprms=True +def GrabMoleculeOrder(poltypepathlist,nametopropsarray): + nametoarrayindexorder={} + for name in nametopropsarray.keys(): + foundname=False + for poltypepathidx in range(len(poltypepathlist)): + poltypepath=poltypepathlist[poltypepathidx] + if name in poltypepath: + foundname=True + break + if foundname==False: + continue + nametoarrayindexorder[name]=poltypepathidx + return nametoarrayindexorder + + +def GrabArrayInputs(nametopropsarray,nametoarrayindexorder): + arrayindexordertoname = {v: k for k, v in nametoarrayindexorder.items()} + temperature_list=[] + pressure_list=[] + enthalpy_of_vaporization_list=[] + heat_capacity_at_constant_pressure_list=[] + density_list=[] + tempstring='Temperature (K)' + pressurestring='Pressure (atm)' + densitystring='Density (Kg/m^3)' + enthalpystring='Enthalpy (kJ/mol)' + heatcapstring='Heat Capacity (Isobaric kJ/mol.K)' + sortednametoarrayindexorder={k: v for k, v in sorted(arrayindexordertoname.items(), key=lambda item: item[0])} + for arrayidx,name in sortednametoarrayindexorder.items(): + propsdict=nametopropsarray[name] + temp=propsdict[tempstring] + pressure=propsdict[pressurestring] + density=propsdict[densitystring] + enthalpy=propsdict[enthalpystring] + heatcap=propsdict[heatcapstring] + temperature_list.append(temp) + pressure_list.append(pressure) + enthalpy_of_vaporization_list.append(enthalpy) + heat_capacity_at_constant_pressure_list.append(heatcap) + density_list.append(density) + + return temperature_list,pressure_list,enthalpy_of_vaporization_list,heat_capacity_at_constant_pressure_list,density_list + + +def FindIndexWithString(string,array): + found=False + for i in range(len(array)): + e=array[i] + if string in e: + found=True + break + if found==False: + raise ValueError(string+' was not found in header') + return i + + +def CheckNoneValue(value): + try: + float(value) + except: + value='UNK' + return value + +def ReadCSVFile(csvfileread): + with open(csvfileread, newline='') as csvfile: + reader = list(csv.reader(csvfile, delimiter=',', quotechar='|')) + header=reader[0] + namestring='Name' + tempstring='Temperature (K)' + pressurestring='Pressure (atm)' + densitystring='Density (Kg/m^3)' + enthalpystring='Enthalpy (kJ/mol)' + heatcapstring='Heat Capacity (Isobaric kJ/mol.K)' + nameindex=FindIndexWithString(namestring,header) + tempindex=FindIndexWithString(tempstring,header) + pressureindex=FindIndexWithString(pressurestring,header) + densityindex=FindIndexWithString(densitystring,header) + enthalpyindex=FindIndexWithString(enthalpystring,header) + heatcapindex=FindIndexWithString(heatcapstring,header) + nametopropsarray={} + for rowidx in range(1,len(reader)): + row=reader[rowidx] + name=row[nameindex] + temp=CheckNoneValue(row[tempindex]) + pressure=CheckNoneValue(row[pressureindex]) + density=CheckNoneValue(row[densityindex]) + enthalpy=CheckNoneValue(row[enthalpyindex]) + heatcap=CheckNoneValue(row[heatcapindex]) + if name not in nametopropsarray.keys(): + nametopropsarray[name]={} + if tempstring not in nametopropsarray[name].keys(): + nametopropsarray[name][tempstring]=[] + nametopropsarray[name][tempstring].append(temp) + if pressurestring not in nametopropsarray[name].keys(): + nametopropsarray[name][pressurestring]=[] + nametopropsarray[name][pressurestring].append(pressure) + if densitystring not in nametopropsarray[name].keys(): + nametopropsarray[name][densitystring]=[] + nametopropsarray[name][densitystring].append(density) + if enthalpystring not in nametopropsarray[name].keys(): + nametopropsarray[name][enthalpystring]=[] + nametopropsarray[name][enthalpystring].append(enthalpy) + if heatcapstring not in nametopropsarray[name].keys(): + nametopropsarray[name][heatcapstring]=[] + nametopropsarray[name][heatcapstring].append(heatcap) + + return nametopropsarray + + + def ReturnListOfList(string): newlist=string.split(',') templist=[] @@ -75,6 +186,8 @@ def ReturnListOfList(string): if "poltypepathlist" in newline: poltypepathlist=a.split(',') + elif "csvexpdatafile" in newline: + csvexpdatafile=a elif "fittypestogether" in newline: fittypestogether=ReturnListOfList(a) elif "vdwtypeslist" in newline: @@ -138,13 +251,6 @@ def ReturnListOfList(string): elif 'nvtprops' in newline: nvtprops=True -if temperature_list==None: - raise ValueError('No temperature data') -if pressure_list==None: - raise ValueError('No pressure data') -if density_list==None: - raise ValueError('No density data') - def ShapeOfArray(array): dimlist=[] rows=len(array) @@ -179,55 +285,6 @@ def GenerateNoneList(targetshape): -CheckInputShapes([temperature_list,pressure_list,density_list]) -numberofmolecules=len(poltypepathlist) -targetshape=ShapeOfArray(temperature_list) -if enthalpy_of_vaporization_list==None: - enthalpy_of_vaporization_list=GenerateNoneList(targetshape) - -if enthalpy_of_vaporization_err_list==None: - enthalpy_of_vaporization_err_list=GenerateNoneList(targetshape) - -if surface_tension_list==None: - surface_tension_list=GenerateNoneList(targetshape) - -if surface_tension_err_list==None: - surface_tension_err_list=GenerateNoneList(targetshape) - -if relative_permittivity_list==None: - relative_permittivity_list=GenerateNoneList(targetshape) - -if relative_permittivity_err_list==None: - relative_permittivity_err_list=GenerateNoneList(targetshape) - -if isothermal_compressibility_list==None: - isothermal_compressibility_list=GenerateNoneList(targetshape) - -if isothermal_compressibility_err_list==None: - isothermal_compressibility_err_list=GenerateNoneList(targetshape) - -if isobaric_coefficient_of_volume_expansion_list==None: - isobaric_coefficient_of_volume_expansion_list=GenerateNoneList(targetshape) - -if isobaric_coefficient_of_volume_expansion_err_list==None: - isobaric_coefficient_of_volume_expansion_err_list=GenerateNoneList(targetshape) - -if heat_capacity_at_constant_pressure_list==None: - heat_capacity_at_constant_pressure_list=GenerateNoneList(targetshape) - -if heat_capacity_at_constant_pressure_err_list==None: - heat_capacity_at_constant_pressure_err_list=GenerateNoneList(targetshape) - -if density_list==None: - density_list=GenerateNoneList(targetshape) - -if density_err_list==None: - density_err_list=GenerateNoneList(targetshape) - -if citation_list==None: - citation_list=GenerateNoneList(targetshape) - - gas_prod_steps=int(1000000*gas_prod_time/gas_timestep) liquid_prod_steps=int(1000000*liquid_prod_time/liquid_timestep) @@ -295,7 +352,6 @@ def CombineData(temperature_list,pressure_list,enthalpy_of_vaporization_list,ent listoftptopropdics.append(tptoproptovalue) return listoftptopropdics -listoftptopropdics=CombineData(temperature_list,pressure_list,enthalpy_of_vaporization_list,enthalpy_of_vaporization_err_list,surface_tension_list,surface_tension_err_list,relative_permittivity_list,relative_permittivity_err_list,isothermal_compressibility_list,isothermal_compressibility_err_list,isobaric_coefficient_of_volume_expansion_list,isobaric_coefficient_of_volume_expansion_err_list,heat_capacity_at_constant_pressure_list,heat_capacity_at_constant_pressure_err_list,density_list,density_err_list,citation_list) def AddDefaultValues(tptoproptovalue): @@ -356,8 +412,10 @@ def WriteCSVFile(listoftpdics,nvtprops,molname): ls=[refls,commentpropvaluels] for prop,value in proptovalue.items(): if prop!='cite' and 'wt' not in prop and 'err' not in prop and prop!='T' and prop!='P' and 'global' not in prop: - if value==None: - continue + #if value==None: + # continue + if value=='UNK': + value=None if nvtprops==False and prop in nvtproperties: continue @@ -392,12 +450,26 @@ def WriteCSVFile(listoftpdics,nvtprops,molname): def GenerateLiquidCSVFile(nvtprops,listoftptopropdics,molnamelist): + indextogeneratecsv={} for i in range(len(listoftptopropdics)): tptoproptovalue=listoftptopropdics[i] + allunknown=True + for tp,proptovalue in tptoproptovalue.items(): + t=tp[0] + p=tp[1] + if t!='UNK' and p!='UNK': + allunknown=False + molname=molnamelist[i] - tptoproptovalue=AddDefaultValues(tptoproptovalue) - WriteCSVFile([tptoproptovalue],nvtprops,molname) - + if allunknown==False: + tptoproptovalue=AddDefaultValues(tptoproptovalue) + WriteCSVFile([tptoproptovalue],nvtprops,molname) + if allunknown==False: + gencsv=True + else: + gencsv=False + indextogeneratecsv[i]=gencsv + return indextogeneratecsv def ReadInPoltypeFiles(poltypepathlist): dimertinkerxyzfileslist=[] @@ -628,9 +700,10 @@ def CommentOutVdwLines(keypath,vdwtypes): os.rename(tempname,keypath) -def GenerateLiquidTargetsFolder(gaskeyfilelist,gasxyzfilelist,liquidkeyfilelist,liquidxyzfilelist,datacsvpathlist,densitylist,originalliquidfolder,prmfilepath,moleculeprmfilename,vdwtypeslist,addwaterprms,molnamelist): +def GenerateLiquidTargetsFolder(gaskeyfilelist,gasxyzfilelist,liquidkeyfilelist,liquidxyzfilelist,datacsvpathlist,densitylist,originalliquidfolder,prmfilepath,moleculeprmfilename,vdwtypeslist,addwaterprms,molnamelist,indextogeneratecsv): liquidfolderlist=[] for i in range(len(gaskeyfilelist)): + gencsv=indextogeneratecsv[i] gaskeyfile=gaskeyfilelist[i] gasxyzfile=gasxyzfilelist[i] liquidkeyfile=liquidkeyfilelist[i] @@ -643,6 +716,9 @@ def GenerateLiquidTargetsFolder(gaskeyfilelist,gasxyzfilelist,liquidkeyfilelist, os.chdir('targets') liquidfolder=originalliquidfolder+'_'+molname liquidfolderlist.append(liquidfolder) + if gencsv==False: + os.chdir('..') + continue if not os.path.isdir(liquidfolder): os.mkdir(liquidfolder) os.chdir(liquidfolder) @@ -658,10 +734,12 @@ def GenerateLiquidTargetsFolder(gaskeyfilelist,gasxyzfilelist,liquidkeyfilelist, AddKeyWord(os.path.join(os.getcwd(),'gas.key'),string) CommentOutVdwLines(os.path.join(os.getcwd(),'gas.key'),vdwtypes) shutil.copy(gasxyzfile,os.path.join(os.getcwd(),'gas.xyz')) - shutil.copy(liquidkeyfile,os.path.join(os.getcwd(),'liquid.key')) - CommentOutVdwLines(os.path.join(os.getcwd(),'liquid.key'),vdwtypes) - shutil.copy(liquidxyzfile,os.path.join(os.getcwd(),'liquid.xyz')) - os.remove(liquidxyzfile) + if liquidkeyfile!=None: + shutil.copy(liquidkeyfile,os.path.join(os.getcwd(),'liquid.key')) + CommentOutVdwLines(os.path.join(os.getcwd(),'liquid.key'),vdwtypes) + if liquidxyzfile!=None: + shutil.copy(liquidxyzfile,os.path.join(os.getcwd(),'liquid.xyz')) + os.remove(liquidxyzfile) if datacsvpath!=None: shutil.copy(datacsvpath,os.path.join(os.getcwd(),'data.csv')) os.remove(datacsvpath) @@ -813,23 +891,27 @@ def GenerateNewKeyFile(keyfile,prmfilepath,moleculeprmfilename,axis,addwaterprms return liquidkeyfile -def GenerateTargetFiles(keyfilelist,xyzfilelist,densitylist,rdkitmollist,prmfilepath,xyzeditpath,moleculeprmfilename,addwaterprms,molnamelist): +def GenerateTargetFiles(keyfilelist,xyzfilelist,densitylist,rdkitmollist,prmfilepath,xyzeditpath,moleculeprmfilename,addwaterprms,molnamelist,indextogeneratecsv): gaskeyfilelist=[] gasxyzfilelist=[] liquidkeyfilelist=[] liquidxyzfilelist=[] - datacsvpathlist=[] + datacsvpathlist=[] for i in range(len(rdkitmollist)): + gencsv=indextogeneratecsv[i] rdkitmol=rdkitmollist[i] xyzfile=xyzfilelist[i] keyfile=keyfilelist[i] - density=densitylist[i] molname=molnamelist[i] - mass=Descriptors.ExactMolWt(rdkitmol)*1.66054*10**(-27) # convert daltons to Kg - axis=ComputeBoxLength(xyzfile) - boxlength=axis*10**-10 # convert angstroms to m - numbermolecules=int(density*boxlength**3/mass) - liquidxyzfile=CreateSolventBox(axis,numbermolecules,prmfilepath,xyzeditpath,xyzfile,molname) + if gencsv==True: + density=float(densitylist[i]) + mass=Descriptors.ExactMolWt(rdkitmol)*1.66054*10**(-27) # convert daltons to Kg + axis=ComputeBoxLength(xyzfile) + boxlength=axis*10**-10 # convert angstroms to m + numbermolecules=int(density*boxlength**3/mass) + liquidxyzfile=CreateSolventBox(axis,numbermolecules,prmfilepath,xyzeditpath,xyzfile,molname) + else: + liquidxyzfile=None gaskeyfile=keyfile.replace('final',molname+'Gas') gasxyzfile=xyzfile.replace('final',molname+'Gas') shutil.copy(keyfile,gaskeyfile) @@ -840,7 +922,10 @@ def GenerateTargetFiles(keyfilelist,xyzfilelist,densitylist,rdkitmollist,prmfile datacsvpath=os.path.join(os.getcwd(),name) else: datacsvpath=None - liquidkeyfile=GenerateNewKeyFile(keyfile,prmfilepath,moleculeprmfilename,axis,addwaterprms,molname) + if gencsv==True: + liquidkeyfile=GenerateNewKeyFile(keyfile,prmfilepath,moleculeprmfilename,axis,addwaterprms,molname) + else: + liquidkeyfile=None gaskeyfilelist.append(gaskeyfile) gasxyzfilelist.append(gasxyzfile) liquidkeyfilelist.append(liquidkeyfile) @@ -899,9 +984,10 @@ def GenerateQMTargetsFolder(dimertinkerxyzfileslist,dimerenergieslist,liquidkeyf energywriter.write(secondline) energywriter.write('\n') energywriter.close() - shutil.copy(liquidkeyfile,os.path.join(os.getcwd(),'liquid.key')) - CommentOutVdwLines(os.path.join(os.getcwd(),'liquid.key'),vdwtypes) - os.remove(liquidkeyfile) + if liquidkeyfile!=None: + shutil.copy(liquidkeyfile,os.path.join(os.getcwd(),'liquid.key')) + CommentOutVdwLines(os.path.join(os.getcwd(),'liquid.key'),vdwtypes) + os.remove(liquidkeyfile) os.chdir('..') os.chdir('..') @@ -971,7 +1057,7 @@ def is_exe(fpath): -def GenerateForceBalanceInputFile(moleculeprmfilename,qmfolderlist,liquidfolderlist,optimizefilepath,atomnumlist,liquid_equ_steps,liquid_prod_steps,liquid_timestep,liquid_interval,gas_equ_steps,gas_timestep,gas_interval,md_threads): +def GenerateForceBalanceInputFile(moleculeprmfilename,qmfolderlist,liquidfolderlist,optimizefilepath,atomnumlist,liquid_equ_steps,liquid_prod_steps,liquid_timestep,liquid_interval,gas_equ_steps,gas_timestep,gas_interval,md_threads,indextogeneratecsv): head,tail=os.path.split(optimizefilepath) newoptimizefilepath=os.path.join(os.getcwd(),tail) shutil.copy(optimizefilepath,newoptimizefilepath) @@ -989,8 +1075,8 @@ def GenerateForceBalanceInputFile(moleculeprmfilename,qmfolderlist,liquidfolderl temp=open(newoptimizefilepath,'a') for i in range(len(qmfolderlist)): + gencsv=indextogeneratecsv[i] qmfolder=qmfolderlist[i] - liquidfolder=liquidfolderlist[i] atomnum=atomnumlist[i] results.append('$target'+'\n') results.append('name '+qmfolder+'\n') @@ -1005,22 +1091,24 @@ def GenerateForceBalanceInputFile(moleculeprmfilename,qmfolderlist,liquidfolderl results.append('fragment1 '+'1'+'-'+lastindex+'\n') results.append('fragment2 '+str(newindex)+'-'+lastnewindex+'\n') results.append('$end'+'\n') - results.append('$target'+'\n') - results.append('name '+liquidfolder+'\n') - results.append('type Liquid_TINKER'+'\n') - results.append('weight 1.0'+'\n') - results.append('w_rho 1.0'+'\n') - results.append('w_hvap 1.0'+'\n') - results.append('liquid_equ_steps '+str(liquid_equ_steps)+'\n') - results.append('liquid_prod_steps '+str(liquid_prod_steps)+'\n') - results.append('liquid_timestep '+str(liquid_timestep)+'\n') - results.append('liquid_interval '+str(liquid_interval)+'\n') - results.append('gas_equ_steps '+str(gas_equ_steps)+'\n') - results.append('gas_prod_steps '+str(gas_prod_steps)+'\n') - results.append('gas_timestep '+str(gas_timestep)+'\n') - results.append('gas_interval '+str(gas_interval)+'\n') - results.append('md_threads '+str(md_threads)+'\n') - results.append('$end'+'\n') + if gencsv==True: + liquidfolder=liquidfolderlist[i] + results.append('$target'+'\n') + results.append('name '+liquidfolder+'\n') + results.append('type Liquid_TINKER'+'\n') + results.append('weight 1.0'+'\n') + results.append('w_rho 1.0'+'\n') + results.append('w_hvap 1.0'+'\n') + results.append('liquid_equ_steps '+str(liquid_equ_steps)+'\n') + results.append('liquid_prod_steps '+str(liquid_prod_steps)+'\n') + results.append('liquid_timestep '+str(liquid_timestep)+'\n') + results.append('liquid_interval '+str(liquid_interval)+'\n') + results.append('gas_equ_steps '+str(gas_equ_steps)+'\n') + results.append('gas_prod_steps '+str(gas_prod_steps)+'\n') + results.append('gas_timestep '+str(gas_timestep)+'\n') + results.append('gas_interval '+str(gas_interval)+'\n') + results.append('md_threads '+str(md_threads)+'\n') + results.append('$end'+'\n') for line in results: temp.write(line) temp.close() @@ -1164,11 +1252,87 @@ def FilterHighEnergy(dimertinkerxyzfileslist,dimerenergieslist,dimersplogfilesli return newdimertinkerxyzfileslistoflist,newdimerenergieslistoflist +def GrabNumericDensity(density_list): + densitylist=[] + for ls in density_list: + for value in ls: + if value.isnumeric(): + break + densitylist.append(value) + + + return densitylist + + +if csvexpdatafile!=None: + nametopropsarray=ReadCSVFile(csvexpdatafile) + nametoarrayindexorder=GrabMoleculeOrder(poltypepathlist,nametopropsarray) + temperature_list,pressure_list,enthalpy_of_vaporization_list,heat_capacity_at_constant_pressure_list,density_list=GrabArrayInputs(nametopropsarray,nametoarrayindexorder) + +if temperature_list==None: + raise ValueError('No temperature data') +if pressure_list==None: + raise ValueError('No pressure data') +if density_list==None: + raise ValueError('No density data') + + +CheckInputShapes([temperature_list,pressure_list,density_list]) +numberofmolecules=len(poltypepathlist) +targetshape=ShapeOfArray(temperature_list) +if enthalpy_of_vaporization_list==None: + enthalpy_of_vaporization_list=GenerateNoneList(targetshape) + +if enthalpy_of_vaporization_err_list==None: + enthalpy_of_vaporization_err_list=GenerateNoneList(targetshape) + +if surface_tension_list==None: + surface_tension_list=GenerateNoneList(targetshape) + +if surface_tension_err_list==None: + surface_tension_err_list=GenerateNoneList(targetshape) + +if relative_permittivity_list==None: + relative_permittivity_list=GenerateNoneList(targetshape) + +if relative_permittivity_err_list==None: + relative_permittivity_err_list=GenerateNoneList(targetshape) + +if isothermal_compressibility_list==None: + isothermal_compressibility_list=GenerateNoneList(targetshape) + +if isothermal_compressibility_err_list==None: + isothermal_compressibility_err_list=GenerateNoneList(targetshape) + +if isobaric_coefficient_of_volume_expansion_list==None: + isobaric_coefficient_of_volume_expansion_list=GenerateNoneList(targetshape) + +if isobaric_coefficient_of_volume_expansion_err_list==None: + isobaric_coefficient_of_volume_expansion_err_list=GenerateNoneList(targetshape) + +if heat_capacity_at_constant_pressure_list==None: + heat_capacity_at_constant_pressure_list=GenerateNoneList(targetshape) + +if heat_capacity_at_constant_pressure_err_list==None: + heat_capacity_at_constant_pressure_err_list=GenerateNoneList(targetshape) + +if density_list==None: + density_list=GenerateNoneList(targetshape) + +if density_err_list==None: + density_err_list=GenerateNoneList(targetshape) + +if citation_list==None: + citation_list=GenerateNoneList(targetshape) + + + +listoftptopropdics=CombineData(temperature_list,pressure_list,enthalpy_of_vaporization_list,enthalpy_of_vaporization_err_list,surface_tension_list,surface_tension_err_list,relative_permittivity_list,relative_permittivity_err_list,isothermal_compressibility_list,isothermal_compressibility_err_list,isobaric_coefficient_of_volume_expansion_list,isobaric_coefficient_of_volume_expansion_err_list,heat_capacity_at_constant_pressure_list,heat_capacity_at_constant_pressure_err_list,density_list,density_err_list,citation_list) if poltypepathlist!=None: keyfilelist,xyzfilelist,dimertinkerxyzfileslist,dimerenergieslist,molnamelist,molfilelist,dimersplogfileslist=ReadInPoltypeFiles(poltypepathlist) dimertinkerxyzfileslist,dimerenergieslist=FilterHighEnergy(dimertinkerxyzfileslist,dimerenergieslist,dimersplogfileslist) - densitylist=[ls[0] for ls in density_list] # just grab first density - GenerateLiquidCSVFile(nvtprops,listoftptopropdics,molnamelist) + densitylist=GrabNumericDensity(density_list) + indextogeneratecsv=GenerateLiquidCSVFile(nvtprops,listoftptopropdics,molnamelist) prmfilepath=os.path.join(os.path.split(__file__)[0],'amoebabio18.prm') optimizefilepath=os.path.join(os.path.split(__file__)[0],'optimize.in') xyzeditpath='xyzedit' @@ -1183,10 +1347,10 @@ def FilterHighEnergy(dimertinkerxyzfileslist,dimerenergieslist,dimersplogfilesli GenerateForceFieldFiles(vdwtypelineslist,moleculeprmfilename,fittypestogether) rdkitmollist=GenerateRdkitMolList(molfilelist) atomnumlist=[rdkitmol.GetNumAtoms() for rdkitmol in rdkitmollist] - gaskeyfilelist,gasxyzfilelist,liquidkeyfilelist,liquidxyzfilelist,datacsvpathlist=GenerateTargetFiles(keyfilelist,xyzfilelist,densitylist,rdkitmollist,prmfilepath,xyzeditpath,moleculeprmfilename,addwaterprms,molnamelist) + gaskeyfilelist,gasxyzfilelist,liquidkeyfilelist,liquidxyzfilelist,datacsvpathlist=GenerateTargetFiles(keyfilelist,xyzfilelist,densitylist,rdkitmollist,prmfilepath,xyzeditpath,moleculeprmfilename,addwaterprms,molnamelist,indextogeneratecsv) liquidfolder='Liquid' qmfolder='QM' - liquidfolderlist=GenerateLiquidTargetsFolder(gaskeyfilelist,gasxyzfilelist,liquidkeyfilelist,liquidxyzfilelist,datacsvpathlist,densitylist,liquidfolder,prmfilepath,moleculeprmfilename,vdwtypeslist,addwaterprms,molnamelist) + liquidfolderlist=GenerateLiquidTargetsFolder(gaskeyfilelist,gasxyzfilelist,liquidkeyfilelist,liquidxyzfilelist,datacsvpathlist,densitylist,liquidfolder,prmfilepath,moleculeprmfilename,vdwtypeslist,addwaterprms,molnamelist,indextogeneratecsv) qmfolderlist=GenerateQMTargetsFolder(dimertinkerxyzfileslist,dimerenergieslist,liquidkeyfilelist,qmfolder,vdwtypeslist,molnamelist) - GenerateForceBalanceInputFile(moleculeprmfilename,qmfolderlist,liquidfolderlist,optimizefilepath,atomnumlist,liquid_equ_steps,liquid_prod_steps,liquid_timestep,liquid_interval,gas_equ_steps,gas_timestep,gas_interval,md_threads) + GenerateForceBalanceInputFile(moleculeprmfilename,qmfolderlist,liquidfolderlist,optimizefilepath,atomnumlist,liquid_equ_steps,liquid_prod_steps,liquid_timestep,liquid_interval,gas_equ_steps,gas_timestep,gas_interval,md_threads,indextogeneratecsv) From 856a7e5fd36500716e74444e0a9ebc7b475ea9b3 Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Wed, 28 Jul 2021 16:56:26 -0500 Subject: [PATCH 15/27] Docs update and bug fix for creating seperate type numbers for more than two poltype jobs as input for force balance. --- tools/PoltypeInterface/ExpHalogenData.csv | 52 +++++-------------- tools/PoltypeInterface/README.MD | 2 +- .../forcebalancepoltypeinterface.py | 9 ++-- 3 files changed, 19 insertions(+), 44 deletions(-) diff --git a/tools/PoltypeInterface/ExpHalogenData.csv b/tools/PoltypeInterface/ExpHalogenData.csv index 9bf364268..522825a8b 100644 --- a/tools/PoltypeInterface/ExpHalogenData.csv +++ b/tools/PoltypeInterface/ExpHalogenData.csv @@ -1,70 +1,44 @@ -Name,Temperature (K),Pressure (atm),Density (Kg/m^3),Enthalpy (kJ/mol),Heat Capacity (Isobaric J/mol.K),Heat Capacity (Isobaric kJ/mol.K),Reference,Paper,Similar to Nist? (y/n or N/A) +Name,Temperature (K),Pressure (atm),Density (Kg/m^3),Enthalpy (kJ/mol),Heat Capacity (Isobaric J/mol.K),Heat Capacity (Isobaric kJ/mol.K),Reference,Paper,Similar to Nist? (y/n or N/A) CI4,,,,,,,,, CH3I,301,1,2255.1,27881,82.459,0.082459,DIPPR,, CH3I,286,1,2298.6,28510,82.138,0.082138,DIPPR,, CH3I,307,1,2237.4,27617,82.588,0.082588,DIPPR,, CH2I2,300,1,3301.5,50.703,133.66,0.13366,DIPPR,, -CH2I2,285,1,3336.8,51.751,UNK,UNK,DIPPR,, CH2I2,315,1,3265.7,49.654,136.12,0.13612,DIPPR,, CH2I2,298,1,3306.2,50.843,133.34,0.13334,DIPPR,, CHI3,,,,,,,,, -CF4,226,1,,2.5025,UNK,UNK,DIPPR,, -CF4,216,1,,5.6852,UNK,UNK,DIPPR,, -CF4,206,1,,7.2707,UNK,UNK,DIPPR,, CF4,144,1,1610,11.867,79.897,0.079897,DIPPR,, CF4,134,1,1661.6,12.329,78.551,0.078551,DIPPR,, CF4,124,1,1710.8,12.767,77.661,0.077661,DIPPR,, -CH3F,300,1,564.85,8.9333,UNK,UNK,DIPPR,, CH3F,285,1,634.2,10.934,93.87,0.09387,DIPPR,, -CH3F,315,1,435.13,4.9032,UNK,UNK,DIPPR,, CH3F,275,1,671.1,11.961,89.317,0.089317,DIPPR,, CH3F,265,1,703.78,12.844,85.216,0.085216,DIPPR,, -CH2F2,300,1,951.72,14.74,UNK,UNK,DIPPR,, -CH2F2,315,1,882.39,13.034,UNK,UNK,DIPPR,, -CH2F2,285,1,1011.6,16.094,UNK,UNK,DIPPR,, CH2F2,250,1,1130.4,18.49,89.118,0.089118,DIPPR,, CH2F2,240,1,1160.8,19.055,85.632,0.085632,DIPPR,, CH2F2,230,1,1190,19.586,83.02,0.08302,DIPPR,, -CHF3,298,1,694.51,0.6861,UNK,UNK,DIPPR,, -CHF3,275,1,1024.2,2.2738,UNK,UNK,DIPPR,, -CHF3,260,1,1126.8,2.7348,UNK,UNK,DIPPR,, CHF3,242,1,1225.7,13.21,100.48,0.10048,DIPPR,, CHF3,232,1,1273.9,14.038,96.974,0.096974,DIPPR,, CHF3,222,1,1318.8,14.788,93.869,0.093869,DIPPR,, -METHYL CHLORIDE,300,1,907.12,19.207,81.581,0.081581,DIPPR,, -METHYL CHLORIDE,315,1,875.1,18.271,UNK,UNK,DIPPR,, -METHYL CHLORIDE,285,1,937.32,20.055,79.443,0.079443,DIPPR,, -METHYL CHLORIDE,303,1,900.87,19.027,82.052,0.082052,DIPPR,, -DICHLOROMETHANE,300,1,1314.7,28.913,101.02,0.10102,DIPPR,, -DICHLOROMETHANE,315,1,1285.7,28.038,102.23,0.10223,DIPPR,, -DICHLOROMETHANE,285,1,1343,29.771,99.927,0.099927,DIPPR,, -CHLOROFORM,300,1,1479.4,31.289,113.84,0.11384,DIPPR,, -CHLOROFORM,285,1,1506.9,32.133,112.54,0.11254,DIPPR,, -CHLOROFORM,315,1,1451.2,30.447,115.33,0.11533,DIPPR,, -CARBON TETRACHLORIDE,300,1,1580.1,32.334,131.96,0.13196,DIPPR,, -CARBON TETRACHLORIDE,315,1,1552.3,31.568,132.7,0.1327,DIPPR,, -CARBON TETRACHLORIDE,285,1,1607.3,33.083,131.49,0.13149,DIPPR,, -CBr4,384,1,UNK,48.2,UNK,UNK,NIST,, -CBr4,390,1,UNK,48.3,UNK,UNK,DIPPR,, +CH3Cl,300,1,907.12,19.207,81.581,0.081581,DIPPR,, +CH3Cl,285,1,937.32,20.055,79.443,0.079443,DIPPR,, +CH3Cl,303,1,900.87,19.027,82.052,0.082052,DIPPR,, +CH2Cl2,300,1,1314.7,28.913,101.02,0.10102,DIPPR,, +CH2Cl2,315,1,1285.7,28.038,102.23,0.10223,DIPPR,, +CH2Cl2,285,1,1343,29.771,99.927,0.099927,DIPPR,, +CHCl3,300,1,1479.4,31.289,113.84,0.11384,DIPPR,, +CHCl3,285,1,1506.9,32.133,112.54,0.11254,DIPPR,, +CHCl3,315,1,1451.2,30.447,115.33,0.11533,DIPPR,, +CCl4,300,1,1580.1,32.334,131.96,0.13196,DIPPR,, +CCl4,315,1,1552.3,31.568,132.7,0.1327,DIPPR,, +CCl4,285,1,1607.3,33.083,131.49,0.13149,DIPPR,, CHBr3,300,1,2871.4,44.03,130.84,0.13084,DIPPR,, CHBr3,315,1,2832.6,43.338,132.02,0.13202,DIPPR,, -CHBr3,285,1,2909.6,44.689,UNK,UNK,DIPPR,, CHBr3,298,1,2876.5,44.12,130.73,0.13073,DIPPR,, -CH2Br2,370.1,1,UNK,32.92,UNK,UNK,NIST,, -CH2Br2,288,1,UNK,36.5,UNK,UNK,NIST,, -CH2Br2,253,1,UNK,37.8,UNK,UNK,NIST,, -CH3Br,281,1,UNK,24.6,UNK,UNK,NIST,, -CH3Br,262,1,UNK,25.2,UNK,UNK,NIST,, -CH3Br,276.71,1,UNK,23.912,UNK,UNK,NIST,, -FluoroBenzene,318,1,UNK,33.5,UNK,UNK,NIST,, -FluoroBenzene,337,1,UNK,32.4,UNK,UNK,NIST,, -FluoroBenzene,358,1,UNK,31.2,UNK,UNK,NIST,, ChloroBenzene,300,1,1098.5,40.675,150.28,0.15028,DIPPR,, ChloroBenzene,315,1,1083.1,40.675,152.62,0.15262,DIPPR,, ChloroBenzene,285,1,1113.6,41.266,149.37,0.14937,DIPPR,, BromoBenzene,300,1,1484.9,44.696,150.99,0.15099,DIPPR,, BromoBenzene,315,1,1465.8,43.965,154.15,0.15415,DIPPR,, -BromoBenzene,285,1,1503.8,45.395,UNK,UNK,DIPPR,, BromoBenzene,294,1,1492.5,44.98,149.77,0.14977,DIPPR,, IodoBenzene,300,1,1819.3,49.269,159.08,0.15908,DIPPR,, IodoBenzene,315,1,1797.7,48.464,160.26,0.16026,DIPPR,, diff --git a/tools/PoltypeInterface/README.MD b/tools/PoltypeInterface/README.MD index 172efc457..74c0438b2 100644 --- a/tools/PoltypeInterface/README.MD +++ b/tools/PoltypeInterface/README.MD @@ -50,7 +50,7 @@ poltypepathlist=/home/bdw2292/PoltypeJobs/HalogenPaperMolecules/CHI3,/home/bdw22 csvexpdatafile=ExpHalogenData.csv vdwtypeslist=401 402 , 401 402 ``` -* Can use UNK for when unknown data property for input arrays +* Dont let property values be blank for some TP points (need value for FB to read). * If using csvexpdatafile, please use correct units as below and the column headers in example csv file, make sure the molecule name under the Name column are same as poltype molecule folder name * By default all types in key files are reassigned new type numbers so there is no overlap while fitting together. So input types will be converted internally. * temperature_list, pressure_list and density_list are required. diff --git a/tools/PoltypeInterface/forcebalancepoltypeinterface.py b/tools/PoltypeInterface/forcebalancepoltypeinterface.py index 246f48de5..0eb3d5bbd 100644 --- a/tools/PoltypeInterface/forcebalancepoltypeinterface.py +++ b/tools/PoltypeInterface/forcebalancepoltypeinterface.py @@ -600,7 +600,6 @@ def GrabVdwTypeLinesFromFinalKey(keyfilelist,vdwtypeslist): return vdwtypelineslist def GenerateForceFieldFiles(vdwtypelineslist,moleculeprmfilename,fittypestogether): - try: length=len(fittypestogether) array=np.array(fittypestogether) @@ -640,7 +639,7 @@ def GenerateForceFieldFiles(vdwtypelineslist,moleculeprmfilename,fittypestogethe vdwtypetored[vdwtype]=False newline=' '.join(linesplit)+'\n' - vdwtypetoline[vdwtype]=newline + vdwtypetoline[vdwtype]=newline if len(array)!=0: for row in array: firsttype=row[0] # this one we reference and dont append @@ -1149,6 +1148,7 @@ def GenerateTypeMaps(keyfilelist): for keyfilename in keyfilelist: maxnumberfromkey=GrabMaxTypeNumber(keyfilename) minnumberfromkey=GrabMinTypeNumber(keyfilename) + if firsttime==True: shift=np.abs(currentmax-maxnumberfromkey)+1+prevmaxnumberfromkey-prevminnumberfromkey else: @@ -1160,6 +1160,8 @@ def GenerateTypeMaps(keyfilelist): currentmax=maxnumberfromkey types=np.arange(minnumberfromkey,maxnumberfromkey+1,1) shiftedtypes=types+shift + maxtype=max(shiftedtypes) + currentmax=maxtype oldtypetonewtype=dict(zip(types,shiftedtypes)) oldtypetonewtypelist.append(oldtypetonewtype) prevmaxnumberfromkey=maxnumberfromkey @@ -1264,11 +1266,10 @@ def GrabNumericDensity(density_list): return densitylist -if csvexpdatafile!=None: +if csvexpdatafile!=None: nametopropsarray=ReadCSVFile(csvexpdatafile) nametoarrayindexorder=GrabMoleculeOrder(poltypepathlist,nametopropsarray) temperature_list,pressure_list,enthalpy_of_vaporization_list,heat_capacity_at_constant_pressure_list,density_list=GrabArrayInputs(nametopropsarray,nametoarrayindexorder) - if temperature_list==None: raise ValueError('No temperature data') if pressure_list==None: From 894eb48e4926bdbd9262df4c25990f7aae98968a Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Thu, 29 Jul 2021 15:53:37 -0500 Subject: [PATCH 16/27] Seperate Monomer-water and Homodimer into seperate QM folders --- .../forcebalancepoltypeinterface.py | 214 ++++++++++++------ 1 file changed, 140 insertions(+), 74 deletions(-) diff --git a/tools/PoltypeInterface/forcebalancepoltypeinterface.py b/tools/PoltypeInterface/forcebalancepoltypeinterface.py index 0eb3d5bbd..cf7591f90 100644 --- a/tools/PoltypeInterface/forcebalancepoltypeinterface.py +++ b/tools/PoltypeInterface/forcebalancepoltypeinterface.py @@ -43,8 +43,8 @@ gas_timestep=1.0 gas_interval=0.1 md_threads=4 -liquid_prod_time=.1 #ns -gas_prod_time=1 #ns +liquid_prod_time=5 #ns +gas_prod_time=5 #ns nvtprops=False # NPT for most props, surface tension requires NVT and force balance complains addwaterprms=True @@ -937,58 +937,66 @@ def GenerateTargetFiles(keyfilelist,xyzfilelist,densitylist,rdkitmollist,prmfile def GenerateQMTargetsFolder(dimertinkerxyzfileslist,dimerenergieslist,liquidkeyfilelist,originalqmfolder,vdwtypeslist,molnamelist): qmfolderlist=[] for j in range(len(dimertinkerxyzfileslist)): - dimertinkerxyzfiles=dimertinkerxyzfileslist[j] - dimerenergies=dimerenergieslist[j] + moldimertinkerxyzfiles=dimertinkerxyzfileslist[j] + moldimerenergies=dimerenergieslist[j] liquidkeyfile=liquidkeyfilelist[j] molname=molnamelist[j] vdwtypes=vdwtypeslist[j] - os.chdir('targets') - qmfolder=originalqmfolder+'_'+molname - qmfolderlist.append(qmfolder) - if not os.path.isdir(qmfolder): - os.mkdir(qmfolder) - os.chdir(qmfolder) - newnamearray=[] - newenergyarray=[] - arr=np.arange(0,len(dimertinkerxyzfiles)) - arcwriter=open('all.arc','w') - for i in range(len(arr)): - value=arr[i] - tinkerxyzfile=dimertinkerxyzfiles[i] - dimerenergy=dimerenergies[i] - head,tail=os.path.split(tinkerxyzfile) - tinkerxyzfileprefix=tail.split('.')[0] - newname=tinkerxyzfileprefix+str(value) - temp=open(tinkerxyzfile,'r') - results=temp.readlines() - temp.close() - firstline=results[0] - firstlinesplit=firstline.split() - firstlinesplit.append(newname) - newfirstline=' '.join(firstlinesplit)+'\n' - results[0]=newfirstline - newnamearray.append(newname) - newenergyarray.append(dimerenergy) - for line in results: - arcwriter.write(line) - - arcwriter.close() - energywriter=open('qdata.txt','w') - for i in range(len(arr)): - value=arr[i] - energy=newenergyarray[i] - firstline='LABEL'+' '+str(value)+'\n' - secondline='INTERACTION'+' '+str(energy)+'\n' - energywriter.write(firstline) - energywriter.write(secondline) - energywriter.write('\n') - energywriter.close() - if liquidkeyfile!=None: - shutil.copy(liquidkeyfile,os.path.join(os.getcwd(),'liquid.key')) - CommentOutVdwLines(os.path.join(os.getcwd(),'liquid.key'),vdwtypes) - os.remove(liquidkeyfile) - os.chdir('..') - os.chdir('..') + for k in range(len(moldimertinkerxyzfiles)): + dimertinkerxyzfiles=moldimertinkerxyzfiles[k] + dimerenergies=moldimerenergies[k] + if k==0: + indexname='_water' + elif k==1: + indexname='_homodimer' + os.chdir('targets') + qmfolder=originalqmfolder+'_'+molname+indexname + qmfolderlist.append(qmfolder) + if not os.path.isdir(qmfolder): + os.mkdir(qmfolder) + os.chdir(qmfolder) + newnamearray=[] + newenergyarray=[] + arr=np.arange(0,len(dimertinkerxyzfiles)) + arcwriter=open('all.arc','w') + for i in range(len(arr)): + value=arr[i] + tinkerxyzfile=dimertinkerxyzfiles[i] + dimerenergy=dimerenergies[i] + head,tail=os.path.split(tinkerxyzfile) + tinkerxyzfileprefix=tail.split('.')[0] + newname=tinkerxyzfileprefix+str(value) + temp=open(tinkerxyzfile,'r') + results=temp.readlines() + temp.close() + firstline=results[0] + firstlinesplit=firstline.split() + firstlinesplit.append(newname) + newfirstline=' '.join(firstlinesplit)+'\n' + results[0]=newfirstline + newnamearray.append(newname) + newenergyarray.append(dimerenergy) + for line in results: + arcwriter.write(line) + + arcwriter.close() + energywriter=open('qdata.txt','w') + for i in range(len(arr)): + value=arr[i] + energy=newenergyarray[i] + firstline='LABEL'+' '+str(value)+'\n' + secondline='INTERACTION'+' '+str(energy)+'\n' + energywriter.write(firstline) + energywriter.write(secondline) + energywriter.write('\n') + energywriter.close() + if liquidkeyfile!=None: + shutil.copy(liquidkeyfile,os.path.join(os.getcwd(),'liquid.key')) + CommentOutVdwLines(os.path.join(os.getcwd(),'liquid.key'),vdwtypes) + if k==1: + os.remove(liquidkeyfile) + os.chdir('..') + os.chdir('..') return qmfolderlist @@ -1056,7 +1064,7 @@ def is_exe(fpath): -def GenerateForceBalanceInputFile(moleculeprmfilename,qmfolderlist,liquidfolderlist,optimizefilepath,atomnumlist,liquid_equ_steps,liquid_prod_steps,liquid_timestep,liquid_interval,gas_equ_steps,gas_timestep,gas_interval,md_threads,indextogeneratecsv): +def GenerateForceBalanceInputFile(moleculeprmfilename,qmfolderlist,liquidfolderlist,optimizefilepath,atomnumlist,liquid_equ_steps,liquid_prod_steps,liquid_timestep,liquid_interval,gas_equ_steps,gas_timestep,gas_interval,md_threads,indextogeneratecsv,qmfoldertoindex): head,tail=os.path.split(optimizefilepath) newoptimizefilepath=os.path.join(os.getcwd(),tail) shutil.copy(optimizefilepath,newoptimizefilepath) @@ -1073,10 +1081,12 @@ def GenerateForceBalanceInputFile(moleculeprmfilename,qmfolderlist,liquidfolderl temp=open(newoptimizefilepath,'a') + liquidtargettoappend=dict(zip(liquidfolderlist,[False for i in range(len(liquidfolderlist))])) for i in range(len(qmfolderlist)): - gencsv=indextogeneratecsv[i] qmfolder=qmfolderlist[i] - atomnum=atomnumlist[i] + index=qmfoldertoindex[qmfolder] + gencsv=indextogeneratecsv[index] + atomnum=atomnumlist[index] results.append('$target'+'\n') results.append('name '+qmfolder+'\n') results.append('type Interaction_TINKER'+'\n') @@ -1087,27 +1097,36 @@ def GenerateForceBalanceInputFile(moleculeprmfilename,qmfolderlist,liquidfolderl lastindex=str(atomnum) newindex=str(atomnum+1) lastnewindex=str(atomnum+1+2) - results.append('fragment1 '+'1'+'-'+lastindex+'\n') - results.append('fragment2 '+str(newindex)+'-'+lastnewindex+'\n') + homodimerlastindex=str(atomnum+1+atomnum) + if 'water' in qmfolder: + results.append('fragment1 '+'1'+'-'+lastindex+'\n') + results.append('fragment2 '+str(newindex)+'-'+lastnewindex+'\n') + elif 'homodimer' in qmfolder: + results.append('fragment1 '+'1'+'-'+lastindex+'\n') + results.append('fragment2 '+str(newindex)+'-'+homodimerlastindex+'\n') + results.append('$end'+'\n') if gencsv==True: - liquidfolder=liquidfolderlist[i] - results.append('$target'+'\n') - results.append('name '+liquidfolder+'\n') - results.append('type Liquid_TINKER'+'\n') - results.append('weight 1.0'+'\n') - results.append('w_rho 1.0'+'\n') - results.append('w_hvap 1.0'+'\n') - results.append('liquid_equ_steps '+str(liquid_equ_steps)+'\n') - results.append('liquid_prod_steps '+str(liquid_prod_steps)+'\n') - results.append('liquid_timestep '+str(liquid_timestep)+'\n') - results.append('liquid_interval '+str(liquid_interval)+'\n') - results.append('gas_equ_steps '+str(gas_equ_steps)+'\n') - results.append('gas_prod_steps '+str(gas_prod_steps)+'\n') - results.append('gas_timestep '+str(gas_timestep)+'\n') - results.append('gas_interval '+str(gas_interval)+'\n') - results.append('md_threads '+str(md_threads)+'\n') - results.append('$end'+'\n') + liquidfolder=liquidfolderlist[index] + value=liquidtargettoappend[liquidfolder] + if value==False: + liquidtargettoappend[liquidfolder]=True + results.append('$target'+'\n') + results.append('name '+liquidfolder+'\n') + results.append('type Liquid_TINKER'+'\n') + results.append('weight 1.0'+'\n') + results.append('w_rho 1.0'+'\n') + results.append('w_hvap 1.0'+'\n') + results.append('liquid_equ_steps '+str(liquid_equ_steps)+'\n') + results.append('liquid_prod_steps '+str(liquid_prod_steps)+'\n') + results.append('liquid_timestep '+str(liquid_timestep)+'\n') + results.append('liquid_interval '+str(liquid_interval)+'\n') + results.append('gas_equ_steps '+str(gas_equ_steps)+'\n') + results.append('gas_prod_steps '+str(gas_prod_steps)+'\n') + results.append('gas_timestep '+str(gas_timestep)+'\n') + results.append('gas_interval '+str(gas_interval)+'\n') + results.append('md_threads '+str(md_threads)+'\n') + results.append('$end'+'\n') for line in results: temp.write(line) temp.close() @@ -1266,6 +1285,50 @@ def GrabNumericDensity(density_list): return densitylist +def SeperateHomoDimerAndWater(dimertinkerxyzfileslist,dimerenergieslist): + newdimertinkerxyzfileslist=[] + newdimerenergieslist=[] + for i in range(len(dimertinkerxyzfileslist)): + moldimertinkerxyzfileslist=dimertinkerxyzfileslist[i] + moldimerenergieslist=dimerenergieslist[i] + waterlist=[] + homodimerlist=[] + waterenergylist=[] + homodimerenergylist=[] + for j in range(len(moldimertinkerxyzfileslist)): + xyzfile=moldimertinkerxyzfileslist[j] + eng=moldimerenergieslist[j] + if 'water' in xyzfile: + waterlist.append(xyzfile) + waterenergylist.append(eng) + else: + homodimerlist.append(xyzfile) + homodimerenergylist.append(eng) + newlist=[waterlist,homodimerlist] + newenergylist=[waterenergylist,homodimerenergylist] + newdimertinkerxyzfileslist.append(newlist) + newdimerenergieslist.append(newenergylist) + + return newdimertinkerxyzfileslist,newdimerenergieslist + + +def GenerateQMFolderToCSVIndex(qmfolderlist): + qmfoldertoindex={} + prefixtoarray={} + for i in range(len(qmfolderlist)): + folder=qmfolderlist[i] + foldersplit=folder.split('_') + folderprefix='_'.join(foldersplit[:-1]) + if folderprefix not in prefixtoarray.keys(): + prefixtoarray[folderprefix]=[] + prefixtoarray[folderprefix].append(folder) + index=0 + for prefix,array in prefixtoarray.items(): + for folder in array: + qmfoldertoindex[folder]=index + index+=1 + return qmfoldertoindex + if csvexpdatafile!=None: nametopropsarray=ReadCSVFile(csvexpdatafile) nametoarrayindexorder=GrabMoleculeOrder(poltypepathlist,nametopropsarray) @@ -1331,7 +1394,9 @@ def GrabNumericDensity(density_list): listoftptopropdics=CombineData(temperature_list,pressure_list,enthalpy_of_vaporization_list,enthalpy_of_vaporization_err_list,surface_tension_list,surface_tension_err_list,relative_permittivity_list,relative_permittivity_err_list,isothermal_compressibility_list,isothermal_compressibility_err_list,isobaric_coefficient_of_volume_expansion_list,isobaric_coefficient_of_volume_expansion_err_list,heat_capacity_at_constant_pressure_list,heat_capacity_at_constant_pressure_err_list,density_list,density_err_list,citation_list) if poltypepathlist!=None: keyfilelist,xyzfilelist,dimertinkerxyzfileslist,dimerenergieslist,molnamelist,molfilelist,dimersplogfileslist=ReadInPoltypeFiles(poltypepathlist) + dimertinkerxyzfileslist,dimerenergieslist=FilterHighEnergy(dimertinkerxyzfileslist,dimerenergieslist,dimersplogfileslist) + dimertinkerxyzfileslist,dimerenergieslist=SeperateHomoDimerAndWater(dimertinkerxyzfileslist,dimerenergieslist) densitylist=GrabNumericDensity(density_list) indextogeneratecsv=GenerateLiquidCSVFile(nvtprops,listoftptopropdics,molnamelist) prmfilepath=os.path.join(os.path.split(__file__)[0],'amoebabio18.prm') @@ -1354,4 +1419,5 @@ def GrabNumericDensity(density_list): liquidfolderlist=GenerateLiquidTargetsFolder(gaskeyfilelist,gasxyzfilelist,liquidkeyfilelist,liquidxyzfilelist,datacsvpathlist,densitylist,liquidfolder,prmfilepath,moleculeprmfilename,vdwtypeslist,addwaterprms,molnamelist,indextogeneratecsv) qmfolderlist=GenerateQMTargetsFolder(dimertinkerxyzfileslist,dimerenergieslist,liquidkeyfilelist,qmfolder,vdwtypeslist,molnamelist) - GenerateForceBalanceInputFile(moleculeprmfilename,qmfolderlist,liquidfolderlist,optimizefilepath,atomnumlist,liquid_equ_steps,liquid_prod_steps,liquid_timestep,liquid_interval,gas_equ_steps,gas_timestep,gas_interval,md_threads,indextogeneratecsv) + qmfoldertoindex=GenerateQMFolderToCSVIndex(qmfolderlist) # need way to keep track of liquid to QM + GenerateForceBalanceInputFile(moleculeprmfilename,qmfolderlist,liquidfolderlist,optimizefilepath,atomnumlist,liquid_equ_steps,liquid_prod_steps,liquid_timestep,liquid_interval,gas_equ_steps,gas_timestep,gas_interval,md_threads,indextogeneratecsv,qmfoldertoindex) From 65aa071dcb9f15dbb8d09ec81d078b43b52aad65 Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Mon, 2 Aug 2021 16:04:16 -0500 Subject: [PATCH 17/27] Bug fix, homodimer last atom index --- tools/PoltypeInterface/forcebalancepoltypeinterface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/PoltypeInterface/forcebalancepoltypeinterface.py b/tools/PoltypeInterface/forcebalancepoltypeinterface.py index cf7591f90..00dde1697 100644 --- a/tools/PoltypeInterface/forcebalancepoltypeinterface.py +++ b/tools/PoltypeInterface/forcebalancepoltypeinterface.py @@ -1097,7 +1097,7 @@ def GenerateForceBalanceInputFile(moleculeprmfilename,qmfolderlist,liquidfolderl lastindex=str(atomnum) newindex=str(atomnum+1) lastnewindex=str(atomnum+1+2) - homodimerlastindex=str(atomnum+1+atomnum) + homodimerlastindex=str(atomnum+atomnum) if 'water' in qmfolder: results.append('fragment1 '+'1'+'-'+lastindex+'\n') results.append('fragment2 '+str(newindex)+'-'+lastnewindex+'\n') From 840bb5038dba71b108857cf5e9ccd1ee3abf0ce8 Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Tue, 3 Aug 2021 11:42:54 -0500 Subject: [PATCH 18/27] Bug fix, if Poltype does not produce QM for vdw fitting (database already has), then make sure to not add to input file for ForceBalance. --- .../forcebalancepoltypeinterface.py | 152 ++++++++++-------- 1 file changed, 82 insertions(+), 70 deletions(-) diff --git a/tools/PoltypeInterface/forcebalancepoltypeinterface.py b/tools/PoltypeInterface/forcebalancepoltypeinterface.py index 00dde1697..764be9723 100644 --- a/tools/PoltypeInterface/forcebalancepoltypeinterface.py +++ b/tools/PoltypeInterface/forcebalancepoltypeinterface.py @@ -936,69 +936,79 @@ def GenerateTargetFiles(keyfilelist,xyzfilelist,densitylist,rdkitmollist,prmfile def GenerateQMTargetsFolder(dimertinkerxyzfileslist,dimerenergieslist,liquidkeyfilelist,originalqmfolder,vdwtypeslist,molnamelist): qmfolderlist=[] + qmfolderlisttogen={} for j in range(len(dimertinkerxyzfileslist)): moldimertinkerxyzfiles=dimertinkerxyzfileslist[j] moldimerenergies=dimerenergieslist[j] liquidkeyfile=liquidkeyfilelist[j] molname=molnamelist[j] vdwtypes=vdwtypeslist[j] + removeliquid=False for k in range(len(moldimertinkerxyzfiles)): dimertinkerxyzfiles=moldimertinkerxyzfiles[k] dimerenergies=moldimerenergies[k] + usefold=True + if len(dimertinkerxyzfiles)==0: + usefold=False if k==0: indexname='_water' elif k==1: indexname='_homodimer' - os.chdir('targets') qmfolder=originalqmfolder+'_'+molname+indexname qmfolderlist.append(qmfolder) - if not os.path.isdir(qmfolder): - os.mkdir(qmfolder) - os.chdir(qmfolder) - newnamearray=[] - newenergyarray=[] - arr=np.arange(0,len(dimertinkerxyzfiles)) - arcwriter=open('all.arc','w') - for i in range(len(arr)): - value=arr[i] - tinkerxyzfile=dimertinkerxyzfiles[i] - dimerenergy=dimerenergies[i] - head,tail=os.path.split(tinkerxyzfile) - tinkerxyzfileprefix=tail.split('.')[0] - newname=tinkerxyzfileprefix+str(value) - temp=open(tinkerxyzfile,'r') - results=temp.readlines() - temp.close() - firstline=results[0] - firstlinesplit=firstline.split() - firstlinesplit.append(newname) - newfirstline=' '.join(firstlinesplit)+'\n' - results[0]=newfirstline - newnamearray.append(newname) - newenergyarray.append(dimerenergy) - for line in results: - arcwriter.write(line) - - arcwriter.close() - energywriter=open('qdata.txt','w') - for i in range(len(arr)): - value=arr[i] - energy=newenergyarray[i] - firstline='LABEL'+' '+str(value)+'\n' - secondline='INTERACTION'+' '+str(energy)+'\n' - energywriter.write(firstline) - energywriter.write(secondline) - energywriter.write('\n') - energywriter.close() - if liquidkeyfile!=None: - shutil.copy(liquidkeyfile,os.path.join(os.getcwd(),'liquid.key')) - CommentOutVdwLines(os.path.join(os.getcwd(),'liquid.key'),vdwtypes) - if k==1: - os.remove(liquidkeyfile) - os.chdir('..') - os.chdir('..') + qmfolderlisttogen[qmfolder]=usefold + if usefold==True: + if not os.path.exists('targets'): + os.mkdir('targets') + os.chdir('targets') + if not os.path.isdir(qmfolder): + os.mkdir(qmfolder) + os.chdir(qmfolder) + newnamearray=[] + newenergyarray=[] + arr=np.arange(0,len(dimertinkerxyzfiles)) + arcwriter=open('all.arc','w') + for i in range(len(arr)): + value=arr[i] + tinkerxyzfile=dimertinkerxyzfiles[i] + dimerenergy=dimerenergies[i] + head,tail=os.path.split(tinkerxyzfile) + tinkerxyzfileprefix=tail.split('.')[0] + newname=tinkerxyzfileprefix+str(value) + temp=open(tinkerxyzfile,'r') + results=temp.readlines() + temp.close() + firstline=results[0] + firstlinesplit=firstline.split() + firstlinesplit.append(newname) + newfirstline=' '.join(firstlinesplit)+'\n' + results[0]=newfirstline + newnamearray.append(newname) + newenergyarray.append(dimerenergy) + for line in results: + arcwriter.write(line) + + arcwriter.close() + energywriter=open('qdata.txt','w') + for i in range(len(arr)): + value=arr[i] + energy=newenergyarray[i] + firstline='LABEL'+' '+str(value)+'\n' + secondline='INTERACTION'+' '+str(energy)+'\n' + energywriter.write(firstline) + energywriter.write(secondline) + energywriter.write('\n') + energywriter.close() + if liquidkeyfile!=None: + shutil.copy(liquidkeyfile,os.path.join(os.getcwd(),'liquid.key')) + CommentOutVdwLines(os.path.join(os.getcwd(),'liquid.key'),vdwtypes) + if removeliquid==False: + removeliquid=True + os.remove(liquidkeyfile) + os.chdir('..') + os.chdir('..') - return qmfolderlist + return qmfolderlist,qmfolderlisttogen def ReadLigandOBMol(structfname): tmpconv = openbabel.OBConversion() @@ -1064,7 +1074,7 @@ def is_exe(fpath): -def GenerateForceBalanceInputFile(moleculeprmfilename,qmfolderlist,liquidfolderlist,optimizefilepath,atomnumlist,liquid_equ_steps,liquid_prod_steps,liquid_timestep,liquid_interval,gas_equ_steps,gas_timestep,gas_interval,md_threads,indextogeneratecsv,qmfoldertoindex): +def GenerateForceBalanceInputFile(moleculeprmfilename,qmfolderlist,liquidfolderlist,optimizefilepath,atomnumlist,liquid_equ_steps,liquid_prod_steps,liquid_timestep,liquid_interval,gas_equ_steps,gas_timestep,gas_interval,md_threads,indextogeneratecsv,qmfoldertoindex,qmfolderlisttogen): head,tail=os.path.split(optimizefilepath) newoptimizefilepath=os.path.join(os.getcwd(),tail) shutil.copy(optimizefilepath,newoptimizefilepath) @@ -1084,28 +1094,30 @@ def GenerateForceBalanceInputFile(moleculeprmfilename,qmfolderlist,liquidfolderl liquidtargettoappend=dict(zip(liquidfolderlist,[False for i in range(len(liquidfolderlist))])) for i in range(len(qmfolderlist)): qmfolder=qmfolderlist[i] + useqmfolder=qmfolderlisttogen[qmfolder] index=qmfoldertoindex[qmfolder] gencsv=indextogeneratecsv[index] atomnum=atomnumlist[index] - results.append('$target'+'\n') - results.append('name '+qmfolder+'\n') - results.append('type Interaction_TINKER'+'\n') - results.append('weight .5'+'\n') - results.append('energy_denom 1.0'+'\n') - results.append('energy_upper 20.0'+'\n') - results.append('attenuate'+'\n') - lastindex=str(atomnum) - newindex=str(atomnum+1) - lastnewindex=str(atomnum+1+2) - homodimerlastindex=str(atomnum+atomnum) - if 'water' in qmfolder: - results.append('fragment1 '+'1'+'-'+lastindex+'\n') - results.append('fragment2 '+str(newindex)+'-'+lastnewindex+'\n') - elif 'homodimer' in qmfolder: - results.append('fragment1 '+'1'+'-'+lastindex+'\n') - results.append('fragment2 '+str(newindex)+'-'+homodimerlastindex+'\n') - - results.append('$end'+'\n') + if useqmfolder==True: + results.append('$target'+'\n') + results.append('name '+qmfolder+'\n') + results.append('type Interaction_TINKER'+'\n') + results.append('weight .5'+'\n') + results.append('energy_denom 1.0'+'\n') + results.append('energy_upper 20.0'+'\n') + results.append('attenuate'+'\n') + lastindex=str(atomnum) + newindex=str(atomnum+1) + lastnewindex=str(atomnum+1+2) + homodimerlastindex=str(atomnum+atomnum) + if 'water' in qmfolder: + results.append('fragment1 '+'1'+'-'+lastindex+'\n') + results.append('fragment2 '+str(newindex)+'-'+lastnewindex+'\n') + elif 'homodimer' in qmfolder: + results.append('fragment1 '+'1'+'-'+lastindex+'\n') + results.append('fragment2 '+str(newindex)+'-'+homodimerlastindex+'\n') + + results.append('$end'+'\n') if gencsv==True: liquidfolder=liquidfolderlist[index] value=liquidtargettoappend[liquidfolder] @@ -1394,9 +1406,9 @@ def GenerateQMFolderToCSVIndex(qmfolderlist): listoftptopropdics=CombineData(temperature_list,pressure_list,enthalpy_of_vaporization_list,enthalpy_of_vaporization_err_list,surface_tension_list,surface_tension_err_list,relative_permittivity_list,relative_permittivity_err_list,isothermal_compressibility_list,isothermal_compressibility_err_list,isobaric_coefficient_of_volume_expansion_list,isobaric_coefficient_of_volume_expansion_err_list,heat_capacity_at_constant_pressure_list,heat_capacity_at_constant_pressure_err_list,density_list,density_err_list,citation_list) if poltypepathlist!=None: keyfilelist,xyzfilelist,dimertinkerxyzfileslist,dimerenergieslist,molnamelist,molfilelist,dimersplogfileslist=ReadInPoltypeFiles(poltypepathlist) - dimertinkerxyzfileslist,dimerenergieslist=FilterHighEnergy(dimertinkerxyzfileslist,dimerenergieslist,dimersplogfileslist) dimertinkerxyzfileslist,dimerenergieslist=SeperateHomoDimerAndWater(dimertinkerxyzfileslist,dimerenergieslist) + densitylist=GrabNumericDensity(density_list) indextogeneratecsv=GenerateLiquidCSVFile(nvtprops,listoftptopropdics,molnamelist) prmfilepath=os.path.join(os.path.split(__file__)[0],'amoebabio18.prm') @@ -1418,6 +1430,6 @@ def GenerateQMFolderToCSVIndex(qmfolderlist): qmfolder='QM' liquidfolderlist=GenerateLiquidTargetsFolder(gaskeyfilelist,gasxyzfilelist,liquidkeyfilelist,liquidxyzfilelist,datacsvpathlist,densitylist,liquidfolder,prmfilepath,moleculeprmfilename,vdwtypeslist,addwaterprms,molnamelist,indextogeneratecsv) - qmfolderlist=GenerateQMTargetsFolder(dimertinkerxyzfileslist,dimerenergieslist,liquidkeyfilelist,qmfolder,vdwtypeslist,molnamelist) + qmfolderlist,qmfolderlisttogen=GenerateQMTargetsFolder(dimertinkerxyzfileslist,dimerenergieslist,liquidkeyfilelist,qmfolder,vdwtypeslist,molnamelist) qmfoldertoindex=GenerateQMFolderToCSVIndex(qmfolderlist) # need way to keep track of liquid to QM - GenerateForceBalanceInputFile(moleculeprmfilename,qmfolderlist,liquidfolderlist,optimizefilepath,atomnumlist,liquid_equ_steps,liquid_prod_steps,liquid_timestep,liquid_interval,gas_equ_steps,gas_timestep,gas_interval,md_threads,indextogeneratecsv,qmfoldertoindex) + GenerateForceBalanceInputFile(moleculeprmfilename,qmfolderlist,liquidfolderlist,optimizefilepath,atomnumlist,liquid_equ_steps,liquid_prod_steps,liquid_timestep,liquid_interval,gas_equ_steps,gas_timestep,gas_interval,md_threads,indextogeneratecsv,qmfoldertoindex,qmfolderlisttogen) From 1af843d165a2b428a3124f938bfed9d96620ad52 Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Tue, 3 Aug 2021 12:34:17 -0500 Subject: [PATCH 19/27] If user only includes a few experimental data points from input CSV file, just turn off liquid sim for those points and dont add to forcebalance input file. --- .../forcebalancepoltypeinterface.py | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/tools/PoltypeInterface/forcebalancepoltypeinterface.py b/tools/PoltypeInterface/forcebalancepoltypeinterface.py index 764be9723..94b08ce3a 100644 --- a/tools/PoltypeInterface/forcebalancepoltypeinterface.py +++ b/tools/PoltypeInterface/forcebalancepoltypeinterface.py @@ -111,7 +111,7 @@ def CheckNoneValue(value): value='UNK' return value -def ReadCSVFile(csvfileread): +def ReadCSVFile(csvfileread,poltypepathlist): with open(csvfileread, newline='') as csvfile: reader = list(csv.reader(csvfile, delimiter=',', quotechar='|')) header=reader[0] @@ -153,6 +153,21 @@ def ReadCSVFile(csvfileread): if heatcapstring not in nametopropsarray[name].keys(): nametopropsarray[name][heatcapstring]=[] nametopropsarray[name][heatcapstring].append(heatcap) + for path in poltypepathlist: + head,name=os.path.split(path) + if name not in nametopropsarray.keys(): + nametopropsarray[name]={} + if tempstring not in nametopropsarray[name].keys(): + nametopropsarray[name][tempstring]=[] + if pressurestring not in nametopropsarray[name].keys(): + nametopropsarray[name][pressurestring]=[] + if densitystring not in nametopropsarray[name].keys(): + nametopropsarray[name][densitystring]=[] + if enthalpystring not in nametopropsarray[name].keys(): + nametopropsarray[name][enthalpystring]=[] + if heatcapstring not in nametopropsarray[name].keys(): + nametopropsarray[name][heatcapstring]=[] + return nametopropsarray @@ -451,7 +466,7 @@ def WriteCSVFile(listoftpdics,nvtprops,molname): def GenerateLiquidCSVFile(nvtprops,listoftptopropdics,molnamelist): indextogeneratecsv={} - for i in range(len(listoftptopropdics)): + for i in range(len(molnamelist)): tptoproptovalue=listoftptopropdics[i] allunknown=True for tp,proptovalue in tptoproptovalue.items(): @@ -943,7 +958,6 @@ def GenerateQMTargetsFolder(dimertinkerxyzfileslist,dimerenergieslist,liquidkeyf liquidkeyfile=liquidkeyfilelist[j] molname=molnamelist[j] vdwtypes=vdwtypeslist[j] - removeliquid=False for k in range(len(moldimertinkerxyzfiles)): dimertinkerxyzfiles=moldimertinkerxyzfiles[k] dimerenergies=moldimerenergies[k] @@ -1002,8 +1016,7 @@ def GenerateQMTargetsFolder(dimertinkerxyzfileslist,dimerenergieslist,liquidkeyf if liquidkeyfile!=None: shutil.copy(liquidkeyfile,os.path.join(os.getcwd(),'liquid.key')) CommentOutVdwLines(os.path.join(os.getcwd(),'liquid.key'),vdwtypes) - if removeliquid==False: - removeliquid=True + if k==1: os.remove(liquidkeyfile) os.chdir('..') os.chdir('..') @@ -1288,9 +1301,12 @@ def FilterHighEnergy(dimertinkerxyzfileslist,dimerenergieslist,dimersplogfilesli def GrabNumericDensity(density_list): densitylist=[] for ls in density_list: - for value in ls: - if value.isnumeric(): - break + if len(ls)!=0: + for value in ls: + if value.isnumeric(): + break + else: + value=0 # this wont be used for liquid sims anyway densitylist.append(value) @@ -1342,9 +1358,10 @@ def GenerateQMFolderToCSVIndex(qmfolderlist): return qmfoldertoindex if csvexpdatafile!=None: - nametopropsarray=ReadCSVFile(csvexpdatafile) + nametopropsarray=ReadCSVFile(csvexpdatafile,poltypepathlist) nametoarrayindexorder=GrabMoleculeOrder(poltypepathlist,nametopropsarray) temperature_list,pressure_list,enthalpy_of_vaporization_list,heat_capacity_at_constant_pressure_list,density_list=GrabArrayInputs(nametopropsarray,nametoarrayindexorder) + if temperature_list==None: raise ValueError('No temperature data') if pressure_list==None: @@ -1401,16 +1418,13 @@ def GenerateQMFolderToCSVIndex(qmfolderlist): if citation_list==None: citation_list=GenerateNoneList(targetshape) - - listoftptopropdics=CombineData(temperature_list,pressure_list,enthalpy_of_vaporization_list,enthalpy_of_vaporization_err_list,surface_tension_list,surface_tension_err_list,relative_permittivity_list,relative_permittivity_err_list,isothermal_compressibility_list,isothermal_compressibility_err_list,isobaric_coefficient_of_volume_expansion_list,isobaric_coefficient_of_volume_expansion_err_list,heat_capacity_at_constant_pressure_list,heat_capacity_at_constant_pressure_err_list,density_list,density_err_list,citation_list) if poltypepathlist!=None: keyfilelist,xyzfilelist,dimertinkerxyzfileslist,dimerenergieslist,molnamelist,molfilelist,dimersplogfileslist=ReadInPoltypeFiles(poltypepathlist) dimertinkerxyzfileslist,dimerenergieslist=FilterHighEnergy(dimertinkerxyzfileslist,dimerenergieslist,dimersplogfileslist) dimertinkerxyzfileslist,dimerenergieslist=SeperateHomoDimerAndWater(dimertinkerxyzfileslist,dimerenergieslist) - - densitylist=GrabNumericDensity(density_list) indextogeneratecsv=GenerateLiquidCSVFile(nvtprops,listoftptopropdics,molnamelist) + densitylist=GrabNumericDensity(density_list) prmfilepath=os.path.join(os.path.split(__file__)[0],'amoebabio18.prm') optimizefilepath=os.path.join(os.path.split(__file__)[0],'optimize.in') xyzeditpath='xyzedit' From 3824a070c25bb85741074d1ce295f046a6a52cbc Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Wed, 11 Aug 2021 11:21:14 -0500 Subject: [PATCH 20/27] Keep all parameters in prm file (instead of key files). Bug fix, changing xyz type numbers for multiple molecules. --- tools/PoltypeInterface/README.MD | 1 + .../forcebalancepoltypeinterface.py | 190 +++++++++++++++--- 2 files changed, 161 insertions(+), 30 deletions(-) diff --git a/tools/PoltypeInterface/README.MD b/tools/PoltypeInterface/README.MD index 74c0438b2..6c10d3ccd 100644 --- a/tools/PoltypeInterface/README.MD +++ b/tools/PoltypeInterface/README.MD @@ -94,4 +94,5 @@ md_threads CPU cores liquid_prod_time Total time liquid sim gas_prod_time Total time gas sim nvtprops This controls whether to include surface tension or not (NVT) property +debugmode Sets MD to very short time for testing ForceBalance (.001 ns) ``` diff --git a/tools/PoltypeInterface/forcebalancepoltypeinterface.py b/tools/PoltypeInterface/forcebalancepoltypeinterface.py index 94b08ce3a..4aa507e3c 100644 --- a/tools/PoltypeInterface/forcebalancepoltypeinterface.py +++ b/tools/PoltypeInterface/forcebalancepoltypeinterface.py @@ -47,6 +47,7 @@ gas_prod_time=5 #ns nvtprops=False # NPT for most props, surface tension requires NVT and force balance complains addwaterprms=True +debugmode=False def GrabMoleculeOrder(poltypepathlist,nametopropsarray): nametoarrayindexorder={} @@ -203,6 +204,8 @@ def ReturnListOfList(string): poltypepathlist=a.split(',') elif "csvexpdatafile" in newline: csvexpdatafile=a + elif "debugmode" in newline: + debugmode=True elif "fittypestogether" in newline: fittypestogether=ReturnListOfList(a) elif "vdwtypeslist" in newline: @@ -299,12 +302,15 @@ def GenerateNoneList(targetshape): return ls +if debugmode==True: + liquid_prod_time=.001 #ns + gas_prod_time=.001 #ns + gas_prod_steps=int(1000000*gas_prod_time/gas_timestep) liquid_prod_steps=int(1000000*liquid_prod_time/liquid_timestep) - def CombineData(temperature_list,pressure_list,enthalpy_of_vaporization_list,enthalpy_of_vaporization_err_list,surface_tension_list,surface_tension_err_list,relative_permittivity_list,relative_permittivity_err_list,isothermal_compressibility_list,isothermal_compressibility_err_list,isobaric_coefficient_of_volume_expansion_list,isobaric_coefficient_of_volume_expansion_err_list,heat_capacity_at_constant_pressure_list,heat_capacity_at_constant_pressure_err_list,density_list,density_err_list,citation_list): listoftptopropdics=[] for i in range(len(temperature_list)): @@ -614,7 +620,7 @@ def GrabVdwTypeLinesFromFinalKey(keyfilelist,vdwtypeslist): return vdwtypelineslist -def GenerateForceFieldFiles(vdwtypelineslist,moleculeprmfilename,fittypestogether): +def GenerateForceFieldFiles(vdwtypelineslist,moleculeprmfilename,fittypestogether,keyfilelines,addwaterprms): try: length=len(fittypestogether) array=np.array(fittypestogether) @@ -675,6 +681,15 @@ def GenerateForceFieldFiles(vdwtypelineslist,moleculeprmfilename,fittypestogethe temp=open(moleculeprmfilename,'w') for vdwtype,line in vdwtypetoline.items(): temp.write(line) + temp.write('\n') + for keyfilels in keyfilelines: + for line in keyfilels: + temp.write(line) + if addwaterprms==True: + waterlines=WaterParameters() + for line in waterlines: + temp.write(line+'\n') + temp.close() temp.close() os.chdir('..') @@ -739,10 +754,7 @@ def GenerateLiquidTargetsFolder(gaskeyfilelist,gasxyzfilelist,liquidkeyfilelist, shutil.copy(gaskeyfile,os.path.join(os.getcwd(),'gas.key')) RemoveKeyWord(os.path.join(os.getcwd(),'gas.key'),'parameters') temp=open(os.path.join(os.getcwd(),'gas.key'),'a') - if addwaterprms==True: - waterlines=WaterParameters() - for line in waterlines: - temp.write(line+'\n') + temp.close() string='parameters '+moleculeprmfilename+'\n' AddKeyWord(os.path.join(os.getcwd(),'gas.key'),string) @@ -789,28 +801,36 @@ def ComputeBoxLength(xyzfile): aaxis = 2*float(vdwcutoff)+longestdim+4 return aaxis -def CreateSolventBox(axis,molnumber,prmfilepath,xyzeditpath,tinkerxyzname,molname): +def CreateSolventBox(axis,molnumber,prmfilepath,xyzeditpath,tinkerxyzname,molname,keyfilels): head,tail=os.path.split(tinkerxyzname) - fullkey=tinkerxyzname.replace('.xyz','.key') key=tail.replace('.xyz','.key') - shutil.copy(tinkerxyzname,os.path.join(os.getcwd(),tail)) - shutil.copy(fullkey,os.path.join(os.getcwd(),key)) + temp=open(key,'a') + for line in keyfilels: + temp.write(line) + temp.close() + print('Creating Solvent Box For '+tinkerxyzname,flush=True) temp=open('xyzedit.in','w') temp.write(tail+'\n') + temp.write(prmfilepath+'\n') temp.write('21'+'\n') temp.write(str(molnumber)+'\n') temp.write(str(axis)+','+str(axis)+','+str(axis)+'\n') temp.write('Y'+'\n') + temp.write(prmfilepath+'\n') temp.close() cmdstr=xyzeditpath+' '+'<'+' '+'xyzedit.in' call_subsystem(cmdstr,wait=True) os.replace(tail+'_2',molname+'_liquid.xyz') liquidxyzfile=os.path.join(os.getcwd(),molname+'_liquid.xyz') + #os.remove(tail) os.remove(key) - os.remove(tail) + with open(key, 'w') as fp: + pass + return liquidxyzfile def call_subsystem(cmdstr,wait=False): + print('Calling: '+cmdstr,flush=True) p = subprocess.Popen(cmdstr, shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE) if wait==True: p.wait() @@ -895,17 +915,13 @@ def GenerateNewKeyFile(keyfile,prmfilepath,moleculeprmfilename,axis,addwaterprms results=temp.readlines() temp.close() temp=open(liquidkeyfile,'a') - if addwaterprms==True: - waterlines=WaterParameters() - for line in waterlines: - temp.write(line+'\n') - temp.close() + InsertKeyfileHeader(liquidkeyfile,moleculeprmfilename,axis) return liquidkeyfile -def GenerateTargetFiles(keyfilelist,xyzfilelist,densitylist,rdkitmollist,prmfilepath,xyzeditpath,moleculeprmfilename,addwaterprms,molnamelist,indextogeneratecsv): +def GenerateTargetFiles(keyfilelist,xyzfilelist,densitylist,rdkitmollist,prmfilepath,xyzeditpath,moleculeprmfilename,addwaterprms,molnamelist,indextogeneratecsv,keyfilelines): gaskeyfilelist=[] gasxyzfilelist=[] liquidkeyfilelist=[] @@ -917,19 +933,18 @@ def GenerateTargetFiles(keyfilelist,xyzfilelist,densitylist,rdkitmollist,prmfile xyzfile=xyzfilelist[i] keyfile=keyfilelist[i] molname=molnamelist[i] + keyfilels=keyfilelines[i] if gencsv==True: density=float(densitylist[i]) mass=Descriptors.ExactMolWt(rdkitmol)*1.66054*10**(-27) # convert daltons to Kg axis=ComputeBoxLength(xyzfile) boxlength=axis*10**-10 # convert angstroms to m numbermolecules=int(density*boxlength**3/mass) - liquidxyzfile=CreateSolventBox(axis,numbermolecules,prmfilepath,xyzeditpath,xyzfile,molname) + liquidxyzfile=CreateSolventBox(axis,numbermolecules,prmfilepath,xyzeditpath,xyzfile,molname,keyfilels) else: liquidxyzfile=None - gaskeyfile=keyfile.replace('final',molname+'Gas') - gasxyzfile=xyzfile.replace('final',molname+'Gas') - shutil.copy(keyfile,gaskeyfile) - shutil.copy(xyzfile,gasxyzfile) + gaskeyfile=keyfile + gasxyzfile=xyzfile name='data'+'_'+molname+'.csv' if os.path.exists(name): @@ -1357,6 +1372,117 @@ def GenerateQMFolderToCSVIndex(qmfolderlist): index+=1 return qmfoldertoindex +def CopyFilesMoveParameters(keyfilelist,molnamelist,oldtypetonewtypelist,xyzfilelist): + newxyzfilelist=[] + newkeyfilelist=[] + for i in range(len(keyfilelist)): + key=keyfilelist[i] + molname=molnamelist[i] + xyzfile=xyzfilelist[i] + newkey=os.path.join(os.getcwd(),molname+'Gas'+'.key') + newxyz=os.path.join(os.getcwd(),molname+'Gas'+'.xyz') + shutil.copy(xyzfile,newxyz) + shutil.copy(key,newkey) + newkeyfilelist.append(newkey) + newxyzfilelist.append(newxyz) + keyfilelines=[] + for i in range(len(newkeyfilelist)): + newkey=newkeyfilelist[i] + newxyz=newxyzfilelist[i] + oldtypetonewtype=oldtypetonewtypelist[i] + temp=open(newkey,'r') + results=temp.readlines() + temp.close() + for lineidx in range(len(results)): + line=results[lineidx] + linesplit=line.split() + if len(linesplit)>1: + if linesplit[0]=='atom': + atomidx=lineidx + break + os.remove(newkey) + with open(newkey, 'w') as fp: + pass + newresults=results[atomidx:] + ShiftXYZTypes(newxyz,oldtypetonewtype) + for lineidx in range(len(newresults)): + line=newresults[lineidx] + linesplit=re.split(r'(\s+)', line) + willchange=False + for eidx in range(len(linesplit)): + e=linesplit[eidx] + if e.isdigit(): + test=int(e) + if test in oldtypetonewtype.keys(): + newtype=oldtypetonewtype[test] + newtype=str(newtype) + linesplit[eidx]=newtype + willchange=True + if willchange==True: + newline=''.join(linesplit) + newresults[lineidx]=newline + keyfilelines.append(newresults) + + + return newkeyfilelist,newxyzfilelist,keyfilelines + + +def RemoveExtraFiles(): + files=os.listdir() + for f in files: + if not os.path.isdir(f): + if '.' in f: + fsplit=f.split('.') + ext=fsplit[-1] + if ext=='key' or 'xyz' in ext or f=='xyzedit.in' or ('data' in f and 'csv' in f): + os.remove(f) + + +def ShiftXYZTypes(newxyz,oldtypetonewtype): + temp=open(newxyz,'r') + newresults=temp.readlines() + temp.close() + tempname=newxyz.replace('.xyz','_TEMP.xyz') + temp=open(tempname,'w') + for lineidx in range(len(newresults)): + line=newresults[lineidx] + linesplit=re.split(r'(\s+)', line) + willchange=False + for eidx in range(len(linesplit)): + e=linesplit[eidx] + if e.isdigit(): + test=int(e) + if test in oldtypetonewtype.keys(): + newtype=oldtypetonewtype[test] + newtype=str(newtype) + linesplit[eidx]=newtype + willchange=True + if willchange==True: + line=''.join(linesplit) + temp.write(line) + temp.close() + os.remove(newxyz) + os.rename(tempname,newxyz) + + +def ShiftDimerXYZTypes(dimertinkerxyzfileslist,oldtypetonewtypelist): + newdimertinkerxyzfileslist=[] + for i in range(len(dimertinkerxyzfileslist)): + subls=dimertinkerxyzfileslist[i] + newsubls=[] + oldtypetonewtype=oldtypetonewtypelist[i] + for j in range(len(subls)): + xyzfile=subls[j] + head,tail=os.path.split(xyzfile) + newxyzfile=os.path.join(os.getcwd(),tail) + shutil.copy(xyzfile,newxyzfile) + ShiftXYZTypes(newxyzfile,oldtypetonewtype) + newsubls.append(newxyzfile) + newdimertinkerxyzfileslist.append(newsubls) + + return newdimertinkerxyzfileslist + + if csvexpdatafile!=None: nametopropsarray=ReadCSVFile(csvexpdatafile,poltypepathlist) nametoarrayindexorder=GrabMoleculeOrder(poltypepathlist,nametopropsarray) @@ -1421,6 +1547,13 @@ def GenerateQMFolderToCSVIndex(qmfolderlist): listoftptopropdics=CombineData(temperature_list,pressure_list,enthalpy_of_vaporization_list,enthalpy_of_vaporization_err_list,surface_tension_list,surface_tension_err_list,relative_permittivity_list,relative_permittivity_err_list,isothermal_compressibility_list,isothermal_compressibility_err_list,isobaric_coefficient_of_volume_expansion_list,isobaric_coefficient_of_volume_expansion_err_list,heat_capacity_at_constant_pressure_list,heat_capacity_at_constant_pressure_err_list,density_list,density_err_list,citation_list) if poltypepathlist!=None: keyfilelist,xyzfilelist,dimertinkerxyzfileslist,dimerenergieslist,molnamelist,molfilelist,dimersplogfileslist=ReadInPoltypeFiles(poltypepathlist) + oldtypetonewtypelist=GenerateTypeMaps(keyfilelist) + vdwtypelineslist=GrabVdwTypeLinesFromFinalKey(keyfilelist,vdwtypeslist) + vdwtypelineslist=ShiftVdwTypesLines(vdwtypelineslist,oldtypetonewtypelist) + fittypestogether=ShiftTypes(fittypestogether,oldtypetonewtypelist) + vdwtypeslist=ShiftTypes(vdwtypeslist,oldtypetonewtypelist) + keyfilelist,xyzfilelist,keyfilelines=CopyFilesMoveParameters(keyfilelist,molnamelist,oldtypetonewtypelist,xyzfilelist) + dimertinkerxyzfileslist=ShiftDimerXYZTypes(dimertinkerxyzfileslist,oldtypetonewtypelist) dimertinkerxyzfileslist,dimerenergieslist=FilterHighEnergy(dimertinkerxyzfileslist,dimerenergieslist,dimersplogfileslist) dimertinkerxyzfileslist,dimerenergieslist=SeperateHomoDimerAndWater(dimertinkerxyzfileslist,dimerenergieslist) indextogeneratecsv=GenerateLiquidCSVFile(nvtprops,listoftptopropdics,molnamelist) @@ -1430,20 +1563,17 @@ def GenerateQMFolderToCSVIndex(qmfolderlist): xyzeditpath='xyzedit' tinkerdir=None xyzeditpath=SanitizeMMExecutable(xyzeditpath,tinkerdir) - vdwtypelineslist=GrabVdwTypeLinesFromFinalKey(keyfilelist,vdwtypeslist) - oldtypetonewtypelist=GenerateTypeMaps(keyfilelist) - vdwtypelineslist=ShiftVdwTypesLines(vdwtypelineslist,oldtypetonewtypelist) - fittypestogether=ShiftTypes(fittypestogether,oldtypetonewtypelist) - vdwtypeslist=ShiftTypes(vdwtypeslist,oldtypetonewtypelist) moleculeprmfilename='molecule.prm' - GenerateForceFieldFiles(vdwtypelineslist,moleculeprmfilename,fittypestogether) + + GenerateForceFieldFiles(vdwtypelineslist,moleculeprmfilename,fittypestogether,keyfilelines,addwaterprms) rdkitmollist=GenerateRdkitMolList(molfilelist) atomnumlist=[rdkitmol.GetNumAtoms() for rdkitmol in rdkitmollist] - gaskeyfilelist,gasxyzfilelist,liquidkeyfilelist,liquidxyzfilelist,datacsvpathlist=GenerateTargetFiles(keyfilelist,xyzfilelist,densitylist,rdkitmollist,prmfilepath,xyzeditpath,moleculeprmfilename,addwaterprms,molnamelist,indextogeneratecsv) + gaskeyfilelist,gasxyzfilelist,liquidkeyfilelist,liquidxyzfilelist,datacsvpathlist=GenerateTargetFiles(keyfilelist,xyzfilelist,densitylist,rdkitmollist,prmfilepath,xyzeditpath,moleculeprmfilename,addwaterprms,molnamelist,indextogeneratecsv,keyfilelines) liquidfolder='Liquid' qmfolder='QM' liquidfolderlist=GenerateLiquidTargetsFolder(gaskeyfilelist,gasxyzfilelist,liquidkeyfilelist,liquidxyzfilelist,datacsvpathlist,densitylist,liquidfolder,prmfilepath,moleculeprmfilename,vdwtypeslist,addwaterprms,molnamelist,indextogeneratecsv) qmfolderlist,qmfolderlisttogen=GenerateQMTargetsFolder(dimertinkerxyzfileslist,dimerenergieslist,liquidkeyfilelist,qmfolder,vdwtypeslist,molnamelist) qmfoldertoindex=GenerateQMFolderToCSVIndex(qmfolderlist) # need way to keep track of liquid to QM - GenerateForceBalanceInputFile(moleculeprmfilename,qmfolderlist,liquidfolderlist,optimizefilepath,atomnumlist,liquid_equ_steps,liquid_prod_steps,liquid_timestep,liquid_interval,gas_equ_steps,gas_timestep,gas_interval,md_threads,indextogeneratecsv,qmfoldertoindex,qmfolderlisttogen) + GenerateForceBalanceInputFile(moleculeprmfilename,qmfolderlist,liquidfolderlist,optimizefilepath,atomnumlist,liquid_equ_steps,liquid_prod_steps,liquid_timestep,liquid_interval,gas_equ_steps,gas_timestep,gas_interval,md_threads,indextogeneratecsv,qmfoldertoindex,qmfolderlisttogen) + RemoveExtraFiles() From 4e3267797942dec09387daf6fc02d468be53e777 Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Thu, 6 Jan 2022 14:37:51 -0600 Subject: [PATCH 21/27] Change forcebalance to have Tinker9 dynamics, keyword dynamic_gpu --- src/nifty.py | 4 ++++ src/tinkerio.py | 9 +++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/nifty.py b/src/nifty.py index e57b66ba2..91cc88929 100644 --- a/src/nifty.py +++ b/src/nifty.py @@ -788,6 +788,7 @@ def multiD_statisticalInefficiency(A_n, B_n=None, fast=False, mintime=3, warn=Tr #========================================# def lp_dump(obj, fnm, protocol=0): + print('right here',flush=True) """ Write an object to a zipped pickle file specified by the path. """ # Safeguard against overwriting files? Nah. # if os.path.exists(fnm): @@ -804,6 +805,7 @@ def lp_dump(obj, fnm, protocol=0): f = open(fnm, 'wb') Pickler(f, protocol).dump(obj) f.close() + print('down here',flush=True) def lp_load(fnm): """ Read an object from a bzipped file specified by the path. """ @@ -923,6 +925,8 @@ def queue_up(wq, command, input_files, output_files, tag=None, tgt=None, verbose if tag is None: tag = command task.specify_tag(tag) task.print_time = print_time + if 'GPUDYNAMICS' in os.environ.keys() and 'gas' not in command: + task.specify_gpus(1) taskid = wq.submit(task) if verbose: logger.info("Submitting command '%s' to the Work Queue, %staskid %i\n" % (command, "tag %s, " % tag if tag != command else "", taskid)) diff --git a/src/tinkerio.py b/src/tinkerio.py index 201bcc906..047426ce7 100644 --- a/src/tinkerio.py +++ b/src/tinkerio.py @@ -360,7 +360,8 @@ def calltinker(self, command, stdin=None, print_to_screen=False, print_command=F else: tinkerpath=self.tinkerpath prog = os.path.join(tinkerpath, csplit[0]) - csplit[0] = prog + if 'dynamic_gpu' not in csplit[0]: + csplit[0] = prog o = _exec(' '.join(csplit), stdin=stdin, print_to_screen=print_to_screen, print_command=print_command, rbytes=1024, **kwargs) # Determine the TINKER version number. for line in o[:10]: @@ -975,7 +976,7 @@ def molecular_dynamics(self, nsteps, timestep, temperature=None, pressure=None, if verbose: logger.info("Done\n") if 'GPUDYNAMICS' in os.environ.keys() and 'gas' not in self.name: dynamickeyword='dynamic_gpu' - suffix=' N' + suffix='' else: dynamickeyword='dynamic' suffix='' @@ -1139,10 +1140,14 @@ def npt_simulation(self, temperature, pressure, simnum): dynsrc = self.DynDict[(temperature, pressure)] dyndest = os.path.join(os.getcwd(), 'liquid.dyn') logger.info("Copying .dyn file: %s to %s\n" % (dynsrc, dyndest)) + print('right here about to copy dyn file',flush=True) shutil.copy2(dynsrc,dyndest) + print('after file copy ',flush=True) self.nptfiles.append(dyndest) self.DynDict_New[(temperature, pressure)] = os.path.join(os.getcwd(),'liquid.dyn') + print('about to submit new sim',flush=True) super(Liquid_TINKER, self).npt_simulation(temperature, pressure, simnum) + print('new sim done',flush=True) self.last_traj = [i for i in self.last_traj if '.dyn' not in i] class AbInitio_TINKER(AbInitio): From d2af7981aa8e53fb3f36a901f4162c254452dc06 Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Thu, 6 Jan 2022 14:56:02 -0600 Subject: [PATCH 22/27] Update forcebalance for Tinker9 GPU dynamics, keyword dynamic_gpu --- src/nifty.py | 2 -- src/tinkerio.py | 4 ---- 2 files changed, 6 deletions(-) diff --git a/src/nifty.py b/src/nifty.py index 91cc88929..b0b88c654 100644 --- a/src/nifty.py +++ b/src/nifty.py @@ -788,7 +788,6 @@ def multiD_statisticalInefficiency(A_n, B_n=None, fast=False, mintime=3, warn=Tr #========================================# def lp_dump(obj, fnm, protocol=0): - print('right here',flush=True) """ Write an object to a zipped pickle file specified by the path. """ # Safeguard against overwriting files? Nah. # if os.path.exists(fnm): @@ -805,7 +804,6 @@ def lp_dump(obj, fnm, protocol=0): f = open(fnm, 'wb') Pickler(f, protocol).dump(obj) f.close() - print('down here',flush=True) def lp_load(fnm): """ Read an object from a bzipped file specified by the path. """ diff --git a/src/tinkerio.py b/src/tinkerio.py index 047426ce7..56657ce59 100644 --- a/src/tinkerio.py +++ b/src/tinkerio.py @@ -1140,14 +1140,10 @@ def npt_simulation(self, temperature, pressure, simnum): dynsrc = self.DynDict[(temperature, pressure)] dyndest = os.path.join(os.getcwd(), 'liquid.dyn') logger.info("Copying .dyn file: %s to %s\n" % (dynsrc, dyndest)) - print('right here about to copy dyn file',flush=True) shutil.copy2(dynsrc,dyndest) - print('after file copy ',flush=True) self.nptfiles.append(dyndest) self.DynDict_New[(temperature, pressure)] = os.path.join(os.getcwd(),'liquid.dyn') - print('about to submit new sim',flush=True) super(Liquid_TINKER, self).npt_simulation(temperature, pressure, simnum) - print('new sim done',flush=True) self.last_traj = [i for i in self.last_traj if '.dyn' not in i] class AbInitio_TINKER(AbInitio): From 422559454dc88e8d9f61c219cb47b60cb2332068 Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Wed, 26 Jan 2022 15:07:55 -0600 Subject: [PATCH 23/27] Add analyze_gpu to ForceBalance for speed. Make sure no absolute paths go into WorkQueue, it will throw fatal error. --- src/nifty.py | 34 +++++++++++++++++++++++++++++++--- src/tinkerio.py | 37 ++++++++++++++++++++++++++++++------- 2 files changed, 61 insertions(+), 10 deletions(-) diff --git a/src/nifty.py b/src/nifty.py index b0b88c654..a0f3f7541 100644 --- a/src/nifty.py +++ b/src/nifty.py @@ -873,6 +873,8 @@ def load_gz(): # Global variable containing a mapping from target names to Work Queue task IDs WQIDS = defaultdict(list) +taskidtooutputfilepathslist={} + def getWorkQueue(): global WORK_QUEUE @@ -911,21 +913,27 @@ def queue_up(wq, command, input_files, output_files, tag=None, tgt=None, verbose @param[in] input_files (list of files) A list of locations of the input files. @param[in] output_files (list of files) A list of locations of the output files. """ + outputfilepaths=[] global WQIDS + global taskidtooutputfilepathslist task = work_queue.Task(command) cwd = os.getcwd() for f in input_files: lf = os.path.join(cwd,f) - task.specify_input_file(lf,f,cache=False) + head,f=os.path.split(f) + task.specify_file(lf,f, work_queue.WORK_QUEUE_INPUT, cache=False) for f in output_files: lf = os.path.join(cwd,f) - task.specify_output_file(lf,f,cache=False) + outputfilepaths.append(lf) + task.specify_file(f,f, work_queue.WORK_QUEUE_OUTPUT, cache=False) + if tag is None: tag = command task.specify_tag(tag) task.print_time = print_time if 'GPUDYNAMICS' in os.environ.keys() and 'gas' not in command: task.specify_gpus(1) taskid = wq.submit(task) + taskidtooutputfilepathslist[taskid]=outputfilepaths if verbose: logger.info("Submitting command '%s' to the Work Queue, %staskid %i\n" % (command, "tag %s, " % tag if tag != command else "", taskid)) if tgt is not None: @@ -967,6 +975,7 @@ def queue_up_src_dest(wq, command, input_files, output_files, tag=None, tgt=None def wq_wait1(wq, wait_time=10, wait_intvl=1, print_time=60, verbose=False): """ This function waits ten seconds to see if a task in the Work Queue has finished. """ global WQIDS + global taskidtooutputfilepathslist if verbose: logger.info('---\n') if wait_intvl >= wait_time: wait_time = wait_intvl @@ -998,6 +1007,7 @@ def wq_wait1(wq, wait_time=10, wait_intvl=1, print_time=60, verbose=False): logger.warning("Task '%s' (task %i) failed on host %s (%i seconds), resubmitted: taskid %i\n" % (task.tag, oldid, oldhost, exectime, taskid)) WQIDS[tgtname].append(taskid) else: + taskid=task.id if hasattr(task, 'print_time'): print_time = task.print_time if exectime > print_time: # Assume that we're only interested in printing jobs that last longer than a minute. @@ -1006,6 +1016,24 @@ def wq_wait1(wq, wait_time=10, wait_intvl=1, print_time=60, verbose=False): if task.id in WQIDS[tnm]: WQIDS[tnm].remove(task.id) del task + newoutputfilepaths=[] # sort by largest file size and move largest first (like move arc first so dont submit next job before arc and dyn are returned + if taskid in taskidtooutputfilepathslist.keys(): + outputfilepaths=taskidtooutputfilepathslist[taskid] + if outputfilepaths!=None: + for outputfilepath in outputfilepaths: + head,tail=os.path.split(outputfilepath) + if os.path.isdir(head): + if os.path.isfile(tail): + newoutputfilepaths.append(outputfilepath) + newfiles=[os.path.split(i)[1] for i in newoutputfilepaths] + newfilestofilepaths=dict(zip(newfiles,newoutputfilepaths)) + filesizes=[os.stat(thefile).st_size for thefile in newfiles] + newfilestofilesizes=dict(zip(newfiles,filesizes)) + sorteddic={k: v for k, v in sorted(newfilestofilesizes.items(), key=lambda item: item[1],reverse=True)} + for filename in sorteddic.keys(): + filepath=newfilestofilepaths[filename] + shutil.move(os.path.join(os.getcwd(),filename),filepath) + # LPW 2018-09-10 Updated to use stats fields from CCTools 6.2.10 # Please upgrade CCTools version if errors are encountered during runtime. @@ -1561,7 +1589,7 @@ def process_err(read): return Out _exec.returncode = None -def warn_press_key(warning, timeout=10): +def warn_press_key(warning, timeout=1): logger.warning(warning + '\n') if sys.stdin.isatty(): logger.warning("\x1b[1;91mPress Enter or wait %i seconds (I assume no responsibility for what happens after this!)\x1b[0m\n" % timeout) diff --git a/src/tinkerio.py b/src/tinkerio.py index 56657ce59..78467bca4 100644 --- a/src/tinkerio.py +++ b/src/tinkerio.py @@ -358,10 +358,23 @@ def calltinker(self, command, stdin=None, print_to_screen=False, print_command=F if tinkpath!=None: # need to override input masterhost tinkerpath, otherwise if worker node has different )S/ libraries then will crash tinkerpath=tinkpath else: - tinkerpath=self.tinkerpath - prog = os.path.join(tinkerpath, csplit[0]) - if 'dynamic_gpu' not in csplit[0]: + tinkerpath=self.tinkerpath + + if 'analyze' in command: + gpuvergood=False + if stdin=='E,M': + gpuvergood=True + if command[-1]=='E' or command[-1]=='M': + gpuvergood=True + if 'GPUDYNAMICS' in os.environ.keys() and gpuvergood==True: + csplit[0]='analyze_gpu' + else: + csplit[0]='analyze' + command=' '.join(csplit) + if '_gpu' not in command: + prog = os.path.join(tinkerpath, csplit[0]) csplit[0] = prog + o = _exec(' '.join(csplit), stdin=stdin, print_to_screen=print_to_screen, print_command=print_command, rbytes=1024, **kwargs) # Determine the TINKER version number. for line in o[:10]: @@ -391,13 +404,12 @@ def calltinker(self, command, stdin=None, print_to_screen=False, print_command=F versionstr=newversionstr vn=versionstr vn = float(vn) - if 'GPUDYNAMICS' in os.environ.keys(): # then tinker 9 version + if '_gpu' in command: # then tinker 9 version vn_need=1 else: vn_need = 6.3 vn = float(vn) - vn_need = 6.3 try: if vn < vn_need: if self.warn_vn: @@ -675,7 +687,7 @@ def evaluate_(self, xyzin, force=False, dipole=False): Result = OrderedDict() # If we want the dipoles (or just energies), analyze is the way to go. if dipole or (not force): - oanl = self.calltinker("analyze %s -k %s" % (xyzin, self.name), stdin="G,E,M", print_to_screen=False) + oanl = self.calltinker("analyze %s -k %s" % (xyzin, self.name), stdin="E,M", print_to_screen=False) # Read potential energy and dipole from file. eanl = [] dip = [] @@ -1021,7 +1033,18 @@ def molecular_dynamics(self, nsteps, timestep, temperature=None, pressure=None, temps = np.array(temps) if verbose: logger.info("Post-processing to get the dipole moments\n") - oanl = self.calltinker("analyze %s-md.arc" % self.name, stdin="G,E,M", print_to_screen=False) + oanl = self.calltinker("analyze %s " % self.name, stdin="G,E,M", print_to_screen=False) + for ln, line in enumerate(oanl): + if 'Polarization' in line: + if 'MUTUAL' in line or 'THOLE' in line: + continue + + strip = line.strip() + s = line.split() + if 'Total System Mass' in line: + mass = float(s[-1]) + + oanl = self.calltinker("analyze %s-md.arc" % self.name, stdin="E,M", print_to_screen=False) # Read potential energy and dipole from file. eanl = [] From be69727986ac8319810e557e4df83b4f084af246 Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Mon, 31 Jan 2022 11:15:05 -0600 Subject: [PATCH 24/27] Bug fix, mass was set to 0 in last commit with analyze_gpu addition. --- src/tinkerio.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/tinkerio.py b/src/tinkerio.py index 78467bca4..d9323e496 100644 --- a/src/tinkerio.py +++ b/src/tinkerio.py @@ -773,6 +773,9 @@ def energy_dipole(self): x = "%s.xyz" % self.name self.mol.write(x, ftype="tinker") Result = self.evaluate_(x, dipole=True) + print('Result',Result,flush=True) + print('Result["Energy"]',Result["Energy"],flush=True) + print('Result["Dipole"]',Result["Dipole"],flush=True) return np.hstack((Result["Energy"].reshape(-1,1), Result["Dipole"])) def normal_modes(self, shot=0, optimize=True): @@ -1032,13 +1035,14 @@ def molecular_dynamics(self, nsteps, timestep, temperature=None, pressure=None, kdyn = np.array(kdyn) * 4.184 temps = np.array(temps) + mass = 0.0 if verbose: logger.info("Post-processing to get the dipole moments\n") oanl = self.calltinker("analyze %s " % self.name, stdin="G,E,M", print_to_screen=False) for ln, line in enumerate(oanl): if 'Polarization' in line: if 'MUTUAL' in line or 'THOLE' in line: continue - + strip = line.strip() s = line.split() if 'Total System Mass' in line: @@ -1049,7 +1053,6 @@ def molecular_dynamics(self, nsteps, timestep, temperature=None, pressure=None, # Read potential energy and dipole from file. eanl = [] dip = [] - mass = 0.0 ecomp = OrderedDict() havekeys = set() first_shot = True From 3c4191610025cff98868662ef2283ca2f2dff501 Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Mon, 21 Feb 2022 15:25:32 -0600 Subject: [PATCH 25/27] Tell WorkQueue to return liquid.arc files from worker directory --- src/liquid.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/liquid.py b/src/liquid.py index adb41ab11..a8f5fec7c 100644 --- a/src/liquid.py +++ b/src/liquid.py @@ -387,8 +387,13 @@ def npt_simulation(self, temperature, pressure, simnum): mol2_send = self.mol2 else: mol2_send = [] + inputs=self.nptfiles + self.scripts + mol2_send + for input in inputs: + if '.xyz' in input: + output=input.replace('.xyz','.arc') + self.extra_output.append(output) queue_up(wq, command = cmdstr+' > npt.out 2>&1 ', - input_files = self.nptfiles + self.scripts + mol2_send + ['forcebalance.p'], + input_files = inputs + ['forcebalance.p'], output_files = ['npt_result.p', 'npt.out'] + self.extra_output, tgt=self) def nvt_simulation(self, temperature): @@ -409,8 +414,14 @@ def nvt_simulation(self, temperature): mol2_send = self.mol2 else: mol2_send = [] + inputs=self.nvtfiles + self.scripts + mol2_send + for input in inputs: + if '.xyz' in input: + output=input.replace('.xyz','.arc') + self.extra_output.append(output) + queue_up(wq, command = cmdstr+' > nvt.out 2>&1 ', - input_files = self.nvtfiles + self.scripts + mol2_send + ['forcebalance.p'], + input_files = inputs + ['forcebalance.p'], output_files = ['nvt_result.p', 'nvt.out'] + self.extra_output, tgt=self) def polarization_correction(self,mvals): From 82be78aedf1fb2e3e4e4ac6f4a7bb5f7e174bea6 Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Mon, 14 Mar 2022 11:44:48 -0500 Subject: [PATCH 26/27] Dont return arc file in work queue, seems to crash sometimes --- src/liquid.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/liquid.py b/src/liquid.py index a8f5fec7c..4cc1c68ed 100644 --- a/src/liquid.py +++ b/src/liquid.py @@ -388,10 +388,10 @@ def npt_simulation(self, temperature, pressure, simnum): else: mol2_send = [] inputs=self.nptfiles + self.scripts + mol2_send - for input in inputs: - if '.xyz' in input: - output=input.replace('.xyz','.arc') - self.extra_output.append(output) + #for input in inputs: + # if '.xyz' in input: + # output=input.replace('.xyz','.arc') + # self.extra_output.append(output) queue_up(wq, command = cmdstr+' > npt.out 2>&1 ', input_files = inputs + ['forcebalance.p'], output_files = ['npt_result.p', 'npt.out'] + self.extra_output, tgt=self) @@ -415,10 +415,10 @@ def nvt_simulation(self, temperature): else: mol2_send = [] inputs=self.nvtfiles + self.scripts + mol2_send - for input in inputs: - if '.xyz' in input: - output=input.replace('.xyz','.arc') - self.extra_output.append(output) + #for input in inputs: + # if '.xyz' in input: + # output=input.replace('.xyz','.arc') + # self.extra_output.append(output) queue_up(wq, command = cmdstr+' > nvt.out 2>&1 ', input_files = inputs + ['forcebalance.p'], From 178f3e077eafdd3f62542fb47ffe014b66dbee42 Mon Sep 17 00:00:00 2001 From: bdw2292 Date: Sun, 8 May 2022 10:54:58 -0500 Subject: [PATCH 27/27] Revert analyze_gpu back to cpu analyze, CPU has more precision for loss function gradient in forcebalance. --- src/tinkerio.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/tinkerio.py b/src/tinkerio.py index d9323e496..f3c550424 100644 --- a/src/tinkerio.py +++ b/src/tinkerio.py @@ -366,10 +366,7 @@ def calltinker(self, command, stdin=None, print_to_screen=False, print_command=F gpuvergood=True if command[-1]=='E' or command[-1]=='M': gpuvergood=True - if 'GPUDYNAMICS' in os.environ.keys() and gpuvergood==True: - csplit[0]='analyze_gpu' - else: - csplit[0]='analyze' + csplit[0]='analyze' command=' '.join(csplit) if '_gpu' not in command: prog = os.path.join(tinkerpath, csplit[0])