def test_qmol_12(): fullans = copy.deepcopy(fullans1a) fullans["provenance"] = _arrays_prov_stamp asdf = qcdb.Molecule(geom=[0.0, 0.0, 0.0, 1.0, 0.0, 0.0], elez=[8, 1], fix_com=True) assert compare_molrecs(fullans, asdf.to_dict(), tnm(), relative_geoms="align", atol=1.0e-4) assert compare_integers(2, asdf.natom(), tnm()) import json smol = json.dumps(asdf.to_dict(np_out=False)) dmol = json.loads(smol) asdf2 = qcdb.Molecule(dmol) assert compare_molrecs(fullans, asdf2.to_dict(), tnm(), relative_geoms="align", atol=1.0e-4) assert compare_integers(2, asdf2.natom(), tnm())
def test_qmol_12(): asdf = qcdb.Molecule(geom=[ 0., 0., 0., 1., 0., 0.], elez=[8, 1], fix_com=True) assess_mol_11(asdf, 'qcdb.Molecule(geom, elez)') import json smol = json.dumps(asdf.to_dict(np_out=False)) dmol = json.loads(smol) asdf2 = qcdb.Molecule(dmol) assess_mol_11(asdf, 'qcdb.Molecule(jsondict)')
def test_tu2_uhf_yaml(): yamlin = """ molecule: | 0 3 C H 1 R H 1 R 2 A R = 1.075 A = 133.93 driver: !!python/name:qcdb.energy method: nwc-hf options: memory: 1gb basis: '6-31g**' reference: uhf puream: cart scf_type: pk """ import yaml asdf = yaml.load(yamlin, Loader=yaml.FullLoader) ene = asdf['driver'](asdf['method'], options=asdf['options'], molecule=qcdb.Molecule(asdf['molecule'])) assert compare_values(-38.9253416082900827, ene, 6, 'calc from yaml str')
def test_tu1_rhf_b(): """tu1-h2o-energy/input.dat local testing """ # memory 600 mb h2o = qcdb.Molecule(""" O H 1 1.8 H 1 1.8 2 104.5 units au """) qcdb.set_options({ 'scf_type': 'pk', }) E, jrec = qcdb.energy('p4-hf/cc-pVDZ', molecule=h2o, return_wfn=True) print(qcdb.print_variables(jrec['qcvars'])) assert compare_values(_ref_h2o_pk_rhf, jrec['qcvars']['HF TOTAL ENERGY'].data, 6, sys._getframe().f_code.co_name)
def test_uhf_yaml_nwchem(): yamlin = """ molecule: | 0 3 C H 1 R H 1 R 2 A R = 1.075 A = 133.93 driver: !!python/name:qcdb.energy method: nwc-hf options: basis: '6-31g**' reference: uhf puream: cart scf_type: conv # longstanding pk """ import yaml asdf = yaml.load(yamlin, Loader=yaml.FullLoader) ene = asdf["driver"](asdf["method"], options=asdf["options"], molecule=qcdb.Molecule(asdf["molecule"])) assert compare_values(-38.9253416082900827, ene, 6, "calc from yaml str")
def test_scf_conv(program, keywords): prefix = qcdb.util.program_prefix(program) qcdb.set_keywords(keywords) hcn2 = qcdb.Molecule( """ H 0.000000 0.000000 3.409664 C 0.000000 0.000000 2.340950 N 0.000000 0.000000 1.185959 -- H 0.000000 0.000000 -0.148222 C 0.000000 0.000000 -1.222546 N 0.000000 0.000000 -2.379698 """ ) ene, wfn = qcdb.energy(prefix + "hf/6-311G*", molecule=hcn2, return_wfn=True) pprint.pprint(wfn) assert wfn["success"] is True assert compare_values(-185.74334367736, ene, 6, "ene") ans = _harvest_scf_convergence(wfn["stdout"]) print(ans)
def test_10_qmol(): #eneyne = qcdb.set_molecule(seneyne) #eneyne.update_geometry() eneyne = qcdb.Molecule(seneyne) E, G = eneyne.run_dftd3('b3lyp', 'd2') assert compare_values(ref_d2[0], E, 7, 'Q: Ethene-Ethyne -D2')
def fgrad(name, **kwargs): limol = kwargs["molecule"].natom() assert fenergy(name, molecule=kwargs["molecule"]) == limol numol = qcdb.Molecule(geom=np.arange(limol * 6).reshape((-1, 3)), elez=[2 for _ in range(limol * 2)]) numol.update_geometry() assert fenergy(name, molecule=numol) == limol * 2 return numol.natom()
def test_molsymm_alone(subject): pg = data[subject]["pg"] sigma = data[subject]["rsn"] if subject.startswith("iso"): isbohr = data[subject[3:]].get("au", False) molstr = data[subject[3:]]["mol"].format(isoA=data[subject]["A"]) refgeomang = None else: isbohr = data[subject].get("au", False) molstr = data[subject]["mol"].format(isoA="") refgeomang = data[subject]["ref"] symmol = qcdb.Molecule(molstr) symmol.update_geometry() # symmol.axis_representation() assert compare(pg, symmol.get_full_point_group(), pg + " point group: " + subject) assert compare(sigma, symmol.rotational_symmetry_number(), pg + " sigma") if isbohr: geom_now = symmol.full_geometry() else: geom_now = qcdb.util.vecutil.mscale(symmol.full_geometry(), qcel.constants.bohr2angstroms) if refgeomang: assert compare_values(refgeomang, geom_now, pg + " orientation", atol=1.0e-6)
def test_qmol_11a(): fullans = copy.deepcopy(fullans1a) fullans['provenance'] = _string_prov_stamp asdf = qcdb.Molecule(fullans) assert compare_molrecs(fullans, asdf.to_dict(), tnm(), relative_geoms='align', atol=1.e-4) assert compare_integers(2, asdf.natom(), tnm())
def test_qmol_11b(): fullans = copy.deepcopy(fullans1a) fullans['provenance'] = _arrays_prov_stamp asdf = qcdb.Molecule(geom=[0., 0., 0., 1., 0., 0.], elez=[8, 1], fix_com=True) assert compare_molrecs(fullans, asdf.to_dict(), tnm(), relative_geoms='align', atol=1.e-4) assert compare_integers(2, asdf.natom(), tnm())
def test_qmol_11e(): fullans = copy.deepcopy(fullans1a) fullans['provenance'] = _string_prov_stamp asdf = qcdb.Molecule("""2\n\nO 0 0 0 \n1 1 0 0 """, dtype='xyz', fix_com=True) assert compare_molrecs(fullans, asdf.to_dict(), tnm(), relative_geoms='align', atol=1.e-4) assert compare_integers(2, asdf.natom(), tnm())
def test_to_string_mol(subjects, inp, expected): if subjects == 'pmol': import psi4 mol = psi4.core.Molecule.from_string(_local_results[inp[0]]) elif subjects == 'qmol': mol = qcdb.Molecule(_local_results[inp[0]]) smol = mol.format_molecule_for_mol(**inp[1]) assert compare(_local_results[expected], smol)
def test_11_a_energy(): tnm = sys._getframe().f_code.co_name eneyne = qcdb.Molecule(seneyne) jrec = qcdb.intf_dftd3.run_dftd3('d3-b3lyp-d', eneyne, {}, ptype='energy') assert compare_values(ref_d2[0], jrec['qcvars']['DISPERSION CORRECTION ENERGY'].data, 7, tnm) assert compare_values( ref_d2[0], jrec['qcvars']['B3LYP-D2 DISPERSION CORRECTION ENERGY'].data, 7, tnm)
def test_qmol_11d(): fullans = copy.deepcopy(fullans1a) fullans["provenance"] = _string_prov_stamp asdf = qcdb.Molecule("""nocom\n8 0 0 0\n1 1 0 0""", dtype="psi4+") assert compare_molrecs(fullans, asdf.to_dict(), tnm(), relative_geoms="align", atol=1.0e-4) assert compare_integers(2, asdf.natom(), tnm())
def test_to_string_xyz(subjects, inp, expected): if subjects == 'pmol': import psi4 mol = psi4.core.Molecule.from_string(_results[inp[0]]) smol = mol.to_string(**inp[1]) elif subjects == 'qmol': mol = qcdb.Molecule(_results[inp[0]]) smol = mol.to_string(**inp[1]) elif subjects == 'qcmol': molrec = qcelemental.molparse.from_string(_results[inp[0]]) smol = qcelemental.molparse.to_string(molrec['qm'], **inp[1]) assert compare(_results[expected], smol)
def test_scale_2(h2o_y): h2o_y = qcdb.Molecule(h2o_y) qcdb.set_options({ 'basis': 'cc-pvdz', 'cfour_spin_scal': 'on', 'cfour_reference': 'uhf', 'cfour_calc_level': 'mp2', 'cfour_deriv_level': 'first', 'CFOUR_DIFF_TYPE': 'relaxed', }) val, jrec = qcdb.energy('c4-cfour', return_wfn=True, molecule=h2o_y) dip = np.array([float(jrec['qcvars']['CURRENT DIPOLE {}'.format(i)].data) for i in 'XYZ']) tnm = sys._getframe().f_code.co_name assert compare_arrays(grad_y, jrec['qcvars']['CURRENT GRADIENT'].data, 5, tnm + ' grad') assert compare_arrays(dip_y, dip, 5, tnm + ' dipole')
def mol_tester(lbl, molstr, pg, sigma, refgeomang, isbohr=False, iso=False): symmol = qcdb.Molecule(molstr) if iso is not False: if isinstance(iso, int): iso = [iso] for at in iso: # mass needn't make sense for element, just breaking the symmetry symmol.set_mass(at, 2.014) symmol.update_geometry() symmol.axis_representation() assert compare_strings(pg, symmol.get_full_point_group(), pg + " point group: " + lbl) assert compare_integers(sigma, symmol.rotational_symmetry_number(), pg + " sigma") if isbohr: geom_now = symmol.full_geometry() else: geom_now = qcdb.mscale(symmol.full_geometry(), qcel.constants.bohr2angstroms) if refgeomang: assert compare_matrices(refgeomang, geom_now, 6, pg + " orientation")
def test_tu1b(): """tu1-h2o-energy/input.dat local testing """ # memory 600 mb h2o = qcdb.Molecule(""" O H 1 0.96 H 1 0.96 2 104.5 """) E, jrec = qcdb.energy('scf/cc-pVDZ', molecule=h2o, return_wfn=True) print(qcdb.print_variables(jrec['qcvars'])) ans1 = -76.0266327341067125 assert compare_values(ans1, jrec['qcvars']['SCF TOTAL ENERGY'].data, 6, tnm())
def test_11_c(): tnm = sys._getframe().f_code.co_name eneyne = qcdb.Molecule(seneyne) mA = eneyne.extract_subsets(1) mB = eneyne.extract_subsets(2) jrec = qcdb.intf_dftd3.run_dftd3('d3-b3lyp-d3bj', molecule=mA, options={}, ptype='energy') assert compare_values(ref_d3bj[1], jrec['qcvars']['CURRENT ENERGY'].data, 7, tnm) assert compare_values(ref_d3bj[1], jrec['qcvars']['DISPERSION CORRECTION ENERGY'].data, 7, tnm) assert compare_values( ref_d3bj[1], jrec['qcvars']['B3LYP-D3(BJ) DISPERSION CORRECTION ENERGY'].data, 7, tnm)
def thermo_analysis(wfn, molecule, E0, Hessian, isotopes=[], T=298.15, P=101325.00): """Conduct thermodynamic analysis from a given molecule, energy, and Hessian. Molecular coordinates are assumed to be in Angstrom and are passed as a string. Energy is is assumed to be in atomic units. Hessian is assumed to be in atomic units / Bohr^2. Isotopic masses to be subsituted for standard atomic masses may be passed in as list of dictionaries. Temperature is set to 298.15 Kelvin by default, and Pressure is set to 101315.00 Pascals by default.""" text = '' #makes molecule of molecule so that masses can be manipulated for isotopic studies molecule = qcdb.Molecule(molecule) molecule.update_geometry() #if no isotopic subsittutions given, do standard masses if len(isotopes) == 0: isotopes.append({}) #for each set of isotopic subs for dic in isotopes: text = print_header(text) for key in dic.keys(): newmass = 0.0 if type(dic[key]) is str: newmass = eliso2mass[dic[key]] else: newmass = float(dic[key]) text += "Changing mass of atom number %s (%s) from %.8f amu to %.8f amu.\n" % ( str(key), qcdb.periodictable.z2el[molecule.Z(key - 1)], molecule.mass(key - 1), newmass) #replace mass of atom key-1 with user-defined mass molecule.set_mass(key - 1, newmass) text = do_analysis(wfn, E0, Hessian, molecule, T, P, text) #reset to standard masses for key in dic.keys(): molecule.set_mass(key - 1, el2mass[molecule.symbol(key - 1)]) return text
def test_tu1_rhf_b(): """tu1-h2o-energy/input.dat local testing """ # memory 600 mb h2o = qcdb.Molecule(""" O H 1 1.8 H 1 1.8 2 104.5 units au """) E, jrec = qcdb.energy('nwc-hf/cc-pVDZ', molecule=h2o, return_wfn=True) print(qcdb.print_variables(jrec['qcvars'])) assert compare_values(_ref_h2o_pk_rhf, jrec['qcvars']['HF TOTAL ENERGY'].data, 6, tnm())
def test_scale_2(h2o_y): h2o_y = qcdb.Molecule(h2o_y) qcdb.set_options({ "basis": "cc-pvdz", "cfour_spin_scal": "on", "cfour_reference": "uhf", "cfour_calc_level": "mp2", "cfour_deriv_level": "first", "CFOUR_DIFF_TYPE": "relaxed", }) val, jrec = qcdb.energy("c4-cfour", return_wfn=True, molecule=h2o_y) dip = np.array([ float(jrec["qcvars"]["CURRENT DIPOLE {}".format(i)].data) for i in "XYZ" ]) assert compare_arrays(grad_y, jrec["qcvars"]["CURRENT GRADIENT"].data, 5, tnm() + " grad") assert compare_arrays(dip_y, dip, 5, tnm() + " dipole")
TAGL['%s-%s' % (dbse, 'HCONHOH_to_HCOHNHO')] = '' TAGL['%s-%s-reagent' % (dbse, 'HCONHOH_to_HCOHNHO')] = '' TAGL['%s-%s' % (dbse, 'HNC_H2_to_H2CNH')] = '' TAGL['%s-%s-reagent' % (dbse, 'HNC_H2_to_H2CNH')] = '' TAGL['%s-%s' % (dbse, 'H2CNH_to_HCNH2')] = '' TAGL['%s-%s-reagent' % (dbse, 'H2CNH_to_HCNH2')] = '' TAGL['%s-%s' % (dbse, 'HCNH2_to_HCN_H2')] = '' TAGL['%s-%s-reagent' % (dbse, 'HCNH2_to_HCN_H2')] = '' # <<< Geometry Specification Strings >>> GEOS = {} GEOS['%s-%s-reagent' % (dbse, 'HCN_to_HNC')] = qcdb.Molecule(""" 0 1 C -0.0399606537 1.7574844925 0.0000000000 N 1.2331003808 0.0000000000 0.0000000000 H -1.1931397271 -1.7574844925 0.0000000000 units bohr """) #set { guess gwh """) GEOS['%s-%s-reagent' % (dbse, 'HCCH_to_CCH2')] = qcdb.Molecule(""" 0 1 C -0.4287449922 -0.0396754553 0.0000000000 C 1.9151999208 0.0000000000 0.0000000000 H -2.1914826494 0.9243341981 0.0000000000 H 1.1657551200 -2.7344386158 0.0000000000 units bohr """) GEOS['%s-%s-reagent' % (dbse, 'H2CO_to_H2_CO')] = qcdb.Molecule("""
GEOS['%s-%s-dimer' % (dbse, 'dimer3_54')] = qcdb.Molecule(""" 0 1 C 0.70622800 0.97211978 0.61694803 C -0.70622800 0.97211978 0.61694803 C -1.14280400 -0.37137722 0.61681203 C 0.00000000 -1.20165922 0.61659503 C 1.14280400 -0.37137722 0.61681203 C 1.45779000 2.00650178 0.09413403 C -1.45779000 2.00650178 0.09413403 C -2.35873800 -0.76639722 0.09397203 C 0.00000000 -2.48004022 0.09366903 C 2.35873800 -0.76639722 0.09397203 C 0.69261800 3.17923978 -0.25321497 C -0.69261800 3.17923978 -0.25321497 C -2.80958100 1.64119778 -0.25292797 C -3.23765700 0.32373778 -0.25303797 C -2.42918200 -2.16498922 -0.25302597 C -1.30841500 -2.97916822 -0.25327697 C 1.30841500 -2.97916822 -0.25327697 C 2.42918200 -2.16498922 -0.25302597 C 3.23765700 0.32373778 -0.25303797 C 2.80958100 1.64119778 -0.25292797 H 1.20851300 4.06642078 -0.61418797 H -1.20851300 4.06642078 -0.61418797 H -3.49401500 2.40602178 -0.61367197 H -4.24094400 0.10729578 -0.61373997 H -3.36816400 -2.57958822 -0.61350597 H -1.41248600 -4.00024222 -0.61397997 H 1.41248600 -4.00024222 -0.61397997 H 3.36816400 -2.57958822 -0.61350597 H 4.24094400 0.10729578 -0.61373997 H 3.49401500 2.40602178 -0.61367197 -- 0 1 C 0.70622800 0.97211978 4.15694803 C -0.70622800 0.97211978 4.15694803 C -1.14280400 -0.37137722 4.15681203 C 0.00000000 -1.20165922 4.15659503 C 1.14280400 -0.37137722 4.15681203 C 1.45779000 2.00650178 3.63413403 C -1.45779000 2.00650178 3.63413403 C -2.35873800 -0.76639722 3.63397203 C 0.00000000 -2.48004022 3.63366903 C 2.35873800 -0.76639722 3.63397203 C 0.69261800 3.17923978 3.28678503 C -0.69261800 3.17923978 3.28678503 C -2.80958100 1.64119778 3.28707203 C -3.23765700 0.32373778 3.28696203 C -2.42918200 -2.16498922 3.28697403 C -1.30841500 -2.97916822 3.28672303 C 1.30841500 -2.97916822 3.28672303 C 2.42918200 -2.16498922 3.28697403 C 3.23765700 0.32373778 3.28696203 C 2.80958100 1.64119778 3.28707203 H 1.20851300 4.06642078 2.92581203 H -1.20851300 4.06642078 2.92581203 H -3.49401500 2.40602178 2.92632803 H -4.24094400 0.10729578 2.92626003 H -3.36816400 -2.57958822 2.92649403 H -1.41248600 -4.00024222 2.92602003 H 1.41248600 -4.00024222 2.92602003 H 3.36816400 -2.57958822 2.92649403 H 4.24094400 0.10729578 2.92626003 H 3.49401500 2.40602178 2.92632803 units angstrom """)
import qcdb from qcdb.moptions.optionsdec import def_mol import numpy as np mol1 = qcdb.Molecule(""" He """) mol3 = qcdb.Molecule(""" He He 1 1.5 He 1 1.5 2 90.0 """) mol4 = qcdb.Molecule(""" He 0 0 0 He 1 1 1 He 2 2 2 He 3 3 3 """) mol0 = qcdb.Molecule("""Xe""") @def_mol() def fenergy(name, **kwargs): print(kwargs['molecule']) return kwargs['molecule'].natom()
TAGL = {} TAGL['%s-%s' % (dbse, 'ch4')] = 'methane' TAGL['%s-%s-reagent' % (dbse, 'ch4')] = 'methane' TAGL['%s-%s' % (dbse, 'h2o')] = 'water' TAGL['%s-%s-reagent' % (dbse, 'h2o')] = 'water' TAGL['%s-%s' % (dbse, 'nh3')] = 'ammonia' TAGL['%s-%s-reagent' % (dbse, 'nh3')] = 'ammonia' # <<< Geometry Specification Strings >>> GEOS = {} GEOS['%s-%s-reagent' % (dbse, 'ch4')] = qcdb.Molecule(""" 0 1 C 0.00000000 -0.00014000 1.85916100 H -0.88855100 0.51306000 1.49468500 H 0.88855100 0.51306000 1.49468500 H 0.00000000 -1.02633900 1.49486800 H 0.00000000 0.00008900 2.94828400 units angstrom """) GEOS['%s-%s-reagent' % (dbse, 'h2o')] = qcdb.Molecule(""" 0 1 O -1.55100700 -0.11452000 0.00000000 H -1.93425900 0.76250300 0.00000000 H -0.59967700 0.04071200 0.00000000 units angstrom """) GEOS['%s-%s-reagent' % (dbse, 'nh3')] = qcdb.Molecule(""" 0 1
TAGL['%s-%s-dimer' % (dbse, 24)] = """Dimer from ethyne_ethyne_D2h """ TAGL['%s-%s-monoA-CP' % (dbse, 24)] = """Monomer A from ethyne_ethyne_D2h """ TAGL['%s-%s-monoB-CP' % (dbse, 24)] = """Monomer B from ethyne_ethyne_D2h """ TAGL['%s-%s-monoA-unCP' % (dbse, 24)] = """Monomer A from ethyne_ethyne_D2h """ TAGL['%s-%s-monoB-unCP' % (dbse, 24)] = """Monomer B from ethyne_ethyne_D2h """ # <<< Geometry Specification Strings >>> GEOS = {} GEOS['%s-%s-dimer' % (dbse, '1')] = qcdb.Molecule(""" 0 1 O 0.00000000 -0.05786571 -1.47979303 H 0.00000000 0.82293384 -1.85541474 H 0.00000000 0.07949567 -0.51934253 -- 0 1 N 0.00000000 0.01436394 1.46454628 H 0.00000000 -0.98104857 1.65344779 H -0.81348351 0.39876776 1.92934049 H 0.81348351 0.39876776 1.92934049 units angstrom """) GEOS['%s-%s-dimer' % (dbse, '2')] = qcdb.Molecule(""" 0 1 O -0.06699914 0.00000000 1.49435474 H 0.81573427 0.00000000 1.86586639 H 0.06885510 0.00000000 0.53914277 -- 0 1 O 0.06254775 0.00000000 -1.42263208
(dbse, 'OHHts')] = 'Transition state of OH + H <--> H2 + O' TAGL['%s-%s-reagent' % (dbse, 'OHNH3ts')] = 'Transition state of OH + NH3 <--> NH2 + H2O' TAGL['%s-%s-reagent' % (dbse, 'PH2')] = 'PH2' TAGL['%s-%s-reagent' % (dbse, 'PH3')] = 'Phosphine' TAGL['%s-%s-reagent' % (dbse, 'HS')] = 'HS' # <<< Geometry Specification Strings >>> GEOS = {} GEOS['%s-%s-reagent' % (dbse, 'C2H5')] = qcdb.Molecule(""" 0 2 C 0.00550995 -0.00307714 -0.77443959 C 0.00550995 -0.00307714 0.71569982 H 0.00550995 -1.01684444 1.11670108 H 0.37964525 0.84547158 -1.32730429 H -0.88217468 0.49798042 1.12141209 H 0.87299475 0.52193057 1.11660682 H -0.50718726 -0.77526005 -1.32801142 units angstrom """) GEOS['%s-%s-reagent' % (dbse, 'C2H6')] = qcdb.Molecule(""" 0 1 C 0.00000020 -0.00000013 -0.76309187 C 0.00000020 -0.00000013 0.76309163 H 0.00000020 -1.01606691 1.15831231 H -0.87903844 -0.50959541 -1.15830943 H -0.87994508 0.50802887 1.15831013 H 0.87993813 0.50804049 1.15830883 H -0.00180313 1.01606605 -1.15830975
TAGL['%s-%s-dimer' % (dbse, 22)] = 'Phenol Dimer' TAGL['%s-%s-monoA-CP' % (dbse, 22)] = 'Phenol from Phenol Dimer' TAGL['%s-%s-monoB-CP' % (dbse, 22)] = 'Phenol from Phenol Dimer' TAGL['%s-%s-monoA-unCP' % (dbse, 22)] = 'Phenol from Phenol Dimer' TAGL['%s-%s-monoB-unCP' % (dbse, 22)] = 'Phenol from Phenol Dimer' # <<< Geometry Specification Strings >>> GEOS = {} GEOS['%s-%s-dimer' % (dbse, '1')] = qcdb.Molecule(""" 0 1 N -1.578718 -0.046611 0.000000 H -2.158621 0.136396 -0.809565 H -2.158621 0.136396 0.809565 H -0.849471 0.658193 0.000000 -- 0 1 N 1.578718 0.046611 0.000000 H 2.158621 -0.136396 -0.809565 H 0.849471 -0.658193 0.000000 H 2.158621 -0.136396 0.809565 units angstrom """) GEOS['%s-%s-dimer' % (dbse, '2')] = qcdb.Molecule(""" 0 1 O -1.551007 -0.114520 0.000000 H -1.934259 0.762503 0.000000 H -0.599677 0.040712 0.000000 -- 0 1 O 1.350625 0.111469 0.000000