Announcing TamboUI

17 February 2026

Tags: tamboui tui java

Note

This blog post is co-authored by Cédric Champeau (Micronaut) and Max Rydahl Andersen (Quarkus), and cross-posted on our respective personal blogs.

Today we are excited to announce TamboUI, an open-source Terminal UI framework for the Java ecosystem!

The terminal is having a renaissance.

AI coding tools live there. Developer workflows are increasingly CLI-first again. Rust has Ratatui. Python has Rich and Textual, Go has Charm, Typescript has OpenTUI. But Java, despite its performance, maturity, and tooling, didn’t have a modern, composable, developer-friendly TUI framework.

We thought that should change.

How it started

TamboUI (pronounced like the french word “tambouille”, slang for "cooking up something" or "makeshift creation") was born a bit by accident: a couple months ago, Cédric was asking about which TUI libraries that tools like Claude Code were using. Max Andersen answered that most likely this was Ratatui, a framework written in Rust. Both thought that it was a bit sad that there was no such library for Java.

A few weeks later, Cédric did an experiment by asking AI (Claude Code) to port Ratatui to Java. The result was fairly impressive, and the beginning of a collaboration that led to the creation of TamboUI. In fact, Max gave you a hint last year that this was going to happen.

That said, TamboUI is not a Ratatui port nor is it a Textual port. We’ve put a lot of effort in going beyond the initial AI generated port. The library was designed with Java developers in mind, inspired by the good things found in other ecosystems’ approach to TUI frameworks. It offers a multi-layer API: from low-level widget primitives (like Ratatui), to a managed TUI layer with event handling, up to a declarative Toolkit DSL that handles the event loop and rendering thread for you—things that Ratatui doesn’t really cover. This brings the power of Ratatui, Textual or Rich to the Java ecosystem, with the Java touch!

Not only that, TamboUI is also GraalVM native compatible! This means that you can compile your Java TUI applications as native binaries, making Java a first class citizen in terminal applications development, with low memory footprints and fast startup!

If you want to give it a try, the easiest is to run our demos using JBang:

jbang demos@tamboui

Try it out

At this stage, the APIs are still unstable and subject to change. TamboUI is developed with the mindset of being framework-agnostic and having as few external dependencies as possible. You can choose between several backends like JLine, Aesh or the built-in Panama backend. By choosing the latter, you’ll get the best performance while not depending on any external library.

Whether you want to build:

  • a standalone CLI tool

  • an internal developer tool

  • a DevOps utility

  • add a TUI frontend to existing Java tool

  • an AI agent

  • or something entirely new

Give TamboUI a try and let us know what worked and what could be improved!

Check out the documentation at https://tamboui.dev/docs/main/, join us on Zulip, or browse the source on GitHub. We’d love your feedback and contributions!

Acknowledgments

We would like to thank the following people for their ideas, suggestions and contributions to the creation of first public release of TamboUI (in alphabetical order):

  • Andres Almiray

  • Charles Moulliard

  • Claus Ibsen

  • Graeme Rocher

  • Guillaume LaForge

  • James Cobb

  • Ståle Pedersen

  • Tako Schotanus

and of course to the Ratatui and Textual creators for their inspiration and work.

Max Rydahl Andersen & Cédric Champeau

Mesurer la rotation différentielle solaire avec JSol’Ex

05 February 2026

Tags: solex jsolex solaire astronomie doppler rotation

Une boule de plasma en rotation

L’un des aspects fascinants du Soleil est qu’il ne tourne pas comme un corps solide. Contrairement à la Terre, qui effectue une rotation en 24 heures quelle que soit la latitude, la vitesse de rotation du Soleil varie avec la latitude : l’équateur tourne plus vite que les pôles. Ce phénomène, appelé rotation différentielle, est étudié depuis le 19ème siècle et reste un sujet de recherche important en physique solaire.

Les régions équatoriales du Soleil effectuent une rotation en environ 25 jours, tandis que près des pôles, cela prend environ 35 jours. Cette rotation différentielle joue un rôle clé dans le mécanisme de dynamo solaire qui génère le champ magnétique du Soleil et pilote le cycle solaire de 11 ans.

Concept de rotation différentielle

Dans cet article, je vais expliquer comment j’ai ajouté une fonctionnalité dans JSol’Ex 4.5.0 qui permet aux astronomes amateurs de mesurer cette rotation différentielle directement à partir d’un scan obtenu avec un spectrohéliographe. Une erreur fréquente est de penser que cette mesure n’est pas possible parce que la dispersion spectrale d’un spectrographe comme le Sol’Ex est typiquement d’environ 0.1 à 0.2 Å, c’est-à-dire plus grand que l’échelle de ce que nous essayons de mesurer (2 km/s, soit environ 0.04 Å). En pratique, nous devrons obtenir une précision sub-pixellaire et cet article explique comment y arriver.

L’effet Doppler

Le principe derrière la mesure est simple : l'effet Doppler. Quand une source lumineuse se déplace vers nous, la longueur d’onde est décalée vers le bleu du spectre (blueshift). Quand elle s’éloigne, la longueur d’onde se décale vers le rouge (redshift).

Puisque le Soleil tourne, un limbe se déplace toujours vers nous (le limbe Est) tandis que l’autre s’éloigne (le limbe Ouest). En mesurant le décalage de longueur d’onde d’une raie spectrale aux deux limbes, nous pouvons calculer la vitesse de rotation.

Effet Doppler pour mesurer la rotation solaire

On pourrait se demander ce qu’il en est du mouvement propre de la Terre : nous orbitons autour du Soleil à environ 30 km/s, ce qui est bien plus grand que la vitesse de rotation solaire d’environ 2 km/s que nous essayons de mesurer. Ce mouvement orbital produit effectivement un décalage Doppler de tout le spectre solaire. Cependant, cet effet s’applique de manière égale à tous les points que nous pouvons mesurer : en d’autres termes, puisque tout le spectre est décalé de manière uniforme, tout s’annule. Il en va de même pour toute vitesse radiale du Soleil par rapport à la Terre (qui varie légèrement tout au long de l’année car l’orbite de la Terre est elliptique).

La formule fondamentale reliant le décalage Doppler à la vitesse est :

\[\frac{\Delta\lambda}{\lambda_0} = \frac{v}{c}\]

Où :

  • \(\Delta\lambda\) est le décalage en longueur d’onde (ce qu’on cherche à mesurer)

  • \(\lambda_0\) est la longueur d’onde au repos de la raie spectrale (typiquement la longueur d’onde H-alpha)

  • \(v\) est la vitesse le long de la ligne de visée

  • \(c\) est la vitesse de la lumière (299 792 km/s)

La méthodologie de mesure

Travaux antérieurs

Je ne suis pas la première personne à essayer de faire cette mesure en spectrohéliographie amateur. En 2017, Peter Zetner a expliqué sur CloudyNights comment mesurer la vitesse différentielle en utilisant un spectrohéliographe. Il a expliqué cette méthodologie en profondeur dans le livre Astronomie solaire - Observer, photographier et étudier le Soleil. Sa méthodologie repose sur des mesures utilisant la raie Na D2. mais peut aussi être appliquée sur d’autres raies brillantes incluant la raie Fe I couramment utilisée à 5250.2 Å, et implique de comparer les intensités des pixels, en les moyennant à différentes latitudes. Les résultats sont meilleurs en effectuant plusieurs scans et en moyennant les données. Bien que cela fonctionne, je voulais essayer une méthodologie différente :

  1. Utiliser un seul scan : les images Doppler que JSol’Ex ou INTI peuvent produire sont en général très cohérentes et montrent que toutes les données dont nous avons besoin sont déjà présentes

  2. Éviter les intensités de pixels : celles-ci sont très sensibles à l’assombrissement centre-bord, aux conditions d’observation (par exemple les nuages, même fins) ou au vignetage (assombrissement des images le long de la fente)

  3. Rendre possible l’utilisation de scans H-alpha, non pas parce qu’ils donneraient une valeur précise de la vitesse du plasma de la photosphère, mais parce que c’est la raie la plus largement imagée dans les observations solaires amateurs

