116 lines
3.5 KiB
Python
116 lines
3.5 KiB
Python
from functools import reduce
|
|
import nixio as nix
|
|
import os
|
|
import glob
|
|
import datetime as dt
|
|
from IPython import embed
|
|
|
|
|
|
def read_info_file(file_name):
|
|
"""
|
|
Reads the info file and returns the stored metadata in a dictionary. The dictionary may be nested.
|
|
@param file_name: The name of the info file.
|
|
@return: dictionary, the stored information.
|
|
"""
|
|
root = {}
|
|
with open(file_name, 'r') as f:
|
|
lines = f.readlines()
|
|
for l in lines:
|
|
if not l.startswith("#"):
|
|
continue
|
|
l = l.strip("#").strip()
|
|
if len(l) == 0:
|
|
continue
|
|
if not ": " in l: # subsection
|
|
sec = {}
|
|
root[l[:-1] if l.endswith(":") else l] = sec
|
|
else:
|
|
parts = l.split(': ')
|
|
sec[parts[0].strip()] = parts[1].strip('"').strip()
|
|
return root
|
|
|
|
|
|
def find_key_recursive(dictionary, key, path=[]):
|
|
assert(isinstance(dictionary, dict))
|
|
if key in dictionary.keys():
|
|
path.append(key)
|
|
return True
|
|
for k in dictionary.keys():
|
|
if isinstance(dictionary[k], dict):
|
|
if find_key_recursive(dictionary[k], key, path):
|
|
path.insert(-1, k)
|
|
break
|
|
return len(path) > 0
|
|
|
|
|
|
def deep_get(dictionary, keys, default=None):
|
|
assert(isinstance(dictionary, dict))
|
|
assert(isinstance(keys, list))
|
|
return reduce(lambda d, key: d.get(key, default) if isinstance(d, dict) else default, keys, dictionary)
|
|
|
|
|
|
def read_dataset_info(info_file):
|
|
exp = ""
|
|
quality = ""
|
|
comment = ""
|
|
rec_date = None
|
|
has_nix = False
|
|
if not os.path.exists(info_file):
|
|
return exp, rec_date, quality, comment, has_nix
|
|
has_nix = len(glob.glob(os.path.sep.join(info_file.split(os.path.sep)[:-1]) + os.path.sep + "*.nix")) > 0
|
|
info = read_info_file(info_file)
|
|
p = []
|
|
find_key_recursive(info, "Experimenter", p)
|
|
if len(p) > 0:
|
|
exp = deep_get(info, p)
|
|
p = []
|
|
find_key_recursive(info, "Date", p)
|
|
if len(p) > 0:
|
|
rec_date = dt.date.fromisoformat(deep_get(info, p))
|
|
p = []
|
|
find_key_recursive(info, "Recording quality", p)
|
|
if len(p) > 0:
|
|
quality = deep_get(info, p)
|
|
find_key_recursive(info, "Comment", p)
|
|
if len(p) > 0:
|
|
comment = deep_get(info, p, default="")
|
|
|
|
return exp, rec_date, quality, comment, has_nix
|
|
|
|
|
|
def nix_metadata_to_dict(section):
|
|
info = {}
|
|
for p in section.props:
|
|
info[p.name] = [v.value for v in p.values]
|
|
for s in section.sections:
|
|
info[s.name] = nix_metadata_to_dict(s)
|
|
return info
|
|
|
|
|
|
def nix_metadata_to_yaml(section, cur_depth=0, val_count=1):
|
|
assert(isinstance(section, nix.section.SectionMixin))
|
|
yaml = "%s%s:\n" % ("\t" * cur_depth, section.name)
|
|
for p in section.props:
|
|
val_str = ""
|
|
if val_count > 1 and len(p.values) > 1:
|
|
val_str = "[" + ', '.join([v.to_string() for v in p.values]) + "]"
|
|
elif len(p.values) == 1:
|
|
val_str = p.values[0].to_string()
|
|
yaml += "%s%s: %s\n" % ("\t" * (cur_depth+1), p.name, val_str)
|
|
for s in section.sections:
|
|
yaml += nix_metadata_to_yaml(s, cur_depth+1)
|
|
return yaml
|
|
|
|
|
|
if __name__ == "__main__":
|
|
nix_file = "../../science/high_freq_chirps/data/2018-11-09-aa-invivo-1/2018-11-09-aa-invivo-1.nix"
|
|
f = nix.File.open(nix_file, nix.FileMode.ReadOnly)
|
|
b = f.blocks[0]
|
|
yml = nix_metadata_to_yaml(b.tags[0].metadata)
|
|
print(yml)
|
|
print("-"* 80)
|
|
print(nix_metadata_to_yaml(b.metadata))
|
|
embed()
|
|
f.close()
|
|
|