scene op• Data kinds: none → table (an op determined by its arguments alone — it takes no image or data input)
• Call: import fullseye as fs; fs.ledger.sensor_catalog(status: 'str' = None, maker: 'str' = None) -> 'dict' (to call the implementation directly, import optscene; optscene.sensor_catalog(status: 'str' = None, maker: 'str' = None) -> 'dict'; from the registry, opsoptics.get("sensor_catalog"))
Data sheet of real sensors (with Basler's EMVA1288 measurements).
Passing current / mature / legacy to status narrows the list. Discontinued parts that are too old are not listed. For new designs choose from status="current" (Pregius S, 2.74 µm back-illuminated).
What is listed here are "camera-side values". Since the source is Basler's table of camera measurements:
• The resolution is the pixel count that camera outputs, not necessarily all effective pixels of the sensor (makers sometimes crop the edges and make it a little lower).
• The frame rate changes with the connection interface (USB3 / GigE / 5GigE / CXP-12), so it is not held as a sensor attribute ―― which is why it is not in this table.
• QE / dark noise / full-well capacity / dynamic range / max SNR are the camera's EMVA1288 measurements (ace / ace 2 / boost). They are not theoretical values of the sensor alone but include the implementation, so with a different camera they change a little.
• Pixel pitch, shutter type and generation come from the sensor, so they do not move when the camera changes.
Camera makers that build their own sensors cannot be listed here (Canon / Photron / Vision Research (Phantom) / Teledyne DALSA / some of Hamamatsu). They cannot be looked up by model number, because the camera's datasheet is the only source. Some have pixel pitches an order of magnitude apart (Phantom's high-sensitivity models 28 µm, Pregius S 2.74 µm), and both the F-number at which diffraction limits and the full-well capacity change by an order of magnitude, so pass the real device's values directly to sensor_spec.
What changes between generations shows up in the full-well capacity: Pregius 1st has 31.8 ke-, which is 3 times the 2nd (10.4 ke-). This is the price of shrinking the pixel from 5.86 µm to 3.45 µm. Pregius S (2.74 µm) keeps 9.7 ke-, on par with the 2nd (back-illuminated).
Makers other than Sony (selectable with maker) are taken from the same table, so they can be compared side by side with the same measurement method:
• onsemi XGS (3.2 µm) is at its best in large formats, APS-C / 35 mm. Sony has no such format.
• onsemi PYTHON (4.8 µm) is small and fast, but its dark noise is 11-12 e-, 5 times that of Pregius. This matters in dark scenes.
• Gpixel GMAX (2.5 µm) sells on dark noise of the 1 e- class (GMAX2505/2509). Its full-well capacity is small at 4-5 ke-, so the dynamic range is about the same at 70 dB. GMAX3265 is 65 MP (9344x7000); for ultra-high resolution it is the only option.
• ams CMV (5.5 µm) has a large full-well capacity, but in exchange its dark noise is also 14 e-.
Every optics op validates its input before computing (nothing slips through silently):
• Units are baked into the argument name — _mm / _um / _deg / _mrad. Confusing mm with µm does not crash; it yields a plausible-looking wrong answer, so the name prevents it. Nothing here guesses the unit from the magnitude.
• Strings raise ValueError — float('50') succeeds, so an unparsed configuration value would slip through as a length (measured: thin_lens('50', '200') returned a plausible 66.667 mm). bool is refused too, as the implicit promotion True == 1.
• complex / masked arrays raise ValueError (real-valued slots only; silently dropping the imaginary part or peeling off the mask is refused). NaN/Inf raises ValueError on every input.
• Division by zero and its relatives are refused by name: focal length 0, radius of curvature 0, refractive index <= 0, a fully opaque aperture (all zeros, so the normalisation is 0/0), a PSF whose sum is <= 0, a Stokes vector with S0 = 0, and an object sitting at the front focal point (the image is at infinity).
• Only two ops return a non-finite value, and both state it as a contract: depth_of_field returns far_mm = inf beyond the hyperfocal distance (that is what the hyperfocal distance means), and gaussian_beam returns wavefront_radius_mm = inf at the waist (the radius of curvature of a plane wavefront). Both also return a finite companion (far_is_infinite / curvature_per_mm). Any other silent NaN/Inf is detected internally and raises ValueError — "float64 overflowed" and "the answer is infinite" are different claims, so the first is never returned wearing the face of the second.
• Size caps: generated grids are capped by optics.MAX_GRID (4096); supplied fields/PSFs/apertures by optics.MAX_FIELD_ELEMENTS (2^24); ABCD element chains by optics.MAX_SYSTEM_ELEMENTS (1024); Zernike by MAX_ZERNIKE_TERMS (512) / MAX_ZERNIKE_ORDER (40) / MAX_ZERNIKE_BASIS (2^25). This closes, fail-closed, the paths where a small argument triggers a huge internal allocation (measured: n_max=40 × 4096² needs 108 GB).
• Physically impossible states are refused too: a Stokes vector with degree of polarisation > 1, negative transmittance, negative intensity, and invalid Zernike indices such as n-|m| odd.
• dataset_conventions — Training-dataset conventions — COCO / YOLO / VOC and pitfalls in visual inspection
• mv_cameras — Industrial camera makers (sensor mapping, line scan / TDI)
• mv_illumination_practice — Lighting in practice — wavelength, polarisation, drive modes, ambient light, safety
• mv_image_sensors — Industrial image sensors (mainly current products)
• virtual_machine_vision — Virtual machine vision — enumerating the parameters and an object model
• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).
• Operator provenance and references — the sources of the research/methods this op family came from.
• The canonical algorithm (author, year) and its uses are named in the family usage guide above.
• vision_layout_from_catalog — py -3.11 examples/vision_layout_from_catalog.py
table as input)abcd_matrix · wavefront_stats · sfr_from_edge · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd
scene)scene_material · scene_plane · scene_sphere · scene_box · scene_cylinder · surface_defect · surface_finish · random_defects
*Provenance: optscene.py — OPTICS operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.