Wiki
Version 223 (Etienne Pallier, 02/08/2016 04:12 pm) → Version 224/246 (Etienne Pallier, 02/09/2016 11:18 am)
h1. Wiki
*Traitement batch (Python) faisant l'extraction des HK et les associant à leurs fichiers spectres respectifs dans un fichier résultat de log et en les contextualisant*
HELP sur ce wiki : http://www.redmine.org/projects/redmine/wiki/User_Guide
{{toc}}
---
h2. %{margin-left:0px; font-weight:normal; font-size:150; display:block; background-color:yellow; color:red}STATUT ACTUEL DU LOGICIEL%
*Version 2.0 en cours...*
https://projects.irap.omp.eu/projects/cspechkanalyser/roadmap (puis aller sur la version 2.0)
version:"Version 2.0" (lien direct vers la version 2.0)
Trié par sujet : https://projects.irap.omp.eu/projects/cspechkanalyser/issues?query_id=190
(ou bien cliquer sur l'onglet Roadmap)
---
h2. %{margin-left:0px; font-weight:normal; font-size:150; display:block; background-color:yellow; color:red}UTILISATION EFFECTIVE EN SALLE BLANCHE%
Ce logiciel est installé sur le Pc Chemcam, en salle blanche : http://planetowiki.irap.omp.eu/do/view/Computers/PcChemcam2Tour
http://planetowiki.irap.omp.eu/do/view/Computers/PcChemcam2Tour#Utilisation_du_logiciel_C_SPEC_H
---
h2. %{margin-left:0px; font-weight:normal; font-size:150; display:block; background-color:yellow; color:red}DEPOT SVN%
(cliquer sur l'onglet Dépôt)
* URL du dépôt : https://usvn-chemcam.irap.omp.eu/repo/c-spec-hk/trunk/
* Administration du dépôt : https://usvn-chemcam.irap.omp.eu
* Administrateur : Etienne Pallier
* Groupes :
* grp-admin-chemcam : Admin du dépot CHEMCAM (RW sur racine).
* grp-chemcam : Les développeurs de CHEMCAM (RW sur branches).
* On peut également créer un groupe grp-readonly-chemcam (et mettre les droits en read-only sur tout le projet)
* Ajout d'utilisateurs
* On peut ajouter des utilisateurs extérieurs via l'interface web, puis les ajouter dans les groupes (en tant que "Utilisateurs affectés").
* Dans le cas des utilisateurs IRAP, il faut qu'ils se connectent une première fois sur https://usvn-idems.irap.omp.eu avec leur login/mdp IRAP avant de pouvoir être affectés dans les groupes du repository.
* Dashboard : le dashboard du projet est https://usvn-chemcam.irap.omp.eu (=interface de gestion des utilisateurs, groupes et droits d'accès sur le repo, et également navigateur/explorateur du repo)
* Accès : Le repo SVN est accessible depuis partout dans le monde (svn-over-https only), la racine du repo est https://usvn-chemcam.irap.omp.eu/repo/chemcam/
* TODO: passer sur SourceSup : https://sourcesup.renater.fr, https://sourcesup.cru.fr/
---
h2. %{margin-left:0px; font-weight:normal; font-size:150; display:block; background-color:yellow; color:red}2015 Juin-Juillet - TRANSFORMATION (EN VUE D'UNE COLLABORATION AVEC C-GDL)%
Suite aux réunions du 29/4/15 et du 22/5/15 avec OG, WR, AC, PM, et EP,
un nouveau besoin a été exprimé qui pourrait être résolu en faisant collaborer 2 outils existants (C-SPEC-HK et [[cgdl:|C-GDL]]),
et en leur apportant quelques adaptations.
*Actions* :
- OG et AC : réfléchir à une simplification éventuelle de l'outil CGDL (en un seul formulaire au lieu de plusieurs onglets)
h3. %{margin-left:30px; font-weight:normal; display:block; background-color:lightgrey; color:black;}1. BESOIN%
Créer un *contexte* (ensemble d'informations de description) pour décrire chaque *observation* (série de tirs ChemCam) effectuée en salle blanche.
A ce contexte, seront automatiquement associés tous les fichiers (spectres, HK, ...) générés à l'occasion des tirs ChemCam.
Un nouveau contexte devra être créé à chaque fois qu'on change de roche, de distance de tir, ou bien de type d'atmosphère...
h3. %{margin-left:30px; font-weight:normal; display:block; background-color:lightgrey; color:black;}2. SOLUTION TECHNIQUE (updated 3/7/15)%
Pour répondre à ce besoin, plutôt que de re-développer un nouvel outil, on doit pouvoir faire collaborer efficacement deux outils existants que sont C-GDL et C-SPEC-HK,
et qui devront en outre subir quelques adaptations plus ou moins importantes.
*C-GDL* est une IHM Java qui permet de créer manuellement un contexte
*C-SPEC-HK* est un script Python qui s'exécute en permanence en arrière-plan, et qui associe automatiquement les fichiers HK (SOH) aux fichiers spectres et crée un fichier LOG quotidien décrivant ces associations (pour la journée), au fur et à mesure des tirs ChemCam
Il faut donc faire collaborer ces 2 outils pour qu'un contexte C-GDL soit automatiquement associé aux fichiers générés par les tirs ChemCam et qui sont regroupés par C-SPEC-HK (y-compris le fichier de LOG généré par C-SPEC-HK).
h4. 2.1 *Proposition de collaboration entre ces 2 outils*
{{thumbnail(Collaboration C-SPEC-HK et C-GDL.jpg, size=300, title=Dashboard_Controller)}}
_Document original (Open Office Presentation) : attachment:"Collaboration C-SPEC-HK et C-GDL.odg"_
h4. 2.2 *ALGORITHME GENERAL (en Python, mais lisible pour tout le monde)*
<pre><code class="python">
# delay between each iteration (seconds)
ITERATION_DELAY=60
# get today date
today = getDate() # YYYYMMDD
# process past data files if exist
processPastDataFiles(getPastDataFiles())
# Every ITERATION_DELAY, process today data files and context files
while(True):
# if exists new data files for today, re-process ALL today data files according to today context files
todayCurrentDataFiles = getTodayCurrentDataFiles()
if todayCurrentDataFiles:
# Move today current data files from data/ to EQM_DATA/<YYYYMMDD>/ALL/
archiveTodayCurrentDataFiles(todayCurrentDataFiles)
# Create/Update <YYYYMMDD>_LOG.csv log file in EQM_DATA/<YYYYMMDD>/, from today current data files in EQM_DATA/<YYYYMMDD>/ALL/
updateTodayLogFile()
# (re-)Associate all related data files (from TODAY but also from the PAST) with their context files from cgdl/contexts/
# and put them into EQM_DATA/YYYYMMDD/BY_CONTEXT/<context name>/
bindDataFilesWithContextFilesCreatedOrModifiedOrDeletedToday(getContextFilesCreatedOrModifiedOrDeletedToday())
# wait 60s
time.sleep(ITERATION_DELAY)
#########################
# FONCTIONS IMPORTANTES #
#########################
def copyFilesIntoContextFolderForContextFile(cf):
copyContextFileIntoContextFolderForContextFile(cf)
copyLogFileIntoContextFolderForContextFile(cf)
copyRelatedDataFilesIntoContextFolderForContextFile(cf)
def bindDataFilesWithContextFilesCreatedOrModifiedOrDeletedToday(contextFilesCreatedOrModifiedOrDeletedToday):
# Associate today ALL data files from EQM_DATA/YYYYMMDD/ALL/ with their context files from cgdl/contexts/ (and also the EQM_DATA/<YYYYMMDD>/>YYYYMMDD>_LOG.csv log file)
# and put them into EQM_DATA/YYYYMMDD/BY_CONTEXT/<context name>/
# Process each context file (from oldest to newest)
for cf in contextFilesCreatedOrModifiedOrDeletedToday:
# DELETED context file
if isDeletedContextFile(cf):
# This is not actual but only virtual "delete"
deleteContextFolderForContextFile(cf)
continue
# CREATED OR MODIFIED context file
#TODO: This should work even for 2 context files with different names but SAME date and time (both should get filled with the same content)
# if context folder does not yet exist, create it (EQM_DATA/YYYYMMDD/BY_CONTEXT/<context name>/)
if not existsContextFolderForContextFile(cf): createContextFolderForContextFile(cf)
copyFilesIntoContextFolderForContextFile(cf)
</code></pre>
h4. 2.3. *Explications du déroulement d'une session d'observations ChemCam (selon le diagramme ci-dessus) (A METTRE A JOUR)* :
Cette solution technique a été mise à jour suite à la réunion du 5/6/15 (avec OG, AC, WR, et Richard Hitier).
Au démarrage du pc, les 2 logiciels C-SPEC-HK et C_GDL se lancent automatiquement.
Voici le workflow idéal :
On commence par créer un contexte avec C-GDL (mais on peut très bien le faire a posteriori, après les observations). Une fois enregistré (YYYYMMDD_HHMM-HHMM_context_<parametres>.xml), ce fichier se trouve dans cgdl/contexts/
On effectue des tirs ChemCam. Ces tirs génèrent des fichiers (SPEC, SOH...) qui sont automatiquement placés dans le dossier data/.
Si jamais quelques tirs ont été effectués juste pour tester ChemCam avant de faire les vraies observations, on peut retarder la date début (Start time) du contexte pour que ces tirs ne soient pas pris en compte dans ce contexte.
C-SPEC-HK qui tourne en arrière plan effectue le traitement suivant toutes les minutes (ou delta secondes, délai à affiner en production) :
1) Il complète (ou crée, si c'est la première itération) le fichier de LOG (YYYYMMDD_LOG.csv) dans le dossier EQM_DATA/YYYYMMDD/
à partir des fichiers qui sont dans data/
C'est un fichier texte contenant des données tabulaires (CSV) qui font le lien entre les fichiers spectres et les fichiers HK (SOH et *+_TOUS_+* les autres) associés, en extrayant quelques paramètres essentiels dans les 2 types de fichiers
2) Il déplace (move) les fichiers concernés de data/ vers EQM_DATA/YYYYMMDD/ALL/, puisqu'ils ont été traités
3) Enfin, il associe les fichiers de données avec les contextes
Pour cela, il suit cet algorithme :
* pour chaque fichier de contexte trouvé dans le dossier cgdl/contexts/ qui est à la date du jour :
* si un dossier *du même nom* n'existe pas déjà dans EQM_DATA/YYYYMMDD/BY_CONTEXT/, il le crée
* si un dossier *du même nom* existe (qu'il vienne d'être créé ou bien qu'il soit déjà là depuis longtemps), il y copie (copy) tous les fichiers manquants (par rapport à ceux qui devraient y être)
les fichiers à copier sont :
* le fichier de contexte
* tous les fichiers du dossier EQM_DATA/YYYYMMDD/ALL/ dont la date est comprise entre le "start time" et le "stop time" du contexte
* la partie du fichier LOG concernée (on fera une sélection de "start time" à "stop time")
* s'il reste des dossiers qui n'ont pas de correspondance avec un contexte (parce qu'un contexte a été renommé ou supprimé), il leur ajoute le préfixe "_DELETED_"
_Par ce moyen, on peut créer un contexte qui se termine (bien) plus tard que l'heure actuelle (les nouveaux fichiers seront ainsi ajoutés au fur et à mesure de leur arrivée),
et on s'assure d'avoir un dossier par contexte, contenant le fichier de contexte (+LOG) et tous les fichiers de données associés.
Et ces dossiers devraient rester à jour même si le nom du contexte est modifié en cours de journée, voire même supprimé_.
NB : il faudra penser à supprimer manuellement de temps en temps les dossiers préfixés par "_DELETED_"
Les fichiers de données qui n'ont pas été associés à un contexte (soit par ce qu'aucun contexte n'a été créé dans la journée, soit parce qu'il n'y a pas de contexte créé pour cette période là)
seront de toutes façons dans le dossier EQM_DATA/YYYYMMDD/ALL/
Une fois les sessions d'observations ChemCam terminées, on peut fermer le logiciel C-GDL,
mais il n'est pas nécessaire de terminer le logiciel C-SPEC-HK car il s'arrêtera automatiquement lors de l'extinction du pc (brutalement, mais, sauf cas exceptionnel, sans dommage)
Il sera cependant préférable d'attendre quelques minutes avant d'éteindre le pc après la création, la modification, ou la suppression d'un contexte,
le temps que C-SPEC-HK traite ce changement dans une nouvelle itération...
h3. %{margin-left:30px; font-weight:normal; display:block; background-color:lightgrey; color:black;}ADAPTATIONS NÉCESSAIRES SUR LES 2 LOGICIELS%
*Adaptations de C-GDL* : voir [[cgdl:wiki#Collaboration-avec-loutil-C-SPEC-HK|C-GDL]]
*Adaptations de C-SPEC-HK* :
(Le fichier de LOG est un tableau de synthèse qui sera utile pour la partie processing, sorte de masterlist)
Transférer TOUS les types de fichiers (TXT, RAW…)
Fichier SOH le plus près AVANT le transmit (génère le spectre)
(ce fichier SOH a été fait après le tir, et avant le transmit)
Changer label Distance : dist(mm) => dist SEED (mm)
Convertir la colonne pm en distance réelle : (quelqu'un donnera la formule) « dist real (mm)»
C-Spec-HK est déjà installé sur le pc-EGSE. Il faudra y ajouter C-GDL.
Fichier LOG : Produire un CSV + un fichier HTML (ou fichier texte séparé par tabulations) pour qu'il soit lisible sans devoir passer par Open Office
DARK BEFORE/AFTER : priorité au DARK AFTER
Le DARK BEFORE est très rare, il existerait seulement si il y a 2 DARK à la suite (le 2ème serait le DARK BEFORE du SPECTRE LIBS qui arrive ensuite)
=> pour simplifier, on peut le supprimer (donc supprimer 2 colonnes dans le fichier LOG)
Objectif : passer le délai de la boucle du traitement quotidien à 10 secondes (au lieu de 60 actuellement)
Les 2 fichiers "LOG général" et "LOG du jour" doivent s’afficher automatiquement au démarrage
Le LOG général affiche l'état en cours d'exécution du script, pour savoir où on en est :
- a) traitement global des fichiers, avec affichage des dossiers jours créés
Ne pas afficher le contenu de /home/vx/EQM_DATA/
(log files « created » in …)
car ces dossiers ont été créés antérieurement
N’afficher le contenu QUE du dossier qui vient d’être créé
- b) traitement quotidien des fichiers du jour, avec affichage de :
- numéro d'itération
- fichiers SPECTRE et SOH traités (+ leur nombre)
Le LOG quotidien affiche le contenu du fichier LOG du jour (qui se remplit au fur et à mesure)
Mettre les 4 champs de température laser
Supprimer nshots
Dans l'idéal, si on veut vraiment faire collaborer les 3 outils C-Spec-HK, C-GDL, et la prise de photos par la webcam du pc portable de la salle blanche (...),
la communication avec la webcam nécessiterait de mettre les 2 pc (PC-EGSE et le portable webcam) en réseau (soit sur le réseau global IRAP, soit sur un réseau privé salle blanche avec un hub ou switch ; sachant que pc-EGSE est déjà en réseau privé avec le BU-EGSE, il faudrait donc mettre ces 3 éléments sur un même réseau, pas simple...).
En attendant, on pourrait se contenter d'un "mode dégradé", qui consisterait à copier manuellement (via clé ou disque usb) les photos de la webcam sur le pc-EGSE
(Changement Technique internes : Ne laisser que c-spec-hk-workflow à la racine du projet, le reste doit être dans un sous-dossier (contiendra c-spec-hk + tests))
---
---
h2. %{margin-left:0px; font-weight:normal; font-size:150; display:block; background-color:yellow; color:red}SPECIFICATIONS%
h3. Schéma de connexion
PcEGSE <==RJ45==> EGSE <==serial==> ChemCam
ChemCam (garde tous les spectres en RAM) : serial==> BU (Body Unit) <== MU (Mast Unit)
- MU : fait les tirs
- BU : analyse les spectres
SOH (Spectra O? HK)
h3. Types d’observations
(sur la ligne DOLIBS modifier controlWord)
Bit # Bit Value Fonction si activé
----- --------- ------------------
0 1 Do focus : effectuer une focalisation (voir focusAlgorithm)
1 2 Pre dark spectra : acquisition d’un spectre dark AVANT les tirs
2 4 Post dark spectra : acquisition d’un spectre dark APRES les tirs
*3 8 Enable laser : effectuer un (des) tir(s) laser (voir Nshots) (sinon, c'est un DARK)*
4 16 Collect spectra : acquisition de spectre pendant les tirs
5 32 BS
=> 25 = 1+8+16 = tir avec laser
=> 17 = 1+0+16 = tir sans laser (DARK)
Bits 0 et 1 pas utilisés !!! :
Le mode (Bit0 ET Bit1 activés) ne fait pas des darks after et before satisfaisant donc on le fait séparément en faisant un spectre sans enable laser,
ce qui génère tous ces spectres avec un controlWord =17 dans la liste.
h3. Fichier spectre
Suite d'intensités pour chaque canal (dans l'ordre 0, 1, 2, 3, ... 6444)
A représenter sur axe
- X : channel number, assimilable à longueur d'onde : 0 à 6444
- Y : intensité
Si fichier DARK, alors intensités (à peu près) constantes (toutes égales) :
=> donne le bruit de fond de l'instrument, puisque on a zero lumière
h3. Stratégie de développement
Prendre le last stack only
Lire fichier *_spect.TXT et *_SOH.TXT associé (celui qui est juste avant, < 5mn avant)
1 fich/jour
Methods to write :
findSOH(liste des *SOH.TXT du jour, spect.TXT)
=> convertit les noms SOH en timestamps, trouve le SOH qui est juste avant le spect.TXT (< 5mn avant)
findDARK(liste des *spect.TXT (dark), le spect.TXT pour lequel on veut le dark)
=> retourne le fichier dark qui est juste après (<5mn) (mais, peut être before...)
=> regarde un peu autour (avant et après)
findAutofocus(...)
=> *_afocus.TXT (juste prendre son nom, pas son contenu), qui est AVANT
h3. EXEMPLE DE FICHIER RESULTAT (LOG) A OBTENIR (1 par jour)
data_Feb25_2014_5
firstfile = Feb25_161115_2014_spect.TXT
lastfile = Feb25_162059_2014_spect.TXT
id, SPECT_file, SOH_file,
// from *_SOH.TXT file :
nbStacks // Nb de stacks (indiqué par le nb occurences de "mast SOH" qui indique le début d'un nouveau stack) - Prendre seulement les HK du LAST stack
temp_laser_min(degC), temp_laser_max(degC), // prendre min et max des 4 HK_Temp_Laser_1-4
temp_spect(C), // Spectrometer_Temp
pm(cnts), // Motor_Position
// from *_spect.TXT file :
dist(mm), // distance to target distToTarget
nshots, // (Nshots) ajouter ici "nshots_real" car le laser fait parfois plus de shots que prévu (erreur) (lire 1ère ligne pour savoir le nb de col)
controlWord, // 25 = tir avec laser, 17 = tir sans laser (DARK)
data_mean, // moyenne des data \ nbshots reels (= intensité moyenne ?) (à lire from >>>>>Begin Processed Spectral Data<<<<<)
dark_file, // remplacer par dark_file_before, dark_file_after (file name)
mean_spect_value - dark // (= data_mean - ???)
// Liste des fichiers *_spect.TXT associés avec leurs paramètres HK (trouvés dans *_SOH.TXT) :
id, SPECT_file, SOH_file, nbStacks, temp_laser_min, temp_laser_max, temp_spect, pm, dist(mm), nshots, controlWord, data_mean, dark_file_before, dark_file_after, mean_spect_value - dark
1 Feb25_161115_2014_spect.TXT 161055 nbStacks 4.25 5.44 30.15 5499 3000 10 25 677.39 161142 dark_file_after 50.28
2 (D)Feb25_161142_2014_spect.TXT 161132 4.29 5.48 30.15 5499 3000 10 17 627.11 - 627.11
3 Feb25_161243_2014_spect.TXT 161210 4.29 5.33 30.15 5444 2951 10 25 649.07 161307 19.72
4 Feb25_161307_2014_spect.TXT 161257 4.25 5.55 30.15 5444 3000 10 17 629.35 - 629.35
5 Feb25_161339_2014_spect.TXT 161329 4.25 5.59 30.15 5454 2959 10 25 674.78 161404 43.76
6 Feb25_161404_2014_spect.TXT 161353 4.29 5.52 30.15 5454 3000 10 17 631.02 - 631.02
7 Feb25_161435_2014_spect.TXT 161425 4.21 5.55 30.15 5463 2967 10 25 693.77 161500 60.76
8 Feb25_161500_2014_spect.TXT 161450 4.33 5.59 30.15 5463 3000 10 17 633.01 - 633.01
9 Feb25_161532_2014_spect.TXT 161521 4.29 5.59 30.15 5473 2975 10 25 703.08 161556 68.71
10 Feb25_161556_2014_spect.TXT 161546 4.36 5.52 30.15 5473 3000 10 17 634.36 - 634.36
11 Feb25_161646_2014_spect.TXT 161636 4.33 5.63 30.15 5482 2983 10 25 702.22 161711 67.98
12 Feb25_161711_2014_spect.TXT 161701 4.33 5.59 30.15 5482 3000 10 17 634.24 - 634.24
13 Feb25_161743_2014_spect.TXT 161733 4.36 5.55 30.15 5493 2992 10 25 695.08 161808 58.88
14 Feb25_161808_2014_spect.TXT 161757 4.36 5.55 30.15 5493 3000 10 17 636.20 - 636.20
15 Feb25_161840_2014_spect.TXT 161829 4.40 5.59 30.15 5502 3000 10 25 683.94 161905 46.74
16 Feb25_161905_2014_spect.TXT 161854 4.40 5.59 30.15 5502 3000 10 17 637.20 - 637.20
17 Feb25_161937_2014_spect.TXT 161926 4.40 5.59 30.15 5513 3009 10 25 675.67 162002 37.24
18 Feb25_162002_2014_spect.TXT 161951 4.44 5.59 30.15 5513 3000 10 17 638.43 - 638.43
19 Feb25_162034_2014_spect.TXT 162023 4.36 5.63 30.15 5522 3017 10 25 663.56 162059 24.10
20 (D) Feb25_162059_2014_spect.TXT 162048 4.40 5.63 30.15 5522 3000 10 17 639.46 - 639.46
h3. CAS EXCEPTIONNELS à traiter (Exceptions)
* NoDataFileFoundException : pas de fichier (ni Spectre ni SOH) dans le dossier DATA/
* MalformedFileException : fichier (Spectre ou SOH) avec format incorrect
* UnknownCaseException : Cas inconnu ; par exemple, controlWord ni 17 (DARK) ni 25 (PAS DARK) !!!
* noSOHFileFoundForSpectraFileException : pas de fichier SOH (HK) trouvé pour un fichier Spectra (data)
---
h2. RECUPERATION DU PROJET
*a) Directement, depuis svn*
svn co https://usvn-chemcam.irap.omp.eu/repo/c-spec-hk/trunk c-spec-hk-svn
Si on ne veut pas rester synchronisé avec le repository (juste une copie du projet au temps t, sans les fichiers de versionning .svn) :
svn export https://usvn-chemcam.irap.omp.eu/repo/c-spec-hk/trunk c-spec-hk-svn
*b) Par téléchargement (100 Mo à cause des données)*
https://projects.irap.omp.eu/attachments/download/1237/c-spec-hk_1.1.tgz
---
h2. EXECUTION
h3. 1) PRÉREQUIS : Python 2.7
h4. Sur Mac (Machine de développement)
Avec Macport, pour que la version 2.7 soit bien la version par défaut quand on tape "python" :
sudo port select --set python python27
$ which python
/opt/local/bin/python
$ python --version
Python 2.7.9
Mettre à jour MacPort :
sudo port -v selfupdate
sudo port upgrade outdated
h4. Sur CentOS 6.5 (serveur de production)
(fait le 19/3/15 sur le pc-EGSE Chemcam ; cf fiche wiki du pc-EGSE Chemcam : http://planetowiki.irap.omp.eu/do/view/Computers/PcChemcam2Tour)
Par défaut, Cent0S 6.5 propose Python 2.6
(Voir l'installation de Python 2.7 faite sur le pc-EGSE Chemcam : http://planetowiki.irap.omp.eu/do/view/Computers/PcChemcam2Tour#Installation_de_Python_2_7)
h3. 2) EXECUTING TESTS
h4. Depuis Eclipse
Ouvrir la console adaptée : Window / Show View / PyUnit
clic-droit sur test/c_spec_hk_TEST.py
Run As / Python unit-test
h4. En mode ligne de commande
h5. TESTS faits avec Python 2.7
*1) Tests Unitaires et Fonctionnels*
cd test/
$ py27 premiertest.py
<pre>
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
</pre>
$ py27 c_spec_hk_TEST.py
<pre>
...
======================================================================
----------------------------------------------------------------------
Ran 14 tests in 5.833s
OK
</pre>
*2) Tests de Performance (Benchmark)*
Depuis la racine du projet :
<pre>
$ py27 c_spec_hk.py -t
...Executing main program...
Testing execution time of several methods
All times are in SECONDS
Testing _extractSpectraFileNamesIndexedAndOrdered(dataFileNames) method called from a function time_extractSpectraFileNamesIndexedAndOrdered() (takes about 0.0008" on a MacBookPro 11.1) :
0.000790863037109
Testing _extractSpectraFileNamesIndexedAndOrdered(dataFileNames) method called directly (takes about 0.00012" on a MacBookPro 11.1) :
0.000117941689491
Testing getLogInfosForDay(day,spectraFilesForTheDay) method called directly (takes about 0.06" on a MacBookPro 11.1) :
0.0429699897766
Testing main method createAllLogFiles(True) called directly (takes about 2.8" on a MacBookPro 11.1) :
test/DATASET/UC0_NOMINAL/LOGS/20110223
test/DATASET/UC0_NOMINAL/LOGS/20130223
test/DATASET/UC0_NOMINAL/LOGS/20140123
test/DATASET/UC0_NOMINAL/LOGS/20140223
test/DATASET/UC0_NOMINAL/LOGS/20140225
test/DATASET/UC0_NOMINAL/LOGS/20140226
test/DATASET/UC0_NOMINAL/LOGS/20150223
Log files created in test/DATASET/UC0_NOMINAL/LOGS/ :
total 56
drwxrwxr-x 2 vx vx 4096 19 mars 16:39 20110223
-rw-rw-r-- 1 vx vx 471 19 mars 16:39 2011_0223_logs.csv
drwxrwxr-x 2 vx vx 4096 19 mars 16:39 20130223
-rw-rw-r-- 1 vx vx 471 19 mars 16:39 2013_0223_logs.csv
drwxrwxr-x 2 vx vx 4096 19 mars 16:39 20140123
-rw-rw-r-- 1 vx vx 471 19 mars 16:39 2014_0123_logs.csv
drwxrwxr-x 2 vx vx 4096 19 mars 16:39 20140223
-rw-rw-r-- 1 vx vx 471 19 mars 16:39 2014_0223_logs.csv
drwxrwxr-x 2 vx vx 4096 19 mars 16:39 20140225
-rw-rw-r-- 1 vx vx 2849 19 mars 16:39 2014_0225_logs.csv
drwxrwxr-x 2 vx vx 4096 19 mars 16:39 20140226
-rw-rw-r-- 1 vx vx 474 19 mars 16:39 2014_0226_logs.csv
drwxrwxr-x 2 vx vx 4096 19 mars 16:39 20150223
-rw-rw-r-- 1 vx vx 471 19 mars 16:39 2015_0223_logs.csv
1.91459012032
Average time per day : 0.273513
*** finished TIMING ***
</pre>
h5. TESTS faits avec Python 2.6
C'est encore possible de faire tourner le logiciel en Python 2.6 dans la version 1.1.x, mais ça ne sera plus garanti dans l'avenir (à partir de la version 1.2.x)
*1) Tests Unitaires et Fonctionnels*
cd test/
$ python premiertest.py
<pre>
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
</pre>
$ python c_spec_hk_TEST.py
<pre>
...
======================================================================
----------------------------------------------------------------------
Ran 14 tests in 6.742s
OK
</pre>
---
*2) Tests de Performance (Benchmark)*
Depuis la racine du projet
$ ./c_spec_hk.py -t
<pre>
...Executing main program...
Testing execution time of several methods
All times are in SECONDS
Testing _extractSpectraFileNamesIndexedAndOrdered(dataFileNames) method called from a function time_extractSpectraFileNamesIndexedAndOrdered() (takes about 0.0008" on a MacBookPro 11.1) :
0.00105306601524
Testing _extractSpectraFileNamesIndexedAndOrdered(dataFileNames) method called directly (takes about 0.00012" on a MacBookPro 11.1) :
0.000152537894249
Testing getLogInfosForDay(day,spectraFilesForTheDay) method called directly (takes about 0.06" on a MacBookPro 11.1) :
0.0518409013748
Testing main method createAllLogFiles(True) called directly (takes about 2.8" on a MacBookPro 11.1) :
test/DATASET/UC0_NOMINAL/LOGS/20110223
test/DATASET/UC0_NOMINAL/LOGS/20130223
test/DATASET/UC0_NOMINAL/LOGS/20140123
test/DATASET/UC0_NOMINAL/LOGS/20140223
test/DATASET/UC0_NOMINAL/LOGS/20140225
test/DATASET/UC0_NOMINAL/LOGS/20140226
test/DATASET/UC0_NOMINAL/LOGS/20150223
Log files created in test/DATASET/UC0_NOMINAL/LOGS/ :
total 56
drwxrwxr-x 3 vx vx 4096 19 mars 14:01 20110223
-rw-rw-r-- 1 vx vx 471 19 mars 14:01 2011_0223_logs.csv
drwxrwxr-x 3 vx vx 4096 19 mars 14:01 20130223
-rw-rw-r-- 1 vx vx 471 19 mars 14:01 2013_0223_logs.csv
drwxrwxr-x 3 vx vx 4096 19 mars 14:01 20140123
-rw-rw-r-- 1 vx vx 471 19 mars 14:01 2014_0123_logs.csv
drwxrwxr-x 3 vx vx 4096 19 mars 14:01 20140223
-rw-rw-r-- 1 vx vx 471 19 mars 14:01 2014_0223_logs.csv
drwxrwxr-x 3 vx vx 4096 19 mars 14:01 20140225
-rw-rw-r-- 1 vx vx 2849 19 mars 14:01 2014_0225_logs.csv
drwxrwxr-x 3 vx vx 4096 19 mars 14:01 20140226
-rw-rw-r-- 1 vx vx 474 19 mars 14:01 2014_0226_logs.csv
drwxrwxr-x 3 vx vx 4096 19 mars 14:01 20150223
-rw-rw-r-- 1 vx vx 471 19 mars 14:01 2015_0223_logs.csv
2.33647012711
Average time per day : 0.333781
*** finished TIMING ***
</pre>
h3. 3) EXECUTING MAIN SCRIPT
h4. Depuis Eclipse
clic-droit sur c_spec_hk.py
Run As / Python Run
h4. In Command line mode
a) Pour voir l'aide :
$ python c_spec_hk.py -h
...Executing main program...
Usage:
python27 c_spec_hk.py [-i <inputDataDir>] [-o <outputLogDir>]
OR
python27 c_spec_hk.py [--inputDir=<inputDataDir>] [--outputDir=<outputLogDir>]
Ex: python27 c_spec_hk.py-i './DATA' -o './LOGS'
All options available are (none is mandatory) :
-d : activate DEBUG mode
-h : print this HELP message
-n : do NOT create sub-directories (like YYYYMMDD) for each day
-t : test execution TIME of several methods
-v : print current VERSION number
-i <inputDataDir> or --input=<inputDataDir> : set INPUT directory from where DATA files are READ (default is "DATA")
-o <outputDataDir> or --output=<outputLogDir> : set OUTPUT directory where LOG files are WRITTEN to (default is "LOGS")
b) Speed testing (benchmark)
cf https://projects.irap.omp.eu/projects/cspechkanalyser/wiki/Wiki#TESTS-faits-avec-Python-27 (section "Tests de performance")
c) Pour faire un test avec les données d'échantillon fournies :
python27 c_spec_hk.py -i test/DATASET/UC0_NOMINAL/DATA -o /tmp/LOGS
(il faudra d'abord créer le dossier LOGS/ dans /tmp)
Exemple d'affichage attendu :
...Executing main program...
inputDataDir is "test/DATASET/UC0_NOMINAL/DATA"
ouputLogDir is "/tmp/LOGS"
The DATA DIR (input) contains 126 files (total)
The DATA DIR (input) contains 26 SPECTRA text files
Log files created in /tmp/LOGS/ :
['20110223', '20130223', '20140123', '20140223', '20140225', '20140226', '20150223']
---
h2. DAILY WORKFLOW
h3. 1) Voici la structure de fichiers réalisée sur le pc-EGSE :
Les nouveaux fichiers de données produits lors des tirs de Chemcam sont automatiquement placés dans /home/vx/data/ (au fur et à mesure des tirs)
Ils sont ensuite déplacés dans /home/vx/EQM_DATA/AAAAMMJJ/DATA/ lorsqu'ils ont été traités
Les fichiers de LOG (relation spectre => HK) créés sont placés directment dans /home/vx/EQM_DATA/AAAAMMJJ/
<pre>
- /home/vx/data/ : données d'origine restant à traiter (spectres et HK), provenant directement de la manip
- /home/vx/EQM_DATA/ : données traitées (spectres, HK, et fichiers logs produits)
- AAAAMMJJ/ : un dossier par jour
- le fichier log produit (CSV)
- DATA/ : les données d'origine (spectres et HK)
</pre>
h3. 2) WORKFLOW
Ce workflow devrait normalement fonctionner dans tous les cas de figure (démarrage n'importe quand, en début de journée ou en cours de journée, ou même reprise après un crash brutal...)
Démarrage automatique du workflow à partir du Démarrage du pc-EGSE
1) Faire tourner le traitement sur TOUS les fichiers présents dans le dossier /home/vx/data/ (SAUF les fichiers du jour J, s'il y en a...)
Les fichiers LOGS produits sont placés automatiquement dans le dossier correspondant à leur jour /home/vx/EQM_DATA/AAAAMMJJ/
(AAAA année en 4 chiffres, MM mois en deux chiffres et JJ jour du mois en deux chiffres)
2) Déplacer TOUS les fichiers de /home/vx/data/ dans leur dossier correspondant /home/vx/EQM_DATA/AAAAMMJJ/DATA/ (SAUF les fichiers du jour J, s'il y en a...)
3) (Every 5 seconds) : pour les fichiers du jour J
S'il existe au moins un fichier dans /home/vx/data/, faire tourner le traitement sur TOUS les fichiers présents
LE FICHIER LOG produit (un seul pour le jour J) est placé automatiquement dans le dossier correspondant à son jour (J) /home/vx/EQM_DATA/AAAAMMJJ/
Attention : on ne déplace pas les fichiers dans leur dossier correspondant /home/vx/EQM_DATA/AAAAMMJJ/DATA/ ; cela sera fait au prochain démarrage du workflow) ; cela permet d'avoir un fichier LOG qui se complète au fur et à mesure de la journée
Il faudrait quand meme les COPIER (cp) (mais pas les DEPLACER (mv))
OPTIMISATION : Exécution SSI le nb de fichiers du repertoire DATA/ a changé (tenir à jour un fichier contenant le nb de files)
Fin du workflow à l'extinction du pc-EGSE
*Traitement batch (Python) faisant l'extraction des HK et les associant à leurs fichiers spectres respectifs dans un fichier résultat de log et en les contextualisant*
HELP sur ce wiki : http://www.redmine.org/projects/redmine/wiki/User_Guide
{{toc}}
---
h2. %{margin-left:0px; font-weight:normal; font-size:150; display:block; background-color:yellow; color:red}STATUT ACTUEL DU LOGICIEL%
*Version 2.0 en cours...*
https://projects.irap.omp.eu/projects/cspechkanalyser/roadmap (puis aller sur la version 2.0)
version:"Version 2.0" (lien direct vers la version 2.0)
Trié par sujet : https://projects.irap.omp.eu/projects/cspechkanalyser/issues?query_id=190
(ou bien cliquer sur l'onglet Roadmap)
---
h2. %{margin-left:0px; font-weight:normal; font-size:150; display:block; background-color:yellow; color:red}UTILISATION EFFECTIVE EN SALLE BLANCHE%
Ce logiciel est installé sur le Pc Chemcam, en salle blanche : http://planetowiki.irap.omp.eu/do/view/Computers/PcChemcam2Tour
http://planetowiki.irap.omp.eu/do/view/Computers/PcChemcam2Tour#Utilisation_du_logiciel_C_SPEC_H
---
h2. %{margin-left:0px; font-weight:normal; font-size:150; display:block; background-color:yellow; color:red}DEPOT SVN%
(cliquer sur l'onglet Dépôt)
* URL du dépôt : https://usvn-chemcam.irap.omp.eu/repo/c-spec-hk/trunk/
* Administration du dépôt : https://usvn-chemcam.irap.omp.eu
* Administrateur : Etienne Pallier
* Groupes :
* grp-admin-chemcam : Admin du dépot CHEMCAM (RW sur racine).
* grp-chemcam : Les développeurs de CHEMCAM (RW sur branches).
* On peut également créer un groupe grp-readonly-chemcam (et mettre les droits en read-only sur tout le projet)
* Ajout d'utilisateurs
* On peut ajouter des utilisateurs extérieurs via l'interface web, puis les ajouter dans les groupes (en tant que "Utilisateurs affectés").
* Dans le cas des utilisateurs IRAP, il faut qu'ils se connectent une première fois sur https://usvn-idems.irap.omp.eu avec leur login/mdp IRAP avant de pouvoir être affectés dans les groupes du repository.
* Dashboard : le dashboard du projet est https://usvn-chemcam.irap.omp.eu (=interface de gestion des utilisateurs, groupes et droits d'accès sur le repo, et également navigateur/explorateur du repo)
* Accès : Le repo SVN est accessible depuis partout dans le monde (svn-over-https only), la racine du repo est https://usvn-chemcam.irap.omp.eu/repo/chemcam/
* TODO: passer sur SourceSup : https://sourcesup.renater.fr, https://sourcesup.cru.fr/
---
h2. %{margin-left:0px; font-weight:normal; font-size:150; display:block; background-color:yellow; color:red}2015 Juin-Juillet - TRANSFORMATION (EN VUE D'UNE COLLABORATION AVEC C-GDL)%
Suite aux réunions du 29/4/15 et du 22/5/15 avec OG, WR, AC, PM, et EP,
un nouveau besoin a été exprimé qui pourrait être résolu en faisant collaborer 2 outils existants (C-SPEC-HK et [[cgdl:|C-GDL]]),
et en leur apportant quelques adaptations.
*Actions* :
- OG et AC : réfléchir à une simplification éventuelle de l'outil CGDL (en un seul formulaire au lieu de plusieurs onglets)
h3. %{margin-left:30px; font-weight:normal; display:block; background-color:lightgrey; color:black;}1. BESOIN%
Créer un *contexte* (ensemble d'informations de description) pour décrire chaque *observation* (série de tirs ChemCam) effectuée en salle blanche.
A ce contexte, seront automatiquement associés tous les fichiers (spectres, HK, ...) générés à l'occasion des tirs ChemCam.
Un nouveau contexte devra être créé à chaque fois qu'on change de roche, de distance de tir, ou bien de type d'atmosphère...
h3. %{margin-left:30px; font-weight:normal; display:block; background-color:lightgrey; color:black;}2. SOLUTION TECHNIQUE (updated 3/7/15)%
Pour répondre à ce besoin, plutôt que de re-développer un nouvel outil, on doit pouvoir faire collaborer efficacement deux outils existants que sont C-GDL et C-SPEC-HK,
et qui devront en outre subir quelques adaptations plus ou moins importantes.
*C-GDL* est une IHM Java qui permet de créer manuellement un contexte
*C-SPEC-HK* est un script Python qui s'exécute en permanence en arrière-plan, et qui associe automatiquement les fichiers HK (SOH) aux fichiers spectres et crée un fichier LOG quotidien décrivant ces associations (pour la journée), au fur et à mesure des tirs ChemCam
Il faut donc faire collaborer ces 2 outils pour qu'un contexte C-GDL soit automatiquement associé aux fichiers générés par les tirs ChemCam et qui sont regroupés par C-SPEC-HK (y-compris le fichier de LOG généré par C-SPEC-HK).
h4. 2.1 *Proposition de collaboration entre ces 2 outils*
{{thumbnail(Collaboration C-SPEC-HK et C-GDL.jpg, size=300, title=Dashboard_Controller)}}
_Document original (Open Office Presentation) : attachment:"Collaboration C-SPEC-HK et C-GDL.odg"_
h4. 2.2 *ALGORITHME GENERAL (en Python, mais lisible pour tout le monde)*
<pre><code class="python">
# delay between each iteration (seconds)
ITERATION_DELAY=60
# get today date
today = getDate() # YYYYMMDD
# process past data files if exist
processPastDataFiles(getPastDataFiles())
# Every ITERATION_DELAY, process today data files and context files
while(True):
# if exists new data files for today, re-process ALL today data files according to today context files
todayCurrentDataFiles = getTodayCurrentDataFiles()
if todayCurrentDataFiles:
# Move today current data files from data/ to EQM_DATA/<YYYYMMDD>/ALL/
archiveTodayCurrentDataFiles(todayCurrentDataFiles)
# Create/Update <YYYYMMDD>_LOG.csv log file in EQM_DATA/<YYYYMMDD>/, from today current data files in EQM_DATA/<YYYYMMDD>/ALL/
updateTodayLogFile()
# (re-)Associate all related data files (from TODAY but also from the PAST) with their context files from cgdl/contexts/
# and put them into EQM_DATA/YYYYMMDD/BY_CONTEXT/<context name>/
bindDataFilesWithContextFilesCreatedOrModifiedOrDeletedToday(getContextFilesCreatedOrModifiedOrDeletedToday())
# wait 60s
time.sleep(ITERATION_DELAY)
#########################
# FONCTIONS IMPORTANTES #
#########################
def copyFilesIntoContextFolderForContextFile(cf):
copyContextFileIntoContextFolderForContextFile(cf)
copyLogFileIntoContextFolderForContextFile(cf)
copyRelatedDataFilesIntoContextFolderForContextFile(cf)
def bindDataFilesWithContextFilesCreatedOrModifiedOrDeletedToday(contextFilesCreatedOrModifiedOrDeletedToday):
# Associate today ALL data files from EQM_DATA/YYYYMMDD/ALL/ with their context files from cgdl/contexts/ (and also the EQM_DATA/<YYYYMMDD>/>YYYYMMDD>_LOG.csv log file)
# and put them into EQM_DATA/YYYYMMDD/BY_CONTEXT/<context name>/
# Process each context file (from oldest to newest)
for cf in contextFilesCreatedOrModifiedOrDeletedToday:
# DELETED context file
if isDeletedContextFile(cf):
# This is not actual but only virtual "delete"
deleteContextFolderForContextFile(cf)
continue
# CREATED OR MODIFIED context file
#TODO: This should work even for 2 context files with different names but SAME date and time (both should get filled with the same content)
# if context folder does not yet exist, create it (EQM_DATA/YYYYMMDD/BY_CONTEXT/<context name>/)
if not existsContextFolderForContextFile(cf): createContextFolderForContextFile(cf)
copyFilesIntoContextFolderForContextFile(cf)
</code></pre>
h4. 2.3. *Explications du déroulement d'une session d'observations ChemCam (selon le diagramme ci-dessus) (A METTRE A JOUR)* :
Cette solution technique a été mise à jour suite à la réunion du 5/6/15 (avec OG, AC, WR, et Richard Hitier).
Au démarrage du pc, les 2 logiciels C-SPEC-HK et C_GDL se lancent automatiquement.
Voici le workflow idéal :
On commence par créer un contexte avec C-GDL (mais on peut très bien le faire a posteriori, après les observations). Une fois enregistré (YYYYMMDD_HHMM-HHMM_context_<parametres>.xml), ce fichier se trouve dans cgdl/contexts/
On effectue des tirs ChemCam. Ces tirs génèrent des fichiers (SPEC, SOH...) qui sont automatiquement placés dans le dossier data/.
Si jamais quelques tirs ont été effectués juste pour tester ChemCam avant de faire les vraies observations, on peut retarder la date début (Start time) du contexte pour que ces tirs ne soient pas pris en compte dans ce contexte.
C-SPEC-HK qui tourne en arrière plan effectue le traitement suivant toutes les minutes (ou delta secondes, délai à affiner en production) :
1) Il complète (ou crée, si c'est la première itération) le fichier de LOG (YYYYMMDD_LOG.csv) dans le dossier EQM_DATA/YYYYMMDD/
à partir des fichiers qui sont dans data/
C'est un fichier texte contenant des données tabulaires (CSV) qui font le lien entre les fichiers spectres et les fichiers HK (SOH et *+_TOUS_+* les autres) associés, en extrayant quelques paramètres essentiels dans les 2 types de fichiers
2) Il déplace (move) les fichiers concernés de data/ vers EQM_DATA/YYYYMMDD/ALL/, puisqu'ils ont été traités
3) Enfin, il associe les fichiers de données avec les contextes
Pour cela, il suit cet algorithme :
* pour chaque fichier de contexte trouvé dans le dossier cgdl/contexts/ qui est à la date du jour :
* si un dossier *du même nom* n'existe pas déjà dans EQM_DATA/YYYYMMDD/BY_CONTEXT/, il le crée
* si un dossier *du même nom* existe (qu'il vienne d'être créé ou bien qu'il soit déjà là depuis longtemps), il y copie (copy) tous les fichiers manquants (par rapport à ceux qui devraient y être)
les fichiers à copier sont :
* le fichier de contexte
* tous les fichiers du dossier EQM_DATA/YYYYMMDD/ALL/ dont la date est comprise entre le "start time" et le "stop time" du contexte
* la partie du fichier LOG concernée (on fera une sélection de "start time" à "stop time")
* s'il reste des dossiers qui n'ont pas de correspondance avec un contexte (parce qu'un contexte a été renommé ou supprimé), il leur ajoute le préfixe "_DELETED_"
_Par ce moyen, on peut créer un contexte qui se termine (bien) plus tard que l'heure actuelle (les nouveaux fichiers seront ainsi ajoutés au fur et à mesure de leur arrivée),
et on s'assure d'avoir un dossier par contexte, contenant le fichier de contexte (+LOG) et tous les fichiers de données associés.
Et ces dossiers devraient rester à jour même si le nom du contexte est modifié en cours de journée, voire même supprimé_.
NB : il faudra penser à supprimer manuellement de temps en temps les dossiers préfixés par "_DELETED_"
Les fichiers de données qui n'ont pas été associés à un contexte (soit par ce qu'aucun contexte n'a été créé dans la journée, soit parce qu'il n'y a pas de contexte créé pour cette période là)
seront de toutes façons dans le dossier EQM_DATA/YYYYMMDD/ALL/
Une fois les sessions d'observations ChemCam terminées, on peut fermer le logiciel C-GDL,
mais il n'est pas nécessaire de terminer le logiciel C-SPEC-HK car il s'arrêtera automatiquement lors de l'extinction du pc (brutalement, mais, sauf cas exceptionnel, sans dommage)
Il sera cependant préférable d'attendre quelques minutes avant d'éteindre le pc après la création, la modification, ou la suppression d'un contexte,
le temps que C-SPEC-HK traite ce changement dans une nouvelle itération...
h3. %{margin-left:30px; font-weight:normal; display:block; background-color:lightgrey; color:black;}ADAPTATIONS NÉCESSAIRES SUR LES 2 LOGICIELS%
*Adaptations de C-GDL* : voir [[cgdl:wiki#Collaboration-avec-loutil-C-SPEC-HK|C-GDL]]
*Adaptations de C-SPEC-HK* :
(Le fichier de LOG est un tableau de synthèse qui sera utile pour la partie processing, sorte de masterlist)
Transférer TOUS les types de fichiers (TXT, RAW…)
Fichier SOH le plus près AVANT le transmit (génère le spectre)
(ce fichier SOH a été fait après le tir, et avant le transmit)
Changer label Distance : dist(mm) => dist SEED (mm)
Convertir la colonne pm en distance réelle : (quelqu'un donnera la formule) « dist real (mm)»
C-Spec-HK est déjà installé sur le pc-EGSE. Il faudra y ajouter C-GDL.
Fichier LOG : Produire un CSV + un fichier HTML (ou fichier texte séparé par tabulations) pour qu'il soit lisible sans devoir passer par Open Office
DARK BEFORE/AFTER : priorité au DARK AFTER
Le DARK BEFORE est très rare, il existerait seulement si il y a 2 DARK à la suite (le 2ème serait le DARK BEFORE du SPECTRE LIBS qui arrive ensuite)
=> pour simplifier, on peut le supprimer (donc supprimer 2 colonnes dans le fichier LOG)
Objectif : passer le délai de la boucle du traitement quotidien à 10 secondes (au lieu de 60 actuellement)
Les 2 fichiers "LOG général" et "LOG du jour" doivent s’afficher automatiquement au démarrage
Le LOG général affiche l'état en cours d'exécution du script, pour savoir où on en est :
- a) traitement global des fichiers, avec affichage des dossiers jours créés
Ne pas afficher le contenu de /home/vx/EQM_DATA/
(log files « created » in …)
car ces dossiers ont été créés antérieurement
N’afficher le contenu QUE du dossier qui vient d’être créé
- b) traitement quotidien des fichiers du jour, avec affichage de :
- numéro d'itération
- fichiers SPECTRE et SOH traités (+ leur nombre)
Le LOG quotidien affiche le contenu du fichier LOG du jour (qui se remplit au fur et à mesure)
Mettre les 4 champs de température laser
Supprimer nshots
Dans l'idéal, si on veut vraiment faire collaborer les 3 outils C-Spec-HK, C-GDL, et la prise de photos par la webcam du pc portable de la salle blanche (...),
la communication avec la webcam nécessiterait de mettre les 2 pc (PC-EGSE et le portable webcam) en réseau (soit sur le réseau global IRAP, soit sur un réseau privé salle blanche avec un hub ou switch ; sachant que pc-EGSE est déjà en réseau privé avec le BU-EGSE, il faudrait donc mettre ces 3 éléments sur un même réseau, pas simple...).
En attendant, on pourrait se contenter d'un "mode dégradé", qui consisterait à copier manuellement (via clé ou disque usb) les photos de la webcam sur le pc-EGSE
(Changement Technique internes : Ne laisser que c-spec-hk-workflow à la racine du projet, le reste doit être dans un sous-dossier (contiendra c-spec-hk + tests))
---
---
h2. %{margin-left:0px; font-weight:normal; font-size:150; display:block; background-color:yellow; color:red}SPECIFICATIONS%
h3. Schéma de connexion
PcEGSE <==RJ45==> EGSE <==serial==> ChemCam
ChemCam (garde tous les spectres en RAM) : serial==> BU (Body Unit) <== MU (Mast Unit)
- MU : fait les tirs
- BU : analyse les spectres
SOH (Spectra O? HK)
h3. Types d’observations
(sur la ligne DOLIBS modifier controlWord)
Bit # Bit Value Fonction si activé
----- --------- ------------------
0 1 Do focus : effectuer une focalisation (voir focusAlgorithm)
1 2 Pre dark spectra : acquisition d’un spectre dark AVANT les tirs
2 4 Post dark spectra : acquisition d’un spectre dark APRES les tirs
*3 8 Enable laser : effectuer un (des) tir(s) laser (voir Nshots) (sinon, c'est un DARK)*
4 16 Collect spectra : acquisition de spectre pendant les tirs
5 32 BS
=> 25 = 1+8+16 = tir avec laser
=> 17 = 1+0+16 = tir sans laser (DARK)
Bits 0 et 1 pas utilisés !!! :
Le mode (Bit0 ET Bit1 activés) ne fait pas des darks after et before satisfaisant donc on le fait séparément en faisant un spectre sans enable laser,
ce qui génère tous ces spectres avec un controlWord =17 dans la liste.
h3. Fichier spectre
Suite d'intensités pour chaque canal (dans l'ordre 0, 1, 2, 3, ... 6444)
A représenter sur axe
- X : channel number, assimilable à longueur d'onde : 0 à 6444
- Y : intensité
Si fichier DARK, alors intensités (à peu près) constantes (toutes égales) :
=> donne le bruit de fond de l'instrument, puisque on a zero lumière
h3. Stratégie de développement
Prendre le last stack only
Lire fichier *_spect.TXT et *_SOH.TXT associé (celui qui est juste avant, < 5mn avant)
1 fich/jour
Methods to write :
findSOH(liste des *SOH.TXT du jour, spect.TXT)
=> convertit les noms SOH en timestamps, trouve le SOH qui est juste avant le spect.TXT (< 5mn avant)
findDARK(liste des *spect.TXT (dark), le spect.TXT pour lequel on veut le dark)
=> retourne le fichier dark qui est juste après (<5mn) (mais, peut être before...)
=> regarde un peu autour (avant et après)
findAutofocus(...)
=> *_afocus.TXT (juste prendre son nom, pas son contenu), qui est AVANT
h3. EXEMPLE DE FICHIER RESULTAT (LOG) A OBTENIR (1 par jour)
data_Feb25_2014_5
firstfile = Feb25_161115_2014_spect.TXT
lastfile = Feb25_162059_2014_spect.TXT
id, SPECT_file, SOH_file,
// from *_SOH.TXT file :
nbStacks // Nb de stacks (indiqué par le nb occurences de "mast SOH" qui indique le début d'un nouveau stack) - Prendre seulement les HK du LAST stack
temp_laser_min(degC), temp_laser_max(degC), // prendre min et max des 4 HK_Temp_Laser_1-4
temp_spect(C), // Spectrometer_Temp
pm(cnts), // Motor_Position
// from *_spect.TXT file :
dist(mm), // distance to target distToTarget
nshots, // (Nshots) ajouter ici "nshots_real" car le laser fait parfois plus de shots que prévu (erreur) (lire 1ère ligne pour savoir le nb de col)
controlWord, // 25 = tir avec laser, 17 = tir sans laser (DARK)
data_mean, // moyenne des data \ nbshots reels (= intensité moyenne ?) (à lire from >>>>>Begin Processed Spectral Data<<<<<)
dark_file, // remplacer par dark_file_before, dark_file_after (file name)
mean_spect_value - dark // (= data_mean - ???)
// Liste des fichiers *_spect.TXT associés avec leurs paramètres HK (trouvés dans *_SOH.TXT) :
id, SPECT_file, SOH_file, nbStacks, temp_laser_min, temp_laser_max, temp_spect, pm, dist(mm), nshots, controlWord, data_mean, dark_file_before, dark_file_after, mean_spect_value - dark
1 Feb25_161115_2014_spect.TXT 161055 nbStacks 4.25 5.44 30.15 5499 3000 10 25 677.39 161142 dark_file_after 50.28
2 (D)Feb25_161142_2014_spect.TXT 161132 4.29 5.48 30.15 5499 3000 10 17 627.11 - 627.11
3 Feb25_161243_2014_spect.TXT 161210 4.29 5.33 30.15 5444 2951 10 25 649.07 161307 19.72
4 Feb25_161307_2014_spect.TXT 161257 4.25 5.55 30.15 5444 3000 10 17 629.35 - 629.35
5 Feb25_161339_2014_spect.TXT 161329 4.25 5.59 30.15 5454 2959 10 25 674.78 161404 43.76
6 Feb25_161404_2014_spect.TXT 161353 4.29 5.52 30.15 5454 3000 10 17 631.02 - 631.02
7 Feb25_161435_2014_spect.TXT 161425 4.21 5.55 30.15 5463 2967 10 25 693.77 161500 60.76
8 Feb25_161500_2014_spect.TXT 161450 4.33 5.59 30.15 5463 3000 10 17 633.01 - 633.01
9 Feb25_161532_2014_spect.TXT 161521 4.29 5.59 30.15 5473 2975 10 25 703.08 161556 68.71
10 Feb25_161556_2014_spect.TXT 161546 4.36 5.52 30.15 5473 3000 10 17 634.36 - 634.36
11 Feb25_161646_2014_spect.TXT 161636 4.33 5.63 30.15 5482 2983 10 25 702.22 161711 67.98
12 Feb25_161711_2014_spect.TXT 161701 4.33 5.59 30.15 5482 3000 10 17 634.24 - 634.24
13 Feb25_161743_2014_spect.TXT 161733 4.36 5.55 30.15 5493 2992 10 25 695.08 161808 58.88
14 Feb25_161808_2014_spect.TXT 161757 4.36 5.55 30.15 5493 3000 10 17 636.20 - 636.20
15 Feb25_161840_2014_spect.TXT 161829 4.40 5.59 30.15 5502 3000 10 25 683.94 161905 46.74
16 Feb25_161905_2014_spect.TXT 161854 4.40 5.59 30.15 5502 3000 10 17 637.20 - 637.20
17 Feb25_161937_2014_spect.TXT 161926 4.40 5.59 30.15 5513 3009 10 25 675.67 162002 37.24
18 Feb25_162002_2014_spect.TXT 161951 4.44 5.59 30.15 5513 3000 10 17 638.43 - 638.43
19 Feb25_162034_2014_spect.TXT 162023 4.36 5.63 30.15 5522 3017 10 25 663.56 162059 24.10
20 (D) Feb25_162059_2014_spect.TXT 162048 4.40 5.63 30.15 5522 3000 10 17 639.46 - 639.46
h3. CAS EXCEPTIONNELS à traiter (Exceptions)
* NoDataFileFoundException : pas de fichier (ni Spectre ni SOH) dans le dossier DATA/
* MalformedFileException : fichier (Spectre ou SOH) avec format incorrect
* UnknownCaseException : Cas inconnu ; par exemple, controlWord ni 17 (DARK) ni 25 (PAS DARK) !!!
* noSOHFileFoundForSpectraFileException : pas de fichier SOH (HK) trouvé pour un fichier Spectra (data)
---
h2. RECUPERATION DU PROJET
*a) Directement, depuis svn*
svn co https://usvn-chemcam.irap.omp.eu/repo/c-spec-hk/trunk c-spec-hk-svn
Si on ne veut pas rester synchronisé avec le repository (juste une copie du projet au temps t, sans les fichiers de versionning .svn) :
svn export https://usvn-chemcam.irap.omp.eu/repo/c-spec-hk/trunk c-spec-hk-svn
*b) Par téléchargement (100 Mo à cause des données)*
https://projects.irap.omp.eu/attachments/download/1237/c-spec-hk_1.1.tgz
---
h2. EXECUTION
h3. 1) PRÉREQUIS : Python 2.7
h4. Sur Mac (Machine de développement)
Avec Macport, pour que la version 2.7 soit bien la version par défaut quand on tape "python" :
sudo port select --set python python27
$ which python
/opt/local/bin/python
$ python --version
Python 2.7.9
Mettre à jour MacPort :
sudo port -v selfupdate
sudo port upgrade outdated
h4. Sur CentOS 6.5 (serveur de production)
(fait le 19/3/15 sur le pc-EGSE Chemcam ; cf fiche wiki du pc-EGSE Chemcam : http://planetowiki.irap.omp.eu/do/view/Computers/PcChemcam2Tour)
Par défaut, Cent0S 6.5 propose Python 2.6
(Voir l'installation de Python 2.7 faite sur le pc-EGSE Chemcam : http://planetowiki.irap.omp.eu/do/view/Computers/PcChemcam2Tour#Installation_de_Python_2_7)
h3. 2) EXECUTING TESTS
h4. Depuis Eclipse
Ouvrir la console adaptée : Window / Show View / PyUnit
clic-droit sur test/c_spec_hk_TEST.py
Run As / Python unit-test
h4. En mode ligne de commande
h5. TESTS faits avec Python 2.7
*1) Tests Unitaires et Fonctionnels*
cd test/
$ py27 premiertest.py
<pre>
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
</pre>
$ py27 c_spec_hk_TEST.py
<pre>
...
======================================================================
----------------------------------------------------------------------
Ran 14 tests in 5.833s
OK
</pre>
*2) Tests de Performance (Benchmark)*
Depuis la racine du projet :
<pre>
$ py27 c_spec_hk.py -t
...Executing main program...
Testing execution time of several methods
All times are in SECONDS
Testing _extractSpectraFileNamesIndexedAndOrdered(dataFileNames) method called from a function time_extractSpectraFileNamesIndexedAndOrdered() (takes about 0.0008" on a MacBookPro 11.1) :
0.000790863037109
Testing _extractSpectraFileNamesIndexedAndOrdered(dataFileNames) method called directly (takes about 0.00012" on a MacBookPro 11.1) :
0.000117941689491
Testing getLogInfosForDay(day,spectraFilesForTheDay) method called directly (takes about 0.06" on a MacBookPro 11.1) :
0.0429699897766
Testing main method createAllLogFiles(True) called directly (takes about 2.8" on a MacBookPro 11.1) :
test/DATASET/UC0_NOMINAL/LOGS/20110223
test/DATASET/UC0_NOMINAL/LOGS/20130223
test/DATASET/UC0_NOMINAL/LOGS/20140123
test/DATASET/UC0_NOMINAL/LOGS/20140223
test/DATASET/UC0_NOMINAL/LOGS/20140225
test/DATASET/UC0_NOMINAL/LOGS/20140226
test/DATASET/UC0_NOMINAL/LOGS/20150223
Log files created in test/DATASET/UC0_NOMINAL/LOGS/ :
total 56
drwxrwxr-x 2 vx vx 4096 19 mars 16:39 20110223
-rw-rw-r-- 1 vx vx 471 19 mars 16:39 2011_0223_logs.csv
drwxrwxr-x 2 vx vx 4096 19 mars 16:39 20130223
-rw-rw-r-- 1 vx vx 471 19 mars 16:39 2013_0223_logs.csv
drwxrwxr-x 2 vx vx 4096 19 mars 16:39 20140123
-rw-rw-r-- 1 vx vx 471 19 mars 16:39 2014_0123_logs.csv
drwxrwxr-x 2 vx vx 4096 19 mars 16:39 20140223
-rw-rw-r-- 1 vx vx 471 19 mars 16:39 2014_0223_logs.csv
drwxrwxr-x 2 vx vx 4096 19 mars 16:39 20140225
-rw-rw-r-- 1 vx vx 2849 19 mars 16:39 2014_0225_logs.csv
drwxrwxr-x 2 vx vx 4096 19 mars 16:39 20140226
-rw-rw-r-- 1 vx vx 474 19 mars 16:39 2014_0226_logs.csv
drwxrwxr-x 2 vx vx 4096 19 mars 16:39 20150223
-rw-rw-r-- 1 vx vx 471 19 mars 16:39 2015_0223_logs.csv
1.91459012032
Average time per day : 0.273513
*** finished TIMING ***
</pre>
h5. TESTS faits avec Python 2.6
C'est encore possible de faire tourner le logiciel en Python 2.6 dans la version 1.1.x, mais ça ne sera plus garanti dans l'avenir (à partir de la version 1.2.x)
*1) Tests Unitaires et Fonctionnels*
cd test/
$ python premiertest.py
<pre>
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
</pre>
$ python c_spec_hk_TEST.py
<pre>
...
======================================================================
----------------------------------------------------------------------
Ran 14 tests in 6.742s
OK
</pre>
---
*2) Tests de Performance (Benchmark)*
Depuis la racine du projet
$ ./c_spec_hk.py -t
<pre>
...Executing main program...
Testing execution time of several methods
All times are in SECONDS
Testing _extractSpectraFileNamesIndexedAndOrdered(dataFileNames) method called from a function time_extractSpectraFileNamesIndexedAndOrdered() (takes about 0.0008" on a MacBookPro 11.1) :
0.00105306601524
Testing _extractSpectraFileNamesIndexedAndOrdered(dataFileNames) method called directly (takes about 0.00012" on a MacBookPro 11.1) :
0.000152537894249
Testing getLogInfosForDay(day,spectraFilesForTheDay) method called directly (takes about 0.06" on a MacBookPro 11.1) :
0.0518409013748
Testing main method createAllLogFiles(True) called directly (takes about 2.8" on a MacBookPro 11.1) :
test/DATASET/UC0_NOMINAL/LOGS/20110223
test/DATASET/UC0_NOMINAL/LOGS/20130223
test/DATASET/UC0_NOMINAL/LOGS/20140123
test/DATASET/UC0_NOMINAL/LOGS/20140223
test/DATASET/UC0_NOMINAL/LOGS/20140225
test/DATASET/UC0_NOMINAL/LOGS/20140226
test/DATASET/UC0_NOMINAL/LOGS/20150223
Log files created in test/DATASET/UC0_NOMINAL/LOGS/ :
total 56
drwxrwxr-x 3 vx vx 4096 19 mars 14:01 20110223
-rw-rw-r-- 1 vx vx 471 19 mars 14:01 2011_0223_logs.csv
drwxrwxr-x 3 vx vx 4096 19 mars 14:01 20130223
-rw-rw-r-- 1 vx vx 471 19 mars 14:01 2013_0223_logs.csv
drwxrwxr-x 3 vx vx 4096 19 mars 14:01 20140123
-rw-rw-r-- 1 vx vx 471 19 mars 14:01 2014_0123_logs.csv
drwxrwxr-x 3 vx vx 4096 19 mars 14:01 20140223
-rw-rw-r-- 1 vx vx 471 19 mars 14:01 2014_0223_logs.csv
drwxrwxr-x 3 vx vx 4096 19 mars 14:01 20140225
-rw-rw-r-- 1 vx vx 2849 19 mars 14:01 2014_0225_logs.csv
drwxrwxr-x 3 vx vx 4096 19 mars 14:01 20140226
-rw-rw-r-- 1 vx vx 474 19 mars 14:01 2014_0226_logs.csv
drwxrwxr-x 3 vx vx 4096 19 mars 14:01 20150223
-rw-rw-r-- 1 vx vx 471 19 mars 14:01 2015_0223_logs.csv
2.33647012711
Average time per day : 0.333781
*** finished TIMING ***
</pre>
h3. 3) EXECUTING MAIN SCRIPT
h4. Depuis Eclipse
clic-droit sur c_spec_hk.py
Run As / Python Run
h4. In Command line mode
a) Pour voir l'aide :
$ python c_spec_hk.py -h
...Executing main program...
Usage:
python27 c_spec_hk.py [-i <inputDataDir>] [-o <outputLogDir>]
OR
python27 c_spec_hk.py [--inputDir=<inputDataDir>] [--outputDir=<outputLogDir>]
Ex: python27 c_spec_hk.py-i './DATA' -o './LOGS'
All options available are (none is mandatory) :
-d : activate DEBUG mode
-h : print this HELP message
-n : do NOT create sub-directories (like YYYYMMDD) for each day
-t : test execution TIME of several methods
-v : print current VERSION number
-i <inputDataDir> or --input=<inputDataDir> : set INPUT directory from where DATA files are READ (default is "DATA")
-o <outputDataDir> or --output=<outputLogDir> : set OUTPUT directory where LOG files are WRITTEN to (default is "LOGS")
b) Speed testing (benchmark)
cf https://projects.irap.omp.eu/projects/cspechkanalyser/wiki/Wiki#TESTS-faits-avec-Python-27 (section "Tests de performance")
c) Pour faire un test avec les données d'échantillon fournies :
python27 c_spec_hk.py -i test/DATASET/UC0_NOMINAL/DATA -o /tmp/LOGS
(il faudra d'abord créer le dossier LOGS/ dans /tmp)
Exemple d'affichage attendu :
...Executing main program...
inputDataDir is "test/DATASET/UC0_NOMINAL/DATA"
ouputLogDir is "/tmp/LOGS"
The DATA DIR (input) contains 126 files (total)
The DATA DIR (input) contains 26 SPECTRA text files
Log files created in /tmp/LOGS/ :
['20110223', '20130223', '20140123', '20140223', '20140225', '20140226', '20150223']
---
h2. DAILY WORKFLOW
h3. 1) Voici la structure de fichiers réalisée sur le pc-EGSE :
Les nouveaux fichiers de données produits lors des tirs de Chemcam sont automatiquement placés dans /home/vx/data/ (au fur et à mesure des tirs)
Ils sont ensuite déplacés dans /home/vx/EQM_DATA/AAAAMMJJ/DATA/ lorsqu'ils ont été traités
Les fichiers de LOG (relation spectre => HK) créés sont placés directment dans /home/vx/EQM_DATA/AAAAMMJJ/
<pre>
- /home/vx/data/ : données d'origine restant à traiter (spectres et HK), provenant directement de la manip
- /home/vx/EQM_DATA/ : données traitées (spectres, HK, et fichiers logs produits)
- AAAAMMJJ/ : un dossier par jour
- le fichier log produit (CSV)
- DATA/ : les données d'origine (spectres et HK)
</pre>
h3. 2) WORKFLOW
Ce workflow devrait normalement fonctionner dans tous les cas de figure (démarrage n'importe quand, en début de journée ou en cours de journée, ou même reprise après un crash brutal...)
Démarrage automatique du workflow à partir du Démarrage du pc-EGSE
1) Faire tourner le traitement sur TOUS les fichiers présents dans le dossier /home/vx/data/ (SAUF les fichiers du jour J, s'il y en a...)
Les fichiers LOGS produits sont placés automatiquement dans le dossier correspondant à leur jour /home/vx/EQM_DATA/AAAAMMJJ/
(AAAA année en 4 chiffres, MM mois en deux chiffres et JJ jour du mois en deux chiffres)
2) Déplacer TOUS les fichiers de /home/vx/data/ dans leur dossier correspondant /home/vx/EQM_DATA/AAAAMMJJ/DATA/ (SAUF les fichiers du jour J, s'il y en a...)
3) (Every 5 seconds) : pour les fichiers du jour J
S'il existe au moins un fichier dans /home/vx/data/, faire tourner le traitement sur TOUS les fichiers présents
LE FICHIER LOG produit (un seul pour le jour J) est placé automatiquement dans le dossier correspondant à son jour (J) /home/vx/EQM_DATA/AAAAMMJJ/
Attention : on ne déplace pas les fichiers dans leur dossier correspondant /home/vx/EQM_DATA/AAAAMMJJ/DATA/ ; cela sera fait au prochain démarrage du workflow) ; cela permet d'avoir un fichier LOG qui se complète au fur et à mesure de la journée
Il faudrait quand meme les COPIER (cp) (mais pas les DEPLACER (mv))
OPTIMISATION : Exécution SSI le nb de fichiers du repertoire DATA/ a changé (tenir à jour un fichier contenant le nb de files)
Fin du workflow à l'extinction du pc-EGSE