LE DIAGRAMME HR (2)

Table of Contents

Tentative pour générer un diagramme HR plus complet en utilisant un catalogue contenant plus d'étoiles.

CHOIX D'UN NOUVEAU CATALOGUE

L'article précédent a montré les limites d'un catalogue souffrant de deux faiblesses :

  • Trop peu d'étoiles.
  • Ttypes spectraux limités à G, K, M.

Afin d'enrichir le diagramme, il faut trouver un catalogue qui remplisse deux contraintes :

  • Contenir des étoiles dans les catégories O B A F G K M.
  • Fournir les magnitudes absolues pour un maximum d'étoiles.

Partant de la base de données Vizier, à l'adresse https://vizier.u-strasbg.fr/viz-bin/VizieR il est possible d'accéder au catalogue référencé par V137 D, qui contient, en particulier la magnitude absolue des étoiles.

Extended Hipparcos Compilation (XHIP) (Anderson+, 2012)

URL : https://vizier.u-strasbg.fr/viz-bin/VizieR-3?-source=V/137D/XHIP&-out.max=50&-out.form=HTML Table&-out.add=_r&-out.add=_RAJ,_DEJ&-sort=_r&-oc.form=sexa

De ce catalogue, on extrait à minima : la parallaxe, la magnitude absolue et le type spectral. À cela s'ajouteront les coordonnées équatoriales (qui semblent ajoutées systématiquement).

Le résultat obtenu, par extraction depuis la base entière est enregistré dans un fichier texte, dont on ne garde que les lignes de données (nom : V137D.txt).

Examen du fichier texte (sous Linux)

Descendant du sytème UNIX, Linux est riche en outils en ligne de commande qui sont à la fois rapides, efficaces, et économes en ressources.

  • Combien de lignes (et donc d'étoiles dans le fichier texte) ?
wc -l V137D.txt

Réponse : 117955 lignes.

Explication : wc pour word count = compter les mots d'un fichier. Quand on ajoute le paramètre -l le logiciel affiche le nombre de lignes et rappelle le nom du fichier.

  • Je voudrais voir le contenu de quelques lignes sans charger le gros fichier dans un logiciel comme Word ou Writer. Comment faire ?
cat V137D.txt | less
00 00 00.2161719 +01 05 20.433864      1         F3 V                       
00 00 01.0225739 -19 29 55.802316      2   47.79 K3 V                        5.87
00 00 01.2051118 +38 51 33.399963      3  429.40 B8V                        -1.55
00 00 02.0711543 -51 53 36.761095      4  132.53 F0 V                        2.45
00 00 02.3927878 -40 35 28.335395      5         G8 III                     
00 00 04.4856958 +03 56 47.230845      6         K7V                        
00 00 05.2824295 +20 02 10.011438      7   57.56 K0V                         5.84
00 00 06.5585788 +25 53 11.221060      8         M7e Zr0.5                  
00 00 08.4768713 +36 35 09.451546      9         G5                         
00 00 08.7397242 -50 52 01.107630     10   91.40 F6 V                        3.79
00 00 08.9609833 +46 56 23.987498     11  233.46 A2                          0.50
00 00 09.8162051 -35 57 36.798208     12         K4 III                     
00 00 10.0076601 -22 35 40.937757     13         K0 III                     
00 00 11.6216289 -00 21 37.650339     14  201.17 K0                          0.73
00 00 12.0871407 +50 47 28.266141     15         K2                         
...
00 00 20.9316249 -43 21 42.554227     28  191.51 F3/5 V                      2.42

Explication : la commande cat liste le fichier à l'écran, le | less arrête le listage quand la page écran est remplie. Lettre q pour quitter, barre d'espace pour continuer.

Remarquer que

  • Certaines lignes ne contiennent pas de magnitude absolue (information la plus à droite).
  • Quand la parallaxe est donnée (quatrième colonne de donnée (la première est 47.79)), on a également la magnitude absolue (5.87).
  • Cela semble cohérent parce que, pour calculer celle-ci, on a besoin de la distance de l'étoile au Soleil… qui se détermine avec la parallaxe.

Conséquences

  • Il va falloir éliminer les lignes qui contiennent des informations incomplètes.
  • Il serait bien d'enregistrer ce que l'on élimine pour pouvoir revenir dessus et essayer de l'exploiter (au moins d'y réfléchir).

Exemple de code

  • Chargement du fichier texte dans une liste.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import json
import random
data = open("V137D.txt", "r")
source = data.readlines()
data.close() # fermeture du fichier texte
  • Création de deux listes qui vont contenir…
    • l'une, les données retenues : utiles[]
    • l'autre: les lignes incomplètes : incompletes[]

Ces deux listes sont ensuite sauvegardées dans des fichiers .JSON.

Code utilisé :

utiles =[]
incompletes = []
for ligne in source:
    if (len(ligne) >=80) and (len(ligne[49:51].strip(" ")) > 0)  \
        and (len(ligne[74:80].strip(" ")) > 0) and not "s" in ligne :
        prov = []
        prov.append(ligne[74:80]) # mag absolue
        prov.append(ligne[49:51]) # type spectral
        utiles.append(prov)
    else:
        incompletes.append(ligne)