Les résultats, bien sûr, dépendront de la raie observée. La méthodologie que je décris ci-dessous est capable de retourner des résultats raisonnables sur plusieurs raies (H-alpha, Na D2. Fe I) mais échouera complètement sur certaines autres (par exemple Ca II K, typiquement parce que la raie est trop large).

Plongeons-nous dans la méthodologie.

Note
L’implémentation décrite ici a été développée de manière itérative basée sur des observations réelles. Je ne suis pas physicien solaire, juste un ingénieur essayant d’extraire des données significatives des captures de spectrohéliographe. L’algorithme fonctionne raisonnablement bien en pratique mais devrait être validé par rapport à des mesures professionnelles pour toute application scientifique. C’est pourquoi cette fonctionnalité est annoncée comme expérimentale.

Comparaison des limbes Est-Ouest

La clé pour comprendre la méthodologie est qu’elle repose sur l’analyse et l’ajustement de profils de raies spectrales. Elle nécessite d’extraire les profils de raies spectrales à différents endroits du disque solaire, de préférence près des limbes où les vitesses sont les plus élevées (plus on s’approche du méridien solaire, plus les vitesses sont faibles et donc difficiles à détecter).

La mesure de rotation différentielle extrait les vitesses de rotation solaire en comparant les décalages Doppler entre les points des limbes Est et Ouest à la même latitude héliographique.

Profils spectraux décalés

Pour chaque latitude (par exemple, 20° Nord), l’algorithme :

  1. Sélectionne un point sur le limbe Est

  2. Sélectionne le point correspondant sur le limbe Ouest à la même latitude

  3. Mesure la position de la raie spectrale à chaque point

  4. Calcule la différence : Ouest - Est

Cette approche différentielle a un avantage crucial : elle annule les erreurs systématiques. Tout décalage instrumental, erreur de calibration en longueur d’onde, ou décalage de référence affecte les deux mesures de manière égale et disparaît quand nous prenons la différence.

Cependant, une seule mesure Est-Ouest à chaque latitude n’est pas assez fiable. Les conditions de seeing, l’activité solaire locale, ou les erreurs d’ajustement peuvent corrompre les mesures individuelles. Pour améliorer la précision, JSol’Ex échantillonne plusieurs longitudes à travers la région du limbe (typiquement 14 points de 62° à 88° de longitude) et agrège ces mesures. Cette redondance permet de rejeter les valeurs aberrantes et fournit une estimation d’erreur basée sur la cohérence des mesures.

La vitesse mesurée est alors :

\[v_{measured} = \frac{\Delta\lambda}{\lambda_0} \times \frac{c}{2}\]

Le facteur 2 apparaît parce que nous mesurons la différence entre les limbes s’approchant et s’éloignant.

De la vitesse mesurée à la vitesse équatoriale

La vitesse que nous mesurons dépend de la géométrie : quelle fraction de la vitesse de rotation est projetée le long de notre ligne de visée. À l’équateur et au limbe, nous voyons la vitesse de rotation complète. À des latitudes plus élevées ou plus près du centre du disque, nous n’en voyons qu’une fraction.

Le facteur de correction géométrique est :

\[v_{equatorial} = \frac{v_{measured}}{\cos(\phi) \times \sin(\theta)}\]

Où :

  • \(\phi\) est la latitude héliographique

  • \(\theta\) est la longitude héliographique (0° au centre du disque, ±90° aux limbes)

Trouver le centre de la raie spectrale

La partie la plus difficile de la mesure est de déterminer précisément le centre de la raie d’absorption. Un décalage de seulement 0.01 Å correspond à une vitesse d’environ 0.5 km/s, ce qui est significatif par rapport à la vitesse équatoriale typique d’environ 2 km/s.

JSol’Ex utilise l'ajustement de profil de Voigt pour mesurer le centre de la raie. Le profil de Voigt est la convolution d’un profil gaussien et d’un profil lorentzien, qui modélise précisément la forme des raies d’absorption solaires. La composante gaussienne représente l’élargissement Doppler thermique, tandis que la composante lorentzienne représente l’élargissement naturel et de pression.

Pour chaque point de mesure, l’algorithme :

  1. Extrait un profil spectral du fichier SER à la position correspondante

  2. Ajuste un profil de Voigt à la raie d’absorption

  3. Enregistre la position du centre de raie ajustée

Le paramètre configurable "demi-largeur d’ajustement de Voigt" (par défaut : 2 Å) contrôle quelle proportion des ailes de la raie sont incluses dans l’ajustement.

Systèmes de coordonnées

L’un des aspects les plus délicats de cette implémentation est de transformer correctement les coordonnées que nous manipulons. L’algorithme commence avec les coordonnées héliographiques (où nous voulons mesurer) et les transforme en coordonnées des trames SER originales (où les données spectrales se trouvent).

1. Coordonnées héliographiques (point de départ)

Nous commençons par spécifier des points en coordonnées héliographiques :

  • Latitude : -90° (pôle sud) à +90° (pôle nord)

  • Longitude : 0° au centre du disque, ±90° aux limbes

Cela nécessite deux paramètres solaires calculés à partir de la date d’observation :

  • B0 : La latitude héliographique du centre du disque (varie tout au long de l’année)

  • P : L’angle de position de l’axe de rotation (l’inclinaison du Soleil vu depuis la Terre)

2. Coordonnées image

Les coordonnées héliographiques sont converties en positions de pixels dans l’image reconstruite. Cela implique d’inverser les corrections appliquées pendant la reconstruction :

  • Correction de l’angle P

  • Retournement/rotation

  • Distorsion géométrique

  • Angle d’inclinaison

  • Recadrage

3. Coordonnées du fichier SER (destination)

Finalement, les coordonnées image sont mappées vers le fichier vidéo SER brut :

  • Numéro de trame : Position dans la séquence de scan (dérivée de la coordonnée x)

  • Colonne : Position le long de la fente (dérivée de la coordonnée y)

  • Ligne : Direction spectrale (longueur d’onde)

Ce mapping inverse nous permet d’extraire le profil spectral exact à n’importe quelle position héliographique.

Le pipeline de traitement des données

Les mesures brutes sont bruitées. Pour produire une courbe de rotation propre, JSol’Ex utilise un pipeline de traitement en deux étapes :

Étape 1 : Agrégation en longitude

Comme décrit précédemment, à chaque latitude, plusieurs longitudes sont échantillonnées (typiquement 14 points à travers la région du limbe). Ces mesures sont combinées en utilisant l’une des trois méthodes (la médiane par défaut mais vous pouvez choisir) :

  • Médiane : Robuste aux valeurs aberrantes, utilise la valeur centrale

  • Moyenne : Simple moyenne arithmétique

  • Moyenne pondérée : Les points plus proches du limbe (où le signal Doppler est plus fort) ont un poids plus élevé

L’estimation d’erreur de cette étape représente la cohérence des mesures à travers les longitudes.

Étape 2 : Lissage en latitude

Même après l’agrégation en longitude, les mesures latitude par latitude restent bruitées. Les bins de latitude individuels peuvent encore être affectés par des caractéristiques localisées (taches solaires, facules) ou simplement par la dispersion des mesures.

Puisque nous nous attendons à ce que la rotation solaire varie de manière lisse avec la latitude (suivant les termes \(\sin^2\phi\) et \(\sin^4\phi\) de la loi de rotation différentielle), nous pouvons exploiter cette contrainte physique pour réduire davantage le bruit. JSol’Ex applique un filtre de lissage qui combine les points de latitude voisins dans une fenêtre configurable (par défaut : 5°).

