Etapes d'ingestion d'un grand catalogue
Cette page décrit dans le détail les différentes étapes d'ingestion d'un grand catalogue (>20M sources).
Elle est amenée à devenir une checklist permettant de s'assurer qu'aucune étape n'a été oubliée.
Réservation d'un nom
On réserve un nom de catalogue dans la nomenclature VizieR en respectant la catégorie du catalogue (I, II, ...).
On décide également du nom de la ou des tables.
Récupération des données
Directement par wget si possible. Sinon via le point de contact du projet
Conversion en CSV
Généralement via un script ad-hoc
Génération des histogrammes et statistiques pour chaque colonne
A l'aide de stilts (exemple pour catalogue Attitude) :
# conversion en colfits
./stilts -Xmx10000M -Djava.io.tmpdir=tmp tpipe ifmt=csv ofmt=colfits-plus \
in=CSV/attitude_final.csv out=CSV/attitude_final.colfits
# Génération statistiques
./stilts -Xmx10000M tpipe in=CSV/attitude_final.colfits omode=stats > stats.txt
# Génération histogrammes
for COLNAME in sourceId RAJ2000 DEJ2000 e_RAJ2000 e_DEJ2000 alphaEpoch deltaEpoch \
sourcePosition pmRA pmDE e_pmRA e_pmDE sourceMu magBJ e_magBJ \
sourcemagBJ magRF e_magRF sourceMagRF magG e_magG \
sourceMagG magGrvs e_magGrvs sourceMagGrvs classification \
sourceClassification auxGSC23 auxSDSS auxUCAC auxLQRF \
auxTYCHO auxHIP auxPPMXL auxOGLE auxTMASS auxEPC
do
echo "Processing ${COLNAME}"
./stilts plot2plane layer=histogram in=CSV/attitude_final.colfits x=${COLNAME} \
out=hist/hist_${COLNAME}.png
done
Analyse et choix des colonnes
On fait tourner un script (type
anafile) pour déterminer le format des colonnes: types de données, valeurs min et max, ...
Il faut ensuite:
- choisir les colonnes à conserver
- renommer les colonnes
Et éventuellement:
- changer le format des colonnes (suppression de chiffres significatifs, mise à NULL des valeurs n'ayant aucun sens physique, changement des unités ...)
Conversion CSV --> format CatFile
Génération des bcf/rcf
Test possible via QueryCat
byte to byte
Plusieurs itérations peuvent être nécessaires
Vérification de la cohérence du RCF par rapport aux données originales
Il faut regénérer les stats et histogrammes à partir d'un dump des données issu du RCF.
Les comparer aux stats et histogrammes originaux.
Génération du byte2byte
Project cds.catana sur svn://snob/cds/
Analyse du CSV :
${rcf2csv} -in_buff 2M -out_buff 4M -header -in catfile/cat.rcf | ${analyzer} -head -format CSV -out cat-columns-analysis.json
avec:
JAR_NAME="cdscatfile-classe.jar"
JAR_LIST="${JAR_NAME}:jhealpixSmall.jar:args4j-2.0.10.jar:javassist.jar"
rcf2csv="java -Xmx20480m -cp ${JAR_LIST} cds.catfile.cmd.RowCatFile2Csv"
analyzer="java -Xmx10000m -jar cds.catana.jar"
Ecriture du ReadMe
Ne pas oublier :
- décrire l'origine des données
- acknowledgments, contrat de licence
Génération MOC et carte de densité
Sur
cdsxmatch[2/3] :
su pineau
cd /md3200/pineau/catalogues
./densityMap.bash <nom-cat>.rcf 8 16 32 64 128 256 512 1024 2048
scp <nom-cat>.rcf.*hpx boch@alasky:
Sur
alasky :
# On supposera que la table en question a pour identifiant vizier
II/328/allwise
su boch
mkdir /data/footprints/tables/vizier/II_328_allwise
cd /data/footprints/tables/vizier/II_328_allwise
# copier dans ce répertoire les cartes de densité hpx en les renommant densityMap_8.hpx, ..., densityMap_2048.hpx
(FXP) Pour faciliter le renomage (exemple avec UCAC5):
for f in $(ls); do mv $f $(echo $f | sed -r 's/ucac5\.rcf\./densityMap_/'); done
# Créer un fichier info.json contenant les infos suivants :
{"nbrows": 747634026, "tabName": "II/328/allwise"
}
# Génération des MOC :
cd /home/boch/FootprintService/generation-scripts
for nside in 8 16 32 64 128 256 512 1024 2048
do
python -c "from moc_generator import hpx2moc; hpx2moc('/data/footprints/tables/vizier/II_328_allwise/densityMap_$nside.hpx', '/data/footprints/tables/vizier/II_328_allwise/footprint_$nside.txt')"
done
./updateAll.sh
# Génération des vignettes (thumbnails)
/home/boch/FootprintService/generation-scripts/createThumbnails.py
(FXP) J'ai fait un tout petit script bash qui fait cette étape, exemple avec des cartes de densités dont le nom est au format RCF_NAME.NSIDE.hpx: ./genMOC.fxp.bash II_342_hsc2 hsc2_detailed.rcf
(Thomas, j'ai mis .fxp. dans le nom du script juste pour que tu voisd'où il vient, tu peux le renomer).
# Si le catalogue n'est constitué que d'une table :
cp -r /data/footprints/tables/vizier/II_328_allwise /data/footprints/ivorn/ivo:__CDS.VizieR_II_328
rm /data/footprints/ivorn/ivo:__CDS.VizieR_II_328/info.json
Si il y a plusieurs tables, ne rien faire
La carte de densité/MOC du catalogue est accessible depuis l'URL :
http://alasky.u-strasbg.fr/footprints/cats/vizier/II/328
Copie du .rcf sur axel
Intégration et publication dans VizieR
L'ingestion d'un grand catalogue dans
VizieR est similaire à une ingestion de catalogue classique.
Ce travail est le même que celui exécuté par les documentalistes.
voir: petite description d'ingestion VizieR: http://cds.u-strasbg.fr/twiki/bin/view/Documentaliste/VizierDocumentaliste/IngestionCatalogue
doc : http://vizier.u-strasbg.fr/doc/viz/
http://cds.u-strasbg.fr/twiki/bin/view/Ressources/ProcVizier
Récupération des fichiers grands catalogues sur la machine axel. (cette partie ne peut être exéutée par des documentalistes)
Au préalable , le(s) fichier(s) grand catalogue(s) sont à copier sur la machine axel (compte cds).
Dans le cas des catalogues au format dit "fx" (avec une extension .rcf): ils sont a copier sous /r3/cats/ATraiter. Ensuite un simple lien suffit a faire connaitre le catalogue au demon "grand catalogue":
(cd /r1/cats; ln -s /r3/cats/ATraiter/nom_fichier.rcf)
Note: Dans un second temp, le fichier copier sera déplacé (manuellement) sous un sous repertoire de /r1/cats ou /r3/cats.
Le démon format "fx" est un programme java (classe: cdscatfile-classe.jar). Deux demons du programme sont exécutés (version en cours(port 1800) + version beta (port 1801)) qui sont controllés par le script /etc/init.d/xmatchcat.
Le programme (.jar) est installée sous le répertoire : /home/cds/httpd/cgi/ext-tsv/
Installations des catalogues sur les mirroirs
VizieR: chaque catalogue est installé sur au moins 1 mirroir
VizieR (en plus de axel). L'installation se fait en ajoutant un répertoire vide du même nom que celui utilisé dans axel dans le répertoire dédié aux grands catalogues (~cds/bincats). La synchronisation se fait par rsync (script clonebigcat exécuté par la crontab).
Notes particulières concernant les grands catalogues:
Les 4 points suivant sont à considérer lors de l'ingestion d'un grand catalogue. (ces actions peuvent être effectuées après les étapes d'ingestions classiques)
- Création du fichier sample.
Il s'agit de générer un fichier "sample" qui est un extrait d'une table d'un grand catalogue.
Ce fichier sera celui décrit dans le fichier ReadMe. Il est au format ASCII avec des colonnes alignées suivant des catractères blancs ' '.
exemple de commande: (le programme catClient.py est un programme généric pour extraire des données stockées au format dit "fx" - voir les autres exemple plus loin)
catClient.py -source WISE_PRELIM -c 0-90 -c.rd=1 -out.max=1000 --dir=mirror
NB : ajouter l'option --port 1801 si on teste en beta
La commande ci-dessus récupère les données WISE autour de 0-90 au format TSV.
Transformation en fichier ASCII: programe anafile -d -ccg
ex: catClient.py -source WISE_PRELIM -c 0-90 -c.rd=1 -out.max=1000 --dir=mirror | anafile -d -ccg
Le résultat de la commande est composé de statistiques, de la génération d'un byte-2-byte ainsi qu'une commande "acut" qui permet de transformer du TSV en ASCII
ex: catClient.py -source WISE_PRELIM -c 0-90 -c.rd=1 -out.max=100 --dir=mirror | acut -d -f1%-108j -i' ' -f2%-9j -i' ' -f3%-10j -i' ' .......
- Vérifier le numéro bibliographique qui est à ajouter au ReadMe. S'il n'existe pas, on utilise la nomenclature: YYYYyCat.catid...OC (OC=Observational catalogue - voir .Summary \cType)
- Linker les données grand catalogues.
Un grand catalogue est stocké sous un format binaire propriétaire du CDS (format dit "fo" ou "fx") et n'est donc pas une table de SGBD comme c'est le cas pour les catalogues standards.
La commande \vizDB du fichier '.Summary' établit le lien avec les données. voir syntaxe: http://vizier.u-strasbg.fr/doc/viz/#vizDB
exemple: catalogue 2mass (format fit "fo")
\vizDB{ out.sam }{!ext/find2mass -m 499999999 {{-c @{-c} -r @{-c.rm}| -la @{,RAJ2000} -ld @{,DEJ2000}} [-lJ @{,Jmag}] [-lH @{,Hmag}] [-lK @{,Kmag}]|-i @{2MASS}}}
Le premier paramètre "out.sam" est le "sample" décrit dans le fichier ReadMe.
Le second paramètre commençant par un '!' est suivit de la commande qui permet de récupérer les données. Dans ce cas, il s'agit du programme "find2mass" (installé sur chaque mirroir VizieR sous ~cds/httpd/cgi/ext).
Faire findmass -h pour connaitre les options du programme.
Les options choisies pour 2mass sont le nombre maximum de records retournés (option -m) ainsi qu'un choix d'interrogation (délimité par le '|'):
-c @{-c} -r @{-c.rm} : recherche par position en utilisant les options ASU -c et -c.rm (soit respvt le centre et le rayon exprimé en minutes)
(ou) -la @{,RAJ2000} -ld @{,DEJ2000}} [-lJ @{,Jmag}] [-lH @{,Hmag}] [-lK @{,Kmag}] : par position et optionnellement avec des valeurs sur les magnitudes J, H ou K (colonnes Jmag, Hmag, Kmag)
(ou) -i @{2MASS} : par identificateur 2MASS (cf colonne 2MASS)
exemple: wise (format dit "fx")
Les formats dit "fx" utilisent un programme générique "catClient.py" (voir catClient.py -h)
\vizDB{ wise.sam }{ ext-tsv/catClient.py -source=WISE_ALLSKY --dir=mirror -out.max=999999999 {-c @{-c} -c.rm @{-c.rm} |-c @{WISE} -filter='WISE_ALLSKY.equals("@{WISE}")' -c.rs 5}}
Explications des options: 2 possibilités sont envisagées:
-c @{-c} -c.rm @{-c.rm} : recherche par position
(ou) -c @{WISE} -filter='WISE_ALLSKY.equals("@{WISE}")' -c.rs 5 : recherche par identifiant WISE (colonne WISE) auquel est ajouté un filtre de position centre par le nom WISE et de rayon 5arcsec
les autres options (obligatoires):
-source=nom_du_catalogue_format_fx
---dir=mirror : le programme choisit le mirroir ou est stocké le catalogue
exemple: ukidss8 (format dit "fx")
\vizDB{ las8.sam }{ ext-tsv/catClient.py -source=ukidss_dr8_las --dir=mirror -out.max=999999999 {-c @{-c} -c.rm @{-c.rm} |-c @{RAJ2000}@{DEJ2000} -c.rs 1 -filter "UKIDSS_DR8_LAS.equals(@{ID})"}}
Note: certains grands catalogues contiennent plusieurs tables au format "fx" ou "fo"; dans ce cas il faudra autant de commandes \vizDB qu'il existe de tables (exemple: ukidss).
Il est possible aussi d'avoir un grand catalogue qui contient des tables classiques + des tables format "fx" ou "fo" (exemple VI/137)
- Assigner une position par défaut.
L'interface VizieR exige des contraintes pour interroger des grosses volumétries. Celles-ci sont imposées par la commande donné dans le fichier ".Summary" \vizDB.
Une recherche par position fait partie de la liste des paramètres de la commande. La position par défaut est donné dans le fichier ".Summary" par:
\vizComment{ * }{}{\ignore{-c=0-90}}
- Création de l'index positionnel.
N'étant pas stocké en base de donnée, le grand catalogue n'est pas indexé automatiquement en qbox. Pour ce faire, on, génère un fichier qbox à l'aide de la commande "qboxes":
ex: catClient.py -source WISE_PRELIM -whole -col=RAdeg,DEdeg --dir=mirror |qboxes - > qboxes
Ensuite, ce fichier est décrit dans le fichier ".Summary":
\vizQbox{ qboxes }
Note: si le catalogue est un catalogue ALLSKY il est possible d'indexer le catalogue sur tous les qboxes et SANS construire le fichier.
\vizQbox{ 0 } (exemple 2mass)
- Ingestion du catalogue et suppression (temporaire) de l'acces FTP
- L'ingestion du catalogue dans vizier se fait par la commande : 2v .
Dans un premier temps, on fera une ingestion en local pour limiter l'acces au catalogue au CDS (répondre "no" à la question "Release the catalogue Now").
- la commande make_public -rm cache l'acces FTP au public tout en conservant l'acces au catalogue en local via l'application web.
Lorsque le catalogue sera pret, on pourra rendre à nouveau ce catalogue public:
par la commande
2v (répondre "
yes" à la question "Release the catalogue Now" (ou attendre 4 semaines)) et
make_public .
Note : dans le cas de grands catalogues, il est parfois utile de réordonner les colonnes. Généralement dans VizieR, on regroupe les colonnes erreurs avec leur colonnes (par exemple Hmag et e_Hmag).
ex: \vizOrder{ wise.sam }{ e_* }{ +* }
"Archivage" des données originales
- Sur la machine axel
- Dans un format exploitable facilement (CSV plutôt qu'un dump binaire d'une table MySQL) mais au plus proche des données originales
- mise à jour de la table METarchive :
catid int
oristorage varchar(250)
oriurlagency varchar(250)
date int
le script axel@/r1/newcats/maj_metaarchive met a jour la table
le script axel@/r1/newcats/sql_metaarchive permet de recuperer la table
- on peut également envisager de préserver les scripts ayant permis l'ingestion du catalogue
Intégration dans le service de xmatch
Cette étape nécessite de choisir les colonnes que l'on souhaite conserver dans le service de cross-match.
La règle suivie jusqu'à présent a été : colonnes par défaut dans VizieR + colonnes de mouvements propres + colonnes d'erreur non présentes
- Copier les .rcf et .bcf sur
cdsxmatch:/md3200/xmatch/tables/vizier/big/
(ou autre part, et créer les liens symboliques depuis ce répertoire)
- Editer
/root/scripts/xmatch/tableNamesSynonyms.json
et ajouter l'entrée pour la table traitée
Cette étape est indispenable pour faire le lien entre le nom de la table et le nom des fichiers bcf/rcf correspondants
- (optionnel) Editer
/root/scripts/xmatch/prettyTableNames.json
pour donner un synonyme plus sympa à lire que le nom de la table
- (optionnel) Editer
/root/scripts/xmatch/hideList.json
et ajouter le nom de la table si on ne souhaite pas qu'elle apparaisse dans la liste déroulante des grands catalogues sur l'interface web du service de xmatch
- Exécuter
/root/scripts/xmatch/update-table-list.py /md3200/xmatch/tables/tables.json
pour mettre à jour la liste des tables disponibles
- Exécuter (DEPRECATED) rsync --delete -av /data-cdsxmatch/md3200/xmatch/tables <nop>root@cdsxmatch2:/data-cdsxmatch2/md3200/xmatch/
(DEPRECATED)
,use rsync --delete -av /data-cdsxmatch/md3200/xmatch/tables/tables.json root@cdsxmatch2:/data-cdsxmatch2/md3200/xmatch/tables/tables.json
et rsync --delete -av /data-cdsxmatch/md3200/xmatch/tables/vizier root@cdsxmatch2:/data-cdsxmatch2/md3200/xmatch/tables/
pour copier les rcf/bcf vers cdsxmatch2 (ainsi que tables.json)
- Attendre 2h et tester (la liste des tables dispos n'est mise à jour que toutes les 2h au niveau de la servlet)
Génération du catalogue progressif
Intégration dans service TAP
...
Métadonnées des colonnes de photométrie
--
ThomasBoch - 2014-01-21