File format

The plenoptomos toolbox comes with a suggested data format for the light-fields. This data format is meant for storing the acquired light-fields and for their exchange. It addresses the following points:

Rationale behind version 0:

  • Single light-field per file

  • Contains all the necessary metadata for interpretation of the light-field

  • Based on HDF5 and vaguely inspired by DataExchange

Convetions:

  • Arrays are to be understood in the C convention

  • (v, u) coordinates refer to positions on the main lens

  • (t, s) coordinates refer to positions on the focal plane in the image space

Tree structure:

root
 +--<attribute> = description : string -> "VoxelDataFormat"
 +--<attribute> = version : string -> "v0"
 |
 +--<group> = data
 |     |
 |     +--<dataset> = image : integer [ <p x p x n x n> | <n x n x p x p> | <np x np> | etc ]
 |     |      +-<attribute> = units : string -> "counts"
 |     |      +-<attribute> = axes : string -> [ "v:u:t:s" | "t:s:v:u" | "tau:sigma" | etc ]
 |     |      +-<attribute> = mode : string -> [ "sub-aperture" | "micro-image" | "raw" | etc ]
 |     |
 |     +--<dataset> = white : integer [ <p x p x n x n> | <n x n x p x p> | <np x np> | etc ]
 |     |      +-<attribute> = units : string -> "counts"
 |     |      +-<attribute> = axes : string -> [ "v:u:t:s" | "t:s:v:u" | "tau:sigma" | etc ]
 |     |      +-<attribute> = mode : string -> [ "sub-aperture" | "micro-image" | "raw" | etc ]
 |     |
 |     +--<dataset> = dark : integer [ <p x p x n x n> | <n x n x p x p> | <np x np> | etc ]
 |            +-<attribute> = units : string -> "counts"
 |            +-<attribute> = axes : string -> [ "v:u:t:s" | "t:s:v:u" | "tau:sigma" | etc ]
 |            +-<attribute> = mode : string -> [ "sub-aperture" | "micro-image" | "raw" | etc ]
 |
 +--<group> = instrument
 |     |
 |     +--<group> = source ?
 |     |
 |     +--<group> = camera
 |     |     +--<attribute> = manufacturer : string [optional]
 |     |     +--<attribute> = model : string [optional]
 |     |     |
 |     |     +--<group> = micro_lenses_array
 |     |     |     +--<attribute> = manufacturer : string [optional]
 |     |     |     +--<attribute> = model : string [optional]
 |     |     |     |
 |     |     |     +--<dataset> = size : integer <- number of micro-lenses
 |     |     |     |      +-<attribute> axes : string -> "tau:sigma"
 |     |     |     |
 |     |     |     +--<dataset> = position : float <- position of the center of the MLA with respect with the center of the main lens
 |     |     |     |      +-<attribute> = axes : string -> "x:y:z"
 |     |     |     |      +-<attribute> = units : string -> [ {"mm"} | "um" | "m" ]
 |     |     |     |
 |     |     |     +--<dataset> = tilts ?
 |     |     |
 |     |     +--<group> = micro_lens
 |     |     |     |
 |     |     |     +--<dataset> = size : integer <- size of each microlens in detector pixels after regularization
 |     |     |     |      +-<attribute> axes : string -> "tau:sigma"
 |     |     |     |      +-<attribute> = units : string -> "pixels"
 |     |     |     |
 |     |     |     +--<dataset> = physical_size : float <- physical size of each micro-lens
 |     |     |     |      +-<attribute> axes : string -> "t:s"
 |     |     |     |      +-<attribute> = units : string -> [ {"mm"} | "um" | "m" ]
 |     |     |     |
 |     |     |     +--<dataset> = micro_image_size : float <- footprint of each microlens over detector pixels
 |     |     |     |      +-<attribute> axes : string -> "tau:sigma"
 |     |     |     |      +-<attribute> = units : string -> "pixels"
 |     |     |     |
 |     |     |     +--<dataset> = f2 : float <- focal length of each lenslet
 |     |     |     |      +-<attribute> = units : string -> [ {"mm"} | "um" | "m" ]
 |     |     |     |
 |     |     |     +--<dataset> = aperture : float <- f-number
 |     |     |
 |     |     +--<group> = main_lens
 |     |     |     +--<attribute> = manufacturer : string [optional]
 |     |     |     +--<attribute> = model : string [optional]
 |     |     |     |
 |     |     |     +--<dataset> = pixel_size : float <- angular resolution of the main-lens
 |     |     |     |      +-<attribute> axes : string -> "v:u"
 |     |     |     |      +-<attribute> = units : string -> [ {"mm"} | "um" | "m" ]
 |     |     |     |
 |     |     |     +--<dataset> = f1 : float <- focal length of each lenslet
 |     |     |     |      +-<attribute> = units : string -> [ {"mm"} | "um" | "m" ]
 |     |     |     |
 |     |     |     +--<dataset> = aperture : float <- f-number
 |     |     |
 |     |     +--<group> = sensor
 |     |           +--<attribute> = manufacturer : string [optional]
 |     |           +--<attribute> = model : string [optional]
 |     |           |
 |     |           +--<dataset> = size : integer <- number of pixels
 |     |           |      +-<attribute> axes : string -> "tau:sigma"
 |     |           |
 |     |           +--<dataset> = pixel_size : float <- physical size of each pixel
 |     |           |      +-<attribute> axes : string -> "tau:sigma"
 |     |           |      +-<attribute> = units : string -> [ {"mm"} | "um" | "m" ]
 |     |           |
 |     |           +--<dataset> = position : float <- position of the center of the sensor with respect with the center of the main lens
 |     |           |      +-<attribute> = axes : string -> "x:y:z"
 |     |           |      +-<attribute> = units : string -> [ {"mm"} | "um" | "m" ]
 |     |           |
 |     |           +--<dataset> = tilts ?
 |     |           |
 |     |           +--<dataset> = detection parameters ? (i.e. material, thickness, quantum efficiency)
 |     |
 |     +--<group> = monochromator ? (could be used for RGB images -> split into three-channels)
 |     |
 |     +--<group> = scintillator ? (might be related/redundant to/with detection parameters in detector)
 |
 +--<group> = sample [optional]
 |     |
 |     +--<dataset> = position : float <- position of the center of the sample with respect with the center of the main lens
 |     |      +-<attribute> = axes : string -> "x:y:z"
 |     |      +-<attribute> = units : string -> [ {"mm"} | "um" | "m" ]
 |     |
 |     +--<dataset> = size : float <- size of the sample
 |     |      +-<attribute> = axes : string -> "x:y:z"
 |     |      +-<attribute> = units : string -> [ {"mm"} | "um" | "m" ]
 |     |
 |     +--<dataset> name : string
 |     |
 |     +--<dataset> description : string [optional]
 |
 +--<group> = acquisition
       |
       +--<dataset> = type : string -> [ "reflection" | "transmission" ]
       |
       +--<dataset> = exposure_time : float
              +-<attribute> = units : string -> [ {"s"} | "ms" | "us" ]