Skip to content

Commit

Permalink
f!
Browse files Browse the repository at this point in the history
  • Loading branch information
JintaoWu98 committed May 25, 2024
1 parent 9106a3c commit 30d4952
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 16 deletions.
18 changes: 8 additions & 10 deletions arc/plotter.py
Original file line number Diff line number Diff line change
Expand Up @@ -900,7 +900,7 @@ def save_conformers_file(project_directory: str,
ts_methods: Optional[List[str]] = None,
im_freqs: Optional[List[List[float]]] = None,
log_content: bool = False,
before_optimization: Optional[bool] = None,
before_optimization: bool = True,
):
"""
Save the conformers before or after optimization.
Expand All @@ -919,26 +919,24 @@ def save_conformers_file(project_directory: str,
ts_methods (list, optional): Entries are method names used to generate the TS guess.
im_freqs (list, optional): Entries lists of imaginary frequencies.
log_content (bool): Whether to log the content of the conformers file. ``True`` to log, default is ``False``.
before_optimization (bool): Whether the conformers are before DFT optimization. ``True`` for before, default is ``True``.
"""
spc_dir = 'rxns' if is_ts else 'Species'
geo_dir = os.path.join(project_directory, 'output', spc_dir, label, 'geometry', 'conformers')
if not os.path.exists(geo_dir):
os.makedirs(geo_dir)
if before_optimization or energies is None or not any(e is not None for e in energies):
optimized = False
if before_optimization:
conf_path = os.path.join(geo_dir, 'conformers_before_optimization.txt')
min_e = extremum_list(energies, return_min=True) if before_optimization else None
else:
optimized = True
min_e = extremum_list(energies, return_min=True)
conf_path = os.path.join(geo_dir, 'conformers_after_optimization.txt')
min_e = extremum_list(energies, return_min=True)
with open(conf_path, 'w') as f:
content = ''
if optimized:
level_of_theory = level_of_theory.simple() if isinstance(level_of_theory, Level) else level_of_theory
content += f'Conformers for {label}, optimized at the {level_of_theory} level:\n\n'
if before_optimization:
content += f'Conformers for {label}, computed using a force field:\n\n'
else:
level_of_theory = level_of_theory.simple() if isinstance(level_of_theory, Level) else level_of_theory
content += f'Conformers for {label}, optimized at the {level_of_theory} level:\n\n'
for i, xyz in enumerate(xyzs):
content += f'conformer {i}:\n'
if xyz is not None:
Expand All @@ -954,7 +952,7 @@ def save_conformers_file(project_directory: str,
content += f'TS guess method: {ts_methods[i]}\n'
if im_freqs is not None and im_freqs[i] is not None:
content += f'Imaginary frequencies: {im_freqs[i]}\n'
if optimized or before_optimization:
if min_e is not None:
if energies[i] == min_e:
content += 'Relative Energy: 0 kJ/mol (lowest)'
elif energies[i] is not None:
Expand Down
3 changes: 2 additions & 1 deletion arc/plotter_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,8 @@ def test_save_conformers_file(self):
plotter.save_conformers_file(project_directory=project_directory, label=spc1.label,
xyzs=spc1.conformers, level_of_theory='APFD/def2tzvp',
multiplicity=spc1.multiplicity, charge=spc1.charge, is_ts=False,
energies=spc1.conformer_energies)
energies=spc1.conformer_energies,
before_optimization=True,)
conf_file_path = os.path.join(project_directory, 'output', 'Species', label, 'geometry', 'conformers',
'conformers_before_optimization.txt')
self.assertTrue(os.path.isfile(conf_file_path))
Expand Down
8 changes: 6 additions & 2 deletions arc/scheduler.py
Original file line number Diff line number Diff line change
Expand Up @@ -1139,6 +1139,7 @@ def run_ts_conformer_jobs(self, label: str):
f'{tsg.method_direction if tsg.method_direction is not None else ""} '
f'{tsg.method_index if tsg.method_index is not None else ""} '
for tsg in self.species_dict[label].ts_guesses],
before_optimization=True,
)
successful_tsgs = [tsg for tsg in self.species_dict[label].ts_guesses if tsg.success]
if len(successful_tsgs) > 1:
Expand Down Expand Up @@ -2023,8 +2024,9 @@ def determine_most_stable_conformer(self, label):
multiplicity=self.species_dict[label].multiplicity,
charge=self.species_dict[label].charge,
is_ts=False,
energies=self.species_dict[label].conformer_energies, # after optimization
)
energies=self.species_dict[label].conformer_energies,
before_optimization=False,
) # after optimization
# Run isomorphism checks if a 2D representation is available
if self.species_dict[label].mol is not None:
for i, xyz in enumerate(xyzs):
Expand Down Expand Up @@ -2239,6 +2241,7 @@ def determine_most_likely_ts_conformer(self, label: str):
for tsg in self.species_dict[label].ts_guesses],
im_freqs=[tsg.imaginary_freqs for tsg in self.species_dict[label].ts_guesses]
if any(tsg.imaginary_freqs is not None for tsg in self.species_dict[label].ts_guesses) else None,
before_optimization=False,
)

def parse_composite_geo(self,
Expand Down Expand Up @@ -2574,6 +2577,7 @@ def check_negative_freq(self,
for tsg in self.species_dict[label].ts_guesses],
im_freqs=[tsg.imaginary_freqs for tsg in self.species_dict[label].ts_guesses]
if any(tsg.imaginary_freqs is not None for tsg in self.species_dict[label].ts_guesses) else None,
before_optimization=False,
)
if not self.testing:
# Update restart dictionary and save the yaml restart file:
Expand Down
3 changes: 2 additions & 1 deletion arc/scheduler_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,8 @@ def test_conformers(self):
xyzs=self.sched1.species_dict['C2H6'].conformers,
level_of_theory=Level(method='CBS-QB3'),
multiplicity=1,
charge=0)
charge=0,
before_optimization=True,)
c2h6_conf_path = os.path.join(self.sched1.project_directory, 'output', 'Species', 'C2H6', 'geometry',
'conformers', 'conformers_before_optimization.txt')
self.assertTrue(os.path.isfile(c2h6_conf_path))
Expand Down
6 changes: 4 additions & 2 deletions arc/species/species_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -1548,13 +1548,15 @@ def test_append_conformers(self):

# test w/o energies
save_conformers_file(project_directory=project_directory, label='vinoxy', xyzs=xyzs,
level_of_theory=Level(repr='level1'), multiplicity=2, charge=0)
level_of_theory=Level(repr='level1'), multiplicity=2, charge=0,
before_optimization=True,)
self.assertTrue(os.path.isfile(os.path.join(project_directory, 'output', 'Species', 'vinoxy', 'geometry',
'conformers', 'conformers_before_optimization.txt')))

# test with energies
save_conformers_file(project_directory=project_directory, label='vinoxy', xyzs=xyzs,
level_of_theory=Level(repr='level1'), multiplicity=2, charge=0, energies=energies)
level_of_theory=Level(repr='level1'), multiplicity=2, charge=0,
energies=energies, before_optimization=False,)
self.assertTrue(os.path.isfile(os.path.join(project_directory, 'output', 'Species', 'vinoxy', 'geometry',
'conformers', 'conformers_after_optimization.txt')))

Expand Down

0 comments on commit 30d4952

Please sign in to comment.