De manière importante, les erreurs de l’étape 1 sont propagées plutôt que recalculées à partir de la dispersion dans la fenêtre de lissage. Cela garantit que les barres d’erreur représentent l’incertitude de mesure, pas les variations physiques de latitude.

Pour l’agrégation médiane :

\[\sigma_{smoothed} = \frac{median(\sigma_i)}{\sqrt{n}}\]

Pour la moyenne :

\[\sigma_{smoothed} = \frac{\sqrt{\sum \sigma_i^2}}{n}\]

Le résultat et la comparaison avec la théorie

La forme standard de la loi de rotation différentielle (aussi connue comme la formule de Faye, même si la formule originale n’incluait pas le 3ème terme) est :

\[\omega(\phi) = A + B \sin^2(\phi) + C \sin^4(\phi)\]

Où :

  • \(\phi\) est la latitude héliographique

  • \(A\) est le taux de rotation équatorial

  • \(B\) et \(C\) contrôlent la diminution de la vitesse avec la latitude

JSol’Ex compare les résultats mesurés avec les coefficients largement utilisés de Snodgrass & Ulrich (1990) :

  • \(A = 14.713\) deg/jour (taux de rotation équatorial)

  • \(B = -2.396\) deg/jour

  • \(C = -1.787\) deg/jour

Cela donne une période de rotation équatoriale d’environ 24.5 jours et une période polaire d’environ 34 jours. Convertie en vitesse linéaire à la surface solaire (rayon ≈ 696 000 km), la vitesse de rotation équatoriale est d’environ 2.0 km/s.

JSol’Ex ajuste également ses propres coefficients A, B, C à partir de vos mesures, permettant une comparaison directe avec les valeurs de référence.

Résultats

Ci-dessous des exemples de profils de rotation différentielle mesurés avec JSol’Ex en utilisant deux raies spectrales différentes. Ces mesures ont été prises à des dates différentes avec des conditions de seeing différentes.

Fe I 5883 Å

velocity FeI

H-alpha

velocity Ha

Observations

Les profils mesurés montrent la forme générale attendue : des vitesses plus élevées à l’équateur, diminuant vers les pôles. Les courbes ajustées suivent raisonnablement bien le profil théorique de Snodgrass.

Cependant, j’observe des différences entre les raies spectrales que je ne peux pas entièrement expliquer. Les mesures Fe I montrent des vitesses absolues différentes de H-alpha, et les coefficients ajustés diffèrent entre les scans.

Plusieurs facteurs pourraient contribuer à ces différences :

  • Hauteur de formation : Différentes raies spectrales se forment à différentes hauteurs dans l’atmosphère solaire, et les taux de rotation peuvent varier avec l’altitude (comme suggéré par des recherches récentes de la mission CHASE)

  • Conditions de seeing : Les scans ont été pris à des dates différentes avec des conditions atmosphériques différentes

  • Différences de profil de raie : H-alpha et Fe I ont des largeurs et profondeurs de raie différentes, ce qui peut affecter la précision de l’ajustement de Voigt

  • Effets systématiques : Il peut y avoir des facteurs instrumentaux ou algorithmiques que je n’ai pas identifiés

Je présente ces résultats tels qu’ils sont, sans essayer de tirer des conclusions sur quelle mesure est "correcte" ou ce qui cause les différences observées. Plus de mesures sur différentes dates, raies spectrales et instruments seraient nécessaires pour comprendre ces variations.

Mesurer en pratique

La qualité des résultats dépend fortement du seeing atmosphérique. Un mauvais seeing floute les raies spectrales et rend la détermination précise du centre difficile. Les meilleurs résultats sont obtenus avec d’excellentes conditions de seeing et un instrument bien focalisé. Enfin et surtout, une haute résolution spectrale est préférée, ce qui est normalement le cas avec le Sol’Ex (HR) ou le SHG 700.

Vous pouvez aussi vous demander quelle raie spectrale vous devriez observer. J’ai testé l’algorithme avec Fe I, Na D2 et H-alpha, donnant les résultats ci-dessous. En pratique, les raies d’absorption fortes devraient en théorie produire les meilleurs résultats, car :

  • La profondeur de raie devrait être suffisante pour un ajustement précis

  • Les ailes devraient être bien définies pour l’ajustement de Voigt

  • Le rapport signal sur bruit devrait être élevé

Les raies très larges comme Ca II K sont trop larges pour un ajustement de Voigt précis et produiront des résultats peu fiables. Les raies trop étroites peuvent aussi représenter un défi pour l’ajustement de Voigt mais peuvent fonctionner aussi.

L’impact de la détection de la raie spectrale

Un facteur subtil mais important affectant la précision absolue des mesures est la correction polynomiale utilisée pendant la reconstruction d’image. Comprendre ceci est essentiel pour interpréter correctement vos résultats.

Pendant le traitement du spectrohéliographe, JSol’Ex calcule un polynôme qui fait correspondre chaque position de colonne le long de la fente vers la position de ligne attendue du centre de la raie spectrale. Ce polynôme est calculé à partir de la moyenne des trames SER dans le scan (une heuristique est utilisée pour inclure les trames contenant des données solaires réelles, pas le fond de ciel).

Une telle détection est cruciale car la raie spectrale n’est pas droite à travers la fente en raison de phénomènes optiques : elle constitue ce que nous appelons souvent le "smile". Par conséquent, le centre de raie peut être à la ligne 300 à la colonne 500. mais à la ligne 350 à la colonne 1000. Le polynôme capture cette courbure.

En mesurant les positions de raie relativement au polynôme, nous éliminons efficacement la distorsion optique de nos mesures. Sans cette référence, nous mesurerions la somme de la courbure optique plus le décalage Doppler, rendant impossible l’extraction des minuscules signaux de vitesse que nous recherchons.

Une question clé est : pourquoi ne pouvons-nous pas simplement mesurer la position absolue de la raie spectrale dans chaque trame et calculer les vitesses directement ?

La réponse réside dans la précision requise. Une vitesse de 2 km/s correspond à un décalage de longueur d’onde de seulement ~0.04 Å à H-alpha. Avec une dispersion spectrale typique de 0.1-0.2 Å/pixel, c’est un décalage de seulement 0.2 à 0.4 pixels.

La courbure optique à travers la fente, d’autre part, peut facilement s’étendre sur 10-30 pixels ou plus. Toute tentative de mesurer les positions absolues de raie serait complètement dominée par cette courbure, rendant la détection Doppler impossible.

Le polynôme sert de référence de base. En mesurant comment la position de raie dans chaque trame individuelle dévie du polynôme, nous isolons la composante Doppler de la composante optique. C’est l’idée clé qui rend les mesures de précision sub-pixellaire possibles, avec l’ajustement de Voigt.

Un mot sur les images Doppler

Ceci, d’ailleurs, est aussi une raison pour laquelle les images Doppler sont différentes quand on scanne en AD vs DEC. Parce que c’est une question souvent posée, et qu’il m’a fallu des mois pour comprendre la raison, je pense qu’il vaut la peine de passer un peu de temps à expliquer le phénomène. Je dois cette explication à Jean-François Pittet et Christian Buil, d’une discussion il y a quelques semaines sur la mailing list Sol’Ex.

Scan en AD vs scan en DEC : une différence critique pour les images Doppler

Les spectrohéliographes peuvent scanner le Soleil dans deux directions :

  • Scan en AD (Ascension Droite) : La fente est orientée Nord-Sud, et le scan procède Est-Ouest

  • Scan en DEC (Déclinaison) : La fente est orientée Est-Ouest, et le scan procède Nord-Sud

Ce choix a des implications profondes pour la visibilité Doppler, comme expliqué par Jean-François Pittet sur la mailing list Sol’Ex.

Scan en AD : Doppler visible dans les images

En mode scan AD, chaque trame capture une tranche verticale du Soleil du pôle Nord au pôle Sud. Au cours du scan :

  • Les premières trames capturent le limbe Est (s’approchant, décalé vers le bleu)

  • Les trames du milieu capturent le centre du disque (pas de vitesse radiale)

  • Les dernières trames capturent le limbe Ouest (s’éloignant, décalé vers le rouge)

