[utils] populating rePro

This commit is contained in:
Jan Grewe 2019-03-11 09:33:07 +01:00
parent ab6b6e0370
commit 4bb0cb5f9d
2 changed files with 89 additions and 4 deletions

View File

@ -3,7 +3,8 @@ import datajoint as dj
import nixio as nix import nixio as nix
import os import os
import glob import glob
from util import read_info_file, find_key_recursive, deep_get, read_dataset_info from util import read_info_file, find_key_recursive, deep_get, read_dataset_info, \
nix_metadata_to_yaml
from IPython import embed from IPython import embed
schema = dj.schema("fish_book", locals()) schema = dj.schema("fish_book", locals())
@ -162,6 +163,26 @@ class CellDatasetMap(dj.Manual):
""" """
@schema
class RePro(dj.Manual):
definition = """
repro_id : varchar(512)
run : smallint
-> Dataset
----
repro_name : varchar(512)
settings : varchar(3000)
"""
@staticmethod
def get_template_tuple(repro_id=None):
tup = dict(repro_id=None, dataset_id=None, run=0, repro_name="", settings="")
if repro_id is not None:
d = dict((RePro() & {"repro_id": repro_id}).fetch1())
return d
return tup
def populate_datasets(data_path): def populate_datasets(data_path):
print("Importing dataset %s" % data_path) print("Importing dataset %s" % data_path)
if not os.path.exists(data_path): if not os.path.exists(data_path):
@ -270,6 +291,32 @@ def populate_cells(data_path):
CellDatasetMap.insert1(mm, skip_duplicates=True) CellDatasetMap.insert1(mm, skip_duplicates=True)
def populate_repros(data_path):
print("Importing RePro(s) of %s" % data_path)
dset_name = os.path.split(data_path)[-1]
dataset = dict((Dataset & {"dataset_id": dset_name}).fetch1())
if dataset["has_nix"]:
print("scanning nix file")
nix_files = glob.glob(os.path.join(dataset["data_source"], "*.nix"))
for nf in nix_files:
f = nix.File.open(nf, nix.FileMode.ReadOnly)
b = f.blocks[0]
for t in b.tags:
if "relacs.repro_run" in t.type and "RePro-Info" in t.metadata.sections:
rp = RePro.get_template_tuple()
rp["run"] = t.metadata["RePro-Info"]["Run"]
rp["dataset_id"] = dataset["dataset_id"]
rp["repro_id"] = t.name
rp["repro_name"] = t.metadata["RePro-Info"]["RePro"]
rp["settings"] = nix_metadata_to_yaml(t.metadata.sections[0])
RePro.insert1(rp, skip_duplicates=True)
f.close()
f = None
else:
pass
def drop_tables(): def drop_tables():
Dataset.drop() Dataset.drop()
Subject.drop() Subject.drop()
@ -277,9 +324,10 @@ def drop_tables():
def populate(datasets): def populate(datasets):
for d in datasets: for d in datasets:
populate_datasets(d) #populate_datasets(d)
populate_subjects(d) #populate_subjects(d)
populate_cells(d) #populate_cells(d)
populate_repros(d)
if __name__ == "__main__": if __name__ == "__main__":

37
util.py
View File

@ -1,7 +1,9 @@
from functools import reduce from functools import reduce
import nixio as nix
import os import os
import glob import glob
import datetime as dt import datetime as dt
from IPython import embed
def read_info_file(file_name): def read_info_file(file_name):
@ -75,3 +77,38 @@ def read_dataset_info(info_file):
return exp, rec_date, quality, comment, has_nix 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_frequency_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))
f.close()