Software per database a supporto di
progetti di ricerca astronomici:
MCS, MyRO, DIF
Giorgio Calderone
Bologna, 14/12/2006
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
Presentazioni:
●
●
●
MCS: My Customizable Server:
● Accesso a database;
● Implementazione servizi informativi;
● Gestione file VOTable;
MyRO: My Record Oriented privilege system:
● Struttura per la gestione di account utente;
● Privilegi a livello di record;
DIF: Dynamical Index Facility:
● Link a librerie HTM e HealPix;
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
MCS: My Customizable Server
I sistemi informativi si possono dividere in due categorie:
Indirizzati agli esseri umani
Web server, scripting language, HTML protocol
Indirizzati ad altri sistemi informatici
Nessuna standardizzazione ==> MCS
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
MCS: My Customizable Server
Come può un sistema informativo fare da supporto a un
progetto scientifico ?
●
●
●
●
Dati scientifici e di house-keeping:
● Backup e validazione;
● Quick-look ed eventuale automatizzazione del sistema;
Accesso per ricercatori:
● Accesso ai dati da vari linguaggi di programmazione: C, C++, Fortran, IDL;
● Possibilità di installare facility per una analisi veloce dei dati;
● Possibilità di download dei dati grezzi;
Accesso per tecnici;
● Possibilità di monitoraggio e controllo remoto del sistema;
Accesso dal pubblico (outreach):
● Generazione automatica di statistiche e pagine web con ultime immagini, ecc...
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
MCS: My Customizable Server
Come può un sistema informativo fare da supporto a un
progetto scientifico ?
●
●
Interfaccia di accesso di alto livello, ad esempio:
● “Seleziona le osservazioni fatte in data...”;
● “Seleziona tutte le osservazioni della zona di cielo...”;
● “Seleziona le osservazioni in cui la temperatura dello strumento è minore ...”;
Possibilità di scambio di file in diversi formati:
● Ascii, FITS, VOTable, ecc...
...tutto questo è possibile con MCS !
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
MCS: My Customizable Server
Le caratteristiche del server MCS sono:
●
●
●
●
●
●
●
Server TCP multithread;
Facilità di configurazione;
Autenticazione e supporto di permessi utente;
Connessioni sicure (tramite SSL);
Accesso a database (MySQL);
Supporto per la personalizzazione del server;
Accessiblità da diversi linguaggi di programmazione: C, C++, Fortran, IDL, PHP,
Python (in futuro anche Java e Perl);
La “personalizzazione” del server può essere realizzata:
●
●
●
●
Aggiungendo programmi di analisi esterni, sia binari che BATCH di comandi MCS;
Aggiungendo programmi SQL (da eseguire sul server MySQL);
Aggiungendo comandi personalizzati (derivando la classe “UserThread”);
Modificando il comportamento del thread lato server (derivando la classe
“LocalThread”);
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
MCS: My Customizable Server
Eventi durante una tipica
sessione MCS:
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
MCS: My Customizable Server
Architettura del sistema informativo:
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
MCS: My Customizable Server
Codice minimo per un server MCS:
#include <mcs.hh>
using namespace mcs;
int main(int argc, char *argv[]) {
Env* env = mcsStart("test");
mcsWait(env);
}
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
MCS: My Customizable Server
Aggiunta di un comando personalizzato:
MCS_CUSTOM_USER(User);
RetValue hk_exec(CommandParser* cmd, bool& cmd_executed)
{
if (! loginok) return OK;
if (cmd_executed = cmd->cmpCmd("HISTO")) {
if (cmd->argc() < 1) //Check number of arguments
return Send( MCS_ERROR( MSG_MISSING_ARGUMENT, "filename"));
... computation ...
Data d(FLOAT);
Send(d);
Send(file);
}
} MCS_CUSTOM_USER_END(User);
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
MCS: My Customizable Server
Personalizzazione server thread:
MCS_CUSTOM_LOCAL(Local);
void run() {
for(;;) {
s = "QRY SELECT * FROM Producer_log”;
if (prod->exec(s)) {
Record& rec = prod->rec();
q->prepare_with_parameters(MCS_INSERT, "*", "Mainsrv_log”);
q->param()["id"]
= rec["id"];
q->param()["camera"]
= rec["camera"];
q->param()["filename"] = rec["filename"];
query->execute();
}
}
}
MCS_CUSTOM_LOCAL_END(Local);
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
MCS: My Customizable Server
Codice client (IDL):
cli = new_Client(null, "", "localhost", 9001, 0)
dummy = Client_login(cli, 'demo_mcs', 'demo_mcs', 'demo_mcs')
dummy = Client_exec(cli, 'qry SELECT
camera, filename, datein, exposure
FROM Mainsrv_log', null)
nrows = RecordSet_nRows(cli)
cmd = "histo " + name + ".fits.gz"
dummy = Client_exec(cli, cmd, null)
cmd = "get " + name + "_h.gif"
dummy = Client_exec(cli, cmd, null)
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
MCS: My Customizable Server
Codice client (Fortran):
cli = new_Client(null, "", "localhost", 9001, 0)
dummy = Client_login(cli, 'demo_mcs', 'demo_mcs', 'demo_mcs')
dummy = Client_exec(cli, 'qry SELECT
camera, filename, datein, exposure
FROM Mainsrv_log', null)
nrows = RecordSet_nRows(cli)
WRITE(cmd, '(A6, A10, A8)'), "histo ", , ".fits.gz"
dummy = Client_exec(cli, cmd, null)
WRITE(cmd, '(A4, A10, A6)'), "get ", s, "_h.gif"
dummy = Client_exec(cli, cmd, null)
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
MCS: My Customizable Server
Interfaccia grafica (PHP):
Informazioni
generate
dinamicamente
Informazioni
lette da DB
Accesso ai
comandi
personalizzati
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
MCS: My Customizable Server
Show as gif:
Get image pix.
statistics
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
VOTable: il formato definito dal Virtual Observatory
Quali sono i principali vantaggi rispetto al formato FITS ?
●
●
●
●
●
Struttura keyword;
Non è necessaria la keyword NAXIS2 (numero di record);
Quindi un file VOTable è “streamable”;
Possono contenere solo “metadata” e link ai dati effettivi;
I dati possono essere inclusi in VOTable in vari formati (serialization):
● Tabella HTML;
● Formato binario dedicato;
● File Fits (codificato con Base64);
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
MCS: le classi per l'accesso ai VOTable
●
VOT_Element
● VOT_Binary
● VOT_Column
● VOT_Coosys
● VOT_Data
● VOT_Definitions
● VOT_Description
● VOT_Field
● VOT_FieldRef
● VOT_Fits
● VOT_Group
● VOT_Info
● VOT_Link
● VOT_Max
● VOT_Min
●
●
●
●
●
●
●
●
●
●
●
●
●
VOT_Option
VOT_Param
VOT_ParamRef
VOT_Resource
VOT_Row
VOT_Stream
VOT_Table
VOT_Tabledata
VOT_Values
VOT_VOTable
VOT_Parser_Stream
VOT_Parser_Tree
VOT_Writer_Stream (ancora in fase
di sviluppo)
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
Per ogni possibile nodo XML esiste una classe
VOT_VOTable
VOT_Resource
VOT_Param
VOT_Field
VOT_Data
VOT_Row
<?xml version="1.0"?>
<VOTABLE version="1.1">
<COOSYS ID="J2000" equinox="J2000." epoch="J2000." system="eq_FK5"/>
<RESOURCE name="myFavouriteGalaxies">
<TABLE name="results">
<DESCRIPTION>Velocities and Distance estimations</DESCRIPTION>
<PARAM name="Telescope" datatype="float" ucd="phys.size;instr.tel"
unit="m" value="3.6"/>
<FIELD name="RA" ID="col1" ucd="pos.eq.ra;meta.main" ref="J2000"
datatype="float" width="6" precision="2" unit="deg"/>
<FIELD name="Dec" ID="col2" "pos.eq.dec;meta.main" ref="J2000"
datatype="float" width="6" precision="2" unit="deg"/>
<FIELD name="Name" ID="col3" ucd="meta.id;meta.main"
datatype="char" arraysize="8*"/>
<DATA>
<TABLEDATA>
<TR>
<TD>010.68</TD><TD>+41.27</TD><TD>N 224</TD>
</TR>
<TR>
<TD>287.43</TD><TD>-63.85</TD><TD>N 6744</TD>
</TR>
</TABLEDATA>
</DATA>
</TABLE>
VOT_Column
</RESOURCE>
</VOTABLE>
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
Gli attributi dei nodi sono anche attributi della classe
Accesso a un nodo di tipo “FIELD”:
<FIELD
name="RA"
ID="col1"
ucd="pos.eq.ra;meta.main"
ref="J2000"
datatype="float"
width="6"
precision="2"
unit="deg"
/>
VOT_Field* field = stream->next()
field->name()
field->ID()
field->ucd()
field->datatype()
field->width()
field->precision()
field->unit
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
Lettura di un file VOTable
Modalità stream:
●
●
●
●
I nodi sono letti uno per uno;
Non è disponibile l'intera struttura del file VOTable;
E' richiesta poca memoria;
Il codice per leggere e stampare tutto il contenuto del file è:
VOT_Parser_Stream stream;
stream.open(“filename.vot”);
while ((node = stream.next())) {
node->print(true);
}
stream.close();
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
Lettura di un file VOTable
Modalità tree:
●
●
●
●
●
I nodi sono letti tutti in una volta;
E' disponibile l'intera struttura del file VOTable, ed è navigabile;
E' richiesta una quantità di memoria dell'ordine delle dimensioni
del file;
Il codice per leggere, stampare tutto il contenuto del file è:
VOT_Parser_Tree tree();
tree.open(“filename.vot”);
tree.root()->print(true);
Per recuperare un valore dalla struttura:
tree.root()->Resource(2)->Table(1)
->Data()->TableData()->Row(0)->Column(5)
->value()
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
Nuove classi per gestione VOTable
(ancora in fase di test)
●
●
●
●
●
●
Lettura dei dati in tutti i tipi di serializazzione (HTML table, binary, fits, fits
remoto);
Incapsula le chiamate alla libreria FITSIO;
Validazione tramite DTD (Document Type Definition);
Modalità di lettura : stream o tree;
Capacità di streaming da rete;
Interfaccia derivata dalla class mcs::Recordset;
E' l'unica interfaccia C++ con tutte queste caratteristiche !!!
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
MyRO: My Record Oriented privilege system
MySQL gestisce permessi a livello di
● Database;
● Tabella;
● Campo all'interno di una tabella;
Ma non a livello di record !!!
MyRO permette di gestire i permessi a livello di record.
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
MyRO: My Record Oriented privilege system
Per ogni record i permessi sono simili a quelli di un file
su un file system UNIX:
Senza MyRO:
mysql> select * from tab;
+---+------+------+------+
| i | c
| f1
| f2
|
+---+------+------+------+
| 1 | A
| 2.3 | 4.5 |
| 2 | B
|
0 |
0 |
| 3 | C
|
-1 |
-2 |
+---+------+------+------+
Con MyRO:
mysql> select * from tab;
+---------+----------+----------+---+------+------+------+
| my_user | my_group | my_fperm | i | c
| f1
| f2
|
+---------+----------+----------+---+------+------+------+
| root
| root
| rwr--| 1 | A
| 2.3 | 4.5 |
| test
| users
| rwr-r| 2 | B
|
0 |
0 |
| root
| root
| rwrwrw
| 3 | C
|
-1 |
-2 |
+---------+----------+----------+---+------+------+------+
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
MyRO: My Record Oriented privilege system
Come funziona MyRO ?
1) Si aggiungono i campi per utente proprietario, gruppo e permessi
mysql> select * from tab_myro;
+---+------+------+------+
+---+------+------+------+--------+--------+---------+
| i | c
| f1
| f2
| my_uid | my_gid | my_perm |
+---+------+------+------+
+---+------+------+------+--------+--------+---------+
| 1 | A
| 2.3 | 4.5 |
1 |
2 |
1 |
| 2 | B
|
0 |
0 |
3 |
3 |
2 |
| 3 | C
|
-1 |
-2 |
1 |
1 |
6 |
+---+------+------+------+
+---+------+------+------+--------+--------+---------+
2) Si crea una view che filtra solo i record che possono essere letti
CREATE VIEW tab AS
SELECT tab_myro.*
FROM tab_myro
WHERE (myro_cGranted(user(), my_perm, my_uid, my_gid, 'r') = 1);
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
MyRO: My Record Oriented privilege system
Risultati diversi con account diversi
Selezione effettuata tramite l'account 'root':
+---------+----------+----------+---+------+------+------+
| my_user | my_group | my_fperm | i | c
| f1
| f2
|
+---------+----------+----------+---+------+------+------+
| root
| root
| rwr--| 1 | A
| 2.3 | 4.5 |
| test
| users
| rwr-r| 2 | B
|
0 |
0 |
| root
| root
| rwrwrw
| 3 | C
|
-1 |
-2 |
+---------+----------+----------+---+------+------+------+
Selezione effettuata tramite l'account 'test':
+---------+----------+----------+---+------+------+------+
| my_user | my_group | my_fperm | i | c
| f1
| f2
|
+---------+----------+----------+---+------+------+------+
| test
| users
| rwr-r| 2 | B
|
0 |
0 |
| root
| root
| rwrwrw
| 3 | C
|
-1 |
-2 |
+---------+----------+----------+---+------+------+------+
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
DIF: Dynamical Index Facility
“ Far funzionare i programmi è facile,
il difficile è farli andare veloci !”
●
HTM (Hierarchical Triangular Mesh):
●
HealPix (Hierarchical Equal Area isoLatitude Pixelization):
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
DIF: Dynamical Index Facility
Vogliamo utilizzare l'indice sul campo “htmID”
●
●
Primo esempio
SELECT * FROM Messier
WHERE htmID IN (29572, 14638, ...);
Secondo esempio:
CREATE TABLE tmp (HTMid INT);
INSERT INTO tmp VALUES(29572);
INSERT INTO tmp VALUES(14638);
...
SELECT *
FROM Messier INNER JOIN tmp
USING (htmID);
Altre soluzioni ?
DROP TABLE tmp;
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
DIF: Dynamical Index Facility
Il DIF permette di creare “dinamicamente” la tabella degli
HTM id.
Il DIF è composto da:
● Una tabella fittizia (non occupa spazio su disco);
● Una UDF (User Defined Function) che popola “dinamicamente” la tabella;
Nel nostro caso:
● La tabella si chiama “dif”;
● Vi sono diverse UDF che popolano la tabella “dif”, useremo “HTM_Circle”;
SELECT * FROM dif;
#Non produce alcun risultato
SELECT * FROM dif WHERE HTM_Circle(83.6, 22.0, 2);
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
DIF: Dynamical Index Facility
Mettiamo tutto insieme
La query completa:
SELECT Messier.*
FROM Messier INNER JOIN dif
USING (htmID)
WHERE HTM_Circle(@Ra, @Dec, @Rad);
●
Selezione su un cerchio perfetto:
SELECT Messier.*
FROM Messier INNER JOIN dif
USING (htmID)
WHERE (HTM_Circle(@Ra, @Dec, @Rad)
AND
( (htmFull = 1)
OR
(sphedist(@Ra,@Dec,Ra,Dec) <@Rad))
);
●
∞:1
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
Database Engines per VOTable e FITS
●
●
●
Mysql offre l'opportunità di creare database Engine:
Si tratta di software che permette di integrare qualsiasi tipo di file all'interno
del DBMS;
Si possono quindi fare i operazioni di lettura e scrittura su questi file come se
fossero normali tabelle, in maniera completamente trasparente;
●
Stiamo lavorando ad un database Engine per l'accesso a file FITS e VOTable;
●
Questi file si possono quindi leggere utilizzando le classi di MCS;
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
Librerie di uso comune in astronomia
Aggiunta della possibilità di chiamare routine esterne di uso
comune, con la stessa sintassi da qualsiasi linguaggio di
programmazione.
●
●
●
Astrometria, conversione di coordinate e di date (NOVAS);
● http://aa.usno.navy.mil/software/novas/novas_info.html
WCS (World Coordinate System);
● http://tdc-www.harvard.edu/software/wcstools
Ecc..
Software a supporto dei progetti di ricerca: MCS, MyRO e DIF
Cercasi collaborazione per futuri sviluppi:
Proposte di nuove funzionalità, critiche su quelle esistenti;
● Test del software;
● Scrittura documentazione ed esempi;
“Contributed library facilities” per i vari linguaggi (C, IDL, Fortran, Python, PHP,
Perl, Java)
● Implementazione classe VOTable_Writer_Stream;
● Database engine VOTable e FITS;
●
●
●
●
●
Implementazione interfacce a NOVAS, WCS, ecc...;
Interfaccia per facility di Virtual Observatory (PLASTIC);
Analizzare la portabilità su altri DBMS;
Porting su altre piattaforme (UNIX e Windows);
Links:
●
●
MCS, MyRO:
● http://ross.iasfbo.inaf.it/mcs
IDL user contributed library :
● http://ross.iasfbo.inaf.it/mcs-download/mcs_usrlib.pro