Skip to content
Snippets Groups Projects
Commit 7a862108 authored by Cyril Danilevski's avatar Cyril Danilevski :scooter:
Browse files

Silently retrieve the creation date from directory

If the information isn't available neither from MyMDC nor from the dataset, as might be the case for data prior to 2020, then the directory's creation date is used automatically
parent 985362db
No related branches found
No related tags found
1 merge request!364Sanitize cal_tools.tools.get_creation_date
This commit is part of merge request !364. Comments created here will be created in the context of that merge request.
...@@ -231,19 +231,18 @@ def get_run_info(proposal, run): ...@@ -231,19 +231,18 @@ def get_run_info(proposal, run):
def get_dir_creation_date(directory: str, run: int, def get_dir_creation_date(directory: str, run: int,
use_dir: Optional[bool] = False,
verbosity: Optional[int] = 0) -> datetime.datetime: verbosity: Optional[int] = 0) -> datetime.datetime:
""" """
Return run start time from MyDC. Return run start time from MyDC.
If not available from MyMDC, retrieve the data from the dataset's metadata If not available from MyMDC, retrieve the data from the dataset's metadata
in [directory]/[run], or from the folder on disk if `use_dir` is set. in [directory]/[run] or, if the dataset is older than 2020, from the
directory's creation time.
If the files are not available, this function will raise a ValueError. If the data is not available from either source, this function will raise a
ValueError.
:param directory: path to directory which contains runs :param directory: path to directory which contains runs
:param run: run number :param run: run number
:param use_dir: get the creation time from the directory, needed for older
datasets.
:param verbosity: Level of verbosity (0 - silent) :param verbosity: Level of verbosity (0 - silent)
:return: (datetime) modification time :return: (datetime) modification time
...@@ -265,8 +264,6 @@ def get_dir_creation_date(directory: str, run: int, ...@@ -265,8 +264,6 @@ def get_dir_creation_date(directory: str, run: int,
ntries = 100 ntries = 100
while ntries > 0: while ntries > 0:
try: try:
if use_dir:
return datetime.datetime.fromtimestamp(directory.stat().st_ctime) # noqa
dates = [] dates = []
for f in directory.glob('*.h5'): for f in directory.glob('*.h5'):
with h5py.File(f, 'r') as fin: with h5py.File(f, 'r') as fin:
...@@ -274,13 +271,10 @@ def get_dir_creation_date(directory: str, run: int, ...@@ -274,13 +271,10 @@ def get_dir_creation_date(directory: str, run: int,
cdate = datetime.datetime.strptime(cdate, "%Y%m%dT%H%M%SZ") cdate = datetime.datetime.strptime(cdate, "%Y%m%dT%H%M%SZ")
dates.append(cdate) dates.append(cdate)
return min(dates) return min(dates)
except (IOError, ValueError): except (IOError, ValueError):
ntries -= 1 ntries -= 1
except KeyError: except KeyError: # The files are here, but it's an older dataset
msg = ("It seems that you're working on old data. Try setting " return datetime.datetime.fromtimestamp(directory.stat().st_ctime)
"`use_dir=True` to get file creation date")
raise ValueError(msg) from None
msg = 'Could not get the creation time from the directory' msg = 'Could not get the creation time from the directory'
raise ValueError(msg, directory) raise ValueError(msg, directory)
......
...@@ -6,7 +6,7 @@ from cal_tools.tools import get_dir_creation_date ...@@ -6,7 +6,7 @@ from cal_tools.tools import get_dir_creation_date
def test_dir_creation_date(): def test_dir_creation_date():
folder = "/gpfs/exfel/exp/DETLAB/202031/p900172/raw" folder = '/gpfs/exfel/exp/DETLAB/202031/p900172/raw'
date = get_dir_creation_date(folder, 10) date = get_dir_creation_date(folder, 10)
assert isinstance(date, datetime) assert isinstance(date, datetime)
...@@ -17,12 +17,8 @@ def test_dir_creation_date(): ...@@ -17,12 +17,8 @@ def test_dir_creation_date():
assert e.value.args[1] == Path(folder) / 'r0004' assert e.value.args[1] == Path(folder) / 'r0004'
# The following data predates the addition of creation_time in metadata # The following data predates the addition of creation_time in metadata
folder = "/gpfs/exfel/exp/SQS/201930/p900075/raw/" folder = '/gpfs/exfel/exp/SQS/201930/p900075/raw/'
with pytest.raises(ValueError) as e: date = get_dir_creation_date(folder, 365)
get_dir_creation_date(folder, 365)
assert "It seems that you're working on old data." in e.value.args[0]
date = get_dir_creation_date(folder, 365, use_dir=True)
assert isinstance(date, datetime) assert isinstance(date, datetime)
assert str(date) == '2019-07-04 11:02:41.280000' assert str(date) == '2019-07-04 11:02:41.280000'
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment