codexreactor-antineutrino-prompt-delayed-readout.py
reactor-antineutrino-prompt-delayed-readout.py
"""Original functional reactor-antineutrino readout, not a historical apparatus reproduction."""
from pathlib import Path
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle,Circle
fig,(a,b)=plt.subplots(1,2,figsize=(12.4,6),gridspec_kw={'width_ratios':[1.2,1]});fig.patch.set_facecolor('white')
fig.suptitle('One reaction, two detection times',fontsize=18,y=.97)
a.set(xlim=(-1.1,6.7),ylim=(-.8,6.1));a.axis('off')
for y,label,col in [(4.5,'Scintillator I','#d5e8f0'),(3.6,r'Water target A + CdCl$_2$','#f2e9ca'),(2.7,'Scintillator II (shared)','#d5e8f0'),(1.8,r'Water target B + CdCl$_2$','#f2e9ca'),(.9,'Scintillator III','#d5e8f0')]:
a.add_patch(Rectangle((.15,y),5.3,.65,facecolor=col,edgecolor='#526b75',lw=1.5));a.text(5.23,y+.325,label,ha='right',va='center',fontsize=10)
a.annotate('',xy=(.95,3.93),xytext=(-.8,5.75),arrowprops={'arrowstyle':'->','color':'#315f9c','lw':2});a.text(-.75,5.8,r'Reactor $\bar\nu_e$',fontsize=12)
a.add_patch(Circle((1.0,3.93),.08,color='#a3364c'))
a.annotate('',xy=(1.9,3.93),xytext=(1.15,3.93),arrowprops={'arrowstyle':'->','color':'#ae7922','lw':2});a.text(2.02,3.93,r'$n$',va='center',fontsize=13)
a.annotate('',xy=(.5,4.78),xytext=(1.0,4.03),arrowprops={'arrowstyle':'->','color':'#a3364c','lw':2})
a.annotate('',xy=(1.55,3.02),xytext=(1.0,3.83),arrowprops={'arrowstyle':'->','color':'#a3364c','lw':2})
a.text(.8,4.17,r'$e^+$',ha='right',fontsize=11,color='#a3364c')
a.text(2.8,.15,'Two target layers, three detector layers.\nSignal arrows show mechanisms, not measured tracks.',ha='center',fontsize=10,linespacing=1.5)
b.set(xlim=(-.3,6.2),ylim=(-.5,5.6));b.axis('off');b.set_title('Correlate detector pulses',fontsize=14,pad=15)
b.annotate('',xy=(5.9,1.7),xytext=(.1,1.7),arrowprops={'arrowstyle':'->','lw':1.5});b.text(6.0,1.7,'Time',fontsize=11,va='center')
b.plot([.3,.8,.8,.95,.95,2.3,2.3,2.45,2.45,5.5],[1.7,1.7,3.2,3.2,1.7,1.7,2.65,2.65,1.7,1.7],color='#a3364c',lw=2)
b.text(.85,3.65,r'Prompt $e^+$ signal',ha='center',fontsize=12)
b.text(3.6,3.25,'Delayed capture\ngamma-ray signal',ha='center',fontsize=12,linespacing=1.4)
b.annotate('',xy=(4.8,1.05),xytext=(.88,1.05),arrowprops={'arrowstyle':'<->','color':'#315f9c','lw':1.6});b.text(2.85,.6,'Accepted delay window W',ha='center',fontsize=11)
b.text(2.8,4.85,r'$\bar\nu_e+p\ \to\ e^++n$',ha='center',fontsize=16)
b.text(2.8,-.15,'Pulse heights and delays require calibration.\nUnrelated pulses can form accidental pairs.',ha='center',fontsize=11,linespacing=1.45)
fig.text(.5,.03,'Functional teaching schematic, not to scale. Pulse heights and spacings are illustrative, not historical measurements.',ha='center',fontsize=10,color='#555')
fig.subplots_adjust(left=.035,right=.97,top=.86,bottom=.13,wspace=.14)
fig.savefig(Path(__file__).with_suffix('.png').name,dpi=110,facecolor='white');plt.close(fig)