Diagramme N-Z (de Segrè) des nucléides (Python)

Un code Python pour tracer ce diagramme des nucléides stables et radioactifs.

Ce code n’est pas de moi : je l’ai trouvé sur le site www.scipython.com. J’en propose ici une version en français avec des changements mineurs.

Chaque point correspond à un nucléide, placé selon son numéro atomique et son nombre de neutrons. On trouve parfois une version où les deux axes sont permutés.

Sur ce diagramme, des nucléides isotopes se trouvent sur une même ligne verticale (Z identique, N différent).

Les nucléides stables sont en noir, les autres sont dans une couleur qui reflète la valeur de leur demi-vie. Un colormap associe une couleur à une valeur de demi-vie. La barre de couleur à droite donne l’ordre de grandeur de la demi-vie (avec une échelle logarithmique).

Les noyaux stables forment un nuage de points appelé “vallée de stabilité“, autour duquel se répartissent les nucléides instables.

Pour les nucléides légers (Z < 10), la stabilité est caractérisée par N voisin de Z (carbone 12, oxygène 16…). À mesure que la taille des nucléides augmente, il faut N > Z pour assurer la stabilité. La droite N=Z (première bissectrice du graphique) sert de comparaison.

Un mot sur le code Python :

Ce code utilise les modules matplotlib (tracé de graphique) et numpy (calcul numérique). Les données sont stockées dans un fichier .txt (source) que voici :

Ce fichier contient simplement, pour chaque nucléide, la valeur de sa demi-vie en secondes.

for line in open('demi_vies.txt'):
    line = line.rstrip()
    halflife = line[10:]
    if halflife == 'None':
        continue
    fields = line[:10].split('-')
    symbol = fields[0]
    A = int(fields[1].split()[0])
    Z = int(element_symbols.index(symbol)) + 1
    N = A - Z
    halflife = float(halflife)
    if halflife < 0:
        stables.append((N, Z))
    else:
        halflives[(N, Z)] = halflife

Pour les graduations de la barre de couleur, le code convertit en seconde les durées telles que “1 heure”, “1 jour”, “1 an”… et remplace les ticklabels par des chaînes de caractère indiquant ces durées.

# The colourbar: label key times in appropriate units.
cbar = fig.colorbar(ScalarMappable(norm=norm, cmap=cmap), cax=cax)
SECS_PER_DAY = 24 * 3600
SECS_PER_YEAR = 365.2425 * SECS_PER_DAY
cbar_ticks = np.log10([1.e-9, 1.e-6, 1.e-3, 1, 60, 3600, SECS_PER_DAY,
                   SECS_PER_YEAR, 100 * SECS_PER_YEAR, 10000 * SECS_PER_YEAR])
cbar_ticklabels = ['1 ns', '1 μs', '1 ms', '1 s', '1 min', '1 heure', '1 jour',
                   '1 an', '100 ans', '10000 ans']
cbar.set_ticks(cbar_ticks)
cbar.set_ticklabels(cbar_ticklabels)

Le code Python compressé :

Une version en format A4 :


Le site suivant propose de visualiser le diagramme N-Z avec les modes de désintégration des nucléides. De plus, on peut choisir d’autres données nucléaires (excès de masse, masse atomique…). Enfin, il est possible de télécharger les données sources sous forme de fichier .csv.

C’est avec ces données que j’ai réalisé ce diagramme :

Le code Python et le fichier .csv :

Une version qui zoome sur les nucléides légers :

Soyez le premier à commenter

Laisser un commentaire