Skip to content

Commit 19a9e53

Browse files
Copilotss0832
andcommitted
Replace root-level scripts with thin wrappers delegating to entrypoints.py
Co-authored-by: ss0832 <80376408+ss0832@users.noreply.github.com>
1 parent 88b9e47 commit 19a9e53

9 files changed

Lines changed: 39 additions & 1905 deletions

conformation_search.py

Lines changed: 5 additions & 790 deletions
Large diffs are not rendered by default.

ieipmain.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
1-
import sys
2-
sys.path.append('./multioptpy')
1+
"""Backward-compatible standalone script. Delegates to the installed entry point."""
2+
from multioptpy.entrypoints import run_ieipmain
33

4-
import multioptpy
5-
6-
parser = multioptpy.interface.init_parser()
7-
args = multioptpy.interface.ieipparser(parser)
8-
iEIP = multioptpy.ieip.iEIP(args)
9-
iEIP.run()
4+
if __name__ == "__main__":
5+
run_ieipmain()

mdmain.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
1-
import sys
2-
sys.path.append('./multioptpy')
1+
"""Backward-compatible standalone script. Delegates to the installed entry point."""
2+
from multioptpy.entrypoints import run_mdmain
33

4-
import multioptpy
5-
6-
parser = multioptpy.interface.init_parser()
7-
args = multioptpy.interface.mdparser(parser)
8-
MD = multioptpy.moleculardynamics.MD(args)
9-
MD.run()
4+
if __name__ == "__main__":
5+
run_mdmain()

nebmain.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
1-
import sys
2-
sys.path.append('./multioptpy')
1+
"""Backward-compatible standalone script. Delegates to the installed entry point."""
2+
from multioptpy.entrypoints import run_nebmain
33

4-
import multioptpy
5-
6-
parser = multioptpy.interface.init_parser()
7-
args = multioptpy.interface.nebparser(parser)
8-
NEB = multioptpy.neb.NEB(args)
9-
NEB.run()
4+
if __name__ == "__main__":
5+
run_nebmain()

optmain.py

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,5 @@
1-
import sys
2-
#import os
3-
#from glob import glob
4-
sys.path.append('./multioptpy')
1+
"""Backward-compatible standalone script. Delegates to the installed entry point."""
2+
from multioptpy.entrypoints import run_optmain
53

6-
import multioptpy
7-
8-
parser = multioptpy.interface.init_parser()
9-
args = multioptpy.interface.optimizeparser(parser)
10-
bpa = multioptpy.optimization.Optimize(args)
11-
bpa.run()
12-
#print("----------------------------------------------------")
13-
#print("### gradients of bias potential parameters ###")
14-
#print("### (This is the parameters of the final file.) ###")
15-
#print(bpa.bias_pot_params_grad_name_list)
16-
#print(bpa.bias_pot_params_grad_list)
17-
#print("----------------------------------------------------")
4+
if __name__ == "__main__":
5+
run_optmain()

orientation_search.py