Quand JSol’Ex calcule le polynôme à partir de la moyenne de toutes les trames, les contributions Est et Ouest s’équilibrent. Le blueshift du limbe Est est annulé par le redshift du limbe Ouest. Le polynôme résultant représente la référence "neutre" : approximativement la position de raie au centre du disque sans décalage Doppler.

En conséquence, quand nous reconstruisons l’image au décalage de pixel 0. les décalages Doppler deviennent visibles comme différences de contraste :

  • Le limbe Est apparaît plus sombre (raie décalée dans la bande passante)

  • Le limbe Ouest apparaît plus clair (raie décalée hors de la bande passante)

C’est pourquoi les images Doppler des scans AD montrent l’asymétrie caractéristique Est-Ouest.

Scan en DEC : Doppler "absorbé" par le polynôme

En mode scan DEC, chaque trame capture une tranche horizontale du Soleil d’Est en Ouest. Voici la différence critique : tous les pixels dans une seule trame voient approximativement le même décalage Doppler.

Par exemple, si la trame actuelle capture la moitié Est du disque :

  • Tous les points dans cette trame s’approchent de nous

  • Tous les points ont un blueshift similaire

Quand JSol’Ex calcule le polynôme à partir de la moyenne de toutes les trames, il ne capture pas seulement la courbure optique : il capture aussi le décalage Doppler moyen à travers le scan. Mais voici le problème : le décalage Doppler varie systématiquement à travers le scan (les trames Est sont décalées vers le bleu, les trames Ouest sont décalées vers le rouge).

Le polynôme "absorbe" effectivement une moyenne pondérée de ces décalages Doppler. Quand nous mesurons ensuite les positions de raie relativement à ce polynôme, une grande partie du signal Doppler a déjà été soustraite. Les images Doppler résultantes ne montreront plus la rotation du soleil (ce qui peut aussi être un avantage, pour d’autres types d’observations).

C’est pourquoi les spectrohéliographes expérimentés préfèrent souvent le scan AD pour le travail Doppler : le signal Doppler est plus visible et plus facile à détecter.

La complication de l’angle P

Il y a une subtilité supplémentaire : l’axe de rotation du Soleil n’est pas perpendiculaire à l’écliptique. L'angle P (angle de position de l’axe de rotation) varie tout au long de l’année d’environ -26° à +26°.

Deux fois par an (vers début juin et début décembre) l’angle P est proche de zéro. À ces moments :

  • Le scan AD est vraiment parallèle à l’équateur solaire

  • Le motif Doppler Est-Ouest s’aligne parfaitement avec la direction de scan

À d’autres moments, quand P est non nul :

  • L’axe de rotation est incliné par rapport à la direction de scan

  • Le motif Doppler est tourné par rapport aux axes de l’image

  • Une partie du signal Doppler "fuit" dans la moyenne polynomiale même en mode AD

C’est une des raisons pour lesquelles les mesures de rotation différentielle peuvent montrer des résultats légèrement différents à différentes périodes de l’année, bien que nous prenions en compte les angles P et B0.

Implications pour les mesures de rotation différentielle

Ceci explique pourquoi le scan AD est essentiel pour les mesures de vitesse différentielle :

En mode AD, les points des limbes Est et Ouest à la même latitude correspondent à la même colonne sur la fente (même position de fente, trames différentes). La valeur du polynôme à cette colonne est calculée à partir de la moyenne de toutes les trames (limbe Est, centre du disque, et limbe Ouest) donc les décalages Doppler s’annulent dans la moyenne. Quand nous calculons (Ouest - polynôme) - (Est - polynôme), les termes du polynôme sont identiques et s’annulent, nous laissant avec la vraie différence Doppler Ouest - Est.

En mode DEC, les points des limbes Est et Ouest à la même latitude correspondent aux extrémités opposées de la fente (colonnes différentes, même trame). Le polynôme à la colonne Est est calculé à partir de trames qui voient toutes le limbe Est à cette position, donc le polynôme absorbe le blueshift. De même, le polynôme à la colonne Ouest absorbe le redshift. Quand nous calculons la différence, ces décalages Doppler absorbés ne s’annulent pas : ils se soustraient de notre mesure, réduisant significativement le signal mesuré.

C’est pourquoi, en pratique, les scans DEC ne produisent pas d’images Doppler utilisables ou de mesures de vitesse différentielle fiables.

Conseils de configuration

  • Longitude du limbe (par défaut 75°) : Les mesures plus proches du limbe donnent des signaux Doppler plus forts mais risquent des effets d’assombrissement centre-bord

  • Pas de latitude (par défaut 2°) : Des valeurs plus petites donnent une résolution plus fine mais des temps de traitement plus longs

  • Fenêtre de lissage : Devrait être au moins 2× le pas de latitude pour un lissage efficace

Conclusion

Mesurer la rotation différentielle avec du matériel amateur aurait semblé impossible il y a quelques années seulement. Des pionniers comme Peter Zetner ou Christian Buil nous ont montré la voie. Ce que j’essaie de faire, comme toujours avec JSol’Ex, c’est de rendre ceci accessible à encore plus de personnes au prix de la "magie", c’est-à-dire que certaines personnes partageront très probablement des résultats sans comprendre la science derrière. Je ne suis pas trop inquiet par cela, parce que je suis moi-même passé par là : apprécier la reconstruction d’images SHG, puis comprendre comment ça fonctionne, puis me poser des questions comme "pourquoi est-il même possible de mesurer des vitesses Doppler si petites ?" : c’est une construction intellectuelle qui prend du temps. Nous, membres de la communauté Sol’Ex, pouvons faire mieux, je pense, pour apporter cela aux masses, en partageant nos idées et en écrivant des logiciels comme celui-ci.

Cette fonctionnalité rejoint la liste croissante des capacités scientifiques dans JSol’Ex : détection des bombes d’Ellerman, identification des régions actives, et maintenant mesure de la rotation différentielle. Chacune de celles-ci met des analyses de niveau professionnel à la portée des astronomes amateurs, mais, comme toujours, soyez prudent avec ce que je dis : je ne suis pas un scientifique, juste un ingénieur. Je n’ai aucun doute que j’ai fait des approximations, ou pris des libertés que je n’aurais probablement pas dû prendre.

Measuring Solar Differential Rotation with JSol’Ex

05 February 2026

Tags: solex jsolex solar astronomy doppler rotation

A Rotating Ball of Plasma

One fascinating aspect of the Sun is that it doesn’t rotate like a solid body. Unlike the Earth, which completes one rotation in 24 hours regardless of latitude, the Sun’s rotation rate varies with latitude: the equator rotates faster than the poles. This phenomenon, called differential rotation, has been studied since the 19th century and remains an important research topic in solar physics.

The equatorial regions of the Sun complete a rotation in approximately 25 days, while near the poles, it takes about 35 days. This differential rotation is thought to play a key role in the solar dynamo mechanism that generates the Sun’s magnetic field and drives the 11-year solar cycle.

Differential rotation concept

In this blog post, I will explain how I implemented a feature in JSol’Ex 4.5.0 that allows amateur astronomers to measure this differential rotation directly from their spectroheliograph data. A common mistake is to think that this measurement is not possible because the spectral dispersion of a SHG like the Sol’Ex is typically around 0.1 to 0.2Å, which larger than the scale of what we’re trying to measure (2 km/s, which is about 0.04Å). In fact, what we are trying to measure requires sub-pixel precision and we can achieve that.

The Doppler Effect

The principle behind the measurement is simple: the Doppler effect. When a light source moves towards us, the wavelength is shifted towards the blue end of the spectrum (blueshift). When it moves away, the wavelength shifts towards the red (redshift).

