sdcard#

Data model for configuring an SD card. Will be instantiated in the constants module with specific values. This allows for the model to be reused across different miniscopes, and for consuming code to use a consistent, introspectable API

pydantic model miniscope_io.sdcard.BufferHeaderPositions#

Positions in the header for each frame

Show JSON schema
{
   "title": "BufferHeaderPositions",
   "description": "Positions in the header for each frame",
   "type": "object",
   "properties": {
      "length": {
         "default": 0,
         "title": "Length",
         "type": "integer"
      },
      "linked_list": {
         "default": 1,
         "title": "Linked List",
         "type": "integer"
      },
      "frame_num": {
         "default": 2,
         "title": "Frame Num",
         "type": "integer"
      },
      "buffer_count": {
         "default": 3,
         "title": "Buffer Count",
         "type": "integer"
      },
      "frame_buffer_count": {
         "default": 4,
         "title": "Frame Buffer Count",
         "type": "integer"
      },
      "write_buffer_count": {
         "default": 5,
         "title": "Write Buffer Count",
         "type": "integer"
      },
      "dropped_buffer_count": {
         "default": 6,
         "title": "Dropped Buffer Count",
         "type": "integer"
      },
      "timestamp": {
         "default": 7,
         "title": "Timestamp",
         "type": "integer"
      },
      "data_length": {
         "default": 8,
         "title": "Data Length",
         "type": "integer"
      },
      "write_timestamp": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "title": "Write Timestamp"
      },
      "battery_voltage": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "title": "Battery Voltage"
      }
   }
}

Fields:
field battery_voltage: int | None = None#
field buffer_count: int = 3#
field data_length: int = 8#
field dropped_buffer_count: int = 6#
field frame_buffer_count: int = 4#
field frame_num: int = 2#
field length: int = 0#
field linked_list: int = 1#
field timestamp: int = 7#
field write_buffer_count: int = 5#
field write_timestamp: int | None = None#
pydantic model miniscope_io.sdcard.ConfigPositions#

Image acquisition configuration positions

Show JSON schema
{
   "title": "ConfigPositions",
   "description": "Image acquisition configuration positions",
   "type": "object",
   "properties": {
      "width": {
         "default": 0,
         "title": "Width",
         "type": "integer"
      },
      "height": {
         "default": 1,
         "title": "Height",
         "type": "integer"
      },
      "fs": {
         "default": 2,
         "title": "Fs",
         "type": "integer"
      },
      "buffer_size": {
         "default": 3,
         "title": "Buffer Size",
         "type": "integer"
      },
      "n_buffers_recorded": {
         "default": 4,
         "title": "N Buffers Recorded",
         "type": "integer"
      },
      "n_buffers_dropped": {
         "default": 5,
         "title": "N Buffers Dropped",
         "type": "integer"
      }
   }
}

Fields:
field buffer_size: int = 3#
field fs: int = 2#
field height: int = 1#
field n_buffers_dropped: int = 5#
field n_buffers_recorded: int = 4#
field width: int = 0#
pydantic model miniscope_io.sdcard.DataHeader#

Header data at the start of each frame

Show JSON schema
{
   "title": "DataHeader",
   "description": "Header data at the start of each frame",
   "type": "object",
   "properties": {
      "length": {
         "title": "Length",
         "type": "integer"
      },
      "linked_list": {
         "title": "Linked List",
         "type": "integer"
      },
      "frame_num": {
         "title": "Frame Num",
         "type": "integer"
      },
      "buffer_count": {
         "title": "Buffer Count",
         "type": "integer"
      },
      "frame_buffer_count": {
         "title": "Frame Buffer Count",
         "type": "integer"
      },
      "write_buffer_count": {
         "title": "Write Buffer Count",
         "type": "integer"
      },
      "dropped_buffer_count": {
         "title": "Dropped Buffer Count",
         "type": "integer"
      },
      "timestamp": {
         "title": "Timestamp",
         "type": "integer"
      },
      "data_length": {
         "title": "Data Length",
         "type": "integer"
      },
      "write_timestamp": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "title": "Write Timestamp"
      },
      "battery_voltage": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "title": "Battery Voltage"
      }
   },
   "required": [
      "length",
      "linked_list",
      "frame_num",
      "buffer_count",
      "frame_buffer_count",
      "write_buffer_count",
      "dropped_buffer_count",
      "timestamp",
      "data_length"
   ]
}