Lines changed: 5 additions & 152 deletions
Original file line numberDiff line numberDiff line change
@@ -1,152 +1,5 @@
1-
import sys
2-
import os
3-
import random
4-
5-
from multioptpy.Utils import calc_tools
6-
import numpy as np
7-
8-
import multioptpy
9-
10-
def orientation_search(parser):
11-
parser.add_argument("-nsample", "--number_of_samples", type=int, default=5, help='the number of sampling orientations')
12-
parser.add_argument("-part", "--part", nargs="*", type=str, help='the part number (ex.) 1,2,3 or 1-3', default=None)
13-
parser.add_argument("-dist", "--distance", type=float, default=5.0, help='the distance of parts [ang.]')
14-
return parser
15-
16-
17-
def num_parse(numbers):
18-
sub_list = []
19-
20-
sub_tmp_list = numbers.split(",")
21-
for sub in sub_tmp_list:
22-
if "-" in sub:
23-
for j in range(int(sub.split("-")[0]),int(sub.split("-")[1])+1):
24-
sub_list.append(j)
25-
else:
26-
sub_list.append(int(sub))
27-
return sub_list
28-
29-
30-
def save_xyz_file(coord_list, element_list, file_name, n_sample):
31-
no_ext_file_name = os.path.splitext(file_name)[0]
32-
sample_file_name = no_ext_file_name+"_Sample_"+str(n_sample)+".xyz"
33-
with open(sample_file_name, 'w') as f:
34-
f.write(str(len(coord_list))+"\n")
35-
f.write("Sample_"+str(n_sample)+"\n")
36-
for i in range(len(coord_list)):
37-
f.write(element_list[i]+" "+str(coord_list[i][0])+" "+str(coord_list[i][1])+" "+str(coord_list[i][2])+"\n")
38-
39-
return sample_file_name
40-
41-
42-
def make_random_orientation_xyz_file(coord_list, part_list, part_dist, input_file_name, n_sample):#ang.
43-
part_coord_list = []
44-
part_element_list = []
45-
for part in part_list:
46-
tmp_part_coord_list = []
47-
tmp_part_element_list = []
48-
for p in part:
49-
tmp_part_coord_list.append(coord_list[p-1])
50-
tmp_part_element_list.append(element_list[p-1])
51-
part_coord_list.append(np.array(tmp_part_coord_list))
52-
part_element_list.append(tmp_part_element_list)
53-
54-
# Random rotation
55-
rand_rotated_part_coord_list = []
56-
for i in range(len(part_coord_list)):
57-
part_center = calc_tools.Calculationtools().calc_center(part_coord_list[i], part_element_list[i])
58-
centered_part_coord_list = part_coord_list[i] - part_center
59-
random_x_angle = random.uniform(0, 2*np.pi)
60-
random_y_angle = random.uniform(0, 2*np.pi)
61-
random_z_angle = random.uniform(0, 2*np.pi)
62-
print("Random angles (Radian): ", random_x_angle, random_y_angle, random_z_angle)
63-
rotated_part_coord = calc_tools.rotate_molecule(centered_part_coord_list, "x", random_x_angle)
64-
rotated_part_coord = calc_tools.rotate_molecule(rotated_part_coord, "y", random_y_angle)
65-
rotated_part_coord = calc_tools.rotate_molecule(rotated_part_coord, "z", random_z_angle)
66-
rand_rotated_part_coord_list.append(rotated_part_coord)
67-
68-
69-
# Random translation
70-
rand_tr_rot_part_coord_list = rand_rotated_part_coord_list
71-
72-
if len(rand_tr_rot_part_coord_list) == 2:
73-
rand_dist = random.uniform(part_dist, 1.1*part_dist)
74-
rand_tr_rot_part_coord_list[0] = rand_tr_rot_part_coord_list[0] - np.array([part_dist/2, 0, 0])
75-
rand_tr_rot_part_coord_list[1] = rand_tr_rot_part_coord_list[1] + np.array([part_dist/2, 0, 0])
76-
else:
77-
fragm_num = len(rand_tr_rot_part_coord_list)
78-
rand_dist = random.uniform(part_dist, 1.1*part_dist)
79-
rand_sample_list = random.sample(range(fragm_num), fragm_num)
80-
distance_polygen_point_from_center = 0.5 * rand_dist * np.tan((fragm_num - 2) * np.pi / fragm_num)
81-
tmp_angle = 0.0
82-
for i in range(len(rand_sample_list)):
83-
rand_tr_rot_part_coord_list[rand_sample_list[i]] = rand_tr_rot_part_coord_list[rand_sample_list[i]] + np.array([distance_polygen_point_from_center * np.cos(tmp_angle), distance_polygen_point_from_center * np.sin(tmp_angle), 0])
84-
tmp_angle += 2 * np.pi / fragm_num
85-
86-
combined_coord_list = np.zeros((len(coord_list), 3))
87-
88-
# Combine all parts
89-
for i in range(len(part_list)):
90-
part = part_list[i]
91-
92-
for j in range(len(part)):
93-
94-
combined_coord_list[part[j]-1] = rand_tr_rot_part_coord_list[i][j]
95-
96-
input_file_name = save_xyz_file(combined_coord_list, element_list, input_file_name, n_sample)
97-
98-
return input_file_name
99-
100-
101-
102-
if __name__ == '__main__':
103-
parser = multioptpy.interface.init_parser()
104-
parser = orientation_search(parser)
105-
args = multioptpy.interface.optimizeparser(parser)
106-
107-
part_dist = args.distance
108-
109-
with open(args.INPUT, 'r') as f:
110-
words = f.read().splitlines()
111-
112-
element_list = []
113-
coord_list = []
114-
115-
for word in words:
116-
splitted_word = word.split()
117-
118-
if len(splitted_word) > 3:
119-
element_list.append(str(splitted_word[0]))
120-
coord_list.append([float(splitted_word[1]), float(splitted_word[2]), float(splitted_word[3])])
121-
122-
coord_list = np.array(coord_list, dtype="float64")
123-
atom_num = len(coord_list)
124-
125-
if args.part is None:
126-
print("No part is specified. exit....")
127-
sys.exit(0)
128-
129-
part_list = []
130-
for i in range(len(args.part)):
131-
part_list.append(num_parse(args.part[i]))
132-
133-
flattened_part_list = [item for sublist in part_list for item in sublist]
134-
missing_parts = [num for num in range(1, atom_num+1) if num not in flattened_part_list]
135-
if len(missing_parts) > 0:
136-
part_list.append(missing_parts)
137-
138-
print("Number of Parts: ", len(part_list))
139-
n_sample = args.number_of_samples
140-
141-
original_input_file = args.INPUT
142-
143-
for i in range(n_sample):
144-
print("Sampling orientation: ", i)
145-
args.INPUT = make_random_orientation_xyz_file(coord_list, part_list, part_dist, original_input_file, i)
146-
bpa = multioptpy.optimization.Optimize(args)
147-
bpa.run()
148-
149-
150-
print("Sampling orientation: ", i, "done")
151-
152-
print("Orientation search done")
1+
"""Backward-compatible standalone script. Delegates to the installed entry point."""
2+
from multioptpy.entrypoints import run_orientsearch
3+
4+
if __name__ == "__main__":
5+
run_orientsearch()