Since the Sun rotates, one limb is always moving towards us (let’s say the East limb) while the other is moving away (the West limb). By measuring the wavelength shift of a spectral line at both limbs, we can calculate the rotation velocity.

Doppler effect for measuring solar rotation

One might wonder about the Earth’s own motion: we orbit the Sun at approximately 30 km/s, which is much larger than the ~2 km/s solar rotation velocity we’re trying to measure. This orbital motion does produce a Doppler shift of the entire solar spectrum. However, this affects equally all points we can measure: this is a global shift which affects all measurements equally and cancels out. The same is true for any radial velocity of the Sun relative to the Earth (which varies slightly throughout the year as Earth’s orbit is elliptical).

The fundamental formula relating Doppler shift to velocity is:

\[\frac{\Delta\lambda}{\lambda_0} = \frac{v}{c}\]

Where:

  • \(\Delta\lambda\) is the wavelength shift

  • \(\lambda_0\) is the rest wavelength of the spectral line (typically the H-alpha wavelength)

  • \(v\) is the velocity along the line of sight

  • \(c\) is the speed of light (299,792 km/s)

The Measurement Methodology

Previous Work

I am not the first person to try to make this measurement in amateur spectroheliography. In 2017, Peter Zetner explained on CloudyNights how to measure differential velocity using a spectroheliograph. He explained this methodology in depth in the Solar Astronomy - Observing, imaging and studying the Sun book. His methodology relies on measurements using the Na D2 line, but can also be applied on other bright lines including the commonly used Fe I line at 5250.2 Å, and involves comparing the pixel intensities, by averaging them at different latitudes. The best results are obtained by performing several scans and averaging data. While this works, I wanted to try a different methodology:

  1. Use a single scan: the Doppler images that JSol’Ex or INTI can produce are in general very consistent and show that all the data we need is already present

  2. Avoid pixel intensities: these are very sensitive to limb darkening, observing conditions (e.g clouds, even if thin) or vignetting (darkening of the images along the slit)

  3. Make it possible to use H-alpha scans, not because they would give an accurate value of the velocity of the photosphere plasma, but because that’s the most widely imaged line in amateur solar observations

The results, of course, will depend on the observed line. The methodology that I describe below is capable of returning reasonable results on several lines (H-alpha, Na D2, Fe I) but will completely fail on some others (e.g Ca II K, typically because the line is too wide).

Let’s dive into the methodology.

Note
The implementation described here was developed iteratively based on real observations. I’m not a solar physicist, just an engineer trying to extract meaningful data from spectroheliograph captures. The algorithm works reasonably well in practice but should be validated against professional measurements for any scientific application. Therefore why it is advertised as experimental.

East-West Limb Comparison

The key to understanding the methodology is that it relies on spectral line profile analysis and fitting. It requires extracting the spectral line profiles at different locations of the solar disk, preferably near the limbs where the velocities are highest.

The differential rotation measurement extracts solar rotation velocities by comparing Doppler shifts between East and West limb points at the same heliographic latitude.

Doppler Shifted Profiles

For each latitude (say, 20° North), the algorithm:

  1. Selects a point on the East limb

  2. Selects the corresponding point on the West limb at the same latitude

  3. Measures the spectral line position at each point

  4. Computes the difference: West - East

This differential approach has a crucial advantage: it cancels out systematic errors. Any instrumental offset, wavelength calibration error, or baseline shift affects both measurements equally and disappears when we take the difference.

However, a single East-West measurement at each latitude is not reliable enough. Seeing conditions, local solar activity, or fitting errors can corrupt individual measurements. To improve accuracy, JSol’Ex samples multiple longitudes across the limb region (typically 14 points from 62° to 88° longitude) and aggregates these measurements. This redundancy allows outliers to be rejected and provides an error estimate based on measurement consistency.

The measured velocity is then:

\[v_{measured} = \frac{\Delta\lambda}{\lambda_0} \times \frac{c}{2}\]

The factor of 2 appears because we’re measuring the difference between approaching and receding limbs.

From Measured Velocity to Equatorial Velocity

The velocity we measure depends on the geometry: how much of the rotation velocity is projected along our line of sight. At the equator and at the limb, we see the full rotation velocity. At higher latitudes or closer to disk center, we see only a fraction.

The geometric correction factor is:

\[v_{equatorial} = \frac{v_{measured}}{\cos(\phi) \times \sin(\theta)}\]

Where:

  • \(\phi\) is the heliographic latitude

  • \(\theta\) is the heliographic longitude (0° at disk center, ±90° at the limbs)

Finding the Spectral Line Center

The most challenging part of the measurement is accurately determining the center of the absorption line. A shift of just 0.01 Å corresponds to a velocity of about 0.5 km/s, which is significant compared to the typical equatorial velocity of ~2 km/s.

JSol’Ex uses Voigt profile fitting to measure the line center. The Voigt profile is the convolution of a Gaussian and a Lorentzian profile, which accurately models the shape of solar absorption lines. The Gaussian component represents thermal Doppler broadening, while the Lorentzian component represents natural and pressure broadening.

For each measurement point, the algorithm:

  1. Extracts a spectral profile from the SER file at the corresponding position

  2. Fits a Voigt profile to the absorption line

  3. Records the fitted line center position

The configurable "Voigt fit half-width" parameter (default: 2 Å) controls how much of the line wings are included in the fit.

Coordinate Systems

One of the trickier aspects of this implementation is correctly mapping between the different coordinate systems involved. The algorithm starts with heliographic coordinates (where we want to measure) and maps them back to the original SER frames (where the spectral data lives).

1. Heliographic Coordinates (starting point)

We begin by specifying points in heliographic coordinates:

  • Latitude: -90° (south pole) to +90° (north pole)

  • Longitude: 0° at disk center, ±90° at the limbs

This requires two solar parameters computed from the observation date:

  • B0: The heliographic latitude of the disk center (varies throughout the year)

  • P: The position angle of the rotation axis (the "tilt" of the Sun as seen from Earth)

2. Image Coordinates

The heliographic coordinates are converted to pixel positions in the reconstructed image. This involves reversing the corrections applied during reconstruction:

  • P-angle correction

  • Flip/rotation

  • Geometric distortion

  • Tilt angle

  • Cropping

3. SER File Coordinates (destination)

Finally, the image coordinates are mapped to the raw SER video file:

  • Frame number: Position in the scan sequence (derived from x-coordinate)

  • Column: Position along the slit (derived from y-coordinate)

  • Row: Spectral direction (wavelength)

This reverse mapping allows us to extract the exact spectral profile at any heliographic location.

The Data Processing Pipeline

The raw measurements are noisy. To produce a clean rotation curve, JSol’Ex uses a two-stage processing pipeline:

Stage 1: Longitude Aggregation

As described earlier, at each latitude, multiple longitudes are sampled (typically 14 points across the limb region). These measurements are combined using one of three methods (the default is median but you can choose):

  • Median: Robust to outliers, uses the middle value

  • Average: Simple arithmetic mean

  • Weighted Average: Points closer to the limb (where Doppler signal is stronger) get higher weight

The error estimate from this stage represents the consistency of measurements across longitudes.

Stage 2: Latitude Smoothing

Even after longitude aggregation, the latitude-by-latitude measurements remain noisy. Individual latitude bins can still be affected by localized features (sunspots, faculae) or simply measurement scatter.

Since we expect solar rotation to vary smoothly with latitude (following the \(\sin^2\phi\) and \(\sin^4\phi\) terms of the differential rotation law), we can exploit this physical constraint to reduce noise further. JSol’Ex applies a smoothing filter that combines nearby latitude points within a configurable window (default: 5°).

Importantly, the errors from Stage 1 are propagated rather than recomputed from the spread in the smoothing window. This ensures the error bars represent measurement uncertainty, not physical latitude variations.

For the median aggregation:

\[\sigma_{smoothed} = \frac{median(\sigma_i)}{\sqrt{n}}\]

