public release 2.2.0 - see README.md and CHANGES.md for details
This commit is contained in:
119
pmsco/files.py
119
pmsco/files.py
@@ -27,20 +27,20 @@ logger = logging.getLogger(__name__)
|
||||
#
|
||||
# each string of this set marks a category of files.
|
||||
#
|
||||
# @arg @c 'input' : raw input files for calculator, including cluster and atomic files in custom format
|
||||
# @arg @c 'output' : raw output files from calculator
|
||||
# @arg @c 'atomic' : atomic scattering (phase, emission) files in portable format
|
||||
# @arg @c 'cluster' : cluster files in portable XYZ format for report
|
||||
# @arg @c 'log' : log files
|
||||
# @arg @c 'debug' : debug files
|
||||
# @arg @c 'model': output files in ETPAI format: complete simulation (a_-1_-1_-1_-1)
|
||||
# @arg @c 'scan' : output files in ETPAI format: scan (a_b_-1_-1_-1)
|
||||
# @arg @c 'symmetry' : output files in ETPAI format: symmetry (a_b_c_-1_-1)
|
||||
# @arg @c 'emitter' : output files in ETPAI format: emitter (a_b_c_d_-1)
|
||||
# @arg @c 'region' : output files in ETPAI format: region (a_b_c_d_e)
|
||||
# @arg @c 'report': final report of results
|
||||
# @arg @c 'population': final state of particle population
|
||||
# @arg @c 'rfac': files related to models which give bad r-factors (dynamic category, see below).
|
||||
# @arg 'input' : raw input files for calculator, including cluster and atomic files in custom format
|
||||
# @arg 'output' : raw output files from calculator
|
||||
# @arg 'atomic' : atomic scattering (phase, emission) files in portable format
|
||||
# @arg 'cluster' : cluster files in portable XYZ format for report
|
||||
# @arg 'log' : log files
|
||||
# @arg 'debug' : debug files
|
||||
# @arg 'model': output files in ETPAI format: complete simulation (a_-1_-1_-1_-1)
|
||||
# @arg 'scan' : output files in ETPAI format: scan (a_b_-1_-1_-1)
|
||||
# @arg 'domain' : output files in ETPAI format: domain (a_b_c_-1_-1)
|
||||
# @arg 'emitter' : output files in ETPAI format: emitter (a_b_c_d_-1)
|
||||
# @arg 'region' : output files in ETPAI format: region (a_b_c_d_e)
|
||||
# @arg 'report': final report of results
|
||||
# @arg 'population': final state of particle population
|
||||
# @arg 'rfac': files related to models which give bad r-factors (dynamic category, see below).
|
||||
#
|
||||
# @note @c 'rfac' is a dynamic category not connected to a particular file or content type.
|
||||
# no file should be marked @c 'rfac'.
|
||||
@@ -48,7 +48,7 @@ logger = logging.getLogger(__name__)
|
||||
# if so, all files related to bad models are deleted, regardless of their static category.
|
||||
#
|
||||
FILE_CATEGORIES = {'cluster', 'atomic', 'input', 'output',
|
||||
'report', 'region', 'emitter', 'scan', 'symmetry', 'model',
|
||||
'report', 'region', 'emitter', 'scan', 'domain', 'model',
|
||||
'log', 'debug', 'population', 'rfac'}
|
||||
|
||||
## @var FILE_CATEGORIES_TO_KEEP
|
||||
@@ -242,37 +242,52 @@ class FileTracker(object):
|
||||
else:
|
||||
self._complete_models.discard(model)
|
||||
|
||||
def delete_files(self, categories=None):
|
||||
def delete_files(self, categories=None, incomplete_models=False):
|
||||
"""
|
||||
delete the files matching the list of categories.
|
||||
delete all files matching a set of categories.
|
||||
|
||||
@version this method does not act on the 'rfac' category.
|
||||
this function deletes all files that are tagged with one of the given categories.
|
||||
tags are set by the code sections that create the files.
|
||||
for a list of common categories, see FILE_CATEGORIES.
|
||||
the categories can be given as an argument or taken from the categories_to_delete property.
|
||||
|
||||
files are deleted regardless of R-factor.
|
||||
be sure to specify only categories that you don't need in the output at all.
|
||||
|
||||
by default, only files of complete models (cf. set_model_complete()) are deleted
|
||||
to avoid interference with running calculations.
|
||||
to clean up after calculations, the incomplete_models argument can override this.
|
||||
|
||||
@note this method does not act on the special 'rfac' category (see delete_bad_rfac()).
|
||||
|
||||
@param categories: set of file categories to delete.
|
||||
defaults to self.categories_to_delete.
|
||||
if the argument is None, it defaults to the categories_to_delete property.
|
||||
|
||||
@param incomplete_models: (bool) delete files of incomplete models as well.
|
||||
by default (False), incomplete models are not deleted.
|
||||
|
||||
@return: None
|
||||
"""
|
||||
if categories is None:
|
||||
categories = self.categories_to_delete
|
||||
for cat in categories:
|
||||
self.delete_category(cat)
|
||||
self.delete_category(cat, incomplete_models=incomplete_models)
|
||||
|
||||
def delete_bad_rfac(self, keep=0, force_delete=False):
|
||||
"""
|
||||
delete the files of all models except a specified number of good models.
|
||||
delete all files of all models except for a specified number of best ranking models.
|
||||
|
||||
the method first determines which models to keep.
|
||||
models with R factor values of 0.0, without a specified R-factor, and
|
||||
the specified number of best ranking non-zero models are kept.
|
||||
the files belonging to the keeper models are kept, all others are deleted,
|
||||
regardless of category.
|
||||
files of incomplete models are also kept.
|
||||
in addition, incomplete models, models with R factor = 0.0,
|
||||
and those without a specified R-factor are kept.
|
||||
all other files are deleted.
|
||||
the method does not consider the file category.
|
||||
|
||||
the files are deleted from the list and the file system.
|
||||
|
||||
files are deleted only if 'rfac' is specified in self.categories_to_delete
|
||||
or if force_delete is set to True.
|
||||
the method executes only if 'rfac' is specified in self.categories_to_delete
|
||||
or if force_delete is True.
|
||||
otherwise the method does nothing.
|
||||
|
||||
@param keep: number of files to keep.
|
||||
@@ -330,18 +345,32 @@ class FileTracker(object):
|
||||
|
||||
return len(del_models)
|
||||
|
||||
def delete_category(self, category):
|
||||
def delete_category(self, category, incomplete_models=False):
|
||||
"""
|
||||
delete all files of a specified category from the list and the file system.
|
||||
|
||||
only files of complete models (cf. set_model_complete()) are deleted, but regardless of R-factor.
|
||||
this function deletes all files that are tagged with the given category.
|
||||
tags are set by the code sections that create the files.
|
||||
for a list of common categories, see FILE_CATEGORIES.
|
||||
|
||||
files are deleted regardless of R-factor.
|
||||
be sure to specify only categories that you don't need in the output at all.
|
||||
|
||||
by default, only files of complete models (cf. set_model_complete()) are deleted
|
||||
to avoid interference with running calculations.
|
||||
to clean up after calculations, the incomplete_models argument can override this.
|
||||
|
||||
@param category: (str) category.
|
||||
should be one of FILE_CATEGORIES. otherwise, the function has no effect.
|
||||
|
||||
@param incomplete_models: (bool) delete files of incomplete models as well.
|
||||
by default (False), incomplete models are not deleted.
|
||||
|
||||
@return: None
|
||||
"""
|
||||
del_names = {name for (name, cat) in self._file_category.items() if cat == category}
|
||||
del_names &= {name for (name, model) in self._file_model.items() if model in self._complete_models}
|
||||
if not incomplete_models:
|
||||
del_names &= {name for (name, model) in self._file_model.items() if model in self._complete_models}
|
||||
for name in del_names:
|
||||
self.delete_file(name)
|
||||
|
||||
@@ -375,3 +404,33 @@ class FileTracker(object):
|
||||
logger.warning("file system error deleting file {0}".format(path))
|
||||
else:
|
||||
logger.debug("delete file {0} ({1}, model {2})".format(path, cat, model))
|
||||
|
||||
|
||||
def list_files_other_models(prefix, models):
|
||||
"""
|
||||
list input/output files except those of the given models.
|
||||
|
||||
this can be used to clean up all files except those belonging to the given models.
|
||||
|
||||
to delete the listed files:
|
||||
|
||||
for f in files:
|
||||
os.remove(f)
|
||||
|
||||
@param prefix: file name prefix up to the first underscore.
|
||||
only files starting with this prefix are listed.
|
||||
|
||||
@param models: sequence or set of model numbers that should not be listed.
|
||||
|
||||
@return: set of file names
|
||||
"""
|
||||
file_names = set([])
|
||||
for entry in os.scandir():
|
||||
if entry.is_file:
|
||||
elements = entry.name.split('_')
|
||||
try:
|
||||
if len(elements) == 6 and elements[0] == prefix and int(elements[1]) not in models:
|
||||
file_names.add(entry.name)
|
||||
except (IndexError, ValueError):
|
||||
pass
|
||||
return file_names
|
||||
|
||||
Reference in New Issue
Block a user