Modes de désintégration des radionucléides

Utiliser le module mendeleev pour cartographier les modes de désintégration.

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.

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.

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]
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

Laisser un commentaire