Method: input.csv holds one PL spectrum per excitation power (5-100 uW, 15 columns) on a common energy axis (1.196-1.606 eV). Each spectrum was fitted with a Lorentzian A/(1+((E-xc)/w)^2) plus a linear background over the main peak window 1.22-1.46 eV (scipy curve_fit). The peak near 1.55-1.6 eV at the window edge was excluded.

Lorentzian results: peak intensity rises from ~117 (5 uW) to ~1962 (100 uW); peak position xc shifts from 1.317 eV to 1.3348 eV (blue shift).

Allometric fit y = a * P^b (unweighted least squares):
- Intensity vs power: a = 18.7, b = 1.002 ± 0.019 (roughly linear). Fit-error-weighted gives b = 0.958 ± 0.002; window variations 1.20-1.45 and 1.25-1.42 give b = 1.004 and 1.002 (unweighted).
- Peak position vs power: a = 1.3087 eV, b = 0.0043 ± 0.0001 (very weak power-law blue shift).

Plots (intensity vs power, position vs power, each with the allometric fit) could not be rendered because matplotlib is not installed on the server; the fitted values behind them are given above and in fit.py.

RESULT: b = 1.002 ± 0.019
