# ndx-fiber-photometry Extension for NWB
This is an NWB extension for storing fiber photometry recordings and associated metadata.
It replaces the deprecated [ndx-photometry](https://github.com/catalystneuro/ndx-photometry) extension.
## Neurodata Types
This extension provides neurodata types for documenting fiber photometry experiments, including excitation sources,
photodetectors, optical indicators, and fiber optics, as well as the fiber photometry response series.
### Device Specification Types (ndx-ophys-devices)
This extension depends on `ndx-ophys-devices`, which provides the foundational device types for specifying the physical hardware and biological components used in optical physiology experiments, which include but are not limited to fiber photometry.
These types follow a model-instance pattern where device models define specifications and device instances represent actual hardware with specific configurations.
#### ExcitationSource & ExcitationSourceModel
**ExcitationSourceModel**: Template specifications for light sources
- `source_type`: Type of light source (e.g., "laser", "LED")
- `excitation_mode`: Mode of excitation (e.g., "one-photon")
- `wavelength_range_in_nm`: Supported wavelength range [min, max]
**ExcitationSource**: Specific light source instance
- `power_in_W`: Maximum power output
- `intensity_in_W_per_m2`: Light intensity at the fiber tip
- `exposure_time_in_s`: Typical exposure duration
- Links to its corresponding `ExcitationSourceModel`
#### OpticalFiber & OpticalFiberModel
**OpticalFiberModel**: Template specifications for optical fibers
- `numerical_aperture`: Numerical aperture value
- `core_diameter_in_um`: Core diameter in micrometers
- `active_length_in_mm`: Active length for tapered fibers
- Ferrule specifications (name, model, diameter)
**OpticalFiber**: Specific fiber instance with implantation details
- `serial_number`: Unique identifier for this fiber
- `fiber_insertion`: Container with stereotactic coordinates and angles
- Links to its corresponding `OpticalFiberModel`
#### FiberInsertion
Detailed implantation information for optical fibers:
- Stereotactic coordinates (`insertion_position_ap_in_mm`, `insertion_position_ml_in_mm`, `insertion_position_dv_in_mm`)
- `depth_in_mm`: Insertion depth
- `position_reference`: Reference point for coordinates (e.g., "Bregma")
- `hemisphere`: Target hemisphere
- Insertion angles (`insertion_angle_pitch_in_deg`, `insertion_angle_yaw_in_deg`, `insertion_angle_roll_in_deg`)
#### ViralVector & ViralVectorInjection
**ViralVector**: Viral construct specifications
- `construct_name`: Name of the viral construct/vector
- `description`: Detailed description of the construct
- `manufacturer`: Source of the viral vector
- `titer_in_vg_per_ml`: Viral titer in genomes per mL
**ViralVectorInjection**: Injection procedure details
- Stereotactic coordinates and angles
- `volume_in_uL`: Volume injected
- `injection_date`: Date of injection procedure
- `location`: Target brain region
- `hemisphere`: Target hemisphere
- Links to the corresponding `ViralVector`
#### Indicator
Fluorescent indicator/reporter specifications:
- `label`: Name of the fluorescent indicator (e.g., "GCaMP6f", "Tdtomato")
- `description`: Detailed description of the indicator
- `viral_vector_injection`: Links to the `ViralVectorInjection` used to deliver this indicator
- Used to specify calcium indicators, voltage indicators, or other fluorescent reporters
#### Photodetector & PhotodetectorModel
**PhotodetectorModel**: Template specifications for photodetectors
- `detector_type`: Type of detector (e.g., "PMT", "photodiode", "CMOS")
- `wavelength_range_in_nm`: Detection wavelength range [min, max]
- `gain`: Base gain value for the detector
- `gain_unit`: Units for the gain measurement (e.g., "A/W")
**Photodetector**: Specific photodetector instance
- `serial_number`: Unique identifier for this detector
- `description`: Detailed description of the detector's role
- Links to its corresponding `PhotodetectorModel`
#### DichroicMirror & DichroicMirrorModel
**DichroicMirrorModel**: Template specifications for dichroic mirrors
- `cut_on_wavelength_in_nm`: Wavelength where transmission begins to increase
- `cut_off_wavelength_in_nm`: Wavelength where transmission begins to decrease
- `reflection_band_in_nm`: Wavelength range that is primarily reflected [min, max]
- `transmission_band_in_nm`: Wavelength range that is primarily transmitted [min, max]
- `angle_of_incidence_in_degrees`: Designed angle of incidence for the mirror
**DichroicMirror**: Specific dichroic mirror instance
- `serial_number`: Unique identifier for this mirror
- `description`: Detailed description of the mirror's role in the optical path
- Links to its corresponding `DichroicMirrorModel`
#### BandOpticalFilter & BandOpticalFilterModel
**BandOpticalFilterModel**: Template specifications for bandpass/bandstop filters
- `filter_type`: Type of filter (e.g., "Bandpass", "Bandstop")
- `center_wavelength_in_nm`: Center wavelength of the filter
- `bandwidth_in_nm`: Full width at half maximum (FWHM) bandwidth
- Typically used for emission or excitation filtering
**BandOpticalFilter**: Specific band filter instance
- `serial_number`: Unique identifier for this filter
- `description`: Detailed description of the filter's role
- Links to its corresponding `BandOpticalFilterModel`
#### EdgeOpticalFilter & EdgeOpticalFilterModel
**EdgeOpticalFilterModel**: Template specifications for edge filters
- `filter_type`: Type of edge filter (e.g., "Longpass", "Shortpass")
- `cut_wavelength_in_nm`: Wavelength at which the filter transitions
- `slope_in_percent_cut_wavelength`: Steepness of the transition as percentage of cut wavelength
- `slope_starting_transmission_in_percent`: Transmission percentage at start of transition
- `slope_ending_transmission_in_percent`: Transmission percentage at end of transition
**EdgeOpticalFilter**: Specific edge filter instance
- `serial_number`: Unique identifier for this filter
- `description`: Detailed description of the filter's role
- Links to its corresponding `EdgeOpticalFilterModel`
### Fiber Photometry Specific Types (ndx-fiber-photometry)
Beyond the foundational device types, this extension provides specific containers and data types for organizing fiber photometry experiments:
#### Container Types
**FiberPhotometryViruses**: Container for organizing viral vectors used in the experiment
- Holds a collection of `ViralVector` objects
- Provides centralized organization of all viral constructs used
**FiberPhotometryVirusInjections**: Container for organizing viral vector injections
- Holds a collection of `ViralVectorInjection` objects
- Provides centralized organization of all injection procedures
**FiberPhotometryIndicators**: Container for organizing fluorescent indicators
- Holds a collection of `Indicator` objects
- Links indicators to their corresponding viral vector injections
#### Data Types
**CommandedVoltageSeries**: Extends `TimeSeries`
- Stores commanded voltage values for controlling excitation sources
- `frequency`: Frequency of voltage commands
- `data`: Time series of voltage values
- `rate`: Sampling rate of the voltage commands
**FiberPhotometryResponseSeries**: Extends `TimeSeries`
- Stores recorded fiber photometry responses (fluorescence signals)
- `data`: Time series of fluorescence measurements [ntime, nfibers]
- `fiber_photometry_table_region`: Links to specific rows in the FiberPhotometryTable
- `rate`: Sampling rate of the fluorescence measurements
**FiberPhotometryTable**: Extends `DynamicTable`
- Central table organizing the experimental setup for each fiber
- Each row represents one fiber/channel with its associated devices:
- `location`: Target brain region
- `excitation_wavelength_in_nm`: Wavelength used for excitation
- `emission_wavelength_in_nm`: Wavelength of emitted fluorescence
- `indicator`: The fluorescent indicator used
- `optical_fiber`: The implanted optical fiber
- `excitation_source`: The light source for excitation
- `photodetector`: The detector for measuring fluorescence
- `dichroic_mirror`: Dichroic mirror in the optical path
- `emission_filter`: Filter for emission light (BandOpticalFilter or EdgeOpticalFilter)
- `commanded_voltage_series`: Voltage commands for this channel
- Supports creation of table regions for linking to response data
**FiberPhotometry**: Extends `LabMetaData`
- Top-level container for fiber photometry metadata
- Organizes all experiment-related information:
- `fiber_photometry_table`: The main setup table
- `fiber_photometry_viruses`: Container of viral vectors
- `fiber_photometry_virus_injections`: Container of injection procedures
- `fiber_photometry_indicators`: Container of indicators
## Installation
To install the latest stable release through PyPI,
```bash
pip install ndx-fiber-photometry
```
## Usage
```python
import datetime
import numpy as np
from pynwb import NWBFile, NWBHDF5IO
from ndx_ophys_devices import (
ViralVector,
ViralVectorInjection,
Indicator,
OpticalFiberModel,
FiberInsertion,
OpticalFiber,
ExcitationSourceModel,
ExcitationSource,
PhotodetectorModel,
Photodetector,
DichroicMirrorModel,
DichroicMirror,
BandOpticalFilterModel,
BandOpticalFilter,
EdgeOpticalFilterModel,
EdgeOpticalFilter,
)
from ndx_fiber_photometry import (
FiberPhotometryViruses,
FiberPhotometryVirusInjections,
FiberPhotometryIndicators,
FiberPhotometry,
FiberPhotometryTable,
FiberPhotometryResponseSeries,
CommandedVoltageSeries,
)
nwbfile = NWBFile(
session_description='session_description',
identifier='identifier',
session_start_time=datetime.datetime.now(datetime.timezone.utc)
)
viral_vector_green = ViralVector(
name="viral_vector_green",
description="AAV viral vector for the green indicator.",
construct_name="AAV-CaMKII-GCaMP6f",
manufacturer="Vector Manufacturer",
titer_in_vg_per_ml=1.0e12,
)
viral_vector_red = ViralVector(
name="viral_vector_red",
description="AAV viral vector for the red indicator.",
construct_name="AAV-CaMKII-Tdtomato",
manufacturer="Vector Manufacturer",
titer_in_vg_per_ml=1.0e12,
)
viruses = FiberPhotometryViruses(viral_vectors=[viral_vector_green, viral_vector_red])
viral_vector_injection_green = ViralVectorInjection(
name="viral_vector_injection_green",
description="Viral vector injection for fiber photometry.",
location="Ventral Tegmental Area (VTA)",
hemisphere="right",
reference="Bregma at the cortical surface",
ap_in_mm=3.0,
ml_in_mm=2.0,
dv_in_mm=1.0,
pitch_in_deg=0.0,
yaw_in_deg=0.0,
roll_in_deg=0.0,
stereotactic_rotation_in_deg=0.0,
stereotactic_tilt_in_deg=0.0,
volume_in_uL=0.45,
injection_date="1970-01-01T00:00:00+00:00",
viral_vector=viral_vector_green,
)
viral_vector_injection_red = ViralVectorInjection(
name="viral_vector_injection_red",
description="Viral vector injection for fiber photometry.",
location="Ventral Tegmental Area (VTA)",
hemisphere="right",
reference="Bregma at the cortical surface",
ap_in_mm=3.0,
ml_in_mm=2.0,
dv_in_mm=1.0,
pitch_in_deg=0.0,
yaw_in_deg=0.0,
roll_in_deg=0.0,
stereotactic_rotation_in_deg=0.0,
stereotactic_tilt_in_deg=0.0,
volume_in_uL=0.45,
injection_date="1970-01-01T00:00:00+00:00",
viral_vector=viral_vector_red,
)
virus_injections = FiberPhotometryVirusInjections(
viral_vector_injections=[viral_vector_injection_green, viral_vector_injection_red]
)
indicator_green = Indicator(
name="indicator_1",
description="Green indicator",
label="GCamp6f",
viral_vector_injection=viral_vector_injection_green,
)
indicator_red = Indicator(
name="indicator_2",
description="Red indicator",
label="Tdtomato",
viral_vector_injection=viral_vector_injection_red,
)
indicators = FiberPhotometryIndicators(indicators=[indicator_green, indicator_red])
optical_fiber_model = OpticalFiberModel(
name="optical_fiber_model",
manufacturer="Fiber Manufacturer",
model_number="OF-123",
description="Optical fiber model for optogenetics",
numerical_aperture=0.2,
core_diameter_in_um=400.0,
active_length_in_mm=2.0,
ferrule_name="cFCF - ∅2.5mm Ceramic Ferrule",
ferrule_model="SM-SC-CF-10-FM",
ferrule_diameter_in_mm=2.5,
)
fiber_insertion_1 = FiberInsertion(
name="fiber_insertion",
depth_in_mm=3.5,
insertion_position_ap_in_mm=3.0,
insertion_position_ml_in_mm=2.0,
insertion_position_dv_in_mm=1.0,
position_reference="bregma",
hemisphere="right",
insertion_angle_pitch_in_deg=10.0,
)
fiber_insertion_2 = FiberInsertion(
name="fiber_insertion",
depth_in_mm=3.5,
insertion_position_ap_in_mm=3.0,
insertion_position_ml_in_mm=-2.0,
insertion_position_dv_in_mm=1.0,
position_reference="bregma",
hemisphere="left",
insertion_angle_pitch_in_deg=10.0,
)
optical_fiber_1 = OpticalFiber(
name="optical_fiber_1",
description="Optical fiber for fiber photometry.",
serial_number="OF-SN-123456",
model=optical_fiber_model,
fiber_insertion=fiber_insertion_1,
)
optical_fiber_2 = OpticalFiber(
name="optical_fiber_2",
description="Optical fiber for fiber photometry.",
serial_number="OF-SN-654321",
model=optical_fiber_model,
fiber_insertion=fiber_insertion_2,
)
excitation_source_model = ExcitationSourceModel(
name="excitation_source_model",
manufacturer="Laser Manufacturer",
model_number="ES-123",
description="Excitation source model for fiber photometry.",
source_type="laser",
excitation_mode="one-photon",
wavelength_range_in_nm=[400.0, 800.0],
)
excitation_source_1 = ExcitationSource(
name="excitation_source_1",
description="Excitation source for green indicator",
serial_number="ES-SN-123456",
model=excitation_source_model,
power_in_W=0.7,
intensity_in_W_per_m2=0.005,
exposure_time_in_s=2.51e-13,
)
excitation_source_2 = ExcitationSource(
name="excitation_source_2",
description="Excitation source for red indicator",
serial_number="ES-SN-654321",
model=excitation_source_model,
power_in_W=0.7,
intensity_in_W_per_m2=0.005,
exposure_time_in_s=2.51e-13,
)
photodetector_model = PhotodetectorModel(
name="photodetector_model",
manufacturer="Detector Manufacturer",
model_number="PD-123",
description="Photodetector model for fiber photometry.",
detector_type="PMT",
wavelength_range_in_nm=[400.0, 800.0],
gain=100.0,
gain_unit="A/W",
)
photodetector_1 = Photodetector(
name="photodetector_1",
description="Photodetector for green emission.",
serial_number="PD-SN-123456",
model=photodetector_model,
)
photodetector_2 = Photodetector(
name="photodetector_2",
description="Photodetector for red emission.",
serial_number="PD-SN-654321",
model=photodetector_model,
)
dichroic_mirror_model_1 = DichroicMirrorModel(
name="dichroic_mirror_model_1",
manufacturer="Mirror Manufacturer",
model_number="DM-123",
description="Dichroic mirror model for green indicator.",
cut_on_wavelength_in_nm=470.0,
cut_off_wavelength_in_nm=500.0,
reflection_band_in_nm=[490.0, 520.0],
transmission_band_in_nm=[460.0, 480.0],
angle_of_incidence_in_degrees=45.0,
)
dichroic_mirror_model_2 = DichroicMirrorModel(
name="dichroic_mirror_model_2",
manufacturer="Mirror Manufacturer",
model_number="DM-456",
description="Dichroic mirror model for red indicator.",
cut_on_wavelength_in_nm=525.0,
cut_off_wavelength_in_nm=585.0,
reflection_band_in_nm=[575.0, 595.0],
transmission_band_in_nm=[515.0, 535.0],
angle_of_incidence_in_degrees=45.0,
)
dichroic_mirror_1 = DichroicMirror(
name="dichroic_mirror_1",
description="Dichroic mirror for green indicator",
serial_number="DM-SN-123456",
model=dichroic_mirror_model_1,
)
dichroic_mirror_2 = DichroicMirror(
name="dichroic_mirror_2",
description="Dichroic mirror for red indicator",
serial_number="DM-SN-654321",
model=dichroic_mirror_model_2,
)
band_optical_filter_model = BandOpticalFilterModel(
name="band_optical_filter_model",
manufacturer="Filter Manufacturer",
model_number="BOF-123",
description="Band optical filter model for green indicator",
filter_type="Bandpass",
center_wavelength_in_nm=505.0,
bandwidth_in_nm=30.0, # 505±15nm
)
band_optical_filter = BandOpticalFilter(
name="band_optical_filter",
description="Band optical filter for green indicator",
serial_number="BOF-SN-123456",
model=band_optical_filter_model,
)
edge_optical_filter_model = EdgeOpticalFilterModel(
name="edge_optical_filter_model",
manufacturer="Filter Manufacturer",
model_number="EOF-123",
description="Edge optical filter model for red indicator",
filter_type="Longpass",
cut_wavelength_in_nm=585.0,
slope_in_percent_cut_wavelength=1.0,
slope_starting_transmission_in_percent=10.0,
slope_ending_transmission_in_percent=80.0,
)
edge_optical_filter = EdgeOpticalFilter(
name="edge_optical_filter",
description="Edge optical filter for red indicator",
serial_number="EOF-SN-123456",
model=edge_optical_filter_model,
)
commanded_voltage_series_1 = CommandedVoltageSeries(
name="commanded_voltage_series_1", data=[1.0, 2.0, 3.0], frequency=30.0, rate=30.0, unit="volts"
)
commanded_voltage_series_2 = CommandedVoltageSeries(
name="commanded_voltage_series_2",
data=[4.0, 5.0, 6.0],
rate=30.0,
unit="volts",
)
fiber_photometry_table = FiberPhotometryTable(
name="fiber_photometry_table",
description="fiber photometry table",
)
fiber_photometry_table.add_row(
location="VTA",
excitation_wavelength_in_nm=480.0,
emission_wavelength_in_nm=525.0,
indicator=indicator_green,
optical_fiber=optical_fiber_1,
excitation_source=excitation_source_1,
commanded_voltage_series=commanded_voltage_series_1,
photodetector=photodetector_1,
dichroic_mirror=dichroic_mirror_1,
emission_filter=band_optical_filter,
)
fiber_photometry_table.add_row(
location="VTA",
excitation_wavelength_in_nm=580.0,
emission_wavelength_in_nm=610.0,
indicator=indicator_red,
optical_fiber=optical_fiber_2,
excitation_source=excitation_source_2,
commanded_voltage_series=commanded_voltage_series_2,
photodetector=photodetector_2,
dichroic_mirror=dichroic_mirror_2,
emission_filter=edge_optical_filter,
)
fiber_photometry_table_region = fiber_photometry_table.create_fiber_photometry_table_region(
region=[0], description="source fibers"
)
fiber_photometry_lab_meta_data = FiberPhotometry(
name="fiber_photometry",
fiber_photometry_table=fiber_photometry_table,
fiber_photometry_viruses=viruses,
fiber_photometry_virus_injections=virus_injections,
fiber_photometry_indicators=indicators,
)
fiber_photometry_response_series = FiberPhotometryResponseSeries(
name="fiber_photometry_response_series",
description="my roi response series",
data=np.random.randn(100, 1),
unit="n.a.",
rate=30.0,
fiber_photometry_table_region=fiber_photometry_table_region,
)
nwbfile.add_device_model(optical_fiber_model)
nwbfile.add_device(optical_fiber_1)
nwbfile.add_device(optical_fiber_2)
nwbfile.add_device_model(excitation_source_model)
nwbfile.add_device(excitation_source_1)
nwbfile.add_device(excitation_source_2)
nwbfile.add_device_model(photodetector_model)
nwbfile.add_device(photodetector_1)
nwbfile.add_device(photodetector_2)
nwbfile.add_device_model(dichroic_mirror_model_1)
nwbfile.add_device(dichroic_mirror_1)
nwbfile.add_device_model(dichroic_mirror_model_2)
nwbfile.add_device(dichroic_mirror_2)
nwbfile.add_device_model(band_optical_filter_model)
nwbfile.add_device(band_optical_filter)
nwbfile.add_device_model(edge_optical_filter_model)
nwbfile.add_device(edge_optical_filter)
nwbfile.add_acquisition(commanded_voltage_series_1)
nwbfile.add_acquisition(commanded_voltage_series_2)
nwbfile.add_lab_meta_data(fiber_photometry_lab_meta_data)
nwbfile.add_acquisition(fiber_photometry_response_series)
```
## Extension Diagram
```mermaid
%%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#ffffff', 'primaryBorderColor': '#144E73', 'lineColor': '#D96F32'}}}%%
classDiagram
direction LR
namespace ndx-fiber-photometry {
class FiberPhotometryResponseSeries {
<<TimeSeries>>
--------------------------------------
attributes
--------------------------------------
name : str
description : str
rate : float
starting_time : float
timestamps : array-like
unit : str
offset : float
conversion : float
--------------------------------------
datasets
--------------------------------------
data[ntime] | data[ntime, nfibers] : numeric
fiber_photometry_table_region : DynamicTableRegion
}
class CommandedVoltageSeries {
<<TimeSeries>>
--------------------------------------
attributes
--------------------------------------
name : str
description : str
rate : float
starting_time : float
timestamps : array-like
unit : str
offset : float
conversion : float
--------------------------------------
datasets
--------------------------------------
data[ntime] : float
frequency : float
}
class FiberPhotometry {
<<LabMetaData>>
--------------------------------------
attributes
--------------------------------------
name : str
--------------------------------------
groups
--------------------------------------
fiber_photometry_table : FiberPhotometryTable
fiber_photometry_viruses : FiberPhotometryViruses
fiber_photometry_virus_injections : FiberPhotometryVirusInjections
fiber_photometry_indicators : FiberPhotometryIndicators
}
class FiberPhotometryTable {
<<DynamicTable>>
--------------------------------------
attributes
--------------------------------------
name : str
description : str
--------------------------------------
columns
--------------------------------------
location : VectorData[str]
coordinates : VectorData[float[3]]
indicator : VectorData[Indicator]
notes : VectorData[str]
optical_fiber : VectorData[OpticalFiber]
excitation_source : VectorData[ExcitationSource]
commanded_voltage_series : VectorData[CommandedVoltageSeries]
photodetector : VectorData[Photodetector]
dichroic_mirror : VectorData[DichroicMirror]
emission_filter : VectorData[OpticalFilter]
excitation_filter : VectorData[OpticalFilter]
}
class FiberPhotometryViruses {
<<NWBContainer>>
--------------------------------------
groups
--------------------------------------
viral_vectors : ViralVector[]
}
class FiberPhotometryVirusInjections {
<<NWBContainer>>
--------------------------------------
groups
--------------------------------------
viral_vector_injections : ViralVectorInjection[]
}
class FiberPhotometryIndicators {
<<NWBContainer>>
--------------------------------------
groups
--------------------------------------
indicators : Indicator[]
}
}
namespace ndx-ophys-devices {
class OpticalFiberModel {
<<DeviceModel>>
--------------------------------------
attributes
--------------------------------------
numerical_aperture : float
core_diameter_in_um : float
active_length_in_mm : float
ferrule_name : str
ferrule_model : str
ferrule_diameter_in_mm : float
}
class FiberInsertion {
<<NWBContainer>>
--------------------------------------
attributes
--------------------------------------
insertion_position_ap_in_mm : float
insertion_position_ml_in_mm : float
insertion_position_dv_in_mm : float
depth_in_mm : float
position_reference : str
hemisphere : str
insertion_angle_yaw_in_deg : float
insertion_angle_pitch_in_deg : float
insertion_angle_roll_in_deg : float
}
class OpticalFiber {
<<DeviceInstance>>
--------------------------------------
attributes
--------------------------------------
serial_number : str
--------------------------------------
groups
--------------------------------------
fiber_insertion : FiberInsertion
--------------------------------------
links
--------------------------------------
model : OpticalFiberModel
}
class ExcitationSourceModel {
<<DeviceModel>>
--------------------------------------
attributes
--------------------------------------
source_type : str
excitation_mode : str
wavelength_range_in_nm : float[2]
}
class ExcitationSource {
<<DeviceInstance>>
--------------------------------------
attributes
--------------------------------------
serial_number : str
power_in_W : float
intensity_in_W_per_m2 : float
exposure_time_in_s : float
--------------------------------------
links
--------------------------------------
model : ExcitationSourceModel
}
class PhotodetectorModel {
<<DeviceModel>>
--------------------------------------
attributes
--------------------------------------
detector_type : str
wavelength_range_in_nm : float[2]
gain : float
gain_unit : str
}
class Photodetector {
<<DeviceInstance>>
--------------------------------------
attributes
--------------------------------------
serial_number : str
--------------------------------------
links
--------------------------------------
model : PhotodetectorModel
}
class DichroicMirrorModel {
<<DeviceModel>>
--------------------------------------
attributes
--------------------------------------
cut_on_wavelength_in_nm : float
cut_off_wavelength_in_nm : float
reflection_band_in_nm : float[2]
transmission_band_in_nm : float[2]
angle_of_incidence_in_degrees : float
}
class DichroicMirror {
<<DeviceInstance>>
--------------------------------------
attributes
--------------------------------------
serial_number : str
--------------------------------------
links
--------------------------------------
model : DichroicMirrorModel
}
class BandOpticalFilterModel {
<<DeviceModel>>
--------------------------------------
attributes
--------------------------------------
filter_type : str
center_wavelength_in_nm : float
bandwidth_in_nm : float
}
class BandOpticalFilter {
<<DeviceInstance>>
--------------------------------------
attributes
--------------------------------------
serial_number : str
--------------------------------------
links
--------------------------------------
model : BandOpticalFilterModel
}
class EdgeOpticalFilterModel {
<<DeviceModel>>
--------------------------------------
attributes
--------------------------------------
filter_type : str
cut_wavelength_in_nm : float
slope_in_percent_cut_wavelength : float
slope_starting_transmission_in_percent : float
slope_ending_transmission_in_percent : float
}
class EdgeOpticalFilter {
<<DeviceInstance>>
--------------------------------------
attributes
--------------------------------------
serial_number : str
--------------------------------------
links
--------------------------------------
model : EdgeOpticalFilterModel
}
class ViralVector {
<<NWBContainer>>
--------------------------------------
attributes
--------------------------------------
construct_name : str
description : str
manufacturer : str
titer_in_vg_per_ml : float
}
class ViralVectorInjection {
<<NWBContainer>>
--------------------------------------
attributes
--------------------------------------
description : str
location : str
hemisphere : str
reference : str
ap_in_mm : float
ml_in_mm : float
dv_in_mm : float
pitch_in_deg : float
yaw_in_deg : float
roll_in_deg : float
stereotactic_rotation_in_deg : float
stereotactic_tilt_in_deg : float
volume_in_uL : float
injection_date : str
--------------------------------------
links
--------------------------------------
viral_vector : ViralVector
}
class Indicator {
<<NWBContainer>>
--------------------------------------
attributes
--------------------------------------
label : str
description : str
manufacturer : str
--------------------------------------
links
--------------------------------------
viral_vector_injection : ViralVectorInjection
}
}
%% Main container relationships
FiberPhotometry *--> FiberPhotometryTable
FiberPhotometry *--> FiberPhotometryViruses
FiberPhotometry *--> FiberPhotometryVirusInjections
FiberPhotometry *--> FiberPhotometryIndicators
%% Table column relationships
FiberPhotometryTable ..> CommandedVoltageSeries
FiberPhotometryTable ..> OpticalFiber
FiberPhotometryTable ..> ExcitationSource
FiberPhotometryTable ..> Photodetector
FiberPhotometryTable ..> DichroicMirror
FiberPhotometryTable ..> BandOpticalFilter
FiberPhotometryTable ..> EdgeOpticalFilter
FiberPhotometryTable ..> Indicator
%% Container relationships
FiberPhotometryViruses *--> ViralVector
FiberPhotometryVirusInjections *--> ViralVectorInjection
FiberPhotometryIndicators *--> Indicator
%% Data linkage
FiberPhotometryResponseSeries ..> FiberPhotometryTable
%% Device model relationships
OpticalFiber ..> OpticalFiberModel
ExcitationSource ..> ExcitationSourceModel
Photodetector ..> PhotodetectorModel
DichroicMirror ..> DichroicMirrorModel
BandOpticalFilter ..> BandOpticalFilterModel
EdgeOpticalFilter ..> EdgeOpticalFilterModel
%% Component relationships
OpticalFiber *--> FiberInsertion
ViralVectorInjection ..> ViralVector
Indicator ..> ViralVectorInjection
```
---
This extension was created using [ndx-template](https://github.com/nwb-extensions/ndx-template).
Raw data
{
"_id": null,
"home_page": null,
"name": "ndx-fiber-photometry",
"maintainer": null,
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": "NWB, NeurodataWithoutBorders, ndx-extension, nwb-extension",
"author": null,
"author_email": "Alessandra Trapani <alessandra.trapani@catalystneuro.com>, Luiz Tauffer <luiz.tauffer@catalystneuro.com>, Paul Adkisson <paul.adkisson@catalystneuro.com>, Szonja Weigl <szonja.weigl@catalystneuro.com>",
"download_url": "https://files.pythonhosted.org/packages/99/c3/9794a0adf183a582d7e388cf6891e1a0cb2942b464459485e03380e61141/ndx_fiber_photometry-0.2.0.tar.gz",
"platform": null,
"description": "# ndx-fiber-photometry Extension for NWB\n\nThis is an NWB extension for storing fiber photometry recordings and associated metadata.\nIt replaces the deprecated [ndx-photometry](https://github.com/catalystneuro/ndx-photometry) extension.\n\n## Neurodata Types\n\nThis extension provides neurodata types for documenting fiber photometry experiments, including excitation sources,\nphotodetectors, optical indicators, and fiber optics, as well as the fiber photometry response series.\n\n### Device Specification Types (ndx-ophys-devices)\n\nThis extension depends on `ndx-ophys-devices`, which provides the foundational device types for specifying the physical hardware and biological components used in optical physiology experiments, which include but are not limited to fiber photometry.\nThese types follow a model-instance pattern where device models define specifications and device instances represent actual hardware with specific configurations.\n\n#### ExcitationSource & ExcitationSourceModel\n**ExcitationSourceModel**: Template specifications for light sources\n- `source_type`: Type of light source (e.g., \"laser\", \"LED\")\n- `excitation_mode`: Mode of excitation (e.g., \"one-photon\")\n- `wavelength_range_in_nm`: Supported wavelength range [min, max]\n\n**ExcitationSource**: Specific light source instance\n- `power_in_W`: Maximum power output\n- `intensity_in_W_per_m2`: Light intensity at the fiber tip\n- `exposure_time_in_s`: Typical exposure duration\n- Links to its corresponding `ExcitationSourceModel`\n\n#### OpticalFiber & OpticalFiberModel\n**OpticalFiberModel**: Template specifications for optical fibers\n- `numerical_aperture`: Numerical aperture value\n- `core_diameter_in_um`: Core diameter in micrometers\n- `active_length_in_mm`: Active length for tapered fibers\n- Ferrule specifications (name, model, diameter)\n\n**OpticalFiber**: Specific fiber instance with implantation details\n- `serial_number`: Unique identifier for this fiber\n- `fiber_insertion`: Container with stereotactic coordinates and angles\n- Links to its corresponding `OpticalFiberModel`\n\n#### FiberInsertion\nDetailed implantation information for optical fibers:\n- Stereotactic coordinates (`insertion_position_ap_in_mm`, `insertion_position_ml_in_mm`, `insertion_position_dv_in_mm`)\n- `depth_in_mm`: Insertion depth\n- `position_reference`: Reference point for coordinates (e.g., \"Bregma\")\n- `hemisphere`: Target hemisphere\n- Insertion angles (`insertion_angle_pitch_in_deg`, `insertion_angle_yaw_in_deg`, `insertion_angle_roll_in_deg`)\n\n#### ViralVector & ViralVectorInjection\n**ViralVector**: Viral construct specifications\n- `construct_name`: Name of the viral construct/vector\n- `description`: Detailed description of the construct\n- `manufacturer`: Source of the viral vector\n- `titer_in_vg_per_ml`: Viral titer in genomes per mL\n\n**ViralVectorInjection**: Injection procedure details\n- Stereotactic coordinates and angles\n- `volume_in_uL`: Volume injected\n- `injection_date`: Date of injection procedure\n- `location`: Target brain region\n- `hemisphere`: Target hemisphere\n- Links to the corresponding `ViralVector`\n\n#### Indicator\nFluorescent indicator/reporter specifications:\n- `label`: Name of the fluorescent indicator (e.g., \"GCaMP6f\", \"Tdtomato\")\n- `description`: Detailed description of the indicator\n- `viral_vector_injection`: Links to the `ViralVectorInjection` used to deliver this indicator\n- Used to specify calcium indicators, voltage indicators, or other fluorescent reporters\n\n#### Photodetector & PhotodetectorModel\n**PhotodetectorModel**: Template specifications for photodetectors\n- `detector_type`: Type of detector (e.g., \"PMT\", \"photodiode\", \"CMOS\")\n- `wavelength_range_in_nm`: Detection wavelength range [min, max]\n- `gain`: Base gain value for the detector\n- `gain_unit`: Units for the gain measurement (e.g., \"A/W\")\n\n**Photodetector**: Specific photodetector instance\n- `serial_number`: Unique identifier for this detector\n- `description`: Detailed description of the detector's role\n- Links to its corresponding `PhotodetectorModel`\n\n#### DichroicMirror & DichroicMirrorModel\n**DichroicMirrorModel**: Template specifications for dichroic mirrors\n- `cut_on_wavelength_in_nm`: Wavelength where transmission begins to increase\n- `cut_off_wavelength_in_nm`: Wavelength where transmission begins to decrease\n- `reflection_band_in_nm`: Wavelength range that is primarily reflected [min, max]\n- `transmission_band_in_nm`: Wavelength range that is primarily transmitted [min, max]\n- `angle_of_incidence_in_degrees`: Designed angle of incidence for the mirror\n\n**DichroicMirror**: Specific dichroic mirror instance\n- `serial_number`: Unique identifier for this mirror\n- `description`: Detailed description of the mirror's role in the optical path\n- Links to its corresponding `DichroicMirrorModel`\n\n#### BandOpticalFilter & BandOpticalFilterModel\n**BandOpticalFilterModel**: Template specifications for bandpass/bandstop filters\n- `filter_type`: Type of filter (e.g., \"Bandpass\", \"Bandstop\")\n- `center_wavelength_in_nm`: Center wavelength of the filter\n- `bandwidth_in_nm`: Full width at half maximum (FWHM) bandwidth\n- Typically used for emission or excitation filtering\n\n**BandOpticalFilter**: Specific band filter instance\n- `serial_number`: Unique identifier for this filter\n- `description`: Detailed description of the filter's role\n- Links to its corresponding `BandOpticalFilterModel`\n\n#### EdgeOpticalFilter & EdgeOpticalFilterModel\n**EdgeOpticalFilterModel**: Template specifications for edge filters\n- `filter_type`: Type of edge filter (e.g., \"Longpass\", \"Shortpass\")\n- `cut_wavelength_in_nm`: Wavelength at which the filter transitions\n- `slope_in_percent_cut_wavelength`: Steepness of the transition as percentage of cut wavelength\n- `slope_starting_transmission_in_percent`: Transmission percentage at start of transition\n- `slope_ending_transmission_in_percent`: Transmission percentage at end of transition\n\n**EdgeOpticalFilter**: Specific edge filter instance\n- `serial_number`: Unique identifier for this filter\n- `description`: Detailed description of the filter's role\n- Links to its corresponding `EdgeOpticalFilterModel`\n\n### Fiber Photometry Specific Types (ndx-fiber-photometry)\n\nBeyond the foundational device types, this extension provides specific containers and data types for organizing fiber photometry experiments:\n\n#### Container Types\n**FiberPhotometryViruses**: Container for organizing viral vectors used in the experiment\n- Holds a collection of `ViralVector` objects\n- Provides centralized organization of all viral constructs used\n\n**FiberPhotometryVirusInjections**: Container for organizing viral vector injections\n- Holds a collection of `ViralVectorInjection` objects\n- Provides centralized organization of all injection procedures\n\n**FiberPhotometryIndicators**: Container for organizing fluorescent indicators\n- Holds a collection of `Indicator` objects\n- Links indicators to their corresponding viral vector injections\n\n#### Data Types\n**CommandedVoltageSeries**: Extends `TimeSeries`\n- Stores commanded voltage values for controlling excitation sources\n- `frequency`: Frequency of voltage commands\n- `data`: Time series of voltage values\n- `rate`: Sampling rate of the voltage commands\n\n**FiberPhotometryResponseSeries**: Extends `TimeSeries`\n- Stores recorded fiber photometry responses (fluorescence signals)\n- `data`: Time series of fluorescence measurements [ntime, nfibers]\n- `fiber_photometry_table_region`: Links to specific rows in the FiberPhotometryTable\n- `rate`: Sampling rate of the fluorescence measurements\n\n**FiberPhotometryTable**: Extends `DynamicTable`\n- Central table organizing the experimental setup for each fiber\n- Each row represents one fiber/channel with its associated devices:\n - `location`: Target brain region\n - `excitation_wavelength_in_nm`: Wavelength used for excitation\n - `emission_wavelength_in_nm`: Wavelength of emitted fluorescence\n - `indicator`: The fluorescent indicator used\n - `optical_fiber`: The implanted optical fiber\n - `excitation_source`: The light source for excitation\n - `photodetector`: The detector for measuring fluorescence\n - `dichroic_mirror`: Dichroic mirror in the optical path\n - `emission_filter`: Filter for emission light (BandOpticalFilter or EdgeOpticalFilter)\n - `commanded_voltage_series`: Voltage commands for this channel\n- Supports creation of table regions for linking to response data\n\n**FiberPhotometry**: Extends `LabMetaData`\n- Top-level container for fiber photometry metadata\n- Organizes all experiment-related information:\n - `fiber_photometry_table`: The main setup table\n - `fiber_photometry_viruses`: Container of viral vectors\n - `fiber_photometry_virus_injections`: Container of injection procedures\n - `fiber_photometry_indicators`: Container of indicators\n\n## Installation\n\nTo install the latest stable release through PyPI,\n```bash\npip install ndx-fiber-photometry\n```\n\n## Usage\n\n```python\nimport datetime\nimport numpy as np\nfrom pynwb import NWBFile, NWBHDF5IO\nfrom ndx_ophys_devices import (\n ViralVector,\n ViralVectorInjection,\n Indicator,\n OpticalFiberModel,\n FiberInsertion,\n OpticalFiber,\n ExcitationSourceModel,\n ExcitationSource,\n PhotodetectorModel,\n Photodetector,\n DichroicMirrorModel,\n DichroicMirror,\n BandOpticalFilterModel,\n BandOpticalFilter,\n EdgeOpticalFilterModel,\n EdgeOpticalFilter,\n)\nfrom ndx_fiber_photometry import (\n FiberPhotometryViruses,\n FiberPhotometryVirusInjections,\n FiberPhotometryIndicators,\n FiberPhotometry,\n FiberPhotometryTable,\n FiberPhotometryResponseSeries,\n CommandedVoltageSeries,\n)\n\nnwbfile = NWBFile(\n session_description='session_description',\n identifier='identifier',\n session_start_time=datetime.datetime.now(datetime.timezone.utc)\n)\n\nviral_vector_green = ViralVector(\n name=\"viral_vector_green\",\n description=\"AAV viral vector for the green indicator.\",\n construct_name=\"AAV-CaMKII-GCaMP6f\",\n manufacturer=\"Vector Manufacturer\",\n titer_in_vg_per_ml=1.0e12,\n)\n\nviral_vector_red = ViralVector(\n name=\"viral_vector_red\",\n description=\"AAV viral vector for the red indicator.\",\n construct_name=\"AAV-CaMKII-Tdtomato\",\n manufacturer=\"Vector Manufacturer\",\n titer_in_vg_per_ml=1.0e12,\n)\nviruses = FiberPhotometryViruses(viral_vectors=[viral_vector_green, viral_vector_red])\n\nviral_vector_injection_green = ViralVectorInjection(\n name=\"viral_vector_injection_green\",\n description=\"Viral vector injection for fiber photometry.\",\n location=\"Ventral Tegmental Area (VTA)\",\n hemisphere=\"right\",\n reference=\"Bregma at the cortical surface\",\n ap_in_mm=3.0,\n ml_in_mm=2.0,\n dv_in_mm=1.0,\n pitch_in_deg=0.0,\n yaw_in_deg=0.0,\n roll_in_deg=0.0,\n stereotactic_rotation_in_deg=0.0,\n stereotactic_tilt_in_deg=0.0,\n volume_in_uL=0.45,\n injection_date=\"1970-01-01T00:00:00+00:00\",\n viral_vector=viral_vector_green,\n)\n\nviral_vector_injection_red = ViralVectorInjection(\n name=\"viral_vector_injection_red\",\n description=\"Viral vector injection for fiber photometry.\",\n location=\"Ventral Tegmental Area (VTA)\",\n hemisphere=\"right\",\n reference=\"Bregma at the cortical surface\",\n ap_in_mm=3.0,\n ml_in_mm=2.0,\n dv_in_mm=1.0,\n pitch_in_deg=0.0,\n yaw_in_deg=0.0,\n roll_in_deg=0.0,\n stereotactic_rotation_in_deg=0.0,\n stereotactic_tilt_in_deg=0.0,\n volume_in_uL=0.45,\n injection_date=\"1970-01-01T00:00:00+00:00\",\n viral_vector=viral_vector_red,\n)\n\nvirus_injections = FiberPhotometryVirusInjections(\n viral_vector_injections=[viral_vector_injection_green, viral_vector_injection_red]\n)\n\n\nindicator_green = Indicator(\n name=\"indicator_1\",\n description=\"Green indicator\",\n label=\"GCamp6f\",\n viral_vector_injection=viral_vector_injection_green,\n)\nindicator_red = Indicator(\n name=\"indicator_2\",\n description=\"Red indicator\",\n label=\"Tdtomato\",\n viral_vector_injection=viral_vector_injection_red,\n)\n\nindicators = FiberPhotometryIndicators(indicators=[indicator_green, indicator_red])\n\noptical_fiber_model = OpticalFiberModel(\n name=\"optical_fiber_model\",\n manufacturer=\"Fiber Manufacturer\",\n model_number=\"OF-123\",\n description=\"Optical fiber model for optogenetics\",\n numerical_aperture=0.2,\n core_diameter_in_um=400.0,\n active_length_in_mm=2.0,\n ferrule_name=\"cFCF - \u22052.5mm Ceramic Ferrule\",\n ferrule_model=\"SM-SC-CF-10-FM\",\n ferrule_diameter_in_mm=2.5,\n)\n\nfiber_insertion_1 = FiberInsertion(\n name=\"fiber_insertion\",\n depth_in_mm=3.5,\n insertion_position_ap_in_mm=3.0,\n insertion_position_ml_in_mm=2.0,\n insertion_position_dv_in_mm=1.0,\n position_reference=\"bregma\",\n hemisphere=\"right\",\n insertion_angle_pitch_in_deg=10.0,\n)\n\nfiber_insertion_2 = FiberInsertion(\n name=\"fiber_insertion\",\n depth_in_mm=3.5,\n insertion_position_ap_in_mm=3.0,\n insertion_position_ml_in_mm=-2.0,\n insertion_position_dv_in_mm=1.0,\n position_reference=\"bregma\",\n hemisphere=\"left\",\n insertion_angle_pitch_in_deg=10.0,\n)\n\noptical_fiber_1 = OpticalFiber(\n name=\"optical_fiber_1\",\n description=\"Optical fiber for fiber photometry.\",\n serial_number=\"OF-SN-123456\",\n model=optical_fiber_model,\n fiber_insertion=fiber_insertion_1,\n)\noptical_fiber_2 = OpticalFiber(\n name=\"optical_fiber_2\",\n description=\"Optical fiber for fiber photometry.\",\n serial_number=\"OF-SN-654321\",\n model=optical_fiber_model,\n fiber_insertion=fiber_insertion_2,\n)\n\nexcitation_source_model = ExcitationSourceModel(\n name=\"excitation_source_model\",\n manufacturer=\"Laser Manufacturer\",\n model_number=\"ES-123\",\n description=\"Excitation source model for fiber photometry.\",\n source_type=\"laser\",\n excitation_mode=\"one-photon\",\n wavelength_range_in_nm=[400.0, 800.0],\n)\nexcitation_source_1 = ExcitationSource(\n name=\"excitation_source_1\",\n description=\"Excitation source for green indicator\",\n serial_number=\"ES-SN-123456\",\n model=excitation_source_model,\n power_in_W=0.7,\n intensity_in_W_per_m2=0.005,\n exposure_time_in_s=2.51e-13,\n)\nexcitation_source_2 = ExcitationSource(\n name=\"excitation_source_2\",\n description=\"Excitation source for red indicator\",\n serial_number=\"ES-SN-654321\",\n model=excitation_source_model,\n power_in_W=0.7,\n intensity_in_W_per_m2=0.005,\n exposure_time_in_s=2.51e-13,\n)\n\nphotodetector_model = PhotodetectorModel(\n name=\"photodetector_model\",\n manufacturer=\"Detector Manufacturer\",\n model_number=\"PD-123\",\n description=\"Photodetector model for fiber photometry.\",\n detector_type=\"PMT\",\n wavelength_range_in_nm=[400.0, 800.0],\n gain=100.0,\n gain_unit=\"A/W\",\n)\nphotodetector_1 = Photodetector(\n name=\"photodetector_1\",\n description=\"Photodetector for green emission.\",\n serial_number=\"PD-SN-123456\",\n model=photodetector_model,\n)\nphotodetector_2 = Photodetector(\n name=\"photodetector_2\",\n description=\"Photodetector for red emission.\",\n serial_number=\"PD-SN-654321\",\n model=photodetector_model,\n)\n\ndichroic_mirror_model_1 = DichroicMirrorModel(\n name=\"dichroic_mirror_model_1\",\n manufacturer=\"Mirror Manufacturer\",\n model_number=\"DM-123\",\n description=\"Dichroic mirror model for green indicator.\",\n cut_on_wavelength_in_nm=470.0,\n cut_off_wavelength_in_nm=500.0,\n reflection_band_in_nm=[490.0, 520.0],\n transmission_band_in_nm=[460.0, 480.0],\n angle_of_incidence_in_degrees=45.0,\n)\ndichroic_mirror_model_2 = DichroicMirrorModel(\n name=\"dichroic_mirror_model_2\",\n manufacturer=\"Mirror Manufacturer\",\n model_number=\"DM-456\",\n description=\"Dichroic mirror model for red indicator.\",\n cut_on_wavelength_in_nm=525.0,\n cut_off_wavelength_in_nm=585.0,\n reflection_band_in_nm=[575.0, 595.0],\n transmission_band_in_nm=[515.0, 535.0],\n angle_of_incidence_in_degrees=45.0,\n)\ndichroic_mirror_1 = DichroicMirror(\n name=\"dichroic_mirror_1\",\n description=\"Dichroic mirror for green indicator\",\n serial_number=\"DM-SN-123456\",\n model=dichroic_mirror_model_1,\n)\ndichroic_mirror_2 = DichroicMirror(\n name=\"dichroic_mirror_2\",\n description=\"Dichroic mirror for red indicator\",\n serial_number=\"DM-SN-654321\",\n model=dichroic_mirror_model_2,\n)\n\nband_optical_filter_model = BandOpticalFilterModel(\n name=\"band_optical_filter_model\",\n manufacturer=\"Filter Manufacturer\",\n model_number=\"BOF-123\",\n description=\"Band optical filter model for green indicator\",\n filter_type=\"Bandpass\",\n center_wavelength_in_nm=505.0,\n bandwidth_in_nm=30.0, # 505\u00b115nm\n)\nband_optical_filter = BandOpticalFilter(\n name=\"band_optical_filter\",\n description=\"Band optical filter for green indicator\",\n serial_number=\"BOF-SN-123456\",\n model=band_optical_filter_model,\n)\nedge_optical_filter_model = EdgeOpticalFilterModel(\n name=\"edge_optical_filter_model\",\n manufacturer=\"Filter Manufacturer\",\n model_number=\"EOF-123\",\n description=\"Edge optical filter model for red indicator\",\n filter_type=\"Longpass\",\n cut_wavelength_in_nm=585.0,\n slope_in_percent_cut_wavelength=1.0,\n slope_starting_transmission_in_percent=10.0,\n slope_ending_transmission_in_percent=80.0,\n)\nedge_optical_filter = EdgeOpticalFilter(\n name=\"edge_optical_filter\",\n description=\"Edge optical filter for red indicator\",\n serial_number=\"EOF-SN-123456\",\n model=edge_optical_filter_model,\n)\n\ncommanded_voltage_series_1 = CommandedVoltageSeries(\n name=\"commanded_voltage_series_1\", data=[1.0, 2.0, 3.0], frequency=30.0, rate=30.0, unit=\"volts\"\n)\ncommanded_voltage_series_2 = CommandedVoltageSeries(\n name=\"commanded_voltage_series_2\",\n data=[4.0, 5.0, 6.0],\n rate=30.0,\n unit=\"volts\",\n)\n\nfiber_photometry_table = FiberPhotometryTable(\n name=\"fiber_photometry_table\",\n description=\"fiber photometry table\",\n)\nfiber_photometry_table.add_row(\n location=\"VTA\",\n excitation_wavelength_in_nm=480.0,\n emission_wavelength_in_nm=525.0,\n indicator=indicator_green,\n optical_fiber=optical_fiber_1,\n excitation_source=excitation_source_1,\n commanded_voltage_series=commanded_voltage_series_1,\n photodetector=photodetector_1,\n dichroic_mirror=dichroic_mirror_1,\n emission_filter=band_optical_filter,\n)\nfiber_photometry_table.add_row(\n location=\"VTA\",\n excitation_wavelength_in_nm=580.0,\n emission_wavelength_in_nm=610.0,\n indicator=indicator_red,\n optical_fiber=optical_fiber_2,\n excitation_source=excitation_source_2,\n commanded_voltage_series=commanded_voltage_series_2,\n photodetector=photodetector_2,\n dichroic_mirror=dichroic_mirror_2,\n emission_filter=edge_optical_filter,\n)\n\nfiber_photometry_table_region = fiber_photometry_table.create_fiber_photometry_table_region(\n region=[0], description=\"source fibers\"\n)\n\nfiber_photometry_lab_meta_data = FiberPhotometry(\n name=\"fiber_photometry\",\n fiber_photometry_table=fiber_photometry_table,\n fiber_photometry_viruses=viruses,\n fiber_photometry_virus_injections=virus_injections,\n fiber_photometry_indicators=indicators,\n)\n\nfiber_photometry_response_series = FiberPhotometryResponseSeries(\n name=\"fiber_photometry_response_series\",\n description=\"my roi response series\",\n data=np.random.randn(100, 1),\n unit=\"n.a.\",\n rate=30.0,\n fiber_photometry_table_region=fiber_photometry_table_region,\n)\n\nnwbfile.add_device_model(optical_fiber_model)\nnwbfile.add_device(optical_fiber_1)\nnwbfile.add_device(optical_fiber_2)\nnwbfile.add_device_model(excitation_source_model)\nnwbfile.add_device(excitation_source_1)\nnwbfile.add_device(excitation_source_2)\nnwbfile.add_device_model(photodetector_model)\nnwbfile.add_device(photodetector_1)\nnwbfile.add_device(photodetector_2)\nnwbfile.add_device_model(dichroic_mirror_model_1)\nnwbfile.add_device(dichroic_mirror_1)\nnwbfile.add_device_model(dichroic_mirror_model_2)\nnwbfile.add_device(dichroic_mirror_2)\nnwbfile.add_device_model(band_optical_filter_model)\nnwbfile.add_device(band_optical_filter)\nnwbfile.add_device_model(edge_optical_filter_model)\nnwbfile.add_device(edge_optical_filter)\n\nnwbfile.add_acquisition(commanded_voltage_series_1)\nnwbfile.add_acquisition(commanded_voltage_series_2)\nnwbfile.add_lab_meta_data(fiber_photometry_lab_meta_data)\nnwbfile.add_acquisition(fiber_photometry_response_series)\n```\n\n## Extension Diagram\n```mermaid\n%%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#ffffff', 'primaryBorderColor': '#144E73', 'lineColor': '#D96F32'}}}%%\nclassDiagram\n direction LR\n\n namespace ndx-fiber-photometry {\n class FiberPhotometryResponseSeries {\n <<TimeSeries>>\n --------------------------------------\n attributes\n --------------------------------------\n name : str\n description : str\n rate : float\n starting_time : float\n timestamps : array-like\n unit : str\n offset : float\n conversion : float\n --------------------------------------\n datasets\n --------------------------------------\n data[ntime] | data[ntime, nfibers] : numeric\n fiber_photometry_table_region : DynamicTableRegion\n }\n\n class CommandedVoltageSeries {\n <<TimeSeries>>\n --------------------------------------\n attributes\n --------------------------------------\n name : str\n description : str\n rate : float\n starting_time : float\n timestamps : array-like\n unit : str\n offset : float\n conversion : float\n --------------------------------------\n datasets\n --------------------------------------\n data[ntime] : float\n frequency : float\n }\n\n class FiberPhotometry {\n <<LabMetaData>>\n --------------------------------------\n attributes\n --------------------------------------\n name : str\n --------------------------------------\n groups\n --------------------------------------\n fiber_photometry_table : FiberPhotometryTable\n fiber_photometry_viruses : FiberPhotometryViruses\n fiber_photometry_virus_injections : FiberPhotometryVirusInjections\n fiber_photometry_indicators : FiberPhotometryIndicators\n }\n\n class FiberPhotometryTable {\n <<DynamicTable>>\n --------------------------------------\n attributes\n --------------------------------------\n name : str\n description : str\n --------------------------------------\n columns\n --------------------------------------\n location : VectorData[str]\n coordinates : VectorData[float[3]]\n indicator : VectorData[Indicator]\n notes : VectorData[str]\n optical_fiber : VectorData[OpticalFiber]\n excitation_source : VectorData[ExcitationSource]\n commanded_voltage_series : VectorData[CommandedVoltageSeries]\n photodetector : VectorData[Photodetector]\n dichroic_mirror : VectorData[DichroicMirror]\n emission_filter : VectorData[OpticalFilter]\n excitation_filter : VectorData[OpticalFilter]\n }\n\n class FiberPhotometryViruses {\n <<NWBContainer>>\n --------------------------------------\n groups\n --------------------------------------\n viral_vectors : ViralVector[]\n }\n\n class FiberPhotometryVirusInjections {\n <<NWBContainer>>\n --------------------------------------\n groups\n --------------------------------------\n viral_vector_injections : ViralVectorInjection[]\n }\n\n class FiberPhotometryIndicators {\n <<NWBContainer>>\n --------------------------------------\n groups\n --------------------------------------\n indicators : Indicator[]\n }\n }\n\n namespace ndx-ophys-devices {\n class OpticalFiberModel {\n <<DeviceModel>>\n --------------------------------------\n attributes\n --------------------------------------\n numerical_aperture : float\n core_diameter_in_um : float\n active_length_in_mm : float\n ferrule_name : str\n ferrule_model : str\n ferrule_diameter_in_mm : float\n }\n\n class FiberInsertion {\n <<NWBContainer>>\n --------------------------------------\n attributes\n --------------------------------------\n insertion_position_ap_in_mm : float\n insertion_position_ml_in_mm : float\n insertion_position_dv_in_mm : float\n depth_in_mm : float\n position_reference : str\n hemisphere : str\n insertion_angle_yaw_in_deg : float\n insertion_angle_pitch_in_deg : float\n insertion_angle_roll_in_deg : float\n }\n\n class OpticalFiber {\n <<DeviceInstance>>\n --------------------------------------\n attributes\n --------------------------------------\n serial_number : str\n --------------------------------------\n groups\n --------------------------------------\n fiber_insertion : FiberInsertion\n --------------------------------------\n links\n --------------------------------------\n model : OpticalFiberModel\n }\n\n class ExcitationSourceModel {\n <<DeviceModel>>\n --------------------------------------\n attributes\n --------------------------------------\n source_type : str\n excitation_mode : str\n wavelength_range_in_nm : float[2]\n }\n\n class ExcitationSource {\n <<DeviceInstance>>\n --------------------------------------\n attributes\n --------------------------------------\n serial_number : str\n power_in_W : float\n intensity_in_W_per_m2 : float\n exposure_time_in_s : float\n --------------------------------------\n links\n --------------------------------------\n model : ExcitationSourceModel\n }\n\n class PhotodetectorModel {\n <<DeviceModel>>\n --------------------------------------\n attributes\n --------------------------------------\n detector_type : str\n wavelength_range_in_nm : float[2]\n gain : float\n gain_unit : str\n }\n\n class Photodetector {\n <<DeviceInstance>>\n --------------------------------------\n attributes\n --------------------------------------\n serial_number : str\n --------------------------------------\n links\n --------------------------------------\n model : PhotodetectorModel\n }\n\n class DichroicMirrorModel {\n <<DeviceModel>>\n --------------------------------------\n attributes\n --------------------------------------\n cut_on_wavelength_in_nm : float\n cut_off_wavelength_in_nm : float\n reflection_band_in_nm : float[2]\n transmission_band_in_nm : float[2]\n angle_of_incidence_in_degrees : float\n }\n\n class DichroicMirror {\n <<DeviceInstance>>\n --------------------------------------\n attributes\n --------------------------------------\n serial_number : str\n --------------------------------------\n links\n --------------------------------------\n model : DichroicMirrorModel\n }\n\n class BandOpticalFilterModel {\n <<DeviceModel>>\n --------------------------------------\n attributes\n --------------------------------------\n filter_type : str\n center_wavelength_in_nm : float\n bandwidth_in_nm : float\n }\n\n class BandOpticalFilter {\n <<DeviceInstance>>\n --------------------------------------\n attributes\n --------------------------------------\n serial_number : str\n --------------------------------------\n links\n --------------------------------------\n model : BandOpticalFilterModel\n }\n\n class EdgeOpticalFilterModel {\n <<DeviceModel>>\n --------------------------------------\n attributes\n --------------------------------------\n filter_type : str\n cut_wavelength_in_nm : float\n slope_in_percent_cut_wavelength : float\n slope_starting_transmission_in_percent : float\n slope_ending_transmission_in_percent : float\n }\n\n class EdgeOpticalFilter {\n <<DeviceInstance>>\n --------------------------------------\n attributes\n --------------------------------------\n serial_number : str\n --------------------------------------\n links\n --------------------------------------\n model : EdgeOpticalFilterModel\n }\n\n class ViralVector {\n <<NWBContainer>>\n --------------------------------------\n attributes\n --------------------------------------\n construct_name : str\n description : str\n manufacturer : str\n titer_in_vg_per_ml : float\n }\n\n class ViralVectorInjection {\n <<NWBContainer>>\n --------------------------------------\n attributes\n --------------------------------------\n description : str\n location : str\n hemisphere : str\n reference : str\n ap_in_mm : float\n ml_in_mm : float\n dv_in_mm : float\n pitch_in_deg : float\n yaw_in_deg : float\n roll_in_deg : float\n stereotactic_rotation_in_deg : float\n stereotactic_tilt_in_deg : float\n volume_in_uL : float\n injection_date : str\n --------------------------------------\n links\n --------------------------------------\n viral_vector : ViralVector\n }\n\n class Indicator {\n <<NWBContainer>>\n --------------------------------------\n attributes\n --------------------------------------\n label : str\n description : str\n manufacturer : str\n --------------------------------------\n links\n --------------------------------------\n viral_vector_injection : ViralVectorInjection\n }\n }\n\n %% Main container relationships\n FiberPhotometry *--> FiberPhotometryTable\n FiberPhotometry *--> FiberPhotometryViruses\n FiberPhotometry *--> FiberPhotometryVirusInjections\n FiberPhotometry *--> FiberPhotometryIndicators\n\n %% Table column relationships\n FiberPhotometryTable ..> CommandedVoltageSeries\n FiberPhotometryTable ..> OpticalFiber\n FiberPhotometryTable ..> ExcitationSource\n FiberPhotometryTable ..> Photodetector\n FiberPhotometryTable ..> DichroicMirror\n FiberPhotometryTable ..> BandOpticalFilter\n FiberPhotometryTable ..> EdgeOpticalFilter\n FiberPhotometryTable ..> Indicator\n\n %% Container relationships\n FiberPhotometryViruses *--> ViralVector\n FiberPhotometryVirusInjections *--> ViralVectorInjection\n FiberPhotometryIndicators *--> Indicator\n\n %% Data linkage\n FiberPhotometryResponseSeries ..> FiberPhotometryTable\n\n %% Device model relationships\n OpticalFiber ..> OpticalFiberModel\n ExcitationSource ..> ExcitationSourceModel\n Photodetector ..> PhotodetectorModel\n DichroicMirror ..> DichroicMirrorModel\n BandOpticalFilter ..> BandOpticalFilterModel\n EdgeOpticalFilter ..> EdgeOpticalFilterModel\n\n %% Component relationships\n OpticalFiber *--> FiberInsertion\n ViralVectorInjection ..> ViralVector\n Indicator ..> ViralVectorInjection\n```\n---\nThis extension was created using [ndx-template](https://github.com/nwb-extensions/ndx-template).\n",
"bugtrack_url": null,
"license": "BSD-3",
"summary": "This is an NWB extension for storing fiber photometry recordings and associated metadata.",
"version": "0.2.0",
"project_urls": {
"Bug Tracker": "https://github.com/organization/ndx-fiber-photometry/issues",
"Homepage": "https://github.com/organization/ndx-fiber-photometry"
},
"split_keywords": [
"nwb",
" neurodatawithoutborders",
" ndx-extension",
" nwb-extension"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "4bc65722d90a2986324c778212c8394f33b196664f1468b28999a180542222a4",
"md5": "bd1a548ae7fcfe8d7382dd4fb256105c",
"sha256": "f3d92008560deeeeacf97563cb333f4c5c3b5fcdec63d30255da6fe8eed966e7"
},
"downloads": -1,
"filename": "ndx_fiber_photometry-0.2.0-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "bd1a548ae7fcfe8d7382dd4fb256105c",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 11717,
"upload_time": "2025-09-18T15:51:33",
"upload_time_iso_8601": "2025-09-18T15:51:33.901859Z",
"url": "https://files.pythonhosted.org/packages/4b/c6/5722d90a2986324c778212c8394f33b196664f1468b28999a180542222a4/ndx_fiber_photometry-0.2.0-py2.py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "99c39794a0adf183a582d7e388cf6891e1a0cb2942b464459485e03380e61141",
"md5": "df0800809acfc615aa00f4dbbd77bb0c",
"sha256": "bcc0aee6da3379898c76dadbe7919462241c70b0bdffb7985e754a432ff9e548"
},
"downloads": -1,
"filename": "ndx_fiber_photometry-0.2.0.tar.gz",
"has_sig": false,
"md5_digest": "df0800809acfc615aa00f4dbbd77bb0c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 33342,
"upload_time": "2025-09-18T15:51:35",
"upload_time_iso_8601": "2025-09-18T15:51:35.128770Z",
"url": "https://files.pythonhosted.org/packages/99/c3/9794a0adf183a582d7e388cf6891e1a0cb2942b464459485e03380e61141/ndx_fiber_photometry-0.2.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-18 15:51:35",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "organization",
"github_project": "ndx-fiber-photometry",
"github_not_found": true,
"lcname": "ndx-fiber-photometry"
}