Data: input.csv has one energy column (1.196-1.606 eV, 1024 points) and 15 spectra (5-100 uW), already merged on a common energy axis. Each spectrum has a dominant PL peak near 1.33 eV, a second band near 1.54 eV and a rising edge above 1.6 eV.

Method: each spectrum was fit with a Lorentzian, y = y0 + A/(1+((x-xc)/w)^2), where A is the peak intensity and xc the peak position. A fit to the 1.2-1.47 eV window and a three-Lorentzian fit to the full spectrum (main peak + 1.54 eV band + edge) were compared. The three-Lorentzian fit is used because it separates the overlapping tails cleanly.

Results (main peak, three-Lorentzian fit): intensity rises from about 123 counts at 5 uW to about 1989 counts at 100 uW. The peak position shifts slightly blue, from 1.3180 eV to 1.3350 eV.

Allometric fit y = a * P^b (scipy curve_fit):
- Intensity vs power: a = 20.1, b = 0.990 +/- 0.019 (unweighted). The window fit gives b = 1.007 +/- 0.019, and weighting by fit errors gives 0.953 +/- 0.014. This is essentially linear in power.
- Peak position vs power: a = 1.310 eV, b = 0.0041 +/- 0.0001. The exponent is nearly zero, so the shift is a very weak blue shift of about 17 meV over the power range.

Plot data (power, intensity, intensity error, xc, xc error) for the window fit is saved in plot_data.csv. matplotlib is not installed on the server, so no image was rendered.

RESULT: b = 0.99 ± 0.02
