Spécification Technique oiFitsExplorer
Ce topic à pour objectif de définir les fonctions à implémenter dans le logiciel.
Les Données
Chargement
- On ne modifie/écrase jamais un fichier original.
- Ouvrir en lecture seule (en local/en distant) plusieurs OIFits complexes : assuré par OITools/OIFitsCollectionManager.
- Charger en lecture seule plusieurs fichiers de l'OIDB : à faire (SAMP).
- Valider chaque fichier : OITools.
- Enlever un fichier de la liste des fichiers chargés
On obtient un modèle en mémoire de tous les fichiers chargés, appelée
OIFitsCollectionOriginale. Elle sert de base à tous les traitements ultérieurs (filtrage, plot ...)
Design: Doit-on cloner cette structure pour la garder intacte à tout instant de la vie de l'application (transformation, filtrage ...) ?
pour l'instant non (filtrage = extraction / restriction) mais il faudra créer une nouvelle structure OIFits pour y stocker les résultats d'une transformation (merge, binning ...).
Analyse
Pour chaque fichier OIFits, une analyse est réalisée pour interpreter les données: permet de détecter les éléments communs (targets, stations/baselines/configurations, plage min/max wavelength);
- Doit-on analyser d'autres informations (temps) = savoir quels sont les pas de temps (dates d'observations ...) ?
- Quelles sont les formules d'interprétation du temps ?
- On calcule des données dérivées rajoutées comme colonnes virtuelles dans les objets OIData (fréquence spatiale, effective wavelength, configuration des stations);
- Il faut rajouter les bases projetées, l'angle de position de la base, l'angle horaire, le temps
- Comment interpréter les valeurs de INSNAME = instrument + mode instrumental (catégorisation par code couleur) ?
- Faut il afficher les tables individuelles (ex: LITPRO) ? Comment identifier chaque table parmi toute celles chargées ? càd un identifiant unique = (fichier, vis2, arrayname, insane, nb de points, ...) ? VIS2#1 [8 points - INSNAME=PIONIER_1.5_1.8] ...
Au niveau de la collection globale
OIFitsCollectionOriginale, une analyse de haut niveau est réalisée pour regrouper les données relatives à une même étoile (target): TODO crossmatch: quel identifiant utiliser (nom ou ra/dec) ?
On obtient un mapping oiFitsPerTarget qui contient les tables de données par étoile.
Le logiciel ne travaille que sur les tables de données (VIS/VIS2/T3 = OIData): à discuter.
Faut il afficher les autres tables sous forme de table ? comment y accéder ?
Présentation
- Doit-on pouvoir afficher la structure et headers des fichiers ? NON à priori.
- Afficher les données sous forme de table:
- doit-on afficher les données et identifiants bruts, ou afficher les références résolues (index n°1 ou ETA_TAU dans la case TARGET_ID) avec tous les risques d'ambiguité que cela peut engendrer ?
- afficher les colonnes dérivées ? indices (numéro de ligne)
- comment afficher les valeurs dépendantes de la longueur d'onde (tableau de tableau) ? ou plusieurs colonnes: (EFFWAVE_1?) VIS2DATA_1, VIS2ERR_1, VIS2_FLAG_1, VIS2DATA_2...
- conversions à faire (temps julien, ...) ?
- Doit-on pouvoir trier par colonne ?
- Sélection continue/discontinue par l'utilisateur ?
- Mise en surbrillance d'un ensemble de valeurs sélectionnées dans un plot ?
- Comment gerer l'affichage de plusieurs tables (1 à la fois) ?
Parcours
- Doit-on garder/naviguer par le nom/chemin des fichiers ? NON.
- Est-ce que le nom de fichier doit pouvoir servir pour identifier des données dans des plots (valeur/symboles) ? NON.
- Identification d'une donnée:
Une donnée peut être référencée par son fichier/table/numero de ligne. Il faut trouver une clé magique qui permettrai de s'abstraire au moins du numero de ligne mais aussi du nom de fichier pour permettre de reassocier des données selectionnées parmi des données issues de la même source mais apparaissant à plusieurs étages de filtrage.
Comment faire ? proposition = MJD+U+V (VIS/VIS2), MJD+U1+V1+U2+V2 (T3)
Comment déduire le lien entre VIS/VIS2 et T3 ? utiliser U+V vs U1+V1 ou V2+V2 ou (U1+U2)+(V1+V2) ? Risqué donc à ne pas faire.
Filtrage
- Comment filtrer par dates/heures ?
1 subset est le concept associant:
- une target définie
- une selection de tables (pour l'instant: à supprimer ?)
- des filtres:
- lambda (min/max)
- filtre générique: COLUMN OPERAND VALUE
1 subset ne s'applique qu'aux tables de données (VIS/VIS2/T3)
Transformation
- Flagger les données:
- Directement par sélection depuis les plots;
- Suivant une valeur de barre d'erreur maximum ?
- Par date ?
- Modifier les données:
- Comment les sélectionner ?
- Moyenne, binage, ...
- Comment exprimer les modifications complexes (formules, langage de script) ?
- Quid des binages complexes ? plugins ???
Note: un merge de plusieurs OIFits n'est pas une transformation mais un export d'OIFits de la session...
Export
- Export d'un subset au format OIFITS (merge): il faut dans ce cas supprimer les redondances de méta-données (target name, arrname, ...): Quelles sont les règles de 'merge' (OI_TARGET, WAVELENGTH, ARRAY) - fixer toutes les références en conflit(target_id, sta_index, et keywords insname, arrname) ?
- Exporter un plot au format ASCII;
- Exporter un plot au format PDF; cas de plusieurs plots ?
Plots
- Choisir des symboles de point, mais en fonction de quoi ?
- Comment superposer des jeux de données différents ?
- Liste des plots particuliers:
- Plan UV;
- Plan de l'interféromètre ?
- Synchronisation des sélections entre plots ?
- Cohérence des couleurs et symboles entre plots ?
Les Sessions
- Le fichier de session :
- contient le chemin vers les fichiers oifits * définir les cas d'erreurs cf checksum aspro2 pour les fichiers non trouvés
- pourrait être exporté sous forme d'archive (data+session)
- Quels réglages doit-on conserver d'un lancement à l'autre de l'application ?
- Quels réglages doit-on pouvoir exporter pour transmission à un collègue ?
Les Recettes
Annexes
Calcul HA / ANGLE / BASE
RADIUS = SQRT(U² + V²)
BASE = RADIUS * sin(angle) ?
let
MyName['a_'] "ANGLE"
let
MyErr['a_'] 0
let
MyText['a_'] "UV position angle (degrees)"
let
MyFunc['a_'] "180|pi*atan2(Y,X)"
let
MyNpars['a_'] 2
let
MyUnit['a_'] "SPACE"
let
MyVar[1,'a_'] "OI_DATA%OI_VIS2%COL%UCOORD"
let
MyVar[2,'a_'] "OI_DATA%OI_VIS2%COL%VCOORD"
hour angle computation from Aspro1
let x OI_DATA%OI_ARRAY%ARRAYX
let y OI_DATA%OI_ARRAY%ARRAYY
let z OI_DATA%OI_ARRAY%ARRAYZ
let oi%arraylat atan2(z,sqrt(x^2+y^2))
let oi%arraylat 180|PI*oi%arraylat
let oi%arraylon atan2(y,x)
let oi%arraylon 180|PI*oi%arraylon
!
! formula necessary for hour angle . Do it for v2
! retrieve DAY MONTH YEAR HOUR MIN SEC
! note MJD = JD - 2400000.5 . MJD2000=51544.0
! use j2000 as julian days (+ or -) starting at 1-JAN-2000 12:00 UT
!
define double j2000 /like OI_DATA%OI_VIS2%COL%MJD
define double julcen gmst Om L L1 dp de eps dT gast lmst last /like j2000
if (exist(oi%ha)) then
delete /var oi%ha
endif
define double oi%ha /like j2000 /global
let j2000 OI_DATA%OI_VIS2%COL%MJD-51544.5
let julcen j2000/36525.0
let gmst mod(280.46061837+360.98564736629*j2000,360.0)
let Om mod(125.04452-1934.136261*julcen,360.0)*PI|180 !ascending node of sun
let L mod(280.4665+36000.7698*julcen,360.0)*PI|180 !MeanLongOfSun
let L1 mod(218.3165+481267.8813*JULCEN,360.0)*PI|180 !MeanLongOfMoon
! change in the ecliptic longitude of a star due to the nutation
! (good to about 0.5arcsec)
let dp -17.2*sin(Om)-1.32*sin(2*L)-0.23*sin(2*l1)+0.21*sin(2*Om) !degrees
! shift in angle between the ecliptic and equator (good to about
! 0.1 arcsec)
let de 9.2*cos(Om)+0.57*cos(2*L)+0.1*cos(2*l1)-0.09*cos(2*Om) !degrees
! Obliquity of the Ecliptic
let eps 23.43929111-46.815/60/60*julcen !degrees
! difference between Mean and Apparent Sidereal Times
let dT dp*cos((de+eps)*PI/180)/3600
! Greenwich Apparent sidereal time
let gast gmst+dT
! Local Mean Sidereal
let lmst gmst+oi%arraylon
! Local Apparent Sidereal Time
let last gast+oi%arraylon
let oi%ha (last-oi_data%oi_target%COL%RAEP0)|15.0D0
delete /variable j2000 julcen gmst Om L L1 dp de eps dT gast lmst last
--
SylvainLafrasse - 07 Feb 2013