Révision 695dcff8
b/dockonsurf.py | ||
---|---|---|
14 | 14 |
args = get_args() |
15 | 15 |
logger = config_log('DockOnSurf') |
16 | 16 |
|
17 |
logger.info(f'DockOnSurf started on {os.getcwd()}') |
|
18 |
logger.info(f"Using '{args.input}' as input") |
|
17 |
logger.info(f'DockOnSurf started on {os.getcwd()}.')
|
|
18 |
logger.info(f"Using '{args.input}' as input.")
|
|
19 | 19 |
|
20 | 20 |
inp_vars = read_input(args.input) |
21 | 21 |
|
... | ... | |
28 | 28 |
if inp_vars['refinement']: |
29 | 29 |
run_refinement(inp_vars) |
30 | 30 |
|
31 |
logger.info(f'DockOnSurf finished') |
|
31 |
logger.info(f'DockOnSurf finished.') |
b/modules/calculation.py | ||
---|---|---|
24 | 24 |
logger.warning("'COORD_FILE_NAME' not specified on CP2K input. Using\n" |
25 | 25 |
"default name 'coord.xyz'. A new CP2K input file with " |
26 | 26 |
"the 'COORD_FILE_NAME' variable is created. If there\n" |
27 |
"is a name conflict the old file will be backed up") |
|
27 |
"is a name conflict the old file will be backed up.")
|
|
28 | 28 |
force_eval.SUBSYS.TOPOLOGY.Coord_file_name = 'coord.xyz' |
29 | 29 |
print(inp_file.split('/')[-1]) |
30 | 30 |
check_bak(inp_file.split('/')[-1]) |
... | ... | |
81 | 81 |
subm_jobs.append(qsub(sub_script, name=job_name)) |
82 | 82 |
os.chdir(init_dir) |
83 | 83 |
|
84 |
logger.info('All jobs have been submitted, waiting them to finish') |
|
84 |
logger.info('All jobs have been submitted, waiting them to finish.')
|
|
85 | 85 |
while not all([stat == 'f' for stat in get_jobs_status_sge(subm_jobs)]): |
86 | 86 |
sleep(30) |
87 |
logger.info('All jobs have finished') |
|
87 |
logger.info('All jobs have finished.')
|
|
88 | 88 |
|
89 | 89 |
|
90 | 90 |
def sub_lsf(run_type, sub_script, max_qw, name): |
... | ... | |
109 | 109 |
|
110 | 110 |
if inp_vars['batch_q_sys']: |
111 | 111 |
logger.info(f"Running {run_type} calculation with {inp_vars['code']} on" |
112 |
f" {inp_vars['batch_q_sys']}") |
|
112 |
f" {inp_vars['batch_q_sys']}.")
|
|
113 | 113 |
else: |
114 |
logger.info(f"Doing a dry run of {run_type}") |
|
114 |
logger.info(f"Doing a dry run of {run_type}.")
|
|
115 | 115 |
check_bak(run_type) |
116 | 116 |
os.mkdir(run_type) |
117 | 117 |
if inp_vars['code'] == 'cp2k': |
b/modules/clustering.py | ||
---|---|---|
205 | 205 |
|
206 | 206 |
if data.shape[0] == data.shape[1] \ |
207 | 207 |
and (np.tril(data).T == np.triu(data)).all(): |
208 |
logger.info("Clustering using affinity matrix") |
|
208 |
logger.info("Clustering using affinity matrix.")
|
|
209 | 209 |
labels = get_labels_affty(data) |
210 | 210 |
if max(labels) == -1: |
211 | 211 |
logger.warning('Clustering of conformers did not converge. Try ' |
212 |
"setting a smaller 'min_samples' parameter") |
|
212 |
"setting a smaller 'min_samples' parameter.")
|
|
213 | 213 |
exemplars = list(range(data.shape[0])) |
214 | 214 |
else: |
215 | 215 |
clusters = get_clusters(labels) |
b/modules/dos_input.py | ||
---|---|---|
205 | 205 |
def get_subm_script(): |
206 | 206 |
subm_script = dos_inp.get('Global', 'subm_script', fallback=False) |
207 | 207 |
if subm_script and not os.path.isfile(subm_script): |
208 |
logger.error(f'File {subm_script} not found') |
|
208 |
logger.error(f'File {subm_script} not found.')
|
|
209 | 209 |
raise FileNotFoundError(f'File {subm_script} not found') |
210 | 210 |
return subm_script |
211 | 211 |
|
... | ... | |
283 | 283 |
def get_isol_inp_file(): |
284 | 284 |
isol_inp_file = dos_inp.get('Isolated', 'isol_inp_file') |
285 | 285 |
if not os.path.isfile(isol_inp_file): |
286 |
logger.error(f'File {isol_inp_file} not found') |
|
286 |
logger.error(f'File {isol_inp_file} not found.')
|
|
287 | 287 |
raise FileNotFoundError(f'File {isol_inp_file} not found') |
288 | 288 |
return isol_inp_file |
289 | 289 |
|
... | ... | |
291 | 291 |
def get_molec_file(): |
292 | 292 |
molec_file = dos_inp.get('Isolated', 'molec_file') |
293 | 293 |
if not os.path.isfile(molec_file): |
294 |
logger.error(f'File {molec_file} not found') |
|
294 |
logger.error(f'File {molec_file} not found.')
|
|
295 | 295 |
raise FileNotFoundError(f'File {molec_file} not found') |
296 | 296 |
return molec_file |
297 | 297 |
|
... | ... | |
339 | 339 |
def get_screen_inp_file(): |
340 | 340 |
screen_inp_file = dos_inp.get('Screening', 'screen_inp_file') |
341 | 341 |
if not os.path.isfile(screen_inp_file): |
342 |
logger.error(f'File {screen_inp_file} not found') |
|
342 |
logger.error(f'File {screen_inp_file} not found.')
|
|
343 | 343 |
raise FileNotFoundError(f'File {screen_inp_file} not found') |
344 | 344 |
return screen_inp_file |
345 | 345 |
|
... | ... | |
347 | 347 |
def get_surf_file(): |
348 | 348 |
surf_file = dos_inp.get('Screening', 'surf_file') |
349 | 349 |
if not os.path.isfile(surf_file): |
350 |
logger.error(f'File {surf_file} not found') |
|
350 |
logger.error(f'File {surf_file} not found.')
|
|
351 | 351 |
raise FileNotFoundError(f'File {surf_file} not found') |
352 | 352 |
return surf_file |
353 | 353 |
|
... | ... | |
549 | 549 |
def get_refine_inp_file(): # TODO if not specified try isol_inp_file. |
550 | 550 |
refine_inp_file = dos_inp.get('Refinement', 'refine_inp_file') |
551 | 551 |
if not os.path.isfile(refine_inp_file): |
552 |
logger.error(f'File {refine_inp_file} not found') |
|
552 |
logger.error(f'File {refine_inp_file} not found.')
|
|
553 | 553 |
raise FileNotFoundError(f'File {refine_inp_file} not found') |
554 | 554 |
|
555 | 555 |
return refine_inp_file |
... | ... | |
572 | 572 |
dos_inp.read(in_file) |
573 | 573 |
except MissingSectionHeaderError as e: |
574 | 574 |
logger.error('There are options in the input file without a Section ' |
575 |
'header') |
|
575 |
'header.')
|
|
576 | 576 |
err = e |
577 | 577 |
except DuplicateOptionError as e: |
578 | 578 |
logger.error('There is an option in the input file that has been ' |
579 | 579 |
'specified more than once, possibly due to the lack of a ' |
580 |
'Section header') |
|
580 |
'Section header.')
|
|
581 | 581 |
err = e |
582 | 582 |
except Exception as e: |
583 | 583 |
err = e |
... | ... | |
685 | 685 |
if return_vars['min_coll_height'] is not False and \ |
686 | 686 |
return_vars['surf_norm_vect'].tolist() not in cart_axes: |
687 | 687 |
logger.warning("'min_coll_height' option is only implemented for " |
688 |
"'surf_norm_vect' to be one of the x, y or z axes") |
|
688 |
"'surf_norm_vect' to be one of the x, y or z axes.")
|
|
689 | 689 |
|
690 | 690 |
# Refinement |
691 | 691 |
if refinement: |
... | ... | |
708 | 708 |
return_vars_str = "\n\t".join([str(key) + ": " + str(value) |
709 | 709 |
for key, value in return_vars.items()]) |
710 | 710 |
logger.info( |
711 |
f'Correctly read {in_file} parameters: \n\n\t{return_vars_str}\n') |
|
711 |
f'Correctly read {in_file} parameters: \n\n\t{return_vars_str}\n.')
|
|
712 | 712 |
|
713 | 713 |
return return_vars |
714 | 714 |
|
b/modules/formats.py | ||
---|---|---|
38 | 38 |
from ase import Atoms |
39 | 39 |
if mol.GetNumConformers() > 1: |
40 | 40 |
logger.warning('A mol object with multiple conformers is parsed, ' |
41 |
'converting to Atoms only the first conformer') |
|
41 |
'converting to Atoms only the first conformer.')
|
|
42 | 42 |
symbols = [atm.GetSymbol() for atm in mol.GetAtoms()] |
43 | 43 |
positions = mol.GetConformer(0).GetPositions() |
44 | 44 |
return Atoms(symbols=symbols, positions=positions) |
b/modules/isolated.py | ||
---|---|---|
55 | 55 |
are required to be local minima, ie. setting the 'local_min' value to |
56 | 56 |
True, a geometry optimisation using UFF is performed. |
57 | 57 |
""" |
58 |
logger.debug('Generating Conformers') |
|
58 |
logger.debug('Generating Conformers.')
|
|
59 | 59 |
|
60 | 60 |
mol = Chem.AddHs(mol) |
61 | 61 |
Chem.EmbedMultipleConfs(mol, numConfs=num_confs, numThreads=0) |
62 | 62 |
Chem.AlignMolConformers(mol) |
63 |
logger.info(f'Generated {len(mol.GetConformers())} conformers') |
|
63 |
logger.info(f'Generated {len(mol.GetConformers())} conformers.')
|
|
64 | 64 |
return mol |
65 | 65 |
|
66 | 66 |
|
... | ... | |
114 | 114 |
if mol.GetNumConformers() < init_num_confs: |
115 | 115 |
logger.warning(f'MMFF Geometry optimization did not comverge for at' |
116 | 116 |
f'least one conformer. Continuing with ' |
117 |
f'{mol.GetNumConformers()} converged conformers') |
|
117 |
f'{mol.GetNumConformers()} converged conformers.')
|
|
118 | 118 |
logger.info(f'Pre-optimized conformers with MMFF.') |
119 | 119 |
return mol, np.array([res[1] for res in results if res[0] == 0]) |
120 | 120 |
else: |
... | ... | |
133 | 133 |
from modules.clustering import clustering, get_rmsd |
134 | 134 |
from modules.calculation import run_calc |
135 | 135 |
|
136 |
logger.info('Carrying out procedures for the isolated molecule') |
|
136 |
logger.info('Carrying out procedures for the isolated molecule.')
|
|
137 | 137 |
rd_mol = adapt_format('rdkit', inp_vars['molec_file']) |
138 | 138 |
confs = gen_confs(rd_mol, inp_vars['num_conformers']) |
139 | 139 |
if inp_vars['min_confs']: |
b/modules/screening.py | ||
---|---|---|
32 | 32 |
if num_sel >= len(conf_list): |
33 | 33 |
logger.warning('Number of conformers per magnitude is equal or larger ' |
34 | 34 |
'than the total number of conformers. Using all ' |
35 |
f'available conformers: {len(conf_list)}') |
|
35 |
f'available conformers: {len(conf_list)}.')
|
|
36 | 36 |
return conf_list |
37 | 37 |
|
38 | 38 |
# Read properties |
... | ... | |
60 | 60 |
if sorted_list[i].info['idx'] not in selected_ids: |
61 | 61 |
selected_ids.append(sorted_list[i].info['idx']) |
62 | 62 |
|
63 |
logger.info(f'Selected {len(selected_ids)} conformers for adsorption') |
|
63 |
logger.info(f'Selected {len(selected_ids)} conformers for adsorption.')
|
|
64 | 64 |
return [conf_list[idx] for idx in selected_ids] |
65 | 65 |
|
66 | 66 |
|
... | ... | |
389 | 389 |
raise ValueError(err) |
390 | 390 |
|
391 | 391 |
conf_list = read_coords(inp_vars['code'], 'isolated', 'ase') |
392 |
logger.info(f"Found {len(conf_list)} structures of isolated conformers") |
|
392 |
logger.info(f"Found {len(conf_list)} structures of isolated conformers.")
|
|
393 | 393 |
selected_confs = select_confs(conf_list, inp_vars['select_magns'], |
394 | 394 |
inp_vars['confs_per_magn'], |
395 | 395 |
inp_vars['code']) |
... | ... | |
403 | 403 |
inp_vars['min_coll_height'], |
404 | 404 |
inp_vars['collision_threshold']) |
405 | 405 |
logger.info(f'Generated {len(surf_ads_list)} adsorbate-surface atomic ' |
406 |
f'configurations of the on which to carry out a calculation')
|
|
406 |
f'configurations, to carry out a calculation of.')
|
|
407 | 407 |
run_calc('screening', inp_vars, surf_ads_list) |
b/modules/utilities.py | ||
---|---|---|
39 | 39 |
if bak_num > 0: |
40 | 40 |
os.rename(file_name, new_name) |
41 | 41 |
logger.warning(f"'{file_name}' already present. Backed it up to " |
42 |
f"{new_name}") |
|
42 |
f"{new_name}.")
|
|
43 | 43 |
|
44 | 44 |
|
45 | 45 |
def try_command(command, expct_error_types: list, *args, **kwargs): |
b/tests/test_dos_input.py | ||
---|---|---|
96 | 96 |
self.assertEqual(get_molec_file(), 'acetic.xyz') |
97 | 97 |
|
98 | 98 |
def test_cluster_magns(self): |
99 |
self.assertEqual(get_cluster_magns(), ['energy', 'moi'])
|
|
99 |
self.assertEqual(get_select_magns(), ['energy', 'moi'])
|
|
100 | 100 |
|
101 | 101 |
def test_num_conformers(self): |
102 | 102 |
self.assertEqual(get_num_conformers(), 100) |
... | ... | |
169 | 169 |
self.assertRaises(FileNotFoundError, get_isol_inp_file) |
170 | 170 |
|
171 | 171 |
def test_cluster_magns(self): |
172 |
self.assertRaises(ValueError, get_cluster_magns)
|
|
172 |
self.assertRaises(ValueError, get_select_magns)
|
|
173 | 173 |
|
174 | 174 |
def test_num_conformers(self): |
175 | 175 |
self.assertRaises(ValueError, get_num_conformers) |
Formats disponibles : Unified diff