Source code for pymatgen.analysis.chemenv.utils.chemenv_config
# coding: utf-8
# Copyright (c) Pymatgen Development Team.
# Distributed under the terms of the MIT License.
from pymatgen.analysis.chemenv.utils.scripts_utils import strategies_class_lookup
from os.path import expanduser, exists
from os import makedirs
import json
from pymatgen import SETTINGS
"""
This module contains the classes for configuration of the chemenv package.
"""
__author__ = "David Waroquiers"
__copyright__ = "Copyright 2012, The Materials Project"
__credits__ = "Geoffroy Hautier"
__version__ = "2.0"
__maintainer__ = "David Waroquiers"
__email__ = "david.waroquiers@gmail.com"
__date__ = "Feb 20, 2016"
[docs]class ChemEnvConfig():
"""
Class used to store the configuration of the chemenv package :
- Materials project access
- ICSD database access
- Default options (strategies, ...)
"""
DEFAULT_PACKAGE_OPTIONS = {
'default_strategy': {
'strategy': 'SimplestChemenvStrategy',
'strategy_options': {
'distance_cutoff': strategies_class_lookup['SimplestChemenvStrategy'].DEFAULT_DISTANCE_CUTOFF,
'angle_cutoff': strategies_class_lookup['SimplestChemenvStrategy'].DEFAULT_ANGLE_CUTOFF,
'additional_condition': strategies_class_lookup['SimplestChemenvStrategy'].DEFAULT_ADDITIONAL_CONDITION,
'continuous_symmetry_measure_cutoff':
strategies_class_lookup['SimplestChemenvStrategy'].DEFAULT_CONTINUOUS_SYMMETRY_MEASURE_CUTOFF}},
'default_max_distance_factor': 1.5
}
def __init__(self, package_options=None):
if SETTINGS.get("PMG_MAPI_KEY", "") != "":
self.materials_project_configuration = SETTINGS.get("PMG_MAPI_KEY", "")
else:
self.materials_project_configuration = None
if package_options is None:
self.package_options = self.DEFAULT_PACKAGE_OPTIONS
else:
self.package_options = package_options
[docs] def setup(self):
while True:
print('\n=> Configuration of the ChemEnv package <=')
print('Current configuration :')
if self.has_materials_project_access:
print(' - Access to materials project is configured (add test ?)')
else:
print(' - No access to materials project')
print(' - Package options :')
for key, val in self.package_options.items():
print(' {} : {}'.format(str(key), str(val)))
print('\nChoose in the following :')
print(' <1> + <ENTER> : configuration of the package options (strategy, ...)')
print(' <q> + <ENTER> : quit without saving configuration')
test = input(' <S> + <ENTER> : save configuration and quit\n ... ')
if test == '1':
self.setup_package_options()
elif test == 'q':
break
elif test == 'S':
config_file = self.save()
break
else:
print(' ... wrong key, try again ...')
print('')
if test == 'S':
print('Configuration has been saved to file "{}"'.format(config_file))
@property
def has_materials_project_access(self):
return self.materials_project_configuration is not None
[docs] def setup_package_options(self):
self.package_options = self.DEFAULT_PACKAGE_OPTIONS
print('Choose between the following strategies : ')
strategies = list(strategies_class_lookup.keys())
for istrategy, strategy in enumerate(strategies):
print(' <{}> : {}'.format(str(istrategy + 1), strategy))
test = input(' ... ')
self.package_options['default_strategy'] = {'strategy': strategies[int(test) - 1], 'strategy_options': {}}
strategy_class = strategies_class_lookup[strategies[int(test) - 1]]
if len(strategy_class.STRATEGY_OPTIONS) > 0:
for option, option_dict in strategy_class.STRATEGY_OPTIONS.items():
while True:
print(' => Enter value for option "{}" '
'(<ENTER> for default = {})\n'.format(option,
str(option_dict['default'])))
print(' Valid options are :\n')
print(' {}'.format(option_dict['type'].allowed_values))
test = input(' Your choice : ')
if test == '':
self.package_options['default_strategy']['strategy_options'][option] = option_dict['type'](
strategy_class.STRATEGY_OPTIONS[option]['default'])
break
try:
self.package_options['default_strategy']['strategy_options'][option] = option_dict['type'](test)
break
except ValueError:
print('Wrong input for option {}'.format(option))
[docs] def package_options_description(self):
out = 'Package options :\n'
out += ' - Maximum distance factor : {:.4f}\n'.format(self.package_options['default_max_distance_factor'])
out += ' - Default strategy is "{}" :\n'.format(self.package_options['default_strategy']['strategy'])
strategy_class = strategies_class_lookup[self.package_options['default_strategy']['strategy']]
out += '{}\n'.format(strategy_class.STRATEGY_DESCRIPTION)
out += ' with options :\n'
for option, option_dict in strategy_class.STRATEGY_OPTIONS.items():
out += ' - {} : {}\n'.format(option,
self.package_options['default_strategy']['strategy_options'][option])
return out
[docs] def save(self, root_dir=None):
if root_dir is None:
home = expanduser("~")
root_dir = '{}/.chemenv'.format(home)
if not exists(root_dir):
makedirs(root_dir)
config_dict = {'package_options': self.package_options}
config_file = '{}/config.json'.format(root_dir)
if exists(config_file):
test = input('Overwrite existing configuration ? (<Y> + <ENTER> to confirm)')
if test != 'Y':
print('Configuration not saved')
return config_file
f = open(config_file, 'w')
json.dump(config_dict, f)
f.close()
print('Configuration saved')
return config_file
[docs] @classmethod
def auto_load(cls, root_dir=None):
if root_dir is None:
home = expanduser("~")
root_dir = '{}/.chemenv'.format(home)
config_file = '{}/config.json'.format(root_dir)
try:
f = open(config_file, 'r')
config_dict = json.load(f)
f.close()
return ChemEnvConfig(package_options=config_dict['package_options'])
except IOError:
print('Unable to load configuration from file "{}" ...'.format(config_file))
print(' ... loading default configuration')
return ChemEnvConfig()