codex/third-order-correlation-postpulse-ghost.py

third-order-correlation-postpulse-ghost.py
"""Show a real delayed pulse and its opposite-delay correlation ghost.

Run from the media output directory. Tested with Python3.14, NumPy2,
and Matplotlib3; dependencies are already declared in pyproject.toml.
"""
from pathlib import Path
import numpy as np
import matplotlib.pyplot as plt

dt=0.005  # ps
t=np.arange(-8,8+dt/2,dt)
halfwidth=0.5
delay=4.0
epsilon=0.04
triangle=lambda x:np.maximum(1-np.abs(x)/halfwidth,0)
intensity=triangle(t)+epsilon*triangle(t-delay)
# For positive lag, correlate I(t+lag) against the squared gate I(t)^2.
correlation=np.correlate(intensity,intensity**2,mode='full')*dt
lags=np.arange(-(len(t)-1),len(t))*dt
middle=len(t)-1
offset=round(delay/dt)
base=np.sum(triangle(t)**3)*dt
np.testing.assert_allclose(correlation[[middle-offset,middle,middle+offset]]/base,
                          [epsilon**2,1+epsilon**3,epsilon],rtol=1e-11,atol=1e-13)
assert np.max(intensity[t<-.5])<1e-12

fig,axs=plt.subplots(1,2,figsize=(7,3.1),dpi=100,layout='constrained')
fig.set_facecolor('white')
for ax in axs:
    ax.set_facecolor('white')
    ax.set(yscale='log',ylim=(1e-5,2),xlim=(-6,6))
    ax.grid(axis='y',alpha=.2)
    ax.tick_params(labelsize=8)
axs[0].plot(t,np.where(intensity>1e-12,intensity,np.nan),color='#246a9a',lw=2)
axs[0].set(title='Actual optical intensity',xlabel='Time (ps)',ylabel='Normalized intensity')
axs[0].annotate('Postpulse:0.04',(delay,epsilon),(1.1,.3),fontsize=8,
                arrowprops={'arrowstyle':'->','color':'#333333'})
norm=correlation/correlation[middle]
axs[1].plot(lags,np.where(norm>1e-12,norm,np.nan),color='#c16a16',lw=2)
axs[1].set(title='Third-order correlation',xlabel='Delay (ps)',ylabel='Normalized signal')
axs[1].annotate('Ghost:0.0016',(-delay,norm[middle-offset]),(-5.5,.04),fontsize=8,
                arrowprops={'arrowstyle':'->','color':'#333333'})
axs[1].annotate('Real replica',(delay,norm[middle+offset]),(1.8,.35),fontsize=8,
                arrowprops={'arrowstyle':'->','color':'#333333'})
fig.savefig(Path.cwd()/'third-order-correlation-postpulse-ghost.png',facecolor='white')
plt.close(fig)