Fields:
field battery_voltage: int | None = None#
field buffer_count: int [Required]#
field data_length: int [Required]#
field dropped_buffer_count: int [Required]#
field frame_buffer_count: int [Required]#
field frame_num: int [Required]#
field length: int [Required]#
field linked_list: int [Required]#
field timestamp: int [Required]#
field write_buffer_count: int [Required]#
field write_timestamp: int | None = None#
pydantic model miniscope_io.sdcard.SDConfig#

The configuration of a recording taken on this SD card.

Read from the locations given in ConfigPositions for an SD card with a given SDLayout

Show JSON schema
{
   "title": "SDConfig",
   "description": "The configuration of a recording taken on this SD card.\n\nRead from the locations given in :class:`.ConfigPositions` for an SD card with a given :class:`.SDLayout`",
   "type": "object",
   "properties": {
      "width": {
         "title": "Width",
         "type": "integer"
      },
      "height": {
         "title": "Height",
         "type": "integer"
      },
      "fs": {
         "title": "Fs",
         "type": "integer"
      },
      "buffer_size": {
         "title": "Buffer Size",
         "type": "integer"
      },
      "n_buffers_recorded": {
         "title": "N Buffers Recorded",
         "type": "integer"
      },
      "n_buffers_dropped": {
         "title": "N Buffers Dropped",
         "type": "integer"
      }
   },
   "required": [
      "width",
      "height",
      "fs",
      "buffer_size",
      "n_buffers_recorded",
      "n_buffers_dropped"
   ]
}

Fields:
field buffer_size: int [Required]#
field fs: int [Required]#
field height: int [Required]#
field n_buffers_dropped: int [Required]#
field n_buffers_recorded: int [Required]#
field width: int [Required]#
pydantic model miniscope_io.sdcard.SDHeaderPositions#

Positions in the header for the whole SD card

