Packaging Script Example
Here is an example of how you could use this library and it’s functions to build an NWB
1from simply_nwb.transforms import labjack_load_file, mp4_read_data
2from simply_nwb import SimpleNWB
3from simply_nwb.transforms import plaintext_metadata_read
4from pynwb.file import Subject
5import pendulum
6import pickle
7import os
8
9# Simply-NWB Package Documentation
10# https://simply-nwb.readthedocs.io/en/latest/index.html
11
12
13# Constants at the top of the file for things you might want to change for
14# different NWBs for flexibility
15INSTITUTION: str = "InstitutionHere"
16
17EXPERIMENTERS: [str] = [
18 "Lastname, Firstname"
19]
20LAB: str = "LabNameHere"
21
22EXPERIMENT_DESCRIPTION: str = "Long description of experiment goes here"
23EXPERIMENT_KEYWORDS: [str] = ["mouse"]
24EXPERIMENT_RELATED_PUBLICATIONS = None # optional
25
26SESSION_IDENTIFIER: str = "session1"
27SESSION_DESCRIPTION: str = "sess desc"
28SUBJECT: Subject = Subject(
29 subject_id="mouse1",
30 age="P90D", # ISO-8601 90 days
31 strain="TypeOfMouse", # if unknown, put Wild Strain
32 description="Mouse desc goes here",
33 sex="M"
34)
35
36SESSION_ROOT: str = "../data/mouse1"
37METADATA_FILENAME: str = "metadata.txt"
38
39LABJACK_FILENAME: str = "labjack/lick1OKRvartest40-4-14-23/data_0.dat"
40LABJACK_NAME: str = "Labjack Data"
41LABJACK_SAMPLING_RATE: float = 20.0 # in Hz
42LABJACK_DESCRIPTION: str = "labjack description here"
43LABJACK_COMMENTS: str = "labjack comments here"
44
45MP4_FILES: {str: str} = {
46 "RightEye": "movies/righteye.mp4",
47 "LeftEye": "movies/lefteye.mp4"
48}
49MP4_DESCRIPTION: str = "description of mp4 files here"
50MP4_SAMPLING_RATE: float = 120.0
51
52PICKLE_FILENAME: str = "pickledata.pkl"
53PICKLE_DATA_NAME_PREFIX: str = "data"
54PICKLE_DATA_DESCRIPTION: str = "desc of data here"
55
56
57def main():
58 # Parse out the metadata.txt file
59 metadata = plaintext_metadata_read(os.path.join(SESSION_ROOT, METADATA_FILENAME))
60 start_date = pendulum.parse(metadata["Date"], tz="local")
61
62 # Create the NWB object
63 nwbfile = SimpleNWB.create_nwb(
64 session_description=SESSION_DESCRIPTION,
65 session_start_time=start_date,
66 experimenter=EXPERIMENTERS,
67 lab=LAB,
68 experiment_description=EXPERIMENT_DESCRIPTION,
69 session_id=SESSION_IDENTIFIER,
70 institution=INSTITUTION,
71 keywords=EXPERIMENT_KEYWORDS,
72 related_publications=EXPERIMENT_RELATED_PUBLICATIONS
73 )
74
75 # Add labjack data to NWB
76 labjack_filename_absolute = os.path.join(SESSION_ROOT, LABJACK_FILENAME)
77 labjack_data = labjack_load_file(labjack_filename_absolute)
78
79 SimpleNWB.labjack_file_as_behavioral_data(
80 nwbfile,
81 labjack_filename=labjack_filename_absolute,
82 name=LABJACK_NAME,
83 measured_unit_list=["unit for columns, Time", "v0", "v1", "v2", "v3", "y0", "y1", "y2", "y3"],
84 start_time=pendulum.parse(labjack_data["date"]),
85 sampling_rate=LABJACK_SAMPLING_RATE,
86 description=LABJACK_DESCRIPTION,
87 comments=LABJACK_COMMENTS
88 )
89
90 # Add pickle data to NWB
91 pickle_file_obj = open(os.path.join(SESSION_ROOT, PICKLE_FILENAME), "rb")
92 pickle_data = pickle.load(pickle_file_obj)
93 SimpleNWB.processing_add_dict(
94 nwbfile,
95 processed_name=PICKLE_DATA_NAME_PREFIX,
96 processed_description=PICKLE_DATA_DESCRIPTION,
97 data_dict=pickle_data,
98 uneven_columns=True
99 )
100
101 # Access the data like this: (where missingDataMask is part of the pickle file)
102 # nwb.processing["misc"]["NAMEHERE_missingDataMask"]["missingDataMask"].data[0]["left"]
103 # nwb.processing["misc"]["NAMEHERE_eyePositionUncorrected"]["eyePositionUncorrected"].data[:]
104
105 # Add mp4 data to NWB
106 for mp4_name, mp4_filename in MP4_FILES.items():
107 data, frames = mp4_read_data(os.path.join(SESSION_ROOT, mp4_filename))
108 SimpleNWB.mp4_add_as_behavioral(
109 nwbfile,
110 name=mp4_name,
111 numpy_data=data,
112 frame_count=frames,
113 sampling_rate=MP4_SAMPLING_RATE,
114 description=MP4_DESCRIPTION
115 )
116
117 now = pendulum.now()
118 SimpleNWB.write(nwbfile, "nwb-{}-{}_{}".format(now.month, now.day, now.hour))
119
120
121if __name__ == "__main__":
122 main()