relaxed_scan.py

Lines changed: 5 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -1,127 +1,5 @@
1-
import sys
2-
import os
3-
import shutil
4-
import datetime
5-
6-
import multioptpy.Utils.calc_tools
7-
from multioptpy.Parameters.unit_values import UnitValueLib
8-
import numpy as np
9-
import multioptpy
10-
11-
# When you use psi4 with this script, segmentation fault may occur. Thus, I recommend to use pyscf, tblite and so on with the following script.
12-
13-
def relaxed_scan_perser(parser):
14-
parser.add_argument("-nsample", "--number_of_samples", type=int, default=10, help='the number of sampling relaxed scan coordinates')
15-
parser.add_argument("-scan", "--scan_tgt", nargs="*", type=str, help='scan target (ex.) [[bond, angle, or dihedral etc.] [atom_num] [(value_1(ex. 1.0 ang.)),(value_2(ex. 1.5 ang.))] ...] ', default=None)
16-
parser.add_argument("-fo", "--first_only", action="store_true", help='use only input structure for relax scan ')
17-
return parser
18-
19-
20-
def num_parse(numbers):
21-
sub_list = []
22-
23-
sub_tmp_list = numbers.split(",")
24-
for sub in sub_tmp_list:
25-
if "-" in sub:
26-
for j in range(int(sub.split("-")[0]),int(sub.split("-")[1])+1):
27-
sub_list.append(j)
28-
else:
29-
sub_list.append(int(sub))
30-
return sub_list
31-
32-
33-
def save_xyz_file(coord_list, element_list, file_name, additional_name, directory):
34-
no_ext_file_name = os.path.splitext(file_name)[0]
35-
sample_file_name = no_ext_file_name+"_RelaxedScan_"+str(additional_name)+".xyz"
36-
with open(directory + sample_file_name, 'w') as f:
37-
f.write(str(len(coord_list))+"\n")
38-
f.write("RelaxedScan_"+str(additional_name)+"\n")
39-
for i in range(len(coord_list)):
40-
f.write(element_list[i]+" "+str(coord_list[i][0])+" "+str(coord_list[i][1])+" "+str(coord_list[i][2])+"\n")
41-
42-
return sample_file_name
43-
44-
def make_scan_tgt(scan_list):
45-
scan_tgt_list = []
46-
atom_num_list = []
47-
scan_range_list = []
48-
for i in range(int(len(scan_list)/3)):
49-
scan = scan_list[i*3:i*3+3]
50-
scan_type = str(scan[0])
51-
atom_num_list.append(scan[1])
52-
tmp_scan_tgt = scan[2].split(",")
53-
scan_tgt_list.append(scan_type)
54-
scan_range_list.append([float(tmp_scan_tgt[0]), float(tmp_scan_tgt[1])])
55-
return scan_tgt_list, atom_num_list, scan_range_list
56-
57-
58-
if __name__ == '__main__':
59-
parser = multioptpy.interface.init_parser()
60-
parser = relaxed_scan_perser(parser)
61-
args = multioptpy.interface.optimizeparser(parser)
62-
first_only_flag = args.first_only
63-
date = datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S")
64-
directory = os.path.splitext(args.INPUT)[0]+"_RScan_"+date+"/"
65-
os.makedirs(directory, exist_ok=True)
66-
ene_profile_filepath = directory + os.path.splitext(args.INPUT)[0]+"_scan_energy_profile_"+date+".csv"
67-
68-
scan_part = int(args.number_of_samples)
69-
scan_tgt_list, atom_num_list, scan_range_list = make_scan_tgt(args.scan_tgt)
70-
71-
with open(args.INPUT, 'r') as f:
72-
words = f.read().splitlines()
73-
74-
75-
print("Start relaxed scan .... ")
76-
print("Scan target: ", scan_tgt_list, atom_num_list)
77-
print("Scan range: ", scan_range_list)
78-
scan_job_list = np.array([np.linspace(start, end, scan_part) for start, end in scan_range_list]).T
79-
80-
81-
original_input_file = args.INPUT
82-
original_args = args
83-
84-
with open(ene_profile_filepath, "w") as f:
85-
f.write(str(",".join(scan_tgt_list))+",energy,bias_energy\n")
86-
tmp_atom_num_list = [str(i).replace(",", "_") for i in atom_num_list]
87-
f.write(str(",".join(tmp_atom_num_list))+",(hartree),(hartree)\n")
88-
89-
90-
shutil.copyfile(original_input_file, directory + os.path.splitext(original_input_file)[0]+"_RelaxedScan_0.xyz")
91-
shutil.copyfile(original_input_file, os.path.splitext(original_input_file)[0]+"_RelaxedScan_0.xyz")
92-
init_input_file = os.path.splitext(original_input_file)[0]+"_RelaxedScan_0.xyz"
93-
args.INPUT = init_input_file
94-
95-
with open(directory + "input.txt", 'w') as f:
96-
f.write(str(vars(args)))
97-
98-
for i in range(scan_part):
99-
print("scan type(s) : ", scan_tgt_list)
100-
print("scan atom(s) : ", atom_num_list)
101-
print("scan value(s) : ", scan_job_list[i])
102-
args.projection_constrain = []
103-
for scan_tgt, atom_num, scan_value in zip(scan_tgt_list, atom_num_list, scan_job_list[i]):
104-
args.projection_constrain.extend(["manual", scan_tgt, atom_num, str(scan_value)])
105-
106-
bpa = multioptpy.optimization.Optimize(args)
107-
bpa.run()
108-
109-
opted_geometry = bpa.final_geometry * UnitValueLib().bohr2angstroms # get optimized geometry
110-
element_list = bpa.element_list
111-
energy = bpa.final_energy
112-
bias_energy = bpa.final_bias_energy
113-
114-
next_input_file_for_save = directory + save_xyz_file(opted_geometry, element_list, original_input_file, i+1, directory)
115-
next_input_file = save_xyz_file(opted_geometry, element_list, original_input_file, i+1, "")
116-
args = original_args
117-
if first_only_flag:
118-
args.INPUT = init_input_file
119-
else:
120-
args.INPUT = next_input_file
121-
print("Done.")
122-
123-
with open(ene_profile_filepath, "a") as f:
124-
f.write(str(",".join(list(map(str, scan_job_list[i].tolist())))) + "," + str(energy) + "," + str(bias_energy) + "\n")
125-
del bpa
126-
127-
print("Relaxed scan done ...")
1+
"""Backward-compatible standalone script. Delegates to the installed entry point."""
2+
from multioptpy.entrypoints import run_relaxedscan
3+
4+
if __name__ == "__main__":
5+
run_relaxedscan()

0 commit comments

Comments
 (0)