Show JSON schema
{
   "title": "SDHeaderPositions",
   "description": "Positions in the header for the whole SD card",
   "type": "object",
   "properties": {
      "gain": {
         "default": 4,
         "title": "Gain",
         "type": "integer"
      },
      "led": {
         "default": 5,
         "title": "Led",
         "type": "integer"
      },
      "ewl": {
         "default": 6,
         "title": "Ewl",
         "type": "integer"
      },
      "record_length": {
         "default": 7,
         "title": "Record Length",
         "type": "integer"
      },
      "fs": {
         "default": 8,
         "title": "Fs",
         "type": "integer"
      },
      "delay_start": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "title": "Delay Start"
      },
      "battery_cutoff": {
         "anyOf": [
            {
               "type": "integer"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "title": "Battery Cutoff"
      }
   }
}

Fields:
field battery_cutoff: int | None = None#
field delay_start: int | None = None#
field ewl: int = 6#
field fs: int = 8#

Frame rate

field gain: int = 4#
field led: int = 5#
field record_length: int = 7#
pydantic model miniscope_io.sdcard.SDLayout#

Data layout of an SD Card.

Used by the io.SDCard class to tell it how data on the SD card is laid out.

Show JSON schema
{
   "title": "SDLayout",
   "description": "Data layout of an SD Card.\n\nUsed by the :class:`.io.SDCard` class to tell it how data on the SD card is laid out.",
   "type": "object",
   "properties": {
      "sectors": {
         "$ref": "#/$defs/SectorConfig"
      },
      "write_key0": {
         "default": 226277911,
         "title": "Write Key0",
         "type": "integer"
      },
      "write_key1": {
         "default": 226277911,
         "title": "Write Key1",
         "type": "integer"
      },
      "write_key2": {
         "default": 226277911,
         "title": "Write Key2",
         "type": "integer"
      },
      "write_key3": {
         "default": 226277911,
         "title": "Write Key3",
         "type": "integer"
      },
      "word_size": {
         "default": 4,
         "title": "Word Size",
         "type": "integer"
      },
      "header": {
         "allOf": [
            {
               "$ref": "#/$defs/SDHeaderPositions"
            }
         ],
         "default": {
            "battery_cutoff": null,
            "delay_start": null,
            "ewl": 6,
            "fs": 8,
            "gain": 4,
            "led": 5,
            "record_length": 7
         }
      },
      "config": {
         "allOf": [
            {
               "$ref": "#/$defs/ConfigPositions"
            }
         ],
         "default": {
            "buffer_size": 3,
            "fs": 2,
            "height": 1,
            "n_buffers_dropped": 5,
            "n_buffers_recorded": 4,
            "width": 0
         }
      },
      "buffer": {
         "allOf": [
            {
               "$ref": "#/$defs/BufferHeaderPositions"
            }
         ],
         "default": {
            "battery_voltage": null,
            "buffer_count": 3,
            "data_length": 8,
            "dropped_buffer_count": 6,
            "frame_buffer_count": 4,
            "frame_num": 2,
            "length": 0,
            "linked_list": 1,
            "timestamp": 7,
            "write_buffer_count": 5,
            "write_timestamp": null
         }
      },
      "version": {
         "anyOf": [
            {
               "type": "string"
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "title": "Version"
      }
   },
   "$defs": {
      "BufferHeaderPositions": {
         "description": "Positions in the header for each frame",
         "properties": {
            "length": {
               "default": 0,
               "title": "Length",
               "type": "integer"
            },
            "linked_list": {
               "default": 1,
               "title": "Linked List",
               "type": "integer"
            },
            "frame_num": {
               "default": 2,
               "title": "Frame Num",
               "type": "integer"
            },
            "buffer_count": {
               "default": 3,
               "title": "Buffer Count",
               "type": "integer"
            },
            "frame_buffer_count": {
               "default": 4,
               "title": "Frame Buffer Count",
               "type": "integer"
            },
            "write_buffer_count": {
               "default": 5,
               "title": "Write Buffer Count",
               "type": "integer"
            },
            "dropped_buffer_count": {
               "default": 6,
               "title": "Dropped Buffer Count",
               "type": "integer"
            },
            "timestamp": {
               "default": 7,
               "title": "Timestamp",
               "type": "integer"
            },
            "data_length": {
               "default": 8,
               "title": "Data Length",
               "type": "integer"
            },
            "write_timestamp": {
               "anyOf": [
                  {
                     "type": "integer"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "title": "Write Timestamp"
            },
            "battery_voltage": {
               "anyOf": [
                  {
                     "type": "integer"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "title": "Battery Voltage"
            }
         },
         "title": "BufferHeaderPositions",
         "type": "object"
      },
      "ConfigPositions": {
         "description": "Image acquisition configuration positions",
         "properties": {
            "width": {
               "default": 0,
               "title": "Width",
               "type": "integer"
            },
            "height": {
               "default": 1,
               "title": "Height",
               "type": "integer"
            },
            "fs": {
               "default": 2,
               "title": "Fs",
               "type": "integer"
            },
            "buffer_size": {
               "default": 3,
               "title": "Buffer Size",
               "type": "integer"
            },
            "n_buffers_recorded": {
               "default": 4,
               "title": "N Buffers Recorded",
               "type": "integer"
            },
            "n_buffers_dropped": {
               "default": 5,
               "title": "N Buffers Dropped",
               "type": "integer"
            }
         },
         "title": "ConfigPositions",
         "type": "object"
      },
      "SDHeaderPositions": {
         "description": "Positions in the header for the whole SD card",
         "properties": {
            "gain": {
               "default": 4,
               "title": "Gain",
               "type": "integer"
            },
            "led": {
               "default": 5,
               "title": "Led",
               "type": "integer"
            },
            "ewl": {
               "default": 6,
               "title": "Ewl",
               "type": "integer"
            },
            "record_length": {
               "default": 7,
               "title": "Record Length",
               "type": "integer"
            },
            "fs": {
               "default": 8,
               "title": "Fs",
               "type": "integer"
            },
            "delay_start": {
               "anyOf": [
                  {
                     "type": "integer"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "title": "Delay Start"
            },
            "battery_cutoff": {
               "anyOf": [
                  {
                     "type": "integer"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "title": "Battery Cutoff"
            }
         },
         "title": "SDHeaderPositions",
         "type": "object"
      },
      "SectorConfig": {
         "description": "Configuration of sector layout on the SD card.\n\nFor each sector, one can retrieve the position with the attribute *_pos,\n\nExamples:\n\n    >>> sectors = SectorConfig(header=1023, config=1024, data=1025, size=512)\n    >>> sectors.header\n    1023\n    >>> # should be 1023 * 512\n    >>> sectors.header_pos\n    523776",
         "properties": {
            "header": {
               "default": 1023,
               "title": "Header",
               "type": "integer"
            },
            "config": {
               "default": 1024,
               "title": "Config",
               "type": "integer"
            },
            "data": {
               "default": 1025,
               "title": "Data",
               "type": "integer"
            },
            "size": {
               "default": 512,
               "title": "Size",
               "type": "integer"
            }
         },
         "title": "SectorConfig",
         "type": "object"
      }
   },
   "required": [
      "sectors"
   ]
}

Fields:
field buffer: BufferHeaderPositions = BufferHeaderPositions(length=0, linked_list=1, frame_num=2, buffer_count=3, frame_buffer_count=4, write_buffer_count=5, dropped_buffer_count=6, timestamp=7, data_length=8, write_timestamp=None, battery_voltage=None)#
field config: ConfigPositions = ConfigPositions(width=0, height=1, fs=2, buffer_size=3, n_buffers_recorded=4, n_buffers_dropped=5)#
field header: SDHeaderPositions = SDHeaderPositions(gain=4, led=5, ewl=6, record_length=7, fs=8, delay_start=None, battery_cutoff=None)#
field sectors: SectorConfig [Required]#
field version: str | None = None#

Not Implemented: version stored in the SD card header that indicates when this layout should be used

field word_size: int = 4#

I’m actually not sure what this is, but 4 is hardcoded a few times in the existing notebook and it appears to be used as a word size when reading from the SD card.

field write_key0: int = 226277911#
field write_key1: int = 226277911#
field write_key2: int = 226277911#
field write_key3: int = 226277911#

These don’t seem to actually be used in the existing reading/writing code, but we will leave them here for continuity’s sake :)

pydantic model miniscope_io.sdcard.SectorConfig#

Configuration of sector layout on the SD card.

For each sector, one can retrieve the position with the attribute *_pos,

Examples

>>> sectors = SectorConfig(header=1023, config=1024, data=1025, size=512)
>>> sectors.header
1023
>>> # should be 1023 * 512
>>> sectors.header_pos
523776

Show JSON schema
{
   "title": "SectorConfig",
   "description": "Configuration of sector layout on the SD card.\n\nFor each sector, one can retrieve the position with the attribute *_pos,\n\nExamples:\n\n    >>> sectors = SectorConfig(header=1023, config=1024, data=1025, size=512)\n    >>> sectors.header\n    1023\n    >>> # should be 1023 * 512\n    >>> sectors.header_pos\n    523776",
   "type": "object",
   "properties": {
      "header": {
         "default": 1023,
         "title": "Header",
         "type": "integer"
      },
      "config": {
         "default": 1024,
         "title": "Config",
         "type": "integer"
      },
      "data": {
         "default": 1025,
         "title": "Data",
         "type": "integer"
      },
      "size": {
         "default": 512,
         "title": "Size",
         "type": "integer"
      }
   }
}

Fields:
field config: int = 1024#

Holds final settings of the actual recording

field data: int = 1025#

Recording data starts here

field header: int = 1023#

Holds user settings to configure Miniscope and recording

field size: int = 512#

The size of an individual sector