Wiki » History » Version 24
Theo Stassen, 06/05/2024 11:37 AM
1 | 3 | Laurent Mirioni | h1. En bref |
---|---|---|---|
2 | |||
3 | 5 | Laurent Mirioni | |
4 | 6 | Laurent Mirioni | |
5 | 1 | Laurent Mirioni | h1. Infos en vrac (à réarranger) |
6 | |||
7 | 2 | Laurent Mirioni | h2. Site Web JUICE officiel |
8 | |||
9 | https://www.cosmos.esa.int/web/juice |
||
10 | |||
11 | 1 | Laurent Mirioni | h2. JUICE Livelink |
12 | |||
13 | Les présentations des différents SWT sont disponibles sur le livelink de JUCE : https://dms.cosmos.esa.int/cs/cs?func=ll&objId=3169397&objAction=browse&viewType=1 (demander les identifiants à Laurent si besoin) |
||
14 | |||
15 | 6 | Laurent Mirioni | h2. JUICE/RPWI Ground segment piipeline |
16 | 1 | Laurent Mirioni | |
17 | 6 | Laurent Mirioni | Le traitement des données SCM (spectres et formes d'ondes) sera intégré au pipeline du consortium RPWI (lead. Uppsala). |
18 | |||
19 | Voir le plan de développement ici : https://hephaistos.lpp.polytechnique.fr/redmine/documents/182 (à mettre à jour -> demander à D. Andrews) |
||
20 | 3 | Laurent Mirioni | Gitlab: https://spis.irfu.se/rpwi/rpwi_pipeline/ (compte personnel avec adresse e-mail LPP) |
21 | Documentation: https://www.space.irfu.se/juice/rpwi_pipeline/index.html (demander les identifiants à Laurent si besoin) |
||
22 | 7 | Theo Stassen | |
23 | Lien pour tutoriel pratique "Python Documentation Using Sphinx Autosummary" : https://medium.datadriveninvestor.com/python-documentation-using-sphinx-f6dc87e1286b |
||
24 | 8 | Theo Stassen | |
25 | 24 | Theo Stassen | h2. JUICE Spice Kernels sets: |
26 | |||
27 | https://www.cosmos.esa.int/web/spice/spice-for-juice |
||
28 | |||
29 | 12 | Theo Stassen | h2. Notes sur l'avancée du code |
30 | |||
31 | - actuellement, les tests de comparaison sont effectués pour un fs = 31.995 comme idl le fait de base, on obtient des résultats où la phase du kernel résultant vaut +/- 40, et on obtient pareil (à epsilon prêt) en python. |
||
32 | Si on force le code à utiliser fs = 32 à la place, les résultats changent, la phase dans le kernel IDL vaut +/- 1e-11 , et 0 en python (donc très proche) |
||
33 | |||
34 | 13 | Theo Stassen | -Note d'un problème en cours (qui n'est pas trop problématique mais ennuyeux quand même) : Problème d'arrondi qui provque différences entre IDL et python : |
35 | |||
36 | les résultats des tests de deconvo vec varient en fonction de fs, df et surtout la manière différente dont idl et python arrondissent df et f_i lors de leur creéation/manipulation Dépendant de comment on déclare df et f (f_i) en idl et de comment on le write dans le log, les résultat du test python en utilisant comme f_i celui du log vont être positifs par epsilon 1e-4 ou non. |
||
37 | Et je n'arrive juste pas à faire en sorte que prendre f_i de generate_freq_array en python donne des résultats positif, parceque les valeurs sont toujours différentes du f_i extrait du log. |
||
38 | |||
39 | Examples de situation : |
||
40 | fe = 31.9995, df = fe/float(nk), frq = findgen * df, write %23.16e (setting classique), python utilise ref_table -> fonctionne |
||
41 | fe = 32 -> fonctionne (logique, vu que pas besoin d'arrondi) |
||
42 | fe = 31.9995, df = fe/float(nk), frq = dindgen * df, write %23.16e , python utilise ref_table -> echec |
||
43 | (setting classique) + python utilise generate_freq_array (que ce soit round on pas) -> echec |
||
44 | fe = 31.9995, df = fe/float(nk) puis round, frq = findgen * df, write %23.16e (setting classique), python utilise generate_freq_array (round au même niveau) -> echec |
||
45 | |||
46 | 12 | Theo Stassen | |
47 | h2. Documentation code |
||
48 | 8 | Theo Stassen | |
49 | Le readme.md contenu dans le code uploadé sur le github possède une explication complète de la structure du fichier IDL deconvo_vec qui contient tout ce que l'on traduit en python actuellement, et la structure du fichier python deconvo_vec équivalent et de toutes les fonctions qui en découle (en cours de construction). |
||
50 | 11 | Theo Stassen | Je copie une version ici (visuellement plus agréable dans github: |
51 | 1 | Laurent Mirioni | |
52 | 10 | Theo Stassen | **Documentation FR de l'avancé du portage IDL -> Python.** |
53 | 9 | Theo Stassen | |
54 | 10 | Theo Stassen | Actuellement on se concentre sur le portage de la fonction _mms_scm_deconvo_vec_ |
55 | 1 | Laurent Mirioni | |
56 | 10 | Theo Stassen | Cette fonction prend en entrée une waveform et des metadatas. |
57 | L'object est d'effectuer la calibration continue de la waveform en convolvant |
||
58 | le signal par un kernel que l'on construit au préalable. |
||
59 | 1 | Laurent Mirioni | |
60 | 10 | Theo Stassen | Les différentes étapes de _mms_scm_deconvo_vec_ sont : |
61 | 1 | Laurent Mirioni | |
62 | 10 | Theo Stassen | 1. (on précentre la waveform d'entrée) |
63 | 2. On souhaite créer un kernel de taille n_k, on commence donc par former un "complex spectrum" **s** de base |
||
64 | (un array de complexes 1+0j, de taille n_k) |
||
65 | 3. On applique à **s** la fonction _mms_scm_corgain_ (même fichier) |
||
66 | 1. On crée un array de fréquence **f** linéairement croissant de pas df = f_e / n_k (f_e = fréquence d'échantillonnage), de longueur n_k |
||
67 | auquel on soustrait f_e la seconde moitié, on a donc un array de fréquence allant de 0 -> fe/2 puis -fe/2 -> 0 |
||
68 | (le format nécessaire pour la fft) |
||
69 | 2. On calcule la réponse **c** renvoyée par _mms_corgain_ |
||
70 | 1. La fonction récupère les données dans le fichier de référence des antennes (dont on a donné le path), |
||
71 | qui contient, pour chaque antenne, un array de fréquence et pour chaque fréquence la réponse complexe référence |
||
72 | correspondante. |
||
73 | 2. Si **f** contient des fréquences en dehors du range du fichier de référence, |
||
74 | on considère que la réponse de l'antenne va être calculée pour la fréquence référence la plus proche |
||
75 | 3. On obtient la réponse de l'antenne, calculée pour chaque valeur de **f** par interpolation |
||
76 | des données de référence. |
||
77 | 4. On multiplie cette réponse par la valeur absolue de la réponse du filtre dfb, |
||
78 | implémenté dans _mms_scm_dfb_dig_filter_resp_ (qui renvoie une réponse pour chaque fréquence de **f**) |
||
79 | 5. On multiplie cette réponse par la réponse du filtre bessel, implémenté dans _bessel_filter_resp_ |
||
80 | (qui renvoie une réponse pour chaque fréquence de **f**) |
||
81 | 6. On renvoie cette réponse |
||
82 | 3. Maintenant que l'on a **c**, on divise **s** par **c** (on applique la correction au spectre d'entrée en somme) |
||
83 | 4. La phase du terme de fréquence 0 de la réponse doit valoir 0 pour pouvoir appliquer la FFT, |
||
84 | on set ce terme à la valeur absolue de sa valeur complexe |
||
85 | 4. On a maintenant un **s** qui a subit la correction de l'antenne + dfb + bessel |
||
86 | 5. On applique un filtre passe bande par _mms_scm_filtspe_ entre f_min et f_max donnés en entrée |
||
87 | 6. On applique une transformée de fourier inverse, non encore normalisée, à **s**, |
||
88 | on obtient alors ce que le code appelle le kernel (qui n'est pas encore le kernel final) |
||
89 | 7. Maintenant on prend seulement la partie réelle (sachant que l'imaginaire doit être négligeable si les calculs sont corrects) |
||
90 | 8. On shift le kernel |
||
91 | 9. On lui applique la fenetre de convolution (Hanning, coscub, trapezoid, etc) |
||
92 | 10. On normalise le kernel |
||
93 | 11. On peut maintenant effectuer la convolution (_mms_scm_fastconvol_) pour la waveform d'entrée et le kernel calculé |
||
94 | 9 | Theo Stassen | |
95 | 10 | Theo Stassen | Dans le code python, nous avons une fonction **_deconvo_vec_** correspondant à _mms_scm_deconvo_vec_ : |
96 | 9 | Theo Stassen | |
97 | 10 | Theo Stassen | 1. (on précentre la waveform d'entrée) |
98 | 2. On crée l'array de fréquence **f** en premier ( étape 3.i) |
||
99 | 2. On crée le kernel non normalisé (-> étapes 2 à 6 sauf 3.i), en utilisant la fonction _**kernel_creation**_ |
||
100 | 1. On crée le complex spectrum de base **spectrum** équivalent à **s** ( étape 2) |
||
101 | 2. On applique la fonction _**corr_gain_ant**_ à **spectrum** avec **f** comme argument (étape 3.ii:iv) |
||
102 | 1. On obtient **gain_array** (équivalent de **c**), initialement la réponse de l'antenne calculée par la fonction _**ant_resp**_ (3.ii.a:c) : |
||
103 | 1. La fonction récupère les données du fichier de référence (3.ii.a) |
||
104 | 2. Elle règle le problème de valeur hors range (3.ii.b) |
||
105 | 3. On effectue l'interpolation pour obtenir la réponse de l'antenne (3.ii.c) |
||
106 | 2. On multiplie **gain_array** par la valeur absolue de la réponse du filter dfb, implémenté dans _**dfb_filter**_ (3.ii.d) |
||
107 | 3. On multiplie **gain_array** par la réponse du filter bessel, implémenté dans _**bessel_filter**_ (3.ii.e) |
||
108 | 4. On divise **spectrum** par **gain_array** (3.iii) |
||
109 | 5. On modifie le terme de fréquence 0 (3.iv) |
||
110 | 3. On applique une filtre passe bande à **spectrum** (_**bandpass_filter**_) (5) |
||
111 | 4. On applique la transformée de fourier inverse à **spectrum** (_**fft**_) et obtient **kernel** (6) |
||
112 | 3. On vérifie que la partie réelle est bien négligeable et on prend uniquement la partie réelle. (7) |
||
113 | 4. On shift le kernel (8)) |
||
114 | 5. On applique la fenêtre de convolution choisie à **kernel** en utilisant les fonction _**conv_windows**_ (9) |
||
115 | 6. On normalise le kernel (10) |
||
116 | 14 | Theo Stassen | |
117 | |||
118 | h2. Notice Installation |
||
119 | 15 | Theo Stassen | |
120 | 23 | Theo Stassen | Voir le readme.md |
121 | |||
122 | En ce qui concerne le pycharm, ce qui suit est toujours valide : |
||
123 | |||
124 | 14 | Theo Stassen | 1. Installer Pycharm (J'utilise la version professional 2022.3.2 mais ça devrait fonctionner sans problème quelque soit la version https://www.jetbrains.com/fr-fr/pycharm/download/ ) |
125 | 16 | Theo Stassen | 2. Faire un git clone du code dans le répertoire de son choix (il faut donc avoir git installé) : git clone https://stassen@hephaistos.lpp.polytechnique.fr/rhodecode/GIT_REPOSITORIES/LPP/DATA-PROCESSING/SCM-Waveforms-Calibration |
126 | 3. Ouvrir Pycharm, Aller dans File -> Open -> Chercher le répertoire où se trouve le code -> Ouvrir |
||
127 | 17 | Theo Stassen | |
128 | h3. Installation Pylint (Pour PEP8) : |
||
129 | 18 | Theo Stassen | |
130 | 17 | Theo Stassen | 1. Pour installer le module pylint de pycharm : File -> Settings -> Plugins : chercher pylint dans la liste, et l'installer. |
131 | 2. Pylint apparaît en bas du menu de gauche dans File -> Settings (si non, relancer pycharm) |
||
132 | 3. Dans le terminal de pycharm, en étant bien avec le venv activé, taper 'pip install pylint' |
||
133 | 4. Dans File -> Settings -> Pylint, pour le "Path to Pylint executable", normalement cela affiche Auto-detected : path/pylint -> Appuyer sur test, si test validé -> Appuyer sur Ok. Si le path n'est pas trouvé directement il faut trouver le path du pylint dans le venv du projet, et le copier là. |
||
134 | 5. Une fois que c'est fait, en bas à côté des icônes terminal etc se trouve Pylint, le module qui permet d'analyser le PEP8 de ce que l'on souhaite. |
||
135 | 6. Pycharm affichera également les PEP8 warnings dans le code directement. |
||
136 | 19 | Theo Stassen | |
137 | h2. Modifications à faire dans le code IDL (corrections d'erreurs) pour que les résultats soient les mêmes que ceux obtenus par python |
||
138 | |||
139 | 20 | Theo Stassen | 1. Lors de la lecture du fichier textuel de calibration de l'antenne, le résultat est placé dans un complex array simple > il ne lit pas correctement tout les digits du fichier -> mettre dcomplexarr à la place |
140 | 22 | Theo Stassen | 2. Dans mms_scm_calibration, quand on appelle mms_scm_deconvo_vec pour chaque antenne, le code passe 1 comme numéro d'antenne pour le deconvo vec de x, 3 pour Y et 2 pour Z, ce qui est une erreur puisque quand le code appelle plus loin |
141 | le fichier de calibration, on a bien x=1, y=2, z=3, ce qui provoque une erreur non négligeable, les kernel de y et z sont tout simplement interverti (le seul endroit où le kernel dépend de l'antenne c'est la réponse de l'antenne, on on interverti celle-ci). > donc très important, remplacer 3 par 2 et 2 par 3 lors des appels "mms_scm_deconvo_vec, yfo, " et "mms_scm_deconvo_vec, zfo, " |