[REDMINE1D-73] [RM-5775] Introduire la dépendance en longueur d'onde dans la conversion vacuum/air Created: 04/Jun/21  Updated: 05/Jul/23  Resolved: 05/Jul/23

Status: Done
Project: 1D Redmine
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Task Priority: Normal
Reporter: Redmine-Jira Migtation Assignee: Redmine-Jira Migtation
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Attachments: PNG File Capture d’écran de 2021-09-08 08-54-59.png     PNG File Capture d’écran de 2021-09-08 08-57-54.png     PNG File Capture d’écran de 2021-09-08 09-13-42.png    

 Description   

Created on 2020-05-07 16:35:35 by Pierre-yves Chabaud. % Done: 100

Suite du bug #5749.
L'issue #5749 a temporairement et volontairement supprimé la dépendance en longueur d'onde de la formule de conversion vacuum/air en fixant s=0.8.
@lambda_vac / lambda_air = 1 + 8.34254*1e-5 + (2.406147*1e-2)/(130-s*s) + (1.5998*1e-4)/(38.9-s*s)@

L'objectif de cette issue est de ré-introduire la dépendance en longueur d'onde après une réorganisation des opérations de conversion vaccum/air et correction de redshift (suite a la remarque de Didier).

Une fois réalisé, il faudra:

  • re-créér les catalogues de template-ratio
  • mettre à jour le code de @vizu@

Voici la remarque de Didier sur l'ordre des opérations:
Didier VIBERT wrote:
> J'ai un gros doute sur notre façon de faire:
>
> il me semble que ce qu'il faudrait faire c'est:
> * si le catalogue de raie en entrée est en lambda_air conversion en lambda_vide
> * si observation dans l'air: redshift des lambda_vide puis correction vide->air
>
> et voilà ce qu'on fait:
> il y a un paramètre de conversion dont la logique est true si le catalogue est en lambda vide et qu'on observe dans l'air.
> * au début du code on corrige le catalogue d'entrée pour le mettre en lambda_air en fonction du paramètre
> * ensuite, pour modéliser on redshift les raies du catalogue (éventuellement converties en air)
>
> or vu la fonction de conversion, ça ne commute pas avec le redshift, non ?
>
> Et quid du fit de template ? idéalement il faudrait des template-air et des template-vide, la conversion pourrait se faire lors de l'interpolation. Mais comme dans le cas du full model, il n'y a pas de raies d'émission dans les templates et que les raies abs sont larges ça ne pose peut être pas de pb ? Est-ce vrai pour les breaks ?

Pour rappel la discussion initiale:
Bug dans la conversion vacuum->air découvert lors de #5555

