Dans le diagramme N-Z des nucléides (voir cette page), on place un nucléide selon son numéro atomique et son nombre de masse. J’ai déjà eu l’occasion de réaliser un graphique où les nucléides sont représentés avec un code couleur indiquant leur mode de désintégration, en important les données stockées dans un fichier csv.
Ici, j’exploite les données du module mendeleev pour obtenir le même résultat. Ce module permet d’accéder à des propriétés physiques, atomiques, isotopiques des éléments.
Voici le résultat :
Avec ce module il est possible d’importer les données nécessaires sous forme de variables en tableaux de type DataFrame, un format du module pandas que j’utilise très fréquemment. La documentation de pandas est très fournie, et le temps passé à la consulter est rentabilisé si on est amené à faire de l’analyse/traitement des données pour ce genre de graphiques ou pour de la cartographie avec Geopandas.
Appel des données isotopiques en tableau
Au début du script, on insère une ligne pour importer la fonction fetch_table qui rend possible l’accès aux données de tous les nucléides rassemblées dans un tableau.
from mendeleev.fetch import fetch_table # importation de fetch_table
decaymodes = fetch_table('isotopedecaymodes') # importation des données isotopiques
La variable decaymodes contient les modes de désintégration :
id isotope_id ... is_allowed_not_observed is_observed_intensity_unknown
0 1 3 ... None None
1 2 5 ... True None
2 3 6 ... None None
3 4 8 ... None None
4 5 9 ... None None
... ... ... ... ...
5778 5779 3554 ... True None
5779 5780 3555 ... None None
5780 5781 3556 ... None None
5781 5782 3556 ... True None
5782 5783 3557 ... None None
[5783 rows x 7 columns]
Plusieurs colonnes étant inutiles, on les supprime, ce qui permettra de mieux voir les données utiles :
decaymodes = decaymodes.drop(['is_allowed_not_observed','relation','intensity', 'is_observed_intensity_unknown'], axis=1)
Remarque : la colonne intensity permettrait, si besoin, de sélectionner le mode le plus intense pour un nucléide. Ce n’est pas nécessaire ici, car seuls les principaux modes sont représentés.
decaymodes contient maintenant :
id isotope_id mode
0 1 3 B-
1 2 5 p
2 3 6 n
3 4 8 p
4 5 9 2n
... ... ...
5778 5779 3554 A
5779 5780 3555 A
5780 5781 3556 A
5781 5782 3556 SF
5782 5783 3557 A
Dans la colonne mode ,des chaînes de caractères indiquent le type de désintégration (A : alpha, SF : fission spontanée, B- ; béta -, etc). Il y a plus de lignes que de nucléides, car certains possèdent plusieurs modes de désintégration.
Les 5783 lignes correspondent aux nucléides référencés. Cependant, on n’a pas d’information pour les identifier par leur numéro atomique ou leur nombre de masse, ce qui est nécessaire pour le graphique à tracer.
Ces informations sont disponible dans le tableau appelé par :
iso = fetch_table('isotopes')
Là aussi, seules quelques colonnes sont utiles :
iso = iso[['id', 'atomic_number', 'mass_number','is_radioactive', 'abundance']]
La variable iso contient :
id atomic_number mass_number is_radioactive abundance
0 1 1 1 False 99.9855
1 2 1 2 False 0.0145
2 3 1 3 True NaN
3 4 2 3 False 0.0002
4 5 3 3 True NaN
... ... ... ... ...
3552 3553 117 293 True NaN
3553 3554 118 293 True NaN
3554 3555 117 294 True NaN
3555 3556 118 294 True NaN
3556 3557 118 295 True NaN
[3557 rows x 5 columns]
La colonne is_radioactive servira à identifier les noyaux stables.
On remarque la présence d’une colonne id ; de plus ce tableau comporte 3557 lignes, donc autant d’isotopes. Comment relier les données utiles de ce tableau (N, A, stabilité) avec celles du premier tableau (modes de désintégration) ? En remarquant dans le premier tableau une colonne isotope_id allant jusqu’à 3557, j’ai supposé que ce sont justement des données d’identification des nucléides.
Fusion de tableaux
Avec pandas, il est facile de fusionner deux tableaux ayant une colonne en commun. Ainsi on aura toutes les données utiles dans une seule variable.
Pour cela, étant donné que les deux colonnes communes ont des noms différents, je commence par créer dans chaque tableau une nouvelle colonne répliquant ces données avec un même nom d’en-têtes : ‘ident’. Ensuite je fusionne (‘merge’) les tableaux selon cette colonne commune :
decaymodes['ident'] = decaymodes.isotope_id # nouvelle colonne
iso['ident'] = iso.id # nouvelle colonne
# fusion des deux tableaux :
merge = pd.merge(decaymodes, iso, on='ident') # tableau fusionné
Le tableau merge contient (entre autres) les colonnes :
ident atomic_number mass_number mode is_radioactive abundance
0 3 1 3 B- True NaN
1 5 3 3 p True NaN
2 6 1 4 n True NaN
3 8 3 4 p True NaN
4 9 1 5 2n True NaN
... ... ... ... ... ...
5778 3554 118 293 A True NaN
5779 3555 117 294 A True NaN
5780 3556 118 294 A True NaN
5781 3556 118 294 SF True NaN
5782 3557 118 295 A True NaN
[5783 rows x 6 columns]
Fonction pour les nucléides stables
def points_stables(axe):
"""
Trace le nuage de points des isotopes stables.
Deux critères à réunir pour repérer les stables :
- non radioactifs
- abondance minimale (valeur arbitraire). Sinon, on a des noyaux
stables très loin de la courbe de stabilité centrale.
"""
stables = iso[(iso.is_radioactive == False)
&
(iso.abundance > 1e-5)]
x = stables.atomic_number
y = stables.mass_number - stables.atomic_number
axe.scatter(x, y, c=couleur_stables, **prop_points, label='stables')
Fonction pour afficher le nuage de points d’un mode de désintégration donné :
def points(mode, axe):
"""
mode : string : code du mode de désintégration.
Trace le nuage de points des nucléides pour le mode indiqué, avec
la légende.
"""
selection = merge.loc[merge['mode'] == mode]
x = selection.atomic_number
y = selection.N
couleur = decaymodes_carac_modes.loc[decaymodes_carac_modes.caractere == mode, 'couleur'].values[0]
label = decaymodes_carac_modes.loc[decaymodes_carac_modes.caractere == mode, 'label'].values[0]
axe.scatter(x, y, c=couleur, label=label, **prop_points)
Le script compressé :
Soyez le premier à commenter