Nucleus of a (lead) isotope:
Lead-lead (PbPb) collisions at the LHC with electromagnetic fields (note Lorentz-contraction):
Indicating the impact parameter:
Main idea
At first I tried randomly assigning an angle and radius (sampling sqrt((rand+1)/2) for uniform distribution along the radius):
This did not fill up so evenly as I wanted, so I tried to generate the nucleons uniformly on ring layers using polar coordinates:
Adding a bit of random offsets to the angle and radius in the polar coordinate:
Randomly shuffling the nucleons along the rings so the overlap of consecutive balls is not regular, and the even/odd coloring looks more random:
The rings have constant distance between them because each ring's radius is set with a simple linear equation of the form r=R*i/N. To make the nucleus look more like a 3D sphere, we can gradually pull the outers rings closer together by reducing the ring radius quadratically: r'=r-C*r^2 for some tunable parameter C ~ 0.2:
% Author: Izaak Neutelings (March 2024)
% Description: Lead-lead collisions
\documentclass[border=3pt,tikz]{standalone}
\usepackage{amsmath}
\usepackage{listofitems} % to create arrays with \readlist
\usepackage{ifthen} % for \whiledo
%\usetikzlibrary{arrows.meta} % for arrow size
% COLORS
\colorlet{myred}{red!75!black}
\colorlet{myblue}{blue!70!black}
% STYLES
\tikzset{
>=latex, % for LaTeX arrow head
ball/.style={ultra thin,draw=black,fill=\getcol{#1},
circle,inner sep=1pt,minimum size=15pt,scale=0.8},
ball/.default=1,
}
\def\getcol#1{\ifodd#1 blue!20 \else red!20 \fi}
\def\drawgrid#1{
\pgfmathsetmacro\xmax{ceil(#1)+0.6}
\pgfmathsetmacro\xmin{0.3-\xmax}
\draw[black!20] (\xmin,\xmin) grid (\xmax,\xmax);
\draw[thick,->] (\xmin,0) -- (\xmax,0);
\draw[thick,->] (0,\xmin) -- (0,\xmax);
\draw[black!20] (0,0) circle(#1);
}
\begin{document}
% NUCLEUS - random radius & angle
\def\R{2.0}
\def\Nlay{5} % number of rings/layers
\def\N{100}
\begin{tikzpicture}
\drawgrid{\R}
% NUCLEUS
\foreach \i [evaluate={
\r=\R*sqrt((rand+1)/2); % ball radius
\a=180*rand % ball angle
}] in {1,...,\N}{
\node[ball=\i] at (\a:\r) {\i};
}
\end{tikzpicture}
% NUCLEUS - uniform rings
\begin{tikzpicture}
\message{^^JNucleus with uniform rings}
\drawgrid{\R}
% NUCLEUS
\foreach \lay [evaluate={
\r=\R*\lay/\Nlay; % ring radius
\Nring=int(round(2*\lay*\N/(\Nlay*(\Nlay+1)))) % number of balls per ring
}] in {\Nlay,...,1}{
\message{^^J N=\N, Nlay=\Nlay, Nring=\Nring, r=\r}
\foreach \i [evaluate={
\a=360*(\i/\Nring); % ball angle
}] in {1,...,\Nring}{
\node[ball=\i] at (\a:\r) {\i};
}
}
\end{tikzpicture}
% NUCLEUS - uniform rings + random offset
\begin{tikzpicture}
\message{^^JNucleus with uniform rings + random offset}
%\def\R{1.8}
\drawgrid{\R}
% NUCLEUS
\foreach \lay [evaluate={
\r=\R*(\lay-0.1)/\Nlay; % ring radius
\aR=3*rand; % angular offset
\Nring=int(round(2*\lay*\N/(\Nlay*(\Nlay+1)))) % number of balls per ring
}] in {\Nlay,...,1}{
\message{^^J N=\N, Nlay=\Nlay, Nring=\Nring, r=\r}
\foreach \i [evaluate={
\aB=\aR+360*(\i/\Nring)+2*rand/\Nring; % ball angle plus random offset
\rB=\r+0.04*rand % ball radius plus random radial offset
}] in {1,...,\Nring}{
\node[ball=\i] at (\aB:\rB) {\i};
%\fill[red] ({\aR+360*(\i/\Nring)}:\r) circle(0.5pt);
}
}
\end{tikzpicture}
% NUCLEUS - shuffle balls
\def\shufflelist#1{
%\message{^^JShuffle list}
\pgfmathsetmacro\tmplist{random(1,#1)} % first random item
\readlist*\shuffledlist\tmplist % convert to array
\newboolean{unique}
\whiledo{\shuffledlistlen<#1}{ % try until list is of length \N=#1
\pgfmathsetmacro\rx{random(1,#1)} % generate new random item
\setboolean{unique}{true}
\foreachitem \x \in \shuffledlist{ % loop over previous elements
\ifnum \x=\rx % look if new number in list
\setboolean{unique}{false} % already in list
\breakforeach
\fi
}
\ifthenelse{\boolean{unique}}{ % found unique item !
\xdef\tmplist{\tmplist,\rx} % add new unique item
\readlist*\shuffledlist\tmplist % convert to array
}{}
}
}
\begin{tikzpicture}[xscale=1]
\message{^^JNucleus with shuffling balls}
%\def\R{1.8}
\drawgrid{\R}
\pgfmathsetseed{1234567890}
% NUCLEUS
\foreach \lay [evaluate={
\r=\R*(\lay-0.1)/\Nlay; % ring radius
\aR=3*rand; % angular offset
\Nring=int(round(2*\lay*\N/(\Nlay*(\Nlay+1)))) % number of balls per ring
}] in {\Nlay,...,1}{
\message{^^J N=\N, Nlay=\Nlay, Nring=\Nring, r=\r}
\shufflelist{\Nring} % get shuffled list of sequence 1,...,\Nring
\foreach \i [evaluate={
\is=int(\shuffledlist[\i]); % shuffled index
\aB=\aR+360*(\is/\Nring)+2*rand/\Nring; % ball angle plus random offset
\rB=\r+0.04*rand % ball radius plus random radial offset
}] in {1,...,\Nring}{
\message{^^J is=\is, i=\i, a=\aB}
\node[ball=\i] at (\aB:\rB) {\i};
%\fill[red] ({\aR+360*(\i/\Nring)}:\r) circle(0.5pt);
}
}
\node[ball=\i] at (0,0) {0}; % cover hole
\end{tikzpicture}
% NUCLEUS - 3D effect
\begin{tikzpicture}[xscale=1]
\message{^^JNucleus with 3D effect}
%\def\R{1.8}
\drawgrid{\R}
\pgfmathsetseed{1234567890}
% NUCLEUS
\pgfmathsetmacro\C{min(1/(4*\R),0.11)} % put balls at edges closer in to create 3D ball effect
\pgfmathsetmacro\D{1-4*\C*\R} % discriminant
\message{^^J R=\R, C=\C, D=1-4cR=\D (must be >0)}
\pgfmathsetmacro\Rs{2*\R/(1+sqrt(\D)} % scaled total radius
\foreach \lay [evaluate={
\r=\Rs*(\lay-0.1)/\Nlay; % ring radius
\rC=\r-\C*\r*\r; % reduce outer radii to create 3D effect
\aR=3*rand; % angular offset
\Nring=int(round(2*\rC*\N/(\Rs*(\Nlay+1)*(1-\C*\Rs*(2*\Nlay+1)/(3*\Nlay))))) % number of balls on this ring
}] in {\Nlay,...,1}{
\message{^^J N=\N, Nlay=\Nlay, Nring=\Nring, r=\r}
\shufflelist{\Nring} % get shuffled list of sequence 1,...,\Nring
\foreach \i [evaluate={
\is=int(\shuffledlist[\i]); % shuffled index
\aB=\aR+360*(\is/\Nring)+2*rand/\Nring; % ball angle plus random offset
\rB=\rC+0.05*rand % ball radius plus random radial offset
}] in {1,...,\Nring}{
\message{^^J is=\is, i=\i, a=\aB}
\node[ball=\i] at (\aB:\rB) {\i};
%\fill[red] ({\aR+360*(\i/\Nring)}:\r) circle(0.5pt);
}
}
\node[ball=\i] at (0,0) {0}; % cover hole
\end{tikzpicture}
\end{document}Full code
Edit and compile if you like:
% Author: Izaak Neutelings (March 2024)
% Description: Lead-lead collisions
% Inspiration: https://arxiv.org/abs/2010.07855
\documentclass[border=3pt,tikz]{standalone}
\usepackage{listofitems} % to create arrays with \readlist
\usepackage{ifthen} % for \whiledo
\usepackage{siunitx} % for \SI
\usetikzlibrary{decorations.pathmorphing} % for snake, coil, zigzag
% COLORS
\colorlet{protoncol}{red!68!black!80}
\colorlet{neutroncol}{green!68!black!80}
\colorlet{photoncol}{yellow!85!orange!95!black}
% STYLES
\tikzset{
>=latex, % for LaTeX arrow head
vector/.style={->,thick,green!60!black},
photon/.style={->,line width=0.7,line cap=round,photoncol,decorate,decoration={
snake,amplitude=.4mm,segment length=2.2mm,post length=1.5mm}
},
ball/.style={
circle,draw=none,ball color=#1,postaction={
fill=#1,fill opacity=0.8,draw=#1!40!black,line width=0.04}
},
ball/.default=protroncol,
pics/nucleus/.style={%
code={%
\fill[protoncol] (0,0) circle(0.86*\R); % background to fill any holes
\pgfmathsetmacro\Rball{0.18*\R} % ball radius
\pgfmathsetmacro\Rcorr{\R-\Rball} % subtract ball radius
\pgfmathsetmacro\C{min(1/(4*\Rcorr),0.24)} % put balls at edges closer in to create 3D ball effect
\pgfmathsetmacro\D{1-4*\C*\Rcorr} % discriminant
\pgfmathsetmacro\Rs{2*(\Rcorr)/(1+sqrt(\D)} % scaled total radius
\message{^^J R=\R, R=\Rcorr, Rs=\Rs, C=\C, D=1-4cR=\D (must be >0)}
\foreach \lay [evaluate={
\r=\Rs*(\lay-0.05)/\Nlay; % ring radius
\rC=\r-\C*\r*\r; % reduce outer radii to create 3D effect
\aR=3*rand; % random angular offset
\Nring=int(round(2*\rC*\N/(\Rs*(\Nlay+1)*(1-\C*\Rs*(2*\Nlay+1)/(3*\Nlay))))) % number of balls on this ring
}] in {\Nlay,...,1}{
\message{^^J N=\N, Nlay=\Nlay, Nring=\Nring, r=\r}
\shufflelist{\Nring} % get shuffled list of sequence 1,...,\Nring
\foreach \i [evaluate={
\p=(rand+1)/2<0.39?1:0; % 0: neutron, 1: proton
\is=int(\shuffledlist[\i]); % shuffled index
\aB=\aR+360*(\is/\Nring)+2*rand/\Nring; % ball angle plus random offset
\rB=\rC+0.04*rand % ball radius plus random radial offset
}] in {1,...,\Nring}{
%\message{^^J is=\is, i=\i, a=\aB, p=\p}
\fill[ball=\ifodd\p protoncol\else neutroncol\fi]
(\aB:\rB) circle(\Rball);
}
}
\fill[ball=protoncol] (0,0) circle(\Rball);
\foreach \ang in {0,60,90,120,180,-60,-90,-120}{
\coordinate (-\ang) at (\ang:\R+1.3*\Rball);
}
}
}
}
\def\shufflelist#1{ % get shuffled list of sequence 1,...,#1
%\message{^^JShuffle list}
\pgfmathsetmacro\tmplist{random(1,#1)} % first random item
\readlist*\shuffledlist\tmplist % convert to array
\newboolean{unique}
\whiledo{\shuffledlistlen<#1}{ % try until list is of length = #1
\pgfmathsetmacro\rx{random(1,#1)} % generate new random item
\setboolean{unique}{true}
\foreachitem \x \in \shuffledlist{ % loop over previous elements
\ifnum \x=\rx % look if new number in list
\setboolean{unique}{false} % already in list
\breakforeach % stop looking and try again in next iteration
\fi
}
\ifthenelse{\boolean{unique}}{ % found unique item !
\xdef\tmplist{\tmplist,\rx} % add new unique item
\readlist*\shuffledlist\tmplist % convert to array
}{}
}
}
\begin{document}
% Pb nucleus
\def\N{85} % number of nucleons
\def\R{1.0} % nucleus radius
\def\Nlay{5} % number of rings/layers
\begin{tikzpicture}
\message{^^J Pb nucleus}
% NUCLEUS
\pic {nucleus};
\end{tikzpicture}
% Pb-Pb collision
\def\xs{0.25} % horizontally scale
\def\Rp{0.92} % length photon
\def\D{3.7} % horizontal distance between nuclei
\pgfmathsetmacro\H{2.30*\R} % vertical distance between nuclei
\pgfmathsetmacro\v{0.25*\D} % length vector
\begin{tikzpicture}
\message{^^J PbPb collision}
% NUCLEUS
\pic[xscale=\xs] (L) at (-\D/2, \H/2) {nucleus};
\pic[xscale=\xs] (R) at ( \D/2,-\H/2) {nucleus};
% VELOCITY VECTORS
\draw[vector] (L-0)++(2pt,0) --++ (\v,0) node[above=2pt] {$v\approx c$};
\draw[vector] (R-180)++(-2pt,0) --++ (-\v,0) node[above=2pt] {$v\approx c$};
% PHOTONS
\foreach \ang in {60,90,120,-60,-90,-120}{
\draw[photon] (L-\ang) --++ (\ang:\Rp);
\draw[photon] (R-\ang) --++ (\ang:\Rp);
}
\end{tikzpicture}
% Pb-Pb collision with impact parameter
\begin{tikzpicture}
\message{^^J PbPb collision with impact parameter}
% NUCLEUS
\pic[xscale=\xs] (L) at (-\D/2, \H/2) {nucleus};
\pic[xscale=\xs] (R) at ( \D/2,-\H/2) {nucleus};
% VELOCITY VECTORS
\draw[vector] (L-0)++(2pt,0) --++ (\v,0); %node[above=2pt] {$v\approx c$};
\draw[vector] (R-180)++(-2pt,0) --++ (-\v,0); %node[above=2pt] {$v\approx c$};
% PHOTONS
\foreach \ang in {60,90,120,-60,-90,-120}{
\draw[photon] (L-\ang) --++ (\ang:\Rp);
\draw[photon] (R-\ang) --++ (\ang:\Rp);
}
% MEASURES
\draw[<->,thick]
(R-0)++(0.3*\R,0) --++ (0,\R) node[midway,right] {$R\sim\SI{7}{fm}$};
\draw[<->,thick]
(0,-\H/2) -- (0,\H/2) node[midway,right] {$b$};
\node at (0.3*\D,0.7*\H) {$b > 2R$};
\end{tikzpicture}
\end{document}Click to download: PbPb_collisions.tex • PbPb_collisions.pdfOpen in Overleaf: PbPb_collisions.tex.
See also: Original Source by Izaak Neutelings
Note: The copyright belongs to the blog author and the blog. For the license, please see the linked original source blog.
Leave a Reply
You must be logged in to post a comment.