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