Vincent LE BRUN wrote in #5555#note-11:
>Voilà la conclusion de cette histoire passionnante, et ça m'a permis de lever un bug majeur :
>la vraie formule est
>lambda_vac / lambda_air = 1 + 8.34254*1e-5 + (2.406147*1e-2)/(130-s*s) + (1.5998*1e-4)/(38.9-s*s)
>donc celle de Amazed sauf que * s = 1e4/lambda_vac_en_Angstrom) alors que je vois dans la formule Amazed un 1e-4 * (notez le moins qui induit une >erreur de 10^8 dans les valeurs de s (mais on est pas à ça près...)

Didier VIBERT wrote:
>dans Ray::ConvertVacuumToAir() source:/RedshiftLibrary/src/lib/ray/ray.cpp#L197
> Référence: Morton 2000 ApJS, 130, 403-436 (https://iopscience.iop.org/article/10.1086/317349)



 Comments   
Comment by Redmine-Jira Migtation [ 05/Jul/23 ]

Comment by Pierre-yves Chabaud on 2020-05-26 21:33:15:
Je rajoute à l'issue la génération d'un nouveau set de template ratio associés

Comment by Redmine-Jira Migtation [ 05/Jul/23 ]

Comment by Didier Vibert on 2020-09-04 13:34:44:
ajout dans la description de la nécessité de mettre à jour aussi le code de Vizu

Comment by Redmine-Jira Migtation [ 05/Jul/23 ]

Comment by Didier Vibert on 2020-09-30 09:55:43:
il faudra penser, au cas des templates.

  • Pour chisquare2, pas de problème, au moment de l'interpolation du template, on calcule l'axe lambda restframe correspondant aux samples du spectre, il faut donc partir des lambda observés dans l'air et corrigés pour être dans le vide.
  • Pour chisquare loglambda, les longueurs d'onde du spectre dans le vide doivent être logarthmiquement espacée. Ce qui veut dire, pour PFS, qu'il faut leur demander de faire cette correction air->vide pour calculer la grille log lambda...
Comment by Redmine-Jira Migtation [ 05/Jul/23 ]

Comment by Vincent Le Brun on 2021-06-09 14:44:30:
En fait il faut juste appliquer la conversion au spectre entrant, et pas au catalogue de raies.

après discussion fructueuse avec Vincent et Pierre-Yves

la correction a appliquer est finalement assez simple. Plutôt que de chercher à appliquer la correction au modèle, il faut convertir les longueurs d'onde du spectre pour les ramener dans le vide avec la conversion listée ci-dessus.

il faudra aussi que Vizu fasse la même chose, car le modèle sera en lambda_obs dans le vide

Comment by Redmine-Jira Migtation [ 05/Jul/23 ]

Comment by Didier Vibert on 2021-08-31 14:11:45:
Finalement, la modif intervient sur la lecture des spectres et l'instanciation de la classe CSpectrum.

Ceci concerne l'api de lecture des spectres. Pour le client amazed, la classe reader effectue la lecture en instanciant un CSpectrumSpectralAxis et un CSpectrumFluxAxis puis, à partir de ces 2 objets, instanciation d'un CSpectrum.
=> il faut mofier le ctor de la classe CSpectrumSpectralAxis, pour prendre un param booleen demandant la conversion air >vide.
Ensuite, les spectres utilisés par la lib amazed sont supposés être dans le vide.

=> impact sur le format interne amazed des spectres, il faut un keyword booleen pour dire si les longueurs d'onde du spectre sont air ou vide cf #6456
=> impact sur les clients pfs,euclid pour instancier correctement le CSpectrumSpectralAxis (en fonction des spectres attendus) ticket ?
=> pour vizu, il faut rajouter la conversion (air->vide si spectre en air) à la lecture du spectre.

Comment by Redmine-Jira Migtation [ 05/Jul/23 ]

Comment by Didier Vibert on 2021-09-07 12:44:47:
question pour Vincent:

le papier de Morton 2000, donne une formule permettant de passer de lambda_vac à lambda_air, mais cette formule n'est pas directement inversible:
@lambda_vac / lambda_air = 1 + 8.34254*1e-5 + (2.406147*1e-2)/(130-s*s) + (1.5998*1e-4)/(38.9-s*s)@ avec @s=1e4/lambda_vac@

3 possibilités:

  1. on ajuste une lois pour approximer l'inverse
  2. on inverse numériquement
  3. tu connais déjà une lois dans l'autre sens ou tu sais où la trouver: a priori le drp2d pfs en utilise une pour avoir des spectres en lambda_vac
Comment by Redmine-Jira Migtation [ 05/Jul/23 ]

Comment by Didier Vibert on 2021-09-08 07:21:34:
à propos de la conversion vaccum<->air, j'ai trouvé ça:

"PyAstronomy":https://github.com/sczesla/PyAstronomy/blob/master/src/pyasl/asl/airtovac.py

code les 3 formules

  • Edlen 1953, J. Opt. Soc. Am 43 no. 5
  • Peck and Reeder 1972, J. Opt. Soc. 62 no. 8
  • Ciddor 1996, Applied Optics 35 no. 9

et la conversion inverse (air->vaccum) est codé par itération.

La "note technique APOGEE":http://www.as.utexas.edu/~hebe/apogee/docs/air_vacuum.pdf

discute des 3 formulations (même formule avec des paramètres un peu différents)

où Edlén 1966 corresponds à peu près à ce qu'on avait (Morton 2000)

et montre l'impact dans la bande H:

pour conclure qu'il vaut mieux utiliser la dernière Ciddor 1996.

"VALD3":https://www.astro.uu.se/valdwiki/Air-to-vacuum%20conversion

applique Morton 2000 (~ Edlén 1966) et propose une formule directe pour l'inverse:

> The opposite conversion (air-to-vacuum) is less trivial because n depends on λvac and conversion equations with sufficient precision are not readily available. VALD3 tools use the following solution derived by N. Piskunov:

> n = 1 + 0.00008336624212083 + 0.02408926869968 / (130.1065924522 - s2) + 0.0001599740894897 / (38.92568793293 - s2), where s = 104 / λair and the conversion is: λvac = λair * n.

en estimant l'erreur de cette approximation inverse via vacuum->air->vaccum:

conclusion

Donc en gros, je vois 2 options:

  1. on code la formule VALD3 qui est une approx de l'inverse de Morton2000
  2. on code les 4 formules avec un param pour la choisir et on applique le schema itératif de PyAstronomy pour la conversion inverse

une préférence ?

Comment by Redmine-Jira Migtation [ 05/Jul/23 ]

Comment by Vincent Le Brun on 2021-09-08 11:33:32:
vu que Morton est largement utilisé (SDSS,...) et probablement par le DRP2D, je penche pour la 1ere solution, surtout que l'inversion a une précision largement suffisante

Comment by Redmine-Jira Migtation [ 05/Jul/23 ]

Comment by Didier Vibert on 2021-09-13 14:24:57:
finalement j'ai codé toutes conversions, le client prend par défaut Morton2000

merge request: https://gitlab.lam.fr/CPF/cpf-redshift/-/merge_requests/208

(amazed client associated merge request: https://gitlab.lam.fr/CPF/pyamazed/-/merge_requests/42)

Comment by Redmine-Jira Migtation [ 05/Jul/23 ]

Comment by Pierre-yves Chabaud on 2021-09-17 08:08:57:
Merged into @develop@ : @9aa51e8@

Generated at Sat Feb 10 15:29:02 JST 2024 using Jira 8.3.4#803005-sha1:1f96e09b3c60279a408a2ae47be3c745f571388b.