def save(self, session_object): # Cannot type session_object due to a circular dependency # TODO fix circular dependency and add type session_metadata: BehaviorOphysMetadata = \ session_object.api.get_metadata() session_type = session_metadata.session_type nwbfile = NWBFile( session_description=session_type, identifier=str(session_object.ophys_experiment_id), session_start_time=session_metadata.date_of_acquisition, file_create_date=pytz.utc.localize(datetime.datetime.now()), institution="Allen Institute for Brain Science", keywords=[ "2-photon", "calcium imaging", "visual cortex", "behavior", "task" ], experiment_description=get_expt_description(session_type)) # Add stimulus_timestamps to NWB in-memory object: nwb.add_stimulus_timestamps(nwbfile, session_object.stimulus_timestamps) # Add running acquisition ('dx', 'v_sig', 'v_in') data to NWB # This data should be saved to NWB but not accessible directly from # Sessions nwb.add_running_acquisition_to_nwbfile( nwbfile, session_object.api.get_running_acquisition_df()) # Add running data to NWB in-memory object: nwb.add_running_speed_to_nwbfile(nwbfile, session_object.running_speed, name="speed", from_dataframe=True) nwb.add_running_speed_to_nwbfile(nwbfile, session_object.raw_running_speed, name="speed_unfiltered", from_dataframe=True) # Add stimulus template data to NWB in-memory object: # Use the semi-private _stimulus_templates attribute because it is # a StimulusTemplate object. The public stimulus_templates property # of the session_object returns a DataFrame. session_stimulus_templates = session_object._stimulus_templates self._add_stimulus_templates( nwbfile=nwbfile, stimulus_templates=session_stimulus_templates, stimulus_presentations=session_object.stimulus_presentations) # search for omitted rows and add stop_time before writing to NWB file set_omitted_stop_time( stimulus_table=session_object.stimulus_presentations) # Add stimulus presentations data to NWB in-memory object: nwb.add_stimulus_presentations(nwbfile, session_object.stimulus_presentations) # Add trials data to NWB in-memory object: nwb.add_trials(nwbfile, session_object.trials, TRIAL_COLUMN_DESCRIPTION_DICT) # Add licks data to NWB in-memory object: if len(session_object.licks) > 0: nwb.add_licks(nwbfile, session_object.licks) # Add rewards data to NWB in-memory object: if len(session_object.rewards) > 0: nwb.add_rewards(nwbfile, session_object.rewards) # Add max_projection image data to NWB in-memory object: nwb.add_max_projection(nwbfile, session_object.max_projection) # Add average_image image data to NWB in-memory object: nwb.add_average_image(nwbfile, session_object.average_projection) # Add segmentation_mask_image image data to NWB in-memory object: nwb.add_segmentation_mask_image(nwbfile, session_object.segmentation_mask_image) # Add metadata to NWB in-memory object: nwb.add_metadata(nwbfile, session_object.metadata, behavior_only=False) # Add task parameters to NWB in-memory object: nwb.add_task_parameters(nwbfile, session_object.task_parameters) # Add roi metrics to NWB in-memory object: nwb.add_cell_specimen_table(nwbfile, session_object.cell_specimen_table, session_object.metadata) # Add dff to NWB in-memory object: nwb.add_dff_traces(nwbfile, session_object.dff_traces, session_object.ophys_timestamps) # Add corrected_fluorescence to NWB in-memory object: nwb.add_corrected_fluorescence_traces( nwbfile, session_object.corrected_fluorescence_traces) # Add motion correction to NWB in-memory object: nwb.add_motion_correction(nwbfile, session_object.motion_correction) # Add eye tracking and rig geometry to NWB in-memory object # if eye_tracking data exists. if session_object.eye_tracking is not None: self.add_eye_tracking_data_to_nwb( nwbfile, session_object.eye_tracking, session_object.eye_tracking_rig_geometry) # Add events self.add_events(nwbfile=nwbfile, events=session_object.events) # Write the file: with NWBHDF5IO(self.path, 'w') as nwb_file_writer: nwb_file_writer.write(nwbfile) return nwbfile
def save(self, session_object): nwbfile = NWBFile( session_description=str(session_object.metadata['session_type']), identifier=str(session_object.ophys_experiment_id), session_start_time=session_object.metadata['experiment_datetime'], file_create_date=pytz.utc.localize(datetime.datetime.now()) ) # Add stimulus_timestamps to NWB in-memory object: nwb.add_stimulus_timestamps(nwbfile, session_object.stimulus_timestamps) # Add running data to NWB in-memory object: unit_dict = {'v_sig': 'V', 'v_in': 'V', 'speed': 'cm/s', 'timestamps': 's', 'dx': 'cm'} nwb.add_running_data_df_to_nwbfile(nwbfile, session_object.running_data_df, unit_dict) # Add stimulus template data to NWB in-memory object: for name, image_data in session_object.stimulus_templates.items(): nwb.add_stimulus_template(nwbfile, image_data, name) # Add index for this template to NWB in-memory object: nwb_template = nwbfile.stimulus_template[name] stimulus_index = session_object.stimulus_presentations[session_object.stimulus_presentations['image_set'] == nwb_template.name] nwb.add_stimulus_index(nwbfile, stimulus_index, nwb_template) # search for omitted rows and add stop_time before writing to NWB file set_omitted_stop_time(stimulus_table=session_object.stimulus_presentations) # Add stimulus presentations data to NWB in-memory object: nwb.add_stimulus_presentations(nwbfile, session_object.stimulus_presentations) # Add trials data to NWB in-memory object: nwb.add_trials(nwbfile, session_object.trials, TRIAL_COLUMN_DESCRIPTION_DICT) # Add licks data to NWB in-memory object: if len(session_object.licks) > 0: nwb.add_licks(nwbfile, session_object.licks) # Add rewards data to NWB in-memory object: if len(session_object.rewards) > 0: nwb.add_rewards(nwbfile, session_object.rewards) # Add max_projection image data to NWB in-memory object: nwb.add_max_projection(nwbfile, session_object.max_projection) # Add average_image image data to NWB in-memory object: nwb.add_average_image(nwbfile, session_object.average_projection) # Add segmentation_mask_image image data to NWB in-memory object: nwb.add_segmentation_mask_image(nwbfile, session_object.segmentation_mask_image) # Add metadata to NWB in-memory object: nwb.add_metadata(nwbfile, session_object.metadata) # Add task parameters to NWB in-memory object: nwb.add_task_parameters(nwbfile, session_object.task_parameters) # Add roi metrics to NWB in-memory object: nwb.add_cell_specimen_table(nwbfile, session_object.cell_specimen_table) # Add dff to NWB in-memory object: nwb.add_dff_traces(nwbfile, session_object.dff_traces, session_object.ophys_timestamps) # Add corrected_fluorescence to NWB in-memory object: nwb.add_corrected_fluorescence_traces(nwbfile, session_object.corrected_fluorescence_traces) # Add motion correction to NWB in-memory object: nwb.add_motion_correction(nwbfile, session_object.motion_correction) # Write the file: with NWBHDF5IO(self.path, 'w') as nwb_file_writer: nwb_file_writer.write(nwbfile) return nwbfile
def save(self, session_object): session_metadata: BehaviorMetadata = \ session_object.api.get_metadata() session_type = str(session_metadata.session_type) nwbfile = NWBFile( session_description=session_type, identifier=str(session_object.behavior_session_id), session_start_time=session_metadata.date_of_acquisition, file_create_date=pytz.utc.localize(datetime.datetime.now()), institution="Allen Institute for Brain Science", keywords=["visual", "behavior", "task"], experiment_description=get_expt_description(session_type)) # Add stimulus_timestamps to NWB in-memory object: nwb.add_stimulus_timestamps(nwbfile, session_object.stimulus_timestamps) # Add running acquisition ('dx', 'v_sig', 'v_in') data to NWB # This data should be saved to NWB but not accessible directly from # Sessions nwb.add_running_acquisition_to_nwbfile( nwbfile, session_object.api.get_running_acquisition_df()) # Add running data to NWB in-memory object: nwb.add_running_speed_to_nwbfile(nwbfile, session_object.running_speed, name="speed", from_dataframe=True) nwb.add_running_speed_to_nwbfile(nwbfile, session_object.raw_running_speed, name="speed_unfiltered", from_dataframe=True) # Add stimulus template data to NWB in-memory object: # Use the semi-private _stimulus_templates attribute because it is # a StimulusTemplate object. The public stimulus_templates property # of the session_object returns a DataFrame. session_stimulus_templates = session_object._stimulus_templates self._add_stimulus_templates( nwbfile=nwbfile, stimulus_templates=session_stimulus_templates, stimulus_presentations=session_object.stimulus_presentations) # search for omitted rows and add stop_time before writing to NWB file set_omitted_stop_time( stimulus_table=session_object.stimulus_presentations) # Add stimulus presentations data to NWB in-memory object: nwb.add_stimulus_presentations(nwbfile, session_object.stimulus_presentations) # Add trials data to NWB in-memory object: nwb.add_trials(nwbfile, session_object.trials, TRIAL_COLUMN_DESCRIPTION_DICT) # Add licks data to NWB in-memory object: if len(session_object.licks) > 0: nwb.add_licks(nwbfile, session_object.licks) # Add rewards data to NWB in-memory object: if len(session_object.rewards) > 0: nwb.add_rewards(nwbfile, session_object.rewards) # Add metadata to NWB in-memory object: nwb.add_metadata(nwbfile, session_object.metadata, behavior_only=True) # Add task parameters to NWB in-memory object: nwb.add_task_parameters(nwbfile, session_object.task_parameters) # Write the file: with NWBHDF5IO(self.path, 'w') as nwb_file_writer: nwb_file_writer.write(nwbfile) return nwbfile
def test_set_omitted_stop_time(stimulus_table, expected_table_data): stimulus_table = pd.DataFrame.from_dict(data=stimulus_table) expected_table = pd.DataFrame.from_dict(data=expected_table_data) nwb_utils.set_omitted_stop_time(stimulus_table) assert stimulus_table.equals(expected_table)