1. Prepare training/test data
try:
import torch
print("successfully imported torch")
print(torch.__version__)
except ImportError:
!! pip install torch torchvision torchaudio --user --index-url https://download.pytorch.org/whl/cpu
print("completed installing torch")successfully imported torch
2.6.0+cu124
try:
import numpy as np
print("successfully imported numpy")
print(np.__version__)
except ImportError:
!! pip install numpy --user --upgrade
print("completed installing numpy")successfully imported numpy
1.26.4
try:
from matplotlib import pyplot as plt
print("successfully imported matplotlib")
except ImportError:
!! pip install matplotlib --user --upgrade
print("completed installing matplotlib")successfully imported matplotlib
!! pip install aenet-gpr --user --upgrade
print("completed installing aenet-gpr")
! pip show aenet-gprcompleted installing aenet-gpr
Name: aenet-gpr
Version: 2.6.5
Summary: Atomistic simulation tools based on Gaussian Processes Regression
Home-page: https://github.com/atomisticnet/aenet-gpr
Author: In Won Yeu
Author-email: iy2185@columbia.edu
License: MPL-2.0
Location: /data/home/iy2185/.local/lib/python3.12/site-packages
Requires: ase
Required-by:
import os, sys, site
sys.path.append(site.USER_SITE)
import aenet_gpr
print(aenet_gpr.__version__)2.6.5
from IPython.display import Image
try:
import ase.io
print("successfully imported ase")
except ImportError:
!! pip install ase --user --upgrade
print("completed installing ASE")
import ase.io
print("successfully imported ase")successfully imported ase
1. Prepare training/test data¶
We are using train/test HSE06 data of EC dimer prepared in aenet-gpr/example/2_EC-EC/
import os.path
! rm -rf 2_EC-EC
! mkdir 2_EC-EC
if os.path.isfile("../example/2_EC-EC/train_set_tutorial.zip"):
! unzip -oq ../example/2_EC-EC/train_set_tutorial.zip -d ./2_EC-EC/
print("number of train data:")
! find ./2_EC-EC/train_set_tutorial/ -type f | wc -l
else:
! wget https://github.com/atomisticnet/aenet-gpr/raw/refs/heads/main/example/2_EC-EC/train_set_tutorial.zip
! unzip -oq train_set_tutorial.zip -d ./2_EC-EC/
! rm train_set_tutorial.zip
print("number of train data:")
! find ./2_EC-EC/train_set_tutorial/ -type f | wc -l--2025-10-19 16:57:05-- https://github.com/atomisticnet/aenet-gpr/raw/refs/heads/main/example/2_EC-EC/train_set_tutorial.zip
Resolving github.com (github.com)... 140.82.112.3
Connecting to github.com (github.com)|140.82.112.3|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://raw.githubusercontent.com/atomisticnet/aenet-gpr/refs/heads/main/example/2_EC-EC/train_set_tutorial.zip [following]
--2025-10-19 16:57:05-- https://raw.githubusercontent.com/atomisticnet/aenet-gpr/refs/heads/main/example/2_EC-EC/train_set_tutorial.zip
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.109.133, 185.199.108.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 101063 (99K) [application/zip]
Saving to: ‘train_set_tutorial.zip’
train_set_tutorial. 100%[===================>] 98.69K --.-KB/s in 0.002s
2025-10-19 16:57:05 (42.6 MB/s) - ‘train_set_tutorial.zip’ saved [101063/101063]
number of train data:
80
if os.path.isfile("../example/2_EC-EC/test_set_tutorial.zip"):
! unzip -oq ../example/2_EC-EC/test_set_tutorial.zip -d ./2_EC-EC/
print("number of test data:")
! find ./2_EC-EC/test_set_tutorial/ -type f | wc -l
else:
! wget https://github.com/atomisticnet/aenet-gpr/raw/refs/heads/main/example/2_EC-EC/test_set_tutorial.zip
! unzip -oq test_set_tutorial.zip -d ./2_EC-EC/
! rm test_set_tutorial.zip
print("number of test data:")
! find ./2_EC-EC/test_set_tutorial/ -type f | wc -l--2025-10-19 16:57:07-- https://github.com/atomisticnet/aenet-gpr/raw/refs/heads/main/example/2_EC-EC/test_set_tutorial.zip
Resolving github.com (github.com)... 140.82.112.3
Connecting to github.com (github.com)|140.82.112.3|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://raw.githubusercontent.com/atomisticnet/aenet-gpr/refs/heads/main/example/2_EC-EC/test_set_tutorial.zip [following]
--2025-10-19 16:57:08-- https://raw.githubusercontent.com/atomisticnet/aenet-gpr/refs/heads/main/example/2_EC-EC/test_set_tutorial.zip
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.109.133, 185.199.108.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 257174 (251K) [application/zip]
Saving to: ‘test_set_tutorial.zip’
test_set_tutorial.z 100%[===================>] 251.15K --.-KB/s in 0.004s
2025-10-19 16:57:08 (58.5 MB/s) - ‘test_set_tutorial.zip’ saved [257174/257174]
number of test data:
161
atoms = ase.io.read("./2_EC-EC/test_set_tutorial/file_0000.xsf")
ase.io.write('2EC.png', atoms)
Image("2EC.png")
2-1. Train–Test with default Cartesian fingerprint¶
! rm -f train.in
if os.path.isfile("../example/2_EC-EC/train.in"):
! cp ../example/2_EC-EC/train.in .
else:
! wget https://github.com/atomisticnet/aenet-gpr/raw/refs/heads/main/example/2_EC-EC/train.in--2025-10-19 16:57:18-- https://github.com/atomisticnet/aenet-gpr/raw/refs/heads/main/example/2_EC-EC/train.in
Resolving github.com (github.com)... 140.82.112.3
Connecting to github.com (github.com)|140.82.112.3|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://raw.githubusercontent.com/atomisticnet/aenet-gpr/refs/heads/main/example/2_EC-EC/train.in [following]
--2025-10-19 16:57:18-- https://raw.githubusercontent.com/atomisticnet/aenet-gpr/refs/heads/main/example/2_EC-EC/train.in
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.109.133, 185.199.108.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 566 [text/plain]
Saving to: ‘train.in’
train.in 100%[===================>] 566 --.-KB/s in 0s
2025-10-19 16:57:19 (7.58 MB/s) - ‘train.in’ saved [566/566]
! cat train.in# File path
Train_file ./2_EC-EC/train_set_tutorial/file_*.xsf
Test_file ./2_EC-EC/test_set_tutorial/file_*.xsf
# Train model save (default: False)
# Train_model_save True
# File format (default: xsf)
File_format xsf
# Descriptor (default: cartesian coordinates)
Descriptor cart
# Kernel parameter
# scale 1.5
# weight 1.0
# Data process (default: batch, 25)
data_process batch
batch_size 25
# Flags for xsf file writing (default: False)
Train_write False
Test_write False
# Additional_write True
# Data augmentation parameter
# Disp_length 0.05
# Num_copy 3
! python -m aenet_gpr train.in======================================================================
aenet-GPR: surrogate GPR for GPR-ANN indirect force training
======================================================================
2025-10-19 16:57:22.
Developed by In Won Yeu
This program performs three main steps:
1. Train: Generates a GPR model using the provided structure, energy, and force data.
2. Test: Uses the generated GPR model to predict values for the test set structures.
3. Augmentation: Performs data augmentation in xsf file format, compatible with aenet-(PyTorch),
supporting a GPR-ANN training in conjunction with aenet-(PyTorch).
Each of these steps is executed once the input file (train.in) contains the keywords:
Train_file [train file path]
Test_file [test file path]
Additional_write [True]
======================================================================
Train
======================================================================
Read reference training data
Time needed for reading data: 0.107673 s
Maximum CPU memory used: 0.411438 GB
Maximum GPU memory used: 0.000000 GB
Energy data size: (80,) # (N_data, )
Force data size: (80, 20, 3) # (N_data, N_atom, 3)
----------------------------------------------------------------------
Candidate scales: tensor([0.2000, 0.4000, 0.8000])
Updated scale: 0.4000000059604645
Updated weight: 0.6186434141732067
----------------------------------------------------------------------
Model train
Training parameters
{'num_data': 80, 'calculator': {'kerneltype': 'sqexp', 'scale': tensor(0.4000), 'weight': tensor(0.6186, dtype=torch.float64), 'noise': tensor(1.0000e-06, dtype=torch.float64), 'noisefactor': tensor(0.5000, dtype=torch.float64), 'prior': tensor(-18637.3499, dtype=torch.float64)}, 'fix_ind': None, 'pbc': False, 'species': ['O', 'O', 'O', 'C', 'C', 'C', 'H', 'H', 'H', 'H', 'O', 'O', 'O', 'C', 'C', 'C', 'H', 'H', 'H', 'H'], 'num_atom': 20}
Time needed for training: 6.130978 s
Maximum CPU memory used: 1.049934 GB
Maximum GPU memory used: 0.000000 GB
----------------------------------------------------------------------
======================================================================
Test
======================================================================
----------------------------------------------------------------------
Model evaluation for test set
Time needed for test evaluation: 7.146077 s
Maximum CPU memory used: 1.362583 GB
Maximum GPU memory used: 0.000000 GB
----------------------------------------------------------------------
GPR energy MAE (eV): 0.040727771845763525
GPR force MAE (eV/Ang): 0.29170825780360404
Saving test target to [energy_test_reference.npy] and [force_test_reference.npy]
Saving GPR prediction to [energy_test_gpr.npy], [force_test_gpr.npy], [unc_e_test_gpr.npy], and [unc_f_test_gpr.npy]
2-2. Visualize the results¶
energy_test_gpr = np.load("./energy_test_gpr.npy")
energy_test_reference = np.load("./energy_test_reference.npy")
force_test_gpr = np.load("./force_test_gpr.npy")
force_test_reference = np.load("./force_test_reference.npy")
unc_e_test_gpr = np.load("./unc_e_test_gpr.npy")
unc_f_test_gpr = np.load("./unc_f_test_gpr.npy")diff_per_atom = (energy_test_reference - energy_test_gpr) / 20
print(diff_per_atom.min(), diff_per_atom.max())-0.0037080216154208754 0.007426366634354054
fig = plt.figure(figsize=(7, 6))
ax2 = fig.subplots()
font_x = {'size': 20, 'color': 'black'}
font_y = {'size': 20, 'color': 'black'}
font_tick = {'size': 16, 'color': 'black'}
# The second plot
counts, bins = np.histogram(diff_per_atom, bins=30, range=(-0.003, 0.03))
ax2.hist(bins[:-1], bins, weights=counts, facecolor='dimgray', alpha=1.0, edgecolor='black')
ax2.set_xlabel("DFT $-$ GPR (eV/atom)", fontdict=font_x)
ax2.set_xlim([-0.03, 0.03])
x_labels = [round(label, 2) for label in ax2.get_xticks()]
ax2.set_xticks(x_labels)
ax2.set_xlim([-0.03, 0.03])
ax2.set_xticklabels(x_labels, fontdict=font_tick)
ax2.set_ylabel("Number of structures", fontdict=font_y)
ax2.set_ylim([0, 50])
y_labels = [int(label) for label in ax2.get_yticks()]
ax2.set_yticks(y_labels)
ax2.set_ylim([0, 50])
ax2.set_yticklabels(y_labels, fontdict=font_tick)
[x.set_linewidth(1.5) for x in ax2.spines.values()]
ax2.tick_params(bottom=False, top=True, left=True, right=True)
ax2.tick_params(labelbottom=True, labeltop=False, labelleft=True, labelright=False)
ax2.tick_params(direction='in', length=8, width=1.5)
ax2.grid(True, which='both', linestyle=':', linewidth=0.7, alpha=0.7)
fig.tight_layout()
plt.show()
3. Uncertainty vs Error¶
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import pearsonr
# --- Energy error vs uncertainty ---
energy_error = np.abs(energy_test_gpr - energy_test_reference)
unc_e = unc_e_test_gpr
r_energy, _ = pearsonr(energy_error, unc_e)
plt.figure(figsize=(6, 5))
plt.scatter(unc_e, energy_error, alpha=0.6, edgecolors='k')
plt.xlabel("Energy uncertainty (eV)")
plt.ylabel("Energy absolute error (eV)")
plt.title(f"Energy Error vs Uncertainty\nPearson r = {r_energy:.3f}")
plt.grid(True)
plt.tight_layout()
plt.show()
# --- Force error vs uncertainty ---
force_error = np.abs(force_test_gpr - force_test_reference).reshape(-1)
unc_f = unc_f_test_gpr.reshape(-1)
r_force, _ = pearsonr(force_error, unc_f)
plt.figure(figsize=(6, 5))
plt.scatter(unc_f, force_error, alpha=0.6, edgecolors='k')
plt.xlabel("Force uncertainty (eV/Å)")
plt.ylabel("Force absolute error (eV/Å)")
plt.title(f"Force Error vs Uncertainty\nPearson r = {r_force:.3f}")
plt.grid(True)
plt.xlim(0.0, 1.0)
plt.ylim(0, 2.0)
plt.tight_layout()
plt.show()
4. Augment¶
So, using these parameters, augment step will be executed.
! sed -i '3s|.*|# Test_file ./2_EC-EC/test_set_tutorial/file_*.xsf|' train.in
! sed -i '25s|.*|Additional_write True|' train.in
! sed -i '28s|.*|Disp_length 0.05|' train.in
! sed -i '29s|.*|Num_copy 2|' train.in! cat train.in# File path
Train_file ./2_EC-EC/train_set_tutorial/file_*.xsf
# Test_file ./2_EC-EC/test_set_tutorial/file_*.xsf
# Train model save (default: False)
# Train_model_save True
# File format (default: xsf)
File_format xsf
# Descriptor (default: cartesian coordinates)
Descriptor cart
# Kernel parameter
# scale 1.5
# weight 1.0
# Data process (default: batch, 25)
data_process batch
batch_size 25
# Flags for xsf file writing (default: False)
Train_write False
Test_write False
Additional_write True
# Data augmentation parameter
Disp_length 0.05
Num_copy 2
! rm -rf additional_xsf/
! python -m aenet_gpr train.in======================================================================
aenet-GPR: surrogate GPR for GPR-ANN indirect force training
======================================================================
2025-10-19 17:03:57.
Developed by In Won Yeu
This program performs three main steps:
1. Train: Generates a GPR model using the provided structure, energy, and force data.
2. Test: Uses the generated GPR model to predict values for the test set structures.
3. Augmentation: Performs data augmentation in xsf file format, compatible with aenet-(PyTorch),
supporting a GPR-ANN training in conjunction with aenet-(PyTorch).
Each of these steps is executed once the input file (train.in) contains the keywords:
Train_file [train file path]
Test_file [test file path]
Additional_write [True]
======================================================================
Train
======================================================================
Read reference training data
Time needed for reading data: 0.104494 s
Maximum CPU memory used: 0.411098 GB
Maximum GPU memory used: 0.000000 GB
Energy data size: (80,) # (N_data, )
Force data size: (80, 20, 3) # (N_data, N_atom, 3)
----------------------------------------------------------------------
Candidate scales: tensor([0.2000, 0.4000, 0.8000])
Updated scale: 0.4000000059604645
Updated weight: 0.6186434141732067
----------------------------------------------------------------------
Model train
Training parameters
{'num_data': 80, 'calculator': {'kerneltype': 'sqexp', 'scale': tensor(0.4000), 'weight': tensor(0.6186, dtype=torch.float64), 'noise': tensor(1.0000e-06, dtype=torch.float64), 'noisefactor': tensor(0.5000, dtype=torch.float64), 'prior': tensor(-18637.3499, dtype=torch.float64)}, 'fix_ind': None, 'pbc': False, 'species': ['O', 'O', 'O', 'C', 'C', 'C', 'H', 'H', 'H', 'H', 'O', 'O', 'O', 'C', 'C', 'C', 'H', 'H', 'H', 'H'], 'num_atom': 20}
Time needed for training: 5.970094 s
Maximum CPU memory used: 1.059208 GB
Maximum GPU memory used: 0.000000 GB
----------------------------------------------------------------------
======================================================================
Augmentation
======================================================================
----------------------------------------------------------------------
Additional structure generation
Time needed for additional generation: 0.039869 s
Maximum CPU memory used: 1.059208 GB
Maximum GPU memory used: 0.000000 GB
Displacement length (Ang): 0.05
Multiple: 2
N_additional = N_reference (80) * Multiple (2) = 160
----------------------------------------------------------------------
----------------------------------------------------------------------
Model evaluation for additional set
Test parameters
{'num_data': 160, 'calculator': {'kerneltype': 'sqexp', 'scale': tensor(0.4000), 'weight': tensor(0.6186, dtype=torch.float64), 'noise': tensor(1.0000e-06, dtype=torch.float64), 'noisefactor': tensor(0.5000, dtype=torch.float64), 'prior': tensor(-18637.3499, dtype=torch.float64)}, 'fix_ind': None, 'pbc': False, 'species': ['O', 'O', 'O', 'C', 'C', 'C', 'H', 'H', 'H', 'H', 'O', 'O', 'O', 'C', 'C', 'C', 'H', 'H', 'H', 'H'], 'num_atom': 20}
Time needed for additional evaluation: 7.070997 s
Maximum CPU memory used: 1.284821 GB
Maximum GPU memory used: 0.000000 GB
----------------------------------------------------------------------
Saving GPR prediction to [energy_additional_gpr.npy], [force_additional_gpr.npy], [unc_e_additional_gpr.npy], and [unc_f_additional_gpr.npy]
======================================================================
Writing additional xsf files to additional_xsf
Time needed for writing xsf files: 0.737324 s
Maximum CPU memory used: 1.284821 GB
Maximum GPU memory used: 0.000000 GB
======================================================================
Now, 160 new data have been augmented
! cd ./additional_xsf/ && lsfile_00000.xsf file_00032.xsf file_00064.xsf file_00096.xsf file_00128.xsf
file_00001.xsf file_00033.xsf file_00065.xsf file_00097.xsf file_00129.xsf
file_00002.xsf file_00034.xsf file_00066.xsf file_00098.xsf file_00130.xsf
file_00003.xsf file_00035.xsf file_00067.xsf file_00099.xsf file_00131.xsf
file_00004.xsf file_00036.xsf file_00068.xsf file_00100.xsf file_00132.xsf
file_00005.xsf file_00037.xsf file_00069.xsf file_00101.xsf file_00133.xsf
file_00006.xsf file_00038.xsf file_00070.xsf file_00102.xsf file_00134.xsf
file_00007.xsf file_00039.xsf file_00071.xsf file_00103.xsf file_00135.xsf
file_00008.xsf file_00040.xsf file_00072.xsf file_00104.xsf file_00136.xsf
file_00009.xsf file_00041.xsf file_00073.xsf file_00105.xsf file_00137.xsf
file_00010.xsf file_00042.xsf file_00074.xsf file_00106.xsf file_00138.xsf
file_00011.xsf file_00043.xsf file_00075.xsf file_00107.xsf file_00139.xsf
file_00012.xsf file_00044.xsf file_00076.xsf file_00108.xsf file_00140.xsf
file_00013.xsf file_00045.xsf file_00077.xsf file_00109.xsf file_00141.xsf
file_00014.xsf file_00046.xsf file_00078.xsf file_00110.xsf file_00142.xsf
file_00015.xsf file_00047.xsf file_00079.xsf file_00111.xsf file_00143.xsf
file_00016.xsf file_00048.xsf file_00080.xsf file_00112.xsf file_00144.xsf
file_00017.xsf file_00049.xsf file_00081.xsf file_00113.xsf file_00145.xsf
file_00018.xsf file_00050.xsf file_00082.xsf file_00114.xsf file_00146.xsf
file_00019.xsf file_00051.xsf file_00083.xsf file_00115.xsf file_00147.xsf
file_00020.xsf file_00052.xsf file_00084.xsf file_00116.xsf file_00148.xsf
file_00021.xsf file_00053.xsf file_00085.xsf file_00117.xsf file_00149.xsf
file_00022.xsf file_00054.xsf file_00086.xsf file_00118.xsf file_00150.xsf
file_00023.xsf file_00055.xsf file_00087.xsf file_00119.xsf file_00151.xsf
file_00024.xsf file_00056.xsf file_00088.xsf file_00120.xsf file_00152.xsf
file_00025.xsf file_00057.xsf file_00089.xsf file_00121.xsf file_00153.xsf
file_00026.xsf file_00058.xsf file_00090.xsf file_00122.xsf file_00154.xsf
file_00027.xsf file_00059.xsf file_00091.xsf file_00123.xsf file_00155.xsf
file_00028.xsf file_00060.xsf file_00092.xsf file_00124.xsf file_00156.xsf
file_00029.xsf file_00061.xsf file_00093.xsf file_00125.xsf file_00157.xsf
file_00030.xsf file_00062.xsf file_00094.xsf file_00126.xsf file_00158.xsf
file_00031.xsf file_00063.xsf file_00095.xsf file_00127.xsf file_00159.xsf
Their structures are perturbed from reference training data and their energy tags are given from the GPR predictions
! cd ./additional_xsf/ && cat file_00015.xsf# total energy = -18640.9461593190389976 eV
ATOMS
O 9.97065996106500 6.46635005812972 12.21593334522877 -1.15869724576312 -0.60309149486231 0.99615841564892
O 8.44536407201865 5.29733104422497 13.48408658363084 -0.01350280495380 0.22143818708766 -0.61780919881785
O 9.99286631347819 4.19238271088024 12.32159337159564 0.06463443556037 -0.99968307968704 -1.40632970281874
C 9.33670213066266 7.47904915079535 13.11058062527982 -4.54776510059830 -2.19826669485126 -2.57229641109970
C 7.92777366896470 6.63428687083957 13.62116515332962 6.25116583293155 0.38040007289875 0.28212693994131
C 9.46651467269076 5.20344897778359 12.55040792880843 0.64869706340766 1.90457285067633 2.08678323426103
H 8.88951953973056 8.25273585001219 12.38788003892017 1.28946179466327 -0.35490303243622 0.90213320511167
H 9.92985508661475 7.76074808189103 13.86560678502387 0.80332788132769 0.90574691147812 0.98313744800933
H 7.90108231803724 6.90346445209486 14.69564978974586 -1.31411455527912 -0.39014087070777 -0.13480631656984
H 7.21123067525057 6.67710779092105 12.90877406049722 -2.28800784198768 1.33449272352351 -0.78843168556723
O 4.91826425429386 2.44398779473527 13.37397981575701 1.66528592192142 0.56291818334518 2.01074744839687
O 3.15237912970306 2.92965434059455 12.13282488175020 0.99693884066342 -0.52550429358988 0.46907422773334
O 4.02161655331011 0.83052840552308 12.11701816223277 0.10314522771125 -0.10523794684186 0.36320142277876
C 4.72139866531235 3.84893622336680 13.55825605462893 0.50541416210727 0.52264030899472 -1.08891268021501
C 3.33330653190436 4.08486021555220 12.97254096493174 0.93287530486782 0.35551311278508 -2.01383881711453
C 4.09385604309408 1.90964341788034 12.57309440754714 -2.50850351619152 1.15358760975927 -2.12814394988642
H 5.45989277436800 4.43795605442972 12.96434307646078 0.31886911364352 -0.92397407547324 0.26722376544777
H 4.89262149610875 4.23505131046355 14.56880014519296 -0.31962292977434 -0.54357472444843 1.12998393062999
H 2.53094594244838 4.12194766025730 13.59032748793689 -1.06801779021283 0.07177053771449 1.97277280258740
H 3.22680331094396 5.02287580962462 12.35203428150133 0.55042741793405 -0.25508025082462 0.24525909385575
! cd ./additional_xsf/ && cat file_00016.xsf# total energy = -18639.6648082992396667 eV
ATOMS
O 10.15227370342503 6.44958580651717 12.25833599680163 -3.12009724387923 0.39843798955373 1.80916286227078
O 8.42634633166613 5.26870987872721 13.43168261890704 0.33309106596194 2.06278251068965 -1.00644457039500
O 10.07431938966726 4.06763328367860 12.28310862739118 -2.17084568279310 4.57831799047725 0.93948534814079
C 9.14352045878790 7.52426161213143 13.16112073993508 1.46499884108945 -1.11849846897069 -3.64417826868910
C 7.96195922886718 6.77266820917396 13.55584194884421 1.72099610393700 -2.30784958203667 0.60615956803558
C 9.51640272207787 5.25746043737564 12.56770061403314 2.39613207853284 -4.08472419763649 -0.17682694111950
H 8.89714808707697 8.33155335402885 12.40250791091782 0.13959902431421 -0.12712446678022 0.39800009645046
H 10.00813383494060 7.79757660903536 13.70306282437868 0.05454168919526 0.40369189021505 1.50626184110737
H 7.84323126271538 6.85968730478338 14.63884905846113 -0.23303448126635 0.21487638844205 -0.10817042286214
H 7.12981728203202 6.85044936181053 12.93628718689347 -0.43311016408211 0.28111033068590 -0.39088162760505
O 4.94501688600860 2.40859896586763 13.44006717355307 0.24660198576990 -0.01754125758632 -0.31856240437557
O 3.16555973820007 2.98442404429890 12.22272752856466 0.06302623632492 -2.51592727622568 -1.65386672005491
O 3.95580912305566 0.84399281288004 12.14492543032332 -0.16139316380740 -1.16658399238769 -0.47840317454882
C 4.74467825241762 3.80452097941570 13.61567495392377 -0.24693827397360 0.04724906123076 -3.72083951737494
C 3.35947002294384 4.04359363810228 12.88388748755841 0.26069392398630 1.71072797249965 1.96301485044233
C 4.04506453414193 1.88219489587209 12.55441072670702 -0.52975442042521 2.58486030863648 0.69021117936760
H 5.47878331841619 4.42378639873902 12.96060996549916 0.47700165981299 -0.38168525547312 0.56140237501311
H 4.83918484833238 4.08553803539405 14.50428339135624 -0.03046378995507 0.07038175611235 2.21236528940847
H 2.60906550069688 4.00490471040284 13.71174641156211 0.20581146586767 0.29702369776066 -0.43513352507919
H 3.26324122453052 5.07348432176532 12.31842223438886 0.30842855608991 -1.53301908820481 0.18055175339416