For the average:

\[\sigma_{smoothed} = \frac{\sqrt{\sum \sigma_i^2}}{n}\]

The Outcome and Comparison with Theory

The standard form of the differential rotation law (also known as the Faye formula, even if the original formula didn’t include the 3rd term) is:

\[\omega(\phi) = A + B \sin^2(\phi) + C \sin^4(\phi)\]

Where:

  • \(\phi\) is the heliographic latitude

  • \(A\) is the equatorial rotation rate

  • \(B\) and \(C\) control the decrease in velocity with latitude

JSol’Ex compares measured results with the widely-used coefficients from Snodgrass & Ulrich (1990):

  • \(A = 14.713\) deg/day (equatorial rotation rate)

  • \(B = -2.396\) deg/day

  • \(C = -1.787\) deg/day

This gives an equatorial rotation period of about 24.5 days and a polar period of about 34 days. Converting to linear velocity at the solar surface (radius ≈ 696,000 km), the equatorial rotation velocity is approximately 2.0 km/s.

JSol’Ex also fits its own A, B, C coefficients from your measurements, allowing direct comparison with the reference values.

Results

Below are example differential rotation profiles measured with JSol’Ex using two different spectral lines. These measurements were taken on different dates with different seeing conditions.

Fe I 5883 Å

velocity FeI

H-alpha

velocity Ha

Observations

The measured profiles show the expected general shape: higher velocities at the equator, decreasing toward the poles. The fitted curves follow the theoretical Snodgrass profile reasonably well.

However, I observe differences between spectral lines that I cannot fully explain. The Fe I measurements show different absolute velocities than H-alpha, and the fitted coefficients differ between scans.

Several factors could contribute to these differences:

  • Formation height: Different spectral lines form at different heights in the solar atmosphere, and rotation rates may vary with height (as suggested by recent research from the CHASE mission)

  • Seeing conditions: The scans were taken on different dates with different atmospheric conditions

  • Line profile differences: H-alpha and Fe I have different line widths and depths, which may affect the Voigt fitting precision

  • Systematic effects: There may be instrumental or algorithmic factors I haven’t identified

I present these results as they are, without attempting to draw conclusions about which measurement is "correct" or what causes the observed differences. More measurements across different dates, spectral lines, and instruments would be needed to understand these variations.

Measuring in Practice

The quality of results depends heavily on atmospheric seeing. Poor seeing blurs the spectral lines and makes accurate center determination difficult. Best results are obtained with excellent seeing conditions and a well-focused instrument. Last but not least, a high spectral resolution is preferred, which is normally the case with Sol’Ex (HR) or the SHG 700.

You may also wonder which spectral line you should observe. I tested the algorithm with Fe I, Na D2 and H-alpha, giving the results below. In practice, strong absorption lines should in theory produce the best results, because:

  • The line depth should be sufficient for accurate fitting

  • The wings should be well-defined for Voigt fitting

  • The signal-to-noise ratio should be high

Very broad lines like Ca II K are too wide for accurate Voigt fitting and will produce unreliable results. Too narrow lines may also represent a challenge for Voigt fitting but may work too.

The Impact of the Spectral Line Detection

One subtle but important factor affecting the absolute accuracy of the measurements is the polynomial correction used during image reconstruction. Understanding this is essential for interpreting your results correctly.

During spectroheliograph processing, JSol’Ex computes a polynomial that maps each column position along the slit to the expected row position of the spectral line center. This polynomial is computed from the average of SER frames in the scan (a heuristic is used to include frames containing actual solar data, not sky background).

Such a detection is crucial because the spectral line is not straight across the slit due to optical phenomenons: it consistutes what we often call the "smile". Therefore, the line center might be at row 300 at column 500, but at row 350 at column 1000. The polynomial captures this curvature.

By measuring line positions relative to the polynomial, we effectively remove the optical distortion from our measurements. Without this reference, we would be measuring the sum of optical curvature plus Doppler shift, making it impossible to extract the tiny velocity signals we’re after.

A key question is: why can’t we just measure the absolute position of the spectral line in each frame and compute velocities directly?

The answer lies in the precision required. A velocity of 2 km/s corresponds to a wavelength shift of only ~0.04 Å at H-alpha. With a typical spectral dispersion of 0.1-0.2 Å/pixel, this is a shift of only 0.2 to 0.4 pixels.

The optical curvature across the slit, on the other hand, can easily span 10-30 pixels or more. Any attempt to measure absolute line positions would be completely dominated by this curvature, making Doppler detection impossible.

The polynomial serves as our reference baseline. By measuring how the line position in each individual frame deviates from the polynomial, we isolate the Doppler component from the optical component. This is the key insight that makes sub-pixel precision measurements possible, alongside the Voigt fitting.

A Word About Doppler Images

This, by the way, is also a reason why the Doppler images look different when scanning in RA vs DEC. Because this is a question that is often asked, and that it took months for me to understand the reason, I think it’s worth spending a bit of time explaining the phenomenon. I owe this explanation to Jean-François Pittet and Christian Buil, from a discussion weeks ago on the Sol’Ex mailing list.

RA Scanning vs DEC Scanning: A Critical Difference for Doppler Images

Spectroheliographs can scan the Sun in two directions:

  • RA scanning (Right Ascension): The slit is oriented North-South, and the scan proceeds East-West

  • DEC scanning (Declination): The slit is oriented East-West, and the scan proceeds North-South

This choice has profound implications for Doppler visibility, as explained by Jean-François Pittet on the Sol’Ex mailing list.

RA Scanning: Doppler Visible in Images

In RA scanning mode, each frame captures a vertical slice of the Sun from North pole to South pole. Over the course of the scan:

  • Early frames capture the East limb (approaching, blueshifted)

  • Middle frames capture the disk center (no radial velocity)

  • Late frames capture the West limb (receding, redshifted)

When JSol’Ex computes the polynomial from the average of all frames, the East and West contributions balance out. The blueshift from the East limb is canceled by the redshift from the West limb. The resulting polynomial represents the "neutral" baseline: approximately the line position at disk center with no Doppler shift.

As a result, when we reconstruct the image at pixel shift 0, the Doppler shifts become visible as contrast differences:

  • East limb appears darker (line shifted into the passband)

  • West limb appears brighter (line shifted out of the passband)

This is why Doppler images from RA scans show the characteristic East-West asymmetry.

DEC Scanning: Doppler "Absorbed" by the Polynomial

In DEC scanning mode, each frame captures a horizontal slice of the Sun from East to West. Here’s the critical difference: all pixels within a single frame see approximately the same Doppler shift.

For example, if the current frame is capturing the Eastern half of the disk:

  • All points in that frame are approaching us

  • All points have similar blueshift

When JSol’Ex computes the polynomial from the average of all frames, it doesn’t just capture the optical curvature: it also captures the average Doppler shift across the scan. But here’s the problem: the Doppler shift varies systematically across the scan (East frames are blueshifted, West frames are redshifted).

The polynomial effectively "absorbs" a weighted average of these Doppler shifts. When we then measure line positions relative to this polynomial, much of the Doppler signal has already been subtracted out. The resulting Doppler images will no longer show the rotation of the sun (which can also be a benefit, for other kind of observations).

This is why experienced spectroheliographers often prefer RA scanning for Doppler work: the Doppler signal is more visible and easier to detect.

The P-Angle Complication

There’s an additional subtlety: the Sun’s rotation axis is not perpendicular to the ecliptic. The P-angle (position angle of the rotation axis) varies throughout the year from about -26° to +26°.

Only twice per year (around early June and early December) is the P-angle close to zero. At these times:

  • RA scanning is truly parallel to the solar equator

  • The East-West Doppler pattern aligns perfectly with the scan direction

At other times, when P is non-zero:

  • The rotation axis is tilted relative to the scan direction

  • The Doppler pattern is rotated relative to the image axes

  • Some Doppler signal "leaks" into the polynomial average even in RA mode

