forked from jgrewe/fishbook
add database creation tool
This commit is contained in:
parent
8145e57c38
commit
358a84f435
100
database.py
Normal file
100
database.py
Normal file
@ -0,0 +1,100 @@
|
||||
import numpy as np
|
||||
import datajoint as dj
|
||||
import nixio as nix
|
||||
import os
|
||||
import glob
|
||||
from util import read_info_file, find_key_recursive, deep_get
|
||||
from IPython import embed
|
||||
import datetime as dt
|
||||
|
||||
data_dir = 'data'
|
||||
schema = dj.schema("fish_book", locals())
|
||||
|
||||
|
||||
@schema
|
||||
class Dataset(dj.Manual):
|
||||
definition = """ # Datasets
|
||||
dataset_id : varchar(256)
|
||||
----
|
||||
data_source : varchar(512) # path to the dataset
|
||||
experimenter : varchar(512)
|
||||
recording_date : date
|
||||
has_nix : bool
|
||||
"""
|
||||
|
||||
@staticmethod
|
||||
def get_template_tuple(id=None):
|
||||
if id is not None:
|
||||
d = dict((Dataset() & {"dataset_id": id}).fetch1())
|
||||
return d
|
||||
return dict(dataset_id=None, data_source="", experimenter="", recording_date=None, has_nix=False)
|
||||
|
||||
@staticmethod
|
||||
def get_nix_file(key):
|
||||
dset = (Dataset() & key).fetch1()
|
||||
if dset["ignore"]:
|
||||
return None
|
||||
file_path = os.path.join(dset["data_source"], dset["dataset_id"] + ".nix")
|
||||
if not (os.path.exists(file_path)):
|
||||
print("\t No nix file found for path: %s" % dset["data_source"])
|
||||
return None
|
||||
if not Dataset.check_file_integrity(file_path):
|
||||
return None
|
||||
return file_path
|
||||
|
||||
@staticmethod
|
||||
def check_file_integrity(nix_file):
|
||||
sane = True
|
||||
try:
|
||||
f = nix.File.open(nix_file, nix.FileMode.ReadOnly)
|
||||
b = f.blocks[0]
|
||||
m = b.metadata
|
||||
if "Recording" not in m.sections:
|
||||
Warning("\t Could not find Recording section in dataset: %s" % nix_file)
|
||||
sane = False
|
||||
f.close()
|
||||
except ():
|
||||
print("file: %s is NOT SANE!")
|
||||
sane = False
|
||||
return sane
|
||||
|
||||
|
||||
def read_info(info_file):
|
||||
if not os.path.exists(info_file):
|
||||
return None, None, False
|
||||
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))
|
||||
return exp, rec_date, has_nix
|
||||
|
||||
|
||||
def populate_datasets(data_path):
|
||||
print("Importing dataset %s" % data_path)
|
||||
if not os.path.exists(data_path):
|
||||
return
|
||||
dset_name = os.path.split(data_path)[-1]
|
||||
experimenter, rec_date, has_nix = read_info(os.path.join(data_path, 'info.dat'))
|
||||
if not experimenter:
|
||||
return
|
||||
|
||||
inserts = Dataset.get_template_tuple()
|
||||
inserts["dataset_id"] = dset_name
|
||||
inserts["data_source"] = data_path
|
||||
inserts["experimenter"] = experimenter
|
||||
inserts["recording_date"] = rec_date
|
||||
inserts["has_nix"] = has_nix
|
||||
|
||||
Dataset().insert1(inserts, skip_duplicates=True)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
datasets = glob.glob('/data/apteronotus/2018-05-08*')
|
||||
for d in datasets:
|
||||
populate_datasets(d)
|
Loading…
Reference in New Issue
Block a user