Diagramme N-Z des nucléides avec LaTeX

Des données en fichier .csv mises en forme pour LaTeX

Un diagramme N-Z (aussi diagramme de Segrè, d’après Emilio Segrè) représente les nucléides stables et radioactifs sur un graphique, en portant sur les axes le nombre Z de protons et le nombre N de neutrons.

Le document ci-dessus a été obtenu avec Python (voir un précédent article), d’après les données téléchargées ici. Je propose ici de mettre en forme ces données dans un code LaTeX, avec un résultat similaire :

Le fichier de données ressemble à ça :


# 	A	Z	N	Primary Decay Mode
	1	0	1	B-=100
	1	1	0	IS=99.9855
	2	1	1	IS=0.0145
	3	1	2	B-=100
	4	1	3	n=100
	5	1	4	2n=100
	6	1	5	n(possible)0	3n(possible)0
	7	1	6	2n(possible)0
	3	2	1	IS=0.0002
	4	2	2	IS=99.9998
	5	2	3	n=100
	6	2	4	B-=100	B-d=0.000278
	7	2	5	n=100
	8	2	6	B-=100	B-n=16	B-t=0.9
	9	2	7	n=100
	10	2	8	2n=100
	3	3	0	p(possible)0
	4	3	1	p=100
	5	3	2	p=100
	6	3	3	IS=4.85
	7	3	4	IS=95.15
	8	3	5	B-=100	B-A=100
	9	3	6	B-=100	B-n=50.5
	10	3	7	n=100

Une ligne pour chaque nucléide (plus de 3500 lignes), avec indication de son mode de désintégration. “IS” indique les noyaux stables, et donne leur abondance naturelle.

  • A pour désintégration alpha
  • B- pour beta –
  • B+ pour beta +
  • n ou 2n pour émission de neutron
  • p ou 2p pour émission de proton
  • SF pour fission spontanée
  • EC pour capture électronique

Cette 4e colonne étant assez difficile à exploiter avec LaTeX, j’ai utilisé un code Python court qui collecte les données utiles dans d’autres fichiers .csv (avec le module pandas) plus facilement lisibles avec LaTeX :


import pandas as pd

Zmax=118
Nmax=179
# ----------------------------------
donnees=pd.read_csv("data_decay_mode.csv",
                    skiprows=27,
                    sep="\t",
                    usecols=[2,3,4],
                    names=['Z','N','mode']
                    )

donnees = donnees[donnees['Z'] <=Zmax]# filtrer les valeurs de Z

# Les listes suivantes accueilleront les coordonnées (Z,N) par type de désintégration
noyaux_alpha = []
noyaux_beta_m = []
noyaux_beta_p = []
noyaux_capt_e = []
noyaux_stables = []
noyaux_em_proton = []
noyaux_em_neutron = []
noyaux_fission = []

# balayage du tableau de données :
for i in donnees.index :
    type=donnees['mode'][i]
    Z = donnees['Z'][i]
    N = donnees['N'][i]
    if 'A' in type:
        noyaux_alpha.append((Z,N))
    elif 'B-' in type:
        noyaux_beta_m.append((Z, N))
    elif 'B+' in type:
        noyaux_beta_p.append((Z, N))
    elif 'EC' in type:
        noyaux_capt_e.append((Z, N))
    elif 'IS' in type:
        noyaux_stables.append((Z, N))
    elif 'SF' in type:
        noyaux_fission.append((Z, N))
    elif 'p' in type:
        noyaux_em_proton.append((Z, N))
    elif 'n' in type:
        noyaux_em_neutron.append((Z, N))
        

stables=pd.DataFrame(noyaux_stables, columns=['Z','N'])
stables.to_csv("noyaux_stables.csv", sep=';', columns=['Z','N'])

alpha=pd.DataFrame(noyaux_alpha, columns=['Z','N'])
alpha.to_csv("noyaux_alpha.csv", sep=';', columns=['Z','N'])

beta_m=pd.DataFrame(noyaux_beta_m, columns=['Z','N'])
beta_m.to_csv("noyaux_beta_m.csv", sep=';', columns=['Z','N'])

beta_p=pd.DataFrame(noyaux_beta_p, columns=['Z','N'])
beta_p.to_csv("noyaux_beta_p.csv", sep=';', columns=['Z','N'])

capt_e=pd.DataFrame(noyaux_capt_e, columns=['Z','N'])
capt_e.to_csv("noyaux_capt_e.csv", sep=';', columns=['Z','N'])