This is one reason why differential rotation measurements can show slightly different results at different times of year, despite us taking the P and B0 angles into account.

Implications for Differential Rotation Measurements

This explains why RA scanning is essential for differential velocity measurements:

In RA mode, East and West limb points at the same latitude correspond to the same column on the slit (same slit position, different frames). The polynomial value at that column is computed from the average of all frames (East limb, disk center, and West limb) so the Doppler shifts cancel out in the average. When we compute (West - polynomial) - (East - polynomial), the polynomial terms are identical and cancel, leaving us with the true Doppler difference West - East.

In DEC mode, East and West limb points at the same latitude correspond to opposite ends of the slit (different columns, same frame). The polynomial at the East column is computed from frames that all see the East limb at that position, so the polynomial absorbs the blueshift. Similarly, the polynomial at the West column absorbs the redshift. When we compute the difference, these absorbed Doppler shifts don’t cancel: they subtract from our measurement, significantly reducing the measured signal.

This is why, in practice, DEC scans do not produce usable Doppler images or reliable differential velocity measurements.

Configuration Tips

  • Limb longitude (default 75°): Measurements closer to the limb give stronger Doppler signals but risk limb darkening effects

  • Latitude step (default 2°): Smaller values give finer resolution but longer processing times

  • Smoothing window: Should be at least 2× the latitude step for effective smoothing

Conclusion

Measuring differential rotation with amateur equipment would have seemed impossible just a few years ago. Pioneers like Peter Zetner or Christian Buil showed us the path. What I’m trying to do, as always with JSol’Ex, is to make this accessible to even more people at the cost of "magic", which is that some people will very likely share results without understanding the science behind it. I’m not too concerned by this, as I, myself, have been going this way: enjoying SHG image reconstruction, then figuring out how it works, then asking myself questions like "why is it even possible that we measure Doppler velocities so small?": this is an intellectual construct that takes time and we can do better, I think, at brining this to the masses, sharing our insights.

This feature joins the growing list of scientific capabilities in JSol’Ex: Ellerman bomb detection, active region identification, and now differential rotation measurement. Each of these brings professional-level analysis within reach of amateur astronomers, but, as always, be cautious with what I’m saying: I’m not a scientist, just an engineer. I have no doubts that I made approximations, or took liberties that I should probably not have taken.

However, I do think that this brings value to the ecosystem.

JSol’Ex 4.0.0 est sorti !

11 September 2025

Tags: solex jsolex solaire astronomie ia claude bass2000

Le 18 février 2023, je montais à l’Observatoire du Pic du Midi de Bigorre pour y passer une "Nuit au Sommet", une expérience mêlant observation nocturne et visite des installations scientifiques. J’y ai découvert avec fascination le coronographe Bernard-Lyot, l’expérience CLIMSO gérée par les Observateurs Associés de l’Observatoire Midi-Pyrénées.

Des étoiles plein les yeux (et une en particulier, notre soleil), ma vie d’astronome amateur centrée sur le ciel profond allait basculer vers l’observation de notre Soleil. De retour à la maison, j’ai commencé à me renseigner sur le matériel solaire, et découvrait avec stupéfaction qu’il fallait investir, beaucoup, pour pouvoir observer notre astre en toute sécurité : filtres pleine ouverture, étalons, …​ tout avait un coût démesuré pour un débutant comme moi. De quoi décourager, jusqu’à ce que je tombe par hasard sur le projet Sol’Ex, initié par la légende Christian Buil.

Ce projet, très didactique, permet de se construire un spectrohéliographe, par impression 3D. Un tel instrument présente de nombreux avantages : coût modeste, résolution élevée et la possibilité d’observer dans de nombreuses longueurs d’ondes tout en mettant à disposition des données exploitables scientifiquement !

L’inconvénient, si c’en est vraiment un, de cet instrument est qu’il ne produit pas une image du soleil observable directement à l’oculaire. Il est nécessaire d’utiliser un logiciel de reconstruction qui, à partir d’une vidéo enregistrant un "scan" du soleil, permet de générer une (voir plus) images du soleil. Ce processus de reconstruction, bien mystérieux pour moi à l’époque, était réalisé par un logiciel écrit par Valérie Desnoux, nommé INTI. Etant développeur (Java), je me suis alors lancé un challenge à l’époque : puisque je ne comprenais pas comment ça fonctionnait, j’allais essayer de créer moi-même un logiciel pour faire cette reconstruction. De cet appétit est né JSol’Ex.

JSol’Ex 4.0 et la collaboration scientifique

Nous voici 2 ans et demi plus tard, JSol’Ex arrive en version 4. Entre temps, le nombre d’utilisateurs a explosé et mon logiciel est exploité non seulement par les utilisateurs du Sol’Ex de Christian Buil, mais aussi pour des spectrohéliographes commerciaux comme le MLAstro SHG 700 (que j’utilise désormais). JSol’Ex a apporté de nombreuses innovations, comme la possibilité d’exécuter des scripts pour générer des animations, faire du stacking, créer des images personnalisées, ou encore la détection automatique d’éruptions, des régions actives (avec annotation), la détection de bombes d’Ellerman, la correction des bords dentelés et j’en passe.

Récemment, JSol’Ex a été utilisé pour réaliser un Atlas de Spectrohéliogrammes, et mentionné dans un article précisément sur la détection des bombes d’Ellerman. Bref, JSol’Ex était devenu suffisamment mature pour faire de la "vraie science", chose qui m’a toujours un peu effrayé pour être honnête.

Ainsi, j’ai toujours refusé d’intégrer une fonctionnalité dans JSol’Ex, qui m’a pourtant été demandée de nombreuses fois : la possibilité de l’utiliser pour soumettre des images dans la base de données BASS2000 de l’Observatoire de Paris-Meudon. Plusieurs raisons à cela : d’une, je ne faisais pas confiance à mon propre logiciel pour sa qualité "scientifique". Si je le savais capable de produire de "belles images", il est tout à fait différent de s’en servir pour une exploitation scientifique. D’autre part, il n’était pas question pour moi d’intégrer une fonctionnalité qui avait été développée par Valérie Desnoux (autrice de INTI) et l’équipe de Meudon sans son accord, par respect pour son travail.

Cependant, vous aurez compris que les temps ont changé et que la pression des utilisateurs ainsi que mes discussions avec Florence Cornu, du projet SOLAP, aux Rencontres du Ciel et de l’Espace fin 2024, puis aux JASON en Juin dernier ont eu raison de mes doutes. Avec son accord et celui de Valérie, je suis donc heureux de vous annoncer que JSol’Ex 4 est officiellement supporté pour soumettre vos images dans la base de données BASS 2000 !

Un assistant pas à pas

Ne souhaitant pas faire les choses à moitié, j’ai particulièrement peaufiné le logiciel pour simplifier cette procédure. J’ai souhaité faire les choses avec sérieux, puisqu’il s’agit d’une base de données professionnelle, exploitée par des scientifiques. Ainsi, une chose importante pour moi était de guider l’utilisateur dans ce processus et de lui faire comprendre l’importance de la qualité des données, tout en simplifiant le processus de soumission.

bass2000
Figure 1. Assistant de soumission BASS2000

Ainsi par exemple, BASS2000 n’a que très peu de tolérance sur les problèmes d’orientation de l’image : il faut que le Nord solaire soit à moins de 1 degré d’erreur, sinon l’image sera refusée. L’assistant intègre donc un outil pour aider à vérifier l’orientation et corriger les erreurs minimes dues par exemple à une mise en station imparfaite.

L’assistant guidera aussi l’utilisateur dans son processus de soumission, en lui demandant de bien vérifier toutes les métadonnées associées à l’observation, et ira jusqu’à envoyer l’image sur le serveur FTP de BASS2000 pour validation par les équipes.

