ndx-fiber-photometry


Namendx-fiber-photometry JSON
Version 0.2.0 PyPI version JSON
download
home_pageNone
SummaryThis is an NWB extension for storing fiber photometry recordings and associated metadata.
upload_time2025-09-18 15:51:35
maintainerNone
docs_urlNone
authorNone
requires_pythonNone
licenseBSD-3
keywords nwb neurodatawithoutborders ndx-extension nwb-extension
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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"
}
        
Elapsed time: 0.82934s