# ~ -- Sauvegarde des données
with open('V137_D.json',"w") as f:
    f.write(json.dumps(utiles))
with open('incompletes.json',"w") as f:
    f.write(json.dumps(incompletes))   
# ~ -- Affichage du nombre de lignes retenues et écartées    
print("Nombre de lignes retenues    : ", len(utiles))   
print("Nombre de lignes incomplètes : ", len(incompletes))

Décompte des résultats :

Nombre de lignes retenues    :  59964
Nombre de lignes incomplètes :  57991

Le rapide listage effectué au 1.1.1 le laissait suspecter : la moitié des lignes ne contient pas d'informations exploitables pour le diagramme HR.

UTILISATION D'UN DICTIONNAIRE

… au sens du langage Python.

  • Un dictionnaire permet de retrouver quasi instantanément une information associée à une clé.
  • Ici il va être utilisé pour associer un type spectral avec une température + une valeur qui sera expliquée plus tard.

Exemple :

{"O0": [40000, 1500], "O1": [38500, 1500], "O2": [37000, 1500], "O3": [35500, 1500], "O4": [34000, 1500], "O5": [32500, 1500],[...], ["M7": [2450, 150]}

Explications :

  • Le type spectral O0 est associé à 40000° kelvin et cette valeur pourra varier, en plus ou en moins de 0 à 1500°, par tirage aléatoire.
  • Le type spectral M0 est associé à 2450° kelvin et cette valeur pourra varier, en plus ou en moins de 0 à 150°, par tirage aléatoire.

Exemple de code pour la création du dictionnaire :

lettres =["O","B", "A", "F", "G", "K", "M"]
tous_spectres = [[25000, 40000],[10000, 25000], [7500, 10000] , [6000, 7500] , \
                [5000, 6000] , [3500, 5000], [2000, 3500]]
dico = {}
i = 0

# ~ Il faut mémosiser le pas dans le dictionnaire en plus de la température
for lettre in lettres:
    ligne = tous_spectres[i]
    dix_pas = ligne[1] - ligne[0]
    un_pas = int(dix_pas/10)
    for j in range(10):
        temp = ligne[1] + (j * un_pas * -1)
        dico[lettre+str(j)] = [temp, un_pas]
    i+=1
with open('temperatures2.json',"w") as f:
    f.write(json.dumps(dico))

Exemple de code pour l'utilisation

L'intention est d'associer deux fichiers préalablement créés :

  • Le fichier des lignes utiles.
  • Le fichier de dictionnaire.

Pour générer un fichier qui permettra de générer le diagramme : prepa.json Les éléments rejetés pendant cette opération sont enregistrés dans le fichier rejetes.json

Code :

with open('V137_D.json','r') as g:
    utiles = json.load(g)
with open('temperatures2.json','r') as h:
    dico = json.load(h)

prepa = []
rejetes = []
for ligne in utiles:
    spectre = ligne[1].strip(' ')
    # on récupère la liste associée au dictionnaire
    if spectre in dico :
        intermed = dico.get(spectre)
        un = intermed[0] # température "stable"
        semence = intermed[1] # valeur pour tirage aléatoire
        double = semence * 2
        plus = random.randint(1, double)
        plus = plus - semence
        element = []
        # ~ element = [ligne[0], dico.get(spectre)]
        element = [ligne[0], un + plus]
    # lister les spectres qui ne sont pas dans dico
    else:
        rejetes.append(ligne) # ils sont enregistrés pour étude
        
    prepa.append(element)

with open('prepa.json',"w") as f:
    f.write(json.dumps(prepa))
with open('rejetes.json', 'w') as g:
    g.write(json.dumps(rejetes))
    
print("nb rejetés : ", len(rejetes))

593 étoiles sont rejetées.

LE DIAGRAMME

Le code, limité au minimum, permet de générer l'image attendue.

import matplotlib.pyplot as plt

with open('prepa.json','r') as h:
    prepa = json.load(h)
    
x = []
y = []
for ligne in prepa:
    if len(ligne[0].strip(' ')) > 0:
        x.append(ligne[1])
        y.append(float(ligne[0]))

fig = plt.figure(1, figsize=(6,8)) # dimensions du cadre 
plt.plot(x, y, linestyle='none', marker = 'o', c = 'red', markersize = 1)
axes = plt.gca()
axes.set_xlim(2000,35000) # échelle des températures
axes.set_xlabel("Température")
axes.set_ylim(-15, 20)   # échelle des magnitudes 
axes.set_ylabel("Magnitude absolue")
# affiche les points dans l'ordre du diagramme HR
axes.invert_yaxis()
axes.invert_xaxis()
plt.show()

V137D1.png

Suite possible

  • Le diagramme obtenu ne ressemble pas à celui de Wikipedia. Pourquoi ?
  • Exploiter les informations qui, dans le type spectral, définissent la taille de l'étoile : naine, géante… exemple : G8 III et, dans ce cas changer la couleur du point.
  • Certains types spectraux "différents" ont été laissé de côté. Peut-on en tirer quelque chose ?

Tambouille (images dans code HTML)

https://orgmode.org/worg/org-tutorials/images-and-xhtml-export.html

Author: Alain Leraut (encouragé par Michel Brialix)

Created: 2020-04-15 mer. 17:45

Validate