em_proton=pd.DataFrame(noyaux_em_proton, columns=['Z','N'])
em_proton.to_csv("noyaux_em_proton.csv", sep=';', columns=['Z','N'])

em_neutron=pd.DataFrame(noyaux_em_neutron, columns=['Z','N'])
em_neutron.to_csv("noyaux_em_neutron.csv", sep=';', columns=['Z','N'])

fission=pd.DataFrame(noyaux_fission, columns=['Z','N'])
fission.to_csv("noyaux_fission.csv", sep=';', columns=['Z','N'])

Les données (Z, N) sont placées dans un DataFrame (tableau de données) correspondant au mode de désintégration.

Un fichier .csv est créé pour chaque DataFrame .

Le code Python et les fichiers .csv qu’il génère :

Il suffit ensuite d’utiliser le module PGFPLOTS de LaTeX pour créer un graphique y porter les valeurs. Ici, la classe utilisée est standalone : la documentation explique comment on peut insérer ce graphique dans un document maître, et le convertir en image PNG.

\documentclass[border=0.5cm,10pt,convert={ghostscript,outext=.png,density=800x800}]{standalone}%conversion en png avec ghostscript (adapter selon l'installation)
% conversion en png : ouvrir un terminal dans le dossier de ce fichier.
% exécuter la commande xelatex -shell-escape <nom du fichier>

%COMPILé AVEC XeLaTeX

\usepackage[T1]{fontenc}
\usepackage[dvipsnames,svgnames]{xcolor}
\colorlet{c_alpha}{LimeGreen}
\colorlet{c_beta_p}{magenta}
\colorlet{c_beta_m}{CornflowerBlue}
\colorlet{c_beta_p}{Magenta}
\colorlet{c_capt_e}{yellow!50!red}
\colorlet{c_em_proton}{violet}
\colorlet{c_em_neutron}{brown}
\colorlet{c_fission}{red}
\usepackage{lmodern}
\mathcode`\.="013B%virgule décimale en mode math
\usepackage{pgfplots}\pgfplotsset{compat=newest}

\begin{document}

\newlength{\taillept}
\setlength{\taillept}{0.8pt}
	\begin{tikzpicture}
		\begin{axis}
		[xlabel=numéro atomique Z,
		ylabel=nombre de neutrons N,
		title=Diagramme N -- Z (de \textsc{Segrè}) des nucléides,
		width=11cm,height=15cm,
		xmin=0,ymin=0,xmax=120,
		ymax=180,
		legend pos=south east,
		legend image post style={scale=2},
		legend style={
			/tikz/nodes={anchor=west},
			font=\footnotesize,
 },
minor x tick num=1,minor y tick num=1,
grid = both,
		]
		\addplot [only marks, mark size=\taillept] table [col sep=semicolon,x=Z, y=N] {noyaux_stables.csv};
		\addlegendentry{stables}
		
		\addplot [only marks, mark size=\taillept, c_alpha] table [col sep=semicolon,x=Z, y=N] {noyaux_alpha.csv};
		\addlegendentry{$ \alpha $}
		
		\addplot [only marks, mark size=\taillept, c_beta_p] table [col sep=semicolon,x=Z, y=N] {noyaux_beta_p.csv};
		\addlegendentry{$ \beta^+ $}
		
		\addplot [only marks, mark size=\taillept, c_beta_m] table [col sep=semicolon,x=Z, y=N] {noyaux_beta_m.csv};
		\addlegendentry{$ \beta^- $}
		
		\addplot [only marks, mark size=\taillept, c_capt_e] table [col sep=semicolon,x=Z, y=N] {noyaux_capt_e.csv};
		\addlegendentry{capture é.}
		
		\addplot [only marks, mark size=\taillept, c_em_proton] table [col sep=semicolon,x=Z, y=N] {noyaux_em_proton.csv};
		\addlegendentry{ém. proton}
		
		\addplot [only marks, mark size=\taillept, c_em_neutron] table [col sep=semicolon,x=Z, y=N] {noyaux_em_neutron.csv};
		\addlegendentry{ém. neutron}
		
		\addplot [only marks, mark size=\taillept, c_fission] table [col sep=semicolon,x=Z, y=N] {noyaux_fission.csv};
		\addlegendentry{fission sp.}
		
		\addplot [gray, dashed, domain=0:100]{x};
		\end{axis}
	\end{tikzpicture}
\end{document}

Le code LaTeX :

Soyez le premier à commenter

Laisser un commentaire