diff --git a/DataProcessingTools/levels.py b/DataProcessingTools/levels.py index 3e5e5da..1ad5197 100644 --- a/DataProcessingTools/levels.py +++ b/DataProcessingTools/levels.py @@ -3,18 +3,25 @@ import re levels = ['subjects', 'subject', 'day', 'session', 'array', 'channel','cell'] -level_patterns_s = ["*", "*", "[0-9]*", "session[0-9]*", "array[0-9]*", "channel[0-9]*", "cell[0-9]*"] +level_patterns_s = ["([a-zA-Z]+)", "([a-zA-Z]+)", "([0-9]+)", "(session)([a-z0-9]+)", "(array)([0-9]+)", "(channel)([0-9]+)", "(cell)([0-9]+)"] + def get_numbers(ss): return "".join(filter(str.isdigit, ss)) + +def get_id(ss): + ll = level(ss) + return ss.replace(ll, "") + + shortnames = {"subjects": lambda x: "", "subject": lambda x: x[0], "day": lambda x: x, - "session": lambda x: "s{0}".format(get_numbers(x)), - "array": lambda x: "a{0}".format(get_numbers(x)), - "channel": lambda x: "g{0}".format(get_numbers(x)), - "cell": lambda x: "c{0}".format(get_numbers(x))} + "session": lambda x: "s{0}".format(get_id(x)), + "array": lambda x: "a{0}".format(get_id(x)), + "channel": lambda x: "g{0}".format(get_id(x)), + "cell": lambda x: "c{0}".format(get_id(x))} def get_shortname(level, cwd =None): @@ -27,13 +34,17 @@ def level(cwd=None): """ Return the level corresponding to the folder `cwd`. """ - pp = cwd.split(os.sep)[-1] + leaf = cwd.split(os.sep)[-1] ll = '' - if pp.isdigit(): + if leaf.isdigit(): ll = 'day' else: - numstr = [str(i) for i in range(10)] - ll = pp.strip(''.join(numstr)) + for pattern in level_patterns_s[::-1]: + pp = re.compile(pattern) + m = pp.match(leaf) + if m is not None: + ll = m.groups()[0] + break return ll @@ -75,16 +86,17 @@ def get_level_dirs(target_level, cwd=None): dirs.append(os.path.join(dpath, _dnames)) dirs.sort() return dirs - if target_idx == this_idx: dirs = [os.path.join(cwd, ".")] elif target_idx < this_idx: rel_path = resolve_level(target_level, cwd) pattern = level_patterns_s[target_idx] + pattern = pattern.replace("(", "").replace(")", "").replace("+", "*") gpattern = os.path.join(cwd, rel_path, "..", pattern) dirs = sorted(glob.glob(gpattern)) else: patterns = level_patterns_s[this_idx+1:target_idx+1] + patterns = [pattern.replace("(", "").replace(")", "").replace("+", "*") for pattern in patterns] dirs = sorted(glob.glob(os.path.join(cwd, *patterns))) return dirs diff --git a/setup.py b/setup.py index 9dbaa85..90a6440 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ from setuptools import setup setup(name="DataProcessingTools", - version="0.11.0", + version="0.12.0", description="""Tools for processing data with hierarchical organization""", url="https://github.com/grero/DataProcessingTools.git", author="Roger Herikstad", diff --git a/tests/test_levels.py b/tests/test_levels.py index 9f0859c..1f60ac4 100644 --- a/tests/test_levels.py +++ b/tests/test_levels.py @@ -4,6 +4,9 @@ def test_level(): + ll = DPT.levels.level("sessioneye") + assert ll == "session" + cwd = "Pancake/20130923/session01/array02/channel033" ll = DPT.levels.level(cwd) assert ll == "channel" @@ -68,3 +71,8 @@ def test_shortnames(): npth = DPT.levels.normpath(pth) assert npth == "Pancake/20230923/session01" + aa = DPT.levels.get_shortname("session", "sessioneye") + assert aa == "seye" + + aa = DPT.levels.get_numbers("session01") + assert aa == "01"