Je suis particulièrement reconnaissant à Florence CORNU pour son aide afin que les images JSol’Ex soient acceptées dans la base et je remercie mes beta-testeurs qui ont patiemment testé mes versions de développement pendant l’été.

Je ne vous cache pas qu’il s’agit là d’une forme de reconnaissance de mon travail, des centaines d’heures passées soirs et week-ends à développer ce logiciel qui rappelons-le est entièrement Open Source et gratuit.

Enfin, je ne peux pas m’arrêter sans vous annoncer une deuxième bonne nouvelle : non seulement vous pourrez utiliser JSol’Ex pour soumettre vos images acquises avec un Sol’Ex, mais aussi avec le MLAstro SHG 700, qui devient officiellement supporté dans la base BASS2000 !

Changements dans l’interface

Pour cette version j’ai aussi souhaité moderniser un peu l’interface graphique et la simplifier : avec le nombre de fonctionnalités croissantes arrive ce moment fatidique que tout développeur redoute : que l’interface ne devienne trop complexe pour les nouveaux utilisateurs et ne parle qu’aux anciens. J’ai essayé d’éviter cet écueil au cours du temps en refusant certaines fonctionnalités trop "de niche", mais sans pouvoir pour autant réussir à avoir une interface totalement claire.

interface overview
Figure 2. Aperçu des changements d’interface

Cette nouvelle version essaie donc de regrouper les paramètres par sections plus claires, tout en ajoutant des infobulles pour guider les utilisateurs, anciens comme nouveaux, dans cet esprit qui est que le logiciel se doit d’être le plus didactique possible : j’essaie, autant que faire se peut, de vous transmettre en tant qu’utilisateurs ce que moi-même j’apprends en développant ce logiciel. Un exemple frappant de cette philosophie, c’est cette fonctionnalité que j’avais ajoutée qui permet de montrer en cliquant sur le disque solaire, à quelle image il correspond dans le fichier source (une vidéo contenant des spectres).

Détection d’ellipse assistée par l’utilisateur

Je vous parlais un peu plus haut de l’Atlas des Spectrohéliogrammes. Cet atlas, réalisé par Pál Váradi Nagy, nécessite un travail énorme d’analyse des données et est réalisé à l’aide de scripts JSol’Ex. Cependant, pour certaines longueurs d’ondes ou pour parfois des images un peu compliquées à traiter, le logiciel peut échouer à détecter correctement les contours du disque solaire. Ceci peut arriver notamment lorsque les images sont peu contrastées ou lorsqu’il y a des réflexions internes qui biaisent la détection.

Afin de résoudre ces cas complexes qui, encore une fois, nuisent à l’analyse scientifiques, j’ai ajouté la possibilité d’aider le logiciel à détecter les contours, et ainsi à obtenir un image solaire bien ronde:

ellipse detection assistant
Figure 3. Détection d’ellipse assistée par l’utilisateur

L’IA à la rescousse

Je suis développeur et en tant que tel, sur ce media, il me semblait pertinent d’ajouter une section sur la façon dont cette version a été développée.

Cette version est la première version qui a été développée avec l’aide de l’IA, en particulier Claude Code. En effet, les dernières innovations en matière d’IA agentique sont pour le coup la véritable révolution à venir : autant avant, avoir une IA qui n’était pas capable de comprendre le contexte, faire des refactorings ou prévoir un plan de développement ne les rendait pas particulièrement utiles, autant les IA à base d’agents, qui sont capables d’analyser votre code, appeler des outils de manière autonome et avoir de vraies interactions avec vous sont un "game changer" de mon point de vue.

Dans cette version, j’ai donc utilisé Claude Code (plan Pro) pour m’aider à faire les refactorings dont j’avais besoin et m’assister dans une tâche où je ne suis pas particulièrement à l’aise : le design d’interfaces graphiques.

De manière générale, ça fonctionne plutôt bien. Très bien même. La capacité de l’outil à définir un plan d’implémentation et comprendre les besoins est assez fascinante. Le code généré, en revanche, nécessite toujours beaucoup de review. On pourrait dire que j’ai l’impression d’avoir un (très bon) stagiaire avec moi, en permanence. En tant que développeur senior, je suis assez rapide à identifier là où l’IA complique les choses inutilement, ou utilise des design pattern dépréciés, ou ne respecte pas les conventions de code. Je serai, par exemple, terrifié si le code original produit était parti en production sans review. Mais, en lui donnant les bonnes directions, en lui expliquant ses erreurs, on arrive rapidement à ce que l’on souhaite avec la qualité que l’on souhaite.

Quelques exemples de choses qui ne fonctionnent pour le coup vraiment pas bien:

  • Claude vous demande de créer un fichier CLAUDE.md qui comprend des instructions sur comment compiler votre projet, comment il est organisé, etc. Bref, du contexte qui est systématiquement ajouté à chaque session. Pourtant, à l’utilisation, Claude ignore allègrement ces instructions.

  • En Java, les fichiers .properties sont encodés en ISO-8859-1, même dans une base où tous les sources sont en UTF-8. C’est une bizarrerie historique, mais Claude ne la comprend absolument pas. A chaque fois qu’il modifie mes fichiers properties (qui servent à l’internationalisation de l’interface), il casse systématiquement l’encodage. Pour l’éviter, le dois systématiquement, avant de lui faire faire une opération dont je sais qu’elle implique ces fichiers, lui dire "respecte les guidelines du fichier CLAUDE" où je lui ai donné une technique pour éviter les problèmes (convertir le fichier en UTF-8, puis l’éditer, puis le reconvertir en ISO-8859-1)

  • Les commentaires dans le code. Quand on commence à avoir un peu de bouteille comme moi, il est assez insupportable de lire des commentaires "captain obvious", ce genre de commentaires qui dit "la ligne suivante calcule 1+1". Claude en génère beaucoup. Trop. Et malgré le fait que mon fichier CLAUDE lui interdise explicitement.

  • La confiance en soi. Claude est bien trop optimiste et tend trop à flatter l’utilisateur. Par exemple, si je lui mens explicitement ("ton algorithme est faux parce que XXX"), il répondra systématiquement "Tu as raison !" sans "réfléchir" (j’utilise les guillemets avec intention), comme un tic de langage ! Ca devient assez frustrant à la longue, lorsqu’il ne comprend pas un problème ou complique inutilement l’implémentation.

  • Les limites : on arrive, sur un projet de la taille de JSol’Ex, très rapidement aux limites d’usage même sur un forfait Pro. Si je suis satisfait de ce que ça m’apporte pour le prix, je ne suis pas prêt à payer les 200€ / mois pour augmenter ces limites. N’oublions pas que je fais ça sur mon temps libre…​ je n’ai aucune obligation de résultat !

Quoi qu’il en soit, il s’agit là d’avancées qu’il devient difficile d’ignorer. Et ceux qui me connaissent savent à quel point je suis critique sur l’utilisation des IA, les mythes autour de ce qu’elle est capable de faire et son impact écologique. Néanmoins, une chose est certaine : les dirigeants qui pensent économiser du temps et de l’argent en virant leurs développeurs pour les remplacer par de l’IA se mettent une balle dans le pied : elle pose de sérieux problèmes de qualité de code et donc de maintenance, et, avec l’arrivée des agents, posent de graves problèmes de sécurité (un outil autonome qui décide par lui même s’il faut vous demander l’autorisation pour exécuter une commande !"). L’IA doit être vue comme une aide à la productivité, mais qui doit être cadrée par des gens d’expérience. Bref, nous sommes à un tournant et je ne suis pas encore bien à l’aise avec ce que cela implique. Nous n’avons jamais été aussi près du rêve de gosse que j’avais d’IA "autonomes", mais la maturité me force à en avoir peur.

Mais nous nous éloignons là du sujet initial et concluons donc ce billet : dites bienvenue à JSol’Ex 4, consultez la vidéo de présentation ci-dessous et n’hésitez pas à contribuer !


Older posts are available in the archive.