tcspc_coates_correct — PHOTON spad op

• Data kinds: counts → counts

• Call: import fullseye as fs; fs.ledger.tcspc_coates_correct(hist, cycles) (implementation को सीधे call करना हो तो import photoncount; photoncount.tcspc_coates_correct(hist, cycles), registry से लेना हो तो opsphoton.get("tcspc_coates_correct"))

उपयोग

TCSPC pile-up को सटीक रूप से हटाता है (Coates का estimator) — early-photon bias।

> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।

Classical TCSPC records at most one photon per excitation cycle: the first one. Late bins are therefore starved, because the cycles in which an early photon arrived never reach them, and the measured histogram is biased toward short arrival times — a dToF depth read straight off a piled-up histogram is *too close*, and a fluorescence lifetime is *too short*.

Coates's estimator inverts that exactly. With N_k the measured counts in bin k and C the number of excitation cycles, the number of cycles that survived to reach bin k is D_k = C - sum_{j<k} N_j, the per-cycle detection probability in that bin is p_k = N_k / D_k and the pile-up-free per-cycle intensity is lambda_k = -ln(1 - p_k). This op returns C * lambda_k — the histogram the same scene would have produced if the detector could record every photon — so it is directly comparable to the measured one.

This is an exact inverse, not a linearisation: build a histogram from a known lambda through the forward model N_k = C * exp(-sum_{j<k} lambda_j) * (1 - exp(-lambda_k)) and Coates returns lambda to machine precision (measured max relative error 1.6e-15 in the tests, on a pile-up so severe that the last bin was suppressed to 14.8% of its true counts).

*hist* is the 1-D measured histogram (counts per bin); *cycles* the number of excitation cycles (laser pulses) that produced it.

Raises ValueError: negative, non-finite or non-1-D *hist*, a non-positive or non-integer *cycles*, a histogram whose total exceeds *cycles* (impossible: at most one photon per cycle — a sure sign that *cycles* is wrong or the data are not first-photon TCSPC), and any bin that consumed every remaining cycle (p_k = 1, where -ln(0) is inf).

उपयोग की विस्तृत guide

• photon_timeresolved family guide

संदर्भ (sample data, साहित्य)

• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।

• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।

• Algorithm का मानक स्रोत (लेखक, वर्ष) और उपयोग ऊपर की family usage guide में दिए गए हैं।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• photon_timeresolved — py -3.11 examples/photon_timeresolved.py

• poc_dtof_ranging — py -3.11 examples/poc_dtof_ranging.py

वे अगले ops जिनसे type जुड़ता है (counts को input के रूप में लेते हैं)

tcspc_irf_convolve · tcspc_background_subtract · tcspc_stats · dtof_depth · lifetime_fit · lifetime_phasor

इसी category के (spad)

spad_deadtime_apply · spad_deadtime_correct


*Provenance: photoncount.py — PHOTON operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.